blob: dcffe9bd7106ea5593529cbc8ff0c3a33cd6283a [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},
Nico Huber930d4212024-05-04 18:59:15 +02001410 .prepare_access = spi_prepare_io,
1411 .finish_access = spi_finish_io,
Dan Lenski11617122010-07-29 15:00:40 +00001412 },
1413
1414 {
1415 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001416 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001417 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001418 .manufacture_id = AMIC_ID_NOPREFIX,
1419 .model_id = AMIC_A29002B,
1420 .total_size = 256,
1421 .page_size = 64 * 1024,
1422 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1423 .tested = TEST_UNTESTED,
1424 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001425 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001426 .block_erasers =
1427 {
1428 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001429 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001430 {16 * 1024, 1},
1431 {8 * 1024, 2},
1432 {32 * 1024, 1},
1433 {64 * 1024, 3},
1434 },
1435 .block_erase = erase_sector_jedec,
1436 }, {
1437 .eraseblocks = { {256 * 1024, 1} },
1438 .block_erase = erase_chip_block_jedec,
1439 },
1440 },
1441 .write = write_jedec_1,
1442 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001443 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001444 .prepare_access = prepare_memory_access,
1445 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001446 },
1447
1448 {
1449 .vendor = "AMIC",
1450 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001451 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001452 .manufacture_id = AMIC_ID_NOPREFIX,
1453 .model_id = AMIC_A29002T,
1454 .total_size = 256,
1455 .page_size = 64 * 1024,
1456 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001457 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001458 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001459 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001460 .block_erasers =
1461 {
1462 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001463 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001464 {64 * 1024, 3},
1465 {32 * 1024, 1},
1466 {8 * 1024, 2},
1467 {16 * 1024, 1},
1468 },
1469 .block_erase = erase_sector_jedec,
1470 }, {
1471 .eraseblocks = { {256 * 1024, 1} },
1472 .block_erase = erase_chip_block_jedec,
1473 },
1474 },
1475 .write = write_jedec_1,
1476 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001477 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001478 .prepare_access = prepare_memory_access,
1479 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001480 },
1481
1482 {
1483 .vendor = "AMIC",
1484 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001485 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001486 .manufacture_id = AMIC_ID_NOPREFIX,
1487 .model_id = AMIC_A29040B,
1488 .total_size = 512,
1489 .page_size = 64 * 1024,
1490 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001491 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001492 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001493 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001494 .block_erasers =
1495 {
1496 {
1497 .eraseblocks = { {64 * 1024, 8} },
1498 .block_erase = erase_sector_jedec,
1499 }, {
1500 .eraseblocks = { {512 * 1024, 1} },
1501 .block_erase = erase_chip_block_jedec,
1502 },
1503 },
1504 .write = write_jedec_1,
1505 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001506 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001507 .prepare_access = prepare_memory_access,
1508 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001509 },
1510
1511 {
1512 .vendor = "AMIC",
1513 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001514 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001515 .manufacture_id = AMIC_ID_NOPREFIX,
1516 .model_id = AMIC_A49LF040A,
1517 .total_size = 512,
1518 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +01001519 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001520 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001521 .probe = probe_jedec,
1522 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1523 .block_erasers =
1524 {
1525 {
1526 .eraseblocks = { {64 * 1024, 8} },
1527 .block_erase = erase_block_jedec,
1528 }, {
1529 .eraseblocks = { {512 * 1024, 1} },
1530 .block_erase = erase_chip_block_jedec,
1531 }
1532 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001533 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001534 .write = write_jedec_1,
1535 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001536 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01001537 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01001538 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001539 },
1540
1541 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001542 .vendor = "Atmel",
1543 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001544 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001545 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001546 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001547 .total_size = 256,
1548 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001549 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1550 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001551 .tested = TEST_UNTESTED,
1552 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001553 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001554 .block_erasers =
1555 {
1556 {
1557 .eraseblocks = { {4 * 1024, 64} },
1558 .block_erase = spi_block_erase_20,
1559 }, {
1560 .eraseblocks = { {32 * 1024, 8} },
1561 .block_erase = spi_block_erase_52,
1562 }, {
1563 .eraseblocks = { {64 * 1024, 4} },
1564 .block_erase = spi_block_erase_d8,
1565 }, {
1566 .eraseblocks = { {256 * 1024, 1} },
1567 .block_erase = spi_block_erase_60,
1568 }, {
1569 .eraseblocks = { {256 * 1024, 1} },
1570 .block_erase = spi_block_erase_c7,
1571 }
1572 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001573 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001574 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001575 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001576 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001577 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001578 },
1579
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001580 {
1581 .vendor = "Atmel",
Steffen Mauch0b59b0d2018-06-02 23:46:03 +02001582 .name = "AT25DF021A",
1583 .bustype = BUS_SPI,
1584 .manufacture_id = ATMEL_ID,
1585 .model_id = ATMEL_AT25DF021A,
1586 .total_size = 256,
1587 .page_size = 256,
1588 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1589 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1590 .tested = TEST_OK_PREW,
1591 .probe = probe_spi_rdid,
1592 .probe_timing = TIMING_ZERO,
1593 .block_erasers =
1594 {
1595 {
1596 .eraseblocks = { {4 * 1024, 64} },
1597 .block_erase = spi_block_erase_20,
1598 }, {
1599 .eraseblocks = { {32 * 1024, 8} },
1600 .block_erase = spi_block_erase_52,
1601 }, {
1602 .eraseblocks = { {64 * 1024, 4} },
1603 .block_erase = spi_block_erase_d8,
1604 }, {
1605 .eraseblocks = { {256 * 1024, 1} },
1606 .block_erase = spi_block_erase_60,
1607 }, {
1608 .eraseblocks = { {256 * 1024, 1} },
1609 .block_erase = spi_block_erase_c7,
1610 }
1611 },
1612 .printlock = spi_prettyprint_status_register_at25df,
1613 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1614 .write = spi_chip_write_256,
1615 .read = spi_chip_read,
1616 .voltage = {1650, 3600},
1617 },
1618
1619 {
1620 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001621 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001622 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001623 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001624 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001625 .total_size = 512,
1626 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001627 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001628 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001630 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001631 .block_erasers =
1632 {
1633 {
1634 .eraseblocks = { {4 * 1024, 128} },
1635 .block_erase = spi_block_erase_20,
1636 }, {
1637 .eraseblocks = { {32 * 1024, 16} },
1638 .block_erase = spi_block_erase_52,
1639 }, {
1640 .eraseblocks = { {64 * 1024, 8} },
1641 .block_erase = spi_block_erase_d8,
1642 }, {
1643 .eraseblocks = { {512 * 1024, 1} },
1644 .block_erase = spi_block_erase_60,
1645 }, {
1646 .eraseblocks = { {512 * 1024, 1} },
1647 .block_erase = spi_block_erase_c7,
1648 }
1649 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001650 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001651 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001652 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001653 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001654 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001655 },
1656
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001657 {
1658 .vendor = "Atmel",
1659 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001660 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001661 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001662 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001663 .total_size = 1024,
1664 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001665 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001666 .tested = TEST_UNTESTED,
1667 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001668 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001669 .block_erasers =
1670 {
1671 {
1672 .eraseblocks = { {4 * 1024, 256} },
1673 .block_erase = spi_block_erase_20,
1674 }, {
1675 .eraseblocks = { {32 * 1024, 32} },
1676 .block_erase = spi_block_erase_52,
1677 }, {
1678 .eraseblocks = { {64 * 1024, 16} },
1679 .block_erase = spi_block_erase_d8,
1680 }, {
1681 .eraseblocks = { {1024 * 1024, 1} },
1682 .block_erase = spi_block_erase_60,
1683 }, {
1684 .eraseblocks = { {1024 * 1024, 1} },
1685 .block_erase = spi_block_erase_c7,
1686 }
1687 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001688 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001689 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001690 .write = spi_chip_write_256,
1691 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001692 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001693 },
1694
1695 {
1696 .vendor = "Atmel",
1697 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001698 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001699 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001700 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001701 .total_size = 1024,
1702 .page_size = 256,
1703 .feature_bits = FEATURE_WRSR_WREN,
1704 .tested = TEST_UNTESTED,
1705 .probe = probe_spi_rdid,
1706 .probe_timing = TIMING_ZERO,
1707 .block_erasers =
1708 {
1709 {
1710 .eraseblocks = { {4 * 1024, 256} },
1711 .block_erase = spi_block_erase_20,
1712 }, {
1713 .eraseblocks = { {32 * 1024, 32} },
1714 .block_erase = spi_block_erase_52,
1715 }, {
1716 .eraseblocks = { {64 * 1024, 16} },
1717 .block_erase = spi_block_erase_d8,
1718 }, {
1719 .eraseblocks = { {1024 * 1024, 1} },
1720 .block_erase = spi_block_erase_60,
1721 }, {
1722 .eraseblocks = { {1024 * 1024, 1} },
1723 .block_erase = spi_block_erase_c7,
1724 }
1725 },
1726 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001727 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001728 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001729 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001730 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001731 },
1732
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001733 {
1734 .vendor = "Atmel",
1735 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001736 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001737 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001738 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001739 .total_size = 2048,
1740 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001741 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons8b5b9622018-09-30 19:13:15 +02001742 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001743 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001744 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001745 .block_erasers =
1746 {
1747 {
1748 .eraseblocks = { {4 * 1024, 512} },
1749 .block_erase = spi_block_erase_20,
1750 }, {
1751 .eraseblocks = { {32 * 1024, 64} },
1752 .block_erase = spi_block_erase_52,
1753 }, {
1754 .eraseblocks = { {64 * 1024, 32} },
1755 .block_erase = spi_block_erase_d8,
1756 }, {
1757 .eraseblocks = { {2 * 1024 * 1024, 1} },
1758 .block_erase = spi_block_erase_60,
1759 }, {
1760 .eraseblocks = { {2 * 1024 * 1024, 1} },
1761 .block_erase = spi_block_erase_c7,
1762 }
1763 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001764 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001765 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001766 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001767 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001768 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001769 },
1770
Alan Green86bf6ab2019-06-27 16:58:20 +10001771 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001772 {
1773 .vendor = "Atmel",
1774 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001775 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001776 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001777 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001778 .total_size = 4096,
1779 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001780 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001781 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001782 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001783 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001784 .block_erasers =
1785 {
1786 {
1787 .eraseblocks = { {4 * 1024, 1024} },
1788 .block_erase = spi_block_erase_20,
1789 }, {
1790 .eraseblocks = { {32 * 1024, 128} },
1791 .block_erase = spi_block_erase_52,
1792 }, {
1793 .eraseblocks = { {64 * 1024, 64} },
1794 .block_erase = spi_block_erase_d8,
1795 }, {
1796 .eraseblocks = { {4 * 1024 * 1024, 1} },
1797 .block_erase = spi_block_erase_60,
1798 }, {
1799 .eraseblocks = { {4 * 1024 * 1024, 1} },
1800 .block_erase = spi_block_erase_c7,
1801 }
1802 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001803 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001804 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001805 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001806 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001807 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001808 },
1809
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001810 {
1811 .vendor = "Atmel",
1812 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001813 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001814 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001815 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001816 .total_size = 4096,
1817 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001818 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1819 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001820 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001821 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001822 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001823 .block_erasers =
1824 {
1825 {
1826 .eraseblocks = { {4 * 1024, 1024} },
1827 .block_erase = spi_block_erase_20,
1828 }, {
1829 .eraseblocks = { {32 * 1024, 128} },
1830 .block_erase = spi_block_erase_52,
1831 }, {
1832 .eraseblocks = { {64 * 1024, 64} },
1833 .block_erase = spi_block_erase_d8,
1834 }, {
1835 .eraseblocks = { {4 * 1024 * 1024, 1} },
1836 .block_erase = spi_block_erase_60,
1837 }, {
1838 .eraseblocks = { {4 * 1024 * 1024, 1} },
1839 .block_erase = spi_block_erase_c7,
1840 }
1841 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001842 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001843 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001844 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001845 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001846 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001847 },
1848
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001849 {
1850 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001851 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001852 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001853 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001854 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001855 .total_size = 8192,
1856 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001857 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001858 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001859 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001860 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001861 .block_erasers =
1862 {
1863 {
1864 .eraseblocks = { {4 * 1024, 2048} },
1865 .block_erase = spi_block_erase_20,
1866 }, {
1867 .eraseblocks = { {32 * 1024, 256} },
1868 .block_erase = spi_block_erase_52,
1869 }, {
1870 .eraseblocks = { {64 * 1024, 128} },
1871 .block_erase = spi_block_erase_d8,
1872 }, {
1873 .eraseblocks = { {8 * 1024 * 1024, 1} },
1874 .block_erase = spi_block_erase_60,
1875 }, {
1876 .eraseblocks = { {8 * 1024 * 1024, 1} },
1877 .block_erase = spi_block_erase_c7,
1878 }
1879 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001880 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001881 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001882 .write = spi_chip_write_256,
1883 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001884 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001885 },
1886
1887 {
1888 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001889 .name = "AT25DL081",
1890 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001891 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001892 .model_id = ATMEL_AT25DF081,
1893 .total_size = 1024,
1894 .page_size = 256,
1895 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1896 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1897 .tested = TEST_UNTESTED,
1898 .probe = probe_spi_rdid,
1899 .probe_timing = TIMING_ZERO,
1900 .block_erasers =
1901 {
1902 {
1903 .eraseblocks = { {4 * 1024, 256} },
1904 .block_erase = spi_block_erase_20,
1905 }, {
1906 .eraseblocks = { {32 * 1024, 32} },
1907 .block_erase = spi_block_erase_52,
1908 }, {
1909 .eraseblocks = { {64 * 1024, 16} },
1910 .block_erase = spi_block_erase_d8,
1911 }, {
1912 .eraseblocks = { {1 * 1024 * 1024, 1} },
1913 .block_erase = spi_block_erase_60,
1914 }, {
1915 .eraseblocks = { {1 * 1024 * 1024, 1} },
1916 .block_erase = spi_block_erase_c7,
1917 }
1918 },
1919 .printlock = spi_prettyprint_status_register_at25df_sec,
1920 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1921 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1922 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1923 .voltage = {1650, 1950},
1924 },
1925
1926 {
1927 .vendor = "Atmel",
1928 .name = "AT25DL161",
1929 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001930 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001931 .model_id = ATMEL_AT25DL161,
1932 .total_size = 2048,
1933 .page_size = 256,
1934 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1935 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1936 .tested = TEST_UNTESTED,
1937 .probe = probe_spi_rdid,
1938 .probe_timing = TIMING_ZERO,
1939 .block_erasers =
1940 {
1941 {
1942 .eraseblocks = { {4 * 1024, 512} },
1943 .block_erase = spi_block_erase_20,
1944 }, {
1945 .eraseblocks = { {32 * 1024, 64} },
1946 .block_erase = spi_block_erase_52,
1947 }, {
1948 .eraseblocks = { {64 * 1024, 32} },
1949 .block_erase = spi_block_erase_d8,
1950 }, {
1951 .eraseblocks = { {2 * 1024 * 1024, 1} },
1952 .block_erase = spi_block_erase_60,
1953 }, {
1954 .eraseblocks = { {2 * 1024 * 1024, 1} },
1955 .block_erase = spi_block_erase_c7,
1956 }
1957 },
1958 .printlock = spi_prettyprint_status_register_at25df_sec,
1959 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1960 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1961 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1962 .voltage = {1650, 1950},
1963 },
1964
1965 {
1966 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001967 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001968 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001969 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001970 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001971 .total_size = 2048,
1972 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001973 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1974 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001975 .tested = TEST_UNTESTED,
1976 .probe = probe_spi_rdid,
1977 .probe_timing = TIMING_ZERO,
1978 .block_erasers =
1979 {
1980 {
1981 .eraseblocks = { {4 * 1024, 512} },
1982 .block_erase = spi_block_erase_20,
1983 }, {
1984 .eraseblocks = { {32 * 1024, 64} },
1985 .block_erase = spi_block_erase_52,
1986 }, {
1987 .eraseblocks = { {64 * 1024, 32} },
1988 .block_erase = spi_block_erase_d8,
1989 }, {
1990 .eraseblocks = { {2 * 1024 * 1024, 1} },
1991 .block_erase = spi_block_erase_60,
1992 }, {
1993 .eraseblocks = { {2 * 1024 * 1024, 1} },
1994 .block_erase = spi_block_erase_c7,
1995 }
1996 },
1997 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001998 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001999 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002000 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002001 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002002 },
2003
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002004 {
2005 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002006 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
2007 * All other properties seem to be the same.*/
2008 .name = "AT25F1024(A)",
2009 .bustype = BUS_SPI,
2010 .manufacture_id = ATMEL_ID,
2011 .model_id = ATMEL_AT25F1024,
2012 .total_size = 128,
2013 .page_size = 256,
2014 .feature_bits = FEATURE_WRSR_WREN,
2015 .tested = TEST_OK_PREW,
2016 .probe = probe_spi_at25f,
2017 .probe_timing = TIMING_ZERO,
2018 .block_erasers =
2019 {
2020 {
2021 .eraseblocks = { {32 * 1024, 4} },
2022 .block_erase = spi_block_erase_52,
2023 }, {
2024 .eraseblocks = { {128 * 1024, 1} },
2025 .block_erase = spi_block_erase_62,
2026 }
2027 },
2028 .printlock = spi_prettyprint_status_register_at25f,
2029 .unlock = spi_disable_blockprotect_at25f,
2030 .write = spi_chip_write_256,
2031 .read = spi_chip_read,
2032 .voltage = {2700, 3600},
2033 },
2034
2035 {
2036 .vendor = "Atmel",
2037 .name = "AT25F2048",
2038 .bustype = BUS_SPI,
2039 .manufacture_id = ATMEL_ID,
2040 .model_id = ATMEL_AT25F2048,
2041 .total_size = 256,
2042 .page_size = 256,
2043 .feature_bits = FEATURE_WRSR_WREN,
2044 .tested = TEST_UNTESTED,
2045 .probe = probe_spi_at25f,
2046 .probe_timing = TIMING_ZERO,
2047 .block_erasers =
2048 {
2049 {
2050 .eraseblocks = { {64 * 1024, 4} },
2051 .block_erase = spi_block_erase_52,
2052 }, {
2053 .eraseblocks = { {256 * 1024, 1} },
2054 .block_erase = spi_block_erase_62,
2055 }
2056 },
2057 .printlock = spi_prettyprint_status_register_at25f,
2058 .unlock = spi_disable_blockprotect_at25f,
2059 .write = spi_chip_write_256,
2060 .read = spi_chip_read,
2061 .voltage = {2700, 3600},
2062 },
2063
2064 {
2065 .vendor = "Atmel",
2066 .name = "AT25F4096",
2067 .bustype = BUS_SPI,
2068 .manufacture_id = ATMEL_ID,
2069 .model_id = ATMEL_AT25F4096,
2070 .total_size = 512,
2071 .page_size = 256,
2072 .feature_bits = FEATURE_WRSR_WREN,
2073 .tested = TEST_OK_PREW,
2074 .probe = probe_spi_at25f,
2075 .probe_timing = TIMING_ZERO,
2076 .block_erasers =
2077 {
2078 {
2079 .eraseblocks = { {64 * 1024, 8} },
2080 .block_erase = spi_block_erase_52,
2081 }, {
2082 .eraseblocks = { {512 * 1024, 1} },
2083 .block_erase = spi_block_erase_62,
2084 }
2085 },
2086 .printlock = spi_prettyprint_status_register_at25f4096,
2087 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2088 .unlock = spi_disable_blockprotect_bp2_srwd,
2089 .write = spi_chip_write_256,
2090 .read = spi_chip_read,
2091 .voltage = {2700, 3600},
2092 },
2093
2094 {
2095 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002096 .name = "AT25F512",
2097 .bustype = BUS_SPI,
2098 .manufacture_id = ATMEL_ID,
2099 .model_id = ATMEL_AT25F512,
2100 .total_size = 64,
2101 .page_size = 256,
2102 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002103 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002104 .probe = probe_spi_at25f,
2105 .probe_timing = TIMING_ZERO,
2106 .block_erasers =
2107 {
2108 {
2109 .eraseblocks = { {32 * 1024, 2} },
2110 .block_erase = spi_block_erase_52,
2111 }, {
2112 .eraseblocks = { {64 * 1024, 1} },
2113 .block_erase = spi_block_erase_62,
2114 }
2115 },
2116 .printlock = spi_prettyprint_status_register_at25f,
2117 .unlock = spi_disable_blockprotect_at25f,
2118 .write = spi_chip_write_256,
2119 .read = spi_chip_read,
2120 .voltage = {2700, 3600},
2121 },
2122
2123 {
2124 .vendor = "Atmel",
2125 .name = "AT25F512A",
2126 .bustype = BUS_SPI,
2127 .manufacture_id = ATMEL_ID,
2128 .model_id = ATMEL_AT25F512A,
2129 .total_size = 64,
2130 .page_size = 128,
2131 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002132 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002133 .probe = probe_spi_at25f,
2134 .probe_timing = TIMING_ZERO,
2135 .block_erasers =
2136 {
2137 {
2138 .eraseblocks = { {32 * 1024, 2} },
2139 .block_erase = spi_block_erase_52,
2140 }, {
2141 .eraseblocks = { {64 * 1024, 1} },
2142 .block_erase = spi_block_erase_62,
2143 }
2144 },
2145 .printlock = spi_prettyprint_status_register_at25f512a,
2146 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2147 .unlock = spi_disable_blockprotect_at25f512a,
2148 .write = spi_chip_write_256,
2149 .read = spi_chip_read,
2150 .voltage = {2700, 3600},
2151 },
2152
2153 {
2154 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002155 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002156 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002157 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002158 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002159 .total_size = 64,
2160 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002161 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2162 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002163 .tested = TEST_UNTESTED,
2164 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002165 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002166 .block_erasers =
2167 {
2168 {
2169 .eraseblocks = { {4 * 1024, 16} },
2170 .block_erase = spi_block_erase_20,
2171 }, {
2172 .eraseblocks = { {32 * 1024, 2} },
2173 .block_erase = spi_block_erase_52,
2174 }, {
2175 .eraseblocks = { {32 * 1024, 2} },
2176 .block_erase = spi_block_erase_d8,
2177 }, {
2178 .eraseblocks = { {64 * 1024, 1} },
2179 .block_erase = spi_block_erase_60,
2180 }, {
2181 .eraseblocks = { {64 * 1024, 1} },
2182 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002183 }, {
2184 .eraseblocks = { {64 * 1024, 1} },
2185 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002186 }
2187 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002188 .printlock = spi_prettyprint_status_register_at25f512b,
2189 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002190 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002191 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002192 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002193 },
2194
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002195 {
2196 .vendor = "Atmel",
2197 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002198 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002199 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002200 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002201 .total_size = 128,
2202 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002203 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002204 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002205 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002206 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002207 .block_erasers =
2208 {
2209 {
2210 .eraseblocks = { {4 * 1024, 32} },
2211 .block_erase = spi_block_erase_20,
2212 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002213 .eraseblocks = { {4 * 1024, 32} },
2214 .block_erase = spi_block_erase_d7,
2215 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002216 .eraseblocks = { {32 * 1024, 4} },
2217 .block_erase = spi_block_erase_52,
2218 }, {
2219 .eraseblocks = { {32 * 1024, 4} },
2220 .block_erase = spi_block_erase_d8,
2221 }, {
2222 .eraseblocks = { {128 * 1024, 1} },
2223 .block_erase = spi_block_erase_60,
2224 }, {
2225 .eraseblocks = { {128 * 1024, 1} },
2226 .block_erase = spi_block_erase_c7,
2227 }
2228 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002229 .printlock = spi_prettyprint_status_register_at25fs010,
2230 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002231 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002232 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002233 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002234 },
2235
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002236 {
2237 .vendor = "Atmel",
2238 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002239 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002240 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002241 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002242 .total_size = 512,
2243 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002244 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002245 .tested = TEST_UNTESTED,
2246 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002247 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002248 .block_erasers =
2249 {
2250 {
2251 .eraseblocks = { {4 * 1024, 128} },
2252 .block_erase = spi_block_erase_20,
2253 }, {
2254 .eraseblocks = { {64 * 1024, 8} },
2255 .block_erase = spi_block_erase_52,
2256 }, {
2257 .eraseblocks = { {64 * 1024, 8} },
2258 .block_erase = spi_block_erase_d8,
2259 }, {
2260 .eraseblocks = { {512 * 1024, 1} },
2261 .block_erase = spi_block_erase_60,
2262 }, {
2263 .eraseblocks = { {512 * 1024, 1} },
2264 .block_erase = spi_block_erase_c7,
2265 }
2266 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002267 .printlock = spi_prettyprint_status_register_at25fs040,
2268 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002269 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002270 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002271 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002272 },
2273
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002274 {
2275 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002276 .name = "AT25SF041",
2277 .bustype = BUS_SPI,
2278 .manufacture_id = ATMEL_ID,
2279 .model_id = ATMEL_AT25SF041,
2280 .total_size = 512,
2281 .page_size = 256,
2282 .feature_bits = FEATURE_WRSR_WREN,
2283 .tested = TEST_OK_PREW,
2284 .probe = probe_spi_rdid,
2285 .probe_timing = TIMING_ZERO,
2286 .block_erasers =
2287 {
2288 {
2289 .eraseblocks = { {4 * 1024, 128} },
2290 .block_erase = spi_block_erase_20,
2291 }, {
2292 .eraseblocks = { {32 * 1024, 16} },
2293 .block_erase = spi_block_erase_52,
2294 }, {
2295 .eraseblocks = { {64 * 1024, 8} },
2296 .block_erase = spi_block_erase_d8,
2297 }, {
2298 .eraseblocks = { {512 * 1024, 1} },
2299 .block_erase = spi_block_erase_60,
2300 }, {
2301 .eraseblocks = { {512 * 1024, 1} },
2302 .block_erase = spi_block_erase_c7,
2303 }
2304 },
2305 .printlock = spi_prettyprint_status_register_plain,
2306 .unlock = spi_disable_blockprotect,
2307 .write = spi_chip_write_256,
2308 .read = spi_chip_read,
2309 .voltage = {2500, 3600},
2310 },
2311
2312 {
2313 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002314 .name = "AT25SF081",
2315 .bustype = BUS_SPI,
2316 .manufacture_id = ATMEL_ID,
2317 .model_id = ATMEL_AT25SF081,
2318 .total_size = 1024,
2319 .page_size = 256,
2320 .feature_bits = FEATURE_WRSR_WREN,
2321 .tested = TEST_OK_PREW,
2322 .probe = probe_spi_rdid,
2323 .probe_timing = TIMING_ZERO,
2324 .block_erasers =
2325 {
2326 {
2327 .eraseblocks = { {4 * 1024, 256} },
2328 .block_erase = spi_block_erase_20,
2329 }, {
2330 .eraseblocks = { {32 * 1024, 32} },
2331 .block_erase = spi_block_erase_52,
2332 }, {
2333 .eraseblocks = { {64 * 1024, 16} },
2334 .block_erase = spi_block_erase_d8,
2335 }, {
2336 .eraseblocks = { {1024 * 1024, 1} },
2337 .block_erase = spi_block_erase_60,
2338 }, {
2339 .eraseblocks = { {1024 * 1024, 1} },
2340 .block_erase = spi_block_erase_c7,
2341 }
2342 },
2343 .printlock = spi_prettyprint_status_register_plain,
2344 .unlock = spi_disable_blockprotect,
2345 .write = spi_chip_write_256,
2346 .read = spi_chip_read,
2347 .voltage = {2300, 3600},
2348 },
2349
2350 {
2351 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002352 .name = "AT25SF161",
2353 .bustype = BUS_SPI,
2354 .manufacture_id = ATMEL_ID,
2355 .model_id = ATMEL_AT25SF161,
2356 .total_size = 2048,
2357 .page_size = 256,
2358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2359 .tested = TEST_OK_PREW,
2360 .probe = probe_spi_rdid,
2361 .probe_timing = TIMING_ZERO,
2362 .block_erasers =
2363 {
2364 {
2365 .eraseblocks = { {4 * 1024, 512} },
2366 .block_erase = spi_block_erase_20,
2367 }, {
2368 .eraseblocks = { {32 * 1024, 64} },
2369 .block_erase = spi_block_erase_52,
2370 }, {
2371 .eraseblocks = { {64 * 1024, 32} },
2372 .block_erase = spi_block_erase_d8,
2373 }, {
2374 .eraseblocks = { {2048 * 1024, 1} },
2375 .block_erase = spi_block_erase_60,
2376 }, {
2377 .eraseblocks = { {2048 * 1024, 1} },
2378 .block_erase = spi_block_erase_c7,
2379 }
2380 },
2381 .printlock = spi_prettyprint_status_register_plain,
2382 .unlock = spi_disable_blockprotect,
2383 .write = spi_chip_write_256,
2384 .read = spi_chip_read,
2385 .voltage = {2500, 3600},
2386 },
2387
2388 {
Alan Green57938f82019-06-27 15:06:43 +10002389 .vendor = "Atmel",
darkarnium41394382019-11-04 20:06:48 +00002390 .name = "AT25SF321",
2391 .bustype = BUS_SPI,
2392 .manufacture_id = ATMEL_ID,
2393 .model_id = ATMEL_AT25SF321,
2394 .total_size = 4096,
2395 .page_size = 256,
2396 .feature_bits = FEATURE_WRSR_WREN,
2397 .tested = TEST_OK_PR,
2398 .probe = probe_spi_rdid,
2399 .probe_timing = TIMING_ZERO,
2400 .block_erasers =
2401 {
2402 {
2403 .eraseblocks = { {4 * 1024, 1024} },
2404 .block_erase = spi_block_erase_20,
2405 }, {
2406 .eraseblocks = { {32 * 1024, 128} },
2407 .block_erase = spi_block_erase_52,
2408 }, {
2409 .eraseblocks = { {64 * 1024, 64} },
2410 .block_erase = spi_block_erase_d8,
2411 }, {
2412 .eraseblocks = { {4096 * 1024, 1} },
2413 .block_erase = spi_block_erase_60,
2414 }, {
2415 .eraseblocks = { {4096 * 1024, 1} },
2416 .block_erase = spi_block_erase_c7,
2417 }
2418 },
2419 .printlock = spi_prettyprint_status_register_plain,
2420 .unlock = spi_disable_blockprotect,
2421 .write = spi_chip_write_256,
2422 .read = spi_chip_read,
2423 .voltage = {2500, 3600},
2424 },
2425
2426 {
2427 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002428 .name = "AT25SL128A",
2429 .bustype = BUS_SPI,
2430 .manufacture_id = ATMEL_ID,
2431 .model_id = ATMEL_AT25SL128A,
2432 .total_size = 16384,
2433 .page_size = 256,
2434 /* supports SFDP */
Nico Huber1412d9f2024-01-06 18:25:49 +01002435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
2436 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Hal Martin49e23d22018-05-27 14:18:43 +02002437 .tested = TEST_OK_PREW,
2438 .probe = probe_spi_rdid,
2439 .probe_timing = TIMING_ZERO,
2440 .block_erasers =
2441 {
2442 {
2443 .eraseblocks = { {4 * 1024, 4096} },
2444 .block_erase = spi_block_erase_20,
2445 }, {
2446 .eraseblocks = { {32 * 1024, 512} },
2447 .block_erase = spi_block_erase_52,
2448 }, {
2449 .eraseblocks = { {64 * 1024, 256} },
2450 .block_erase = spi_block_erase_d8,
2451 }, {
2452 .eraseblocks = { {16 * 1024 * 1024, 1} },
2453 .block_erase = spi_block_erase_60,
2454 }, {
2455 .eraseblocks = { {16 * 1024 * 1024, 1} },
2456 .block_erase = spi_block_erase_c7,
2457 }
2458 },
2459 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2460 .unlock = spi_disable_blockprotect,
2461 .write = spi_chip_write_256,
2462 .read = spi_chip_read,
2463 .voltage = {1700, 2000},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002464 .reg_bits =
2465 {
Nico Huber226bb872024-04-09 23:30:34 +02002466 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002467 .srp = {STATUS1, 7, RW},
2468 .srl = {STATUS2, 0, RW},
2469 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
2470 .tb = {STATUS1, 5, RW},
2471 .sec = {STATUS1, 6, RW},
2472 .cmp = {STATUS2, 6, RW},
2473 },
Nico Huberaabb3e02023-01-13 00:22:30 +01002474 .wp_write_cfg = spi_wp_write_cfg,
2475 .wp_read_cfg = spi_wp_read_cfg,
2476 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002477 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02002478 .prepare_access = spi_prepare_io,
2479 .finish_access = spi_finish_io,
Hal Martin49e23d22018-05-27 14:18:43 +02002480 },
2481
2482 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002483 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002484 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002485 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002486 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002487 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002488 .total_size = 512,
2489 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002490 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002491 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002492 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002493 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002494 .block_erasers =
2495 {
2496 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002497 .eraseblocks = { {256, 2048} },
2498 .block_erase = spi_block_erase_81,
2499 }, {
2500 .eraseblocks = { {2 * 1024, 256} },
2501 .block_erase = spi_block_erase_50,
2502 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002503 .eraseblocks = { {4 * 1024, 128} },
2504 .block_erase = spi_block_erase_20,
2505 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002506 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002507 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002508 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002509 .write = spi_chip_write_1,
2510 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002511 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002512 },
2513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002514 {
2515 .vendor = "Atmel",
2516 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002517 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002518 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002519 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002520 .total_size = 1024,
2521 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002522 .feature_bits = FEATURE_WRSR_WREN,
2523 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002524 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002525 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002526 .block_erasers =
2527 {
2528 {
2529 .eraseblocks = { {4 * 1024, 256} },
2530 .block_erase = spi_block_erase_20,
2531 }, {
2532 .eraseblocks = { {32 * 1024, 32} },
2533 .block_erase = spi_block_erase_52,
2534 }, {
2535 .eraseblocks = { {64 * 1024, 16} },
2536 .block_erase = spi_block_erase_d8,
2537 }, {
2538 .eraseblocks = { {1024 * 1024, 1} },
2539 .block_erase = spi_block_erase_60,
2540 }, {
2541 .eraseblocks = { {1024 * 1024, 1} },
2542 .block_erase = spi_block_erase_c7,
2543 }
2544 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002545 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002546 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002547 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002548 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002549 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002550 },
2551
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002552 {
2553 .vendor = "Atmel",
2554 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002555 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002556 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002557 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002558 .total_size = 2048,
2559 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002560 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002561 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002562 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002563 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002564 .block_erasers =
2565 {
2566 {
2567 .eraseblocks = { {4 * 1024, 512} },
2568 .block_erase = spi_block_erase_20,
2569 }, {
2570 .eraseblocks = { {32 * 1024, 64} },
2571 .block_erase = spi_block_erase_52,
2572 }, {
2573 .eraseblocks = { {64 * 1024, 32} },
2574 .block_erase = spi_block_erase_d8,
2575 }, {
2576 .eraseblocks = { {2 * 1024 * 1024, 1} },
2577 .block_erase = spi_block_erase_60,
2578 }, {
2579 .eraseblocks = { {2 * 1024 * 1024, 1} },
2580 .block_erase = spi_block_erase_c7,
2581 }
2582 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002583 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002584 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002585 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002586 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002587 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002588 },
2589
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002590 {
2591 .vendor = "Atmel",
2592 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002593 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002594 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002595 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002596 .total_size = 2048,
2597 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002598 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002599 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002600 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002601 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002602 .block_erasers =
2603 {
2604 {
2605 .eraseblocks = { {4 * 1024, 512} },
2606 .block_erase = spi_block_erase_20,
2607 }, {
2608 .eraseblocks = { {32 * 1024, 64} },
2609 .block_erase = spi_block_erase_52,
2610 }, {
2611 .eraseblocks = { {64 * 1024, 32} },
2612 .block_erase = spi_block_erase_d8,
2613 }, {
2614 .eraseblocks = { {2 * 1024 * 1024, 1} },
2615 .block_erase = spi_block_erase_60,
2616 }, {
2617 .eraseblocks = { {2 * 1024 * 1024, 1} },
2618 .block_erase = spi_block_erase_c7,
2619 }
2620 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002621 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002622 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002623 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002624 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002625 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002626 },
2627
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002628 {
2629 .vendor = "Atmel",
2630 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002631 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002632 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002633 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002634 .total_size = 512,
2635 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002636 .feature_bits = FEATURE_WRSR_WREN,
Alan Green908adf42019-07-03 15:34:06 +10002637 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002638 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002639 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002640 .block_erasers =
2641 {
2642 {
2643 .eraseblocks = { {4 * 1024, 128} },
2644 .block_erase = spi_block_erase_20,
2645 }, {
2646 .eraseblocks = { {32 * 1024, 16} },
2647 .block_erase = spi_block_erase_52,
2648 }, {
2649 .eraseblocks = { {64 * 1024, 8} },
2650 .block_erase = spi_block_erase_d8,
2651 }, {
2652 .eraseblocks = { {512 * 1024, 1} },
2653 .block_erase = spi_block_erase_60,
2654 }, {
2655 .eraseblocks = { {512 * 1024, 1} },
2656 .block_erase = spi_block_erase_c7,
2657 }
2658 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002659 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002660 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002661 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002662 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002663 },
2664
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002665 {
2666 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002667 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002668 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002669 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002670 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002671 .total_size = 128,
2672 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002673 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002674 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002675 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002676 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002677 .block_erasers =
2678 {
2679 {
2680 .eraseblocks = { {128 * 1024, 1} },
2681 .block_erase = erase_chip_block_jedec,
2682 }
2683 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002684 .write = write_jedec, /* FIXME */
2685 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002686 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002687 .prepare_access = prepare_memory_access,
2688 .finish_access = finish_memory_access,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002689 },
2690
2691 {
2692 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002693 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002694 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002695 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002696 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002697 .total_size = 256,
2698 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002699 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002700 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002701 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002702 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002703 .block_erasers =
2704 {
2705 {
2706 .eraseblocks = { {256 * 1024, 1} },
2707 .block_erase = erase_chip_block_jedec,
2708 }
2709 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002710 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002711 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002712 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002713 .prepare_access = prepare_memory_access,
2714 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002715 },
2716
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002717 {
2718 .vendor = "Atmel",
2719 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002720 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002721 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002722 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002723 .total_size = 512,
2724 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002725 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002726 .tested = TEST_UNTESTED,
2727 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002728 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002729 .block_erasers =
2730 {
2731 {
2732 .eraseblocks = { {512 * 1024, 1} },
2733 .block_erase = erase_chip_block_jedec,
2734 }
2735 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002736 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002737 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002738 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002739 .prepare_access = prepare_memory_access,
2740 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002741 },
2742
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002743 {
2744 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002745 .name = "AT29C512",
2746 .bustype = BUS_PARALLEL,
2747 .manufacture_id = ATMEL_ID,
2748 .model_id = ATMEL_AT29C512,
2749 .total_size = 64,
2750 .page_size = 128,
2751 .feature_bits = FEATURE_LONG_RESET,
2752 .tested = TEST_OK_PREW,
2753 .probe = probe_jedec,
2754 .probe_timing = 10000, /* 10mS, Enter=Exec */
2755 .block_erasers =
2756 {
2757 {
2758 .eraseblocks = { {64 * 1024, 1} },
2759 .block_erase = erase_chip_block_jedec,
2760 }
2761 },
2762 .write = write_jedec,
2763 .read = read_memmapped,
2764 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002765 .prepare_access = prepare_memory_access,
2766 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10002767 },
2768
2769 {
2770 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002771 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002772 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002773 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002774 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002775 .total_size = 16896, /* No power of two sizes */
2776 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002777 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002778 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2779 .feature_bits = FEATURE_OTP,
2780 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002781 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002782 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002783 .block_erasers =
2784 {
2785 {
2786 .eraseblocks = {
2787 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2788 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2789 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2790 },
2791 .block_erase = spi_erase_at45cs_sector,
2792 }
2793 },
2794 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002795 .write = spi_write_at45db,
2796 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002797 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002798 .gran = write_gran_1056bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002799 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002800
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002801 {
2802 .vendor = "Atmel",
2803 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002804 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002805 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002806 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002807 .total_size = 128, /* or 132, determined from status register */
2808 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002809 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002810 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2811 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002812 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002813 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002814 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002815 .block_erasers =
2816 {
2817 {
2818 .eraseblocks = { {256, 512} },
2819 .block_erase = spi_erase_at45db_page,
2820 }, {
2821 .eraseblocks = { {8 * 256, 512/8} },
2822 .block_erase = spi_erase_at45db_block,
2823 }, {
2824 .eraseblocks = {
2825 {8 * 256, 1},
2826 {120 * 256, 1},
2827 {128 * 256, 3},
2828 },
2829 .block_erase = spi_erase_at45db_sector
2830 }, {
2831 .eraseblocks = { {128 * 1024, 1} },
2832 .block_erase = spi_erase_at45db_chip,
2833 }
2834 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002835 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002836 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002837 /* granularity will be set by the probing function. */
2838 .write = spi_write_at45db,
2839 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002840 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002841 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002842
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002843 {
2844 .vendor = "Atmel",
2845 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002846 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002847 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002848 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002849 .total_size = 256, /* or 264, determined from status register */
2850 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002851 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002852 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2853 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002854 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002855 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002856 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002857 .block_erasers =
2858 {
2859 {
2860 .eraseblocks = { {256, 1024} },
2861 .block_erase = spi_erase_at45db_page,
2862 }, {
2863 .eraseblocks = { {8 * 256, 1024/8} },
2864 .block_erase = spi_erase_at45db_block,
2865 }, {
2866 .eraseblocks = {
2867 {8 * 256, 1},
2868 {120 * 256, 1},
2869 {128 * 256, 7},
2870 },
2871 .block_erase = spi_erase_at45db_sector
2872 }, {
2873 .eraseblocks = { {256 * 1024, 1} },
2874 .block_erase = spi_erase_at45db_chip,
2875 }
2876 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002877 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002878 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002879 /* granularity will be set by the probing function. */
2880 .write = spi_write_at45db,
2881 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002882 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002883 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002884
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002885 {
2886 .vendor = "Atmel",
2887 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002888 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002889 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002890 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002891 .total_size = 512, /* or 528, determined from status register */
2892 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002893 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002894 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2895 .feature_bits = FEATURE_OTP,
2896 .tested = TEST_OK_PREW,
2897 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002898 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002899 .block_erasers =
2900 {
2901 {
2902 .eraseblocks = { {256, 2048} },
2903 .block_erase = spi_erase_at45db_page,
2904 }, {
2905 .eraseblocks = { {8 * 256, 2048/8} },
2906 .block_erase = spi_erase_at45db_block,
2907 }, {
2908 .eraseblocks = {
2909 {8 * 256, 1},
2910 {248 * 256, 1},
2911 {256 * 256, 7},
2912 },
2913 .block_erase = spi_erase_at45db_sector
2914 }, {
2915 .eraseblocks = { {512 * 1024, 1} },
2916 .block_erase = spi_erase_at45db_chip,
2917 }
2918 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002919 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002920 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002921 /* granularity will be set by the probing function. */
2922 .write = spi_write_at45db,
2923 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2924 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002925 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002926
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002927 {
2928 .vendor = "Atmel",
2929 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002930 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002931 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002932 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002933 .total_size = 1024, /* or 1056, determined from status register */
2934 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002935 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002936 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2937 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002938 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002939 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002940 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002941 .block_erasers =
2942 {
2943 {
2944 .eraseblocks = { {256, 4096} },
2945 .block_erase = spi_erase_at45db_page,
2946 }, {
2947 .eraseblocks = { {8 * 256, 4096/8} },
2948 .block_erase = spi_erase_at45db_block,
2949 }, {
2950 .eraseblocks = {
2951 {8 * 256, 1},
2952 {248 * 256, 1},
2953 {256 * 256, 15},
2954 },
2955 .block_erase = spi_erase_at45db_sector
2956 }, {
2957 .eraseblocks = { {1024 * 1024, 1} },
2958 .block_erase = spi_erase_at45db_chip,
2959 }
2960 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002961 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002962 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002963 /* granularity will be set by the probing function. */
2964 .write = spi_write_at45db,
2965 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002966 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002967 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002968
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002969 {
2970 .vendor = "Atmel",
2971 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002972 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002973 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002974 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002975 .total_size = 2048, /* or 2112, determined from status register */
2976 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002977 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002978 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2979 .feature_bits = FEATURE_OTP,
2980 .tested = TEST_OK_PREW,
2981 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002982 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002983 .block_erasers =
2984 {
2985 {
2986 .eraseblocks = { {512, 4096} },
2987 .block_erase = spi_erase_at45db_page,
2988 }, {
2989 .eraseblocks = { {8 * 512, 4096/8} },
2990 .block_erase = spi_erase_at45db_block,
2991 }, {
2992 .eraseblocks = {
2993 {8 * 512, 1},
2994 {248 * 512, 1},
2995 {256 * 512, 15},
2996 },
2997 .block_erase = spi_erase_at45db_sector
2998 }, {
2999 .eraseblocks = { {2048 * 1024, 1} },
3000 .block_erase = spi_erase_at45db_chip,
3001 }
3002 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003003 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003004 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003005 /* granularity will be set by the probing function. */
3006 .write = spi_write_at45db,
3007 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00003008 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003009 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003010
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003011 {
3012 .vendor = "Atmel",
3013 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003014 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003015 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003016 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003017 .total_size = 4224, /* No power of two sizes */
3018 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00003019 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003020 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
3021 .feature_bits = FEATURE_OTP,
3022 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003023 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003024 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003025 .block_erasers =
3026 {
3027 {
3028 .eraseblocks = { {528, 8192} },
3029 .block_erase = spi_erase_at45db_page,
3030 }, {
3031 .eraseblocks = { {8 * 528, 8192/8} },
3032 .block_erase = spi_erase_at45db_block,
3033 }, /* Although the datasheets describes sectors (which can be write protected)
3034 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00003035 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003036 .eraseblocks = {
3037 {8 * 528, 1},
3038 {120 * 528, 1},
3039 {128 * 528, 63},
3040 },
3041 .block_erase = spi_erase_at45db_sector
3042 }, */ {
3043 .eraseblocks = { {4224 * 1024, 1} },
3044 .block_erase = spi_erase_at45db_chip,
3045 }
3046 },
3047 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003048 .write = spi_write_at45db,
3049 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003050 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003051 .gran = write_gran_528bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003052 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003053
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003054 {
3055 .vendor = "Atmel",
3056 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003057 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003058 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003059 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10003060 .total_size = 4096, /* or 4224, determined from status register */
3061 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003062 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003063 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00003064 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00003065 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003066 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003067 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003068 .block_erasers =
3069 {
3070 {
3071 .eraseblocks = { {512, 8192} },
3072 .block_erase = spi_erase_at45db_page,
3073 }, {
3074 .eraseblocks = { {8 * 512, 8192/8} },
3075 .block_erase = spi_erase_at45db_block,
3076 }, {
3077 .eraseblocks = {
3078 {8 * 512, 1},
3079 {120 * 512, 1},
3080 {128 * 512, 63},
3081 },
3082 .block_erase = spi_erase_at45db_sector
3083 }, {
3084 .eraseblocks = { {4096 * 1024, 1} },
3085 .block_erase = spi_erase_at45db_chip,
3086 }
3087 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003088 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003089 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003090 /* granularity will be set by the probing function. */
3091 .write = spi_write_at45db,
3092 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3093 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
3094 },
3095
3096 {
3097 .vendor = "Atmel",
3098 .name = "AT45DB321E",
3099 .bustype = BUS_SPI,
3100 .manufacture_id = ATMEL_ID,
3101 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003102 .total_size = 4096, /* or 4224, determined from status register */
3103 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003104 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3105 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3106 .feature_bits = FEATURE_OTP,
3107 .tested = TEST_UNTESTED,
3108 .probe = probe_spi_at45db,
3109 .probe_timing = TIMING_ZERO,
3110 .block_erasers =
3111 {
3112 {
3113 .eraseblocks = { {512, 8192} },
3114 .block_erase = spi_erase_at45db_page,
3115 }, {
3116 .eraseblocks = { {8 * 512, 8192/8} },
3117 .block_erase = spi_erase_at45db_block,
3118 }, {
3119 .eraseblocks = {
3120 {8 * 512, 1},
3121 {120 * 512, 1},
3122 {128 * 512, 63},
3123 },
3124 .block_erase = spi_erase_at45db_sector
3125 }, {
3126 .eraseblocks = { {4096 * 1024, 1} },
3127 .block_erase = spi_erase_at45db_chip,
3128 }
3129 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003130 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
Alan Greenc1863ca2019-06-27 15:08:03 +10003131 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003132 /* granularity will be set by the probing function. */
3133 .write = spi_write_at45db,
3134 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3135 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003136 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003137
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003138 {
3139 .vendor = "Atmel",
3140 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003141 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003142 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003143 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003144 .total_size = 8192, /* or 8448, determined from status register */
3145 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003146 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003147 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3148 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003149 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003150 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003151 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003152 .block_erasers =
3153 {
3154 {
3155 .eraseblocks = { {1024, 8192} },
3156 .block_erase = spi_erase_at45db_page,
3157 }, {
3158 .eraseblocks = { {8 * 1024, 8192/8} },
3159 .block_erase = spi_erase_at45db_block,
3160 }, {
3161 .eraseblocks = {
3162 {8 * 1024, 1},
3163 {248 * 1024, 1},
3164 {256 * 1024, 31},
3165 },
3166 .block_erase = spi_erase_at45db_sector
3167 }, {
3168 .eraseblocks = { {8192 * 1024, 1} },
3169 .block_erase = spi_erase_at45db_chip,
3170 }
3171 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003172 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003173 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003174 /* granularity will be set by the probing function. */
3175 .write = spi_write_at45db,
3176 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003177 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003178 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003179
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003180 {
3181 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10003182 .name = "AT49(H)F010",
3183 .bustype = BUS_PARALLEL,
3184 .manufacture_id = ATMEL_ID,
3185 .model_id = ATMEL_AT49F010,
3186 .total_size = 128,
3187 .page_size = 0, /* unused */
3188 .feature_bits = FEATURE_EITHER_RESET,
3189 .tested = TEST_OK_PREW,
3190 .probe = probe_jedec,
3191 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3192 .block_erasers =
3193 {
3194 {
3195 .eraseblocks = { {128 * 1024, 1} },
3196 .block_erase = erase_chip_block_jedec,
3197 }
3198 },
3199 .printlock = printlock_at49f,
3200 .write = write_jedec_1,
3201 .read = read_memmapped,
3202 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003203 .prepare_access = prepare_memory_access,
3204 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003205 },
3206
3207 {
3208 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003209 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003210 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003211 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003212 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003213 .total_size = 64,
3214 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003215 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003216 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003217 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003218 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003219 .block_erasers =
3220 {
3221 {
3222 .eraseblocks = { {64 * 1024, 1} },
3223 .block_erase = erase_chip_block_jedec,
3224 }
3225 },
Sean Nelson35727f72010-01-28 23:55:12 +00003226 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003227 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003228 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01003229 .prepare_access = prepare_memory_access,
3230 .finish_access = finish_memory_access,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003231 },
3232
3233 {
3234 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003235 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003236 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003237 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003238 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003239 .total_size = 256,
3240 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003241 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003242 .tested = TEST_UNTESTED,
3243 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003244 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003245 .block_erasers =
3246 {
3247 {
3248 .eraseblocks = {
3249 {16 * 1024, 1},
3250 {8 * 1024, 2},
3251 {96 * 1024, 1},
3252 {128 * 1024, 1},
3253 },
3254 .block_erase = erase_sector_jedec,
3255 }, {
3256 .eraseblocks = { {256 * 1024, 1} },
3257 .block_erase = erase_chip_block_jedec,
3258 }
3259 },
Sean Nelson35727f72010-01-28 23:55:12 +00003260 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003261 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003262 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003263 .prepare_access = prepare_memory_access,
3264 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003265 },
3266
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003267 {
3268 .vendor = "Atmel",
3269 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003270 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003271 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003272 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003273 .total_size = 256,
3274 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003275 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003276 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003277 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003278 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003279 .block_erasers =
3280 {
3281 {
3282 .eraseblocks = {
3283 {128 * 1024, 1},
3284 {96 * 1024, 1},
3285 {8 * 1024, 2},
3286 {16 * 1024, 1},
3287 },
3288 .block_erase = erase_sector_jedec,
3289 }, {
3290 .eraseblocks = { {256 * 1024, 1} },
3291 .block_erase = erase_chip_block_jedec,
3292 }
3293 },
Sean Nelson35727f72010-01-28 23:55:12 +00003294 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003295 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003296 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003297 .prepare_access = prepare_memory_access,
3298 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003299 },
3300
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003301 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003302 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003303 .name = "AT49F020",
3304 .bustype = BUS_PARALLEL,
3305 .manufacture_id = ATMEL_ID,
3306 .model_id = ATMEL_AT49F020,
3307 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003308 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003309 .feature_bits = FEATURE_EITHER_RESET,
3310 .tested = TEST_OK_PRE,
3311 .probe = probe_jedec,
3312 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3313 .block_erasers =
3314 {
3315 {
3316 .eraseblocks = { {256 * 1024, 1} },
3317 .block_erase = erase_chip_block_jedec,
3318 }
3319 /* Chip features an optional permanent write protection
3320 * of the first 8 kB. The erase function is the same as
3321 * above, but 00000H to 01FFFH will not be erased.
3322 * FIXME: add another eraser when partial erasers are
3323 * supported.
3324 */
3325 },
3326 .printlock = printlock_at49f,
3327 .write = write_jedec_1,
3328 .read = read_memmapped,
3329 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003330 .prepare_access = prepare_memory_access,
3331 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003332 },
3333
3334 {
3335 .vendor = "Atmel",
3336 .name = "AT49F040",
3337 .bustype = BUS_PARALLEL,
3338 .manufacture_id = ATMEL_ID,
3339 .model_id = ATMEL_AT49F040,
3340 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003341 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003342 .feature_bits = FEATURE_EITHER_RESET,
3343 .tested = TEST_UNTESTED,
3344 .probe = probe_jedec,
3345 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3346 .block_erasers =
3347 {
3348 {
3349 .eraseblocks = { {512 * 1024, 1} },
3350 .block_erase = erase_chip_block_jedec,
3351 }
3352 /* Chip features an optional permanent write protection
3353 * of the first 16 kB. The erase function is the same as
3354 * above, but 00000H to 03FFFH will not be erased.
3355 * FIXME: add another eraser when partial erasers are
3356 * supported.
3357 */
3358 },
3359 .printlock = printlock_at49f,
3360 .write = write_jedec_1,
3361 .read = read_memmapped,
3362 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003363 .prepare_access = prepare_memory_access,
3364 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003365 },
3366
3367 {
3368 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003369 .name = "AT49F080",
3370 .bustype = BUS_PARALLEL,
3371 .manufacture_id = ATMEL_ID,
3372 .model_id = ATMEL_AT49F080,
3373 .total_size = 1024,
3374 .page_size = 0, /* unused */
3375 .feature_bits = FEATURE_EITHER_RESET,
3376 .tested = TEST_UNTESTED,
3377 .probe = probe_jedec,
3378 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3379 .block_erasers =
3380 {
3381 {
3382 .eraseblocks = { {1024 * 1024, 1} },
3383 .block_erase = erase_chip_block_jedec,
3384 }
3385 /* Chip features an optional permanent write protection
3386 * of the first 16 kB. The erase function is the same as
3387 * above, but 00000H to 03FFFH will not be erased.
3388 * FIXME: add another eraser when partial erasers are
3389 * supported.
3390 */
3391 },
3392 .printlock = printlock_at49f,
3393 .write = write_jedec_1,
3394 .read = read_memmapped,
3395 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003396 .prepare_access = prepare_memory_access,
3397 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003398 },
3399
3400 {
3401 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3402 .vendor = "Atmel",
3403 .name = "AT49F080T",
3404 .bustype = BUS_PARALLEL,
3405 .manufacture_id = ATMEL_ID,
3406 .model_id = ATMEL_AT49F080T,
3407 .total_size = 1024,
3408 .page_size = 0, /* unused */
3409 .feature_bits = FEATURE_EITHER_RESET,
3410 .tested = TEST_UNTESTED,
3411 .probe = probe_jedec,
3412 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3413 .block_erasers =
3414 {
3415 {
3416 .eraseblocks = { {1024 * 1024, 1} },
3417 .block_erase = erase_chip_block_jedec,
3418 }
3419 /* Chip features an optional permanent write protection
3420 * of the first 16 kB. The erase function is the same as
3421 * above, but FC000H to FFFFFH will not be erased.
3422 * FIXME: add another eraser when partial erasers are
3423 * supported.
3424 */
3425 },
3426 .printlock = printlock_at49f,
3427 .write = write_jedec_1,
3428 .read = read_memmapped,
3429 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003430 .prepare_access = prepare_memory_access,
3431 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003432 },
3433
3434 {
3435 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003436 .name = "AT49LH002",
3437 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3438 .manufacture_id = ATMEL_ID,
3439 .model_id = ATMEL_AT49LH002,
3440 .total_size = 256,
3441 .page_size = 0, /* unused */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003442 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003443 .probe = probe_82802ab,
3444 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003445 .block_erasers =
3446 {
3447 {
3448 .eraseblocks = {
3449 {64 * 1024, 3},
3450 {32 * 1024, 1},
3451 {8 * 1024, 2},
3452 {16 * 1024, 1},
3453 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003454 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003455 }, {
3456 .eraseblocks = {
3457 {64 * 1024, 4},
3458 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003459 .block_erase = erase_block_82802ab,
3460 },
3461 },
3462 .printlock = printlock_regspace2_block_eraser_0,
3463 .unlock = unlock_regspace2_block_eraser_0,
3464 .write = write_82802ab,
3465 .read = read_memmapped,
3466 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003467 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003468 .finish_access = finish_memory_access,
Stefan Tauner7de93932014-08-03 13:05:45 +00003469 },
3470
3471 {
3472 .vendor = "Atmel",
Stefan Tauner7de93932014-08-03 13:05:45 +00003473 .name = "AT49LH004",
3474 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3475 .manufacture_id = ATMEL_ID,
3476 .model_id = ATMEL_AT49LH004,
3477 .total_size = 512,
3478 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003479 .tested = TEST_UNTESTED,
3480 .probe = probe_82802ab,
3481 .probe_timing = TIMING_ZERO,
3482 .block_erasers =
3483 {
3484 {
3485 .eraseblocks = {
3486 {64 * 1024, 7},
3487 {32 * 1024, 1},
3488 {8 * 1024, 2},
3489 {16 * 1024, 1},
3490 },
3491 .block_erase = erase_block_82802ab,
3492 }, {
3493 .eraseblocks = {
3494 {64 * 1024, 8},
3495 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003496 .block_erase = NULL, /* TODO: Implement. */
3497 },
3498 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003499 .printlock = printlock_regspace2_block_eraser_0,
3500 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003501 .write = write_82802ab,
3502 .read = read_memmapped,
3503 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003504 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003505 .finish_access = finish_memory_access,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003506 },
3507
3508 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003509 .vendor = "Atmel",
3510 .name = "AT49LH00B4",
3511 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3512 .manufacture_id = ATMEL_ID,
3513 .model_id = ATMEL_AT49LH00B4,
3514 .total_size = 512,
Andrew Morganca081462011-09-13 22:05:44 +00003515 .page_size = 0, /* unused */
Alan Green1f9cc7d2019-07-01 11:10:45 +10003516 .tested = TEST_UNTESTED,
3517 .probe = probe_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003518 .probe_timing = TIMING_ZERO,
3519 .block_erasers =
3520 {
3521 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003522 .eraseblocks = {
3523 {8 * 1024, 2},
3524 {16 * 1024, 1},
3525 {32 * 1024, 1},
3526 {64 * 1024, 7},
3527 },
3528 .block_erase = NULL, /* TODO: Implement. */
3529 }, {
3530 .eraseblocks = {
3531 {64 * 1024, 8},
3532 },
3533 .block_erase = erase_block_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003534 },
3535 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003536 .printlock = printlock_regspace2_block_eraser_0,
3537 .unlock = unlock_regspace2_block_eraser_0,
3538 .write = write_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003539 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003540 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003541 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003542 .finish_access = finish_memory_access,
Andrew Morganca081462011-09-13 22:05:44 +00003543 },
3544
3545 {
Angel Pons1ebda782021-04-20 21:39:11 +02003546 .vendor = "Boya/BoHong Microelectronics",
Nico Huber3cddff42024-10-20 15:18:53 +02003547 .name = "B.25D05AS",
Christian Kudera475a7ee2021-04-20 22:50:01 +02003548 .bustype = BUS_SPI,
3549 .manufacture_id = BOYA_BOHONG_ID,
Nico Huber3cddff42024-10-20 15:18:53 +02003550 .model_id = BOYA_BOHONG_B_25D05AS,
3551 .total_size = 64,
3552 .page_size = 256,
3553 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
3554 .tested = TEST_UNTESTED,
3555 .probe = probe_spi_rdid,
3556 .probe_timing = TIMING_ZERO,
3557 .block_erasers =
3558 {
3559 {
3560 .eraseblocks = { {4 * 1024, 16} },
3561 .block_erase = spi_block_erase_20,
3562 }, {
3563 .eraseblocks = { {32 * 1024, 2} },
3564 .block_erase = spi_block_erase_52,
3565 }, {
3566 .eraseblocks = { {64 * 1024, 1} },
3567 .block_erase = spi_block_erase_d8,
3568 }, {
3569 .eraseblocks = { {64 * 1024, 1} },
3570 .block_erase = spi_block_erase_60,
3571 }, {
3572 .eraseblocks = { {64 * 1024, 1} },
3573 .block_erase = spi_block_erase_c7,
3574 },
3575 },
3576 .printlock = spi_prettyprint_status_register_bp2_srwd,
3577 .unlock = spi_disable_blockprotect_bp2_srwd,
3578 .write = spi_chip_write_256,
3579 .read = spi_chip_read,
3580 .voltage = {2700, 3600},
3581 .prepare_access = spi_prepare_io,
3582 .finish_access = spi_finish_io,
3583 },
3584
3585 {
3586 .vendor = "Boya/BoHong Microelectronics",
3587 .name = "B.25D10AS",
3588 .bustype = BUS_SPI,
3589 .manufacture_id = BOYA_BOHONG_ID,
3590 .model_id = BOYA_BOHONG_B_25D10AS,
3591 .total_size = 128,
3592 .page_size = 256,
3593 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
3594 .tested = TEST_UNTESTED,
3595 .probe = probe_spi_rdid,
3596 .probe_timing = TIMING_ZERO,
3597 .block_erasers =
3598 {
3599 {
3600 .eraseblocks = { {4 * 1024, 32} },
3601 .block_erase = spi_block_erase_20,
3602 }, {
3603 .eraseblocks = { {32 * 1024, 4} },
3604 .block_erase = spi_block_erase_52,
3605 }, {
3606 .eraseblocks = { {64 * 1024, 2} },
3607 .block_erase = spi_block_erase_d8,
3608 }, {
3609 .eraseblocks = { {128 * 1024, 1} },
3610 .block_erase = spi_block_erase_60,
3611 }, {
3612 .eraseblocks = { {128 * 1024, 1} },
3613 .block_erase = spi_block_erase_c7,
3614 },
3615 },
3616 .printlock = spi_prettyprint_status_register_bp2_srwd,
3617 .unlock = spi_disable_blockprotect_bp2_srwd,
3618 .write = spi_chip_write_256,
3619 .read = spi_chip_read,
3620 .voltage = {2700, 3600},
3621 .prepare_access = spi_prepare_io,
3622 .finish_access = spi_finish_io,
3623 },
3624
3625 {
3626 .vendor = "Boya/BoHong Microelectronics",
3627 .name = "B.25D20AS",
3628 .bustype = BUS_SPI,
3629 .manufacture_id = BOYA_BOHONG_ID,
3630 .model_id = BOYA_BOHONG_B_25D20AS,
3631 .total_size = 256,
3632 .page_size = 256,
3633 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
3634 .tested = TEST_UNTESTED,
3635 .probe = probe_spi_rdid,
3636 .probe_timing = TIMING_ZERO,
3637 .block_erasers =
3638 {
3639 {
3640 .eraseblocks = { {4 * 1024, 64} },
3641 .block_erase = spi_block_erase_20,
3642 }, {
3643 .eraseblocks = { {32 * 1024, 8} },
3644 .block_erase = spi_block_erase_52,
3645 }, {
3646 .eraseblocks = { {64 * 1024, 4} },
3647 .block_erase = spi_block_erase_d8,
3648 }, {
3649 .eraseblocks = { {256 * 1024, 1} },
3650 .block_erase = spi_block_erase_60,
3651 }, {
3652 .eraseblocks = { {256 * 1024, 1} },
3653 .block_erase = spi_block_erase_c7,
3654 },
3655 },
3656 .printlock = spi_prettyprint_status_register_bp2_srwd,
3657 .unlock = spi_disable_blockprotect_bp2_srwd,
3658 .write = spi_chip_write_256,
3659 .read = spi_chip_read,
3660 .voltage = {2700, 3600},
3661 .prepare_access = spi_prepare_io,
3662 .finish_access = spi_finish_io,
3663 },
3664
3665 {
3666 .vendor = "Boya/BoHong Microelectronics",
3667 .name = "B.25D40AS/BY25D40ES",
3668 .bustype = BUS_SPI,
3669 .manufacture_id = BOYA_BOHONG_ID,
3670 .model_id = BOYA_BOHONG_B_25D40AS,
3671 .total_size = 512,
3672 .page_size = 256,
3673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
3674 .tested = TEST_UNTESTED,
3675 .probe = probe_spi_rdid,
3676 .probe_timing = TIMING_ZERO,
3677 .block_erasers =
3678 {
3679 {
3680 .eraseblocks = { {4 * 1024, 128} },
3681 .block_erase = spi_block_erase_20,
3682 }, {
3683 .eraseblocks = { {32 * 1024, 16} },
3684 .block_erase = spi_block_erase_52,
3685 }, {
3686 .eraseblocks = { {64 * 1024, 8} },
3687 .block_erase = spi_block_erase_d8,
3688 }, {
3689 .eraseblocks = { {512 * 1024, 1} },
3690 .block_erase = spi_block_erase_60,
3691 }, {
3692 .eraseblocks = { {512 * 1024, 1} },
3693 .block_erase = spi_block_erase_c7,
3694 },
3695 },
3696 .printlock = spi_prettyprint_status_register_bp2_srwd,
3697 .unlock = spi_disable_blockprotect_bp2_srwd,
3698 .write = spi_chip_write_256,
3699 .read = spi_chip_read,
3700 .voltage = {2700, 3600},
3701 .prepare_access = spi_prepare_io,
3702 .finish_access = spi_finish_io,
3703 },
3704
3705 {
3706 .vendor = "Boya/BoHong Microelectronics",
3707 .name = "B.25D80AS/BY25Q80BS/BY25Q80ES",
3708 .bustype = BUS_SPI,
3709 .manufacture_id = BOYA_BOHONG_ID,
3710 .model_id = BOYA_BOHONG_B_25D80AS,
3711 .total_size = 1024,
3712 .page_size = 256,
3713 /* BY25Q80BS: QPI, BY25Q80ES: QIO */
3714 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
3715 .tested = TEST_UNTESTED,
3716 .probe = probe_spi_rdid,
3717 .probe_timing = TIMING_ZERO,
3718 .block_erasers =
3719 {
3720 {
3721 .eraseblocks = { {4 * 1024, 256} },
3722 .block_erase = spi_block_erase_20,
3723 }, {
3724 .eraseblocks = { {32 * 1024, 32} },
3725 .block_erase = spi_block_erase_52,
3726 }, {
3727 .eraseblocks = { {64 * 1024, 16} },
3728 .block_erase = spi_block_erase_d8,
3729 }, {
3730 .eraseblocks = { {1024 * 1024, 1} },
3731 .block_erase = spi_block_erase_60,
3732 }, {
3733 .eraseblocks = { {1024 * 1024, 1} },
3734 .block_erase = spi_block_erase_c7,
3735 },
3736 },
3737 .printlock = spi_prettyprint_status_register_bp2_srwd,
3738 .unlock = spi_disable_blockprotect_bp2_srwd,
3739 .write = spi_chip_write_256,
3740 .read = spi_chip_read,
3741 .voltage = {2700, 3600},
3742 .prepare_access = spi_prepare_io,
3743 .finish_access = spi_finish_io,
3744 },
3745
3746 {
3747 .vendor = "Boya/BoHong Microelectronics",
3748 .name = "B.25D16AS/BY25Q16BS/BY25Q16ES",
3749 .bustype = BUS_SPI,
3750 .manufacture_id = BOYA_BOHONG_ID,
3751 .model_id = BOYA_BOHONG_B_25D16AS,
Christian Kudera475a7ee2021-04-20 22:50:01 +02003752 .total_size = 2048,
3753 .page_size = 256,
Nico Huber3cddff42024-10-20 15:18:53 +02003754 /* B25Q16BS/ES: QPI */
3755 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Christian Kudera475a7ee2021-04-20 22:50:01 +02003756 .tested = TEST_OK_PR,
3757 .probe = probe_spi_rdid,
3758 .probe_timing = TIMING_ZERO,
3759 .block_erasers =
3760 {
3761 {
3762 .eraseblocks = { {4 * 1024, 512} },
3763 .block_erase = spi_block_erase_20,
3764 }, {
3765 .eraseblocks = { {32 * 1024, 64} },
3766 .block_erase = spi_block_erase_52,
3767 }, {
3768 .eraseblocks = { {64 * 1024, 32} },
3769 .block_erase = spi_block_erase_d8,
3770 }, {
3771 .eraseblocks = { {2 * 1024 * 1024, 1} },
3772 .block_erase = spi_block_erase_60,
3773 }, {
3774 .eraseblocks = { {2 * 1024 * 1024, 1} },
3775 .block_erase = spi_block_erase_c7,
3776 }
3777 },
3778 .printlock = spi_prettyprint_status_register_bp2_srwd,
3779 .unlock = spi_disable_blockprotect_bp2_srwd,
3780 .write = spi_chip_write_256,
3781 .read = spi_chip_read,
3782 .voltage = {2700, 3600},
Nico Huber3cddff42024-10-20 15:18:53 +02003783 .prepare_access = spi_prepare_io,
3784 .finish_access = spi_finish_io,
Christian Kudera475a7ee2021-04-20 22:50:01 +02003785 },
3786
3787 {
3788 .vendor = "Boya/BoHong Microelectronics",
Nico Huber6bc88e72024-10-20 16:32:08 +02003789 .name = "B.25Q32BS/BY25Q32CS/BY25Q32ES",
3790 .bustype = BUS_SPI,
3791 .manufacture_id = BOYA_BOHONG_ID,
3792 .model_id = BOYA_BOHONG_B_25Q32BS,
3793 .total_size = 4096,
3794 .page_size = 256,
3795 /* BY25Q32CS: QPI w/ SRP (4, 4, 6, 8) */
3796 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
3797 FEATURE_OTP | FEATURE_QIO,
3798 .tested = TEST_UNTESTED,
3799 .probe = probe_spi_rdid,
3800 .probe_timing = TIMING_ZERO,
3801 .block_erasers =
3802 {
3803 {
3804 .eraseblocks = { {4 * 1024, 1024} },
3805 .block_erase = spi_block_erase_20,
3806 }, {
3807 .eraseblocks = { {32 * 1024, 128} },
3808 .block_erase = spi_block_erase_52,
3809 }, {
3810 .eraseblocks = { {64 * 1024, 64} },
3811 .block_erase = spi_block_erase_d8,
3812 }, {
3813 .eraseblocks = { {4096 * 1024, 1} },
3814 .block_erase = spi_block_erase_60,
3815 }, {
3816 .eraseblocks = { {4096 * 1024, 1} },
3817 .block_erase = spi_block_erase_c7,
3818 },
3819 },
3820 .reg_bits =
3821 {
3822 .qe = {STATUS2, 1, RW},
3823 .srp = {STATUS1, 7, RW},
3824 .srl = {STATUS2, 0, RW},
3825 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
3826 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
3827 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
3828 .cmp = {STATUS2, 6, RW},
3829 },
3830 .wp_write_cfg = spi_wp_write_cfg,
3831 .wp_read_cfg = spi_wp_read_cfg,
3832 .wp_get_ranges = spi_wp_get_available_ranges,
3833 .decode_range = decode_range_spi25,
3834 .printlock = spi_prettyprint_status_register_bp4_srwd,
3835 .unlock = spi_disable_blockprotect_bp4_srwd,
3836 .write = spi_chip_write_256,
3837 .read = spi_chip_read,
3838 .voltage = {2700, 3600},
3839 .prepare_access = spi_prepare_io,
3840 .finish_access = spi_finish_io,
3841 },
3842
3843 {
3844 .vendor = "Boya/BoHong Microelectronics",
3845 .name = "B.25Q64AS/BY25Q64ES",
3846 .bustype = BUS_SPI,
3847 .manufacture_id = BOYA_BOHONG_ID,
3848 .model_id = BOYA_BOHONG_B_25Q64AS,
3849 .total_size = 8192,
3850 .page_size = 256,
3851 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
3852 FEATURE_OTP | FEATURE_QIO,
3853 .tested = TEST_UNTESTED,
3854 .probe = probe_spi_rdid,
3855 .probe_timing = TIMING_ZERO,
3856 .block_erasers =
3857 {
3858 {
3859 .eraseblocks = { {4 * 1024, 2048} },
3860 .block_erase = spi_block_erase_20,
3861 }, {
3862 .eraseblocks = { {32 * 1024, 256} },
3863 .block_erase = spi_block_erase_52,
3864 }, {
3865 .eraseblocks = { {64 * 1024, 128} },
3866 .block_erase = spi_block_erase_d8,
3867 }, {
3868 .eraseblocks = { {8192 * 1024, 1} },
3869 .block_erase = spi_block_erase_60,
3870 }, {
3871 .eraseblocks = { {8192 * 1024, 1} },
3872 .block_erase = spi_block_erase_c7,
3873 },
3874 },
3875 .reg_bits =
3876 {
3877 .qe = {STATUS2, 1, RW},
3878 .srp = {STATUS1, 7, RW},
3879 .srl = {STATUS2, 0, RW},
3880 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
3881 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
3882 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
3883 .cmp = {STATUS2, 6, RW},
3884 },
3885 .wp_write_cfg = spi_wp_write_cfg,
3886 .wp_read_cfg = spi_wp_read_cfg,
3887 .wp_get_ranges = spi_wp_get_available_ranges,
3888 .decode_range = decode_range_spi25,
3889 .printlock = spi_prettyprint_status_register_bp4_srwd,
3890 .unlock = spi_disable_blockprotect_bp4_srwd,
3891 .write = spi_chip_write_256,
3892 .read = spi_chip_read,
3893 .voltage = {2700, 3600},
3894 .prepare_access = spi_prepare_io,
3895 .finish_access = spi_finish_io,
3896 },
3897
3898 {
3899 .vendor = "Boya/BoHong Microelectronics",
3900 .name = "B.25Q128AS/BY25Q128ES",
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003901 .bustype = BUS_SPI,
Angel Pons1ebda782021-04-20 21:39:11 +02003902 .manufacture_id = BOYA_BOHONG_ID,
3903 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003904 .total_size = 16384,
3905 .page_size = 256,
Nico Huber6bc88e72024-10-20 16:32:08 +02003906 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
Nico Huber226bb872024-04-09 23:30:34 +02003907 FEATURE_OTP | FEATURE_QIO,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003908 .tested = TEST_OK_PREW,
3909 .probe = probe_spi_rdid,
3910 .probe_timing = TIMING_ZERO,
3911 .block_erasers =
3912 {
3913 {
3914 .eraseblocks = { {4 * 1024, 4096} },
3915 .block_erase = spi_block_erase_20,
3916 }, {
3917 .eraseblocks = { {32 * 1024, 512} },
3918 .block_erase = spi_block_erase_52,
3919 }, {
3920 .eraseblocks = { {64 * 1024, 256} },
3921 .block_erase = spi_block_erase_d8,
3922 }, {
3923 .eraseblocks = { {16 * 1024 * 1024, 1} },
3924 .block_erase = spi_block_erase_60,
3925 }, {
3926 .eraseblocks = { {16 * 1024 * 1024, 1} },
3927 .block_erase = spi_block_erase_c7,
3928 }
3929 },
Nico Huber226bb872024-04-09 23:30:34 +02003930 .reg_bits =
3931 {
3932 .qe = {STATUS2, 1, RW},
Nico Huber6bc88e72024-10-20 16:32:08 +02003933 .srp = {STATUS1, 7, RW},
3934 .srl = {STATUS2, 0, RW},
3935 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
3936 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
3937 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
3938 .cmp = {STATUS2, 6, RW},
Nico Huber226bb872024-04-09 23:30:34 +02003939 },
Nico Huber6bc88e72024-10-20 16:32:08 +02003940 .wp_write_cfg = spi_wp_write_cfg,
3941 .wp_read_cfg = spi_wp_read_cfg,
3942 .wp_get_ranges = spi_wp_get_available_ranges,
3943 .decode_range = decode_range_spi25,
3944 .printlock = spi_prettyprint_status_register_bp4_srwd,
3945 .unlock = spi_disable_blockprotect_bp4_srwd,
3946 .write = spi_chip_write_256,
3947 .read = spi_chip_read,
3948 .voltage = {2700, 3600},
3949 .prepare_access = spi_prepare_io,
3950 .finish_access = spi_finish_io,
3951 },
3952
3953 {
3954 .vendor = "Boya Microelectronics",
3955 .name = "BY25Q128FS",
3956 .bustype = BUS_SPI,
3957 .manufacture_id = BOYA_BOHONG_ID,
3958 .model_id = BOYA_BOHONG_B_25Q128FS,
3959 .total_size = 16384,
3960 .page_size = 256,
3961 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
3962 FEATURE_OTP | FEATURE_QIO,
3963 .tested = TEST_UNTESTED,
3964 .probe = probe_spi_rdid,
3965 .probe_timing = TIMING_ZERO,
3966 .block_erasers =
3967 {
3968 {
3969 .eraseblocks = { {4 * 1024, 4096} },
3970 .block_erase = spi_block_erase_20,
3971 }, {
3972 .eraseblocks = { {32 * 1024, 512} },
3973 .block_erase = spi_block_erase_52,
3974 }, {
3975 .eraseblocks = { {64 * 1024, 256} },
3976 .block_erase = spi_block_erase_d8,
3977 }, {
3978 .eraseblocks = { {16 * 1024 * 1024, 1} },
3979 .block_erase = spi_block_erase_60,
3980 }, {
3981 .eraseblocks = { {16 * 1024 * 1024, 1} },
3982 .block_erase = spi_block_erase_c7,
3983 }
3984 },
3985 .reg_bits =
3986 {
3987 .qe = {STATUS2, 1, RW},
3988 .srp = {STATUS1, 7, RW},
3989 .srl = {STATUS2, 0, RW},
3990 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
3991 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
3992 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
3993 .cmp = {STATUS2, 6, RW},
3994 },
3995 .wp_write_cfg = spi_wp_write_cfg,
3996 .wp_read_cfg = spi_wp_read_cfg,
3997 .wp_get_ranges = spi_wp_get_available_ranges,
3998 .decode_range = decode_range_spi25,
3999 .printlock = spi_prettyprint_status_register_bp4_srwd,
4000 .unlock = spi_disable_blockprotect_bp4_srwd,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05004001 .write = spi_chip_write_256,
4002 .read = spi_chip_read,
4003 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02004004 .prepare_access = spi_prepare_io,
4005 .finish_access = spi_finish_io,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05004006 },
4007
4008 {
Joshua Roysf1324e02010-09-16 00:51:51 +00004009 .vendor = "Bright",
4010 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004011 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00004012 .manufacture_id = BRIGHT_ID,
4013 .model_id = BRIGHT_BM29F040,
4014 .total_size = 512,
4015 .page_size = 64 * 1024,
4016 .feature_bits = FEATURE_EITHER_RESET,
4017 .tested = TEST_OK_PR,
4018 .probe = probe_jedec,
4019 .probe_timing = TIMING_ZERO,
4020 .block_erasers =
4021 {
4022 {
4023 .eraseblocks = { {64 * 1024, 8} },
4024 .block_erase = erase_sector_jedec,
4025 }, {
4026 .eraseblocks = { {512 * 1024, 1} },
4027 .block_erase = erase_chip_block_jedec,
4028 },
4029 },
4030 .write = write_jedec_1,
4031 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004032 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01004033 .prepare_access = prepare_memory_access,
4034 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00004035 },
4036
4037 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004038 .vendor = "Catalyst",
4039 .name = "CAT28F512",
4040 .bustype = BUS_PARALLEL,
4041 .manufacture_id = CATALYST_ID,
4042 .model_id = CATALYST_CAT28F512,
4043 .total_size = 64,
4044 .page_size = 0, /* unused */
4045 .feature_bits = 0,
Alan Green908adf42019-07-03 15:34:06 +10004046 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
Alan Green1f9cc7d2019-07-01 11:10:45 +10004047 .probe = probe_jedec, /* FIXME! */
4048 .probe_timing = TIMING_ZERO,
4049 .block_erasers =
4050 {
4051 {
4052 .eraseblocks = { {64 * 1024, 1} },
4053 .block_erase = NULL, /* TODO */
4054 },
4055 },
4056 .write = NULL, /* TODO */
4057 .read = read_memmapped,
4058 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01004059 .prepare_access = prepare_memory_access,
4060 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004061 },
4062
4063 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03004064 .vendor = "ENE",
4065 .name = "KB9012 (EDI)",
4066 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03004067 .total_size = 128,
4068 .page_size = 128,
4069 .feature_bits = FEATURE_ERASED_ZERO,
4070 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10004071 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03004072 .probe = edi_probe_kb9012,
4073 .probe_timing = TIMING_ZERO,
4074 .block_erasers =
4075 {
4076 {
4077 .eraseblocks = { {128, 1024} },
4078 .block_erase = edi_chip_block_erase,
4079 },
4080 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03004081 .write = edi_chip_write,
4082 .read = edi_chip_read,
4083 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10004084 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03004085 },
4086
4087 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004088 .vendor = "ESI",
4089 .name = "ES25P16",
4090 .bustype = BUS_SPI,
4091 .manufacture_id = EXCEL_ID_NOPREFIX,
4092 .model_id = EXCEL_ES25P16,
4093 .total_size = 2 * 1024,
4094 .page_size = 256,
4095 /* 256-byte parameter page separate from memory array:
4096 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
4097 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004098 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004099 .probe = probe_spi_rdid,
4100 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004101 .block_erasers =
4102 {
4103 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004104 .eraseblocks = { {64 * 1024, 32} },
4105 .block_erase = spi_block_erase_d8,
Sean Nelson54596372010-01-09 05:30:14 +00004106 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004107 .eraseblocks = { {2 * 1024 * 1024, 1} },
4108 .block_erase = spi_block_erase_c7,
Sean Nelson54596372010-01-09 05:30:14 +00004109 }
4110 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10004111 .printlock = spi_prettyprint_status_register_bp2_srwd,
4112 .unlock = spi_disable_blockprotect_bp2_srwd,
4113 .write = spi_chip_write_256,
4114 .read = spi_chip_read, /* Fast Read (0x0B) supported */
4115 .voltage = {2700, 3600},
4116 },
4117
4118 {
4119 .vendor = "ESI",
4120 .name = "ES25P40",
4121 .bustype = BUS_SPI,
4122 .manufacture_id = EXCEL_ID_NOPREFIX,
4123 .model_id = EXCEL_ES25P40,
4124 .total_size = 512,
4125 .page_size = 256,
4126 /* 256-byte parameter page separate from memory array:
4127 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
4128 .feature_bits = FEATURE_WRSR_WREN,
4129 .tested = TEST_UNTESTED,
4130 .probe = probe_spi_rdid,
4131 .probe_timing = TIMING_ZERO,
4132 .block_erasers =
4133 {
4134 {
4135 .eraseblocks = { {64 * 1024, 8} },
4136 .block_erase = spi_block_erase_d8,
4137 }, {
4138 .eraseblocks = { {512 * 1024, 1} },
4139 .block_erase = spi_block_erase_c7,
4140 }
4141 },
4142 .printlock = spi_prettyprint_status_register_bp2_srwd,
4143 .unlock = spi_disable_blockprotect_bp2_srwd,
4144 .write = spi_chip_write_256,
4145 .read = spi_chip_read, /* Fast Read (0x0B) supported */
4146 .voltage = {2700, 3600},
4147 },
4148
4149 {
4150 .vendor = "ESI",
4151 .name = "ES25P80",
4152 .bustype = BUS_SPI,
4153 .manufacture_id = EXCEL_ID_NOPREFIX,
4154 .model_id = EXCEL_ES25P80,
4155 .total_size = 1024,
4156 .page_size = 256,
4157 /* 256-byte parameter page separate from memory array:
4158 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
4159 .feature_bits = FEATURE_WRSR_WREN,
4160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers =
4164 {
4165 {
4166 .eraseblocks = { {64 * 1024, 16} },
4167 .block_erase = spi_block_erase_d8,
4168 }, {
4169 .eraseblocks = { {1024 * 1024, 1} },
4170 .block_erase = spi_block_erase_c7,
4171 }
4172 },
4173 .printlock = spi_prettyprint_status_register_bp2_srwd,
4174 .unlock = spi_disable_blockprotect_bp2_srwd,
4175 .write = spi_chip_write_256,
4176 .read = spi_chip_read, /* Fast Read (0x0B) supported */
4177 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00004178 },
4179
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004180 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00004181 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00004182 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004183 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004184 .manufacture_id = ESMT_ID,
4185 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00004186 .total_size = 1024,
4187 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004188 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00004189 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00004190 .probe = probe_spi_rdid,
4191 .probe_timing = TIMING_ZERO,
4192 .block_erasers =
4193 {
4194 {
4195 .eraseblocks = { {4 * 1024, 256} },
4196 .block_erase = spi_block_erase_20,
4197 }, {
4198 .eraseblocks = { {64 * 1024, 16} },
4199 .block_erase = spi_block_erase_d8,
4200 }, {
4201 .eraseblocks = { {1024 * 1024, 1} },
4202 .block_erase = spi_block_erase_60,
4203 }, {
4204 .eraseblocks = { {1024 * 1024, 1} },
4205 .block_erase = spi_block_erase_c7,
4206 }
4207 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004208 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004209 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00004210 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00004211 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004212 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00004213 },
4214
4215 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00004216 .vendor = "ESMT",
4217 .name = "F25L32PA",
4218 .bustype = BUS_SPI,
4219 .manufacture_id = ESMT_ID,
4220 .model_id = ESMT_F25L32PA,
4221 .total_size = 4096,
4222 .page_size = 256,
4223 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
4224 .tested = TEST_UNTESTED,
4225 .probe = probe_spi_rdid,
4226 .probe_timing = TIMING_ZERO,
4227 .block_erasers =
4228 {
4229 {
4230 .eraseblocks = { {4 * 1024, 1024} },
4231 .block_erase = spi_block_erase_20,
4232 }, {
4233 .eraseblocks = { {64 * 1024, 64} },
4234 .block_erase = spi_block_erase_d8,
4235 }, {
4236 .eraseblocks = { {4 * 1024 * 1024, 1} },
4237 .block_erase = spi_block_erase_60,
4238 }, {
4239 .eraseblocks = { {4 * 1024 * 1024, 1} },
4240 .block_erase = spi_block_erase_c7,
4241 }
4242 },
4243 .printlock = spi_prettyprint_status_register_bp2_bpl,
4244 .unlock = spi_disable_blockprotect,
4245 .write = spi_chip_write_256,
4246 .read = spi_chip_read,
4247 .voltage = {2700, 3600},
4248 },
4249
4250 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004251 .vendor = "ESMT",
4252 .name = "F49B002UA",
4253 .bustype = BUS_PARALLEL,
4254 .manufacture_id = ESMT_ID,
4255 .model_id = ESMT_F49B002UA,
4256 .total_size = 256,
4257 .page_size = 4096,
4258 .feature_bits = FEATURE_EITHER_RESET,
4259 .tested = TEST_UNTESTED,
4260 .probe = probe_jedec,
4261 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4262 .block_erasers =
4263 {
4264 {
4265 .eraseblocks = {
4266 {128 * 1024, 1},
4267 {96 * 1024, 1},
4268 {8 * 1024, 2},
4269 {16 * 1024, 1},
4270 },
4271 .block_erase = erase_sector_jedec,
4272 }, {
4273 .eraseblocks = { {256 * 1024, 1} },
4274 .block_erase = erase_chip_block_jedec,
4275 }
4276 },
4277 .write = write_jedec_1,
4278 .read = read_memmapped,
4279 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01004280 .prepare_access = prepare_memory_access,
4281 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004282 },
4283
4284 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004285 .vendor = "Eon",
4286 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004287 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004288 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004289 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004290 .total_size = 64,
4291 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004292 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004293 .tested = TEST_UNTESTED,
4294 .probe = probe_spi_rdid,
4295 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004296 .block_erasers =
4297 {
4298 {
4299 .eraseblocks = {
4300 {4 * 1024, 2},
4301 {8 * 1024, 1},
4302 {16 * 1024, 1},
4303 {32 * 1024, 1},
4304 },
4305 .block_erase = spi_block_erase_d8,
4306 }, {
4307 .eraseblocks = { {64 * 1024, 1} },
4308 .block_erase = spi_block_erase_c7,
4309 }
4310 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004311 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004312 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004313 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004314 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004315 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004316 },
4317
4318 {
4319 .vendor = "Eon",
4320 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004321 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004322 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004323 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00004324 .total_size = 64,
4325 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004326 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004327 .tested = TEST_UNTESTED,
4328 .probe = probe_spi_rdid,
4329 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004330 .block_erasers =
4331 {
4332 {
4333 .eraseblocks = {
4334 {32 * 1024, 1},
4335 {16 * 1024, 1},
4336 {8 * 1024, 1},
4337 {4 * 1024, 2},
4338 },
4339 .block_erase = spi_block_erase_d8,
4340 }, {
4341 .eraseblocks = { {64 * 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,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004347 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004348 .read = spi_chip_read, /* Fast read (0x0B) supported */
4349 .voltage = {2700, 3600},
4350 },
4351
4352 {
4353 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004354 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004355 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004356 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004357 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004358 .total_size = 128,
4359 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004360 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004361 .tested = TEST_UNTESTED,
4362 .probe = probe_spi_rdid,
4363 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004364 .block_erasers =
4365 {
4366 {
4367 .eraseblocks = {
4368 {4 * 1024, 2},
4369 {8 * 1024, 1},
4370 {16 * 1024, 1},
4371 {32 * 1024, 3},
4372 },
4373 .block_erase = spi_block_erase_d8,
4374 }, {
4375 .eraseblocks = { {128 * 1024, 1} },
4376 .block_erase = spi_block_erase_c7,
4377 }
4378 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004379 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004380 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004381 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004382 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004383 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004384 },
4385
4386 {
4387 .vendor = "Eon",
4388 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004389 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004390 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004391 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00004392 .total_size = 128,
4393 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004394 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004395 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00004396 .probe = probe_spi_rdid,
4397 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004398 .block_erasers =
4399 {
4400 {
4401 .eraseblocks = {
4402 {32 * 1024, 3},
4403 {16 * 1024, 1},
4404 {8 * 1024, 1},
4405 {4 * 1024, 2},
4406 },
4407 .block_erase = spi_block_erase_d8,
4408 }, {
4409 .eraseblocks = { {128 * 1024, 1} },
4410 .block_erase = spi_block_erase_c7,
4411 }
4412 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004413 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004414 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004415 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004416 .read = spi_chip_read, /* Fast read (0x0B) supported */
4417 .voltage = {2700, 3600},
4418 },
4419
4420 {
4421 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004422 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004423 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004424 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004425 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004426 .total_size = 2048,
4427 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004428 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004429 .tested = TEST_UNTESTED,
4430 .probe = probe_spi_rdid,
4431 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004432 .block_erasers =
4433 {
4434 {
4435 .eraseblocks = {
4436 {4 * 1024, 2},
4437 {8 * 1024, 1},
4438 {16 * 1024, 1},
4439 {32 * 1024, 1},
4440 {64 * 1024, 31},
4441 },
4442 .block_erase = spi_block_erase_d8,
4443 }, {
4444 .eraseblocks = { {2 * 1024 * 1024, 1} },
4445 .block_erase = spi_block_erase_c7,
4446 }
4447 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004448 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004449 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004450 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004451 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004452 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004453 },
4454
4455 {
4456 .vendor = "Eon",
4457 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004458 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004459 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004460 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004461 .total_size = 2048,
4462 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004463 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004464 .tested = TEST_UNTESTED,
4465 .probe = probe_spi_rdid,
4466 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004467 .block_erasers =
4468 {
4469 {
4470 .eraseblocks = {
4471 {64 * 1024, 31},
4472 {32 * 1024, 1},
4473 {16 * 1024, 1},
4474 {8 * 1024, 1},
4475 {4 * 1024, 2},
4476 },
4477 .block_erase = spi_block_erase_d8,
4478 }, {
4479 .eraseblocks = { {2 * 1024 * 1024, 1} },
4480 .block_erase = spi_block_erase_c7,
4481 }
4482 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004483 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004484 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004485 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004486 .read = spi_chip_read, /* Fast read (0x0B) supported */
4487 .voltage = {2700, 3600},
4488 },
4489
4490 {
4491 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004492 .name = "EN25B20",
Stefan Taunerb175af52015-01-24 15:06:27 +00004493 .bustype = BUS_SPI,
4494 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004495 .model_id = EON_EN25B20,
4496 .total_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004497 .page_size = 256,
4498 .feature_bits = FEATURE_WRSR_WREN,
4499 .tested = TEST_UNTESTED,
4500 .probe = probe_spi_rdid,
4501 .probe_timing = TIMING_ZERO,
4502 .block_erasers =
4503 {
4504 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004505 .eraseblocks = {
4506 {4 * 1024, 2},
4507 {8 * 1024, 1},
4508 {16 * 1024, 1},
4509 {32 * 1024, 1},
4510 {64 * 1024, 3}
4511 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004512 .block_erase = spi_block_erase_d8,
4513 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004514 .eraseblocks = { {256 * 1024, 1} },
4515 .block_erase = spi_block_erase_c7,
4516 }
4517 },
4518 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4519 .unlock = spi_disable_blockprotect,
4520 .write = spi_chip_write_256,
4521 .read = spi_chip_read, /* Fast read (0x0B) supported */
4522 .voltage = {2700, 3600},
4523 },
4524
4525 {
4526 .vendor = "Eon",
4527 .name = "EN25B20T",
4528 .bustype = BUS_SPI,
4529 .manufacture_id = EON_ID_NOPREFIX,
4530 .model_id = EON_EN25B20,
4531 .total_size = 256,
4532 .page_size = 256,
4533 .feature_bits = FEATURE_WRSR_WREN,
4534 .tested = TEST_UNTESTED,
4535 .probe = probe_spi_rdid,
4536 .probe_timing = TIMING_ZERO,
4537 .block_erasers =
4538 {
4539 {
4540 .eraseblocks = {
4541 {64 * 1024, 3},
4542 {32 * 1024, 1},
4543 {16 * 1024, 1},
4544 {8 * 1024, 1},
4545 {4 * 1024, 2},
4546 },
4547 .block_erase = spi_block_erase_d8,
4548 }, {
4549 .eraseblocks = { {256 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004550 .block_erase = spi_block_erase_c7,
4551 }
4552 },
4553 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4554 .unlock = spi_disable_blockprotect,
4555 .write = spi_chip_write_256,
4556 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004557 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004558 },
4559
4560 {
4561 .vendor = "Eon",
4562 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004563 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004564 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004565 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004566 .total_size = 4096,
4567 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004568 /* OTP: 512B total; enter 0x3A */
4569 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004570 .tested = TEST_UNTESTED,
4571 .probe = probe_spi_rdid,
4572 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004573 .block_erasers =
4574 {
4575 {
4576 .eraseblocks = {
4577 {4 * 1024, 2},
4578 {8 * 1024, 1},
4579 {16 * 1024, 1},
4580 {32 * 1024, 1},
4581 {64 * 1024, 63},
4582 },
4583 .block_erase = spi_block_erase_d8,
4584 }, {
4585 .eraseblocks = { {4 * 1024 * 1024, 1} },
4586 .block_erase = spi_block_erase_c7,
4587 }
4588 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004589 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004590 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004591 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004592 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004593 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004594 },
4595
4596 {
4597 .vendor = "Eon",
4598 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004599 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004600 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004601 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004602 .total_size = 4096,
4603 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004604 /* OTP: 512B total; enter 0x3A */
4605 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004606 .tested = TEST_UNTESTED,
4607 .probe = probe_spi_rdid,
4608 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004609 .block_erasers =
4610 {
4611 {
4612 .eraseblocks = {
4613 {64 * 1024, 63},
4614 {32 * 1024, 1},
4615 {16 * 1024, 1},
4616 {8 * 1024, 1},
4617 {4 * 1024, 2},
4618 },
4619 .block_erase = spi_block_erase_d8,
4620 }, {
4621 .eraseblocks = { {4 * 1024 * 1024, 1} },
4622 .block_erase = spi_block_erase_c7,
4623 }
4624 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004625 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004626 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004627 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004628 .read = spi_chip_read, /* Fast read (0x0B) supported */
4629 .voltage = {2700, 3600},
4630 },
4631
4632 {
4633 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004634 .name = "EN25B40",
Stefan Taunerb175af52015-01-24 15:06:27 +00004635 .bustype = BUS_SPI,
4636 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004637 .model_id = EON_EN25B40,
4638 .total_size = 512,
Stefan Taunerb175af52015-01-24 15:06:27 +00004639 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004640 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004641 .tested = TEST_UNTESTED,
4642 .probe = probe_spi_rdid,
4643 .probe_timing = TIMING_ZERO,
4644 .block_erasers =
4645 {
4646 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004647 .eraseblocks = {
4648 {4 * 1024, 2},
4649 {8 * 1024, 1},
4650 {16 * 1024, 1},
4651 {32 * 1024, 1},
4652 {64 * 1024, 7}
4653 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004654 .block_erase = spi_block_erase_d8,
4655 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004656 .eraseblocks = { {512 * 1024, 1} },
4657 .block_erase = spi_block_erase_c7,
4658 }
4659 },
4660 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4661 .unlock = spi_disable_blockprotect,
4662 .write = spi_chip_write_256,
4663 .read = spi_chip_read, /* Fast read (0x0B) supported */
4664 .voltage = {2700, 3600},
4665 },
4666
4667 {
4668 .vendor = "Eon",
4669 .name = "EN25B40T",
4670 .bustype = BUS_SPI,
4671 .manufacture_id = EON_ID_NOPREFIX,
4672 .model_id = EON_EN25B40,
4673 .total_size = 512,
4674 .page_size = 256,
4675 .feature_bits = FEATURE_WRSR_WREN,
4676 .tested = TEST_UNTESTED,
4677 .probe = probe_spi_rdid,
4678 .probe_timing = TIMING_ZERO,
4679 .block_erasers =
4680 {
4681 {
4682 .eraseblocks = {
4683 {64 * 1024, 7},
4684 {32 * 1024, 1},
4685 {16 * 1024, 1},
4686 {8 * 1024, 1},
4687 {4 * 1024, 2},
4688 },
4689 .block_erase = spi_block_erase_d8,
4690 }, {
4691 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004692 .block_erase = spi_block_erase_c7,
4693 }
4694 },
4695 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4696 .unlock = spi_disable_blockprotect,
4697 .write = spi_chip_write_256,
4698 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004699 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004700 },
4701
4702 {
4703 .vendor = "Eon",
4704 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004705 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004706 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004707 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004708 .total_size = 8192,
4709 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004710 /* OTP: 512B total; enter 0x3A */
4711 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004712 .tested = TEST_UNTESTED,
4713 .probe = probe_spi_rdid,
4714 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004715 .block_erasers =
4716 {
4717 {
4718 .eraseblocks = {
4719 {4 * 1024, 2},
4720 {8 * 1024, 1},
4721 {16 * 1024, 1},
4722 {32 * 1024, 1},
4723 {64 * 1024, 127},
4724 },
4725 .block_erase = spi_block_erase_d8,
4726 }, {
4727 .eraseblocks = { {8 * 1024 * 1024, 1} },
4728 .block_erase = spi_block_erase_c7,
4729 }
4730 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004731 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004732 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004733 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004734 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004735 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004736 },
4737
4738 {
4739 .vendor = "Eon",
4740 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004741 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004742 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004743 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004744 .total_size = 8192,
4745 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004746 /* OTP: 512B total; enter 0x3A */
4747 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004748 .tested = TEST_UNTESTED,
4749 .probe = probe_spi_rdid,
4750 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004751 .block_erasers =
4752 {
4753 {
4754 .eraseblocks = {
4755 {64 * 1024, 127},
4756 {32 * 1024, 1},
4757 {16 * 1024, 1},
4758 {8 * 1024, 1},
4759 {4 * 1024, 2},
4760 },
4761 .block_erase = spi_block_erase_d8,
4762 }, {
4763 .eraseblocks = { {8 * 1024 * 1024, 1} },
4764 .block_erase = spi_block_erase_c7,
4765 }
4766 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004767 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004768 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004769 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004770 .read = spi_chip_read, /* Fast read (0x0B) supported */
4771 .voltage = {2700, 3600},
4772 },
4773
4774 {
4775 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004776 .name = "EN25B80",
Stefan Taunerb175af52015-01-24 15:06:27 +00004777 .bustype = BUS_SPI,
4778 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004779 .model_id = EON_EN25B80,
4780 .total_size = 1024,
Stefan Taunerb175af52015-01-24 15:06:27 +00004781 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004782 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004783 .tested = TEST_UNTESTED,
4784 .probe = probe_spi_rdid,
4785 .probe_timing = TIMING_ZERO,
4786 .block_erasers =
4787 {
4788 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004789 .eraseblocks = {
4790 {4 * 1024, 2},
4791 {8 * 1024, 1},
4792 {16 * 1024, 1},
4793 {32 * 1024, 1},
4794 {64 * 1024, 15}
4795 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004796 .block_erase = spi_block_erase_d8,
4797 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004798 .eraseblocks = { {1024 * 1024, 1} },
4799 .block_erase = spi_block_erase_c7,
4800 }
4801 },
4802 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4803 .unlock = spi_disable_blockprotect,
4804 .write = spi_chip_write_256,
4805 .read = spi_chip_read, /* Fast read (0x0B) supported */
4806 .voltage = {2700, 3600},
4807 },
4808
4809 {
4810 .vendor = "Eon",
4811 .name = "EN25B80T",
4812 .bustype = BUS_SPI,
4813 .manufacture_id = EON_ID_NOPREFIX,
4814 .model_id = EON_EN25B80,
4815 .total_size = 1024,
4816 .page_size = 256,
4817 .feature_bits = FEATURE_WRSR_WREN,
4818 .tested = TEST_UNTESTED,
4819 .probe = probe_spi_rdid,
4820 .probe_timing = TIMING_ZERO,
4821 .block_erasers =
4822 {
4823 {
4824 .eraseblocks = {
4825 {64 * 1024, 15},
4826 {32 * 1024, 1},
4827 {16 * 1024, 1},
4828 {8 * 1024, 1},
4829 {4 * 1024, 2},
4830 },
4831 .block_erase = spi_block_erase_d8,
4832 }, {
4833 .eraseblocks = { {1024 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004834 .block_erase = spi_block_erase_c7,
4835 }
4836 },
4837 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4838 .unlock = spi_disable_blockprotect,
4839 .write = spi_chip_write_256,
4840 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004841 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004842 },
4843
4844 {
4845 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004846 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004847 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004848 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004849 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004850 .total_size = 64,
4851 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004852 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004853 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004854 .probe = probe_spi_rdid,
4855 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004856 .block_erasers =
4857 {
4858 {
4859 .eraseblocks = { {4 * 1024, 16} },
4860 .block_erase = spi_block_erase_20,
4861 }, {
4862 .eraseblocks = { {32 * 1024, 2} },
4863 .block_erase = spi_block_erase_d8,
4864 }, {
4865 .eraseblocks = { {32 * 1024, 2} },
4866 .block_erase = spi_block_erase_52,
4867 }, {
4868 .eraseblocks = { {64 * 1024, 1} },
4869 .block_erase = spi_block_erase_60,
4870 }, {
4871 .eraseblocks = { {64 * 1024, 1} },
4872 .block_erase = spi_block_erase_c7,
4873 }
4874 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004875 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004876 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004877 .write = spi_chip_write_256,
4878 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004879 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004880 },
4881
4882 {
4883 .vendor = "Eon",
4884 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004885 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004886 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004887 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004888 .total_size = 128,
4889 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004890 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrowd173ed42021-09-29 09:28:07 +02004891 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004892 .probe = probe_spi_rdid,
4893 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004894 .block_erasers =
4895 {
4896 {
4897 .eraseblocks = { {4 * 1024, 32} },
4898 .block_erase = spi_block_erase_20,
4899 }, {
4900 .eraseblocks = { {32 * 1024, 4} },
4901 .block_erase = spi_block_erase_d8,
4902 }, {
4903 .eraseblocks = { {32 * 1024, 4} },
4904 .block_erase = spi_block_erase_52,
4905 }, {
4906 .eraseblocks = { {128 * 1024, 1} },
4907 .block_erase = spi_block_erase_60,
4908 }, {
4909 .eraseblocks = { {128 * 1024, 1} },
4910 .block_erase = spi_block_erase_c7,
4911 }
4912 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004913 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004914 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004915 .write = spi_chip_write_256,
4916 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004917 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004918 },
4919
4920 {
4921 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004922 .name = "EN25F16",
4923 .bustype = BUS_SPI,
4924 .manufacture_id = EON_ID_NOPREFIX,
4925 .model_id = EON_EN25F16,
4926 .total_size = 2048,
4927 .page_size = 256,
4928 .feature_bits = FEATURE_WRSR_WREN,
4929 .tested = TEST_OK_PREW,
4930 .probe = probe_spi_rdid,
4931 .probe_timing = TIMING_ZERO,
4932 .block_erasers =
4933 {
4934 {
4935 .eraseblocks = { {4 * 1024, 512} },
4936 .block_erase = spi_block_erase_20,
4937 }, {
4938 .eraseblocks = { {64 * 1024, 32} },
4939 .block_erase = spi_block_erase_d8,
4940 }, {
4941 .eraseblocks = { {2 * 1024 * 1024, 1} },
4942 .block_erase = spi_block_erase_60,
4943 }, {
4944 .eraseblocks = { {2 * 1024 * 1024, 1} },
4945 .block_erase = spi_block_erase_c7,
4946 }
4947 },
4948 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4949 .unlock = spi_disable_blockprotect,
4950 .write = spi_chip_write_256,
4951 .read = spi_chip_read,
4952 .voltage = {2700, 3600},
4953 },
4954
4955 {
4956 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004957 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004958 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004959 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004960 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004961 .total_size = 256,
4962 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004963 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004964 .tested = TEST_UNTESTED,
4965 .probe = probe_spi_rdid,
4966 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004967 .block_erasers =
4968 {
4969 {
4970 .eraseblocks = { {4 * 1024, 64} },
4971 .block_erase = spi_block_erase_20,
4972 }, {
4973 .eraseblocks = { {64 * 1024, 4} },
4974 .block_erase = spi_block_erase_d8,
4975 }, {
4976 .eraseblocks = { {64 * 1024, 4} },
4977 .block_erase = spi_block_erase_52,
4978 }, {
4979 .eraseblocks = { {256 * 1024, 1} },
4980 .block_erase = spi_block_erase_60,
4981 }, {
4982 .eraseblocks = { {256 * 1024, 1} },
4983 .block_erase = spi_block_erase_c7,
4984 }
4985 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004986 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004987 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004988 .write = spi_chip_write_256,
4989 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004990 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004991 },
4992
4993 {
4994 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004995 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004996 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004997 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004998 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004999 .total_size = 4096,
5000 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00005001 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00005002 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00005003 .probe = probe_spi_rdid,
5004 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00005005 .block_erasers =
5006 {
5007 {
5008 .eraseblocks = { {4 * 1024, 1024} },
5009 .block_erase = spi_block_erase_20,
5010 }, {
5011 .eraseblocks = { {64 * 1024, 64} },
5012 .block_erase = spi_block_erase_d8,
5013 }, {
5014 .eraseblocks = { {4 * 1024 * 1024, 1} },
5015 .block_erase = spi_block_erase_60,
5016 }, {
5017 .eraseblocks = { {4 * 1024 * 1024, 1} },
5018 .block_erase = spi_block_erase_c7,
5019 }
5020 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005021 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005022 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00005023 .write = spi_chip_write_256,
5024 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005025 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00005026 },
5027
5028 {
Russ Dill3cd5a122010-03-05 08:44:11 +00005029 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005030 .name = "EN25F40",
5031 .bustype = BUS_SPI,
5032 .manufacture_id = EON_ID_NOPREFIX,
5033 .model_id = EON_EN25F40,
5034 .total_size = 512,
5035 .page_size = 256,
5036 .feature_bits = FEATURE_WRSR_WREN,
5037 .tested = TEST_OK_PREW,
5038 .probe = probe_spi_rdid,
5039 .probe_timing = TIMING_ZERO,
5040 .block_erasers =
5041 {
5042 {
5043 .eraseblocks = { {4 * 1024, 128} },
5044 .block_erase = spi_block_erase_20,
5045 }, {
5046 .eraseblocks = { {64 * 1024, 8} },
5047 .block_erase = spi_block_erase_d8,
5048 }, {
5049 .eraseblocks = { {512 * 1024, 1} },
5050 .block_erase = spi_block_erase_60,
5051 }, {
5052 .eraseblocks = { {512 * 1024, 1} },
5053 .block_erase = spi_block_erase_c7,
5054 },
5055 },
5056 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5057 .unlock = spi_disable_blockprotect,
5058 .write = spi_chip_write_256,
5059 .read = spi_chip_read,
5060 .voltage = {2700, 3600},
5061 },
5062
5063 {
5064 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00005065 .name = "EN25F64",
5066 .bustype = BUS_SPI,
5067 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00005068 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00005069 .total_size = 8192,
5070 .page_size = 256,
5071 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00005072 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00005073 .probe = probe_spi_rdid,
5074 .probe_timing = TIMING_ZERO,
5075 .block_erasers =
5076 {
5077 {
5078 .eraseblocks = { {4 * 1024, 2048} },
5079 .block_erase = spi_block_erase_20,
5080 }, {
5081 .eraseblocks = { {64 * 1024, 128} },
5082 .block_erase = spi_block_erase_d8,
5083 }, {
5084 .eraseblocks = { {8 * 1024 * 1024, 1} },
5085 .block_erase = spi_block_erase_60,
5086 }, {
5087 .eraseblocks = { {8 * 1024 * 1024, 1} },
5088 .block_erase = spi_block_erase_c7,
5089 }
5090 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005091 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00005092 .unlock = spi_disable_blockprotect,
5093 .write = spi_chip_write_256,
5094 .read = spi_chip_read,
5095 .voltage = {2700, 3600},
5096 },
5097
5098 {
5099 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005100 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005101 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005102 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005103 .model_id = EON_EN25F80,
David Hendricks6d715302011-07-24 22:21:57 +00005104 .total_size = 1024,
5105 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005106 .feature_bits = FEATURE_WRSR_WREN,
5107 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005108 .probe = probe_spi_rdid,
5109 .probe_timing = TIMING_ZERO,
5110 .block_erasers =
5111 {
5112 {
5113 .eraseblocks = { {4 * 1024, 256} },
5114 .block_erase = spi_block_erase_20,
5115 }, {
5116 .eraseblocks = { {64 * 1024, 16} },
5117 .block_erase = spi_block_erase_d8,
5118 }, {
5119 .eraseblocks = { {1024 * 1024, 1} },
5120 .block_erase = spi_block_erase_60,
5121 }, {
5122 .eraseblocks = { {1024 * 1024, 1} },
5123 .block_erase = spi_block_erase_c7,
5124 }
5125 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005126 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005127 .unlock = spi_disable_blockprotect,
5128 .write = spi_chip_write_256,
5129 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005130 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005131 },
5132
5133 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005134 .vendor = "Eon",
5135 .name = "EN25P05",
5136 .bustype = BUS_SPI,
5137 .manufacture_id = EON_ID_NOPREFIX,
5138 .model_id = EON_EN25B05,
5139 .total_size = 64,
5140 .page_size = 256,
5141 .feature_bits = FEATURE_WRSR_WREN,
5142 .tested = TEST_UNTESTED,
5143 .probe = probe_spi_rdid,
5144 .probe_timing = TIMING_ZERO,
5145 .block_erasers =
5146 {
5147 {
5148 .eraseblocks = {
5149 {32 * 1024, 2} },
5150 .block_erase = spi_block_erase_d8,
5151 }, {
5152 .eraseblocks = { {64 * 1024, 1} },
5153 .block_erase = spi_block_erase_c7,
5154 }
5155 },
5156 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5157 .unlock = spi_disable_blockprotect,
5158 .write = spi_chip_write_256,
5159 .read = spi_chip_read, /* Fast read (0x0B) supported */
5160 .voltage = {2700, 3600},
5161 },
5162
5163 {
5164 .vendor = "Eon",
5165 .name = "EN25P10",
5166 .bustype = BUS_SPI,
5167 .manufacture_id = EON_ID_NOPREFIX,
5168 .model_id = EON_EN25B10,
5169 .total_size = 128,
5170 .page_size = 256,
5171 .feature_bits = FEATURE_WRSR_WREN,
5172 .tested = TEST_UNTESTED,
5173 .probe = probe_spi_rdid,
5174 .probe_timing = TIMING_ZERO,
5175 .block_erasers =
5176 {
5177 {
5178 .eraseblocks = { {32 * 1024, 4} },
5179 .block_erase = spi_block_erase_d8,
5180 }, {
5181 .eraseblocks = { {128 * 1024, 1} },
5182 .block_erase = spi_block_erase_c7,
5183 }
5184 },
5185 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5186 .unlock = spi_disable_blockprotect,
5187 .write = spi_chip_write_256,
5188 .read = spi_chip_read, /* Fast read (0x0B) supported */
5189 .voltage = {2700, 3600},
5190 },
5191
5192 {
5193 .vendor = "Eon",
5194 .name = "EN25P16",
5195 .bustype = BUS_SPI,
5196 .manufacture_id = EON_ID_NOPREFIX,
5197 .model_id = EON_EN25B16,
5198 .total_size = 2048,
5199 .page_size = 256,
5200 .feature_bits = FEATURE_WRSR_WREN,
5201 .tested = TEST_UNTESTED,
5202 .probe = probe_spi_rdid,
5203 .probe_timing = TIMING_ZERO,
5204 .block_erasers =
5205 {
5206 {
5207 .eraseblocks = { {64 * 1024, 32} },
5208 .block_erase = spi_block_erase_d8,
5209 }, {
5210 .eraseblocks = { {2 * 1024 * 1024, 1} },
5211 .block_erase = spi_block_erase_c7,
5212 }
5213 },
5214 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5215 .unlock = spi_disable_blockprotect,
5216 .write = spi_chip_write_256,
5217 .read = spi_chip_read, /* Fast read (0x0B) supported */
5218 .voltage = {2700, 3600},
5219 },
5220
5221 {
5222 .vendor = "Eon",
5223 .name = "EN25P20",
5224 .bustype = BUS_SPI,
5225 .manufacture_id = EON_ID_NOPREFIX,
5226 .model_id = EON_EN25B20,
5227 .total_size = 256,
5228 .page_size = 256,
5229 .feature_bits = FEATURE_WRSR_WREN,
5230 .tested = TEST_UNTESTED,
5231 .probe = probe_spi_rdid,
5232 .probe_timing = TIMING_ZERO,
5233 .block_erasers =
5234 {
5235 {
5236 .eraseblocks = { {64 * 1024, 4} },
5237 .block_erase = spi_block_erase_d8,
5238 }, {
5239 .eraseblocks = { {256 * 1024, 1} },
5240 .block_erase = spi_block_erase_c7,
5241 }
5242 },
5243 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5244 .unlock = spi_disable_blockprotect,
5245 .write = spi_chip_write_256,
5246 .read = spi_chip_read, /* Fast read (0x0B) supported */
5247 .voltage = {2700, 3600},
5248 },
5249
5250 {
5251 .vendor = "Eon",
5252 .name = "EN25P32", /* Uniform version of EN25B32 */
5253 .bustype = BUS_SPI,
5254 .manufacture_id = EON_ID_NOPREFIX,
5255 .model_id = EON_EN25B32,
5256 .total_size = 4096,
5257 .page_size = 256,
5258 /* OTP: 512B total; enter 0x3A */
5259 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5260 .tested = TEST_UNTESTED,
5261 .probe = probe_spi_rdid,
5262 .probe_timing = TIMING_ZERO,
5263 .block_erasers =
5264 {
5265 {
5266 .eraseblocks = { {64 * 1024, 64} },
5267 .block_erase = spi_block_erase_d8,
5268 }, {
5269 .eraseblocks = { {4 * 1024 * 1024, 1} },
5270 .block_erase = spi_block_erase_c7,
5271 }
5272 },
5273 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5274 .unlock = spi_disable_blockprotect,
5275 .write = spi_chip_write_256,
5276 .read = spi_chip_read, /* Fast read (0x0B) supported */
5277 .voltage = {2700, 3600},
5278 },
5279
5280 {
5281 .vendor = "Eon",
5282 .name = "EN25P40",
5283 .bustype = BUS_SPI,
5284 .manufacture_id = EON_ID_NOPREFIX,
5285 .model_id = EON_EN25B40,
5286 .total_size = 512,
5287 .page_size = 256,
5288 .feature_bits = FEATURE_WRSR_WREN,
5289 .tested = TEST_UNTESTED,
5290 .probe = probe_spi_rdid,
5291 .probe_timing = TIMING_ZERO,
5292 .block_erasers =
5293 {
5294 {
5295 .eraseblocks = { {64 * 1024, 8} },
5296 .block_erase = spi_block_erase_d8,
5297 }, {
5298 .eraseblocks = { {512 * 1024, 1} },
5299 .block_erase = spi_block_erase_c7,
5300 }
5301 },
5302 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5303 .unlock = spi_disable_blockprotect,
5304 .write = spi_chip_write_256,
5305 .read = spi_chip_read, /* Fast read (0x0B) supported */
5306 .voltage = {2700, 3600},
5307 },
5308
5309 {
5310 .vendor = "Eon",
5311 .name = "EN25P64",
5312 .bustype = BUS_SPI,
5313 .manufacture_id = EON_ID_NOPREFIX,
5314 .model_id = EON_EN25B64,
5315 .total_size = 8192,
5316 .page_size = 256,
5317 /* OTP: 512B total; enter 0x3A */
5318 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5319 .tested = TEST_UNTESTED,
5320 .probe = probe_spi_rdid,
5321 .probe_timing = TIMING_ZERO,
5322 .block_erasers =
5323 {
5324 {
5325 .eraseblocks = { {64 * 1024, 128} },
5326 .block_erase = spi_block_erase_d8,
5327 }, {
5328 .eraseblocks = { {8 * 1024 * 1024, 1} },
5329 .block_erase = spi_block_erase_c7,
5330 }
5331 },
5332 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5333 .unlock = spi_disable_blockprotect,
5334 .write = spi_chip_write_256,
5335 .read = spi_chip_read, /* Fast read (0x0B) supported */
5336 .voltage = {2700, 3600},
5337 },
5338
5339 {
5340 .vendor = "Eon",
5341 .name = "EN25P80",
5342 .bustype = BUS_SPI,
5343 .manufacture_id = EON_ID_NOPREFIX,
5344 .model_id = EON_EN25B80,
5345 .total_size = 1024,
5346 .page_size = 256,
5347 .feature_bits = FEATURE_WRSR_WREN,
5348 .tested = TEST_UNTESTED,
5349 .probe = probe_spi_rdid,
5350 .probe_timing = TIMING_ZERO,
5351 .block_erasers =
5352 {
5353 {
5354 .eraseblocks = { {64 * 1024, 16} },
5355 .block_erase = spi_block_erase_d8,
5356 }, {
5357 .eraseblocks = { {1024 * 1024, 1} },
5358 .block_erase = spi_block_erase_c7,
5359 }
5360 },
5361 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5362 .unlock = spi_disable_blockprotect,
5363 .write = spi_chip_write_256,
5364 .read = spi_chip_read, /* Fast read (0x0B) supported */
5365 .voltage = {2700, 3600},
5366 },
5367
5368 {
5369 .vendor = "Eon",
5370 .name = "EN25Q128",
5371 .bustype = BUS_SPI,
5372 .manufacture_id = EON_ID_NOPREFIX,
5373 .model_id = EON_EN25Q128,
5374 .total_size = 16384,
5375 .page_size = 256,
5376 /* OTP: 512B total; enter 0x3A */
5377 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5378 .tested = TEST_OK_PREW,
5379 .probe = probe_spi_rdid,
5380 .probe_timing = TIMING_ZERO,
5381 .block_erasers =
5382 {
5383 {
5384 .eraseblocks = { {4 * 1024, 4096} },
5385 .block_erase = spi_block_erase_20,
5386 }, {
5387 .eraseblocks = { {64 * 1024, 256} },
5388 .block_erase = spi_block_erase_d8,
5389 }, {
5390 .eraseblocks = { {16 * 1024 * 1024, 1} },
5391 .block_erase = spi_block_erase_60,
5392 }, {
5393 .eraseblocks = { {16 * 1024 * 1024, 1} },
5394 .block_erase = spi_block_erase_c7,
5395 }
5396 },
5397 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5398 .unlock = spi_disable_blockprotect,
5399 .write = spi_chip_write_256,
5400 .read = spi_chip_read,
5401 },
5402
5403 {
David Hendricks6d715302011-07-24 22:21:57 +00005404 /* Note: EN25D16 is an evil twin which shares the model ID
5405 but has different write protection capabilities */
5406 .vendor = "Eon",
5407 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005408 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005409 .manufacture_id = EON_ID_NOPREFIX,
5410 .model_id = EON_EN25Q16,
5411 .total_size = 2048,
5412 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005413 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
5414 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00005415 .tested = TEST_UNTESTED,
5416 .probe = probe_spi_rdid,
5417 .probe_timing = TIMING_ZERO,
5418 .block_erasers =
5419 {
5420 {
5421 .eraseblocks = { {4 * 1024, 512} },
5422 .block_erase = spi_block_erase_20,
5423 }, {
5424 .eraseblocks = { {64 * 1024, 32} },
5425 .block_erase = spi_block_erase_d8,
5426 }, {
5427 /* not supported by Q16 version */
5428 .eraseblocks = { {64 * 1024, 32} },
5429 .block_erase = spi_block_erase_52,
5430 }, {
5431 .eraseblocks = { {2 * 1024 * 1024, 1} },
5432 .block_erase = spi_block_erase_60,
5433 }, {
5434 .eraseblocks = { {2 * 1024 * 1024, 1} },
5435 .block_erase = spi_block_erase_c7,
5436 }
5437 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005438 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005439 .unlock = spi_disable_blockprotect,
5440 .write = spi_chip_write_256,
5441 .read = spi_chip_read,
5442 .voltage = {2700, 3600},
5443 },
5444
5445 {
5446 .vendor = "Eon",
5447 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005448 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005449 .manufacture_id = EON_ID_NOPREFIX,
5450 .model_id = EON_EN25Q32,
5451 .total_size = 4096,
5452 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005453 /* OTP: 512B total; enter 0x3A */
5454 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005455 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005456 .probe = probe_spi_rdid,
5457 .probe_timing = TIMING_ZERO,
5458 .block_erasers =
5459 {
5460 {
5461 .eraseblocks = { {4 * 1024, 1024} },
5462 .block_erase = spi_block_erase_20,
5463 }, {
5464 .eraseblocks = { {64 * 1024, 64} },
5465 .block_erase = spi_block_erase_d8,
5466 }, {
5467 .eraseblocks = { {4 * 1024 * 1024, 1} },
5468 .block_erase = spi_block_erase_60,
5469 }, {
5470 .eraseblocks = { {4 * 1024 * 1024, 1} },
5471 .block_erase = spi_block_erase_c7,
5472 }
5473 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005474 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005475 .unlock = spi_disable_blockprotect,
5476 .write = spi_chip_write_256,
5477 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005478 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005479 },
5480
5481 {
5482 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005483 .name = "EN25Q40",
5484 .bustype = BUS_SPI,
5485 .manufacture_id = EON_ID_NOPREFIX,
5486 .model_id = EON_EN25Q40,
5487 .total_size = 512,
5488 .page_size = 256,
5489 /* OTP: 256B total; enter 0x3A */
5490 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5491 .tested = TEST_UNTESTED,
5492 .probe = probe_spi_rdid,
5493 .probe_timing = TIMING_ZERO,
5494 .block_erasers =
5495 {
5496 {
5497 .eraseblocks = { {4 * 1024, 128} },
5498 .block_erase = spi_block_erase_20,
5499 }, {
5500 .eraseblocks = { {64 * 1024, 8} },
5501 .block_erase = spi_block_erase_d8,
5502 }, {
5503 .eraseblocks = { {512 * 1024, 1} },
5504 .block_erase = spi_block_erase_60,
5505 }, {
5506 .eraseblocks = { {512 * 1024, 1} },
5507 .block_erase = spi_block_erase_c7,
5508 }
5509 },
5510 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5511 .unlock = spi_disable_blockprotect,
5512 .write = spi_chip_write_256,
5513 .read = spi_chip_read,
5514 .voltage = {2700, 3600},
5515 },
5516
5517 {
5518 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00005519 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005520 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005521 .manufacture_id = EON_ID_NOPREFIX,
5522 .model_id = EON_EN25Q64,
5523 .total_size = 8192,
5524 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005525 /* OTP: 512B total; enter 0x3A */
5526 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005527 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005528 .probe = probe_spi_rdid,
5529 .probe_timing = TIMING_ZERO,
5530 .block_erasers =
5531 {
5532 {
5533 .eraseblocks = { {4 * 1024, 2048} },
5534 .block_erase = spi_block_erase_20,
5535 }, {
5536 .eraseblocks = { {64 * 1024, 128} },
5537 .block_erase = spi_block_erase_d8,
5538 }, {
5539 .eraseblocks = { {8 * 1024 * 1024, 1} },
5540 .block_erase = spi_block_erase_60,
5541 }, {
5542 .eraseblocks = { {8 * 1024 * 1024, 1} },
5543 .block_erase = spi_block_erase_c7,
5544 }
5545 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005546 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005547 .unlock = spi_disable_blockprotect,
5548 .write = spi_chip_write_256,
5549 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005550 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005551 },
5552
5553 {
5554 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005555 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005556 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005557 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005558 .model_id = EON_EN25Q80,
5559 .total_size = 1024,
5560 .page_size = 256,
5561 /* OTP: 256B total; enter 0x3A */
5562 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5563 .tested = TEST_UNTESTED,
5564 .probe = probe_spi_rdid,
5565 .probe_timing = TIMING_ZERO,
5566 .block_erasers =
5567 {
5568 {
5569 .eraseblocks = { {4 * 1024, 256} },
5570 .block_erase = spi_block_erase_20,
5571 }, {
5572 .eraseblocks = { {64 * 1024, 16} },
5573 .block_erase = spi_block_erase_d8,
5574 }, {
5575 .eraseblocks = { {1024 * 1024, 1} },
5576 .block_erase = spi_block_erase_60,
5577 }, {
5578 .eraseblocks = { {1024 * 1024, 1} },
5579 .block_erase = spi_block_erase_c7,
5580 }
5581 },
5582 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5583 .unlock = spi_disable_blockprotect,
5584 .write = spi_chip_write_256,
5585 .read = spi_chip_read,
5586 .voltage = {2700, 3600},
5587 },
5588
5589 {
5590 .vendor = "Eon",
5591 .name = "EN25QH128",
5592 .bustype = BUS_SPI,
5593 .manufacture_id = EON_ID_NOPREFIX,
5594 .model_id = EON_EN25QH128,
David Hendricks6d715302011-07-24 22:21:57 +00005595 .total_size = 16384,
5596 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005597 /* supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00005598 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005599 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5600 .dummy_cycles =
5601 {
5602 .qpi_fast_read = 6,
5603 .qpi_fast_read_qio = 6,
5604 },
Tim Chenbfe149a2020-07-06 14:59:21 +08005605 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005606 .probe = probe_spi_rdid,
5607 .probe_timing = TIMING_ZERO,
5608 .block_erasers =
5609 {
5610 {
5611 .eraseblocks = { {4 * 1024, 4096} },
5612 .block_erase = spi_block_erase_20,
5613 }, {
5614 .eraseblocks = { {64 * 1024, 256} },
5615 .block_erase = spi_block_erase_d8,
5616 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005617 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005618 .block_erase = spi_block_erase_60,
5619 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005620 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005621 .block_erase = spi_block_erase_c7,
5622 }
5623 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005624 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5625 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005626 .write = spi_chip_write_256,
5627 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005628 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005629 .reg_bits =
5630 {
5631 .srp = {STATUS1, 7, RW},
5632 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5633 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5634 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005635 .wp_write_cfg = spi_wp_write_cfg,
5636 .wp_read_cfg = spi_wp_read_cfg,
5637 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005638 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02005639 .prepare_access = spi_prepare_io,
5640 .finish_access = spi_finish_io,
David Hendricks6d715302011-07-24 22:21:57 +00005641 },
5642
5643 {
5644 .vendor = "Eon",
5645 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005646 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005647 .manufacture_id = EON_ID_NOPREFIX,
5648 .model_id = EON_EN25QH16,
5649 .total_size = 2048,
5650 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005651 /* supports SFDP */
5652 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5654 .dummy_cycles =
5655 {
5656 .qpi_fast_read = 6,
5657 .qpi_fast_read_qio = 6,
5658 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00005659 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005660 .probe = probe_spi_rdid,
5661 .probe_timing = TIMING_ZERO,
5662 .block_erasers =
5663 {
5664 {
5665 .eraseblocks = { {4 * 1024, 512} },
5666 .block_erase = spi_block_erase_20,
5667 }, {
5668 .eraseblocks = { {64 * 1024, 32} },
5669 .block_erase = spi_block_erase_d8,
5670 }, {
5671 .eraseblocks = { {1024 * 2048, 1} },
5672 .block_erase = spi_block_erase_60,
5673 }, {
5674 .eraseblocks = { {1024 * 2048, 1} },
5675 .block_erase = spi_block_erase_c7,
5676 }
5677 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005678 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005679 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005680 .write = spi_chip_write_256,
5681 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005682 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005683 .prepare_access = spi_prepare_io,
5684 .finish_access = spi_finish_io,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005685 },
5686
5687 {
5688 .vendor = "Eon",
5689 .name = "EN25QH32",
5690 .bustype = BUS_SPI,
5691 .manufacture_id = EON_ID_NOPREFIX,
5692 .model_id = EON_EN25QH32,
5693 .total_size = 4096,
5694 .page_size = 256,
5695 /* supports SFDP */
5696 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005697 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5698 .dummy_cycles =
5699 {
5700 .qpi_fast_read = 6,
5701 .qpi_fast_read_qio = 6,
5702 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005703 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005704 .probe = probe_spi_rdid,
5705 .probe_timing = TIMING_ZERO,
5706 .block_erasers =
5707 {
5708 {
5709 .eraseblocks = { {4 * 1024, 1024} },
5710 .block_erase = spi_block_erase_20,
5711 }, {
5712 .eraseblocks = { {64 * 1024, 64} },
5713 .block_erase = spi_block_erase_d8,
5714 }, {
5715 .eraseblocks = { {1024 * 4096, 1} },
5716 .block_erase = spi_block_erase_60,
5717 }, {
5718 .eraseblocks = { {1024 * 4096, 1} },
5719 .block_erase = spi_block_erase_c7,
5720 }
5721 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005722 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005723 .unlock = spi_disable_blockprotect_bp3_srwd,
5724 .write = spi_chip_write_256,
5725 .read = spi_chip_read,
5726 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005727 .reg_bits =
5728 {
5729 .srp = {STATUS1, 7, RW},
5730 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5731 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5732 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005733 .wp_write_cfg = spi_wp_write_cfg,
5734 .wp_read_cfg = spi_wp_read_cfg,
5735 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005736 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02005737 .prepare_access = spi_prepare_io,
5738 .finish_access = spi_finish_io,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005739 },
5740
5741 {
5742 .vendor = "Eon",
5743 .name = "EN25QH32B",
5744 .bustype = BUS_SPI,
5745 .manufacture_id = EON_ID_NOPREFIX,
5746 .model_id = EON_EN25QH32,
5747 .total_size = 4096,
5748 .page_size = 256,
5749 /* supports SFDP */
5750 /* OTP: 1536B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005751 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_38,
5752 .dummy_cycles =
5753 {
5754 .qpi_fast_read = 6,
5755 .qpi_fast_read_qio = 6,
5756 },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005757 .tested = TEST_OK_PREW,
5758 .probe = probe_spi_rdid,
5759 .probe_timing = TIMING_ZERO,
5760 .block_erasers =
5761 {
5762 {
5763 .eraseblocks = { {4 * 1024, 1024} },
5764 .block_erase = spi_block_erase_20,
5765 }, {
5766 .eraseblocks = { {32 * 1024, 128} },
5767 .block_erase = spi_block_erase_52,
5768 }, {
5769 .eraseblocks = { {64 * 1024, 64} },
5770 .block_erase = spi_block_erase_d8,
5771 }, {
5772 .eraseblocks = { {1024 * 4096, 1} },
5773 .block_erase = spi_block_erase_60,
5774 }, {
5775 .eraseblocks = { {1024 * 4096, 1} },
5776 .block_erase = spi_block_erase_c7,
5777 }
5778 },
5779 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5780 .unlock = spi_disable_blockprotect_bp3_srwd,
5781 .write = spi_chip_write_256,
5782 .read = spi_chip_read,
5783 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005784 .prepare_access = spi_prepare_io,
5785 .finish_access = spi_finish_io,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005786 },
5787
5788 {
5789 .vendor = "Eon",
5790 .name = "EN25QH64",
5791 .bustype = BUS_SPI,
5792 .manufacture_id = EON_ID_NOPREFIX,
5793 .model_id = EON_EN25QH64,
5794 .total_size = 8192,
5795 .page_size = 256,
5796 /* supports SFDP */
5797 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005798 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5799 .dummy_cycles =
5800 {
5801 .qpi_fast_read = 6,
5802 .qpi_fast_read_qio = 6,
5803 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005804 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005805 .probe = probe_spi_rdid,
5806 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005807 .block_erasers =
5808 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005809 {
5810 .eraseblocks = { {4 * 1024, 2048} },
5811 .block_erase = spi_block_erase_20,
5812 }, {
5813 .eraseblocks = { {64 * 1024, 128} },
5814 .block_erase = spi_block_erase_d8,
5815 }, {
5816 .eraseblocks = { { 8192 * 1024, 1} },
5817 .block_erase = spi_block_erase_60,
5818 }, {
5819 .eraseblocks = { { 8192 * 1024, 1} },
5820 .block_erase = spi_block_erase_c7,
5821 }
5822 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005823 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005824 .unlock = spi_disable_blockprotect_bp3_srwd,
5825 .write = spi_chip_write_256,
5826 .read = spi_chip_read,
5827 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005828 .reg_bits =
5829 {
5830 .srp = {STATUS1, 7, RW},
5831 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5832 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5833 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005834 .wp_write_cfg = spi_wp_write_cfg,
5835 .wp_read_cfg = spi_wp_read_cfg,
5836 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005837 .decode_range = decode_range_spi25_64k_block,
Nico Huber930d4212024-05-04 18:59:15 +02005838 .prepare_access = spi_prepare_io,
5839 .finish_access = spi_finish_io,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005840 },
5841
5842 {
5843 .vendor = "Eon",
5844 .name = "EN25QH64A",
5845 .bustype = BUS_SPI,
5846 .manufacture_id = EON_ID_NOPREFIX,
5847 .model_id = EON_EN25QH64,
5848 .total_size = 8192,
5849 .page_size = 256,
5850 /* supports SFDP */
5851 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005852 /* Has a special, volatile status register 3 that is written with
5853 0xc0 like Set Read Parameters. Hence treating as QPI_SRP. */
5854 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP,
5855 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005856 .tested = TEST_OK_PREW,
5857 .probe = probe_spi_rdid,
5858 .probe_timing = TIMING_ZERO,
5859 .block_erasers =
5860 {
5861 {
5862 .eraseblocks = { {4 * 1024, 2048} },
5863 .block_erase = spi_block_erase_20,
5864 }, {
5865 .eraseblocks = { {32 * 1024, 256} },
5866 .block_erase = spi_block_erase_52,
5867 }, {
5868 .eraseblocks = { {64 * 1024, 128} },
5869 .block_erase = spi_block_erase_d8,
5870 }, {
5871 .eraseblocks = { { 8192 * 1024, 1} },
5872 .block_erase = spi_block_erase_60,
5873 }, {
5874 .eraseblocks = { { 8192 * 1024, 1} },
5875 .block_erase = spi_block_erase_c7,
5876 }
5877 },
5878 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5879 .unlock = spi_disable_blockprotect_bp3_srwd,
5880 .write = spi_chip_write_256,
5881 .read = spi_chip_read,
5882 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005883 .prepare_access = spi_prepare_io,
5884 .finish_access = spi_finish_io,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005885 },
5886
5887 {
5888 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005889 .name = "EN25S10",
5890 .bustype = BUS_SPI,
5891 .manufacture_id = EON_ID_NOPREFIX,
5892 .model_id = EON_EN25S10,
5893 .total_size = 128,
5894 .page_size = 256,
5895 /* OTP: 256B total; enter 0x3A */
5896 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5897 .tested = TEST_UNTESTED,
5898 .probe = probe_spi_rdid,
5899 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005900 .block_erasers =
5901 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005902 {
5903 .eraseblocks = { {4 * 1024, 32} },
5904 .block_erase = spi_block_erase_20,
5905 }, {
5906 .eraseblocks = { {32 * 1024, 4} },
5907 .block_erase = spi_block_erase_52,
5908 }, {
5909 .eraseblocks = { {128 * 1024, 1} },
5910 .block_erase = spi_block_erase_60,
5911 }, {
5912 .eraseblocks = { {128 * 1024, 1} },
5913 .block_erase = spi_block_erase_c7,
5914 }
5915 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005916 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005917 .unlock = spi_disable_blockprotect,
5918 .write = spi_chip_write_256,
5919 .read = spi_chip_read,
5920 .voltage = {1650, 1950},
5921 },
5922
5923 {
5924 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005925 .name = "EN25S16",
5926 .bustype = BUS_SPI,
5927 .manufacture_id = EON_ID_NOPREFIX,
5928 .model_id = EON_EN25S16,
5929 .total_size = 2048,
5930 .page_size = 256,
5931 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005932 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5933 .dummy_cycles =
5934 {
5935 .qpi_fast_read = 6,
5936 .qpi_fast_read_qio = 6,
5937 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005938 .tested = TEST_UNTESTED,
5939 .probe = probe_spi_rdid,
5940 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005941 .block_erasers =
5942 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005943 {
5944 .eraseblocks = { {4 * 1024, 512} },
5945 .block_erase = spi_block_erase_20,
5946 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005947 .eraseblocks = { {32 * 1024, 64} },
5948 .block_erase = spi_block_erase_d8,
5949 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05305950 .eraseblocks = { {64 * 1024, 32} },
5951 .block_erase = spi_block_erase_52,
5952 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005953 .eraseblocks = { {2048 * 1024, 1} },
5954 .block_erase = spi_block_erase_60,
5955 }, {
5956 .eraseblocks = { {2048 * 1024, 1} },
5957 .block_erase = spi_block_erase_c7,
5958 }
5959 },
5960 .printlock = spi_prettyprint_status_register_en25s_wp,
5961 .unlock = spi_disable_blockprotect_bp3_srwd,
5962 .write = spi_chip_write_256,
5963 .read = spi_chip_read,
5964 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02005965 .prepare_access = spi_prepare_io,
5966 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005967 },
5968
5969 {
5970 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005971 .name = "EN25S20",
5972 .bustype = BUS_SPI,
5973 .manufacture_id = EON_ID_NOPREFIX,
5974 .model_id = EON_EN25S20,
5975 .total_size = 256,
5976 .page_size = 256,
5977 /* OTP: 256B total; enter 0x3A */
5978 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5979 .tested = TEST_UNTESTED,
5980 .probe = probe_spi_rdid,
5981 .probe_timing = TIMING_ZERO,
5982 .block_erasers =
5983 {
5984 {
5985 .eraseblocks = { {4 * 1024, 64} },
5986 .block_erase = spi_block_erase_20,
5987 }, {
5988 .eraseblocks = { {64 * 1024, 4} },
5989 .block_erase = spi_block_erase_d8,
5990 }, {
5991 .eraseblocks = { {256 * 1024, 1} },
5992 .block_erase = spi_block_erase_60,
5993 }, {
5994 .eraseblocks = { {256 * 1024, 1} },
5995 .block_erase = spi_block_erase_c7,
5996 }
5997 },
5998 .printlock = spi_prettyprint_status_register_bp2_srwd,
5999 .unlock = spi_disable_blockprotect,
6000 .write = spi_chip_write_256,
6001 .read = spi_chip_read,
6002 .voltage = {1650, 1950},
6003 },
6004
6005 {
6006 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006007 .name = "EN25S32",
6008 .bustype = BUS_SPI,
6009 .manufacture_id = EON_ID_NOPREFIX,
6010 .model_id = EON_EN25S32,
6011 .total_size = 4096,
6012 .page_size = 256,
6013 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01006014 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
6015 .dummy_cycles =
6016 {
6017 .qpi_fast_read = 6,
6018 .qpi_fast_read_qio = 6,
6019 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006020 .tested = TEST_UNTESTED,
6021 .probe = probe_spi_rdid,
6022 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006023 .block_erasers =
6024 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006025 {
6026 .eraseblocks = { {4 * 1024, 1024} },
6027 .block_erase = spi_block_erase_20,
6028 }, {
6029 .eraseblocks = { {32 * 1024, 128} },
6030 .block_erase = spi_block_erase_52,
6031 }, {
6032 .eraseblocks = { {64 * 1024, 64} },
6033 .block_erase = spi_block_erase_d8,
6034 }, {
6035 .eraseblocks = { {4096 * 1024, 1} },
6036 .block_erase = spi_block_erase_60,
6037 }, {
6038 .eraseblocks = { {4096 * 1024, 1} },
6039 .block_erase = spi_block_erase_c7,
6040 }
6041 },
6042 .printlock = spi_prettyprint_status_register_en25s_wp,
6043 .unlock = spi_disable_blockprotect_bp3_srwd,
6044 .write = spi_chip_write_256,
6045 .read = spi_chip_read,
6046 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006047 .prepare_access = spi_prepare_io,
6048 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006049 },
6050
6051 {
6052 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006053 .name = "EN25S40",
6054 .bustype = BUS_SPI,
6055 .manufacture_id = EON_ID_NOPREFIX,
6056 .model_id = EON_EN25S40,
6057 .total_size = 512,
6058 .page_size = 256,
6059 /* OTP: 256B total; enter 0x3A */
6060 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6061 .tested = TEST_OK_PREW,
6062 .probe = probe_spi_rdid,
6063 .probe_timing = TIMING_ZERO,
6064 .block_erasers =
6065 {
6066 {
6067 .eraseblocks = { {4 * 1024, 128} },
6068 .block_erase = spi_block_erase_20,
6069 }, {
6070 .eraseblocks = { {64 * 1024, 8} },
6071 .block_erase = spi_block_erase_d8,
6072 }, {
6073 .eraseblocks = { {512 * 1024, 1} },
6074 .block_erase = spi_block_erase_60,
6075 }, {
6076 .eraseblocks = { {512 * 1024, 1} },
6077 .block_erase = spi_block_erase_c7,
6078 }
6079 },
6080 .printlock = spi_prettyprint_status_register_bp2_srwd,
6081 .unlock = spi_disable_blockprotect,
6082 .write = spi_chip_write_256,
6083 .read = spi_chip_read,
6084 .voltage = {1650, 1950},
6085 },
6086
6087 {
6088 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006089 .name = "EN25S64",
6090 .bustype = BUS_SPI,
6091 .manufacture_id = EON_ID_NOPREFIX,
6092 .model_id = EON_EN25S64,
6093 .total_size = 8192,
6094 .page_size = 256,
6095 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01006096 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
6097 .dummy_cycles =
6098 {
6099 .qpi_fast_read = 6,
6100 .qpi_fast_read_qio = 6,
6101 },
Nikolai Artemievdf889fa2021-03-23 17:10:45 +11006102 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006103 .probe = probe_spi_rdid,
6104 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006105 .block_erasers =
6106 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006107 {
6108 .eraseblocks = { {4 * 1024, 2048} },
6109 .block_erase = spi_block_erase_20,
6110 }, {
6111 .eraseblocks = { {64 * 1024, 128} },
6112 .block_erase = spi_block_erase_d8,
6113 }, {
6114 .eraseblocks = { {8192 * 1024, 1} },
6115 .block_erase = spi_block_erase_60,
6116 }, {
6117 .eraseblocks = { {8192 * 1024, 1} },
6118 .block_erase = spi_block_erase_c7,
6119 }
6120 },
6121 .printlock = spi_prettyprint_status_register_en25s_wp,
6122 .unlock = spi_disable_blockprotect_bp3_srwd,
6123 .write = spi_chip_write_256,
6124 .read = spi_chip_read,
6125 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006126 .prepare_access = spi_prepare_io,
6127 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00006128 },
6129
6130 {
6131 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006132 .name = "EN25S80",
6133 .bustype = BUS_SPI,
6134 .manufacture_id = EON_ID_NOPREFIX,
6135 .model_id = EON_EN25S80,
6136 .total_size = 1024,
6137 .page_size = 256,
6138 /* OTP: 256B total; enter 0x3A */
6139 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6140 .tested = TEST_UNTESTED,
6141 .probe = probe_spi_rdid,
6142 .probe_timing = TIMING_ZERO,
Russ Dill3cd5a122010-03-05 08:44:11 +00006143 .block_erasers =
6144 {
6145 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006146 .eraseblocks = { {4 * 1024, 256} },
6147 .block_erase = spi_block_erase_20,
6148 }, {
6149 .eraseblocks = { {64 * 1024, 16} },
6150 .block_erase = spi_block_erase_d8,
6151 }, {
6152 .eraseblocks = { {1024 * 1024, 1} },
6153 .block_erase = spi_block_erase_60,
6154 }, {
6155 .eraseblocks = { {1024 * 1024, 1} },
6156 .block_erase = spi_block_erase_c7,
6157 }
Russ Dill3cd5a122010-03-05 08:44:11 +00006158 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006159 .printlock = spi_prettyprint_status_register_bp2_srwd,
6160 .unlock = spi_disable_blockprotect,
6161 .write = spi_chip_write_256,
6162 .read = spi_chip_read,
6163 .voltage = {1650, 1950},
Russ Dill3cd5a122010-03-05 08:44:11 +00006164 },
6165
6166 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00006167 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006168 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006169 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006170 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006171 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006172 .total_size = 256,
6173 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00006174 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Green4362e622019-08-26 15:02:12 +10006175 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006176 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006177 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006178 .block_erasers =
6179 {
6180 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00006181 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006182 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00006183 {8 * 1024, 2},
6184 {32 * 1024, 1},
6185 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00006186 },
6187 .block_erase = erase_sector_jedec,
6188 }, {
6189 .eraseblocks = { {256 * 1024, 1} },
6190 .block_erase = erase_chip_block_jedec,
6191 },
6192 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006193 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006194 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006195 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006196 .prepare_access = prepare_memory_access,
6197 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006198 },
6199
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006200 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00006201 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006202 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006203 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006204 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006205 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006206 .total_size = 256,
6207 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00006208 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00006209 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006210 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006211 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006212 .block_erasers =
6213 {
6214 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00006215 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006216 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00006217 {32 * 1024, 1},
6218 {8 * 1024, 2},
6219 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00006220 },
6221 .block_erase = erase_sector_jedec,
6222 }, {
6223 .eraseblocks = { {256 * 1024, 1} },
6224 .block_erase = erase_chip_block_jedec,
6225 },
6226 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006227 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006229 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006230 .prepare_access = prepare_memory_access,
6231 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006232 },
6233
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006234 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00006235 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006236 .name = "EN29F010",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00006237 .bustype = BUS_PARALLEL,
6238 .manufacture_id = EON_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006239 .model_id = EON_EN29F010,
6240 .total_size = 128,
6241 .page_size = 128,
6242 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6243 .tested = TEST_OK_PRE,
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00006244 .probe = probe_jedec,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006245 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00006246 .block_erasers =
6247 {
6248 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006249 .eraseblocks = { {16 * 1024, 8} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00006250 .block_erase = erase_sector_jedec,
6251 },
6252 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006253 .eraseblocks = { {128 * 1024, 1} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00006254 .block_erase = erase_chip_block_jedec,
6255 },
6256 },
6257 .write = write_jedec_1,
6258 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006259 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006260 .prepare_access = prepare_memory_access,
6261 .finish_access = finish_memory_access,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00006262 },
6263
6264 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006265 .vendor = "Eon",
6266 .name = "EN29GL064(A)B",
6267 .bustype = BUS_PARALLEL,
6268 .manufacture_id = EON_ID,
6269 .model_id = EON_EN29GL064B,
6270 .total_size = 8192,
6271 .page_size = 128 * 1024, /* actual page size is 16 */
6272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6273 .tested = TEST_UNTESTED,
6274 .probe = probe_jedec_29gl,
6275 .probe_timing = TIMING_ZERO,
6276 .block_erasers =
6277 {
6278 {
6279 .eraseblocks = {
6280 {8 * 1024, 8},
6281 {64 * 1024, 127},
6282 },
6283 .block_erase = erase_sector_jedec,
6284 }, {
6285 .eraseblocks = { {8 * 1024 * 1024, 1} },
6286 .block_erase = erase_chip_block_jedec,
6287 },
6288 },
6289 .write = write_jedec_1,
6290 .read = read_memmapped,
6291 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006292 .prepare_access = prepare_memory_access,
6293 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006294 },
6295
6296 {
6297 .vendor = "Eon",
6298 .name = "EN29GL064(A)T",
6299 .bustype = BUS_PARALLEL,
6300 .manufacture_id = EON_ID,
6301 .model_id = EON_EN29GL064T,
6302 .total_size = 8192,
6303 .page_size = 128 * 1024, /* actual page size is 16 */
6304 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6305 .tested = TEST_UNTESTED,
6306 .probe = probe_jedec_29gl,
6307 .probe_timing = TIMING_ZERO,
6308 .block_erasers =
6309 {
6310 {
6311 .eraseblocks = {
6312 {64 * 1024, 127},
6313 {8 * 1024, 8},
6314 },
6315 .block_erase = erase_sector_jedec,
6316 }, {
6317 .eraseblocks = { {8 * 1024 * 1024, 1} },
6318 .block_erase = erase_chip_block_jedec,
6319 },
6320 },
6321 .write = write_jedec_1,
6322 .read = read_memmapped,
6323 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006324 .prepare_access = prepare_memory_access,
6325 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006326 },
6327
6328 {
6329 .vendor = "Eon",
6330 .name = "EN29GL064H/L",
6331 .bustype = BUS_PARALLEL,
6332 .manufacture_id = EON_ID,
6333 .model_id = EON_EN29GL064HL,
6334 .total_size = 8192,
6335 .page_size = 128 * 1024, /* actual page size is 16 */
6336 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6337 .tested = TEST_UNTESTED,
6338 .probe = probe_jedec_29gl,
6339 .probe_timing = TIMING_ZERO,
6340 .block_erasers =
6341 {
6342 {
6343 .eraseblocks = { {64 * 1024, 128} },
6344 .block_erase = erase_sector_jedec,
6345 }, {
6346 .eraseblocks = { {8 * 1024 * 1024, 1} },
6347 .block_erase = erase_chip_block_jedec,
6348 },
6349 },
6350 .write = write_jedec_1,
6351 .read = read_memmapped,
6352 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006353 .prepare_access = prepare_memory_access,
6354 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006355 },
6356
6357 {
6358 .vendor = "Eon",
6359 .name = "EN29GL128",
6360 .bustype = BUS_PARALLEL,
6361 .manufacture_id = EON_ID,
6362 .model_id = EON_EN29GL128HL,
6363 .total_size = 16384,
6364 .page_size = 128 * 1024, /* actual page size is 16 */
6365 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6366 .tested = TEST_UNTESTED,
6367 .probe = probe_jedec_29gl,
6368 .probe_timing = TIMING_ZERO,
6369 .block_erasers =
6370 {
6371 {
6372 .eraseblocks = { {128 * 1024, 128} },
6373 .block_erase = erase_sector_jedec,
6374 }, {
6375 .eraseblocks = { {16 * 1024 * 1024, 1} },
6376 .block_erase = erase_chip_block_jedec,
6377 },
6378 },
6379 .write = write_jedec_1,
6380 .read = read_memmapped,
6381 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006382 .prepare_access = prepare_memory_access,
6383 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006384 },
6385
6386 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006387 .vendor = "Eon",
6388 .name = "EN29LV040(A)",
6389 .bustype = BUS_PARALLEL,
6390 .manufacture_id = EON_ID,
6391 .model_id = EON_EN29LV040,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006392 .total_size = 512,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006393 .page_size = 4 * 1024,
6394 .tested = TEST_OK_PREW,
6395 .probe = probe_jedec,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006396 .probe_timing = TIMING_ZERO,
6397 .block_erasers =
6398 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006399 {
6400 .eraseblocks = { {64 * 1024, 8} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006401 .block_erase = erase_sector_jedec,
6402 },
6403 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006404 .eraseblocks = { {512 * 1024, 1} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006405 .block_erase = erase_chip_block_jedec,
6406 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006407 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006408 .write = write_jedec_1,
6409 .read = read_memmapped,
6410 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006411 .prepare_access = prepare_memory_access,
6412 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006413 },
6414
6415 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006416 .vendor = "Eon",
6417 .name = "EN29LV640B",
6418 .bustype = BUS_PARALLEL,
6419 .manufacture_id = EON_ID,
6420 .model_id = EON_EN29LV640B,
6421 .total_size = 8192,
6422 .page_size = 8192,
6423 .feature_bits = FEATURE_ADDR_SHIFTED,
6424 .tested = TEST_OK_PREW,
6425 .probe = probe_en29lv640b,
6426 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006427 .block_erasers =
6428 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006429 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006430 .eraseblocks = {
6431 {8 * 1024, 8},
6432 {64 * 1024, 127},
6433 },
6434 .block_erase = erase_block_jedec,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006435 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006436 .eraseblocks = { {8 * 1024 * 1024, 1} },
6437 .block_erase = erase_chip_block_jedec,
6438 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006439 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006440 .write = write_en29lv640b,
6441 .read = read_memmapped,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006442 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006443 .prepare_access = prepare_memory_access,
6444 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006445 },
6446
6447 {
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006448 .vendor = "Fudan",
6449 .name = "FM25F005",
6450 .bustype = BUS_SPI,
6451 .manufacture_id = FUDAN_ID_NOPREFIX,
6452 .model_id = FUDAN_FM25F005,
6453 .total_size = 64,
6454 .page_size = 256,
6455 /* OTP: 256B total; enter 0x3A */
6456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6457 .tested = TEST_UNTESTED,
6458 .probe = probe_spi_rdid,
6459 .probe_timing = TIMING_ZERO,
6460 .block_erasers = {
6461 {
6462 .eraseblocks = { {4 * 1024, 16} },
6463 .block_erase = spi_block_erase_20,
6464 }, {
6465 .eraseblocks = { {32 * 1024, 2} },
6466 .block_erase = spi_block_erase_52,
6467 }, {
6468 .eraseblocks = { {64 * 1024, 1} },
6469 .block_erase = spi_block_erase_d8,
6470 }, {
6471 .eraseblocks = { {64 * 1024, 1} },
6472 .block_erase = spi_block_erase_60,
6473 }, {
6474 .eraseblocks = { {64 * 1024, 1} },
6475 .block_erase = spi_block_erase_c7,
6476 }
6477 },
6478 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6479 .unlock = spi_disable_blockprotect_bp2_srwd,
6480 .write = spi_chip_write_256,
6481 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6482 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6483 },
6484
6485 {
6486 .vendor = "Fudan",
6487 .name = "FM25F01",
6488 .bustype = BUS_SPI,
6489 .manufacture_id = FUDAN_ID_NOPREFIX,
6490 .model_id = FUDAN_FM25F01,
6491 .total_size = 128,
6492 .page_size = 256,
6493 /* OTP: 256B total; enter 0x3A */
6494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6495 .tested = TEST_UNTESTED,
6496 .probe = probe_spi_rdid,
6497 .probe_timing = TIMING_ZERO,
6498 .block_erasers = {
6499 {
6500 .eraseblocks = { {4 * 1024, 32} },
6501 .block_erase = spi_block_erase_20,
6502 }, {
6503 .eraseblocks = { {32 * 1024, 4} },
6504 .block_erase = spi_block_erase_52,
6505 }, {
6506 .eraseblocks = { {64 * 1024, 2} },
6507 .block_erase = spi_block_erase_d8,
6508 }, {
6509 .eraseblocks = { {128 * 1024, 1} },
6510 .block_erase = spi_block_erase_60,
6511 }, {
6512 .eraseblocks = { {128 * 1024, 1} },
6513 .block_erase = spi_block_erase_c7,
6514 }
6515 },
6516 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6517 .unlock = spi_disable_blockprotect_bp2_srwd,
6518 .write = spi_chip_write_256,
6519 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6520 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6521 },
6522
6523 {
6524 .vendor = "Fudan",
6525 .name = "FM25F02(A)",
6526 .bustype = BUS_SPI,
6527 .manufacture_id = FUDAN_ID_NOPREFIX,
6528 .model_id = FUDAN_FM25F02,
6529 .total_size = 256,
6530 .page_size = 256,
6531 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6532 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6533 .tested = TEST_UNTESTED,
6534 .probe = probe_spi_rdid,
6535 .probe_timing = TIMING_ZERO,
6536 .block_erasers = {
6537 {
6538 .eraseblocks = { {4 * 1024, 64} },
6539 .block_erase = spi_block_erase_20,
6540 }, {
6541 .eraseblocks = { {32 * 1024, 8} },
6542 .block_erase = spi_block_erase_52,
6543 }, {
6544 .eraseblocks = { {64 * 1024, 4} },
6545 .block_erase = spi_block_erase_d8,
6546 }, {
6547 .eraseblocks = { {1024 * 256, 1} },
6548 .block_erase = spi_block_erase_60,
6549 }, {
6550 .eraseblocks = { {1024 * 256, 1} },
6551 .block_erase = spi_block_erase_c7,
6552 },
6553 },
6554 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6555 .unlock = spi_disable_blockprotect_bp2_srwd,
6556 .write = spi_chip_write_256,
6557 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6558 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6559 },
6560
6561 {
6562 .vendor = "Fudan",
6563 .name = "FM25F04(A)",
6564 .bustype = BUS_SPI,
6565 .manufacture_id = FUDAN_ID_NOPREFIX,
6566 .model_id = FUDAN_FM25F04,
6567 .total_size = 512,
6568 .page_size = 256,
6569 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6570 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6571 .tested = TEST_UNTESTED,
6572 .probe = probe_spi_rdid,
6573 .probe_timing = TIMING_ZERO,
6574 .block_erasers = {
6575 {
6576 .eraseblocks = { {4 * 1024, 128} },
6577 .block_erase = spi_block_erase_20,
6578 }, {
6579 .eraseblocks = { {32 * 1024, 16} },
6580 .block_erase = spi_block_erase_52,
6581 }, {
6582 .eraseblocks = { {64 * 1024, 8} },
6583 .block_erase = spi_block_erase_d8,
6584 }, {
6585 .eraseblocks = { {1024 * 512, 1} },
6586 .block_erase = spi_block_erase_60,
6587 }, {
6588 .eraseblocks = { {1024 * 512, 1} },
6589 .block_erase = spi_block_erase_c7,
6590 },
6591 },
6592 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6593 .unlock = spi_disable_blockprotect_bp2_srwd,
6594 .write = spi_chip_write_256,
6595 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6596 .voltage = {2700, 3600},
6597 },
6598
6599 {
6600 .vendor = "Fudan",
6601 .name = "FM25Q08",
6602 .bustype = BUS_SPI,
6603 .manufacture_id = FUDAN_ID_NOPREFIX,
6604 .model_id = FUDAN_FM25Q08,
6605 .total_size = 1024,
6606 .page_size = 256,
6607 /* supports SFDP */
6608 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006609 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6610 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006611 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006612 .tested = TEST_UNTESTED,
6613 .probe = probe_spi_rdid,
6614 .probe_timing = TIMING_ZERO,
6615 .block_erasers = {
6616 {
6617 .eraseblocks = { {4 * 1024, 256} },
6618 .block_erase = spi_block_erase_20,
6619 }, {
6620 .eraseblocks = { {32 * 1024, 32} },
6621 .block_erase = spi_block_erase_52,
6622 }, {
6623 .eraseblocks = { {64 * 1024, 16} },
6624 .block_erase = spi_block_erase_d8,
6625 }, {
6626 .eraseblocks = { {1024 * 1024, 1} },
6627 .block_erase = spi_block_erase_60,
6628 }, {
6629 .eraseblocks = { {1024 * 1024, 1} },
6630 .block_erase = spi_block_erase_c7,
6631 },
6632 },
Nico Huber226bb872024-04-09 23:30:34 +02006633 .reg_bits =
6634 {
6635 .qe = {STATUS2, 1, RW},
6636 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006637 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6638 .unlock = spi_disable_blockprotect_bp2_srwd,
6639 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006640 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006641 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006642 .prepare_access = spi_prepare_io,
6643 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006644 },
6645
6646 {
6647 .vendor = "Fudan",
6648 .name = "FM25Q16",
6649 .bustype = BUS_SPI,
6650 .manufacture_id = FUDAN_ID_NOPREFIX,
6651 .model_id = FUDAN_FM25Q16,
6652 .total_size = 2048,
6653 .page_size = 256,
6654 /* supports SFDP */
6655 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006656 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6657 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006658 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006659 .tested = TEST_UNTESTED,
6660 .probe = probe_spi_rdid,
6661 .probe_timing = TIMING_ZERO,
6662 .block_erasers = {
6663 {
6664 .eraseblocks = { {4 * 1024, 512} },
6665 .block_erase = spi_block_erase_20,
6666 }, {
6667 .eraseblocks = { {32 * 1024, 64} },
6668 .block_erase = spi_block_erase_52,
6669 }, {
6670 .eraseblocks = { {64 * 1024, 32} },
6671 .block_erase = spi_block_erase_d8,
6672 }, {
6673 .eraseblocks = { {2 * 1024 * 1024, 1} },
6674 .block_erase = spi_block_erase_60,
6675 }, {
6676 .eraseblocks = { {2 * 1024 * 1024, 1} },
6677 .block_erase = spi_block_erase_c7,
6678 }
6679 },
Nico Huber226bb872024-04-09 23:30:34 +02006680 .reg_bits =
6681 {
6682 .qe = {STATUS2, 1, RW},
6683 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006684 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6685 .unlock = spi_disable_blockprotect_bp2_srwd,
6686 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006687 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006688 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006689 .prepare_access = spi_prepare_io,
6690 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006691 },
6692
6693 {
6694 .vendor = "Fudan",
6695 .name = "FM25Q32",
6696 .bustype = BUS_SPI,
6697 .manufacture_id = FUDAN_ID_NOPREFIX,
6698 .model_id = FUDAN_FM25Q32,
6699 .total_size = 4096,
6700 .page_size = 256,
6701 /* supports SFDP */
6702 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006703 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6704 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006705 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006706 .tested = TEST_UNTESTED,
6707 .probe = probe_spi_rdid,
6708 .probe_timing = TIMING_ZERO,
6709 .block_erasers = {
6710 {
6711 .eraseblocks = { {4 * 1024, 1024} },
6712 .block_erase = spi_block_erase_20,
6713 }, {
6714 .eraseblocks = { {32 * 1024, 128} },
6715 .block_erase = spi_block_erase_52,
6716 }, {
6717 .eraseblocks = { {64 * 1024, 64} },
6718 .block_erase = spi_block_erase_d8,
6719 }, {
6720 .eraseblocks = { {4 * 1024 * 1024, 1} },
6721 .block_erase = spi_block_erase_60,
6722 }, {
6723 .eraseblocks = { {4 * 1024 * 1024, 1} },
6724 .block_erase = spi_block_erase_c7,
6725 },
6726 },
Nico Huber226bb872024-04-09 23:30:34 +02006727 .reg_bits =
6728 {
6729 .qe = {STATUS2, 1, RW},
6730 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006731 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6732 .unlock = spi_disable_blockprotect_bp2_srwd,
6733 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006734 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006735 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006736 .prepare_access = spi_prepare_io,
6737 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006738 },
6739
6740 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006741 .vendor = "Fujitsu",
6742 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006743 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006744 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006745 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006746 .total_size = 512,
6747 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006748 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006749 .tested = TEST_UNTESTED,
6750 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006751 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006752 .block_erasers =
6753 {
6754 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006755 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006756 {16 * 1024, 1},
6757 {8 * 1024, 2},
6758 {32 * 1024, 1},
6759 {64 * 1024, 7},
6760 },
Sean Nelson35727f72010-01-28 23:55:12 +00006761 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006762 }, {
6763 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006764 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006765 },
6766 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006767 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006768 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006769 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006770 .prepare_access = prepare_memory_access,
6771 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006772 },
6773
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006774 {
6775 .vendor = "Fujitsu",
6776 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006777 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006778 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006779 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006780 .total_size = 512,
6781 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006782 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006783 .tested = TEST_UNTESTED,
6784 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006785 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006786 .block_erasers =
6787 {
6788 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006789 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006790 {64 * 1024, 7},
6791 {32 * 1024, 1},
6792 {8 * 1024, 2},
6793 {16 * 1024, 1},
6794 },
Sean Nelson35727f72010-01-28 23:55:12 +00006795 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006796 }, {
6797 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006798 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006799 },
6800 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006801 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006802 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006803 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006804 .prepare_access = prepare_memory_access,
6805 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006806 },
6807
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006808 {
Sean Nelson35727f72010-01-28 23:55:12 +00006809 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006810 .vendor = "Fujitsu",
6811 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006812 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006813 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006814 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006815 .total_size = 512,
6816 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006817 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00006818 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006819 .probe = probe_jedec,
6820 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006821 .block_erasers =
6822 {
6823 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006824 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006825 {16 * 1024, 1},
6826 {8 * 1024, 2},
6827 {32 * 1024, 1},
6828 {64 * 1024, 7},
6829 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006830 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006831 }, {
6832 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006833 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006834 },
6835 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006836 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006837 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006838 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006839 .prepare_access = prepare_memory_access,
6840 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006841 },
6842
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006843 {
6844 .vendor = "Fujitsu",
6845 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006846 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006847 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006848 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006849 .total_size = 512,
6850 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006851 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006852 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006853 .probe = probe_jedec,
6854 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006855 .block_erasers =
6856 {
6857 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006858 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006859 {64 * 1024, 7},
6860 {32 * 1024, 1},
6861 {8 * 1024, 2},
6862 {16 * 1024, 1},
6863 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006864 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006865 }, {
6866 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006867 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006868 },
6869 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006870 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006871 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006872 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006873 .prepare_access = prepare_memory_access,
6874 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006875 },
6876
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006877 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006878 .vendor = "Fujitsu",
6879 .name = "MBM29LV160BE",
6880 .bustype = BUS_PARALLEL,
6881 .manufacture_id = FUJITSU_ID,
6882 .model_id = FUJITSU_MBM29LV160BE,
6883 .total_size = 2 * 1024,
6884 .page_size = 0,
6885 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6886 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006887 .probe = probe_jedec,
6888 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006889 .block_erasers =
6890 {
6891 {
6892 .eraseblocks = {
6893 {16 * 1024, 1},
6894 {8 * 1024, 2},
6895 {32 * 1024, 1},
6896 {64 * 1024, 31},
6897 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006898 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006899 }, {
6900 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006901 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006902 },
6903 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006904 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006905 .read = read_memmapped,
6906 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006907 .prepare_access = prepare_memory_access,
6908 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006909 },
6910
6911 {
6912 .vendor = "Fujitsu",
6913 .name = "MBM29LV160TE",
6914 .bustype = BUS_PARALLEL,
6915 .manufacture_id = FUJITSU_ID,
6916 .model_id = FUJITSU_MBM29LV160TE,
6917 .total_size = 2 * 1024,
6918 .page_size = 0,
6919 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6920 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006921 .probe = probe_jedec,
6922 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006923 .block_erasers =
6924 {
6925 {
6926 .eraseblocks = {
6927 {64 * 1024, 31},
6928 {32 * 1024, 1},
6929 {8 * 1024, 2},
6930 {16 * 1024, 1},
6931 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006932 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006933 }, {
6934 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006935 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006936 },
6937 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006938 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006939 .read = read_memmapped,
6940 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006941 .prepare_access = prepare_memory_access,
6942 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006943 },
6944
6945 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006946 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006947 .name = "GD25B128B/GD25Q128B",
Roman Titov95edc892015-04-03 21:29:04 +00006948 .bustype = BUS_SPI,
6949 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006950 .model_id = GIGADEVICE_GD25Q128,
6951 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006952 .page_size = 256,
6953 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006954 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006955 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006956 .probe = probe_spi_rdid,
6957 .probe_timing = TIMING_ZERO,
6958 .block_erasers =
6959 {
6960 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006961 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006962 .block_erase = spi_block_erase_20,
6963 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006964 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006965 .block_erase = spi_block_erase_52,
6966 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006967 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006968 .block_erase = spi_block_erase_d8,
6969 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006970 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006971 .block_erase = spi_block_erase_60,
6972 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006973 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006974 .block_erase = spi_block_erase_c7,
6975 }
6976 },
Nico Huber4da971f2024-03-27 01:18:12 +01006977 .reg_bits =
6978 {
6979 .qe = {STATUS2, 1, RW}, /* RO 1 in GD25B128B case */
6980 },
Roman Titov95edc892015-04-03 21:29:04 +00006981 .printlock = spi_prettyprint_status_register_bp4_srwd,
6982 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6983 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006984 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006985 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006986 .prepare_access = spi_prepare_io,
6987 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006988 },
6989
6990 {
6991 .vendor = "GigaDevice",
Edward O'Callaghan981a3442021-06-22 11:16:55 +10006992 .name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
Roman Titov95edc892015-04-03 21:29:04 +00006993 .bustype = BUS_SPI,
6994 .manufacture_id = GIGADEVICE_ID,
Alan Green188127e2019-08-06 16:10:34 +10006995 .model_id = GIGADEVICE_GD25LQ128CD,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006996 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006997 .page_size = 256,
6998 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006999 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
7000 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007001 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00007002 .probe = probe_spi_rdid,
7003 .probe_timing = TIMING_ZERO,
7004 .block_erasers =
7005 {
7006 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007007 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00007008 .block_erase = spi_block_erase_20,
7009 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007010 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00007011 .block_erase = spi_block_erase_52,
7012 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007013 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00007014 .block_erase = spi_block_erase_d8,
7015 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007016 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00007017 .block_erase = spi_block_erase_60,
7018 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007019 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00007020 .block_erase = spi_block_erase_c7,
7021 }
7022 },
7023 .printlock = spi_prettyprint_status_register_bp4_srwd,
7024 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7025 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007026 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00007027 .voltage = {1695, 1950},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007028 .reg_bits =
7029 {
Nico Huber4da971f2024-03-27 01:18:12 +01007030 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007031 .srp = {STATUS1, 7, RW},
7032 .srl = {STATUS2, 0, RW},
7033 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7034 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7035 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7036 .cmp = {STATUS2, 6, RW},
7037 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007038 .wp_write_cfg = spi_wp_write_cfg,
7039 .wp_read_cfg = spi_wp_read_cfg,
7040 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007041 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007042 .prepare_access = spi_prepare_io,
7043 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00007044 },
7045
7046 {
7047 .vendor = "GigaDevice",
7048 .name = "GD25LQ16",
7049 .bustype = BUS_SPI,
7050 .manufacture_id = GIGADEVICE_ID,
7051 .model_id = GIGADEVICE_GD25LQ16,
7052 .total_size = 2048,
7053 .page_size = 256,
7054 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007055 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ16C */
7056 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00007057 .tested = TEST_UNTESTED,
7058 .probe = probe_spi_rdid,
7059 .probe_timing = TIMING_ZERO,
7060 .block_erasers =
7061 {
7062 {
7063 .eraseblocks = { {4 * 1024, 512} },
7064 .block_erase = spi_block_erase_20,
7065 }, {
7066 .eraseblocks = { {32 * 1024, 64} },
7067 .block_erase = spi_block_erase_52,
7068 }, {
7069 .eraseblocks = { {64 * 1024, 32} },
7070 .block_erase = spi_block_erase_d8,
7071 }, {
7072 .eraseblocks = { {2 * 1024 * 1024, 1} },
7073 .block_erase = spi_block_erase_60,
7074 }, {
7075 .eraseblocks = { {2 * 1024 * 1024, 1} },
7076 .block_erase = spi_block_erase_c7,
7077 }
7078 },
Nico Huber4da971f2024-03-27 01:18:12 +01007079 .reg_bits =
7080 {
7081 .qe = {STATUS2, 1, RW},
7082 },
Roman Titov95edc892015-04-03 21:29:04 +00007083 .printlock = spi_prettyprint_status_register_bp4_srwd,
7084 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7085 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007086 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00007087 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02007088 .prepare_access = spi_prepare_io,
7089 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00007090 },
7091
7092 {
7093 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007094 .name = "GD25LQ32",
7095 .bustype = BUS_SPI,
7096 .manufacture_id = GIGADEVICE_ID,
7097 .model_id = GIGADEVICE_GD25LQ32,
7098 .total_size = 4096,
7099 .page_size = 256,
7100 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
7102 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007103 .tested = TEST_OK_PREW,
7104 .probe = probe_spi_rdid,
7105 .probe_timing = TIMING_ZERO,
7106 .block_erasers =
7107 {
7108 {
7109 .eraseblocks = { {4 * 1024, 1024} },
7110 .block_erase = spi_block_erase_20,
7111 }, {
7112 .eraseblocks = { {32 * 1024, 128} },
7113 .block_erase = spi_block_erase_52,
7114 }, {
7115 .eraseblocks = { {64 * 1024, 64} },
7116 .block_erase = spi_block_erase_d8,
7117 }, {
7118 .eraseblocks = { {4 * 1024 * 1024, 1} },
7119 .block_erase = spi_block_erase_60,
7120 }, {
7121 .eraseblocks = { {4 * 1024 * 1024, 1} },
7122 .block_erase = spi_block_erase_c7,
7123 }
7124 },
Nico Huber4da971f2024-03-27 01:18:12 +01007125 .reg_bits =
7126 {
7127 .qe = {STATUS2, 1, RW},
7128 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007129 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007130 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7131 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007132 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00007133 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02007134 .prepare_access = spi_prepare_io,
7135 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00007136 },
7137
7138 {
7139 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007140 .name = "GD25LQ40",
7141 .bustype = BUS_SPI,
7142 .manufacture_id = GIGADEVICE_ID,
7143 .model_id = GIGADEVICE_GD25LQ40,
7144 .total_size = 512,
7145 .page_size = 256,
7146 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007147 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ40B, LQ40C */
7148 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007149 .tested = TEST_UNTESTED,
7150 .probe = probe_spi_rdid,
7151 .probe_timing = TIMING_ZERO,
7152 .block_erasers =
7153 {
7154 {
7155 .eraseblocks = { {4 * 1024, 128} },
7156 .block_erase = spi_block_erase_20,
7157 }, {
7158 .eraseblocks = { {32 * 1024, 16} },
7159 .block_erase = spi_block_erase_52,
7160 }, {
7161 .eraseblocks = { {64 * 1024, 8} },
7162 .block_erase = spi_block_erase_d8,
7163 }, {
7164 .eraseblocks = { {512 * 1024, 1} },
7165 .block_erase = spi_block_erase_60,
7166 }, {
7167 .eraseblocks = { {512 * 1024, 1} },
7168 .block_erase = spi_block_erase_c7,
7169 }
7170 },
Nico Huber4da971f2024-03-27 01:18:12 +01007171 .reg_bits =
7172 {
7173 .qe = {STATUS2, 1, RW},
7174 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007175 .printlock = spi_prettyprint_status_register_bp4_srwd,
7176 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7177 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007178 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007179 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02007180 .prepare_access = spi_prepare_io,
7181 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007182 },
7183
7184 {
7185 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00007186 .name = "GD25LQ64(B)",
7187 .bustype = BUS_SPI,
7188 .manufacture_id = GIGADEVICE_ID,
7189 .model_id = GIGADEVICE_GD25LQ64,
7190 .total_size = 8192,
7191 .page_size = 256,
7192 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007193 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
7194 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007195 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00007196 .probe = probe_spi_rdid,
7197 .probe_timing = TIMING_ZERO,
7198 .block_erasers =
7199 {
7200 {
7201 .eraseblocks = { {4 * 1024, 2048} },
7202 .block_erase = spi_block_erase_20,
7203 }, {
7204 .eraseblocks = { {32 * 1024, 256} },
7205 .block_erase = spi_block_erase_52,
7206 }, {
7207 .eraseblocks = { {64 * 1024, 128} },
7208 .block_erase = spi_block_erase_d8,
7209 }, {
7210 .eraseblocks = { {8 * 1024 * 1024, 1} },
7211 .block_erase = spi_block_erase_60,
7212 }, {
7213 .eraseblocks = { {8 * 1024 * 1024, 1} },
7214 .block_erase = spi_block_erase_c7,
7215 }
7216 },
7217 .printlock = spi_prettyprint_status_register_bp4_srwd,
7218 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7219 .write = spi_chip_write_256,
7220 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7221 .voltage = {1695, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007222 .reg_bits =
7223 {
Nico Huber4da971f2024-03-27 01:18:12 +01007224 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007225 .srp = {STATUS1, 7, RW},
7226 .srl = {STATUS2, 0, RW},
7227 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7228 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7229 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7230 .cmp = {STATUS2, 6, RW},
7231 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007232 .wp_write_cfg = spi_wp_write_cfg,
7233 .wp_read_cfg = spi_wp_read_cfg,
7234 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007235 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007236 .prepare_access = spi_prepare_io,
7237 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00007238 },
7239
7240 {
7241 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007242 .name = "GD25LQ80",
Roman Titov95edc892015-04-03 21:29:04 +00007243 .bustype = BUS_SPI,
7244 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007245 .model_id = GIGADEVICE_GD25LQ80,
7246 .total_size = 1024,
Roman Titov95edc892015-04-03 21:29:04 +00007247 .page_size = 256,
7248 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007249 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ80B, LQ80C */
7250 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00007251 .tested = TEST_UNTESTED,
7252 .probe = probe_spi_rdid,
7253 .probe_timing = TIMING_ZERO,
7254 .block_erasers =
7255 {
7256 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007257 .eraseblocks = { {4 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00007258 .block_erase = spi_block_erase_20,
7259 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007260 .eraseblocks = { {32 * 1024, 32} },
Roman Titov95edc892015-04-03 21:29:04 +00007261 .block_erase = spi_block_erase_52,
7262 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007263 .eraseblocks = { {64 * 1024, 16} },
Roman Titov95edc892015-04-03 21:29:04 +00007264 .block_erase = spi_block_erase_d8,
7265 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007266 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00007267 .block_erase = spi_block_erase_60,
7268 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007269 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00007270 .block_erase = spi_block_erase_c7,
7271 }
7272 },
Nico Huber4da971f2024-03-27 01:18:12 +01007273 .reg_bits =
7274 {
7275 .qe = {STATUS2, 1, RW},
7276 },
Roman Titov95edc892015-04-03 21:29:04 +00007277 .printlock = spi_prettyprint_status_register_bp4_srwd,
7278 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7279 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007280 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00007281 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02007282 .prepare_access = spi_prepare_io,
7283 .finish_access = spi_finish_io,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007284 },
7285
7286 {
7287 .vendor = "GigaDevice",
Naresh Solanki768cfc42024-10-04 20:17:34 +05307288 .name = "GD25LR512ME",
7289 .bustype = BUS_SPI,
7290 .manufacture_id = GIGADEVICE_ID,
7291 .model_id = GIGADEVICE_GD25LR512ME,
7292 .total_size = 65536,
7293 .page_size = 256,
7294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
7295 .tested = TEST_OK_PREW,
7296 .probe = probe_spi_rdid,
7297 .probe_timing = TIMING_ZERO,
7298 .block_erasers =
7299 {
7300 {
7301 .eraseblocks = { {4 * 1024, 16384} },
7302 .block_erase = spi_block_erase_21,
7303 }, {
7304 .eraseblocks = { {4 * 1024, 16384} },
7305 .block_erase = spi_block_erase_20,
7306 }, {
7307 .eraseblocks = { {32 * 1024, 2048} },
7308 .block_erase = spi_block_erase_52,
7309 }, {
7310 .eraseblocks = { {32 * 1024, 2048} },
7311 .block_erase = spi_block_erase_5c,
7312 }, {
7313 .eraseblocks = { {64 * 1024, 1024} },
7314 .block_erase = spi_block_erase_dc,
7315 }, {
7316 .eraseblocks = { {64 * 1024, 1024} },
7317 .block_erase = spi_block_erase_d8,
7318 }, {
7319 .eraseblocks = { {64 * 1024 * 1024, 1} },
7320 .block_erase = spi_block_erase_60,
7321 }, {
7322 .eraseblocks = { {64 * 1024 * 1024, 1} },
7323 .block_erase = spi_block_erase_c7,
7324 }
7325 },
7326 .printlock = spi_prettyprint_status_register_bp4_srwd,
7327 .unlock = spi_disable_blockprotect_bp4_srwd,
7328 .write = spi_chip_write_256,
7329 .read = spi_chip_read,
7330 .voltage = {1650, 2000},
7331 .prepare_access = spi_prepare_io,
7332 .finish_access = spi_finish_io,
7333 },
7334
7335 {
7336 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007337 .name = "GD25Q10",
7338 .bustype = BUS_SPI,
7339 .manufacture_id = GIGADEVICE_ID,
7340 .model_id = GIGADEVICE_GD25Q10,
7341 .total_size = 128,
7342 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007343 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007344 .tested = TEST_UNTESTED,
7345 .probe = probe_spi_rdid,
7346 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10007347 .block_erasers =
7348 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007349 {
7350 .eraseblocks = { {4 * 1024, 32} },
7351 .block_erase = spi_block_erase_20,
7352 }, {
7353 .eraseblocks = { {32 * 1024, 4} },
7354 .block_erase = spi_block_erase_52,
7355 }, {
7356 .eraseblocks = { {64 * 1024, 2} },
7357 .block_erase = spi_block_erase_d8,
7358 }, {
7359 .eraseblocks = { {128 * 1024, 1} },
7360 .block_erase = spi_block_erase_60,
7361 }, {
7362 .eraseblocks = { {128 * 1024, 1} },
7363 .block_erase = spi_block_erase_c7,
7364 }
7365 },
Nico Huber4da971f2024-03-27 01:18:12 +01007366 .reg_bits =
7367 {
7368 .qe = {STATUS2, 1, RW},
7369 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007370 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007371 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7372 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007373 .read = spi_chip_read,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007374 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007375 .prepare_access = spi_prepare_io,
7376 .finish_access = spi_finish_io,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007377 },
7378
7379 {
7380 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01007381 .name = "GD25Q127C",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007382 .bustype = BUS_SPI,
7383 .manufacture_id = GIGADEVICE_ID,
7384 .model_id = GIGADEVICE_GD25Q128,
7385 .total_size = 16384,
7386 .page_size = 256,
7387 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
Nico Huber1412d9f2024-01-06 18:25:49 +01007388 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007389 .tested = TEST_OK_PREWB,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007390 .probe = probe_spi_rdid,
7391 .probe_timing = TIMING_ZERO,
7392 .block_erasers =
7393 {
7394 {
7395 .eraseblocks = { {4 * 1024, 4096} },
7396 .block_erase = spi_block_erase_20,
7397 }, {
7398 .eraseblocks = { {32 * 1024, 512} },
7399 .block_erase = spi_block_erase_52,
7400 }, {
7401 .eraseblocks = { {64 * 1024, 256} },
7402 .block_erase = spi_block_erase_d8,
7403 }, {
7404 .eraseblocks = { {16 * 1024 * 1024, 1} },
7405 .block_erase = spi_block_erase_60,
7406 }, {
7407 .eraseblocks = { {16 * 1024 * 1024, 1} },
7408 .block_erase = spi_block_erase_c7,
7409 }
7410 },
7411 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
7412 .printlock = spi_prettyprint_status_register_bp4_srwd,
7413 .unlock = spi_disable_blockprotect_bp4_srwd,
7414 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007415 .read = spi_chip_read,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007416 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007417 .reg_bits =
7418 {
Nico Huber4da971f2024-03-27 01:18:12 +01007419 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007420 .srp = {STATUS1, 7, RW},
7421 .srl = {STATUS2, 0, RW},
7422 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7423 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7424 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7425 .cmp = {STATUS2, 6, RW},
7426 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007427 .wp_write_cfg = spi_wp_write_cfg,
7428 .wp_read_cfg = spi_wp_read_cfg,
7429 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007430 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007431 .prepare_access = spi_prepare_io,
7432 .finish_access = spi_finish_io,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007433 },
7434
7435 {
7436 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01007437 .name = "GD25Q128C",
7438 .bustype = BUS_SPI,
7439 .manufacture_id = GIGADEVICE_ID,
7440 .model_id = GIGADEVICE_GD25Q128,
7441 .total_size = 16384,
7442 .page_size = 256,
7443 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
7444 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
7445 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
7446 .tested = TEST_OK_PREWB,
7447 .probe = probe_spi_rdid,
7448 .probe_timing = TIMING_ZERO,
7449 .block_erasers =
7450 {
7451 {
7452 .eraseblocks = { {4 * 1024, 4096} },
7453 .block_erase = spi_block_erase_20,
7454 }, {
7455 .eraseblocks = { {32 * 1024, 512} },
7456 .block_erase = spi_block_erase_52,
7457 }, {
7458 .eraseblocks = { {64 * 1024, 256} },
7459 .block_erase = spi_block_erase_d8,
7460 }, {
7461 .eraseblocks = { {16 * 1024 * 1024, 1} },
7462 .block_erase = spi_block_erase_60,
7463 }, {
7464 .eraseblocks = { {16 * 1024 * 1024, 1} },
7465 .block_erase = spi_block_erase_c7,
7466 }
7467 },
7468 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
7469 .printlock = spi_prettyprint_status_register_bp4_srwd,
7470 .unlock = spi_disable_blockprotect_bp4_srwd,
7471 .write = spi_chip_write_256,
7472 .read = spi_chip_read,
7473 .voltage = {2700, 3600},
7474 .reg_bits =
7475 {
7476 .qe = {STATUS2, 1, RW},
7477 .srp = {STATUS1, 7, RW},
7478 .srl = {STATUS2, 0, RW},
7479 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7480 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7481 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7482 .cmp = {STATUS2, 6, RW},
7483 },
Nico Huber2a1036b2024-10-20 23:19:49 +02007484 .wp_write_cfg = spi_wp_write_cfg,
7485 .wp_read_cfg = spi_wp_read_cfg,
7486 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huber68573af2024-01-06 18:28:22 +01007487 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007488 .prepare_access = spi_prepare_io,
7489 .finish_access = spi_finish_io,
Nico Huber68573af2024-01-06 18:28:22 +01007490 },
7491
7492 {
7493 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007494 .name = "GD25Q16(B)",
7495 .bustype = BUS_SPI,
7496 .manufacture_id = GIGADEVICE_ID,
7497 .model_id = GIGADEVICE_GD25Q16,
7498 .total_size = 2048,
7499 .page_size = 256,
7500 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007501 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007502 .tested = TEST_OK_PREW,
7503 .probe = probe_spi_rdid,
7504 .probe_timing = TIMING_ZERO,
7505 .block_erasers =
7506 {
7507 {
7508 .eraseblocks = { {4 * 1024, 512} },
7509 .block_erase = spi_block_erase_20,
7510 }, {
7511 .eraseblocks = { {32 * 1024, 64} },
7512 .block_erase = spi_block_erase_52,
7513 }, {
7514 .eraseblocks = { {64 * 1024, 32} },
7515 .block_erase = spi_block_erase_d8,
7516 }, {
7517 .eraseblocks = { {2 * 1024 * 1024, 1} },
7518 .block_erase = spi_block_erase_60,
7519 }, {
7520 .eraseblocks = { {2 * 1024 * 1024, 1} },
7521 .block_erase = spi_block_erase_c7,
7522 }
7523 },
Nico Huber4da971f2024-03-27 01:18:12 +01007524 .reg_bits =
7525 {
7526 .qe = {STATUS2, 1, RW},
7527 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007528 .printlock = spi_prettyprint_status_register_bp4_srwd,
7529 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7530 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007531 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007532 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007533 .prepare_access = spi_prepare_io,
7534 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007535 },
7536
7537 {
7538 .vendor = "GigaDevice",
7539 .name = "GD25Q20(B)",
7540 .bustype = BUS_SPI,
7541 .manufacture_id = GIGADEVICE_ID,
7542 .model_id = GIGADEVICE_GD25Q20,
7543 .total_size = 256,
7544 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007545 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007546 .tested = TEST_OK_PREW,
7547 .probe = probe_spi_rdid,
7548 .probe_timing = TIMING_ZERO,
7549 .block_erasers =
7550 {
7551 {
7552 .eraseblocks = { {4 * 1024, 64} },
7553 .block_erase = spi_block_erase_20,
7554 }, {
7555 .eraseblocks = { {32 * 1024, 8} },
7556 .block_erase = spi_block_erase_52,
7557 }, {
7558 .eraseblocks = { {64 * 1024, 4} },
7559 .block_erase = spi_block_erase_d8,
7560 }, {
7561 .eraseblocks = { {256 * 1024, 1} },
7562 .block_erase = spi_block_erase_60,
7563 }, {
7564 .eraseblocks = { {256 * 1024, 1} },
7565 .block_erase = spi_block_erase_c7,
7566 }
7567 },
Nico Huber4da971f2024-03-27 01:18:12 +01007568 .reg_bits = {
7569 .qe = {STATUS2, 1, RW},
7570 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007571 .printlock = spi_prettyprint_status_register_bp4_srwd,
7572 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7573 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007574 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007575 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007576 .prepare_access = spi_prepare_io,
7577 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007578 },
7579
7580 {
7581 .vendor = "GigaDevice",
Nikolai Artemiev3ca0af02022-06-17 15:10:18 +10007582 .name = "GD25Q256D/GD25Q256E",
Alan Green86fc9cf2019-08-26 15:02:12 +10007583 .bustype = BUS_SPI,
7584 .manufacture_id = GIGADEVICE_ID,
7585 .model_id = GIGADEVICE_GD25Q256D,
7586 .total_size = 32768,
7587 .page_size = 256,
Nikolai Artemievb931e7a2022-12-05 13:06:14 +11007588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA |
Nico Huber4da971f2024-03-27 01:18:12 +01007589 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
7590 FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007591 .tested = TEST_OK_PREWB,
Alan Green86fc9cf2019-08-26 15:02:12 +10007592 .probe = probe_spi_rdid,
7593 .probe_timing = TIMING_ZERO,
7594 .block_erasers =
7595 {
7596 {
7597 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber5374dc32019-10-04 16:16:15 +02007598 .block_erase = spi_block_erase_21,
7599 }, {
7600 .eraseblocks = { {4 * 1024, 8192} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007601 .block_erase = spi_block_erase_20,
7602 }, {
7603 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber5374dc32019-10-04 16:16:15 +02007604 .block_erase = spi_block_erase_5c,
7605 }, {
7606 .eraseblocks = { {32 * 1024, 1024} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007607 .block_erase = spi_block_erase_52,
7608 }, {
7609 .eraseblocks = { {64 * 1024, 512} },
Nico Huber5374dc32019-10-04 16:16:15 +02007610 .block_erase = spi_block_erase_dc,
7611 }, {
7612 .eraseblocks = { {64 * 1024, 512} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007613 .block_erase = spi_block_erase_d8,
7614 }, {
7615 .eraseblocks = { {32 * 1024 * 1024, 1} },
7616 .block_erase = spi_block_erase_60,
7617 }, {
7618 .eraseblocks = { {32 * 1024 * 1024, 1} },
7619 .block_erase = spi_block_erase_c7,
7620 }
7621 },
7622 .printlock = spi_prettyprint_status_register_bp3_srwd,
7623 .unlock = spi_disable_blockprotect,
7624 .write = spi_chip_write_256,
7625 .read = spi_chip_read,
7626 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007627 .reg_bits =
7628 {
Nico Huber4da971f2024-03-27 01:18:12 +01007629 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007630 .srp = {STATUS1, 7, RW},
7631 .srl = {STATUS2, 6, RW},
7632 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
7633 .tb = {STATUS1, 6, RW},
7634 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007635 .wp_write_cfg = spi_wp_write_cfg,
7636 .wp_read_cfg = spi_wp_read_cfg,
7637 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007638 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007639 .prepare_access = spi_prepare_io,
7640 .finish_access = spi_finish_io,
Alan Green86fc9cf2019-08-26 15:02:12 +10007641 },
7642
7643 {
7644 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007645 .name = "GD25Q32(B)",
7646 .bustype = BUS_SPI,
7647 .manufacture_id = GIGADEVICE_ID,
7648 .model_id = GIGADEVICE_GD25Q32,
7649 .total_size = 4096,
7650 .page_size = 256,
7651 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007652 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007653 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007654 .probe = probe_spi_rdid,
7655 .probe_timing = TIMING_ZERO,
7656 .block_erasers =
7657 {
7658 {
7659 .eraseblocks = { {4 * 1024, 1024} },
7660 .block_erase = spi_block_erase_20,
7661 }, {
7662 .eraseblocks = { {32 * 1024, 128} },
7663 .block_erase = spi_block_erase_52,
7664 }, {
7665 .eraseblocks = { {64 * 1024, 64} },
7666 .block_erase = spi_block_erase_d8,
7667 }, {
7668 .eraseblocks = { {4 * 1024 * 1024, 1} },
7669 .block_erase = spi_block_erase_60,
7670 }, {
7671 .eraseblocks = { {4 * 1024 * 1024, 1} },
7672 .block_erase = spi_block_erase_c7,
7673 }
7674 },
7675 .printlock = spi_prettyprint_status_register_bp4_srwd,
7676 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7677 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007678 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007679 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007680 .reg_bits =
7681 {
Nico Huber4da971f2024-03-27 01:18:12 +01007682 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007683 .srp = {STATUS1, 7, RW},
7684 .srl = {STATUS2, 0, RW},
7685 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7686 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7687 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7688 .cmp = {STATUS2, 6, RW},
7689 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007690 .wp_write_cfg = spi_wp_write_cfg,
7691 .wp_read_cfg = spi_wp_read_cfg,
7692 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007693 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007694 .prepare_access = spi_prepare_io,
7695 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007696 },
7697
7698 {
7699 .vendor = "GigaDevice",
7700 .name = "GD25Q40(B)",
7701 .bustype = BUS_SPI,
7702 .manufacture_id = GIGADEVICE_ID,
7703 .model_id = GIGADEVICE_GD25Q40,
7704 .total_size = 512,
7705 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007706 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Simon Buhrow551664c2022-03-09 16:09:08 +01007707 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007708 .probe = probe_spi_rdid,
7709 .probe_timing = TIMING_ZERO,
7710 .block_erasers =
7711 {
7712 {
7713 .eraseblocks = { {4 * 1024, 128} },
7714 .block_erase = spi_block_erase_20,
7715 }, {
7716 .eraseblocks = { {32 * 1024, 16} },
7717 .block_erase = spi_block_erase_52,
7718 }, {
7719 .eraseblocks = { {64 * 1024, 8} },
7720 .block_erase = spi_block_erase_d8,
7721 }, {
7722 .eraseblocks = { {512 * 1024, 1} },
7723 .block_erase = spi_block_erase_60,
7724 }, {
7725 .eraseblocks = { {512 * 1024, 1} },
7726 .block_erase = spi_block_erase_c7,
7727 }
7728 },
Nico Huber4da971f2024-03-27 01:18:12 +01007729 .reg_bits =
7730 {
7731 .qe = {STATUS2, 1, RW},
7732 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007733 .printlock = spi_prettyprint_status_register_bp4_srwd,
7734 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7735 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007736 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007737 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007738 .prepare_access = spi_prepare_io,
7739 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007740 },
7741
7742 {
7743 .vendor = "GigaDevice",
7744 .name = "GD25Q512",
7745 .bustype = BUS_SPI,
7746 .manufacture_id = GIGADEVICE_ID,
7747 .model_id = GIGADEVICE_GD25Q512,
7748 .total_size = 64,
7749 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007750 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007751 .tested = TEST_OK_PREW,
7752 .probe = probe_spi_rdid,
7753 .probe_timing = TIMING_ZERO,
7754 .block_erasers =
7755 {
7756 {
7757 .eraseblocks = { {4 * 1024, 16} },
7758 .block_erase = spi_block_erase_20,
7759 }, {
7760 .eraseblocks = { {32 * 1024, 2} },
7761 .block_erase = spi_block_erase_52,
7762 }, {
7763 .eraseblocks = { {64 * 1024, 1} },
7764 .block_erase = spi_block_erase_60,
7765 }, {
7766 .eraseblocks = { {64 * 1024, 1} },
7767 .block_erase = spi_block_erase_c7,
7768 }
7769 },
Nico Huber4da971f2024-03-27 01:18:12 +01007770 .reg_bits =
7771 {
7772 .qe = {STATUS2, 1, RW},
7773 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007774 .printlock = spi_prettyprint_status_register_bp4_srwd,
7775 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7776 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007777 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007778 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007779 .prepare_access = spi_prepare_io,
7780 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007781 },
7782
7783 {
7784 .vendor = "GigaDevice",
7785 .name = "GD25Q64(B)",
7786 .bustype = BUS_SPI,
7787 .manufacture_id = GIGADEVICE_ID,
7788 .model_id = GIGADEVICE_GD25Q64,
7789 .total_size = 8192,
7790 .page_size = 256,
7791 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007792 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007793 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007794 .probe = probe_spi_rdid,
7795 .probe_timing = TIMING_ZERO,
7796 .block_erasers =
7797 {
7798 {
7799 .eraseblocks = { {4 * 1024, 2048} },
7800 .block_erase = spi_block_erase_20,
7801 }, {
7802 .eraseblocks = { {32 * 1024, 256} },
7803 .block_erase = spi_block_erase_52,
7804 }, {
7805 .eraseblocks = { {64 * 1024, 128} },
7806 .block_erase = spi_block_erase_d8,
7807 }, {
7808 .eraseblocks = { {8 * 1024 * 1024, 1} },
7809 .block_erase = spi_block_erase_60,
7810 }, {
7811 .eraseblocks = { {8 * 1024 * 1024, 1} },
7812 .block_erase = spi_block_erase_c7,
7813 }
7814 },
7815 .printlock = spi_prettyprint_status_register_bp4_srwd,
7816 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7817 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007818 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007819 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007820 .reg_bits =
7821 {
Nico Huber4da971f2024-03-27 01:18:12 +01007822 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007823 .srp = {STATUS1, 7, RW},
7824 .srl = {STATUS2, 0, RW},
7825 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7826 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7827 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7828 .cmp = {STATUS2, 6, RW},
7829 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007830 .wp_write_cfg = spi_wp_write_cfg,
7831 .wp_read_cfg = spi_wp_read_cfg,
7832 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007833 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007834 .prepare_access = spi_prepare_io,
7835 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007836 },
7837
7838 {
7839 .vendor = "GigaDevice",
7840 .name = "GD25Q80(B)",
7841 .bustype = BUS_SPI,
7842 .manufacture_id = GIGADEVICE_ID,
7843 .model_id = GIGADEVICE_GD25Q80,
7844 .total_size = 1024,
7845 .page_size = 256,
7846 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007847 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007848 .tested = TEST_OK_PREW,
7849 .probe = probe_spi_rdid,
7850 .probe_timing = TIMING_ZERO,
7851 .block_erasers =
7852 {
7853 {
7854 .eraseblocks = { {4 * 1024, 256} },
7855 .block_erase = spi_block_erase_20,
7856 }, {
7857 .eraseblocks = { {32 * 1024, 32} },
7858 .block_erase = spi_block_erase_52,
7859 }, {
7860 .eraseblocks = { {64 * 1024, 16} },
7861 .block_erase = spi_block_erase_d8,
7862 }, {
7863 .eraseblocks = { {1024 * 1024, 1} },
7864 .block_erase = spi_block_erase_60,
7865 }, {
7866 .eraseblocks = { {1024 * 1024, 1} },
7867 .block_erase = spi_block_erase_c7,
7868 }
7869 },
Nico Huber4da971f2024-03-27 01:18:12 +01007870 .reg_bits =
7871 {
7872 .qe = {STATUS2, 1, RW},
7873 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007874 .printlock = spi_prettyprint_status_register_bp4_srwd,
7875 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7876 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007877 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007878 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007879 .prepare_access = spi_prepare_io,
7880 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007881 },
7882
7883 {
7884 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007885 .name = "GD25T80",
7886 .bustype = BUS_SPI,
7887 .manufacture_id = GIGADEVICE_ID,
7888 .model_id = GIGADEVICE_GD25T80,
7889 .total_size = 1024,
7890 .page_size = 256,
7891 /* OTP: 256B total; enter 0x3A */
7892 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7893 .tested = TEST_UNTESTED,
7894 .probe = probe_spi_rdid,
7895 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10007896 .block_erasers =
7897 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007898 {
7899 .eraseblocks = { {4 * 1024, 256} },
7900 .block_erase = spi_block_erase_20,
7901 }, {
7902 .eraseblocks = { {64 * 1024, 16} },
7903 .block_erase = spi_block_erase_52,
7904 }, {
7905 .eraseblocks = { {64 * 1024, 16} },
7906 .block_erase = spi_block_erase_d8,
7907 }, {
7908 .eraseblocks = { {1024 * 1024, 1} },
7909 .block_erase = spi_block_erase_60,
7910 }, {
7911 .eraseblocks = { {1024 * 1024, 1} },
7912 .block_erase = spi_block_erase_c7,
7913 }
7914 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00007915 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007916 .unlock = spi_disable_blockprotect,
7917 .write = spi_chip_write_256,
7918 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00007919 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007920 },
7921
7922 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007923 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007924 .name = "GD25VQ16C",
7925 .bustype = BUS_SPI,
7926 .manufacture_id = GIGADEVICE_ID,
7927 .model_id = GIGADEVICE_GD25VQ16C,
7928 .total_size = 2 * 1024,
7929 .page_size = 256,
7930 /* Supports SFDP */
7931 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007932 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007933 .tested = TEST_UNTESTED,
7934 .probe = probe_spi_rdid,
7935 .probe_timing = TIMING_ZERO,
7936 .block_erasers =
7937 {
7938 {
7939 .eraseblocks = { { 4 * 1024, 512} },
7940 .block_erase = spi_block_erase_20,
7941 }, {
7942 .eraseblocks = { { 32 * 1024, 64} },
7943 .block_erase = spi_block_erase_52,
7944 }, {
7945 .eraseblocks = { { 64 * 1024, 32} },
7946 .block_erase = spi_block_erase_d8,
7947 }, {
7948 .eraseblocks = { {2 * 1024 * 1024, 1} },
7949 .block_erase = spi_block_erase_60,
7950 }, {
7951 .eraseblocks = { {2 * 1024 * 1024, 1} },
7952 .block_erase = spi_block_erase_c7,
7953 }
7954 },
Nico Huber4da971f2024-03-27 01:18:12 +01007955 .reg_bits =
7956 {
7957 .qe = {STATUS2, 1, RW},
7958 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007959 .printlock = spi_prettyprint_status_register_bp4_srwd,
7960 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7961 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007962 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007963 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007964 .prepare_access = spi_prepare_io,
7965 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007966 },
7967
7968 {
7969 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007970 .name = "GD25VQ21B",
7971 .bustype = BUS_SPI,
7972 .manufacture_id = GIGADEVICE_ID,
7973 .model_id = GIGADEVICE_GD25VQ21B,
7974 .total_size = 256,
7975 .page_size = 256,
7976 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007977 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
7978 FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007979 .tested = TEST_UNTESTED,
7980 .probe = probe_spi_rdid,
7981 .probe_timing = TIMING_ZERO,
7982 .block_erasers =
7983 {
7984 {
7985 .eraseblocks = { { 4 * 1024, 64} },
7986 .block_erase = spi_block_erase_20,
7987 }, {
7988 .eraseblocks = { { 32 * 1024, 8} },
7989 .block_erase = spi_block_erase_52,
7990 }, {
7991 .eraseblocks = { { 64 * 1024, 4} },
7992 .block_erase = spi_block_erase_d8,
7993 }, {
7994 .eraseblocks = { {256 * 1024, 1} },
7995 .block_erase = spi_block_erase_60,
7996 }, {
7997 .eraseblocks = { {256 * 1024, 1} },
7998 .block_erase = spi_block_erase_c7,
7999 }
8000 },
Nico Huber4da971f2024-03-27 01:18:12 +01008001 .reg_bits =
8002 {
8003 .qe = {STATUS2, 1, RW},
8004 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008005 .printlock = spi_prettyprint_status_register_bp4_srwd,
8006 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
8007 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01008008 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008009 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008010 .prepare_access = spi_prepare_io,
8011 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008012 },
8013
8014 {
8015 .vendor = "GigaDevice",
8016 .name = "GD25VQ40C",
8017 .bustype = BUS_SPI,
8018 .manufacture_id = GIGADEVICE_ID,
8019 .model_id = GIGADEVICE_GD25VQ41B,
8020 .total_size = 512,
8021 .page_size = 256,
8022 /* Supports SFDP */
8023 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01008024 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008025 .tested = TEST_UNTESTED,
8026 .probe = probe_spi_rdid,
8027 .probe_timing = TIMING_ZERO,
8028 .block_erasers =
8029 {
8030 {
8031 .eraseblocks = { { 4 * 1024, 128} },
8032 .block_erase = spi_block_erase_20,
8033 }, {
8034 .eraseblocks = { { 32 * 1024, 16} },
8035 .block_erase = spi_block_erase_52,
8036 }, {
8037 .eraseblocks = { { 64 * 1024, 8} },
8038 .block_erase = spi_block_erase_d8,
8039 }, {
8040 .eraseblocks = { {512 * 1024, 1} },
8041 .block_erase = spi_block_erase_60,
8042 }, {
8043 .eraseblocks = { {512 * 1024, 1} },
8044 .block_erase = spi_block_erase_c7,
8045 }
8046 },
Nico Huber4da971f2024-03-27 01:18:12 +01008047 .reg_bits =
8048 {
8049 .qe = {STATUS2, 1, RW},
8050 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008051 .printlock = spi_prettyprint_status_register_bp4_srwd,
8052 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
8053 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01008054 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008055 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008056 .prepare_access = spi_prepare_io,
8057 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008058 },
8059
8060 {
8061 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008062 .name = "GD25VQ41B",
8063 .bustype = BUS_SPI,
8064 .manufacture_id = GIGADEVICE_ID,
8065 .model_id = GIGADEVICE_GD25VQ41B,
8066 .total_size = 512,
8067 .page_size = 256,
8068 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01008069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
8070 FEATURE_OTP | FEATURE_QIO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00008071 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008072 .probe = probe_spi_rdid,
8073 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00008074 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008075 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00008076 {
8077 .eraseblocks = { { 4 * 1024, 128} },
8078 .block_erase = spi_block_erase_20,
8079 }, {
8080 .eraseblocks = { { 32 * 1024, 16} },
8081 .block_erase = spi_block_erase_52,
8082 }, {
8083 .eraseblocks = { { 64 * 1024, 8} },
8084 .block_erase = spi_block_erase_d8,
8085 }, {
8086 .eraseblocks = { {512 * 1024, 1} },
8087 .block_erase = spi_block_erase_60,
8088 }, {
8089 .eraseblocks = { {512 * 1024, 1} },
8090 .block_erase = spi_block_erase_c7,
8091 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008092 },
Nico Huber4da971f2024-03-27 01:18:12 +01008093 .reg_bits =
8094 {
8095 .qe = {STATUS2, 1, RW},
8096 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008097 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008098 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
8099 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01008100 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008101 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008102 .prepare_access = spi_prepare_io,
8103 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008104 },
8105
8106 {
8107 .vendor = "GigaDevice",
8108 .name = "GD25VQ80C",
8109 .bustype = BUS_SPI,
8110 .manufacture_id = GIGADEVICE_ID,
8111 .model_id = GIGADEVICE_GD25VQ80C,
8112 .total_size = 1024,
8113 .page_size = 256,
8114 /* Supports SFDP */
8115 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01008116 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008117 .tested = TEST_UNTESTED,
8118 .probe = probe_spi_rdid,
8119 .probe_timing = TIMING_ZERO,
8120 .block_erasers =
8121 {
8122 {
8123 .eraseblocks = { { 4 * 1024, 256} },
8124 .block_erase = spi_block_erase_20,
8125 }, {
8126 .eraseblocks = { { 32 * 1024, 32} },
8127 .block_erase = spi_block_erase_52,
8128 }, {
8129 .eraseblocks = { { 64 * 1024, 16} },
8130 .block_erase = spi_block_erase_d8,
8131 }, {
8132 .eraseblocks = { {1024 * 1024, 1} },
8133 .block_erase = spi_block_erase_60,
8134 }, {
8135 .eraseblocks = { {1024 * 1024, 1} },
8136 .block_erase = spi_block_erase_c7,
8137 }
8138 },
Nico Huber4da971f2024-03-27 01:18:12 +01008139 .reg_bits =
8140 {
8141 .qe = {STATUS2, 1, RW},
8142 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008143 .printlock = spi_prettyprint_status_register_bp4_srwd,
8144 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
8145 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01008146 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008147 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008148 .prepare_access = spi_prepare_io,
8149 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008150 },
8151
8152 {
Dino Li3214f582020-03-25 17:39:53 +08008153 .vendor = "GigaDevice",
8154 .name = "GD25WQ80E",
8155 .bustype = BUS_SPI,
8156 .manufacture_id = GIGADEVICE_ID,
8157 .model_id = GIGADEVICE_GD25WQ80E,
8158 .total_size = 1024,
8159 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01008160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Dino Li3214f582020-03-25 17:39:53 +08008161 .tested = TEST_OK_PREW,
8162 .probe = probe_spi_rdid,
8163 .probe_timing = TIMING_ZERO,
8164 .block_erasers =
8165 {
8166 {
8167 .eraseblocks = { {4 * 1024, 256} },
8168 .block_erase = spi_block_erase_20,
8169 }, {
8170 .eraseblocks = { {32 * 1024, 32} },
8171 .block_erase = spi_block_erase_52,
8172 }, {
8173 .eraseblocks = { {64 * 1024, 16} },
8174 .block_erase = spi_block_erase_d8,
8175 }, {
8176 .eraseblocks = { {1 * 1024 * 1024, 1} },
8177 .block_erase = spi_block_erase_60,
8178 }, {
8179 .eraseblocks = { {1 * 1024 * 1024, 1} },
8180 .block_erase = spi_block_erase_c7,
8181 }
8182 },
Nico Huber4da971f2024-03-27 01:18:12 +01008183 .reg_bits =
8184 {
8185 .qe = {STATUS2, 1, RW},
8186 },
Dino Li3214f582020-03-25 17:39:53 +08008187 .printlock = spi_prettyprint_status_register_bp4_srwd,
8188 .unlock = spi_disable_blockprotect_bp4_srwd,
8189 .write = spi_chip_write_256,
8190 .read = spi_chip_read,
8191 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008192 .prepare_access = spi_prepare_io,
8193 .finish_access = spi_finish_io,
Dino Li3214f582020-03-25 17:39:53 +08008194 },
8195
8196 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008197 .vendor = "Hyundai",
8198 .name = "HY29F002B",
8199 .bustype = BUS_PARALLEL,
8200 .manufacture_id = HYUNDAI_ID,
8201 .model_id = HYUNDAI_HY29F002B,
8202 .total_size = 256,
8203 .page_size = 256 * 1024,
8204 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008205 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008206 .probe = probe_jedec,
8207 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008208 .block_erasers =
8209 {
8210 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008211 .eraseblocks = {
8212 {16 * 1024, 1},
8213 {8 * 1024, 2},
8214 {32 * 1024, 1},
8215 {64 * 1024, 3},
8216 },
8217 .block_erase = erase_sector_jedec,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008218 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008219 .eraseblocks = { {256 * 1024, 1} },
8220 .block_erase = erase_chip_block_jedec,
8221 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00008222 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008223 .write = write_jedec_1,
8224 .read = read_memmapped,
8225 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01008226 .prepare_access = prepare_memory_access,
8227 .finish_access = finish_memory_access,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00008228 },
8229
8230 {
David Borgc96a8bd2010-06-21 16:12:22 +00008231 .vendor = "Hyundai",
8232 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008233 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00008234 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008235 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00008236 .total_size = 256,
8237 .page_size = 256 * 1024,
8238 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00008239 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00008240 .probe = probe_jedec,
8241 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8242 .block_erasers =
8243 {
8244 {
8245 .eraseblocks = {
8246 {64 * 1024, 3},
8247 {32 * 1024, 1},
8248 {8 * 1024, 2},
8249 {16 * 1024, 1},
8250 },
8251 .block_erase = erase_sector_jedec,
8252 }, {
8253 .eraseblocks = { {256 * 1024, 1} },
8254 .block_erase = erase_chip_block_jedec,
8255 },
8256 },
8257 .write = write_jedec_1,
8258 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008259 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01008260 .prepare_access = prepare_memory_access,
8261 .finish_access = finish_memory_access,
David Borgc96a8bd2010-06-21 16:12:22 +00008262 },
8263
8264 {
8265 .vendor = "Hyundai",
Joshua Roysf1324e02010-09-16 00:51:51 +00008266 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008267 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00008268 .manufacture_id = HYUNDAI_ID,
8269 .model_id = HYUNDAI_HY29F040A,
8270 .total_size = 512,
8271 .page_size = 64 * 1024,
8272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8273 .tested = TEST_UNTESTED,
8274 .probe = probe_jedec,
8275 .probe_timing = TIMING_ZERO,
8276 .block_erasers =
8277 {
8278 {
8279 .eraseblocks = { {64 * 1024, 8} },
8280 .block_erase = erase_sector_jedec,
8281 }, {
8282 .eraseblocks = { {512 * 1024, 1} },
8283 .block_erase = erase_chip_block_jedec,
8284 },
8285 },
8286 .write = write_jedec_1,
8287 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008288 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008289 .prepare_access = prepare_memory_access,
8290 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00008291 },
8292
8293 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008294 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02008295 .name = "IS25LP064",
8296 .bustype = BUS_SPI,
8297 .manufacture_id = ISSI_ID_SPI,
8298 .model_id = ISSI_IS25LP064,
8299 .total_size = 8192,
8300 .page_size = 256,
8301 /* OTP: 1024B total; read 0x48; write 0x42 */
8302 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Simon Buhrow9bf829d2021-10-20 17:09:09 +02008303 .tested = TEST_OK_PREW,
Angel Pons2ef47f32018-09-30 16:47:30 +02008304 .probe = probe_spi_rdid,
8305 .probe_timing = TIMING_ZERO,
8306 .block_erasers =
8307 {
8308 {
8309 .eraseblocks = { {4 * 1024, 2048} },
8310 .block_erase = spi_block_erase_20,
8311 }, {
8312 .eraseblocks = { {4 * 1024, 2048} },
8313 .block_erase = spi_block_erase_d7,
8314 }, {
8315 .eraseblocks = { {32 * 1024, 256} },
8316 .block_erase = spi_block_erase_52,
8317 }, {
8318 .eraseblocks = { {64 * 1024, 128} },
8319 .block_erase = spi_block_erase_d8,
8320 }, {
8321 .eraseblocks = { {8 * 1024 * 1024, 1} },
8322 .block_erase = spi_block_erase_60,
8323 }, {
8324 .eraseblocks = { {8 * 1024 * 1024, 1} },
8325 .block_erase = spi_block_erase_c7,
8326 }
8327 },
8328 .unlock = spi_disable_blockprotect,
8329 .write = spi_chip_write_256,
8330 .read = spi_chip_read,
8331 .voltage = {2300, 3600},
8332 },
8333
8334 {
8335 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07008336 .name = "IS25LP128",
8337 .bustype = BUS_SPI,
8338 .manufacture_id = ISSI_ID_SPI,
8339 .model_id = ISSI_IS25LP128,
8340 .total_size = 16384,
8341 .page_size = 256,
8342 /* OTP: 1024B total; read 0x48; write 0x42 */
8343 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8344 .tested = TEST_OK_PREW,
8345 .probe = probe_spi_rdid,
8346 .probe_timing = TIMING_ZERO,
8347 .block_erasers =
8348 {
8349 {
8350 .eraseblocks = { {4 * 1024, 4096} },
8351 .block_erase = spi_block_erase_20,
8352 }, {
8353 .eraseblocks = { {4 * 1024, 4096} },
8354 .block_erase = spi_block_erase_d7,
8355 }, {
8356 .eraseblocks = { {32 * 1024, 512} },
8357 .block_erase = spi_block_erase_52,
8358 }, {
8359 .eraseblocks = { {64 * 1024, 256} },
8360 .block_erase = spi_block_erase_d8,
8361 }, {
8362 .eraseblocks = { {16 * 1024 * 1024, 1} },
8363 .block_erase = spi_block_erase_60,
8364 }, {
8365 .eraseblocks = { {16 * 1024 * 1024, 1} },
8366 .block_erase = spi_block_erase_c7,
8367 }
8368 },
8369 .unlock = spi_disable_blockprotect,
8370 .write = spi_chip_write_256,
8371 .read = spi_chip_read,
8372 .voltage = {2300, 3600},
8373 },
8374
8375 {
8376 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00008377 .name = "IS25LP256",
8378 .bustype = BUS_SPI,
8379 .manufacture_id = ISSI_ID_SPI,
8380 .model_id = ISSI_IS25LP256,
8381 .total_size = 32768,
8382 .page_size = 256,
8383 /* supports SFDP */
8384 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02008385 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8386 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00008387 .tested = TEST_OK_PREW,
8388 .probe = probe_spi_rdid,
8389 .probe_timing = TIMING_ZERO,
8390 .block_erasers =
8391 {
8392 {
8393 .eraseblocks = { {4 * 1024, 8192} },
8394 .block_erase = spi_block_erase_21,
8395 }, {
8396 .eraseblocks = { {4 * 1024, 8192} },
8397 .block_erase = spi_block_erase_20,
8398 /* could also use spi_block_erase_d7 */
8399 }, {
8400 .eraseblocks = { {32 * 1024, 1024} },
8401 .block_erase = spi_block_erase_5c,
8402 }, {
8403 .eraseblocks = { {32 * 1024, 1024} },
8404 .block_erase = spi_block_erase_52,
8405 }, {
8406 .eraseblocks = { {64 * 1024, 512} },
8407 .block_erase = spi_block_erase_dc,
8408 }, {
8409 .eraseblocks = { {64 * 1024, 512} },
8410 .block_erase = spi_block_erase_d8,
8411 }, {
8412 .eraseblocks = { {32 * 1024 * 1024, 1} },
8413 .block_erase = spi_block_erase_60,
8414 }, {
8415 .eraseblocks = { {32 * 1024 * 1024, 1} },
8416 .block_erase = spi_block_erase_c7,
8417 }
8418 },
8419 .unlock = spi_disable_blockprotect,
8420 .write = spi_chip_write_256,
8421 .read = spi_chip_read,
8422 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008423 .prepare_access = spi_prepare_io,
8424 .finish_access = spi_finish_io,
David Hendricks61818dc2018-10-28 01:02:21 +00008425 },
8426
8427 {
8428 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02008429 .name = "IS25WP032",
8430 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10008431 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02008432 .model_id = ISSI_IS25WP032,
8433 .total_size = 4096,
8434 .page_size = 256,
8435 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008436 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8437 dummy cycles; non-volatile read parameters, so disable for now */
8438 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02008439 .tested = TEST_UNTESTED,
8440 .probe = probe_spi_rdid,
8441 .probe_timing = TIMING_ZERO,
8442 .block_erasers =
8443 {
8444 {
8445 .eraseblocks = { {4 * 1024, 1024} },
8446 .block_erase = spi_block_erase_20,
8447 }, {
8448 .eraseblocks = { {4 * 1024, 1024} },
8449 .block_erase = spi_block_erase_d7,
8450 }, {
8451 .eraseblocks = { {32 * 1024, 128} },
8452 .block_erase = spi_block_erase_52,
8453 }, {
8454 .eraseblocks = { {64 * 1024, 64} },
8455 .block_erase = spi_block_erase_d8,
8456 }, {
8457 .eraseblocks = { {4 * 1024 * 1024, 1} },
8458 .block_erase = spi_block_erase_60,
8459 }, {
8460 .eraseblocks = { {4 * 1024 * 1024, 1} },
8461 .block_erase = spi_block_erase_c7,
8462 }
8463 },
8464 .unlock = spi_disable_blockprotect,
8465 .write = spi_chip_write_256,
8466 .read = spi_chip_read,
8467 .voltage = {1650, 1950},
8468 },
8469
8470 {
8471 .vendor = "ISSI",
8472 .name = "IS25WP064",
8473 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10008474 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02008475 .model_id = ISSI_IS25WP064,
8476 .total_size = 8192,
8477 .page_size = 256,
8478 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008479 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8480 dummy cycles; non-volatile read parameters, so disable for now */
8481 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02008482 .tested = TEST_OK_PREW,
8483 .probe = probe_spi_rdid,
8484 .probe_timing = TIMING_ZERO,
8485 .block_erasers =
8486 {
8487 {
8488 .eraseblocks = { {4 * 1024, 2048} },
8489 .block_erase = spi_block_erase_20,
8490 }, {
8491 .eraseblocks = { {4 * 1024, 2048} },
8492 .block_erase = spi_block_erase_d7,
8493 }, {
8494 .eraseblocks = { {32 * 1024, 256} },
8495 .block_erase = spi_block_erase_52,
8496 }, {
8497 .eraseblocks = { {64 * 1024, 128} },
8498 .block_erase = spi_block_erase_d8,
8499 }, {
8500 .eraseblocks = { {8 * 1024 * 1024, 1} },
8501 .block_erase = spi_block_erase_60,
8502 }, {
8503 .eraseblocks = { {8 * 1024 * 1024, 1} },
8504 .block_erase = spi_block_erase_c7,
8505 }
8506 },
8507 .unlock = spi_disable_blockprotect,
8508 .write = spi_chip_write_256,
8509 .read = spi_chip_read,
8510 .voltage = {1650, 1950},
8511 },
8512
8513 {
8514 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07008515 .name = "IS25WP128",
8516 .bustype = BUS_SPI,
8517 .manufacture_id = ISSI_ID_SPI,
8518 .model_id = ISSI_IS25WP128,
8519 .total_size = 16384,
8520 .page_size = 256,
8521 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008522 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8523 dummy cycles; non-volatile read parameters, so disable for now */
8524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks3083ed92017-05-02 13:25:56 -07008525 .tested = TEST_OK_PREW,
8526 .probe = probe_spi_rdid,
8527 .probe_timing = TIMING_ZERO,
8528 .block_erasers =
8529 {
8530 {
8531 .eraseblocks = { {4 * 1024, 4096} },
8532 .block_erase = spi_block_erase_20,
8533 }, {
8534 .eraseblocks = { {4 * 1024, 4096} },
8535 .block_erase = spi_block_erase_d7,
8536 }, {
8537 .eraseblocks = { {32 * 1024, 512} },
8538 .block_erase = spi_block_erase_52,
8539 }, {
8540 .eraseblocks = { {64 * 1024, 256} },
8541 .block_erase = spi_block_erase_d8,
8542 }, {
8543 .eraseblocks = { {16 * 1024 * 1024, 1} },
8544 .block_erase = spi_block_erase_60,
8545 }, {
8546 .eraseblocks = { {16 * 1024 * 1024, 1} },
8547 .block_erase = spi_block_erase_c7,
8548 }
8549 },
8550 .unlock = spi_disable_blockprotect,
8551 .write = spi_chip_write_256,
8552 .read = spi_chip_read,
8553 .voltage = {1650, 1950},
8554 },
8555
8556 {
8557 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00008558 .name = "IS25WP256",
8559 .bustype = BUS_SPI,
8560 .manufacture_id = ISSI_ID_SPI,
8561 .model_id = ISSI_IS25WP256,
8562 .total_size = 32768,
8563 .page_size = 256,
8564 /* supports SFDP */
8565 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02008566 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8567 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00008568 .tested = TEST_OK_PREW,
8569 .probe = probe_spi_rdid,
8570 .probe_timing = TIMING_ZERO,
8571 .block_erasers =
8572 {
8573 {
8574 .eraseblocks = { {4 * 1024, 8192} },
8575 .block_erase = spi_block_erase_21,
8576 }, {
8577 .eraseblocks = { {4 * 1024, 8192} },
8578 .block_erase = spi_block_erase_20,
8579 /* could also use spi_block_erase_d7 */
8580 }, {
8581 .eraseblocks = { {32 * 1024, 1024} },
8582 .block_erase = spi_block_erase_5c,
8583 }, {
8584 .eraseblocks = { {32 * 1024, 1024} },
8585 .block_erase = spi_block_erase_52,
8586 }, {
8587 .eraseblocks = { {64 * 1024, 512} },
8588 .block_erase = spi_block_erase_dc,
8589 }, {
8590 .eraseblocks = { {64 * 1024, 512} },
8591 .block_erase = spi_block_erase_d8,
8592 }, {
8593 .eraseblocks = { {32 * 1024 * 1024, 1} },
8594 .block_erase = spi_block_erase_60,
8595 }, {
8596 .eraseblocks = { {32 * 1024 * 1024, 1} },
8597 .block_erase = spi_block_erase_c7,
8598 }
8599 },
8600 .unlock = spi_disable_blockprotect,
8601 .write = spi_chip_write_256,
8602 .read = spi_chip_read,
8603 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02008604 .prepare_access = spi_prepare_io,
8605 .finish_access = spi_finish_io,
David Hendricks61818dc2018-10-28 01:02:21 +00008606 },
8607
8608 {
8609 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008610 .name = "IS29GL064B",
8611 .bustype = BUS_PARALLEL,
8612 .manufacture_id = ISSI_ID,
8613 .model_id = ISSI_PMC_IS29GL064B,
8614 .total_size = 8192,
8615 .page_size = 128 * 1024, /* actual page size is 16 */
8616 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8617 .tested = TEST_UNTESTED,
8618 .probe = probe_jedec_29gl,
8619 .probe_timing = TIMING_ZERO,
8620 .block_erasers =
8621 {
8622 {
8623 .eraseblocks = {
8624 {8 * 1024, 8},
8625 {64 * 1024, 127},
8626 },
8627 .block_erase = erase_sector_jedec,
8628 }, {
8629 .eraseblocks = { {8 * 1024 * 1024, 1} },
8630 .block_erase = erase_chip_block_jedec,
8631 },
8632 },
8633 .write = write_jedec_1,
8634 .read = read_memmapped,
8635 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008636 .prepare_access = prepare_memory_access,
8637 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008638 },
8639
8640 {
8641 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008642 .name = "IS29GL064H/L",
8643 .bustype = BUS_PARALLEL,
8644 .manufacture_id = ISSI_ID,
8645 .model_id = ISSI_PMC_IS29GL064HL,
8646 .total_size = 8192,
8647 .page_size = 128 * 1024, /* actual page size is 16 */
8648 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8649 .tested = TEST_UNTESTED,
8650 .probe = probe_jedec_29gl,
8651 .probe_timing = TIMING_ZERO,
8652 .block_erasers =
8653 {
8654 {
8655 .eraseblocks = { {64 * 1024, 128} },
8656 .block_erase = erase_sector_jedec,
8657 }, {
8658 .eraseblocks = { {8 * 1024 * 1024, 1} },
8659 .block_erase = erase_chip_block_jedec,
8660 },
8661 },
8662 .write = write_jedec_1,
8663 .read = read_memmapped,
8664 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008665 .prepare_access = prepare_memory_access,
8666 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008667 },
8668
8669 {
8670 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008671 .name = "IS29GL064T",
8672 .bustype = BUS_PARALLEL,
8673 .manufacture_id = ISSI_ID,
8674 .model_id = ISSI_PMC_IS29GL064T,
8675 .total_size = 8192,
8676 .page_size = 128 * 1024, /* actual page size is 16 */
8677 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8678 .tested = TEST_UNTESTED,
8679 .probe = probe_jedec_29gl,
8680 .probe_timing = TIMING_ZERO,
8681 .block_erasers =
8682 {
8683 {
8684 .eraseblocks = {
8685 {64 * 1024, 127},
8686 {8 * 1024, 8},
8687 },
8688 .block_erase = erase_sector_jedec,
8689 }, {
8690 .eraseblocks = { {8 * 1024 * 1024, 1} },
8691 .block_erase = erase_chip_block_jedec,
8692 },
8693 },
8694 .write = write_jedec_1,
8695 .read = read_memmapped,
8696 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008697 .prepare_access = prepare_memory_access,
8698 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008699 },
8700
8701 {
8702 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008703 .name = "IS29GL128H/L",
8704 .bustype = BUS_PARALLEL,
8705 .manufacture_id = ISSI_ID,
8706 .model_id = ISSI_PMC_IS29GL128HL,
8707 .total_size = 16384,
8708 .page_size = 128 * 1024, /* actual page size is 16 */
8709 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8710 .tested = TEST_UNTESTED,
8711 .probe = probe_jedec_29gl,
8712 .probe_timing = TIMING_ZERO,
8713 .block_erasers =
8714 {
8715 {
8716 .eraseblocks = { {128 * 1024, 128} },
8717 .block_erase = erase_sector_jedec,
8718 }, {
8719 .eraseblocks = { {16 * 1024 * 1024, 1} },
8720 .block_erase = erase_chip_block_jedec,
8721 },
8722 },
8723 .write = write_jedec_1,
8724 .read = read_memmapped,
8725 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008726 .prepare_access = prepare_memory_access,
8727 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008728 },
8729
8730 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008731 .vendor = "Intel",
8732 .name = "25F160S33B8",
8733 .bustype = BUS_SPI,
8734 .manufacture_id = INTEL_ID,
8735 .model_id = INTEL_25F160S33B8,
8736 .total_size = 2048,
8737 .page_size = 256,
8738 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8739 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8740 .tested = TEST_UNTESTED,
8741 .probe = probe_spi_rdid,
8742 .probe_timing = TIMING_ZERO,
8743 .block_erasers =
8744 {
8745 {
8746 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8747 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8748 * have no effect on the memory contents, but sets a flag in the SR.
8749 .eraseblocks = {
8750 {8 * 1024, 8},
8751 {64 * 1024, 31} // inaccessible
8752 },
8753 .block_erase = spi_block_erase_40,
8754 }, { */
8755 .eraseblocks = { {64 * 1024, 32} },
8756 .block_erase = spi_block_erase_d8,
8757 }, {
8758 .eraseblocks = { {2 * 1024 * 1024, 1} },
8759 .block_erase = spi_block_erase_c7,
8760 }
8761 },
8762 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8763 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8764 .write = spi_chip_write_256,
8765 .read = spi_chip_read, /* also fast read 0x0B */
8766 .voltage = {2700, 3600},
8767 },
8768
8769 {
8770 .vendor = "Intel",
8771 .name = "25F160S33T8",
8772 .bustype = BUS_SPI,
8773 .manufacture_id = INTEL_ID,
8774 .model_id = INTEL_25F160S33T8,
8775 .total_size = 2048,
8776 .page_size = 256,
8777 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8778 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8779 .tested = TEST_UNTESTED,
8780 .probe = probe_spi_rdid,
8781 .probe_timing = TIMING_ZERO,
8782 .block_erasers =
8783 {
8784 {
8785 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8786 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8787 * have no effect on the memory contents, but sets a flag in the SR.
8788 .eraseblocks = {
8789 {64 * 1024, 31}, // inaccessible
8790 {8 * 1024, 8}
8791 },
8792 .block_erase = spi_block_erase_40,
8793 }, { */
8794 .eraseblocks = { {64 * 1024, 32} },
8795 .block_erase = spi_block_erase_d8,
8796 }, {
8797 .eraseblocks = { {2 * 1024 * 1024, 1} },
8798 .block_erase = spi_block_erase_c7,
8799 }
8800 },
8801 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8802 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8803 .write = spi_chip_write_256,
8804 .read = spi_chip_read, /* also fast read 0x0B */
8805 .voltage = {2700, 3600},
8806 },
8807
8808 {
8809 .vendor = "Intel",
8810 .name = "25F320S33B8",
8811 .bustype = BUS_SPI,
8812 .manufacture_id = INTEL_ID,
8813 .model_id = INTEL_25F320S33B8,
8814 .total_size = 4096,
8815 .page_size = 256,
8816 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8817 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8818 .tested = TEST_UNTESTED,
8819 .probe = probe_spi_rdid,
8820 .probe_timing = TIMING_ZERO,
8821 .block_erasers =
8822 {
8823 {
8824 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8825 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8826 * have no effect on the memory contents, but sets a flag in the SR.
8827 .eraseblocks = {
8828 {8 * 1024, 8},
8829 {64 * 1024, 63} // inaccessible
8830 },
8831 .block_erase = spi_block_erase_40,
8832 }, { */
8833 .eraseblocks = { {64 * 1024, 64} },
8834 .block_erase = spi_block_erase_d8,
8835 }, {
8836 .eraseblocks = { {4 * 1024 * 1024, 1} },
8837 .block_erase = spi_block_erase_c7,
8838 }
8839 },
8840 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8841 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8842 .write = spi_chip_write_256,
8843 .read = spi_chip_read, /* also fast read 0x0B */
8844 .voltage = {2700, 3600},
8845 },
8846
8847 {
8848 .vendor = "Intel",
8849 .name = "25F320S33T8",
8850 .bustype = BUS_SPI,
8851 .manufacture_id = INTEL_ID,
8852 .model_id = INTEL_25F320S33T8,
8853 .total_size = 4096,
8854 .page_size = 256,
8855 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8856 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8857 .tested = TEST_UNTESTED,
8858 .probe = probe_spi_rdid,
8859 .probe_timing = TIMING_ZERO,
8860 .block_erasers =
8861 {
8862 {
8863 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8864 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8865 * have no effect on the memory contents, but sets a flag in the SR.
8866 .eraseblocks = {
8867 {64 * 1024, 63}, // inaccessible
8868 {8 * 1024, 8}
8869 },
8870 .block_erase = spi_block_erase_40,
8871 }, { */
8872 .eraseblocks = { {64 * 1024, 64} },
8873 .block_erase = spi_block_erase_d8,
8874 }, {
8875 .eraseblocks = { {4 * 1024 * 1024, 1} },
8876 .block_erase = spi_block_erase_c7,
8877 }
8878 },
8879 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8880 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8881 .write = spi_chip_write_256,
8882 .read = spi_chip_read, /* also fast read 0x0B */
8883 .voltage = {2700, 3600},
8884 },
8885
8886 {
8887 .vendor = "Intel",
8888 .name = "25F640S33B8",
8889 .bustype = BUS_SPI,
8890 .manufacture_id = INTEL_ID,
8891 .model_id = INTEL_25F640S33B8,
8892 .total_size = 8192,
8893 .page_size = 256,
8894 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8895 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02008896 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008897 .probe = probe_spi_rdid,
8898 .probe_timing = TIMING_ZERO,
8899 .block_erasers =
8900 {
8901 {
8902 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8903 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8904 * have no effect on the memory contents, but sets a flag in the SR.
8905 .eraseblocks = {
8906 {8 * 1024, 8},
8907 {64 * 1024, 127} // inaccessible
8908 },
8909 .block_erase = spi_block_erase_40,
8910 }, { */
8911 .eraseblocks = { {64 * 1024, 128} },
8912 .block_erase = spi_block_erase_d8,
8913 }, {
8914 .eraseblocks = { {8 * 1024 * 1024, 1} },
8915 .block_erase = spi_block_erase_c7,
8916 }
8917 },
8918 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8919 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8920 .write = spi_chip_write_256,
8921 .read = spi_chip_read, /* also fast read 0x0B */
8922 .voltage = {2700, 3600},
8923 },
8924
8925 {
8926 .vendor = "Intel",
8927 .name = "25F640S33T8",
8928 .bustype = BUS_SPI,
8929 .manufacture_id = INTEL_ID,
8930 .model_id = INTEL_25F640S33T8,
8931 .total_size = 8192,
8932 .page_size = 256,
8933 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8934 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8935 .tested = TEST_UNTESTED,
8936 .probe = probe_spi_rdid,
8937 .probe_timing = TIMING_ZERO,
8938 .block_erasers =
8939 {
8940 {
8941 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8942 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8943 * have no effect on the memory contents, but sets a flag in the SR.
8944 .eraseblocks = {
8945 {64 * 1024, 127}, // inaccessible
8946 {8 * 1024, 8}
8947 },
8948 .block_erase = spi_block_erase_40,
8949 }, { */
8950 .eraseblocks = { {64 * 1024, 128} },
8951 .block_erase = spi_block_erase_d8,
8952 }, {
8953 .eraseblocks = { {8 * 1024 * 1024, 1} },
8954 .block_erase = spi_block_erase_c7,
8955 }
8956 },
8957 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8958 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8959 .write = spi_chip_write_256,
8960 .read = spi_chip_read, /* also fast read 0x0B */
8961 .voltage = {2700, 3600},
8962 },
8963
8964 {
8965 .vendor = "Intel",
8966 .name = "28F001BN/BX-B",
8967 .bustype = BUS_PARALLEL,
8968 .manufacture_id = INTEL_ID,
8969 .model_id = INTEL_28F001B,
8970 .total_size = 128,
8971 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8972 .tested = TEST_UNTESTED,
8973 .probe = probe_jedec,
8974 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8975 .block_erasers =
8976 {
8977 {
8978 .eraseblocks = {
8979 {8 * 1024, 1},
8980 {4 * 1024, 2},
8981 {112 * 1024, 1},
8982 },
8983 .block_erase = erase_block_82802ab,
8984 },
8985 },
8986 .write = write_82802ab,
8987 .read = read_memmapped,
8988 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008989 .prepare_access = prepare_memory_access,
8990 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008991 },
8992
8993 {
8994 .vendor = "Intel",
8995 .name = "28F001BN/BX-T",
8996 .bustype = BUS_PARALLEL,
8997 .manufacture_id = INTEL_ID,
8998 .model_id = INTEL_28F001T,
8999 .total_size = 128,
9000 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
9001 .tested = TEST_OK_PREW,
9002 .probe = probe_jedec,
9003 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9004 .block_erasers =
9005 {
9006 {
9007 .eraseblocks = {
9008 {112 * 1024, 1},
9009 {4 * 1024, 2},
9010 {8 * 1024, 1},
9011 },
9012 .block_erase = erase_block_82802ab,
9013 },
9014 },
9015 .write = write_82802ab,
9016 .read = read_memmapped,
9017 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01009018 .prepare_access = prepare_memory_access,
9019 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009020 },
9021
9022 {
9023 .vendor = "Intel",
9024 .name = "28F002BC/BL/BV/BX-T",
9025 .bustype = BUS_PARALLEL,
9026 .manufacture_id = INTEL_ID,
9027 .model_id = INTEL_28F002T,
9028 .total_size = 256,
9029 .page_size = 256 * 1024,
9030 .tested = TEST_OK_PRE,
9031 .probe = probe_82802ab,
9032 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9033 .block_erasers =
9034 {
9035 {
9036 .eraseblocks = {
9037 {128 * 1024, 1},
9038 {96 * 1024, 1},
9039 {8 * 1024, 2},
9040 {16 * 1024, 1},
9041 },
9042 .block_erase = erase_block_82802ab,
9043 },
9044 },
9045 .write = write_82802ab,
9046 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009047 .prepare_access = prepare_memory_access,
9048 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009049 },
9050
9051 {
9052 .vendor = "Intel",
9053 .name = "28F004B5/BE/BV/BX-B",
9054 .bustype = BUS_PARALLEL,
9055 .manufacture_id = INTEL_ID,
9056 .model_id = INTEL_28F004B,
9057 .total_size = 512,
9058 .page_size = 128 * 1024, /* maximal block size */
9059 .tested = TEST_UNTESTED,
9060 .probe = probe_82802ab,
9061 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9062 .block_erasers =
9063 {
9064 {
9065 .eraseblocks = {
9066 {16 * 1024, 1},
9067 {8 * 1024, 2},
9068 {96 * 1024, 1},
9069 {128 * 1024, 3},
9070 },
9071 .block_erase = erase_block_82802ab,
9072 },
9073 },
9074 .write = write_82802ab,
9075 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009076 .prepare_access = prepare_memory_access,
9077 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009078 },
9079
9080 {
9081 .vendor = "Intel",
9082 .name = "28F004B5/BE/BV/BX-T",
9083 .bustype = BUS_PARALLEL,
9084 .manufacture_id = INTEL_ID,
9085 .model_id = INTEL_28F004T,
9086 .total_size = 512,
9087 .page_size = 128 * 1024, /* maximal block size */
9088 .tested = TEST_UNTESTED,
9089 .probe = probe_82802ab,
9090 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9091 .block_erasers =
9092 {
9093 {
9094 .eraseblocks = {
9095 {128 * 1024, 3},
9096 {96 * 1024, 1},
9097 {8 * 1024, 2},
9098 {16 * 1024, 1},
9099 },
9100 .block_erase = erase_block_82802ab,
9101 },
9102 },
9103 .write = write_82802ab,
9104 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009105 .prepare_access = prepare_memory_access,
9106 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009107 },
9108
9109 {
9110 .vendor = "Intel",
9111 .name = "28F008S3/S5/SC",
9112 .bustype = BUS_PARALLEL,
9113 .manufacture_id = INTEL_ID,
9114 .model_id = INTEL_28F004S3,
9115 .total_size = 512,
9116 .page_size = 256,
9117 .tested = TEST_UNTESTED,
9118 .probe = probe_82802ab,
9119 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9120 .block_erasers =
9121 {
9122 {
9123 .eraseblocks = { {64 * 1024, 8} },
9124 .block_erase = erase_block_82802ab,
9125 },
9126 },
9127 .unlock = unlock_28f004s5,
9128 .write = write_82802ab,
9129 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009130 .prepare_access = prepare_memory_access,
9131 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009132 },
9133
9134 {
9135 .vendor = "Intel",
9136 .name = "28F400BV/BX/CE/CV-B",
9137 .bustype = BUS_PARALLEL,
9138 .manufacture_id = INTEL_ID,
9139 .model_id = INTEL_28F400B,
9140 .total_size = 512,
9141 .page_size = 128 * 1024, /* maximal block size */
9142 .feature_bits = FEATURE_ADDR_SHIFTED,
9143 .tested = TEST_UNTESTED,
9144 .probe = probe_82802ab,
9145 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9146 .block_erasers =
9147 {
9148 {
9149 .eraseblocks = {
9150 {16 * 1024, 1},
9151 {8 * 1024, 2},
9152 {96 * 1024, 1},
9153 {128 * 1024, 3},
9154 },
9155 .block_erase = erase_block_82802ab,
9156 },
9157 },
9158 .write = write_82802ab,
9159 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009160 .prepare_access = prepare_memory_access,
9161 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009162 },
9163
9164 {
9165 .vendor = "Intel",
9166 .name = "28F400BV/BX/CE/CV-T",
9167 .bustype = BUS_PARALLEL,
9168 .manufacture_id = INTEL_ID,
9169 .model_id = INTEL_28F400T,
9170 .total_size = 512,
9171 .page_size = 128 * 1024, /* maximal block size */
9172 .feature_bits = FEATURE_ADDR_SHIFTED,
9173 .tested = TEST_UNTESTED,
9174 .probe = probe_82802ab,
9175 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9176 .block_erasers =
9177 {
9178 {
9179 .eraseblocks = {
9180 {128 * 1024, 3},
9181 {96 * 1024, 1},
9182 {8 * 1024, 2},
9183 {16 * 1024, 1},
9184 },
9185 .block_erase = erase_block_82802ab,
9186 },
9187 },
9188 .write = write_82802ab,
9189 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01009190 .prepare_access = prepare_memory_access,
9191 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009192 },
9193
9194 {
9195 .vendor = "Intel",
9196 .name = "82802AB",
9197 .bustype = BUS_FWH,
9198 .manufacture_id = INTEL_ID,
9199 .model_id = INTEL_82802AB,
9200 .total_size = 512,
9201 .page_size = 64 * 1024,
Alan Green88552572019-07-24 13:56:06 +10009202 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009203 .probe = probe_82802ab,
9204 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
9205 .block_erasers =
9206 {
9207 {
9208 .eraseblocks = { {64 * 1024, 8} },
9209 .block_erase = erase_block_82802ab,
9210 },
9211 },
9212 .unlock = unlock_regspace2_uniform_64k,
9213 .write = write_82802ab,
9214 .read = read_memmapped,
9215 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01009216 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01009217 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009218 },
9219
9220 {
9221 .vendor = "Intel",
9222 .name = "82802AC",
9223 .bustype = BUS_FWH,
9224 .manufacture_id = INTEL_ID,
9225 .model_id = INTEL_82802AC,
9226 .total_size = 1024,
9227 .page_size = 64 * 1024,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009228 .tested = TEST_OK_PR,
9229 .probe = probe_82802ab,
9230 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
9231 .block_erasers =
9232 {
9233 {
9234 .eraseblocks = { {64 * 1024, 16} },
9235 .block_erase = erase_block_82802ab,
9236 },
9237 },
9238 .unlock = unlock_regspace2_uniform_64k,
9239 .write = write_82802ab,
9240 .read = read_memmapped,
9241 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01009242 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01009243 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009244 },
9245
9246 {
9247 .vendor = "Macronix",
9248 .name = "MX23L12854",
9249 .bustype = BUS_SPI,
9250 .manufacture_id = MACRONIX_ID,
9251 .model_id = MACRONIX_MX23L12854,
9252 .total_size = 16384,
9253 .page_size = 256,
9254 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
9255 .probe = probe_spi_rdid,
9256 .probe_timing = TIMING_ZERO,
9257 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
9258 .read = spi_chip_read, /* Fast read (0x0B) supported */
9259 .voltage = {3000, 3600},
9260 },
9261
9262 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009263 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00009264 .name = "MX23L1654",
9265 .bustype = BUS_SPI,
9266 .manufacture_id = MACRONIX_ID,
9267 .model_id = MACRONIX_MX23L1654,
9268 .total_size = 2048,
9269 .page_size = 256,
9270 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
9271 .probe = probe_spi_rdid,
9272 .probe_timing = TIMING_ZERO,
9273 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
9274 .read = spi_chip_read, /* Fast read (0x0B) supported */
9275 .voltage = {3000, 3600},
9276 },
9277
9278 {
9279 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00009280 .name = "MX23L3254",
9281 .bustype = BUS_SPI,
9282 .manufacture_id = MACRONIX_ID,
9283 .model_id = MACRONIX_MX23L3254,
9284 .total_size = 4096,
9285 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00009286 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00009287 .probe = probe_spi_rdid,
9288 .probe_timing = TIMING_ZERO,
9289 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
9290 .read = spi_chip_read, /* Fast read (0x0B) supported */
9291 .voltage = {3000, 3600},
9292 },
9293
9294 {
9295 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00009296 .name = "MX23L6454",
9297 .bustype = BUS_SPI,
9298 .manufacture_id = MACRONIX_ID,
9299 .model_id = MACRONIX_MX23L6454,
9300 .total_size = 8192,
9301 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009302 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00009303 .probe = probe_spi_rdid,
9304 .probe_timing = TIMING_ZERO,
9305 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
9306 .read = spi_chip_read, /* Fast read (0x0B) supported */
9307 .voltage = {3000, 3600},
9308 },
9309
9310 {
9311 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00009312 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009313 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009314 .manufacture_id = MACRONIX_ID,
9315 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009316 .total_size = 128,
9317 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00009318 /* MX25L1006E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01009319 /* FEATURE_FAST_READ_DOUT: MX25L1006E */
9320 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00009321 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009322 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009323 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00009324 .block_erasers =
9325 {
9326 {
9327 .eraseblocks = { {4 * 1024, 32} },
9328 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009329 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00009330 .eraseblocks = { {64 * 1024, 2} },
9331 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009332 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00009333 .eraseblocks = { {128 * 1024, 1} },
9334 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009335 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00009336 .eraseblocks = { {128 * 1024, 1} },
9337 .block_erase = spi_block_erase_c7,
9338 },
9339 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009340 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009341 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009342 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009343 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009344 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009345 .prepare_access = spi_prepare_io,
9346 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009347 },
9348
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009349 {
9350 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009351 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009352 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009353 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009354 .model_id = MACRONIX_MX25L12805D,
9355 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009356 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009357 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009359 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009360 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009361 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009362 .block_erasers =
9363 {
9364 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009365 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009366 .block_erase = spi_block_erase_20,
9367 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009368 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009369 .block_erase = spi_block_erase_d8,
9370 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009371 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009372 .block_erase = spi_block_erase_60,
9373 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009374 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009375 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009376 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009377 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009378 .printlock = spi_prettyprint_status_register_bp3_srwd,
9379 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009380 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009381 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009382 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009383 },
9384
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009385 {
9386 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08009387 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009388 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009389 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009390 .model_id = MACRONIX_MX25L12805D,
9391 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009392 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08009393 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009394 /* *F versions: FEATURE_QPI_35 + DC bits (6, 4, 8, 10) in configuration register */
9395 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9396 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stefan Tauner8179be52011-06-04 13:13:34 +00009397 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009398 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009399 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009400 .block_erasers =
9401 {
9402 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009403 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009404 .block_erase = spi_block_erase_20,
9405 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009406 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009407 .block_erase = spi_block_erase_52,
9408 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009409 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009410 .block_erase = spi_block_erase_d8,
9411 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009412 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009413 .block_erase = spi_block_erase_60,
9414 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009415 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009416 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009417 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009418 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009419 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01009420 .reg_bits =
9421 {
9422 .qe = {STATUS1, 6, RW},
9423 },
9424 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009425 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009426 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009427 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009428 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009429 .prepare_access = spi_prepare_io,
9430 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009431 },
9432
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009433 {
9434 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009435 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009436 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009437 .manufacture_id = MACRONIX_ID,
9438 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009439 .total_size = 2048,
9440 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009441 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00009442 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009443 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009444 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009445 .block_erasers =
9446 {
9447 {
Stefan Tauner226037d2013-03-16 01:22:12 +00009448 .eraseblocks = { {64 * 1024, 32} },
9449 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009450 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00009451 .eraseblocks = { {64 * 1024, 32} },
9452 .block_erase = spi_block_erase_d8,
9453 }, {
9454 .eraseblocks = { {2 * 1024 * 1024, 1} },
9455 .block_erase = spi_block_erase_60,
9456 }, {
9457 .eraseblocks = { {2 * 1024 * 1024, 1} },
9458 .block_erase = spi_block_erase_c7,
9459 },
9460 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009461 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00009462 .unlock = spi_disable_blockprotect,
9463 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009464 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009465 .voltage = {2700, 3600},
9466 },
9467
9468 {
9469 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009470 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009471 .bustype = BUS_SPI,
9472 .manufacture_id = MACRONIX_ID,
9473 .model_id = MACRONIX_MX25L1605,
9474 .total_size = 2048,
9475 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009476 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Nico Huber46552c82024-03-27 01:18:12 +01009477 /* FEATURE_FAST_READ_DOUT: MX25L1606E & MX25L1608E */
9478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +00009479 .tested = TEST_OK_PREW,
9480 .probe = probe_spi_rdid,
9481 .probe_timing = TIMING_ZERO,
9482 .block_erasers =
9483 {
9484 {
9485 .eraseblocks = { {4 * 1024, 512} },
9486 .block_erase = spi_block_erase_20,
9487 }, {
9488 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009489 .block_erase = spi_block_erase_52,
9490 }, {
9491 .eraseblocks = { {64 * 1024, 32} },
9492 .block_erase = spi_block_erase_d8,
9493 }, {
9494 .eraseblocks = { {2 * 1024 * 1024, 1} },
9495 .block_erase = spi_block_erase_60,
9496 }, {
9497 .eraseblocks = { {2 * 1024 * 1024, 1} },
9498 .block_erase = spi_block_erase_c7,
9499 },
9500 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009501 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009502 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009503 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009504 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009505 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009506 .prepare_access = spi_prepare_io,
9507 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009508 },
9509
9510 {
9511 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009512 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009513 .bustype = BUS_SPI,
9514 .manufacture_id = MACRONIX_ID,
9515 .model_id = MACRONIX_MX25L1605,
9516 .total_size = 2048,
9517 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009518 /* FEATURE_QIO: MX25L1673E */
9519 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009520 .tested = TEST_OK_PREW,
9521 .probe = probe_spi_rdid,
9522 .probe_timing = TIMING_ZERO,
9523 .block_erasers =
9524 {
9525 {
9526 .eraseblocks = { {4 * 1024, 512} },
9527 .block_erase = spi_block_erase_20,
9528 }, {
9529 .eraseblocks = { {64 * 1024, 32} },
9530 .block_erase = spi_block_erase_d8,
9531 }, {
9532 .eraseblocks = { {2 * 1024 * 1024, 1} },
9533 .block_erase = spi_block_erase_60,
9534 }, {
9535 .eraseblocks = { {2 * 1024 * 1024, 1} },
9536 .block_erase = spi_block_erase_c7,
9537 },
9538 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009539 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009540 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009541 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009542 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009543 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009544 .prepare_access = spi_prepare_io,
9545 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009546 },
9547
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009548 {
9549 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009550 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009551 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009552 .manufacture_id = MACRONIX_ID,
9553 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009554 .total_size = 2048,
9555 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009556 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009557 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9558 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Angel Ponsc2054872021-01-15 18:57:32 +01009559 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009560 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009561 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009562 .block_erasers =
9563 {
9564 {
9565 .eraseblocks = { {4 * 1024, 512} },
9566 .block_erase = spi_block_erase_20,
9567 }, {
9568 .eraseblocks = { {64 * 1024, 32} },
9569 .block_erase = spi_block_erase_d8,
9570 }, {
9571 .eraseblocks = { {2 * 1024 * 1024, 1} },
9572 .block_erase = spi_block_erase_60,
9573 }, {
9574 .eraseblocks = { {2 * 1024 * 1024, 1} },
9575 .block_erase = spi_block_erase_c7,
9576 }
9577 },
Nico Huber46552c82024-03-27 01:18:12 +01009578 .reg_bits =
9579 {
9580 .qe = {STATUS1, 6, RW},
9581 },
9582 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009583 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009584 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009585 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009586 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009587 .prepare_access = spi_prepare_io,
9588 .finish_access = spi_finish_io,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009589 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00009590
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009591 {
9592 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00009593 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009594 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009595 .manufacture_id = MACRONIX_ID,
9596 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009597 .total_size = 2048,
9598 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009599 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009600 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9601 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009602 .tested = TEST_UNTESTED,
9603 .probe = probe_spi_rdid,
9604 .probe_timing = TIMING_ZERO,
9605 .block_erasers =
9606 {
9607 {
9608 .eraseblocks = { {4 * 1024, 512} },
9609 .block_erase = spi_block_erase_20,
9610 }, {
9611 .eraseblocks = { {64 * 1024, 32} },
9612 .block_erase = spi_block_erase_d8,
9613 }, {
9614 .eraseblocks = { {2 * 1024 * 1024, 1} },
9615 .block_erase = spi_block_erase_60,
9616 }, {
9617 .eraseblocks = { {2 * 1024 * 1024, 1} },
9618 .block_erase = spi_block_erase_c7,
9619 }
9620 },
Nico Huber46552c82024-03-27 01:18:12 +01009621 .reg_bits =
9622 {
9623 .qe = {STATUS1, 6, RW},
9624 },
9625 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009626 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009627 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009628 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009629 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009630 .prepare_access = spi_prepare_io,
9631 .finish_access = spi_finish_io,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009632 },
9633
9634 {
9635 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009636 .name = "MX25L2005(C)/MX25L2006E",
9637 .bustype = BUS_SPI,
9638 .manufacture_id = MACRONIX_ID,
9639 .model_id = MACRONIX_MX25L2005,
9640 .total_size = 256,
9641 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009642 /* FEATURE_FAST_READ_DOUT: MX25L2006E */
9643 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009644 .tested = TEST_OK_PREW,
9645 .probe = probe_spi_rdid,
9646 .probe_timing = TIMING_ZERO,
9647 .block_erasers =
9648 {
9649 {
9650 .eraseblocks = { {4 * 1024, 64} },
9651 .block_erase = spi_block_erase_20,
9652 }, {
9653 .eraseblocks = { {64 * 1024, 4} },
9654 .block_erase = spi_block_erase_52,
9655 }, {
9656 .eraseblocks = { {64 * 1024, 4} },
9657 .block_erase = spi_block_erase_d8,
9658 }, {
9659 .eraseblocks = { {256 * 1024, 1} },
9660 .block_erase = spi_block_erase_60,
9661 }, {
9662 .eraseblocks = { {256 * 1024, 1} },
9663 .block_erase = spi_block_erase_c7,
9664 },
9665 },
9666 .printlock = spi_prettyprint_status_register_bp1_srwd,
9667 .unlock = spi_disable_blockprotect,
9668 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009669 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009670 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009671 .prepare_access = spi_prepare_io,
9672 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009673 },
9674
9675 {
9676 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10009677 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009678 .bustype = BUS_SPI,
9679 .manufacture_id = MACRONIX_ID,
9680 .model_id = MACRONIX_MX25L25635F,
9681 .total_size = 32768,
9682 .page_size = 256,
9683 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
9685 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
9686 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Nico Huberc972aed2024-08-30 02:06:41 +02009687 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009688 .probe = probe_spi_rdid,
9689 .probe_timing = TIMING_ZERO,
9690 .block_erasers =
9691 {
9692 {
9693 .eraseblocks = { {4 * 1024, 8192} },
9694 .block_erase = spi_block_erase_21,
9695 }, {
9696 .eraseblocks = { {4 * 1024, 8192} },
9697 .block_erase = spi_block_erase_20,
9698 }, {
9699 .eraseblocks = { {32 * 1024, 1024} },
9700 .block_erase = spi_block_erase_5c,
9701 }, {
9702 .eraseblocks = { {32 * 1024, 1024} },
9703 .block_erase = spi_block_erase_52,
9704 }, {
9705 .eraseblocks = { {64 * 1024, 512} },
9706 .block_erase = spi_block_erase_dc,
9707 }, {
9708 .eraseblocks = { {64 * 1024, 512} },
9709 .block_erase = spi_block_erase_d8,
9710 }, {
9711 .eraseblocks = { {32 * 1024 * 1024, 1} },
9712 .block_erase = spi_block_erase_60,
9713 }, {
9714 .eraseblocks = { {32 * 1024 * 1024, 1} },
9715 .block_erase = spi_block_erase_c7,
9716 }
9717 },
9718 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01009719 .reg_bits = {
9720 .qe = {STATUS1, 6, RW},
9721 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
Nico Huberc972aed2024-08-30 02:06:41 +02009722 .srp = {STATUS1, 7, RW},
9723 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
9724 .tb = {CONFIG, 3, OTP},
Nico Huber46552c82024-03-27 01:18:12 +01009725 },
Nico Huberc972aed2024-08-30 02:06:41 +02009726 .wp_write_cfg = spi_wp_write_cfg,
9727 .wp_read_cfg = spi_wp_read_cfg,
9728 .wp_get_ranges = spi_wp_get_available_ranges,
9729 .decode_range = decode_range_spi25,
Nico Huber46552c82024-03-27 01:18:12 +01009730 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009731 .unlock = spi_disable_blockprotect_bp3_srwd,
9732 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009733 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009734 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009735 .prepare_access = spi_prepare_io,
9736 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009737 },
9738
9739 {
9740 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00009741 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009742 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009743 .manufacture_id = MACRONIX_ID,
9744 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009745 .total_size = 4096,
9746 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009747 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
David Hendricks22e05322010-12-13 23:54:59 +00009748 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009749 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009750 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009751 .block_erasers =
9752 {
9753 {
Stefan Tauner226037d2013-03-16 01:22:12 +00009754 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009755 .block_erase = spi_block_erase_20,
9756 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00009757 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009758 .block_erase = spi_block_erase_d8,
9759 }, {
9760 .eraseblocks = { {4 * 1024 * 1024, 1} },
9761 .block_erase = spi_block_erase_60,
9762 }, {
9763 .eraseblocks = { {4 * 1024 * 1024, 1} },
9764 .block_erase = spi_block_erase_c7,
9765 },
9766 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009767 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009768 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009769 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009770 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009771 .voltage = {2700, 3600},
9772 },
9773
9774 {
9775 .vendor = "Macronix",
9776 .name = "MX25L3205D/MX25L3208D",
9777 .bustype = BUS_SPI,
9778 .manufacture_id = MACRONIX_ID,
9779 .model_id = MACRONIX_MX25L3205,
9780 .total_size = 4096,
9781 .page_size = 256,
9782 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009783 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009784 .tested = TEST_OK_PREW,
9785 .probe = probe_spi_rdid,
9786 .probe_timing = TIMING_ZERO,
9787 .block_erasers =
9788 {
9789 {
9790 .eraseblocks = { {4 * 1024, 1024} },
9791 .block_erase = spi_block_erase_20,
9792 }, {
9793 .eraseblocks = { {64 * 1024, 64} },
9794 .block_erase = spi_block_erase_d8,
9795 }, {
9796 .eraseblocks = { {4 * 1024 * 1024, 1} },
9797 .block_erase = spi_block_erase_60,
9798 }, {
9799 .eraseblocks = { {4 * 1024 * 1024, 1} },
9800 .block_erase = spi_block_erase_c7,
9801 },
9802 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009803 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009804 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009805 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009806 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009807 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009808 .prepare_access = spi_prepare_io,
9809 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009810 },
9811
9812 {
9813 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009814 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009815 .bustype = BUS_SPI,
9816 .manufacture_id = MACRONIX_ID,
9817 .model_id = MACRONIX_MX25L3205,
9818 .total_size = 4096,
9819 .page_size = 256,
9820 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009821 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner226037d2013-03-16 01:22:12 +00009822 .tested = TEST_OK_PREW,
9823 .probe = probe_spi_rdid,
9824 .probe_timing = TIMING_ZERO,
9825 .block_erasers =
9826 {
9827 {
9828 .eraseblocks = { {4 * 1024, 1024} },
9829 .block_erase = spi_block_erase_20,
9830 }, {
9831 .eraseblocks = { {64 * 1024, 64} },
9832 .block_erase = spi_block_erase_d8,
9833 }, {
9834 .eraseblocks = { {64 * 1024, 64} },
9835 .block_erase = spi_block_erase_52,
9836 }, {
9837 .eraseblocks = { {4 * 1024 * 1024, 1} },
9838 .block_erase = spi_block_erase_60,
9839 }, {
9840 .eraseblocks = { {4 * 1024 * 1024, 1} },
9841 .block_erase = spi_block_erase_c7,
9842 },
9843 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009844 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009845 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009846 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009847 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009848 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009849 .prepare_access = spi_prepare_io,
9850 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009851 },
9852
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009853 {
9854 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009855 .name = "MX25L3235D",
9856 .bustype = BUS_SPI,
9857 .manufacture_id = MACRONIX_ID,
9858 .model_id = MACRONIX_MX25L3235D,
9859 .total_size = 4096,
9860 .page_size = 256,
9861 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009862 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9863 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009864 .tested = TEST_UNTESTED,
9865 .probe = probe_spi_rdid,
9866 .probe_timing = TIMING_ZERO,
9867 .block_erasers =
9868 {
9869 {
9870 .eraseblocks = { {4 * 1024, 1024} },
9871 .block_erase = spi_block_erase_20,
9872 }, {
9873 .eraseblocks = { {64 * 1024, 64} },
9874 .block_erase = spi_block_erase_d8,
9875 }, {
9876 .eraseblocks = { {4 * 1024 * 1024, 1} },
9877 .block_erase = spi_block_erase_60,
9878 }, {
9879 .eraseblocks = { {4 * 1024 * 1024, 1} },
9880 .block_erase = spi_block_erase_c7,
9881 }
9882 },
Nico Huber46552c82024-03-27 01:18:12 +01009883 .reg_bits =
9884 {
9885 .qe = {STATUS1, 6, RW},
9886 },
9887 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009888 .unlock = spi_disable_blockprotect_bp3_srwd,
9889 .write = spi_chip_write_256,
9890 .read = spi_chip_read,
9891 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009892 .prepare_access = spi_prepare_io,
9893 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009894 },
9895
9896 {
9897 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02009898 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009899 .bustype = BUS_SPI,
9900 .manufacture_id = MACRONIX_ID,
9901 .model_id = MACRONIX_MX25L3205,
9902 .total_size = 4096,
9903 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02009904 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009905 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009906 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009907 .probe = probe_spi_rdid,
9908 .probe_timing = TIMING_ZERO,
9909 .block_erasers =
9910 {
9911 {
9912 .eraseblocks = { {4 * 1024, 1024} },
9913 .block_erase = spi_block_erase_20,
9914 }, {
9915 .eraseblocks = { {32 * 1024, 128} },
9916 .block_erase = spi_block_erase_52,
9917 }, {
9918 .eraseblocks = { {64 * 1024, 64} },
9919 .block_erase = spi_block_erase_d8,
9920 }, {
9921 .eraseblocks = { {4 * 1024 * 1024, 1} },
9922 .block_erase = spi_block_erase_60,
9923 }, {
9924 .eraseblocks = { {4 * 1024 * 1024, 1} },
9925 .block_erase = spi_block_erase_c7,
9926 },
9927 },
Nico Huber46552c82024-03-27 01:18:12 +01009928 .reg_bits =
9929 {
9930 .qe = {STATUS1, 6, RW},
9931 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009932 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009933 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009934 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009935 .read = spi_chip_read,
Nico Huberb6683e02021-04-21 13:04:29 +02009936 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Nico Huber930d4212024-05-04 18:59:15 +02009937 .prepare_access = spi_prepare_io,
9938 .finish_access = spi_finish_io,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009939 },
9940
9941 {
9942 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009943 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009944 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009945 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009946 .model_id = MACRONIX_MX25L4005,
9947 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009948 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009949 /* FEATURE_FAST_READ_DOUT: MX25L4006E */
9950 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009951 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009952 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009953 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009954 .block_erasers =
9955 {
9956 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009957 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00009958 .block_erase = spi_block_erase_20,
9959 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009960 .eraseblocks = { {64 * 1024, 8} },
9961 .block_erase = spi_block_erase_52,
9962 }, {
9963 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00009964 .block_erase = spi_block_erase_d8,
9965 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009966 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009967 .block_erase = spi_block_erase_60,
9968 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009969 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009970 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009971 },
Sean Nelson54596372010-01-09 05:30:14 +00009972 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009973 .printlock = spi_prettyprint_status_register_bp2_srwd,
9974 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009975 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009976 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009977 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009978 .prepare_access = spi_prepare_io,
9979 .finish_access = spi_finish_io,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009980 },
9981
9982 {
9983 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009984 .name = "MX25L512(E)/MX25V512(C)",
9985 .bustype = BUS_SPI,
9986 .manufacture_id = MACRONIX_ID,
9987 .model_id = MACRONIX_MX25L512,
9988 .total_size = 64,
9989 .page_size = 256,
9990 /* MX25L512E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01009991 /* FEATURE_FAST_READ_DOUT: MX25L512E */
9992 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009993 .tested = TEST_OK_PREW,
9994 .probe = probe_spi_rdid,
9995 .probe_timing = TIMING_ZERO,
9996 .block_erasers =
9997 {
9998 {
9999 .eraseblocks = { {4 * 1024, 16} },
10000 .block_erase = spi_block_erase_20,
10001 }, {
10002 .eraseblocks = { {64 * 1024, 1} },
10003 .block_erase = spi_block_erase_52,
10004 }, {
10005 .eraseblocks = { {64 * 1024, 1} },
10006 .block_erase = spi_block_erase_d8,
10007 }, {
10008 .eraseblocks = { {64 * 1024, 1} },
10009 .block_erase = spi_block_erase_60,
10010 }, {
10011 .eraseblocks = { {64 * 1024, 1} },
10012 .block_erase = spi_block_erase_c7,
10013 },
10014 },
10015 .printlock = spi_prettyprint_status_register_bp1_srwd,
10016 .unlock = spi_disable_blockprotect,
10017 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010018 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010019 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
10020 },
10021
10022 {
10023 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +020010024 .name = "MX25L5121E",
10025 .bustype = BUS_SPI,
10026 .manufacture_id = MACRONIX_ID,
10027 .model_id = MACRONIX_MX25L5121E,
10028 .total_size = 64,
10029 .page_size = 32,
Nico Huber46552c82024-03-27 01:18:12 +010010030 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +020010031 .tested = TEST_OK_PREW,
10032 .probe = probe_spi_rdid,
10033 .probe_timing = TIMING_ZERO,
10034 .block_erasers =
10035 {
10036 {
10037 .eraseblocks = { {4 * 1024, 16} },
10038 .block_erase = spi_block_erase_20,
10039 }, {
10040 .eraseblocks = { {64 * 1024, 1} },
10041 .block_erase = spi_block_erase_52,
10042 }, {
10043 .eraseblocks = { {64 * 1024, 1} },
10044 .block_erase = spi_block_erase_d8,
10045 }, {
10046 .eraseblocks = { {64 * 1024, 1} },
10047 .block_erase = spi_block_erase_60,
10048 }, {
10049 .eraseblocks = { {64 * 1024, 1} },
10050 .block_erase = spi_block_erase_c7,
10051 },
10052 },
10053 .printlock = spi_prettyprint_status_register_bp1_srwd,
10054 .unlock = spi_disable_blockprotect,
10055 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010056 .read = spi_chip_read,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +020010057 .voltage = {2700, 3600},
10058 },
10059
10060 {
10061 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010062 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010063 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010064 .manufacture_id = MACRONIX_ID,
10065 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010066 .total_size = 8192,
10067 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010068 /* Has an additional 512B EEPROM sector */
10069 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +000010070 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010071 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010072 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010073 .block_erasers =
10074 {
10075 {
10076 .eraseblocks = { {64 * 1024, 128} },
10077 .block_erase = spi_block_erase_20,
10078 }, {
10079 .eraseblocks = { {64 * 1024, 128} },
10080 .block_erase = spi_block_erase_d8,
10081 }, {
10082 .eraseblocks = { {8 * 1024 * 1024, 1} },
10083 .block_erase = spi_block_erase_60,
10084 }, {
10085 .eraseblocks = { {8 * 1024 * 1024, 1} },
10086 .block_erase = spi_block_erase_c7,
10087 }
10088 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010089 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010090 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010091 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010092 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010093 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010094 },
10095
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010096 {
10097 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010098 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +000010099 .bustype = BUS_SPI,
10100 .manufacture_id = MACRONIX_ID,
10101 .model_id = MACRONIX_MX25L6405,
10102 .total_size = 8192,
10103 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010104 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +010010105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +000010106 .tested = TEST_OK_PREW,
10107 .probe = probe_spi_rdid,
10108 .probe_timing = TIMING_ZERO,
10109 .block_erasers =
10110 {
10111 {
10112 .eraseblocks = { {4 * 1024, 2048} },
10113 .block_erase = spi_block_erase_20,
10114 }, {
10115 .eraseblocks = { {64 * 1024, 128} },
10116 .block_erase = spi_block_erase_d8,
10117 }, {
10118 .eraseblocks = { {8 * 1024 * 1024, 1} },
10119 .block_erase = spi_block_erase_60,
10120 }, {
10121 .eraseblocks = { {8 * 1024 * 1024, 1} },
10122 .block_erase = spi_block_erase_c7,
10123 }
10124 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010125 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010126 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +000010127 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010128 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +000010129 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010130 .prepare_access = spi_prepare_io,
10131 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +000010132 },
10133
10134 {
10135 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010136 .name = "MX25L6406E/MX25L6408E",
10137 .bustype = BUS_SPI,
10138 .manufacture_id = MACRONIX_ID,
10139 .model_id = MACRONIX_MX25L6405,
10140 .total_size = 8192,
10141 .page_size = 256,
10142 /* MX25L6406E supports SFDP */
10143 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +010010144 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010145 .tested = TEST_OK_PREW,
10146 .probe = probe_spi_rdid,
10147 .probe_timing = TIMING_ZERO,
10148 .block_erasers =
10149 {
10150 {
10151 .eraseblocks = { {4 * 1024, 2048} },
10152 .block_erase = spi_block_erase_20,
10153 }, {
10154 .eraseblocks = { {64 * 1024, 128} },
10155 .block_erase = spi_block_erase_52,
10156 }, {
10157 .eraseblocks = { {64 * 1024, 128} },
10158 .block_erase = spi_block_erase_d8,
10159 }, {
10160 .eraseblocks = { {8 * 1024 * 1024, 1} },
10161 .block_erase = spi_block_erase_60,
10162 }, {
10163 .eraseblocks = { {8 * 1024 * 1024, 1} },
10164 .block_erase = spi_block_erase_c7,
10165 }
10166 },
10167 .printlock = spi_prettyprint_status_register_bp3_srwd,
10168 .unlock = spi_disable_blockprotect_bp3_srwd,
10169 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010170 .read = spi_chip_read,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010171 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010172 .prepare_access = spi_prepare_io,
10173 .finish_access = spi_finish_io,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010174 },
10175
10176 {
10177 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +010010178 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +000010179 .bustype = BUS_SPI,
10180 .manufacture_id = MACRONIX_ID,
10181 .model_id = MACRONIX_MX25L6405,
10182 .total_size = 8192,
10183 .page_size = 256,
10184 /* supports SFDP */
10185 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +010010186 /* FEATURE_QIO: MX25L6473E, MX25L6473F */
10187 /* FEATURE_FAST_READ_DOUT, _QOUT: MX25L6436E */
10188 /* FEATURE_FAST_READ_DIO, _QIO: MX25L6445E, MX25L6465E */
10189 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +000010190 .tested = TEST_OK_PREW,
10191 .probe = probe_spi_rdid,
10192 .probe_timing = TIMING_ZERO,
10193 .block_erasers =
10194 {
10195 {
10196 .eraseblocks = { {4 * 1024, 2048} },
10197 .block_erase = spi_block_erase_20,
10198 }, {
10199 .eraseblocks = { {32 * 1024, 256} },
10200 .block_erase = spi_block_erase_52,
10201 }, {
10202 .eraseblocks = { {64 * 1024, 128} },
10203 .block_erase = spi_block_erase_d8,
10204 }, {
10205 .eraseblocks = { {8 * 1024 * 1024, 1} },
10206 .block_erase = spi_block_erase_60,
10207 }, {
10208 .eraseblocks = { {8 * 1024 * 1024, 1} },
10209 .block_erase = spi_block_erase_c7,
10210 }
10211 },
Nico Huber46552c82024-03-27 01:18:12 +010010212 .reg_bits =
10213 {
10214 .qe = {STATUS1, 6, RW},
10215 },
10216 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010217 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +000010218 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010219 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +000010220 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010221 .prepare_access = spi_prepare_io,
10222 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +000010223 },
10224
10225 {
10226 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010227 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010228 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010229 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010230 .model_id = MACRONIX_MX25L6495F,
10231 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +000010232 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010233 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +000010234 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010235 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +000010236 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010237 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010238 .block_erasers =
10239 {
10240 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010241 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +000010242 .block_erase = spi_block_erase_20,
10243 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010244 .eraseblocks = { {32 * 1024, 256} },
10245 .block_erase = spi_block_erase_52,
10246 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +053010247 .eraseblocks = { {64 * 1024, 128} },
10248 .block_erase = spi_block_erase_d8,
10249 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010250 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +000010251 .block_erase = spi_block_erase_60,
10252 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010253 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +000010254 .block_erase = spi_block_erase_c7,
10255 }
10256 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010257 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010258 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010259 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010260 .voltage = {2700, 3600},
10261 },
10262
10263 {
10264 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010265 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +000010266 .bustype = BUS_SPI,
10267 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010268 .model_id = MACRONIX_MX25L8005,
10269 .total_size = 1024,
10270 .page_size = 256,
10271 /* MX25L8006E, MX25L8008E support SFDP */
10272 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
Nico Huber46552c82024-03-27 01:18:12 +010010273 /* FEATURE_FAST_READ_DOUT: MX25L8006E, MX25L8008E */
10274 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010275 .tested = TEST_OK_PREW,
10276 .probe = probe_spi_rdid,
10277 .probe_timing = TIMING_ZERO,
10278 .block_erasers =
10279 {
10280 {
10281 .eraseblocks = { {4 * 1024, 256} },
10282 .block_erase = spi_block_erase_20,
10283 }, {
10284 .eraseblocks = { {64 * 1024, 16} },
10285 .block_erase = spi_block_erase_52,
10286 }, {
10287 .eraseblocks = { {64 * 1024, 16} },
10288 .block_erase = spi_block_erase_d8,
10289 }, {
10290 .eraseblocks = { {1024 * 1024, 1} },
10291 .block_erase = spi_block_erase_60,
10292 }, {
10293 .eraseblocks = { {1024 * 1024, 1} },
10294 .block_erase = spi_block_erase_c7,
10295 },
10296 },
10297 .printlock = spi_prettyprint_status_register_bp2_srwd,
10298 .unlock = spi_disable_blockprotect,
10299 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +010010300 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010301 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
10302 },
10303
10304 {
10305 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +090010306 .name = "MX25R3235F",
10307 .bustype = BUS_SPI,
10308 .manufacture_id = MACRONIX_ID,
10309 .model_id = MACRONIX_MX25R3235F,
10310 .total_size = 4096,
10311 .page_size = 256,
10312 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +010010313 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
sibradzicf62623c2020-03-14 17:21:34 +090010314 .tested = TEST_OK_PREW,
10315 .probe = probe_spi_rdid,
10316 .probe_timing = TIMING_ZERO,
10317 .block_erasers =
10318 {
10319 {
10320 .eraseblocks = { {4 * 1024, 1024} },
10321 .block_erase = spi_block_erase_20,
10322 }, {
sibradzicf62623c2020-03-14 17:21:34 +090010323 .eraseblocks = { {32 * 1024, 128} },
10324 .block_erase = spi_block_erase_52,
10325 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +053010326 .eraseblocks = { {64 * 1024, 64} },
10327 .block_erase = spi_block_erase_d8,
10328 }, {
sibradzicf62623c2020-03-14 17:21:34 +090010329 .eraseblocks = { {4 * 1024 * 1024, 1} },
10330 .block_erase = spi_block_erase_60,
10331 }, {
10332 .eraseblocks = { {4 * 1024 * 1024, 1} },
10333 .block_erase = spi_block_erase_c7,
10334 }
10335 },
Nico Huber5f509992024-03-27 01:18:12 +010010336 .reg_bits =
10337 {
10338 .qe = {STATUS1, 6, RW},
10339 },
10340 .printlock = spi_prettyprint_status_register_bp3_srwd,
sibradzicf62623c2020-03-14 17:21:34 +090010341 .unlock = spi_disable_blockprotect_bp3_srwd,
10342 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +010010343 .read = spi_chip_read,
sibradzicf62623c2020-03-14 17:21:34 +090010344 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010345 .prepare_access = spi_prepare_io,
10346 .finish_access = spi_finish_io,
sibradzicf62623c2020-03-14 17:21:34 +090010347 },
10348
10349 {
10350 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010351 .name = "MX25R6435F",
10352 .bustype = BUS_SPI,
10353 .manufacture_id = MACRONIX_ID,
10354 .model_id = MACRONIX_MX25R6435F,
10355 .total_size = 8192,
10356 .page_size = 256,
10357 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +010010358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010359 .tested = TEST_OK_PREW,
10360 .probe = probe_spi_rdid,
10361 .probe_timing = TIMING_ZERO,
10362 .block_erasers =
10363 {
10364 {
10365 .eraseblocks = { {4 * 1024, 2048} },
10366 .block_erase = spi_block_erase_20,
10367 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010368 .eraseblocks = { {32 * 1024, 256} },
10369 .block_erase = spi_block_erase_52,
10370 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +053010371 .eraseblocks = { {64 * 1024, 128} },
10372 .block_erase = spi_block_erase_d8,
10373 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010374 .eraseblocks = { {8 * 1024 * 1024, 1} },
10375 .block_erase = spi_block_erase_60,
10376 }, {
10377 .eraseblocks = { {8 * 1024 * 1024, 1} },
10378 .block_erase = spi_block_erase_c7,
10379 }
10380 },
Nico Huber5f509992024-03-27 01:18:12 +010010381 .reg_bits =
10382 {
10383 .qe = {STATUS1, 6, RW},
10384 },
10385 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010386 .unlock = spi_disable_blockprotect_bp3_srwd,
10387 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +010010388 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010389 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010390 .prepare_access = spi_prepare_io,
10391 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010392 },
10393
10394 {
10395 .vendor = "Macronix",
10396 .name = "MX25U12835F",
10397 .bustype = BUS_SPI,
10398 .manufacture_id = MACRONIX_ID,
10399 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010400 .total_size = 16384,
10401 .page_size = 256,
10402 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_35,
10404 .dummy_cycles =
10405 {
10406 /* 133MHz version has configuration register
10407 bit to toggle 8 dummy cycles for QIO, defaults: */
10408 .qpi_fast_read = 4,
10409 .qpi_fast_read_qio = 6,
10410 },
Stefan Tauner5c316f92015-02-08 21:57:52 +000010411 .tested = TEST_OK_PREW,
10412 .probe = probe_spi_rdid,
10413 .probe_timing = TIMING_ZERO,
10414 .block_erasers =
10415 {
10416 {
10417 .eraseblocks = { {4 * 1024, 4096} },
10418 .block_erase = spi_block_erase_20,
10419 }, {
10420 .eraseblocks = { {32 * 1024, 512} },
10421 .block_erase = spi_block_erase_52,
10422 }, {
10423 .eraseblocks = { {64 * 1024, 256} },
10424 .block_erase = spi_block_erase_d8,
10425 }, {
10426 .eraseblocks = { {16 * 1024 * 1024, 1} },
10427 .block_erase = spi_block_erase_60,
10428 }, {
10429 .eraseblocks = { {16 * 1024 * 1024, 1} },
10430 .block_erase = spi_block_erase_c7,
10431 }
10432 },
Angel Ponsf112e242018-09-30 20:14:17 +020010433 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010434 .reg_bits =
10435 {
10436 .qe = {STATUS1, 6, RW},
10437 },
10438 .printlock = spi_prettyprint_status_register_bp3_srwd,
Angel Ponsf112e242018-09-30 20:14:17 +020010439 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010440 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010441 .read = spi_chip_read,
Angel Ponsf112e242018-09-30 20:14:17 +020010442 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010443 .prepare_access = spi_prepare_io,
10444 .finish_access = spi_finish_io,
Angel Ponsf112e242018-09-30 20:14:17 +020010445 },
10446
10447 {
10448 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +000010449 .name = "MX25U1635E",
10450 .bustype = BUS_SPI,
10451 .manufacture_id = MACRONIX_ID,
10452 .model_id = MACRONIX_MX25U1635E,
10453 .total_size = 2048,
10454 .page_size = 256,
10455 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10457 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10458 .dummy_cycles =
10459 {
10460 .qpi_fast_read = 4,
10461 .qpi_fast_read_qio = 6,
10462 },
Stefan Tauner5c316f92015-02-08 21:57:52 +000010463 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +000010464 .probe = probe_spi_rdid,
10465 .probe_timing = TIMING_ZERO,
10466 .block_erasers =
10467 {
10468 {
10469 .eraseblocks = { {4 * 1024, 512} },
10470 .block_erase = spi_block_erase_20,
10471 }, {
10472 .eraseblocks = { {32 * 1024, 64} },
10473 .block_erase = spi_block_erase_52,
10474 }, {
10475 .eraseblocks = { {64 * 1024, 32} },
10476 .block_erase = spi_block_erase_d8,
10477 }, {
10478 .eraseblocks = { {2 * 1024 * 1024, 1} },
10479 .block_erase = spi_block_erase_60,
10480 }, {
10481 .eraseblocks = { {2 * 1024 * 1024, 1} },
10482 .block_erase = spi_block_erase_c7,
10483 }
10484 },
10485 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010486 .reg_bits =
10487 {
10488 .qe = {STATUS1, 6, RW},
10489 },
10490 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010491 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +000010492 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010493 .read = spi_chip_read,
Vincent Palatinf800f552013-03-15 02:03:16 +000010494 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010495 .prepare_access = spi_prepare_io,
10496 .finish_access = spi_finish_io,
Vincent Palatinf800f552013-03-15 02:03:16 +000010497 },
10498
10499 {
10500 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -070010501 .name = "MX25U25635F",
10502 .bustype = BUS_SPI,
10503 .manufacture_id = MACRONIX_ID,
10504 .model_id = MACRONIX_MX25U25635F,
10505 .total_size = 32768,
10506 .page_size = 256,
10507 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010508 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
10509 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
10510 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Nikolai Artemiev148254b2021-03-23 17:21:10 +110010511 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010512 .probe = probe_spi_rdid,
10513 .probe_timing = TIMING_ZERO,
10514 .block_erasers =
10515 {
10516 {
10517 .eraseblocks = { {4 * 1024, 8192} },
10518 .block_erase = spi_block_erase_21,
10519 }, {
10520 .eraseblocks = { {4 * 1024, 8192} },
10521 .block_erase = spi_block_erase_20,
10522 }, {
10523 .eraseblocks = { {32 * 1024, 1024} },
10524 .block_erase = spi_block_erase_5c,
10525 }, {
10526 .eraseblocks = { {32 * 1024, 1024} },
10527 .block_erase = spi_block_erase_52,
10528 }, {
10529 .eraseblocks = { {64 * 1024, 512} },
10530 .block_erase = spi_block_erase_dc,
10531 }, {
10532 .eraseblocks = { {64 * 1024, 512} },
10533 .block_erase = spi_block_erase_d8,
10534 }, {
10535 .eraseblocks = { {32 * 1024 * 1024, 1} },
10536 .block_erase = spi_block_erase_60,
10537 }, {
10538 .eraseblocks = { {32 * 1024 * 1024, 1} },
10539 .block_erase = spi_block_erase_c7,
10540 }
10541 },
10542 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +010010543 .reg_bits =
10544 {
Nico Huber4fa39c52024-03-27 01:18:12 +010010545 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +010010546 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
10547 },
Nico Huber4fa39c52024-03-27 01:18:12 +010010548 .printlock = spi_prettyprint_status_register_bp3_srwd,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010549 .unlock = spi_disable_blockprotect_bp3_srwd,
10550 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010551 .read = spi_chip_read,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010552 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010553 .prepare_access = spi_prepare_io,
10554 .finish_access = spi_finish_io,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010555 },
10556
10557 {
10558 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010559 .name = "MX25U3235E/F",
10560 .bustype = BUS_SPI,
10561 .manufacture_id = MACRONIX_ID,
10562 .model_id = MACRONIX_MX25U3235E,
10563 .total_size = 4096,
10564 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010565 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010566 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010567 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10568 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10569 .dummy_cycles =
10570 {
10571 .qpi_fast_read = 4,
10572 .qpi_fast_read_qio = 6,
10573 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010574 .tested = TEST_OK_PREW,
10575 .probe = probe_spi_rdid,
10576 .probe_timing = TIMING_ZERO,
10577 .block_erasers =
10578 {
10579 {
10580 .eraseblocks = { {4 * 1024, 1024} },
10581 .block_erase = spi_block_erase_20,
10582 }, {
10583 .eraseblocks = { {32 * 1024, 128} },
10584 .block_erase = spi_block_erase_52,
10585 }, {
10586 .eraseblocks = { {64 * 1024, 64} },
10587 .block_erase = spi_block_erase_d8,
10588 }, {
10589 .eraseblocks = { {4 * 1024 * 1024, 1} },
10590 .block_erase = spi_block_erase_60,
10591 }, {
10592 .eraseblocks = { {4 * 1024 * 1024, 1} },
10593 .block_erase = spi_block_erase_c7,
10594 }
10595 },
10596 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010597 .reg_bits =
10598 {
10599 .qe = {STATUS1, 6, RW},
10600 },
10601 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010602 .unlock = spi_disable_blockprotect_bp3_srwd,
10603 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010604 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010605 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010606 .prepare_access = spi_prepare_io,
10607 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010608 },
10609
10610 {
10611 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010612 .name = "MX25U51245G",
10613 .bustype = BUS_SPI,
10614 .manufacture_id = MACRONIX_ID,
10615 .model_id = MACRONIX_MX25U51245G,
10616 .total_size = 65536,
10617 .page_size = 256,
10618 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010619 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
10620 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
10621 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010622 .tested = TEST_OK_PREW,
10623 .probe = probe_spi_rdid,
10624 .probe_timing = TIMING_ZERO,
10625 .block_erasers =
10626 {
10627 {
10628 .eraseblocks = { {4 * 1024, 16384} },
10629 .block_erase = spi_block_erase_21,
10630 }, {
10631 .eraseblocks = { {4 * 1024, 16384} },
10632 .block_erase = spi_block_erase_20,
10633 }, {
10634 .eraseblocks = { {32 * 1024, 2048} },
10635 .block_erase = spi_block_erase_5c,
10636 }, {
10637 .eraseblocks = { {32 * 1024, 2048} },
10638 .block_erase = spi_block_erase_52,
10639 }, {
10640 .eraseblocks = { {64 * 1024, 1024} },
10641 .block_erase = spi_block_erase_dc,
10642 }, {
10643 .eraseblocks = { {64 * 1024, 1024} },
10644 .block_erase = spi_block_erase_d8,
10645 }, {
10646 .eraseblocks = { {64 * 1024 * 1024, 1} },
10647 .block_erase = spi_block_erase_60,
10648 }, {
10649 .eraseblocks = { {64 * 1024 * 1024, 1} },
10650 .block_erase = spi_block_erase_c7,
10651 }
10652 },
10653 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +010010654 .reg_bits =
10655 {
Nico Huber4fa39c52024-03-27 01:18:12 +010010656 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +010010657 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
10658 },
Nico Huber4fa39c52024-03-27 01:18:12 +010010659 .printlock = spi_prettyprint_status_register_bp3_srwd,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010660 .unlock = spi_disable_blockprotect_bp3_srwd,
10661 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010662 .read = spi_chip_read,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010663 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010664 .prepare_access = spi_prepare_io,
10665 .finish_access = spi_finish_io,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010666 },
10667
10668 {
10669 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010670 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010671 .bustype = BUS_SPI,
10672 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010673 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010674 .total_size = 8192,
10675 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010676 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010677 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010678 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10679 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10680 .dummy_cycles =
10681 {
10682 .qpi_fast_read = 4,
10683 .qpi_fast_read_qio = 6,
10684 },
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010685 .tested = TEST_OK_PREW,
10686 .probe = probe_spi_rdid,
10687 .probe_timing = TIMING_ZERO,
10688 .block_erasers =
10689 {
10690 {
10691 .eraseblocks = { {4 * 1024, 2048} },
10692 .block_erase = spi_block_erase_20,
10693 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010694 .eraseblocks = { {32 * 1024, 256} },
10695 .block_erase = spi_block_erase_52,
10696 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010697 .eraseblocks = { {64 * 1024, 128} },
10698 .block_erase = spi_block_erase_d8,
10699 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010700 .eraseblocks = { {8 * 1024 * 1024, 1} },
10701 .block_erase = spi_block_erase_60,
10702 }, {
10703 .eraseblocks = { {8 * 1024 * 1024, 1} },
10704 .block_erase = spi_block_erase_c7,
10705 }
10706 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010707 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010708 .reg_bits =
10709 {
10710 .qe = {STATUS1, 6, RW},
10711 },
10712 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010713 .unlock = spi_disable_blockprotect_bp3_srwd,
10714 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010715 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010716 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010717 .prepare_access = spi_prepare_io,
10718 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010719 },
10720
10721 {
10722 .vendor = "Macronix",
10723 .name = "MX25U8032E",
10724 .bustype = BUS_SPI,
10725 .manufacture_id = MACRONIX_ID,
10726 .model_id = MACRONIX_MX25U8032E,
10727 .total_size = 1024,
10728 .page_size = 256,
10729 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber4fa39c52024-03-27 01:18:12 +010010730 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
10731 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010732 .tested = TEST_OK_PREW,
10733 .probe = probe_spi_rdid,
10734 .probe_timing = TIMING_ZERO,
10735 .block_erasers =
10736 {
10737 {
10738 .eraseblocks = { {4 * 1024, 256} },
10739 .block_erase = spi_block_erase_20,
10740 }, {
10741 .eraseblocks = { {32 * 1024, 32} },
10742 .block_erase = spi_block_erase_52,
10743 }, {
10744 .eraseblocks = { {64 * 1024, 16} },
10745 .block_erase = spi_block_erase_d8,
10746 }, {
10747 .eraseblocks = { {1024 * 1024, 1} },
10748 .block_erase = spi_block_erase_60,
10749 }, {
10750 .eraseblocks = { {1024 * 1024, 1} },
10751 .block_erase = spi_block_erase_c7,
10752 }
10753 },
10754 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010755 .reg_bits =
10756 {
10757 .qe = {STATUS1, 6, RW},
10758 },
10759 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010760 .unlock = spi_disable_blockprotect_bp3_srwd,
10761 .write = spi_chip_write_256,
Nico Huber4fa39c52024-03-27 01:18:12 +010010762 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010763 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010764 .prepare_access = spi_prepare_io,
10765 .finish_access = spi_finish_io,
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010766 },
10767
10768 {
10769 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +000010770 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010771 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010772 .manufacture_id = MACRONIX_ID,
10773 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010774 .total_size = 128,
10775 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010776 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10777 .tested = TEST_UNTESTED,
10778 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010779 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010780 .block_erasers =
10781 {
10782 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010783 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010784 {8 * 1024, 1},
10785 {4 * 1024, 2},
10786 {8 * 1024, 2},
10787 {32 * 1024, 1},
10788 {64 * 1024, 1},
10789 },
Sean Nelson35727f72010-01-28 23:55:12 +000010790 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010791 }, {
10792 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010793 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010794 }
10795 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010796 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010797 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010798 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010799 .prepare_access = prepare_memory_access,
10800 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010801 },
10802
10803 {
10804 .vendor = "Macronix",
10805 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010806 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010807 .manufacture_id = MACRONIX_ID,
10808 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010809 .total_size = 128,
10810 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010811 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +000010812 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010813 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010814 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010815 .block_erasers =
10816 {
10817 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010818 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010819 {64 * 1024, 1},
10820 {32 * 1024, 1},
10821 {8 * 1024, 2},
10822 {4 * 1024, 2},
10823 {8 * 1024, 1},
10824 },
Sean Nelson35727f72010-01-28 23:55:12 +000010825 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010826 }, {
10827 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010828 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010829 }
10830 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010831 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010832 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010833 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010834 .prepare_access = prepare_memory_access,
10835 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010836 },
10837
10838 {
10839 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010840 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010841 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010842 .manufacture_id = MACRONIX_ID,
10843 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010844 .total_size = 256,
10845 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010846 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010847 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010848 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010849 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010850 .block_erasers =
10851 {
10852 {
10853 .eraseblocks = {
10854 {16 * 1024, 1},
10855 {8 * 1024, 2},
10856 {32 * 1024, 1},
10857 {64 * 1024, 3},
10858 },
Sean Nelson35727f72010-01-28 23:55:12 +000010859 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010860 }, {
10861 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010862 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010863 },
10864 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010865 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010866 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010867 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010868 .prepare_access = prepare_memory_access,
10869 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010870 },
10871
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010872 {
10873 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010874 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010875 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010876 .manufacture_id = MACRONIX_ID,
10877 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010878 .total_size = 256,
10879 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010880 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010881 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010882 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010883 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010884 .block_erasers =
10885 {
10886 {
10887 .eraseblocks = {
10888 {64 * 1024, 3},
10889 {32 * 1024, 1},
10890 {8 * 1024, 2},
10891 {16 * 1024, 1},
10892 },
Sean Nelson35727f72010-01-28 23:55:12 +000010893 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010894 }, {
10895 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010896 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010897 },
10898 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010899 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010900 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010901 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010902 .prepare_access = prepare_memory_access,
10903 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010904 },
10905
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010906 {
10907 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +000010908 .name = "MX29F022(N)B",
10909 .bustype = BUS_PARALLEL,
10910 .manufacture_id = MACRONIX_ID,
10911 .model_id = MACRONIX_MX29F022B,
10912 .total_size = 256,
10913 .page_size = 0, /* unused */
10914 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10915 .tested = TEST_UNTESTED,
10916 .probe = probe_jedec,
10917 .probe_timing = TIMING_ZERO,
10918 .block_erasers =
10919 {
10920 {
10921 .eraseblocks = {
10922 {16 * 1024, 1},
10923 {8 * 1024, 2},
10924 {32 * 1024, 1},
10925 {64 * 1024, 3},
10926 },
10927 .block_erase = erase_sector_jedec,
10928 }, {
10929 .eraseblocks = { {256 * 1024, 1} },
10930 .block_erase = erase_chip_block_jedec,
10931 }
10932 },
10933 .write = write_jedec_1,
10934 .read = read_memmapped,
10935 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010936 .prepare_access = prepare_memory_access,
10937 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010938 },
10939
10940 {
10941 .vendor = "Macronix",
10942 .name = "MX29F022(N)T",
10943 .bustype = BUS_PARALLEL,
10944 .manufacture_id = MACRONIX_ID,
10945 .model_id = MACRONIX_MX29F022T,
10946 .total_size = 256,
10947 .page_size = 0, /* unused */
10948 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10949 .tested = TEST_OK_PREW,
10950 .probe = probe_jedec,
10951 .probe_timing = TIMING_ZERO,
10952 .block_erasers =
10953 {
10954 {
10955 .eraseblocks = {
10956 {64 * 1024, 3},
10957 {32 * 1024, 1},
10958 {8 * 1024, 2},
10959 {16 * 1024, 1},
10960 },
10961 .block_erase = erase_sector_jedec,
10962 }, {
10963 .eraseblocks = { {256 * 1024, 1} },
10964 .block_erase = erase_chip_block_jedec,
10965 }
10966 },
10967 .write = write_jedec_1,
10968 .read = read_memmapped,
10969 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010970 .prepare_access = prepare_memory_access,
10971 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010972 },
10973
10974 {
10975 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +000010976 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010977 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +000010978 .manufacture_id = MACRONIX_ID,
10979 .model_id = MACRONIX_MX29F040,
10980 .total_size = 512,
10981 .page_size = 64 * 1024,
10982 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10983 .tested = TEST_UNTESTED,
10984 .probe = probe_jedec,
10985 .probe_timing = TIMING_ZERO,
10986 .block_erasers =
10987 {
10988 {
10989 .eraseblocks = { {64 * 1024, 8} },
10990 .block_erase = erase_sector_jedec,
10991 }, {
10992 .eraseblocks = { {512 * 1024, 1} },
10993 .block_erase = erase_chip_block_jedec,
10994 },
10995 },
10996 .write = write_jedec_1,
10997 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010998 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010999 .prepare_access = prepare_memory_access,
11000 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +000011001 },
11002
11003 {
11004 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011005 .name = "MX29GL128F",
11006 .bustype = BUS_PARALLEL,
11007 .manufacture_id = MACRONIX_ID,
11008 .model_id = MACRONIX_MX29GL128F,
11009 .total_size = 16384,
11010 .page_size = 128 * 1024, /* actual page size is 16 */
11011 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11012 .tested = TEST_UNTESTED,
11013 .probe = probe_jedec_29gl,
11014 .probe_timing = TIMING_ZERO,
11015 .block_erasers =
11016 {
11017 {
11018 .eraseblocks = { {128 * 1024, 128} },
11019 .block_erase = erase_sector_jedec,
11020 }, {
11021 .eraseblocks = { {16 * 1024 * 1024, 1} },
11022 .block_erase = erase_chip_block_jedec,
11023 },
11024 },
11025 .write = write_jedec_1,
11026 .read = read_memmapped,
11027 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011028 .prepare_access = prepare_memory_access,
11029 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011030 },
11031
11032 {
11033 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011034 .name = "MX29GL320EB",
11035 .bustype = BUS_PARALLEL,
11036 .manufacture_id = MACRONIX_ID,
11037 .model_id = MACRONIX_MX29GL320EB,
11038 .total_size = 4096,
11039 .page_size = 128 * 1024, /* actual page size is 16 */
11040 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11041 .tested = TEST_UNTESTED,
11042 .probe = probe_jedec_29gl,
11043 .probe_timing = TIMING_ZERO,
11044 .block_erasers =
11045 {
11046 {
11047 .eraseblocks = {
11048 {8 * 1024, 8},
11049 {64 * 1024, 63},
11050 },
11051 .block_erase = erase_sector_jedec,
11052 }, {
11053 .eraseblocks = { {4 * 1024 * 1024, 1} },
11054 .block_erase = erase_chip_block_jedec,
11055 },
11056 },
11057 .write = write_jedec_1,
11058 .read = read_memmapped,
11059 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011060 .prepare_access = prepare_memory_access,
11061 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011062 },
11063
11064 {
11065 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011066 .name = "MX29GL320EH/L",
11067 .bustype = BUS_PARALLEL,
11068 .manufacture_id = MACRONIX_ID,
11069 .model_id = MACRONIX_MX29GL320EHL,
11070 .total_size = 4096,
11071 .page_size = 128 * 1024, /* actual page size is 16 */
11072 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11073 .tested = TEST_UNTESTED,
11074 .probe = probe_jedec_29gl,
11075 .probe_timing = TIMING_ZERO,
11076 .block_erasers =
11077 {
11078 {
11079 .eraseblocks = { {64 * 1024, 64} },
11080 .block_erase = erase_sector_jedec,
11081 }, {
11082 .eraseblocks = { {4 * 1024 * 1024, 1} },
11083 .block_erase = erase_chip_block_jedec,
11084 },
11085 },
11086 .write = write_jedec_1,
11087 .read = read_memmapped,
11088 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011089 .prepare_access = prepare_memory_access,
11090 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011091 },
11092
11093 {
11094 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011095 .name = "MX29GL320ET",
11096 .bustype = BUS_PARALLEL,
11097 .manufacture_id = MACRONIX_ID,
11098 .model_id = MACRONIX_MX29GL320ET,
11099 .total_size = 4096,
11100 .page_size = 128 * 1024, /* actual page size is 16 */
11101 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11102 .tested = TEST_UNTESTED,
11103 .probe = probe_jedec_29gl,
11104 .probe_timing = TIMING_ZERO,
11105 .block_erasers =
11106 {
11107 {
11108 .eraseblocks = {
11109 {64 * 1024, 63},
11110 {8 * 1024, 8},
11111 },
11112 .block_erase = erase_sector_jedec,
11113 }, {
11114 .eraseblocks = { {4 * 1024 * 1024, 1} },
11115 .block_erase = erase_chip_block_jedec,
11116 },
11117 },
11118 .write = write_jedec_1,
11119 .read = read_memmapped,
11120 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011121 .prepare_access = prepare_memory_access,
11122 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011123 },
11124
11125 {
11126 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011127 .name = "MX29GL640EB",
11128 .bustype = BUS_PARALLEL,
11129 .manufacture_id = MACRONIX_ID,
11130 .model_id = MACRONIX_MX29GL640EB,
11131 .total_size = 8192,
11132 .page_size = 128 * 1024, /* actual page size is 16 */
11133 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11134 .tested = TEST_UNTESTED,
11135 .probe = probe_jedec_29gl,
11136 .probe_timing = TIMING_ZERO,
11137 .block_erasers =
11138 {
11139 {
11140 .eraseblocks = {
11141 {8 * 1024, 8},
11142 {64 * 1024, 127},
11143 },
11144 .block_erase = erase_sector_jedec,
11145 }, {
11146 .eraseblocks = { {8 * 1024 * 1024, 1} },
11147 .block_erase = erase_chip_block_jedec,
11148 },
11149 },
11150 .write = write_jedec_1,
11151 .read = read_memmapped,
11152 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011153 .prepare_access = prepare_memory_access,
11154 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011155 },
11156
11157 {
11158 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011159 .name = "MX29GL640EH/L",
11160 .bustype = BUS_PARALLEL,
11161 .manufacture_id = MACRONIX_ID,
11162 .model_id = MACRONIX_MX29GL640EHL,
11163 .total_size = 8192,
11164 .page_size = 128 * 1024, /* actual page size is 16 */
11165 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11166 .tested = TEST_UNTESTED,
11167 .probe = probe_jedec_29gl,
11168 .probe_timing = TIMING_ZERO,
11169 .block_erasers =
11170 {
11171 {
11172 .eraseblocks = { {64 * 1024, 128} },
11173 .block_erase = erase_sector_jedec,
11174 }, {
11175 .eraseblocks = { {8 * 1024 * 1024, 1} },
11176 .block_erase = erase_chip_block_jedec,
11177 },
11178 },
11179 .write = write_jedec_1,
11180 .read = read_memmapped,
11181 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011182 .prepare_access = prepare_memory_access,
11183 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011184 },
11185
11186 {
11187 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011188 .name = "MX29GL640ET",
11189 .bustype = BUS_PARALLEL,
11190 .manufacture_id = MACRONIX_ID,
11191 .model_id = MACRONIX_MX29GL640ET,
11192 .total_size = 8192,
11193 .page_size = 128 * 1024, /* actual page size is 16 */
11194 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11195 .tested = TEST_UNTESTED,
11196 .probe = probe_jedec_29gl,
11197 .probe_timing = TIMING_ZERO,
11198 .block_erasers =
11199 {
11200 {
11201 .eraseblocks = {
11202 {64 * 1024, 127},
11203 {8 * 1024, 8},
11204 },
11205 .block_erase = erase_sector_jedec,
11206 }, {
11207 .eraseblocks = { {8 * 1024 * 1024, 1} },
11208 .block_erase = erase_chip_block_jedec,
11209 },
11210 },
11211 .write = write_jedec_1,
11212 .read = read_memmapped,
11213 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011214 .prepare_access = prepare_memory_access,
11215 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000011216 },
11217
11218 {
11219 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000011220 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011221 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011222 .manufacture_id = MACRONIX_ID,
11223 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011224 .total_size = 512,
11225 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011226 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
11227 .tested = TEST_UNTESTED,
11228 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000011229 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000011230 .block_erasers =
11231 {
11232 {
Stefan Tauner6697f712014-08-06 15:09:15 +000011233 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000011234 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000011235 }, {
11236 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011237 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000011238 },
11239 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000011240 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011241 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011242 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010011243 .prepare_access = prepare_memory_access,
11244 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000011245 },
11246
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011247 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011248 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020011249 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011250 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011251 .manufacture_id = MACRONIX_ID,
11252 .model_id = MACRONIX_MX66L51235F,
11253 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011254 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011255 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
11256 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011257 .tested = TEST_OK_PREW,
11258 .probe = probe_spi_rdid,
11259 .probe_timing = TIMING_ZERO,
11260 .block_erasers =
11261 {
11262 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011263 .eraseblocks = { {4 * 1024, 16384} },
11264 .block_erase = spi_block_erase_21,
11265 }, {
11266 .eraseblocks = { {4 * 1024, 16384} },
11267 .block_erase = spi_block_erase_20,
11268 }, {
11269 .eraseblocks = { {32 * 1024, 2048} },
11270 .block_erase = spi_block_erase_5c,
11271 }, {
11272 .eraseblocks = { {32 * 1024, 2048} },
11273 .block_erase = spi_block_erase_52,
11274 }, {
11275 .eraseblocks = { {64 * 1024, 1024} },
11276 .block_erase = spi_block_erase_dc,
11277 }, {
11278 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011279 .block_erase = spi_block_erase_d8,
11280 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011281 .eraseblocks = { {64 * 1024 * 1024, 1} },
11282 .block_erase = spi_block_erase_60,
11283 }, {
11284 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011285 .block_erase = spi_block_erase_c7,
11286 }
11287 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100011288 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
11289 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011290 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011291 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011292 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011293 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020011294 .prepare_access = spi_prepare_io,
11295 .finish_access = spi_finish_io,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011296 },
11297
Patrick Rudolph3ba83152021-06-08 10:52:19 +020011298 {
11299 .vendor = "Macronix",
11300 .name = "MX66L1G45G",
11301 .bustype = BUS_SPI,
11302 .manufacture_id = MACRONIX_ID,
11303 .model_id = MACRONIX_MX66L1G45G,
11304 .total_size = 131072,
11305 .page_size = 256,
11306 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
11307 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
11308 .tested = TEST_OK_PREW,
11309 .probe = probe_spi_rdid,
11310 .probe_timing = TIMING_ZERO,
11311 .block_erasers =
11312 {
11313 {
11314 .eraseblocks = { {4 * 1024, 32768} },
11315 .block_erase = spi_block_erase_21,
11316 }, {
11317 .eraseblocks = { {4 * 1024, 32768} },
11318 .block_erase = spi_block_erase_20,
11319 }, {
11320 .eraseblocks = { {32 * 1024, 4096} },
11321 .block_erase = spi_block_erase_5c,
11322 }, {
11323 .eraseblocks = { {32 * 1024, 4096} },
11324 .block_erase = spi_block_erase_52,
11325 }, {
11326 .eraseblocks = { {64 * 1024, 2048} },
11327 .block_erase = spi_block_erase_dc,
11328 }, {
11329 .eraseblocks = { {64 * 1024, 2048} },
11330 .block_erase = spi_block_erase_d8,
11331 }, {
11332 .eraseblocks = { {128 * 1024 * 1024, 1} },
11333 .block_erase = spi_block_erase_60,
11334 }, {
11335 .eraseblocks = { {128 * 1024 * 1024, 1} },
11336 .block_erase = spi_block_erase_c7,
11337 }
11338 },
11339 /* TODO: security register and SBLK/SBULK, configuration register */
11340 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11341 .unlock = spi_disable_blockprotect_bp3_srwd,
11342 .write = spi_chip_write_256,
11343 .read = spi_chip_read, /* Fast read (0x0B) supported */
11344 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020011345 .prepare_access = spi_prepare_io,
11346 .finish_access = spi_finish_io,
Patrick Rudolph3ba83152021-06-08 10:52:19 +020011347 },
11348
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011349 /* The ST M25P05 is a bit of a problem. It has the same ID as the
11350 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
11351 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
11352 * only is successful if RDID does not work.
11353 */
11354 {
11355 .vendor = "Micron/Numonyx/ST",
11356 .name = "M25P05",
11357 .bustype = BUS_SPI,
11358 .manufacture_id = 0, /* Not used. */
11359 .model_id = ST_M25P05_RES,
11360 .total_size = 64,
11361 .page_size = 256,
11362 .feature_bits = FEATURE_WRSR_WREN,
11363 .tested = TEST_UNTESTED,
11364 .probe = probe_spi_res1,
11365 .probe_timing = TIMING_ZERO,
11366 .block_erasers =
11367 {
11368 {
11369 .eraseblocks = { {32 * 1024, 2} },
11370 .block_erase = spi_block_erase_d8,
11371 }, {
11372 .eraseblocks = { {64 * 1024, 1} },
11373 .block_erase = spi_block_erase_c7,
11374 }
11375 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011376 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011377 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011378 .write = spi_chip_write_1, /* 128 */
11379 .read = spi_chip_read,
11380 .voltage = {2700, 3600},
11381 },
11382
11383 {
11384 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011385 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011386 .bustype = BUS_SPI,
11387 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011388 .model_id = ST_M25P05A,
11389 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011390 .page_size = 256,
11391 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011392 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011393 .probe = probe_spi_rdid,
11394 .probe_timing = TIMING_ZERO,
11395 .block_erasers =
11396 {
11397 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011398 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011399 .block_erase = spi_block_erase_d8,
11400 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011401 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011402 .block_erase = spi_block_erase_c7,
11403 }
11404 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011405 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011406 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011407 .write = spi_chip_write_256,
11408 .read = spi_chip_read,
11409 .voltage = {2700, 3600},
11410 },
11411
11412 /* The ST M25P10 has the same problem as the M25P05. */
11413 {
11414 .vendor = "Micron/Numonyx/ST",
11415 .name = "M25P10",
11416 .bustype = BUS_SPI,
11417 .manufacture_id = 0, /* Not used. */
11418 .model_id = ST_M25P10_RES,
11419 .total_size = 128,
11420 .page_size = 256,
11421 .feature_bits = FEATURE_WRSR_WREN,
11422 .tested = TEST_UNTESTED,
11423 .probe = probe_spi_res1,
11424 .probe_timing = TIMING_ZERO,
11425 .block_erasers =
11426 {
11427 {
11428 .eraseblocks = { {32 * 1024, 4} },
11429 .block_erase = spi_block_erase_d8,
11430 }, {
11431 .eraseblocks = { {128 * 1024, 1} },
11432 .block_erase = spi_block_erase_c7,
11433 }
11434 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011435 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011436 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011437 .write = spi_chip_write_1, /* 128 */
11438 .read = spi_chip_read,
11439 .voltage = {2700, 3600},
11440 },
11441
11442 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011443 .vendor = "Micron/Numonyx/ST",
11444 .name = "M25P10-A",
11445 .bustype = BUS_SPI,
11446 .manufacture_id = ST_ID,
11447 .model_id = ST_M25P10A,
11448 .total_size = 128,
11449 .page_size = 256,
11450 .feature_bits = FEATURE_WRSR_WREN,
11451 .tested = TEST_OK_PREW,
11452 .probe = probe_spi_rdid,
11453 .probe_timing = TIMING_ZERO,
11454 .block_erasers =
11455 {
11456 {
11457 .eraseblocks = { {32 * 1024, 4} },
11458 .block_erase = spi_block_erase_d8,
11459 }, {
11460 .eraseblocks = { {128 * 1024, 1} },
11461 .block_erase = spi_block_erase_c7,
11462 }
11463 },
11464 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11465 .unlock = spi_disable_blockprotect_bp3_srwd,
11466 .write = spi_chip_write_256,
11467 .read = spi_chip_read,
11468 .voltage = {2700, 3600},
11469 },
11470
11471 {
11472 .vendor = "Micron/Numonyx/ST",
11473 .name = "M25P128",
11474 .bustype = BUS_SPI,
11475 .manufacture_id = ST_ID,
11476 .model_id = ST_M25P128,
11477 .total_size = 16384,
11478 .page_size = 256,
11479 .feature_bits = FEATURE_WRSR_WREN,
11480 .tested = TEST_OK_PREW,
11481 .probe = probe_spi_rdid,
11482 .probe_timing = TIMING_ZERO,
11483 .block_erasers =
11484 {
11485 {
11486 .eraseblocks = { {256 * 1024, 64} },
11487 .block_erase = spi_block_erase_d8,
11488 }, {
11489 .eraseblocks = { {16 * 1024 * 1024, 1} },
11490 .block_erase = spi_block_erase_c7,
11491 }
11492 },
11493 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11494 .unlock = spi_disable_blockprotect_bp3_srwd,
11495 .write = spi_chip_write_256,
11496 .read = spi_chip_read,
11497 .voltage = {2700, 3600},
11498 },
11499
11500 {
11501 .vendor = "Micron/Numonyx/ST",
11502 .name = "M25P16",
11503 .bustype = BUS_SPI,
11504 .manufacture_id = ST_ID,
11505 .model_id = ST_M25P16,
11506 .total_size = 2048,
11507 .page_size = 256,
11508 .feature_bits = FEATURE_WRSR_WREN,
11509 .tested = TEST_OK_PREW,
11510 .probe = probe_spi_rdid,
11511 .probe_timing = TIMING_ZERO,
11512 .block_erasers =
11513 {
11514 {
11515 .eraseblocks = { {64 * 1024, 32} },
11516 .block_erase = spi_block_erase_d8,
11517 }, {
11518 .eraseblocks = { {2 * 1024 * 1024, 1} },
11519 .block_erase = spi_block_erase_c7,
11520 }
11521 },
11522 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11523 .unlock = spi_disable_blockprotect_bp3_srwd,
11524 .write = spi_chip_write_256,
11525 .read = spi_chip_read,
11526 .voltage = {2700, 3600},
11527 },
11528
11529 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011530 .vendor = "Micron/Numonyx/ST", /* Numonyx */
11531 .name = "M25P20",
11532 .bustype = BUS_SPI,
11533 .manufacture_id = ST_ID,
11534 .model_id = ST_M25P20,
11535 .total_size = 256,
11536 .page_size = 256,
11537 .feature_bits = FEATURE_WRSR_WREN,
11538 .tested = TEST_UNTESTED,
11539 .probe = probe_spi_rdid,
11540 .probe_timing = TIMING_ZERO,
11541 .block_erasers =
11542 {
11543 {
11544 .eraseblocks = { {64 * 1024, 4} },
11545 .block_erase = spi_block_erase_d8,
11546 }, {
11547 .eraseblocks = { {256 * 1024, 1} },
11548 .block_erase = spi_block_erase_c7,
11549 }
11550 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011551 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011552 .unlock = spi_disable_blockprotect,
11553 .write = spi_chip_write_256,
11554 .read = spi_chip_read, /* Fast read (0x0B) supported */
11555 .voltage = {2700, 3600},
11556 },
11557
11558 {
11559 .vendor = "Micron/Numonyx/ST",
11560 .name = "M25P20-old",
11561 .bustype = BUS_SPI,
11562 .manufacture_id = 0, /* Not used. */
11563 .model_id = ST_M25P20_RES,
11564 .total_size = 256,
11565 .page_size = 256,
11566 .feature_bits = FEATURE_WRSR_WREN,
11567 .tested = TEST_OK_PREW,
11568 .probe = probe_spi_res1,
11569 .probe_timing = TIMING_ZERO,
11570 .block_erasers =
11571 {
11572 {
11573 .eraseblocks = { {64 * 1024, 4} },
11574 .block_erase = spi_block_erase_d8,
11575 }, {
11576 .eraseblocks = { {256 * 1024, 1} },
11577 .block_erase = spi_block_erase_c7,
11578 }
11579 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011580 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011581 .unlock = spi_disable_blockprotect,
11582 .write = spi_chip_write_256,
11583 .read = spi_chip_read, /* Fast read (0x0B) supported */
11584 .voltage = {2700, 3600},
11585 },
11586
11587 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011588 .vendor = "Micron/Numonyx/ST",
11589 .name = "M25P32",
11590 .bustype = BUS_SPI,
11591 .manufacture_id = ST_ID,
11592 .model_id = ST_M25P32,
11593 .total_size = 4096,
11594 .page_size = 256,
11595 .feature_bits = FEATURE_WRSR_WREN,
11596 .tested = TEST_OK_PREW,
11597 .probe = probe_spi_rdid,
11598 .probe_timing = TIMING_ZERO,
11599 .block_erasers =
11600 {
11601 {
11602 .eraseblocks = { {64 * 1024, 64} },
11603 .block_erase = spi_block_erase_d8,
11604 }, {
11605 .eraseblocks = { {4 * 1024 * 1024, 1} },
11606 .block_erase = spi_block_erase_c7,
11607 }
11608 },
11609 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11610 .unlock = spi_disable_blockprotect_bp3_srwd,
11611 .write = spi_chip_write_256,
11612 .read = spi_chip_read,
11613 .voltage = {2700, 3600},
11614 },
11615
11616 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011617 .vendor = "Micron/Numonyx/ST", /* Numonyx */
11618 .name = "M25P40",
11619 .bustype = BUS_SPI,
11620 .manufacture_id = ST_ID,
11621 .model_id = ST_M25P40,
11622 .total_size = 512,
11623 .page_size = 256,
11624 .feature_bits = FEATURE_WRSR_WREN,
11625 .tested = TEST_OK_PREW,
11626 .probe = probe_spi_rdid,
11627 .probe_timing = TIMING_ZERO,
11628 .block_erasers =
11629 {
11630 {
11631 .eraseblocks = { {64 * 1024, 8} },
11632 .block_erase = spi_block_erase_d8,
11633 }, {
11634 .eraseblocks = { {512 * 1024, 1} },
11635 .block_erase = spi_block_erase_c7,
11636 }
11637 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011638 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011639 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011640 .write = spi_chip_write_256,
11641 .read = spi_chip_read,
11642 .voltage = {2700, 3600},
11643 },
11644
11645 {
11646 .vendor = "Micron/Numonyx/ST",
11647 .name = "M25P40-old",
11648 .bustype = BUS_SPI,
11649 .manufacture_id = 0, /* Not used. */
11650 .model_id = ST_M25P40_RES,
11651 .total_size = 512,
11652 .page_size = 256,
11653 .feature_bits = FEATURE_WRSR_WREN,
11654 .tested = TEST_UNTESTED,
11655 .probe = probe_spi_res1,
11656 .probe_timing = TIMING_ZERO,
11657 .block_erasers =
11658 {
11659 {
11660 .eraseblocks = { {64 * 1024, 8} },
11661 .block_erase = spi_block_erase_d8,
11662 }, {
11663 .eraseblocks = { {512 * 1024, 1} },
11664 .block_erase = spi_block_erase_c7,
11665 }
11666 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011667 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011668 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011669 .write = spi_chip_write_256,
11670 .read = spi_chip_read,
11671 },
11672
11673 {
11674 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011675 .name = "M25P64",
11676 .bustype = BUS_SPI,
11677 .manufacture_id = ST_ID,
11678 .model_id = ST_M25P64,
11679 .total_size = 8192,
11680 .page_size = 256,
11681 .feature_bits = FEATURE_WRSR_WREN,
11682 .tested = TEST_OK_PREW,
11683 .probe = probe_spi_rdid,
11684 .probe_timing = TIMING_ZERO,
11685 .block_erasers =
11686 {
11687 {
11688 .eraseblocks = { {64 * 1024, 128} },
11689 .block_erase = spi_block_erase_d8,
11690 }, {
11691 .eraseblocks = { {8 * 1024 * 1024, 1} },
11692 .block_erase = spi_block_erase_c7,
11693 }
11694 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011695 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011696 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011697 .write = spi_chip_write_256,
11698 .read = spi_chip_read,
11699 .voltage = {2700, 3600},
11700 },
11701
11702 {
11703 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011704 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011705 .bustype = BUS_SPI,
11706 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011707 .model_id = ST_M25P80,
11708 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011709 .page_size = 256,
11710 .feature_bits = FEATURE_WRSR_WREN,
11711 .tested = TEST_OK_PREW,
11712 .probe = probe_spi_rdid,
11713 .probe_timing = TIMING_ZERO,
11714 .block_erasers =
11715 {
11716 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011717 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011718 .block_erase = spi_block_erase_d8,
11719 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011720 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011721 .block_erase = spi_block_erase_c7,
11722 }
11723 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011724 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011725 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011726 .write = spi_chip_write_256,
11727 .read = spi_chip_read,
11728 .voltage = {2700, 3600},
11729 },
11730
11731 {
11732 .vendor = "Micron/Numonyx/ST",
11733 .name = "M25PE10",
11734 .bustype = BUS_SPI,
11735 .manufacture_id = ST_ID,
11736 .model_id = ST_M25PE10,
11737 .total_size = 128,
11738 .page_size = 256,
11739 .feature_bits = FEATURE_WRSR_WREN,
11740 .tested = TEST_UNTESTED,
11741 .probe = probe_spi_rdid,
11742 .probe_timing = TIMING_ZERO,
11743 .block_erasers =
11744 {
11745 {
11746 .eraseblocks = { {4 * 1024, 32} },
11747 .block_erase = spi_block_erase_20,
11748 }, {
11749 .eraseblocks = { {64 * 1024, 2} },
11750 .block_erase = spi_block_erase_d8,
11751 }, {
11752 .eraseblocks = { {128 * 1024, 1} },
11753 .block_erase = spi_block_erase_c7,
11754 }
11755 },
11756 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11757 .unlock = spi_disable_blockprotect,
11758 .write = spi_chip_write_256,
11759 .read = spi_chip_read,
11760 .voltage = {2700, 3600},
11761 },
11762
11763 {
11764 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011765 .name = "M25PE16",
11766 .bustype = BUS_SPI,
11767 .manufacture_id = ST_ID,
11768 .model_id = ST_M25PE16,
11769 .total_size = 2048,
11770 .page_size = 256,
11771 .feature_bits = FEATURE_WRSR_WREN,
11772 .tested = TEST_UNTESTED,
11773 .probe = probe_spi_rdid,
11774 .probe_timing = TIMING_ZERO,
11775 .block_erasers =
11776 {
11777 {
11778 .eraseblocks = { {4 * 1024, 512} },
11779 .block_erase = spi_block_erase_20,
11780 }, {
11781 .eraseblocks = { {64 * 1024, 32} },
11782 .block_erase = spi_block_erase_d8,
11783 }, {
11784 .eraseblocks = { {2 * 1024 * 1024, 1} },
11785 .block_erase = spi_block_erase_c7,
11786 }
11787 },
11788 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11789 .unlock = spi_disable_blockprotect,
11790 .write = spi_chip_write_256,
11791 .read = spi_chip_read,
11792 .voltage = {2700, 3600},
11793 },
11794
11795 {
11796 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011797 .name = "M25PE20",
11798 .bustype = BUS_SPI,
11799 .manufacture_id = ST_ID,
11800 .model_id = ST_M25PE20,
11801 .total_size = 256,
11802 .page_size = 256,
11803 .feature_bits = FEATURE_WRSR_WREN,
11804 .tested = TEST_UNTESTED,
11805 .probe = probe_spi_rdid,
11806 .probe_timing = TIMING_ZERO,
11807 .block_erasers =
11808 {
11809 {
11810 .eraseblocks = { {4 * 1024, 64} },
11811 .block_erase = spi_block_erase_20,
11812 }, {
11813 .eraseblocks = { {64 * 1024, 4} },
11814 .block_erase = spi_block_erase_d8,
11815 }, {
11816 .eraseblocks = { {256 * 1024, 1} },
11817 .block_erase = spi_block_erase_c7,
11818 }
11819 },
11820 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11821 .unlock = spi_disable_blockprotect,
11822 .write = spi_chip_write_256,
11823 .read = spi_chip_read,
11824 .voltage = {2700, 3600},
11825 },
11826
11827 {
11828 .vendor = "Micron/Numonyx/ST",
11829 .name = "M25PE40",
11830 .bustype = BUS_SPI,
11831 .manufacture_id = ST_ID,
11832 .model_id = ST_M25PE40,
11833 .total_size = 512,
11834 .page_size = 256,
11835 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011836 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011837 .probe = probe_spi_rdid,
11838 .probe_timing = TIMING_ZERO,
11839 .block_erasers =
11840 {
11841 {
11842 .eraseblocks = { {4 * 1024, 128} },
11843 .block_erase = spi_block_erase_20,
11844 }, {
11845 .eraseblocks = { {64 * 1024, 8} },
11846 .block_erase = spi_block_erase_d8,
11847 }, {
11848 .eraseblocks = { {512 * 1024, 1} },
11849 .block_erase = spi_block_erase_c7,
11850 }
11851 },
11852 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11853 .unlock = spi_disable_blockprotect,
11854 .write = spi_chip_write_256,
11855 .read = spi_chip_read,
11856 .voltage = {2700, 3600},
11857 },
11858
11859 {
11860 .vendor = "Micron/Numonyx/ST",
11861 .name = "M25PE80",
11862 .bustype = BUS_SPI,
11863 .manufacture_id = ST_ID,
11864 .model_id = ST_M25PE80,
11865 .total_size = 1024,
11866 .page_size = 256,
11867 .feature_bits = FEATURE_WRSR_WREN,
11868 .tested = TEST_OK_PREW,
11869 .probe = probe_spi_rdid,
11870 .probe_timing = TIMING_ZERO,
11871 .block_erasers =
11872 {
11873 {
11874 .eraseblocks = { {4 * 1024, 256} },
11875 .block_erase = spi_block_erase_20,
11876 }, {
11877 .eraseblocks = { {64 * 1024, 16} },
11878 .block_erase = spi_block_erase_d8,
11879 }, {
11880 .eraseblocks = { {1024 * 1024, 1} },
11881 .block_erase = spi_block_erase_c7,
11882 }
11883 },
11884 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11885 .unlock = spi_disable_blockprotect,
11886 .write = spi_chip_write_256,
11887 .read = spi_chip_read,
11888 .voltage = {2700, 3600},
11889 },
11890
11891 {
11892 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011893 .name = "M25PX16",
11894 .bustype = BUS_SPI,
11895 .manufacture_id = ST_ID,
11896 .model_id = ST_M25PX16,
11897 .total_size = 2048,
11898 .page_size = 256,
11899 /* OTP: 64B total; read 0x4B; write 0x42 */
11900 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11901 .tested = TEST_OK_PREW,
11902 .probe = probe_spi_rdid,
11903 .probe_timing = TIMING_ZERO,
11904 .block_erasers =
11905 {
11906 {
11907 .eraseblocks = { { 4 * 1024, 512 } },
11908 .block_erase = spi_block_erase_20,
11909 }, {
11910 .eraseblocks = { {64 * 1024, 32} },
11911 .block_erase = spi_block_erase_d8,
11912 }, {
11913 .eraseblocks = { {2 * 1024 * 1024, 1} },
11914 .block_erase = spi_block_erase_c7,
11915 }
11916 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011917 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011918 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11919 .write = spi_chip_write_256,
11920 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011921 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011922 },
11923
11924 {
11925 .vendor = "Micron/Numonyx/ST",
11926 .name = "M25PX32",
11927 .bustype = BUS_SPI,
11928 .manufacture_id = ST_ID,
11929 .model_id = ST_M25PX32,
11930 .total_size = 4096,
11931 .page_size = 256,
11932 /* OTP: 64B total; read 0x4B; write 0x42 */
11933 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11934 .tested = TEST_OK_PRE,
11935 .probe = probe_spi_rdid,
11936 .probe_timing = TIMING_ZERO,
11937 .block_erasers =
11938 {
11939 {
11940 .eraseblocks = { { 4 * 1024, 1024 } },
11941 .block_erase = spi_block_erase_20,
11942 }, {
11943 .eraseblocks = { {64 * 1024, 64} },
11944 .block_erase = spi_block_erase_d8,
11945 }, {
11946 .eraseblocks = { {4 * 1024 * 1024, 1} },
11947 .block_erase = spi_block_erase_c7,
11948 }
11949 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011950 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011951 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11952 .write = spi_chip_write_256,
11953 .read = spi_chip_read,
11954 .voltage = {2700, 3600},
11955 },
11956
11957 {
11958 .vendor = "Micron/Numonyx/ST",
11959 .name = "M25PX64",
11960 .bustype = BUS_SPI,
11961 .manufacture_id = ST_ID,
11962 .model_id = ST_M25PX64,
11963 .total_size = 8192,
11964 .page_size = 256,
11965 /* OTP: 64B total; read 0x4B; write 0x42 */
11966 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011967 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011968 .probe = probe_spi_rdid,
11969 .probe_timing = TIMING_ZERO,
11970 .block_erasers =
11971 {
11972 {
11973 .eraseblocks = { { 4 * 1024, 2048 } },
11974 .block_erase = spi_block_erase_20,
11975 }, {
11976 .eraseblocks = { {64 * 1024, 128} },
11977 .block_erase = spi_block_erase_d8,
11978 }, {
11979 .eraseblocks = { {8 * 1024 * 1024, 1} },
11980 .block_erase = spi_block_erase_c7,
11981 }
11982 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011983 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011984 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11985 .write = spi_chip_write_256,
11986 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011987 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011988 },
11989
11990 {
11991 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011992 .name = "M25PX80",
11993 .bustype = BUS_SPI,
11994 .manufacture_id = ST_ID,
11995 .model_id = ST_M25PX80,
11996 .total_size = 1024,
11997 .page_size = 256,
11998 /* OTP: 64B total; read 0x4B, write 0x42 */
11999 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12000 .tested = TEST_OK_PREW,
12001 .probe = probe_spi_rdid,
12002 .probe_timing = TIMING_ZERO,
12003 .block_erasers =
12004 {
12005 {
12006 .eraseblocks = { { 4 * 1024, 256 } },
12007 .block_erase = spi_block_erase_20,
12008 }, {
12009 .eraseblocks = { {64 * 1024, 16} },
12010 .block_erase = spi_block_erase_d8,
12011 }, {
12012 .eraseblocks = { {1024 * 1024, 1} },
12013 .block_erase = spi_block_erase_c7,
12014 }
12015 },
12016 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
12017 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
12018 .write = spi_chip_write_256,
12019 .read = spi_chip_read,
12020 .voltage = {2700, 3600},
12021 },
12022
12023 {
12024 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012025 .name = "M45PE10",
12026 .bustype = BUS_SPI,
12027 .manufacture_id = ST_ID,
12028 .model_id = ST_M45PE10,
12029 .total_size = 128,
12030 .page_size = 256,
12031 .tested = TEST_UNTESTED,
12032 .probe = probe_spi_rdid,
12033 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012034 .block_erasers =
12035 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012036 {
12037 .eraseblocks = { {256, 512} },
12038 .block_erase = spi_block_erase_db,
12039 }, {
12040 .eraseblocks = { {64 * 1024, 2} },
12041 .block_erase = spi_block_erase_d8,
12042 }
12043 },
12044 .printlock = spi_prettyprint_status_register_default_welwip,
12045 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12046 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
12047 .read = spi_chip_read, /* Fast read (0x0B) supported */
12048 .voltage = {2700, 3600},
12049 },
12050
12051 {
12052 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012053 .name = "M45PE16",
12054 .bustype = BUS_SPI,
12055 .manufacture_id = ST_ID,
12056 .model_id = ST_M45PE16,
12057 .total_size = 2048,
12058 .page_size = 256,
12059 .tested = TEST_UNTESTED,
12060 .probe = probe_spi_rdid,
12061 .probe_timing = TIMING_ZERO,
12062 .block_erasers =
12063 {
12064 {
12065 .eraseblocks = { {256, 8192} },
12066 .block_erase = spi_block_erase_db,
12067 }, {
12068 .eraseblocks = { {64 * 1024, 32} },
12069 .block_erase = spi_block_erase_d8,
12070 }
12071 },
12072 .printlock = spi_prettyprint_status_register_default_welwip,
12073 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12074 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
12075 .read = spi_chip_read, /* Fast read (0x0B) supported */
12076 .voltage = {2700, 3600},
12077 },
12078
12079 {
12080 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012081 .name = "M45PE20",
12082 .bustype = BUS_SPI,
12083 .manufacture_id = ST_ID,
12084 .model_id = ST_M45PE20,
12085 .total_size = 256,
12086 .page_size = 256,
12087 .tested = TEST_UNTESTED,
12088 .probe = probe_spi_rdid,
12089 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012090 .block_erasers =
12091 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012092 {
12093 .eraseblocks = { {256, 1024} },
12094 .block_erase = spi_block_erase_db,
12095 }, {
12096 .eraseblocks = { {64 * 1024, 4} },
12097 .block_erase = spi_block_erase_d8,
12098 }
12099 },
12100 .printlock = spi_prettyprint_status_register_default_welwip,
12101 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12102 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
12103 .read = spi_chip_read, /* Fast read (0x0B) supported */
12104 .voltage = {2700, 3600},
12105 },
12106
12107 {
12108 .vendor = "Micron/Numonyx/ST",
12109 .name = "M45PE40",
12110 .bustype = BUS_SPI,
12111 .manufacture_id = ST_ID,
12112 .model_id = ST_M45PE40,
12113 .total_size = 512,
12114 .page_size = 256,
12115 .tested = TEST_UNTESTED,
12116 .probe = probe_spi_rdid,
12117 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012118 .block_erasers =
12119 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012120 {
12121 .eraseblocks = { {256, 2048} },
12122 .block_erase = spi_block_erase_db,
12123 }, {
12124 .eraseblocks = { {64 * 1024, 8} },
12125 .block_erase = spi_block_erase_d8,
12126 }
12127 },
12128 .printlock = spi_prettyprint_status_register_default_welwip,
12129 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000012130 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012131 .read = spi_chip_read, /* Fast read (0x0B) supported */
12132 .voltage = {2700, 3600},
12133 },
12134
12135 {
12136 .vendor = "Micron/Numonyx/ST",
12137 .name = "M45PE80",
12138 .bustype = BUS_SPI,
12139 .manufacture_id = ST_ID,
12140 .model_id = ST_M45PE80,
12141 .total_size = 1024,
12142 .page_size = 256,
12143 .tested = TEST_UNTESTED,
12144 .probe = probe_spi_rdid,
12145 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012146 .block_erasers =
12147 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012148 {
12149 .eraseblocks = { {256, 4096} },
12150 .block_erase = spi_block_erase_db,
12151 }, {
12152 .eraseblocks = { {64 * 1024, 16} },
12153 .block_erase = spi_block_erase_d8,
12154 }
12155 },
12156 .printlock = spi_prettyprint_status_register_default_welwip,
12157 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12158 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
12159 .read = spi_chip_read, /* Fast read (0x0B) supported */
12160 .voltage = {2700, 3600},
12161 },
12162
12163 {
12164 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012165 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
12166 .bustype = BUS_SPI,
12167 .manufacture_id = ST_ID,
12168 .model_id = ST_N25Q00A__1G,
12169 .total_size = 131072,
12170 .page_size = 256,
12171 /* supports SFDP */
12172 /* OTP: 64B total; read 0x4B, write 0x42 */
12173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12174 .tested = TEST_UNTESTED,
12175 .probe = probe_spi_rdid,
12176 .probe_timing = TIMING_ZERO,
12177 .block_erasers =
12178 {
12179 {
12180 .eraseblocks = { {4 * 1024, 32768} },
12181 .block_erase = spi_block_erase_21,
12182 }, {
12183 .eraseblocks = { {4 * 1024, 32768} },
12184 .block_erase = spi_block_erase_20,
12185 }, {
12186 .eraseblocks = { {64 * 1024, 2048} },
12187 .block_erase = spi_block_erase_dc,
12188 }, {
12189 .eraseblocks = { {64 * 1024, 2048} },
12190 .block_erase = spi_block_erase_d8,
12191 }, {
12192 .eraseblocks = { {32768 * 1024, 4} },
12193 .block_erase = spi_block_erase_c4,
12194 }
12195 },
12196 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12197 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12198 .write = spi_chip_write_256, /* Multi I/O supported */
12199 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12200 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012201 .prepare_access = spi_prepare_io,
12202 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012203 },
12204
12205 {
12206 .vendor = "Micron/Numonyx/ST",
12207 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
12208 .bustype = BUS_SPI,
12209 .manufacture_id = ST_ID,
12210 .model_id = ST_N25Q00A__3G,
12211 .total_size = 131072,
12212 .page_size = 256,
12213 /* supports SFDP */
12214 /* OTP: 64B total; read 0x4B, write 0x42 */
12215 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12216 .tested = TEST_UNTESTED,
12217 .probe = probe_spi_rdid,
12218 .probe_timing = TIMING_ZERO,
12219 .block_erasers =
12220 {
12221 {
12222 .eraseblocks = { {4 * 1024, 32768} },
12223 .block_erase = spi_block_erase_21,
12224 }, {
12225 .eraseblocks = { {4 * 1024, 32768} },
12226 .block_erase = spi_block_erase_20,
12227 }, {
12228 .eraseblocks = { {64 * 1024, 2048} },
12229 .block_erase = spi_block_erase_dc,
12230 }, {
12231 .eraseblocks = { {64 * 1024, 2048} },
12232 .block_erase = spi_block_erase_d8,
12233 }, {
12234 .eraseblocks = { {32768 * 1024, 4} },
12235 .block_erase = spi_block_erase_c4,
12236 }
12237 },
12238 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12239 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12240 .write = spi_chip_write_256, /* Multi I/O supported */
12241 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12242 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012243 .prepare_access = spi_prepare_io,
12244 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012245 },
12246
12247 {
12248 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012249 .name = "N25Q016",
12250 .bustype = BUS_SPI,
12251 .manufacture_id = ST_ID,
12252 .model_id = ST_N25Q016__1E,
12253 .total_size = 2048,
12254 .page_size = 256,
12255 /* supports SFDP */
12256 /* OTP: 64B total; read 0x4B, write 0x42 */
12257 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12258 .tested = TEST_UNTESTED,
12259 .probe = probe_spi_rdid,
12260 .probe_timing = TIMING_ZERO,
12261 .block_erasers =
12262 {
12263 {
12264 .eraseblocks = { {4 * 1024, 512} },
12265 .block_erase = spi_block_erase_20,
12266 }, {
12267 .eraseblocks = { {32 * 1024, 64} },
12268 .block_erase = spi_block_erase_52,
12269 }, {
12270 .eraseblocks = { {64 * 1024, 32} },
12271 .block_erase = spi_block_erase_d8,
12272 }, {
12273 .eraseblocks = { {2 * 1024 * 1024, 1} },
12274 .block_erase = spi_block_erase_c7,
12275 }
12276 },
12277 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12278 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12279 .write = spi_chip_write_256, /* Multi I/O supported */
12280 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12281 .voltage = {1700, 2000},
12282 },
12283
12284 {
12285 .vendor = "Micron/Numonyx/ST",
12286 .name = "N25Q032..1E",
12287 .bustype = BUS_SPI,
12288 .manufacture_id = ST_ID,
12289 .model_id = ST_N25Q032__1E,
12290 .total_size = 4096,
12291 .page_size = 256,
12292 /* supports SFDP */
12293 /* OTP: 64B total; read 0x4B, write 0x42 */
12294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12295 .tested = TEST_UNTESTED,
12296 .probe = probe_spi_rdid,
12297 .probe_timing = TIMING_ZERO,
12298 .block_erasers =
12299 {
12300 {
12301 .eraseblocks = { {4 * 1024, 1024} },
12302 .block_erase = spi_block_erase_20,
12303 }, {
12304 .eraseblocks = { {64 * 1024, 64} },
12305 .block_erase = spi_block_erase_d8,
12306 }, {
12307 .eraseblocks = { {4 * 1024 * 1024, 1} },
12308 .block_erase = spi_block_erase_c7,
12309 }
12310 },
12311 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12312 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12313 .write = spi_chip_write_256, /* Multi I/O supported */
12314 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12315 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012316 .reg_bits =
12317 {
12318 /*
12319 * There is also a volatile lock register per 64KiB sector, which is not
12320 * mutually exclusive with BP-based protection.
12321 */
12322 .srp = {STATUS1, 7, RW},
12323 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
12324 .tb = {STATUS1, 5, RW},
12325 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012326 .wp_write_cfg = spi_wp_write_cfg,
12327 .wp_read_cfg = spi_wp_read_cfg,
12328 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012329 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012330 },
12331
12332 {
12333 .vendor = "Micron/Numonyx/ST",
12334 .name = "N25Q032..3E",
12335 .bustype = BUS_SPI,
12336 .manufacture_id = ST_ID,
12337 .model_id = ST_N25Q032__3E,
12338 .total_size = 4096,
12339 .page_size = 256,
12340 /* supports SFDP */
12341 /* OTP: 64B total; read 0x4B, write 0x42 */
12342 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12343 .tested = TEST_OK_PREW,
12344 .probe = probe_spi_rdid,
12345 .probe_timing = TIMING_ZERO,
12346 .block_erasers =
12347 {
12348 {
12349 .eraseblocks = { {4 * 1024, 1024} },
12350 .block_erase = spi_block_erase_20,
12351 }, {
12352 .eraseblocks = { {64 * 1024, 64} },
12353 .block_erase = spi_block_erase_d8,
12354 }, {
12355 .eraseblocks = { {4 * 1024 * 1024, 1} },
12356 .block_erase = spi_block_erase_c7,
12357 }
12358 },
12359 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12360 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12361 .write = spi_chip_write_256, /* Multi I/O supported */
12362 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12363 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012364 .reg_bits =
12365 {
12366 /*
12367 * There is also a volatile lock register per 64KiB sector, which is not
12368 * mutually exclusive with BP-based protection.
12369 */
12370 .srp = {STATUS1, 7, RW},
12371 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
12372 .tb = {STATUS1, 5, RW},
12373 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012374 .wp_write_cfg = spi_wp_write_cfg,
12375 .wp_read_cfg = spi_wp_read_cfg,
12376 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012377 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012378 },
12379
12380 {
12381 .vendor = "Micron/Numonyx/ST",
12382 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
12383 .bustype = BUS_SPI,
12384 .manufacture_id = ST_ID,
12385 .model_id = ST_N25Q064__1E,
12386 .total_size = 8192,
12387 .page_size = 256,
12388 /* supports SFDP */
12389 /* OTP: 64B total; read 0x4B, write 0x42 */
12390 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012391 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012392 .probe = probe_spi_rdid,
12393 .probe_timing = TIMING_ZERO,
12394 .block_erasers =
12395 {
12396 {
12397 .eraseblocks = { {4 * 1024, 2048 } },
12398 .block_erase = spi_block_erase_20,
12399 }, {
12400 .eraseblocks = { {64 * 1024, 128} },
12401 .block_erase = spi_block_erase_d8,
12402 }, {
12403 .eraseblocks = { {8 * 1024 * 1024, 1} },
12404 .block_erase = spi_block_erase_c7,
12405 }
12406 },
12407 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12408 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12409 .write = spi_chip_write_256, /* Multi I/O supported */
12410 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12411 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012412 .reg_bits =
12413 {
12414 /*
12415 * There is also a volatile lock register per 64KiB sector, which is not
12416 * mutually exclusive with BP-based protection.
12417 */
12418 .srp = {STATUS1, 7, RW},
12419 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12420 .tb = {STATUS1, 5, RW},
12421 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012422 .wp_write_cfg = spi_wp_write_cfg,
12423 .wp_read_cfg = spi_wp_read_cfg,
12424 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012425 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012426 },
12427
12428 {
12429 .vendor = "Micron/Numonyx/ST",
12430 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12431 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012432 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012433 .model_id = ST_N25Q064__3E,
12434 .total_size = 8192,
12435 .page_size = 256,
12436 /* supports SFDP */
12437 /* OTP: 64B total; read 0x4B, write 0x42 */
12438 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12439 .tested = TEST_OK_PREW,
12440 .probe = probe_spi_rdid,
12441 .probe_timing = TIMING_ZERO,
12442 .block_erasers =
12443 {
12444 {
12445 .eraseblocks = { {4 * 1024, 2048 } },
12446 .block_erase = spi_block_erase_20,
12447 }, {
12448 .eraseblocks = { {64 * 1024, 128} },
12449 .block_erase = spi_block_erase_d8,
12450 }, {
12451 .eraseblocks = { {8 * 1024 * 1024, 1} },
12452 .block_erase = spi_block_erase_c7,
12453 }
12454 },
12455 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12456 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12457 .write = spi_chip_write_256, /* Multi I/O supported */
12458 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12459 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012460 .reg_bits =
12461 {
12462 /*
12463 * There is also a volatile lock register per 64KiB sector, which is not
12464 * mutually exclusive with BP-based protection.
12465 */
12466 .srp = {STATUS1, 7, RW},
12467 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12468 .tb = {STATUS1, 5, RW},
12469 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012470 .wp_write_cfg = spi_wp_write_cfg,
12471 .wp_read_cfg = spi_wp_read_cfg,
12472 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012473 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012474 },
12475
12476 {
12477 .vendor = "Micron/Numonyx/ST",
12478 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
12479 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012480 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012481 .model_id = ST_N25Q128__1E,
12482 .total_size = 16384,
12483 .page_size = 256,
12484 /* supports SFDP */
12485 /* OTP: 64B total; read 0x4B, write 0x42 */
12486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012487 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012488 .probe = probe_spi_rdid,
12489 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012490 .block_erasers =
12491 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012492 {
12493 .eraseblocks = { {4 * 1024, 4096 } },
12494 .block_erase = spi_block_erase_20,
12495 }, {
12496 .eraseblocks = { {64 * 1024, 256} },
12497 .block_erase = spi_block_erase_d8,
12498 }, {
12499 .eraseblocks = { {16384 * 1024, 1} },
12500 .block_erase = spi_block_erase_c7,
12501 }
12502 },
12503 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12504 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12505 .write = spi_chip_write_256, /* Multi I/O supported */
12506 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12507 .voltage = {1700, 2000},
12508 },
12509
12510 {
12511 .vendor = "Micron/Numonyx/ST",
12512 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12513 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012514 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012515 .model_id = ST_N25Q128__3E,
12516 .total_size = 16384,
12517 .page_size = 256,
12518 /* supports SFDP */
12519 /* OTP: 64B total; read 0x4B, write 0x42 */
12520 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12521 .tested = TEST_OK_PREW,
12522 .probe = probe_spi_rdid,
12523 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012524 .block_erasers =
12525 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012526 {
12527 .eraseblocks = { {4 * 1024, 4096 } },
12528 .block_erase = spi_block_erase_20,
12529 }, {
12530 .eraseblocks = { {64 * 1024, 256} },
12531 .block_erase = spi_block_erase_d8,
12532 }, {
12533 .eraseblocks = { {16384 * 1024, 1} },
12534 .block_erase = spi_block_erase_c7,
12535 }
12536 },
12537 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12538 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12539 .write = spi_chip_write_256, /* Multi I/O supported */
12540 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12541 .voltage = {2700, 3600},
12542 },
12543
12544 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012545 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012546 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
12547 .bustype = BUS_SPI,
12548 .manufacture_id = ST_ID,
12549 .model_id = ST_N25Q256__1E,
12550 .total_size = 32768,
12551 .page_size = 256,
12552 /* supports SFDP */
12553 /* OTP: 64B total; read 0x4B, write 0x42 */
12554 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12555 .tested = TEST_UNTESTED,
12556 .probe = probe_spi_rdid,
12557 .probe_timing = TIMING_ZERO,
12558 .block_erasers =
12559 {
12560 {
12561 .eraseblocks = { {4 * 1024, 8192} },
12562 .block_erase = spi_block_erase_21,
12563 }, {
12564 .eraseblocks = { {4 * 1024, 8192} },
12565 .block_erase = spi_block_erase_20,
12566 }, {
12567 .eraseblocks = { {64 * 1024, 512} },
12568 .block_erase = spi_block_erase_dc,
12569 }, {
12570 .eraseblocks = { {64 * 1024, 512} },
12571 .block_erase = spi_block_erase_d8,
12572 }, {
12573 .eraseblocks = { {32768 * 1024, 1} },
12574 .block_erase = spi_block_erase_c7,
12575 }
12576 },
12577 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12578 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12579 .write = spi_chip_write_256, /* Multi I/O supported */
12580 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12581 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012582 .prepare_access = spi_prepare_io,
12583 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012584 },
12585
12586 {
12587 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012588 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12589 .bustype = BUS_SPI,
12590 .manufacture_id = ST_ID,
12591 .model_id = ST_N25Q256__3E,
12592 .total_size = 32768,
12593 .page_size = 256,
12594 /* supports SFDP */
12595 /* OTP: 64B total; read 0x4B, write 0x42 */
12596 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12597 .tested = TEST_UNTESTED,
12598 .probe = probe_spi_rdid,
12599 .probe_timing = TIMING_ZERO,
12600 .block_erasers =
12601 {
12602 {
12603 .eraseblocks = { {4 * 1024, 8192} },
12604 .block_erase = spi_block_erase_21,
12605 }, {
12606 .eraseblocks = { {4 * 1024, 8192} },
12607 .block_erase = spi_block_erase_20,
12608 }, {
12609 .eraseblocks = { {64 * 1024, 512} },
12610 .block_erase = spi_block_erase_dc,
12611 }, {
12612 .eraseblocks = { {64 * 1024, 512} },
12613 .block_erase = spi_block_erase_d8,
12614 }, {
12615 .eraseblocks = { {32768 * 1024, 1} },
12616 .block_erase = spi_block_erase_c7,
12617 }
12618 },
12619 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12620 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12621 .write = spi_chip_write_256, /* Multi I/O supported */
12622 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12623 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012624 .prepare_access = spi_prepare_io,
12625 .finish_access = spi_finish_io,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012626 },
12627
12628 {
12629 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012630 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012631 .bustype = BUS_SPI,
12632 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012633 .model_id = ST_N25Q512__1G,
12634 .total_size = 65536,
12635 .page_size = 256,
12636 /* supports SFDP */
12637 /* OTP: 64B total; read 0x4B, write 0x42 */
12638 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12639 .tested = TEST_UNTESTED,
12640 .probe = probe_spi_rdid,
12641 .probe_timing = TIMING_ZERO,
12642 .block_erasers =
12643 {
12644 {
12645 .eraseblocks = { {4 * 1024, 16384} },
12646 .block_erase = spi_block_erase_21,
12647 }, {
12648 .eraseblocks = { {4 * 1024, 16384} },
12649 .block_erase = spi_block_erase_20,
12650 }, {
12651 .eraseblocks = { {64 * 1024, 1024} },
12652 .block_erase = spi_block_erase_dc,
12653 }, {
12654 .eraseblocks = { {64 * 1024, 1024} },
12655 .block_erase = spi_block_erase_d8,
12656 }, {
12657 .eraseblocks = { {32768 * 1024, 2} },
12658 .block_erase = spi_block_erase_c4,
12659 }
12660 },
12661 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12662 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12663 .write = spi_chip_write_256, /* Multi I/O supported */
12664 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12665 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012666 .prepare_access = spi_prepare_io,
12667 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012668 },
12669
12670 {
12671 .vendor = "Micron/Numonyx/ST",
12672 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
12673 .bustype = BUS_SPI,
12674 .manufacture_id = ST_ID,
12675 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012676 .total_size = 65536,
12677 .page_size = 256,
12678 /* supports SFDP */
12679 /* OTP: 64B total; read 0x4B, write 0x42 */
12680 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12681 .tested = TEST_OK_PREW,
12682 .probe = probe_spi_rdid,
12683 .probe_timing = TIMING_ZERO,
12684 .block_erasers =
12685 {
12686 {
12687 .eraseblocks = { {4 * 1024, 16384} },
12688 .block_erase = spi_block_erase_21,
12689 }, {
12690 .eraseblocks = { {4 * 1024, 16384} },
12691 .block_erase = spi_block_erase_20,
12692 }, {
12693 .eraseblocks = { {64 * 1024, 1024} },
12694 .block_erase = spi_block_erase_dc,
12695 }, {
12696 .eraseblocks = { {64 * 1024, 1024} },
12697 .block_erase = spi_block_erase_d8,
12698 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070012699 .eraseblocks = { {32768 * 1024, 2} },
12700 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012701 }
12702 },
12703 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12704 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12705 .write = spi_chip_write_256, /* Multi I/O supported */
12706 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12707 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012708 .prepare_access = spi_prepare_io,
12709 .finish_access = spi_finish_io,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012710 },
12711
12712 {
Ed Swierk199ab392017-07-03 13:33:44 -070012713 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012714 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12715 .bustype = BUS_SPI,
12716 .manufacture_id = ST_ID,
12717 .model_id = ST_N25Q00A__3G,
12718 .total_size = 131072,
12719 .page_size = 256,
12720 /* supports SFDP */
12721 /* OTP: 64B total; read 0x4B, write 0x42 */
12722 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12723 .tested = TEST_OK_PREW,
12724 .probe = probe_spi_rdid,
12725 .probe_timing = TIMING_ZERO,
12726 .block_erasers =
12727 {
12728 {
12729 .eraseblocks = { {4 * 1024, 32768} },
12730 .block_erase = spi_block_erase_21,
12731 }, {
12732 .eraseblocks = { {4 * 1024, 32768} },
12733 .block_erase = spi_block_erase_20,
12734 }, {
12735 .eraseblocks = { {32 * 1024, 4096} },
12736 .block_erase = spi_block_erase_5c,
12737 }, {
12738 .eraseblocks = { {32 * 1024, 4096} },
12739 .block_erase = spi_block_erase_52,
12740 }, {
12741 .eraseblocks = { {64 * 1024, 2048} },
12742 .block_erase = spi_block_erase_dc,
12743 }, {
12744 .eraseblocks = { {64 * 1024, 2048} },
12745 .block_erase = spi_block_erase_d8,
12746 }, {
12747 .eraseblocks = { {65536 * 1024, 2} },
12748 .block_erase = spi_block_erase_c4,
12749 }
12750 },
12751 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12752 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12753 .write = spi_chip_write_256, /* Multi I/O supported */
12754 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12755 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012756 .prepare_access = spi_prepare_io,
12757 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012758 },
12759
12760 {
12761 .vendor = "Micron",
12762 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12763 .bustype = BUS_SPI,
12764 .manufacture_id = ST_ID,
12765 .model_id = ST_N25Q00A__1G,
12766 .total_size = 131072,
12767 .page_size = 256,
12768 /* supports SFDP */
12769 /* OTP: 64B total; read 0x4B, write 0x42 */
12770 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12771 .tested = TEST_UNTESTED,
12772 .probe = probe_spi_rdid,
12773 .probe_timing = TIMING_ZERO,
12774 .block_erasers =
12775 {
12776 {
12777 .eraseblocks = { {4 * 1024, 32768} },
12778 .block_erase = spi_block_erase_21,
12779 }, {
12780 .eraseblocks = { {4 * 1024, 32768} },
12781 .block_erase = spi_block_erase_20,
12782 }, {
12783 .eraseblocks = { {32 * 1024, 4096} },
12784 .block_erase = spi_block_erase_5c,
12785 }, {
12786 .eraseblocks = { {32 * 1024, 4096} },
12787 .block_erase = spi_block_erase_52,
12788 }, {
12789 .eraseblocks = { {64 * 1024, 2048} },
12790 .block_erase = spi_block_erase_dc,
12791 }, {
12792 .eraseblocks = { {64 * 1024, 2048} },
12793 .block_erase = spi_block_erase_d8,
12794 }, {
12795 .eraseblocks = { {65536 * 1024, 2} },
12796 .block_erase = spi_block_erase_c4,
12797 }
12798 },
12799 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12800 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12801 .write = spi_chip_write_256, /* Multi I/O supported */
12802 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12803 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012804 .prepare_access = spi_prepare_io,
12805 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012806 },
12807
12808 {
12809 .vendor = "Micron",
12810 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12811 .bustype = BUS_SPI,
12812 .manufacture_id = ST_ID,
12813 .model_id = ST_MT25QL02G,
12814 .total_size = 262144,
12815 .page_size = 256,
12816 /* supports SFDP */
12817 /* OTP: 64B total; read 0x4B, write 0x42 */
12818 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12819 .tested = TEST_UNTESTED,
12820 .probe = probe_spi_rdid,
12821 .probe_timing = TIMING_ZERO,
12822 .block_erasers =
12823 {
12824 {
12825 .eraseblocks = { {4 * 1024, 65536} },
12826 .block_erase = spi_block_erase_21,
12827 }, {
12828 .eraseblocks = { {4 * 1024, 65536} },
12829 .block_erase = spi_block_erase_20,
12830 }, {
12831 .eraseblocks = { {32 * 1024, 8192} },
12832 .block_erase = spi_block_erase_5c,
12833 }, {
12834 .eraseblocks = { {32 * 1024, 8192} },
12835 .block_erase = spi_block_erase_52,
12836 }, {
12837 .eraseblocks = { {64 * 1024, 4096} },
12838 .block_erase = spi_block_erase_dc,
12839 }, {
12840 .eraseblocks = { {64 * 1024, 4096} },
12841 .block_erase = spi_block_erase_d8,
12842 }, {
12843 .eraseblocks = { {65536 * 1024, 4} },
12844 .block_erase = spi_block_erase_c4,
12845 }
12846 },
12847 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12848 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12849 .write = spi_chip_write_256, /* Multi I/O supported */
12850 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12851 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012852 .prepare_access = spi_prepare_io,
12853 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012854 },
12855
12856 {
12857 .vendor = "Micron",
12858 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12859 .bustype = BUS_SPI,
12860 .manufacture_id = ST_ID,
12861 .model_id = ST_MT25QU02G,
12862 .total_size = 262144,
12863 .page_size = 256,
12864 /* supports SFDP */
12865 /* OTP: 64B total; read 0x4B, write 0x42 */
12866 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12867 .tested = TEST_UNTESTED,
12868 .probe = probe_spi_rdid,
12869 .probe_timing = TIMING_ZERO,
12870 .block_erasers =
12871 {
12872 {
12873 .eraseblocks = { {4 * 1024, 65536} },
12874 .block_erase = spi_block_erase_21,
12875 }, {
12876 .eraseblocks = { {4 * 1024, 65536} },
12877 .block_erase = spi_block_erase_20,
12878 }, {
12879 .eraseblocks = { {32 * 1024, 8192} },
12880 .block_erase = spi_block_erase_5c,
12881 }, {
12882 .eraseblocks = { {32 * 1024, 8192} },
12883 .block_erase = spi_block_erase_52,
12884 }, {
12885 .eraseblocks = { {64 * 1024, 4096} },
12886 .block_erase = spi_block_erase_dc,
12887 }, {
12888 .eraseblocks = { {64 * 1024, 4096} },
12889 .block_erase = spi_block_erase_d8,
12890 }, {
12891 .eraseblocks = { {65536 * 1024, 4} },
12892 .block_erase = spi_block_erase_c4,
12893 }
12894 },
12895 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12896 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12897 .write = spi_chip_write_256, /* Multi I/O supported */
12898 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12899 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012900 .prepare_access = spi_prepare_io,
12901 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012902 },
12903
12904 {
12905 .vendor = "Micron",
12906 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12907 .bustype = BUS_SPI,
12908 .manufacture_id = ST_ID,
12909 .model_id = ST_N25Q128__1E,
12910 .total_size = 16384,
12911 .page_size = 256,
12912 /* supports SFDP */
12913 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huber48dc0902023-03-05 17:20:55 +010012914 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012915 .tested = TEST_UNTESTED,
12916 .probe = probe_spi_rdid,
12917 .probe_timing = TIMING_ZERO,
12918 .block_erasers =
12919 {
12920 {
12921 .eraseblocks = { {4 * 1024, 4096} },
12922 .block_erase = spi_block_erase_20,
12923 }, {
12924 .eraseblocks = { {32 * 1024, 512} },
12925 .block_erase = spi_block_erase_52,
12926 }, {
12927 .eraseblocks = { {64 * 1024, 256} },
12928 .block_erase = spi_block_erase_d8,
12929 }, {
12930 .eraseblocks = { {16384 * 1024, 1} },
12931 .block_erase = spi_block_erase_c7,
12932 }, {
12933 .eraseblocks = { {16384 * 1024, 1} },
12934 .block_erase = spi_block_erase_60,
12935 }
12936 },
12937 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12938 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12939 .write = spi_chip_write_256, /* Multi I/O supported */
12940 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12941 .voltage = {1700, 2000},
12942 },
12943
12944 {
12945 .vendor = "Micron",
12946 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12947 .bustype = BUS_SPI,
12948 .manufacture_id = ST_ID,
12949 .model_id = ST_N25Q128__3E,
12950 .total_size = 16384,
12951 .page_size = 256,
12952 /* supports SFDP */
12953 /* OTP: 64B total; read 0x4B, write 0x42 */
Rick Altherr1e563602022-12-22 10:25:34 -080012954 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12955 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012956 .probe = probe_spi_rdid,
12957 .probe_timing = TIMING_ZERO,
12958 .block_erasers =
12959 {
12960 {
12961 .eraseblocks = { {4 * 1024, 4096} },
12962 .block_erase = spi_block_erase_20,
12963 }, {
12964 .eraseblocks = { {32 * 1024, 512} },
12965 .block_erase = spi_block_erase_52,
12966 }, {
12967 .eraseblocks = { {64 * 1024, 256} },
12968 .block_erase = spi_block_erase_d8,
12969 }, {
12970 .eraseblocks = { {16384 * 1024, 1} },
12971 .block_erase = spi_block_erase_c7,
12972 }, {
12973 .eraseblocks = { {16384 * 1024, 1} },
12974 .block_erase = spi_block_erase_60,
12975 }
12976 },
12977 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12978 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12979 .write = spi_chip_write_256, /* Multi I/O supported */
12980 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12981 .voltage = {2700, 3600},
12982 },
12983
12984 {
12985 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012986 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012987 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012988 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070012989 .model_id = ST_N25Q256__3E,
12990 .total_size = 32768,
12991 .page_size = 256,
12992 /* supports SFDP */
12993 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012994 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010012995 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012996 .probe = probe_spi_rdid,
12997 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012998 .block_erasers =
12999 {
Ed Swierk199ab392017-07-03 13:33:44 -070013000 {
13001 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020013002 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070013003 }, {
Nico Huberaac81422017-11-10 22:54:13 +010013004 .eraseblocks = { {4 * 1024, 8192} },
13005 .block_erase = spi_block_erase_20,
13006 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070013007 .eraseblocks = { {32 * 1024, 1024} },
13008 .block_erase = spi_block_erase_5c,
13009 }, {
13010 .eraseblocks = { {32 * 1024, 1024} },
13011 .block_erase = spi_block_erase_52,
13012 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070013013 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020013014 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070013015 }, {
Nico Huberaac81422017-11-10 22:54:13 +010013016 .eraseblocks = { {64 * 1024, 512} },
13017 .block_erase = spi_block_erase_d8,
13018 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070013019 .eraseblocks = { {32768 * 1024, 1} },
13020 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070013021 }, {
13022 .eraseblocks = { {32768 * 1024, 1} },
13023 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070013024 }
13025 },
13026 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
13027 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
13028 .write = spi_chip_write_256, /* Multi I/O supported */
13029 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13030 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020013031 .prepare_access = spi_prepare_io,
13032 .finish_access = spi_finish_io,
Ed Swierk199ab392017-07-03 13:33:44 -070013033 },
13034
13035 {
13036 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013037 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
13038 .bustype = BUS_SPI,
13039 .manufacture_id = ST_ID,
13040 .model_id = ST_N25Q256__1E,
13041 .total_size = 32768,
13042 .page_size = 256,
13043 /* supports SFDP */
13044 /* OTP: 64B total; read 0x4B, write 0x42 */
13045 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons59052582022-03-08 15:23:58 +010013046 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013047 .probe = probe_spi_rdid,
13048 .probe_timing = TIMING_ZERO,
13049 .block_erasers =
13050 {
13051 {
13052 .eraseblocks = { {4 * 1024, 8192} },
13053 .block_erase = spi_block_erase_21,
13054 }, {
13055 .eraseblocks = { {4 * 1024, 8192} },
13056 .block_erase = spi_block_erase_20,
13057 }, {
13058 .eraseblocks = { {32 * 1024, 1024} },
13059 .block_erase = spi_block_erase_5c,
13060 }, {
13061 .eraseblocks = { {32 * 1024, 1024} },
13062 .block_erase = spi_block_erase_52,
13063 }, {
13064 .eraseblocks = { {64 * 1024, 512} },
13065 .block_erase = spi_block_erase_dc,
13066 }, {
13067 .eraseblocks = { {64 * 1024, 512} },
13068 .block_erase = spi_block_erase_d8,
13069 }, {
13070 .eraseblocks = { {32768 * 1024, 1} },
13071 .block_erase = spi_block_erase_c7,
13072 }, {
13073 .eraseblocks = { {32768 * 1024, 1} },
13074 .block_erase = spi_block_erase_60,
13075 }
13076 },
13077 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
13078 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
13079 .write = spi_chip_write_256, /* Multi I/O supported */
13080 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13081 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020013082 .prepare_access = spi_prepare_io,
13083 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013084 },
13085
13086 {
13087 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070013088 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070013089 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100013090 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013091 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070013092 .total_size = 65536,
13093 .page_size = 256,
13094 /* supports SFDP */
13095 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010013096 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020013097 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070013098 .probe = probe_spi_rdid,
13099 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100013100 .block_erasers =
13101 {
Ed Swierk199ab392017-07-03 13:33:44 -070013102 {
13103 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020013104 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070013105 }, {
Nico Huberaac81422017-11-10 22:54:13 +010013106 .eraseblocks = { {4 * 1024, 16384} },
13107 .block_erase = spi_block_erase_20,
13108 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070013109 .eraseblocks = { {32 * 1024, 2048} },
13110 .block_erase = spi_block_erase_5c,
13111 }, {
13112 .eraseblocks = { {32 * 1024, 2048} },
13113 .block_erase = spi_block_erase_52,
13114 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070013115 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020013116 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070013117 }, {
Nico Huberaac81422017-11-10 22:54:13 +010013118 .eraseblocks = { {64 * 1024, 1024} },
13119 .block_erase = spi_block_erase_d8,
13120 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070013121 .eraseblocks = { {65536 * 1024, 1} },
13122 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070013123 }, {
13124 .eraseblocks = { {65536 * 1024, 1} },
13125 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070013126 }
13127 },
13128 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
13129 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
13130 .write = spi_chip_write_256, /* Multi I/O supported */
13131 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13132 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030013133 .reg_bits =
13134 {
13135 .srp = {STATUS1, 7, RW},
13136 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
13137 .tb = {STATUS1, 5, RW},
13138 },
Nico Huberaabb3e02023-01-13 00:22:30 +010013139 .wp_write_cfg = spi_wp_write_cfg,
13140 .wp_read_cfg = spi_wp_read_cfg,
13141 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030013142 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020013143 .prepare_access = spi_prepare_io,
13144 .finish_access = spi_finish_io,
Ed Swierk199ab392017-07-03 13:33:44 -070013145 },
13146
13147 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013148 .vendor = "Micron",
13149 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
13150 .bustype = BUS_SPI,
13151 .manufacture_id = ST_ID,
13152 .model_id = ST_N25Q512__1G,
13153 .total_size = 65536,
13154 .page_size = 256,
13155 /* supports SFDP */
13156 /* OTP: 64B total; read 0x4B, write 0x42 */
13157 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
13158 .tested = TEST_OK_PREW,
13159 .probe = probe_spi_rdid,
13160 .probe_timing = TIMING_ZERO,
13161 .block_erasers =
13162 {
13163 {
13164 .eraseblocks = { {4 * 1024, 16384} },
13165 .block_erase = spi_block_erase_21,
13166 }, {
13167 .eraseblocks = { {4 * 1024, 16384} },
13168 .block_erase = spi_block_erase_20,
13169 }, {
13170 .eraseblocks = { {32 * 1024, 2048} },
13171 .block_erase = spi_block_erase_5c,
13172 }, {
13173 .eraseblocks = { {32 * 1024, 2048} },
13174 .block_erase = spi_block_erase_52,
13175 }, {
13176 .eraseblocks = { {64 * 1024, 1024} },
13177 .block_erase = spi_block_erase_dc,
13178 }, {
13179 .eraseblocks = { {64 * 1024, 1024} },
13180 .block_erase = spi_block_erase_d8,
13181 }, {
13182 .eraseblocks = { {65536 * 1024, 1} },
13183 .block_erase = spi_block_erase_c7,
13184 }, {
13185 .eraseblocks = { {65536 * 1024, 1} },
13186 .block_erase = spi_block_erase_60,
13187 }
13188 },
13189 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
13190 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
13191 .write = spi_chip_write_256, /* Multi I/O supported */
13192 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13193 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020013194 .prepare_access = spi_prepare_io,
13195 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070013196 },
13197
13198 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000013199 .vendor = "MoselVitelic",
13200 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013201 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013202 .manufacture_id = SYNCMOS_MVC_ID,
13203 .model_id = MVC_V29C51000B,
13204 .total_size = 64,
13205 .page_size = 512,
13206 .feature_bits = FEATURE_EITHER_RESET,
13207 .tested = TEST_UNTESTED,
13208 .probe = probe_jedec,
13209 .probe_timing = TIMING_ZERO,
13210 .block_erasers =
13211 {
13212 {
13213 .eraseblocks = { {512, 128} },
13214 .block_erase = erase_sector_jedec,
13215 }, {
13216 .eraseblocks = { {64 * 1024, 1} },
13217 .block_erase = erase_chip_block_jedec,
13218 },
13219 },
13220 .write = write_jedec_1,
13221 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013222 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013223 .prepare_access = prepare_memory_access,
13224 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013225 },
13226
13227 {
13228 .vendor = "MoselVitelic",
13229 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013230 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013231 .manufacture_id = SYNCMOS_MVC_ID,
13232 .model_id = MVC_V29C51000T,
13233 .total_size = 64,
13234 .page_size = 512,
13235 .feature_bits = FEATURE_EITHER_RESET,
13236 .tested = TEST_UNTESTED,
13237 .probe = probe_jedec,
13238 .probe_timing = TIMING_ZERO,
13239 .block_erasers =
13240 {
13241 {
13242 .eraseblocks = { {512, 128} },
13243 .block_erase = erase_sector_jedec,
13244 }, {
13245 .eraseblocks = { {64 * 1024, 1} },
13246 .block_erase = erase_chip_block_jedec,
13247 },
13248 },
13249 .write = write_jedec_1,
13250 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013251 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013252 .prepare_access = prepare_memory_access,
13253 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013254 },
13255
13256 {
13257 .vendor = "MoselVitelic",
13258 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013259 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013260 .manufacture_id = SYNCMOS_MVC_ID,
13261 .model_id = MVC_V29C51400B,
13262 .total_size = 512,
13263 .page_size = 1024,
13264 .feature_bits = FEATURE_EITHER_RESET,
13265 .tested = TEST_UNTESTED,
13266 .probe = probe_jedec,
13267 .probe_timing = TIMING_ZERO,
13268 .block_erasers =
13269 {
13270 {
13271 .eraseblocks = { {1024, 512} },
13272 .block_erase = erase_sector_jedec,
13273 }, {
13274 .eraseblocks = { {512 * 1024, 1} },
13275 .block_erase = erase_chip_block_jedec,
13276 },
13277 },
13278 .write = write_jedec_1,
13279 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013280 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013281 .prepare_access = prepare_memory_access,
13282 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013283 },
13284
13285 {
13286 .vendor = "MoselVitelic",
13287 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013288 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013289 .manufacture_id = SYNCMOS_MVC_ID,
13290 .model_id = MVC_V29C51400T,
13291 .total_size = 512,
13292 .page_size = 1024,
13293 .feature_bits = FEATURE_EITHER_RESET,
13294 .tested = TEST_UNTESTED,
13295 .probe = probe_jedec,
13296 .probe_timing = TIMING_ZERO,
13297 .block_erasers =
13298 {
13299 {
13300 .eraseblocks = { {1024, 512} },
13301 .block_erase = erase_sector_jedec,
13302 }, {
13303 .eraseblocks = { {512 * 1024, 1} },
13304 .block_erase = erase_chip_block_jedec,
13305 },
13306 },
13307 .write = write_jedec_1,
13308 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013309 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013310 .prepare_access = prepare_memory_access,
13311 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013312 },
13313
13314 {
13315 .vendor = "MoselVitelic",
13316 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013317 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013318 .manufacture_id = SYNCMOS_MVC_ID,
13319 .model_id = MVC_V29LC51000,
13320 .total_size = 64,
13321 .page_size = 512,
13322 .feature_bits = FEATURE_EITHER_RESET,
13323 .tested = TEST_UNTESTED,
13324 .probe = probe_jedec,
13325 .probe_timing = TIMING_ZERO,
13326 .block_erasers =
13327 {
13328 {
13329 .eraseblocks = { {512, 128} },
13330 .block_erase = erase_sector_jedec,
13331 }, {
13332 .eraseblocks = { {64 * 1024, 1} },
13333 .block_erase = erase_chip_block_jedec,
13334 },
13335 },
13336 .write = write_jedec_1,
13337 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013338 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013339 .prepare_access = prepare_memory_access,
13340 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013341 },
13342
13343 {
13344 .vendor = "MoselVitelic",
13345 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013346 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013347 .manufacture_id = SYNCMOS_MVC_ID,
13348 .model_id = MVC_V29LC51001,
13349 .total_size = 128,
13350 .page_size = 512,
13351 .feature_bits = FEATURE_EITHER_RESET,
13352 .tested = TEST_UNTESTED,
13353 .probe = probe_jedec,
13354 .probe_timing = TIMING_ZERO,
13355 .block_erasers =
13356 {
13357 {
13358 .eraseblocks = { {512, 256} },
13359 .block_erase = erase_sector_jedec,
13360 }, {
13361 .eraseblocks = { {128 * 1024, 1} },
13362 .block_erase = erase_chip_block_jedec,
13363 },
13364 },
13365 .write = write_jedec_1,
13366 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013367 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013368 .prepare_access = prepare_memory_access,
13369 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013370 },
13371
13372 {
13373 .vendor = "MoselVitelic",
13374 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013375 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013376 .manufacture_id = SYNCMOS_MVC_ID,
13377 .model_id = MVC_V29LC51002,
13378 .total_size = 256,
13379 .page_size = 512,
13380 .feature_bits = FEATURE_EITHER_RESET,
13381 .tested = TEST_UNTESTED,
13382 .probe = probe_jedec,
13383 .probe_timing = TIMING_ZERO,
13384 .block_erasers =
13385 {
13386 {
13387 .eraseblocks = { {512, 512} },
13388 .block_erase = erase_sector_jedec,
13389 }, {
13390 .eraseblocks = { {256 * 1024, 1} },
13391 .block_erase = erase_chip_block_jedec,
13392 },
13393 },
13394 .write = write_jedec_1,
13395 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013396 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013397 .prepare_access = prepare_memory_access,
13398 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013399 },
13400
13401 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013402 .vendor = "Nantronics",
13403 .name = "N25S10",
13404 .bustype = BUS_SPI,
13405 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13406 .model_id = NANTRONICS_N25S10,
13407 .total_size = 128,
13408 .page_size = 256,
13409 .feature_bits = FEATURE_WRSR_WREN,
13410 .tested = TEST_UNTESTED,
13411 .probe = probe_spi_rdid,
13412 .probe_timing = TIMING_ZERO,
13413 .block_erasers =
13414 {
13415 {
13416 .eraseblocks = { {4 * 1024, 32} },
13417 .block_erase = spi_block_erase_20,
13418 }, {
13419 .eraseblocks = { {4 * 1024, 32} },
13420 .block_erase = spi_block_erase_d7,
13421 }, {
13422 .eraseblocks = { {32 * 1024, 4} },
13423 .block_erase = spi_block_erase_52,
13424 }, {
13425 .eraseblocks = { {64 * 1024, 2} },
13426 .block_erase = spi_block_erase_d8,
13427 }, {
13428 .eraseblocks = { {128 * 1024, 1} },
13429 .block_erase = spi_block_erase_60,
13430 }, {
13431 .eraseblocks = { {128 * 1024, 1} },
13432 .block_erase = spi_block_erase_c7,
13433 }
13434 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013435 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013436 .unlock = spi_disable_blockprotect_bp3_srwd,
13437 .write = spi_chip_write_256,
13438 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13439 .voltage = {2700, 3600},
13440 },
13441
13442 {
13443 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013444 .name = "N25S16",
13445 .bustype = BUS_SPI,
13446 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13447 .model_id = NANTRONICS_N25S16,
13448 .total_size = 2048,
13449 .page_size = 256,
13450 .feature_bits = FEATURE_WRSR_WREN,
13451 .tested = TEST_UNTESTED,
13452 .probe = probe_spi_rdid,
13453 .probe_timing = TIMING_ZERO,
13454 .block_erasers =
13455 {
13456 {
13457 .eraseblocks = { {4 * 1024, 512} },
13458 .block_erase = spi_block_erase_20,
13459 }, {
13460 .eraseblocks = { {64 * 1024, 32} },
13461 .block_erase = spi_block_erase_d8,
13462 }, {
13463 .eraseblocks = { {2048 * 1024, 1} },
13464 .block_erase = spi_block_erase_60,
13465 }, {
13466 .eraseblocks = { {2048 * 1024, 1} },
13467 .block_erase = spi_block_erase_c7,
13468 }
13469 },
13470 .printlock = spi_prettyprint_status_register_bp3_srwd,
13471 .unlock = spi_disable_blockprotect_bp3_srwd,
13472 .write = spi_chip_write_256,
13473 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13474 .voltage = {2700, 3600},
13475 },
13476
13477 {
13478 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013479 .name = "N25S20",
13480 .bustype = BUS_SPI,
13481 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13482 .model_id = NANTRONICS_N25S20,
13483 .total_size = 256,
13484 .page_size = 256,
13485 .feature_bits = FEATURE_WRSR_WREN,
13486 .tested = TEST_UNTESTED,
13487 .probe = probe_spi_rdid,
13488 .probe_timing = TIMING_ZERO,
13489 .block_erasers =
13490 {
13491 {
13492 .eraseblocks = { {4 * 1024, 64} },
13493 .block_erase = spi_block_erase_20,
13494 }, {
13495 .eraseblocks = { {4 * 1024, 64} },
13496 .block_erase = spi_block_erase_d7,
13497 }, {
13498 .eraseblocks = { {32 * 1024, 8} },
13499 .block_erase = spi_block_erase_52,
13500 }, {
13501 .eraseblocks = { {64 * 1024, 4} },
13502 .block_erase = spi_block_erase_d8,
13503 }, {
13504 .eraseblocks = { {256 * 1024, 1} },
13505 .block_erase = spi_block_erase_60,
13506 }, {
13507 .eraseblocks = { {256 * 1024, 1} },
13508 .block_erase = spi_block_erase_c7,
13509 }
13510 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013511 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013512 .unlock = spi_disable_blockprotect_bp3_srwd,
13513 .write = spi_chip_write_256,
13514 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13515 .voltage = {2700, 3600},
13516 },
13517
13518 {
13519 .vendor = "Nantronics",
13520 .name = "N25S40",
13521 .bustype = BUS_SPI,
13522 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13523 .model_id = NANTRONICS_N25S40,
13524 .total_size = 512,
13525 .page_size = 256,
13526 .feature_bits = FEATURE_WRSR_WREN,
13527 .tested = TEST_UNTESTED,
13528 .probe = probe_spi_rdid,
13529 .probe_timing = TIMING_ZERO,
13530 .block_erasers =
13531 {
13532 {
13533 .eraseblocks = { {4 * 1024, 128} },
13534 .block_erase = spi_block_erase_20,
13535 }, {
13536 .eraseblocks = { {4 * 1024, 128} },
13537 .block_erase = spi_block_erase_d7,
13538 }, {
13539 .eraseblocks = { {32 * 1024, 16} },
13540 .block_erase = spi_block_erase_52,
13541 }, {
13542 .eraseblocks = { {64 * 1024, 8} },
13543 .block_erase = spi_block_erase_d8,
13544 }, {
13545 .eraseblocks = { {512 * 1024, 1} },
13546 .block_erase = spi_block_erase_60,
13547 }, {
13548 .eraseblocks = { {512 * 1024, 1} },
13549 .block_erase = spi_block_erase_c7,
13550 }
13551 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013552 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013553 .unlock = spi_disable_blockprotect_bp3_srwd,
13554 .write = spi_chip_write_256,
13555 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13556 .voltage = {2700, 3600},
13557 },
13558
13559 {
13560 .vendor = "Nantronics",
13561 .name = "N25S80",
13562 .bustype = BUS_SPI,
13563 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13564 .model_id = NANTRONICS_N25S80,
13565 .total_size = 1024,
13566 .page_size = 256,
13567 .feature_bits = FEATURE_WRSR_WREN,
13568 .tested = TEST_UNTESTED,
13569 .probe = probe_spi_rdid,
13570 .probe_timing = TIMING_ZERO,
13571 .block_erasers =
13572 {
13573 {
13574 .eraseblocks = { {4 * 1024, 256} },
13575 .block_erase = spi_block_erase_20,
13576 }, {
13577 .eraseblocks = { {32 * 1024, 32} },
13578 .block_erase = spi_block_erase_52,
13579 }, {
13580 .eraseblocks = { {64 * 1024, 16} },
13581 .block_erase = spi_block_erase_d8,
13582 }, {
13583 .eraseblocks = { {1024 * 1024, 1} },
13584 .block_erase = spi_block_erase_60,
13585 }, {
13586 .eraseblocks = { {1024 * 1024, 1} },
13587 .block_erase = spi_block_erase_c7,
13588 }
13589 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013590 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013591 .unlock = spi_disable_blockprotect_bp3_srwd,
13592 .write = spi_chip_write_256,
13593 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13594 .voltage = {2700, 3600},
13595 },
13596
13597 {
Stefan Taunerf4451612013-04-19 01:59:15 +000013598 .vendor = "PMC",
13599 .name = "Pm25LD010(C)",
13600 .bustype = BUS_SPI,
13601 .manufacture_id = PMC_ID,
13602 .model_id = PMC_PM25LD010,
13603 .total_size = 128,
13604 .page_size = 256,
13605 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013606 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013607 .probe = probe_spi_rdid,
13608 .probe_timing = TIMING_ZERO,
13609 .block_erasers =
13610 {
13611 {
13612 .eraseblocks = { {4 * 1024, 32} },
13613 .block_erase = spi_block_erase_20,
13614 }, {
13615 .eraseblocks = { {4 * 1024, 32} },
13616 .block_erase = spi_block_erase_d7,
13617 }, {
13618 .eraseblocks = { {32 * 1024, 4} },
13619 .block_erase = spi_block_erase_d8,
13620 }, {
13621 .eraseblocks = { {128 * 1024, 1} },
13622 .block_erase = spi_block_erase_60,
13623 }, {
13624 .eraseblocks = { {128 * 1024, 1} },
13625 .block_erase = spi_block_erase_c7,
13626 }
13627 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013628 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013629 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13630 .write = spi_chip_write_256,
13631 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13632 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
13633 },
13634
13635 {
13636 .vendor = "PMC",
13637 .name = "Pm25LD020(C)",
13638 .bustype = BUS_SPI,
13639 .manufacture_id = PMC_ID,
13640 .model_id = PMC_PM25LD020,
13641 .total_size = 256,
13642 .page_size = 256,
13643 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020013644 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013645 .probe = probe_spi_rdid,
13646 .probe_timing = TIMING_ZERO,
13647 .block_erasers =
13648 {
13649 {
13650 .eraseblocks = { {4 * 1024, 64} },
13651 .block_erase = spi_block_erase_20,
13652 }, {
13653 .eraseblocks = { {4 * 1024, 64} },
13654 .block_erase = spi_block_erase_d7,
13655 }, {
13656 .eraseblocks = { {64 * 1024, 4} },
13657 .block_erase = spi_block_erase_d8,
13658 }, {
13659 .eraseblocks = { {256 * 1024, 1} },
13660 .block_erase = spi_block_erase_60,
13661 }, {
13662 .eraseblocks = { {256 * 1024, 1} },
13663 .block_erase = spi_block_erase_c7,
13664 }
13665 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013666 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013667 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13668 .write = spi_chip_write_256,
13669 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13670 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
13671 },
13672
13673 {
13674 .vendor = "PMC",
13675 .name = "Pm25LD040(C)",
13676 .bustype = BUS_SPI,
13677 .manufacture_id = PMC_ID,
13678 .model_id = PMC_PM25LV040,
13679 .total_size = 512,
13680 .page_size = 256,
13681 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020013682 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013683 .probe = probe_spi_rdid,
13684 .probe_timing = TIMING_ZERO,
13685 .block_erasers =
13686 {
13687 {
13688 .eraseblocks = { {4 * 1024, 128} },
13689 .block_erase = spi_block_erase_20,
13690 }, {
13691 .eraseblocks = { {4 * 1024, 128} },
13692 .block_erase = spi_block_erase_d7,
13693 }, {
13694 .eraseblocks = { {64 * 1024, 8} },
13695 .block_erase = spi_block_erase_d8,
13696 }, {
13697 .eraseblocks = { {512 * 1024, 1} },
13698 .block_erase = spi_block_erase_60,
13699 }, {
13700 .eraseblocks = { {512 * 1024, 1} },
13701 .block_erase = spi_block_erase_c7,
13702 }
13703 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013704 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013705 .unlock = spi_disable_blockprotect,
13706 .write = spi_chip_write_256,
13707 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13708 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
13709 },
13710
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013711 {
13712 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013713 .name = "Pm25LD256C",
13714 .bustype = BUS_SPI,
13715 .manufacture_id = PMC_ID,
13716 .model_id = PMC_PM25LD256C,
13717 .total_size = 32,
13718 .page_size = 256,
13719 .feature_bits = FEATURE_WRSR_WREN,
13720 .tested = TEST_UNTESTED,
13721 .probe = probe_spi_rdid,
13722 .probe_timing = TIMING_ZERO,
13723 .block_erasers =
13724 {
13725 {
13726 .eraseblocks = { {4 * 1024, 8} },
13727 .block_erase = spi_block_erase_20,
13728 }, {
13729 .eraseblocks = { {4 * 1024, 8} },
13730 .block_erase = spi_block_erase_d7,
13731 }, {
13732 .eraseblocks = { {32 * 1024, 1} },
13733 .block_erase = spi_block_erase_d8,
13734 }, {
13735 .eraseblocks = { {32 * 1024, 1} },
13736 .block_erase = spi_block_erase_60,
13737 }, {
13738 .eraseblocks = { {32 * 1024, 1} },
13739 .block_erase = spi_block_erase_c7,
13740 }
13741 },
13742 .printlock = spi_prettyprint_status_register_bp2_srwd,
13743 .unlock = spi_disable_blockprotect,
13744 .write = spi_chip_write_256,
13745 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13746 .voltage = {2700, 3600},
13747 },
13748
13749 {
13750 .vendor = "PMC",
13751 .name = "Pm25LD512(C)",
13752 .bustype = BUS_SPI,
13753 .manufacture_id = PMC_ID,
13754 .model_id = PMC_PM25LD512,
13755 .total_size = 64,
13756 .page_size = 256,
13757 .feature_bits = FEATURE_WRSR_WREN,
13758 .tested = TEST_OK_PREW,
13759 .probe = probe_spi_rdid,
13760 .probe_timing = TIMING_ZERO,
13761 .block_erasers =
13762 {
13763 {
13764 .eraseblocks = { {4 * 1024, 16} },
13765 .block_erase = spi_block_erase_20,
13766 }, {
13767 .eraseblocks = { {4 * 1024, 16} },
13768 .block_erase = spi_block_erase_d7,
13769 }, {
13770 .eraseblocks = { {32 * 1024, 2} },
13771 .block_erase = spi_block_erase_d8,
13772 }, {
13773 .eraseblocks = { {64 * 1024, 1} },
13774 .block_erase = spi_block_erase_60,
13775 }, {
13776 .eraseblocks = { {64 * 1024, 1} },
13777 .block_erase = spi_block_erase_c7,
13778 }
13779 },
13780 .printlock = spi_prettyprint_status_register_bp2_srwd,
13781 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13782 .write = spi_chip_write_256,
13783 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13784 .voltage = {2300, 3600},
13785 },
13786
13787 {
13788 .vendor = "PMC",
13789 .name = "Pm25LQ016",
13790 .bustype = BUS_SPI,
13791 .manufacture_id = PMC_ID,
13792 .model_id = PMC_PM25LQ016,
13793 .total_size = 2048,
13794 .page_size = 256,
13795 /* OTP: 256B total; read 0x4B, write 0xB1 */
13796 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13797 .tested = TEST_UNTESTED,
13798 .probe = probe_spi_rdid,
13799 .probe_timing = TIMING_ZERO,
13800 .block_erasers =
13801 {
13802 {
13803 .eraseblocks = { {4 * 1024, 512} },
13804 .block_erase = spi_block_erase_20,
13805 }, {
13806 .eraseblocks = { {4 * 1024, 512} },
13807 .block_erase = spi_block_erase_d7,
13808 }, {
13809 .eraseblocks = { {64 * 1024, 32} },
13810 .block_erase = spi_block_erase_d8,
13811 }, {
13812 .eraseblocks = { {2048 * 1024, 1} },
13813 .block_erase = spi_block_erase_60,
13814 }, {
13815 .eraseblocks = { {2048 * 1024, 1} },
13816 .block_erase = spi_block_erase_c7,
13817 }
13818 },
13819 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13820 .unlock = spi_disable_blockprotect_bp3_srwd,
13821 .write = spi_chip_write_256,
13822 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13823 .voltage = {2300, 3600},
13824 },
13825
13826 {
13827 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013828 .name = "Pm25LQ020",
13829 .bustype = BUS_SPI,
13830 .manufacture_id = PMC_ID,
13831 .model_id = PMC_PM25LQ020,
13832 .total_size = 256,
13833 .page_size = 256,
13834 /* OTP: 256B total; read 0x4B, write 0xB1 */
13835 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13836 .tested = TEST_UNTESTED,
13837 .probe = probe_spi_rdid,
13838 .probe_timing = TIMING_ZERO,
13839 .block_erasers =
13840 {
13841 {
13842 .eraseblocks = { {4 * 1024, 64} },
13843 .block_erase = spi_block_erase_20,
13844 }, {
13845 .eraseblocks = { {4 * 1024, 64} },
13846 .block_erase = spi_block_erase_d7,
13847 }, {
13848 .eraseblocks = { {64 * 1024, 4} },
13849 .block_erase = spi_block_erase_d8,
13850 }, {
13851 .eraseblocks = { {256 * 1024, 1} },
13852 .block_erase = spi_block_erase_60,
13853 }, {
13854 .eraseblocks = { {256 * 1024, 1} },
13855 .block_erase = spi_block_erase_c7,
13856 }
13857 },
13858 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13859 .unlock = spi_disable_blockprotect_bp3_srwd,
13860 .write = spi_chip_write_256,
13861 .read = spi_chip_read,
13862 .voltage = {2300, 3600},
13863 },
13864
13865 {
13866 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013867 .name = "Pm25LQ032C",
13868 .bustype = BUS_SPI,
13869 .manufacture_id = PMC_ID,
13870 .model_id = PMC_PM25LQ032C,
13871 .total_size = 4096,
13872 .page_size = 256,
13873 /* OTP: 64B total; read 0x4B, write 0xB1 */
13874 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13875 .tested = TEST_OK_PREW,
13876 .probe = probe_spi_rdid,
13877 .probe_timing = TIMING_ZERO,
13878 .block_erasers =
13879 {
13880 {
13881 .eraseblocks = { {4 * 1024, 1024} },
13882 .block_erase = spi_block_erase_20,
13883 }, {
13884 .eraseblocks = { {4 * 1024, 1024} },
13885 .block_erase = spi_block_erase_d7,
13886 }, {
13887 .eraseblocks = { {64 * 1024, 64} },
13888 .block_erase = spi_block_erase_d8,
13889 }, {
13890 .eraseblocks = { {4096 * 1024, 1} },
13891 .block_erase = spi_block_erase_60,
13892 }, {
13893 .eraseblocks = { {4096 * 1024, 1} },
13894 .block_erase = spi_block_erase_c7,
13895 }
13896 },
13897 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13898 .unlock = spi_disable_blockprotect_bp3_srwd,
13899 .write = spi_chip_write_256,
13900 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13901 .voltage = {2700, 3600},
13902 },
13903
13904 {
13905 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013906 .name = "Pm25LQ040",
13907 .bustype = BUS_SPI,
13908 .manufacture_id = PMC_ID,
13909 .model_id = PMC_PM25LQ040,
13910 .total_size = 512,
13911 .page_size = 256,
13912 /* OTP: 256B total; read 0x4B, write 0xB1 */
13913 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13914 .tested = TEST_UNTESTED,
13915 .probe = probe_spi_rdid,
13916 .probe_timing = TIMING_ZERO,
13917 .block_erasers =
13918 {
13919 {
13920 .eraseblocks = { {4 * 1024, 128} },
13921 .block_erase = spi_block_erase_20,
13922 }, {
13923 .eraseblocks = { {4 * 1024, 128} },
13924 .block_erase = spi_block_erase_d7,
13925 }, {
13926 .eraseblocks = { {64 * 1024, 8} },
13927 .block_erase = spi_block_erase_d8,
13928 }, {
13929 .eraseblocks = { {512 * 1024, 1} },
13930 .block_erase = spi_block_erase_60,
13931 }, {
13932 .eraseblocks = { {512 * 1024, 1} },
13933 .block_erase = spi_block_erase_c7,
13934 }
13935 },
13936 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13937 .unlock = spi_disable_blockprotect_bp3_srwd,
13938 .write = spi_chip_write_256,
13939 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13940 .voltage = {2300, 3600},
13941 },
13942
13943 {
13944 .vendor = "PMC",
13945 .name = "Pm25LQ080",
13946 .bustype = BUS_SPI,
13947 .manufacture_id = PMC_ID,
13948 .model_id = PMC_PM25LQ080,
13949 .total_size = 1024,
13950 .page_size = 256,
13951 /* OTP: 64B total; read 0x4B, write 0xB1 */
13952 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13953 .tested = TEST_UNTESTED,
13954 .probe = probe_spi_rdid,
13955 .probe_timing = TIMING_ZERO,
13956 .block_erasers =
13957 {
13958 {
13959 .eraseblocks = { {4 * 1024, 256} },
13960 .block_erase = spi_block_erase_20,
13961 }, {
13962 .eraseblocks = { {4 * 1024, 256} },
13963 .block_erase = spi_block_erase_d7,
13964 }, {
13965 .eraseblocks = { {64 * 1024, 16} },
13966 .block_erase = spi_block_erase_d8,
13967 }, {
13968 .eraseblocks = { {1024 * 1024, 1} },
13969 .block_erase = spi_block_erase_60,
13970 }, {
13971 .eraseblocks = { {1024 * 1024, 1} },
13972 .block_erase = spi_block_erase_c7,
13973 }
13974 },
13975 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13976 .unlock = spi_disable_blockprotect_bp3_srwd,
13977 .write = spi_chip_write_256,
13978 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13979 .voltage = {2300, 3600},
13980 },
13981
13982 {
13983 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013984 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013985 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000013986 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013987 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013988 .total_size = 128,
13989 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013990 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000013991 .tested = TEST_OK_PREW,
13992 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013993 .probe_timing = TIMING_ZERO,
13994 .block_erasers =
13995 {
13996 {
13997 .eraseblocks = { {4 * 1024, 32} },
13998 .block_erase = spi_block_erase_d7,
13999 }, {
14000 .eraseblocks = { {32 * 1024, 4} },
14001 .block_erase = spi_block_erase_d8,
14002 }, {
14003 .eraseblocks = { {128 * 1024, 1} },
14004 .block_erase = spi_block_erase_c7,
14005 }
14006 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000014007 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000014008 .unlock = spi_disable_blockprotect,
14009 .write = spi_chip_write_256,
14010 .read = spi_chip_read, /* Fast read (0x0B) supported */
14011 .voltage = {2700, 3600},
14012 },
14013
14014 {
14015 .vendor = "PMC",
14016 .name = "Pm25LV010A",
14017 .bustype = BUS_SPI,
14018 .manufacture_id = PMC_ID,
14019 .model_id = PMC_PM25LV010,
14020 .total_size = 128,
14021 .page_size = 256,
14022 .feature_bits = FEATURE_WRSR_WREN,
14023 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014024 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014025 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014026 .block_erasers =
14027 {
14028 {
14029 .eraseblocks = { {4 * 1024, 32} },
14030 .block_erase = spi_block_erase_d7,
14031 }, {
14032 .eraseblocks = { {32 * 1024, 4} },
14033 .block_erase = spi_block_erase_d8,
14034 }, {
14035 .eraseblocks = { {128 * 1024, 1} },
14036 .block_erase = spi_block_erase_c7,
14037 }
14038 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000014039 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014040 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014041 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000014042 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000014043 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014044 },
14045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014046 {
14047 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014048 .name = "Pm25LV016B",
14049 .bustype = BUS_SPI,
14050 .manufacture_id = PMC_ID,
14051 .model_id = PMC_PM25LV016B,
14052 .total_size = 2048,
14053 .page_size = 256,
14054 .feature_bits = FEATURE_WRSR_WREN,
14055 .tested = TEST_UNTESTED,
14056 .probe = probe_spi_rdid,
14057 .probe_timing = TIMING_ZERO,
14058 .block_erasers =
14059 {
14060 {
14061 .eraseblocks = { {4 * 1024, 512} },
14062 .block_erase = spi_block_erase_d7,
14063 }, {
14064 .eraseblocks = { {4 * 1024, 512} },
14065 .block_erase = spi_block_erase_20,
14066 }, {
14067 .eraseblocks = { {64 * 1024, 32} },
14068 .block_erase = spi_block_erase_d8,
14069 }, {
14070 .eraseblocks = { {2 * 1024 * 1024, 1} },
14071 .block_erase = spi_block_erase_60,
14072 }, {
14073 .eraseblocks = { {2 * 1024 * 1024, 1} },
14074 .block_erase = spi_block_erase_c7,
14075 }
14076 },
14077 .printlock = spi_prettyprint_status_register_bp2_srwd,
14078 .unlock = spi_disable_blockprotect,
14079 .write = spi_chip_write_256,
14080 .read = spi_chip_read, /* Fast read (0x0B) supported */
14081 .voltage = {2700, 3600},
14082 },
14083
14084 {
14085 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014086 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014087 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014088 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014089 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014090 .total_size = 256,
14091 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014092 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014093 .tested = TEST_UNTESTED,
14094 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014095 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014096 .block_erasers =
14097 {
14098 {
14099 .eraseblocks = { {4 * 1024, 64} },
14100 .block_erase = spi_block_erase_d7,
14101 }, {
14102 .eraseblocks = { {64 * 1024, 4} },
14103 .block_erase = spi_block_erase_d8,
14104 }, {
14105 .eraseblocks = { {256 * 1024, 1} },
14106 .block_erase = spi_block_erase_c7,
14107 }
14108 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000014109 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014110 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014111 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014112 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014113 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014114 },
14115
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014116 {
14117 .vendor = "PMC",
14118 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014119 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014120 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014121 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014122 .total_size = 512,
14123 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014124 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000014125 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014126 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014127 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014128 .block_erasers =
14129 {
14130 {
14131 .eraseblocks = { {4 * 1024, 128} },
14132 .block_erase = spi_block_erase_d7,
14133 }, {
14134 .eraseblocks = { {64 * 1024, 8} },
14135 .block_erase = spi_block_erase_d8,
14136 }, {
14137 .eraseblocks = { {512 * 1024, 1} },
14138 .block_erase = spi_block_erase_c7,
14139 }
14140 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000014141 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014142 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014143 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000014144 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014145 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014146 },
14147
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014148 {
14149 .vendor = "PMC",
14150 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014151 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014152 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014153 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014154 .total_size = 1024,
14155 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014156 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014157 .tested = TEST_UNTESTED,
14158 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014159 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014160 .block_erasers =
14161 {
14162 {
14163 .eraseblocks = { {4 * 1024, 256} },
14164 .block_erase = spi_block_erase_d7,
14165 }, {
14166 .eraseblocks = { {4 * 1024, 256} },
14167 .block_erase = spi_block_erase_20,
14168 }, {
14169 .eraseblocks = { {64 * 1024, 16} },
14170 .block_erase = spi_block_erase_d8,
14171 }, {
14172 .eraseblocks = { {1024 * 1024, 1} },
14173 .block_erase = spi_block_erase_60,
14174 }, {
14175 .eraseblocks = { {1024 * 1024, 1} },
14176 .block_erase = spi_block_erase_c7,
14177 }
14178 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000014179 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014180 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014181 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000014182 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014183 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014184 },
14185
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014186 {
14187 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014188 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014189 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014190 .manufacture_id = PMC_ID_NOPREFIX,
14191 .model_id = PMC_PM25LV512,
14192 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014193 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014194 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014195 .tested = TEST_OK_PREW,
14196 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014197 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014198 .block_erasers =
14199 {
14200 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014201 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000014202 .block_erase = spi_block_erase_d7,
14203 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014204 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000014205 .block_erase = spi_block_erase_d8,
14206 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014207 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000014208 .block_erase = spi_block_erase_c7,
14209 }
14210 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014211 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014212 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014213 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000014214 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000014215 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014216 },
14217
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014218 {
14219 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000014220 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014221 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000014222 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014223 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000014224 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000014225 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014226 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000014227 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014228 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000014229 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000014230 .block_erasers =
14231 {
14232 {
14233 .eraseblocks = {
14234 {16 * 1024, 1},
14235 {8 * 1024, 2},
14236 {96 * 1024, 1},
14237 {128 * 1024, 1},
14238 },
Sean Nelson35727f72010-01-28 23:55:12 +000014239 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000014240 }, {
14241 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000014242 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000014243 },
14244 },
Sean Nelson35727f72010-01-28 23:55:12 +000014245 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000014246 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014247 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014248 .prepare_access = prepare_memory_access,
14249 .finish_access = finish_memory_access,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000014250 },
14251
14252 {
14253 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014254 .name = "Pm29F002T",
14255 .bustype = BUS_PARALLEL,
14256 .manufacture_id = PMC_ID_NOPREFIX,
14257 .model_id = PMC_PM29F002T,
14258 .total_size = 256,
14259 .page_size = 8 * 1024,
14260 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14261 .tested = TEST_OK_PREW,
14262 .probe = probe_jedec,
14263 .probe_timing = TIMING_FIXME,
14264 .block_erasers =
14265 {
14266 {
14267 .eraseblocks = {
14268 {128 * 1024, 1},
14269 {96 * 1024, 1},
14270 {8 * 1024, 2},
14271 {16 * 1024, 1},
14272 },
14273 .block_erase = erase_sector_jedec,
14274 }, {
14275 .eraseblocks = { {256 * 1024, 1} },
14276 .block_erase = erase_chip_block_jedec,
14277 },
14278 },
14279 .write = write_jedec_1,
14280 .read = read_memmapped,
14281 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014282 .prepare_access = prepare_memory_access,
14283 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014284 },
14285
14286 {
14287 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014288 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014289 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014290 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014291 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014292 .total_size = 128,
14293 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014294 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014295 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014296 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014297 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000014298 .block_erasers =
14299 {
14300 {
14301 .eraseblocks = { {4 * 1024, 32} },
14302 .block_erase = erase_sector_jedec,
14303 }, {
14304 .eraseblocks = { {64 * 1024, 2} },
14305 .block_erase = erase_block_jedec,
14306 }, {
14307 .eraseblocks = { {128 * 1024, 1} },
14308 .block_erase = erase_chip_block_jedec,
14309 }
14310 },
Sean Nelson35727f72010-01-28 23:55:12 +000014311 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014312 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014313 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014314 .prepare_access = prepare_memory_access,
14315 .finish_access = finish_memory_access,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000014316 },
14317
14318 {
14319 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014320 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014321 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014322 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014323 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014324 .total_size = 256,
14325 .page_size = 4096,
14326 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14327 .tested = TEST_UNTESTED,
14328 .probe = probe_jedec,
14329 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100014330 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014331 {
14332 {
14333 .eraseblocks = { {4 * 1024, 64} },
14334 .block_erase = erase_sector_jedec,
14335 }, {
14336 .eraseblocks = { {64 * 1024, 4} },
14337 .block_erase = erase_block_jedec,
14338 }, {
14339 .eraseblocks = { {256 * 1024, 1} },
14340 .block_erase = erase_chip_block_jedec,
14341 }
14342 },
14343 .write = write_jedec_1,
14344 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014345 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014346 .prepare_access = prepare_memory_access,
14347 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014348 },
14349
14350 {
14351 .vendor = "PMC",
14352 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014353 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014354 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014355 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014356 .total_size = 512,
14357 .page_size = 4096,
14358 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014359 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014360 .probe = probe_jedec,
14361 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100014362 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014363 {
14364 {
14365 .eraseblocks = { {4 * 1024, 128} },
14366 .block_erase = erase_sector_jedec,
14367 }, {
14368 .eraseblocks = { {64 * 1024, 8} },
14369 .block_erase = erase_block_jedec,
14370 }, {
14371 .eraseblocks = { {512 * 1024, 1} },
14372 .block_erase = erase_chip_block_jedec,
14373 }
14374 },
14375 .write = write_jedec_1,
14376 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014377 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014378 .prepare_access = prepare_memory_access,
14379 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014380 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000014381
14382 {
14383 .vendor = "PMC",
14384 .name = "Pm39LV512",
14385 .bustype = BUS_PARALLEL,
14386 .manufacture_id = PMC_ID_NOPREFIX,
14387 .model_id = PMC_PM39LV512,
14388 .total_size = 64,
14389 .page_size = 4096,
14390 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14391 .tested = TEST_OK_PREW,
14392 .probe = probe_jedec,
14393 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14394 .block_erasers =
14395 {
14396 {
14397 .eraseblocks = { {4 * 1024, 16} },
14398 .block_erase = erase_sector_jedec,
14399 }, {
14400 .eraseblocks = { {64 * 1024, 1} },
14401 .block_erase = erase_block_jedec,
14402 }, {
14403 .eraseblocks = { {64 * 1024, 1} },
14404 .block_erase = erase_chip_block_jedec,
14405 }
14406 },
14407 .write = write_jedec_1,
14408 .read = read_memmapped,
14409 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014410 .prepare_access = prepare_memory_access,
14411 .finish_access = finish_memory_access,
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000014412 },
14413
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000014414 {
14415 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014416 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014417 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014418 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014419 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014420 .total_size = 256,
14421 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010014422 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014423 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014424 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014425 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000014426 .block_erasers =
14427 {
14428 {
14429 .eraseblocks = { {4 * 1024, 64} },
14430 .block_erase = erase_sector_jedec,
14431 }, {
14432 .eraseblocks = { {16 * 1024, 16} },
14433 .block_erase = erase_block_jedec,
14434 }, {
14435 .eraseblocks = { {256 * 1024, 1} },
14436 .block_erase = erase_chip_block_jedec,
14437 }
14438 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014439 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000014440 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014441 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014442 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010014443 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010014444 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014445 },
14446
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014447 {
14448 .vendor = "PMC",
14449 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014450 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014451 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014452 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014453 .total_size = 512,
14454 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010014455 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000014456 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014457 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000014458 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014459 .block_erasers =
14460 {
14461 {
14462 .eraseblocks = { {4 * 1024, 128} },
14463 .block_erase = erase_sector_jedec,
14464 }, {
14465 .eraseblocks = { {64 * 1024, 8} },
14466 .block_erase = erase_block_jedec,
14467 }, {
14468 .eraseblocks = { {512 * 1024, 1} },
14469 .block_erase = erase_chip_block_jedec,
14470 }
14471 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014472 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000014473 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014474 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014475 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010014476 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010014477 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014478 },
14479
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014480 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014481 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000014482 .name = "SST25LF020A",
14483 .bustype = BUS_SPI,
14484 .manufacture_id = SST_ID,
14485 .model_id = SST_SST25VF020_REMS,
14486 .total_size = 256,
14487 .page_size = 256,
14488 .feature_bits = FEATURE_WRSR_EWSR,
14489 .tested = TEST_OK_PREW,
14490 .probe = probe_spi_rems,
14491 .probe_timing = TIMING_ZERO,
14492 .block_erasers =
14493 {
14494 {
14495 .eraseblocks = { {4 * 1024, 64} },
14496 .block_erase = spi_block_erase_20,
14497 }, {
14498 .eraseblocks = { {32 * 1024, 8} },
14499 .block_erase = spi_block_erase_52,
14500 }, {
14501 .eraseblocks = { {256 * 1024, 1} },
14502 .block_erase = spi_block_erase_60,
14503 },
14504 },
14505 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14506 .unlock = spi_disable_blockprotect,
14507 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14508 .read = spi_chip_read, /* Fast read (0x0B) supported */
14509 .voltage = {2700, 3600},
14510 },
14511
14512 {
14513 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000014514 .name = "SST25LF040A",
14515 .bustype = BUS_SPI,
14516 .manufacture_id = SST_ID,
14517 .model_id = SST_SST25VF040_REMS,
14518 .total_size = 512,
14519 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014520 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000014521 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000014522 .probe = probe_spi_res2,
14523 .probe_timing = TIMING_ZERO,
14524 .block_erasers =
14525 {
14526 {
14527 .eraseblocks = { {4 * 1024, 128} },
14528 .block_erase = spi_block_erase_20,
14529 }, {
14530 .eraseblocks = { {32 * 1024, 16} },
14531 .block_erase = spi_block_erase_52,
14532 }, {
14533 .eraseblocks = { {512 * 1024, 1} },
14534 .block_erase = spi_block_erase_60,
14535 },
14536 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014537 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000014538 .unlock = spi_disable_blockprotect,
14539 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14540 .read = spi_chip_read,
14541 .voltage = {3000, 3600},
14542 },
14543
14544 {
14545 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000014546 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000014547 .bustype = BUS_SPI,
14548 .manufacture_id = SST_ID,
14549 .model_id = SST_SST25VF080_REMS,
14550 .total_size = 1024,
14551 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014552 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000014553 .tested = TEST_UNTESTED,
14554 .probe = probe_spi_res2,
14555 .probe_timing = TIMING_ZERO,
14556 .block_erasers =
14557 {
14558 {
14559 .eraseblocks = { {4 * 1024, 256} },
14560 .block_erase = spi_block_erase_20,
14561 }, {
14562 .eraseblocks = { {32 * 1024, 32} },
14563 .block_erase = spi_block_erase_52,
14564 }, {
14565 .eraseblocks = { {1024 * 1024, 1} },
14566 .block_erase = spi_block_erase_60,
14567 },
14568 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014569 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000014570 .unlock = spi_disable_blockprotect,
14571 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14572 .read = spi_chip_read,
14573 .voltage = {3000, 3600},
14574 },
14575
14576 {
14577 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000014578 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014579 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000014580 .manufacture_id = SST_ID,
14581 .model_id = SST_SST25VF010_REMS,
14582 .total_size = 128,
14583 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014584 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000014585 .tested = TEST_OK_PREW,
14586 .probe = probe_spi_rems,
14587 .probe_timing = TIMING_ZERO,
14588 .block_erasers =
14589 {
14590 {
14591 .eraseblocks = { {4 * 1024, 32} },
14592 .block_erase = spi_block_erase_20,
14593 }, {
14594 .eraseblocks = { {32 * 1024, 4} },
14595 .block_erase = spi_block_erase_52,
14596 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000014597 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014598 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014599 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000014600 .eraseblocks = { {128 * 1024, 1} },
14601 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000014602 }, {
14603 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014604 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014605 },
14606 },
14607 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14608 .unlock = spi_disable_blockprotect,
14609 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000014610 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014611 .voltage = {2700, 3600},
14612 },
14613
14614 {
14615 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014616 .name = "SST25VF016B",
14617 .bustype = BUS_SPI,
14618 .manufacture_id = SST_ID,
14619 .model_id = SST_SST25VF016B,
14620 .total_size = 2048,
14621 .page_size = 256,
14622 .feature_bits = FEATURE_WRSR_EITHER,
14623 .tested = TEST_OK_PREW,
14624 .probe = probe_spi_rdid,
14625 .probe_timing = TIMING_ZERO,
14626 .block_erasers =
14627 {
14628 {
14629 .eraseblocks = { {4 * 1024, 512} },
14630 .block_erase = spi_block_erase_20,
14631 }, {
14632 .eraseblocks = { {32 * 1024, 64} },
14633 .block_erase = spi_block_erase_52,
14634 }, {
14635 .eraseblocks = { {64 * 1024, 32} },
14636 .block_erase = spi_block_erase_d8,
14637 }, {
14638 .eraseblocks = { {2 * 1024 * 1024, 1} },
14639 .block_erase = spi_block_erase_60,
14640 }, {
14641 .eraseblocks = { {2 * 1024 * 1024, 1} },
14642 .block_erase = spi_block_erase_c7,
14643 },
14644 },
14645 .printlock = spi_prettyprint_status_register_sst25vf016,
14646 .unlock = spi_disable_blockprotect,
14647 .write = spi_aai_write,
14648 .read = spi_chip_read,
14649 .voltage = {2700, 3600},
14650 },
14651
14652 {
14653 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014654 .name = "SST25VF020",
14655 .bustype = BUS_SPI,
14656 .manufacture_id = SST_ID,
14657 .model_id = SST_SST25VF020_REMS,
14658 .total_size = 256,
14659 .page_size = 256,
14660 .feature_bits = FEATURE_WRSR_EWSR,
14661 .tested = TEST_UNTESTED,
14662 .probe = probe_spi_rems,
14663 .probe_timing = TIMING_ZERO,
14664 .block_erasers =
14665 {
14666 {
14667 .eraseblocks = { {4 * 1024, 64} },
14668 .block_erase = spi_block_erase_20,
14669 }, {
14670 .eraseblocks = { {32 * 1024, 8} },
14671 .block_erase = spi_block_erase_52,
14672 }, {
14673 .eraseblocks = { {256 * 1024, 1} },
14674 .block_erase = spi_block_erase_60,
14675 },
14676 },
14677 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14678 .unlock = spi_disable_blockprotect,
14679 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14680 .read = spi_chip_read, /* only */
14681 .voltage = {2700, 3600},
14682 },
14683
14684 {
14685 .vendor = "SST",
14686 .name = "SST25VF020B",
14687 .bustype = BUS_SPI,
14688 .manufacture_id = SST_ID,
14689 .model_id = SST_SST25VF020B,
14690 .total_size = 256,
14691 .page_size = 256,
14692 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014693 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000014694 .probe = probe_spi_rdid,
14695 .probe_timing = TIMING_ZERO,
14696 .block_erasers =
14697 {
14698 {
14699 .eraseblocks = { {4 * 1024, 64} },
14700 .block_erase = spi_block_erase_20,
14701 }, {
14702 .eraseblocks = { {32 * 1024, 8} },
14703 .block_erase = spi_block_erase_52,
14704 }, {
14705 .eraseblocks = { {64 * 1024, 4} },
14706 .block_erase = spi_block_erase_d8,
14707 }, {
14708 .eraseblocks = { {256 * 1024, 1} },
14709 .block_erase = spi_block_erase_60,
14710 }, {
14711 .eraseblocks = { {256 * 1024, 1} },
14712 .block_erase = spi_block_erase_c7,
14713 },
14714 },
14715 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
14716 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
14717 .write = spi_aai_write, /* AAI supported (0xAD) */
14718 .read = spi_chip_read, /* Fast read (0x0B) supported */
14719 .voltage = {2700, 3600},
14720 },
14721
14722 {
14723 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014724 .name = "SST25VF032B",
14725 .bustype = BUS_SPI,
14726 .manufacture_id = SST_ID,
14727 .model_id = SST_SST25VF032B,
14728 .total_size = 4096,
14729 .page_size = 256,
14730 .feature_bits = FEATURE_WRSR_EWSR,
14731 .tested = TEST_OK_PREW,
14732 .probe = probe_spi_rdid,
14733 .probe_timing = TIMING_ZERO,
14734 .block_erasers =
14735 {
14736 {
14737 .eraseblocks = { {4 * 1024, 1024} },
14738 .block_erase = spi_block_erase_20,
14739 }, {
14740 .eraseblocks = { {32 * 1024, 128} },
14741 .block_erase = spi_block_erase_52,
14742 }, {
14743 .eraseblocks = { {64 * 1024, 64} },
14744 .block_erase = spi_block_erase_d8,
14745 }, {
14746 .eraseblocks = { {4 * 1024 * 1024, 1} },
14747 .block_erase = spi_block_erase_60,
14748 }, {
14749 .eraseblocks = { {4 * 1024 * 1024, 1} },
14750 .block_erase = spi_block_erase_c7,
14751 },
14752 },
14753 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14754 .unlock = spi_disable_blockprotect,
14755 .write = spi_aai_write,
14756 .read = spi_chip_read,
14757 .voltage = {2700, 3600},
14758 },
14759
14760 {
14761 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014762 .name = "SST25VF040",
14763 .bustype = BUS_SPI,
14764 .manufacture_id = SST_ID,
14765 .model_id = SST_SST25VF040_REMS,
14766 .total_size = 512,
14767 .page_size = 256,
14768 .feature_bits = FEATURE_WRSR_EWSR,
14769 .tested = TEST_OK_PR,
14770 .probe = probe_spi_rems,
14771 .probe_timing = TIMING_ZERO,
14772 .block_erasers =
14773 {
14774 {
14775 .eraseblocks = { {4 * 1024, 128} },
14776 .block_erase = spi_block_erase_20,
14777 }, {
14778 .eraseblocks = { {32 * 1024, 16} },
14779 .block_erase = spi_block_erase_52,
14780 }, {
14781 .eraseblocks = { {512 * 1024, 1} },
14782 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000014783 },
14784 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014785 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000014786 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000014787 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14788 .read = spi_chip_read,
14789 .voltage = {2700, 3600},
14790 },
14791
14792 {
14793 .vendor = "SST",
14794 .name = "SST25VF040B",
14795 .bustype = BUS_SPI,
14796 .manufacture_id = SST_ID,
14797 .model_id = SST_SST25VF040B,
14798 .total_size = 512,
14799 .page_size = 256,
14800 .feature_bits = FEATURE_WRSR_EWSR,
14801 .tested = TEST_OK_PREW,
14802 .probe = probe_spi_rdid,
14803 .probe_timing = TIMING_ZERO,
14804 .block_erasers =
14805 {
14806 {
14807 .eraseblocks = { {4 * 1024, 128} },
14808 .block_erase = spi_block_erase_20,
14809 }, {
14810 .eraseblocks = { {32 * 1024, 16} },
14811 .block_erase = spi_block_erase_52,
14812 }, {
14813 .eraseblocks = { {64 * 1024, 8} },
14814 .block_erase = spi_block_erase_d8,
14815 }, {
14816 .eraseblocks = { {512 * 1024, 1} },
14817 .block_erase = spi_block_erase_60,
14818 }, {
14819 .eraseblocks = { {512 * 1024, 1} },
14820 .block_erase = spi_block_erase_c7,
14821 },
14822 },
14823 .printlock = spi_prettyprint_status_register_sst25vf040b,
14824 .unlock = spi_disable_blockprotect,
14825 .write = spi_aai_write, /* AAI supported (0xAD) */
14826 .read = spi_chip_read, /* Fast read (0x0B) supported */
14827 .voltage = {2700, 3600},
14828 },
14829
14830 {
14831 .vendor = "SST",
14832 .name = "SST25VF040B.REMS",
14833 .bustype = BUS_SPI,
14834 .manufacture_id = SST_ID,
14835 .model_id = SST_SST25VF040B_REMS,
14836 .total_size = 512,
14837 .page_size = 256,
14838 .feature_bits = FEATURE_WRSR_EWSR,
14839 .tested = TEST_OK_PREW,
14840 .probe = probe_spi_rems,
14841 .probe_timing = TIMING_ZERO,
14842 .block_erasers =
14843 {
14844 {
14845 .eraseblocks = { {4 * 1024, 128} },
14846 .block_erase = spi_block_erase_20,
14847 }, {
14848 .eraseblocks = { {32 * 1024, 16} },
14849 .block_erase = spi_block_erase_52,
14850 }, {
14851 .eraseblocks = { {64 * 1024, 8} },
14852 .block_erase = spi_block_erase_d8,
14853 }, {
14854 .eraseblocks = { {512 * 1024, 1} },
14855 .block_erase = spi_block_erase_60,
14856 }, {
14857 .eraseblocks = { {512 * 1024, 1} },
14858 .block_erase = spi_block_erase_c7,
14859 },
14860 },
14861 .printlock = spi_prettyprint_status_register_sst25vf040b,
14862 .unlock = spi_disable_blockprotect,
14863 .write = spi_aai_write,
14864 .read = spi_chip_read,
14865 .voltage = {2700, 3600},
14866 },
14867
14868 {
14869 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014870 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000014871 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014872 .manufacture_id = SST_ID,
14873 .model_id = SST_SST25VF064C,
14874 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014875 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014876 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014877 .tested = TEST_OK_PREW,
14878 .probe = probe_spi_rdid,
14879 .probe_timing = TIMING_ZERO,
14880 .block_erasers =
14881 {
14882 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014883 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014884 .block_erase = spi_block_erase_20,
14885 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014886 .eraseblocks = { {32 * 1024, 256} },
14887 .block_erase = spi_block_erase_52,
14888 }, {
14889 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014890 .block_erase = spi_block_erase_d8,
14891 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014892 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014893 .block_erase = spi_block_erase_60,
14894 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014895 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014896 .block_erase = spi_block_erase_c7,
14897 },
14898 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014899 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14900 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014901 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014902 .read = spi_chip_read,
14903 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000014904 },
14905
14906 {
14907 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014908 .name = "SST25VF080B",
14909 .bustype = BUS_SPI,
14910 .manufacture_id = SST_ID,
14911 .model_id = SST_SST25VF080B,
14912 .total_size = 1024,
14913 .page_size = 256,
14914 .feature_bits = FEATURE_WRSR_EWSR,
14915 .tested = TEST_OK_PREW,
14916 .probe = probe_spi_rdid,
14917 .probe_timing = TIMING_ZERO,
14918 .block_erasers =
14919 {
14920 {
14921 .eraseblocks = { {4 * 1024, 256} },
14922 .block_erase = spi_block_erase_20,
14923 }, {
14924 .eraseblocks = { {32 * 1024, 32} },
14925 .block_erase = spi_block_erase_52,
14926 }, {
14927 .eraseblocks = { {64 * 1024, 16} },
14928 .block_erase = spi_block_erase_d8,
14929 }, {
14930 .eraseblocks = { {1024 * 1024, 1} },
14931 .block_erase = spi_block_erase_60,
14932 }, {
14933 .eraseblocks = { {1024 * 1024, 1} },
14934 .block_erase = spi_block_erase_c7,
14935 },
14936 },
14937 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14938 .unlock = spi_disable_blockprotect,
14939 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000014940 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014941 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000014942 },
14943
14944 {
14945 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014946 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014947 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014948 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014949 .model_id = SST_SST25VF512_REMS,
14950 .total_size = 64,
14951 .page_size = 256,
14952 .feature_bits = FEATURE_WRSR_EWSR,
14953 .tested = TEST_OK_PREW,
14954 .probe = probe_spi_rems,
14955 .probe_timing = TIMING_ZERO,
14956 .block_erasers =
14957 {
14958 {
14959 .eraseblocks = { {4 * 1024, 16} },
14960 .block_erase = spi_block_erase_20,
14961 }, {
14962 .eraseblocks = { {32 * 1024, 2} },
14963 .block_erase = spi_block_erase_52,
14964 }, {
14965 .eraseblocks = { {32 * 1024, 2} },
14966 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
14967 }, {
14968 .eraseblocks = { {64 * 1024, 1} },
14969 .block_erase = spi_block_erase_60,
14970 }, {
14971 .eraseblocks = { {64 * 1024, 1} },
14972 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
14973 },
14974 },
14975 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14976 .unlock = spi_disable_blockprotect,
14977 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14978 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
14979 .voltage = {2700, 3600},
14980 },
14981
14982 {
14983 .vendor = "SST",
14984 .name = "SST25WF010",
14985 .bustype = BUS_SPI,
14986 .manufacture_id = SST_ID,
14987 .model_id = SST_SST25WF010,
14988 .total_size = 128,
14989 .page_size = 256,
14990 .feature_bits = FEATURE_WRSR_EITHER,
14991 .tested = TEST_UNTESTED,
14992 .probe = probe_spi_rdid,
14993 .probe_timing = TIMING_ZERO,
14994 .block_erasers =
14995 {
14996 {
14997 .eraseblocks = { {4 * 1024, 32} },
14998 .block_erase = spi_block_erase_20,
14999 }, {
15000 .eraseblocks = { {32 * 1024, 4} },
15001 .block_erase = spi_block_erase_52,
15002 }, {
15003 .eraseblocks = { {1024 * 128, 1} },
15004 .block_erase = spi_block_erase_60,
15005 }, {
15006 .eraseblocks = { {1024 * 128, 1} },
15007 .block_erase = spi_block_erase_c7,
15008 },
15009 },
15010 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
15011 .unlock = spi_disable_blockprotect_bp2_srwd,
15012 .write = spi_aai_write,
15013 .read = spi_chip_read, /* Fast read (0x0B) supported */
15014 .voltage = {1650, 1950},
15015 },
15016
15017 {
15018 .vendor = "SST",
15019 .name = "SST25WF020",
15020 .bustype = BUS_SPI,
15021 .manufacture_id = SST_ID,
15022 .model_id = SST_SST25WF020,
15023 .total_size = 256,
15024 .page_size = 256,
15025 .feature_bits = FEATURE_WRSR_EITHER,
15026 .tested = TEST_UNTESTED,
15027 .probe = probe_spi_rdid,
15028 .probe_timing = TIMING_ZERO,
15029 .block_erasers =
15030 {
15031 {
15032 .eraseblocks = { {4 * 1024, 64} },
15033 .block_erase = spi_block_erase_20,
15034 }, {
15035 .eraseblocks = { {32 * 1024, 8} },
15036 .block_erase = spi_block_erase_52,
15037 }, {
15038 .eraseblocks = { {64 * 1024, 4} },
15039 .block_erase = spi_block_erase_d8,
15040 }, {
15041 .eraseblocks = { {1024 * 256, 1} },
15042 .block_erase = spi_block_erase_60,
15043 }, {
15044 .eraseblocks = { {1024 * 256, 1} },
15045 .block_erase = spi_block_erase_c7,
15046 },
15047 },
15048 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
15049 .unlock = spi_disable_blockprotect_bp2_srwd,
15050 .write = spi_aai_write,
15051 .read = spi_chip_read, /* Fast read (0x0B) supported */
15052 .voltage = {1650, 1950},
15053 },
15054
15055 {
15056 .vendor = "SST",
15057 .name = "SST25WF020A",
15058 .bustype = BUS_SPI,
15059 .manufacture_id = SANYO_ID, /* See flashchips.h */
15060 .model_id = SST_SST25WF020A,
15061 .total_size = 256,
15062 .page_size = 256,
15063 .feature_bits = FEATURE_WRSR_WREN,
15064 .tested = TEST_UNTESTED,
15065 .probe = probe_spi_rdid,
15066 .probe_timing = TIMING_ZERO,
15067 .block_erasers =
15068 {
15069 {
15070 .eraseblocks = { {4 * 1024, 64} },
15071 .block_erase = spi_block_erase_20,
15072 }, {
15073 .eraseblocks = { {64 * 1024, 4} },
15074 .block_erase = spi_block_erase_d8,
15075 }, {
15076 .eraseblocks = { {256 * 1024, 1} },
15077 .block_erase = spi_block_erase_60,
15078 }, {
15079 .eraseblocks = { {256 * 1024, 1} },
15080 .block_erase = spi_block_erase_c7,
15081 },
15082 },
15083 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
15084 .unlock = spi_disable_blockprotect_bp2_srwd,
15085 .write = spi_chip_write_256,
15086 .read = spi_chip_read, /* Fast read (0x0B) supported */
15087 .voltage = {1650, 1950},
15088 },
15089
15090 {
15091 .vendor = "SST",
15092 .name = "SST25WF040",
15093 .bustype = BUS_SPI,
15094 .manufacture_id = SST_ID,
15095 .model_id = SST_SST25WF040,
15096 .total_size = 512,
15097 .page_size = 256,
15098 .feature_bits = FEATURE_WRSR_EITHER,
15099 .tested = TEST_UNTESTED,
15100 .probe = probe_spi_rdid,
15101 .probe_timing = TIMING_ZERO,
15102 .block_erasers =
15103 {
15104 {
15105 .eraseblocks = { {4 * 1024, 128} },
15106 .block_erase = spi_block_erase_20,
15107 }, {
15108 .eraseblocks = { {32 * 1024, 16} },
15109 .block_erase = spi_block_erase_52,
15110 }, {
15111 .eraseblocks = { {64 * 1024, 8} },
15112 .block_erase = spi_block_erase_d8,
15113 }, {
15114 .eraseblocks = { {1024 * 512, 1} },
15115 .block_erase = spi_block_erase_60,
15116 }, {
15117 .eraseblocks = { {1024 * 512, 1} },
15118 .block_erase = spi_block_erase_c7,
15119 },
15120 },
15121 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
15122 .unlock = spi_disable_blockprotect_bp2_srwd,
15123 .write = spi_aai_write,
15124 .read = spi_chip_read, /* Fast read (0x0B) supported */
15125 .voltage = {1650, 1950},
15126 },
15127
15128 {
15129 .vendor = "SST",
15130 .name = "SST25WF040B",
15131 .bustype = BUS_SPI,
15132 .manufacture_id = SANYO_ID, /* See flashchips.h */
15133 .model_id = SST_SST25WF040B,
15134 .total_size = 512,
15135 .page_size = 256,
15136 .feature_bits = FEATURE_WRSR_WREN,
15137 .tested = TEST_UNTESTED,
15138 .probe = probe_spi_rdid,
15139 .probe_timing = TIMING_ZERO,
15140 .block_erasers =
15141 {
15142 {
15143 .eraseblocks = { {4 * 1024, 128} },
15144 .block_erase = spi_block_erase_20,
15145 }, {
15146 .eraseblocks = { {64 * 1024, 8} },
15147 .block_erase = spi_block_erase_d8,
15148 }, {
15149 .eraseblocks = { {512 * 1024, 1} },
15150 .block_erase = spi_block_erase_60,
15151 }, {
15152 .eraseblocks = { {512 * 1024, 1} },
15153 .block_erase = spi_block_erase_c7,
15154 },
15155 },
15156 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
15157 .unlock = spi_disable_blockprotect_bp2_srwd,
15158 .write = spi_chip_write_256,
15159 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
15160 .voltage = {1650, 1950},
15161 },
15162
15163 {
15164 .vendor = "SST",
15165 .name = "SST25WF080",
15166 .bustype = BUS_SPI,
15167 .manufacture_id = SST_ID,
15168 .model_id = SST_SST25WF080,
15169 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015170 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015171 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000015172 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015173 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015174 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015175 .block_erasers =
15176 {
15177 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015178 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015179 .block_erase = spi_block_erase_20,
15180 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015181 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015182 .block_erase = spi_block_erase_52,
15183 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015184 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015185 .block_erase = spi_block_erase_d8,
15186 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015187 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015188 .block_erase = spi_block_erase_60,
15189 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015190 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015191 .block_erase = spi_block_erase_c7,
15192 },
15193 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100015194 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
15195 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000015196 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015197 .read = spi_chip_read, /* Fast read (0x0B) supported */
15198 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000015199 },
15200
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015201 {
15202 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015203 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015204 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015205 .manufacture_id = SANYO_ID, /* See flashchips.h */
15206 .model_id = SST_SST25WF080B,
15207 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015208 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015209 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000015210 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015211 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015212 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015213 .block_erasers =
15214 {
15215 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015216 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015217 .block_erase = spi_block_erase_20,
15218 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015219 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015220 .block_erase = spi_block_erase_d8,
15221 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015222 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015223 .block_erase = spi_block_erase_60,
15224 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015225 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000015226 .block_erase = spi_block_erase_c7,
15227 },
15228 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100015229 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
15230 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000015231 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015232 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
15233 .voltage = {1650, 1950},
15234 },
15235
15236 {
15237 .vendor = "SST",
15238 .name = "SST25WF512",
15239 .bustype = BUS_SPI,
15240 .manufacture_id = SST_ID,
15241 .model_id = SST_SST25WF512,
15242 .total_size = 64,
15243 .page_size = 256,
15244 .feature_bits = FEATURE_WRSR_EITHER,
15245 .tested = TEST_UNTESTED,
15246 .probe = probe_spi_rdid,
15247 .probe_timing = TIMING_ZERO,
15248 .block_erasers =
15249 {
15250 {
15251 .eraseblocks = { {4 * 1024, 16} },
15252 .block_erase = spi_block_erase_20,
15253 }, {
15254 .eraseblocks = { {32 * 1024, 2} },
15255 .block_erase = spi_block_erase_52,
15256 }, {
15257 .eraseblocks = { {1024 * 64, 1} },
15258 .block_erase = spi_block_erase_60,
15259 }, {
15260 .eraseblocks = { {1024 * 64, 1} },
15261 .block_erase = spi_block_erase_c7,
15262 },
15263 },
15264 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
15265 .unlock = spi_disable_blockprotect_bp2_srwd,
15266 .write = spi_aai_write,
15267 .read = spi_chip_read, /* Fast read (0x0B) supported */
15268 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000015269 },
15270
15271 {
15272 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010015273 .name = "SST26VF016",
15274 .bustype = BUS_SPI,
15275 .manufacture_id = SST_ID,
15276 .model_id = SST_SST26VF016,
15277 .total_size = 2048,
15278 .page_size = 256,
15279 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15280 .tested = TEST_UNTESTED,
15281 .probe = probe_spi_rdid,
15282 .probe_timing = TIMING_ZERO,
15283 .block_erasers =
15284 {
15285 {
15286 .eraseblocks = { {4 * 1024, 512} },
15287 .block_erase = spi_block_erase_20,
15288 }, {
15289 .eraseblocks = {
15290 {8 * 1024, 4},
15291 {32 * 1024, 1},
15292 {64 * 1024, 30},
15293 {32 * 1024, 1},
15294 {8 * 1024, 4},
15295 },
15296 .block_erase = spi_block_erase_d8,
15297 }, {
15298 .eraseblocks = { {2 * 1024 * 1024, 1} },
15299 .block_erase = spi_block_erase_c7,
15300 },
15301 },
15302 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15303 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15304 .write = spi_chip_write_256, /* Multi I/O supported */
15305 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15306 .voltage = {2700, 3600},
15307 },
15308
15309 {
15310 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070015311 .name = "SST26VF016B(A)",
15312 .bustype = BUS_SPI,
15313 .manufacture_id = SST_ID,
15314 .model_id = SST_SST26VF016B,
15315 .total_size = 2048,
15316 .page_size = 256,
15317 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15318 .tested = TEST_OK_PREW,
15319 .probe = probe_spi_rdid,
15320 .probe_timing = TIMING_ZERO,
15321 .block_erasers =
15322 {
15323 {
15324 .eraseblocks = { {4 * 1024, 512} },
15325 .block_erase = spi_block_erase_20,
15326 }, {
15327 .eraseblocks = {
15328 {8 * 1024, 4},
15329 {32 * 1024, 1},
15330 {64 * 1024, 30},
15331 {32 * 1024, 1},
15332 {8 * 1024, 4},
15333 },
15334 .block_erase = spi_block_erase_d8,
15335 }, {
15336 .eraseblocks = { {2 * 1024 * 1024, 1} },
15337 .block_erase = spi_block_erase_c7,
15338 },
15339 },
15340 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15341 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15342 .write = spi_chip_write_256, /* Multi I/O supported */
15343 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15344 .voltage = {2700, 3600},
15345 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100015346
Wei Hu25584de2018-04-30 14:02:08 -070015347 {
15348 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010015349 .name = "SST26VF032",
15350 .bustype = BUS_SPI,
15351 .manufacture_id = SST_ID,
15352 .model_id = SST_SST26VF032,
15353 .total_size = 4096,
15354 .page_size = 256,
15355 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15356 .tested = TEST_UNTESTED,
15357 .probe = probe_spi_rdid,
15358 .probe_timing = TIMING_ZERO,
15359 .block_erasers =
15360 {
15361 {
15362 .eraseblocks = { {4 * 1024, 1024} },
15363 .block_erase = spi_block_erase_20,
15364 }, {
15365 .eraseblocks = {
15366 {8 * 1024, 4},
15367 {32 * 1024, 1},
15368 {64 * 1024, 62},
15369 {32 * 1024, 1},
15370 {8 * 1024, 4},
15371 },
15372 .block_erase = spi_block_erase_d8,
15373 }, {
15374 .eraseblocks = { {4 * 1024 * 1024, 1} },
15375 .block_erase = spi_block_erase_c7,
15376 },
15377 },
15378 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15379 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15380 .write = spi_chip_write_256, /* Multi I/O supported */
15381 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15382 .voltage = {2700, 3600},
15383 },
15384
15385 {
15386 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070015387 .name = "SST26VF032B(A)",
15388 .bustype = BUS_SPI,
15389 .manufacture_id = SST_ID,
15390 .model_id = SST_SST26VF032B,
15391 .total_size = 4096,
15392 .page_size = 256,
15393 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15394 .tested = TEST_UNTESTED,
15395 .probe = probe_spi_rdid,
15396 .probe_timing = TIMING_ZERO,
15397 .block_erasers =
15398 {
15399 {
15400 .eraseblocks = { {4 * 1024, 1024} },
15401 .block_erase = spi_block_erase_20,
15402 }, {
15403 .eraseblocks = {
15404 {8 * 1024, 4},
15405 {32 * 1024, 1},
15406 {64 * 1024, 62},
15407 {32 * 1024, 1},
15408 {8 * 1024, 4},
15409 },
15410 .block_erase = spi_block_erase_d8,
15411 }, {
15412 .eraseblocks = { {4 * 1024 * 1024, 1} },
15413 .block_erase = spi_block_erase_c7,
15414 },
15415 },
15416 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15417 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15418 .write = spi_chip_write_256, /* Multi I/O supported */
15419 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15420 .voltage = {2700, 3600},
15421 },
15422
Wei Hu25584de2018-04-30 14:02:08 -070015423 {
15424 .vendor = "SST",
15425 .name = "SST26VF064B(A)",
15426 .bustype = BUS_SPI,
15427 .manufacture_id = SST_ID,
15428 .model_id = SST_SST26VF064B,
15429 .total_size = 8192,
15430 .page_size = 256,
15431 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15432 .tested = TEST_OK_PREW,
15433 .probe = probe_spi_rdid,
15434 .probe_timing = TIMING_ZERO,
15435 .block_erasers =
15436 {
15437 {
15438 .eraseblocks = { {4 * 1024, 2048} },
15439 .block_erase = spi_block_erase_20,
15440 }, {
15441 .eraseblocks = {
15442 {8 * 1024, 4},
15443 {32 * 1024, 1},
15444 {64 * 1024, 126},
15445 {32 * 1024, 1},
15446 {8 * 1024, 4},
15447 },
15448 .block_erase = spi_block_erase_d8,
15449 }, {
15450 .eraseblocks = { {8 * 1024 * 1024, 1} },
15451 .block_erase = spi_block_erase_c7,
15452 },
15453 },
15454 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15455 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15456 .write = spi_chip_write_256, /* Multi I/O supported */
15457 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15458 .voltage = {2700, 3600},
15459 },
15460
15461 {
15462 .vendor = "SST",
Nico Huberd4e41d32024-10-18 14:59:54 +020015463 .name = "SST26VF080A",
15464 .bustype = BUS_SPI,
15465 .manufacture_id = SST_ID,
15466 .model_id = SST_SST26VF080A,
15467 .total_size = 1024,
15468 .page_size = 256,
15469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15470 .tested = TEST_UNTESTED,
15471 .probe = probe_spi_rdid,
15472 .probe_timing = TIMING_ZERO,
15473 .block_erasers =
15474 {
15475 {
15476 .eraseblocks = { {4 * 1024, 256} },
15477 .block_erase = spi_block_erase_20,
15478 }, {
15479 .eraseblocks = { {32 * 1024, 32} },
15480 .block_erase = spi_block_erase_52,
15481 }, {
15482 .eraseblocks = { {64 * 1024, 16} },
15483 .block_erase = spi_block_erase_d8,
15484 }, {
15485 .eraseblocks = { {1024 * 1024, 1} },
15486 .block_erase = spi_block_erase_60,
15487 }, {
15488 .eraseblocks = { {1024 * 1024, 1} },
15489 .block_erase = spi_block_erase_c7,
15490 },
15491 },
15492 .printlock = spi_prettyprint_status_register_bp3_srwd,
15493 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15494 .write = spi_chip_write_256, /* Multi I/O supported */
15495 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15496 .voltage = {2700, 3600},
15497 },
15498
15499 {
15500 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015501 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015502 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015503 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015504 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015505 .total_size = 512,
15506 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000015507 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015508 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015509 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015510 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015511 .block_erasers =
15512 {
15513 {
15514 .eraseblocks = { {128, 4096} },
15515 .block_erase = erase_sector_28sf040,
15516 }, {
15517 .eraseblocks = { {512 * 1024, 1} },
15518 .block_erase = erase_chip_28sf040,
15519 }
15520 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015521 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015522 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015523 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015524 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015525 .prepare_access = prepare_memory_access,
15526 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015527 },
15528
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015529 {
15530 .vendor = "SST",
15531 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015532 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015533 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015534 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015535 .total_size = 128,
15536 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015537 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015538 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015539 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015540 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015541 .block_erasers =
15542 {
15543 {
15544 .eraseblocks = { {128 * 1024, 1} },
15545 .block_erase = erase_chip_block_jedec,
15546 }
15547 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015548 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015549 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015550 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015551 .prepare_access = prepare_memory_access,
15552 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015553 },
15554
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015555 {
15556 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015557 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015558 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015559 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015560 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015561 .total_size = 256,
15562 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015563 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015564 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015565 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015566 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015567 .block_erasers =
15568 {
15569 {
15570 .eraseblocks = { {256 * 1024, 1} },
15571 .block_erase = erase_chip_block_jedec,
15572 }
15573 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015574 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015575 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015576 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015577 .prepare_access = prepare_memory_access,
15578 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015579 },
15580
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015581 {
15582 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015583 .name = "SST29LE010",
15584 .bustype = BUS_PARALLEL,
15585 .manufacture_id = SST_ID,
15586 .model_id = SST_SST29LE010,
15587 .total_size = 128,
15588 .page_size = 128,
15589 .feature_bits = FEATURE_LONG_RESET,
15590 .tested = TEST_UNTESTED,
15591 .probe = probe_jedec,
15592 .probe_timing = 10,
15593 .block_erasers =
15594 {
15595 {
15596 .eraseblocks = { {128 * 1024, 1} },
15597 .block_erase = erase_chip_block_jedec,
15598 }
15599 },
15600 .write = write_jedec,
15601 .read = read_memmapped,
15602 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015603 .prepare_access = prepare_memory_access,
15604 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015605 },
15606
15607 {
15608 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015609 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015610 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015611 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015612 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015613 .total_size = 256,
15614 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015615 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015616 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015617 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015618 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015619 .block_erasers =
15620 {
15621 {
15622 .eraseblocks = { {256 * 1024, 1} },
15623 .block_erase = erase_chip_block_jedec,
15624 }
15625 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015626 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015627 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015628 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015629 .prepare_access = prepare_memory_access,
15630 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015631 },
15632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015633 {
15634 .vendor = "SST",
15635 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015636 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015637 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015638 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015639 .total_size = 128,
15640 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015641 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015642 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015643 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015644 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015645 .block_erasers =
15646 {
15647 {
15648 .eraseblocks = { {4 * 1024, 32} },
15649 .block_erase = erase_sector_jedec,
15650 }, {
15651 .eraseblocks = { {128 * 1024, 1} },
15652 .block_erase = erase_chip_block_jedec,
15653 }
15654 },
Sean Nelson35727f72010-01-28 23:55:12 +000015655 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015656 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015657 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015658 .prepare_access = prepare_memory_access,
15659 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015660 },
15661
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015662 {
15663 .vendor = "SST",
15664 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015665 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015666 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015667 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015668 .total_size = 256,
15669 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015670 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000015671 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015672 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015673 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015674 .block_erasers =
15675 {
15676 {
15677 .eraseblocks = { {4 * 1024, 64} },
15678 .block_erase = erase_sector_jedec,
15679 }, {
15680 .eraseblocks = { {256 * 1024, 1} },
15681 .block_erase = erase_chip_block_jedec,
15682 }
15683 },
Sean Nelson35727f72010-01-28 23:55:12 +000015684 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015685 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015686 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015687 .prepare_access = prepare_memory_access,
15688 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015689 },
15690
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015691 {
15692 .vendor = "SST",
15693 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015694 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015695 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015696 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015697 .total_size = 512,
15698 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015699 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000015700 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015701 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015702 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015703 .block_erasers =
15704 {
15705 {
15706 .eraseblocks = { {4 * 1024, 128} },
15707 .block_erase = erase_sector_jedec,
15708 }, {
15709 .eraseblocks = { {512 * 1024, 1} },
15710 .block_erase = erase_chip_block_jedec,
15711 }
15712 },
Sean Nelson35727f72010-01-28 23:55:12 +000015713 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015714 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015715 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015716 .prepare_access = prepare_memory_access,
15717 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015718 },
15719
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015720 {
15721 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015722 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015723 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015724 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015725 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015726 .total_size = 64,
15727 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015728 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000015729 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015730 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015731 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015732 .block_erasers =
15733 {
15734 {
15735 .eraseblocks = { {4 * 1024, 16} },
15736 .block_erase = erase_sector_jedec,
15737 }, {
15738 .eraseblocks = { {64 * 1024, 1} },
15739 .block_erase = erase_chip_block_jedec,
15740 }
15741 },
Sean Nelson35727f72010-01-28 23:55:12 +000015742 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015743 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015744 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015745 .prepare_access = prepare_memory_access,
15746 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015747 },
15748
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015749 {
15750 .vendor = "SST",
15751 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015752 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015753 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015754 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015755 .total_size = 128,
15756 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015757 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000015758 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015759 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015760 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015761 .block_erasers =
15762 {
15763 {
15764 .eraseblocks = { {4 * 1024, 32} },
15765 .block_erase = erase_sector_jedec,
15766 }, {
15767 .eraseblocks = { {128 * 1024, 1} },
15768 .block_erase = erase_chip_block_jedec,
15769 }
15770 },
Sean Nelson35727f72010-01-28 23:55:12 +000015771 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015772 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015773 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015774 .prepare_access = prepare_memory_access,
15775 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015776 },
15777
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015778 {
15779 .vendor = "SST",
15780 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015781 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015782 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015783 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015784 .total_size = 256,
15785 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015786 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000015787 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015788 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015789 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015790 .block_erasers =
15791 {
15792 {
15793 .eraseblocks = { {4 * 1024, 64} },
15794 .block_erase = erase_sector_jedec,
15795 }, {
15796 .eraseblocks = { {256 * 1024, 1} },
15797 .block_erase = erase_chip_block_jedec,
15798 }
15799 },
Sean Nelson35727f72010-01-28 23:55:12 +000015800 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015801 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015802 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015803 .prepare_access = prepare_memory_access,
15804 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015805 },
15806
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015807 {
15808 .vendor = "SST",
15809 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015810 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015811 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015812 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015813 .total_size = 512,
15814 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015815 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015816 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015817 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015818 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015819 .block_erasers =
15820 {
15821 {
15822 .eraseblocks = { {4 * 1024, 128} },
15823 .block_erase = erase_sector_jedec,
15824 }, {
15825 .eraseblocks = { {512 * 1024, 1} },
15826 .block_erase = erase_chip_block_jedec,
15827 }
15828 },
Sean Nelson35727f72010-01-28 23:55:12 +000015829 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015830 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015831 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015832 .prepare_access = prepare_memory_access,
15833 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000015834 },
FENG yu ningff692fb2008-12-08 18:15:10 +000015835
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015836 {
15837 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000015838 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015839 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015840 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015841 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000015842 .total_size = 1024,
15843 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015844 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000015845 .tested = TEST_UNTESTED,
15846 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015847 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015848 .block_erasers =
15849 {
15850 {
15851 .eraseblocks = { {4 * 1024, 256} },
15852 .block_erase = erase_sector_jedec,
15853 }, {
15854 .eraseblocks = { {64 * 1024, 16} },
15855 .block_erase = erase_block_jedec,
15856 }, {
15857 .eraseblocks = { {1024 * 1024, 1} },
15858 .block_erase = erase_chip_block_jedec,
15859 }
15860 },
Sean Nelson35727f72010-01-28 23:55:12 +000015861 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015862 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015863 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015864 .prepare_access = prepare_memory_access,
15865 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +000015866 },
15867
15868 {
15869 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015870 .name = "SST39VF512",
15871 .bustype = BUS_PARALLEL,
15872 .manufacture_id = SST_ID,
15873 .model_id = SST_SST39VF512,
15874 .total_size = 64,
15875 .page_size = 4096,
15876 .feature_bits = FEATURE_EITHER_RESET,
15877 .tested = TEST_OK_PREW,
15878 .probe = probe_jedec,
15879 .probe_timing = 1, /* 150 ns */
15880 .block_erasers =
15881 {
15882 {
15883 .eraseblocks = { {4 * 1024, 16} },
15884 .block_erase = erase_sector_jedec,
15885 }, {
15886 .eraseblocks = { {64 * 1024, 1} },
15887 .block_erase = erase_chip_block_jedec,
15888 }
15889 },
15890 .write = write_jedec_1,
15891 .read = read_memmapped,
15892 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015893 .prepare_access = prepare_memory_access,
15894 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015895 },
15896
15897 {
15898 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015899 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015900 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015901 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015902 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015903 .total_size = 256,
15904 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015905 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015906 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015907 .probe = probe_jedec,
15908 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015909 .block_erasers =
15910 {
15911 {
15912 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015913 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015914 }, {
15915 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015916 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015917 }, {
15918 .eraseblocks = { {256 * 1024, 1} },
15919 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15920 }
15921 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015922 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015923 .unlock = unlock_sst_fwhub,
15924 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015925 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015926 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015927 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015928 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015929 },
15930
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015931 {
15932 .vendor = "SST",
15933 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015934 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015935 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015936 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015937 .total_size = 384,
15938 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015939 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000015940 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015941 .probe = probe_jedec,
15942 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015943 .block_erasers =
15944 {
15945 {
15946 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015947 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015948 }, {
15949 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015950 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015951 }, {
15952 .eraseblocks = { {384 * 1024, 1} },
15953 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15954 }
15955 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015956 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015957 .unlock = unlock_sst_fwhub,
15958 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015959 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015960 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015961 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015962 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015963 },
15964
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015965 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015966 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
15967 * and is only honored for 64k block erase, but not 4k sector erase.
15968 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015969 .vendor = "SST",
15970 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015971 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015972 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015973 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015974 .total_size = 512,
15975 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015976 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015977 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015978 .probe = probe_jedec,
15979 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015980 .block_erasers =
15981 {
15982 {
15983 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015984 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015985 }, {
15986 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015987 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015988 }, {
15989 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000015990 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015991 },
15992 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015993 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015994 .unlock = unlock_sst_fwhub,
15995 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015996 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015997 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015998 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015999 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016000 },
16001
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016002 {
16003 .vendor = "SST",
16004 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016005 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016006 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016007 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016008 .total_size = 512,
16009 .page_size = 4 * 1024,
16010 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016011 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016012 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016013 .block_erasers =
16014 {
16015 {
16016 .eraseblocks = { {4 * 1024, 128} },
16017 .block_erase = erase_sector_49lfxxxc,
16018 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000016019 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000016020 {64 * 1024, 7},
16021 {32 * 1024, 1},
16022 {8 * 1024, 2},
16023 {16 * 1024, 1},
16024 },
Sean Nelson69e58112010-03-23 17:10:28 +000016025 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016026 }
16027 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016028 .printlock = printlock_regspace2_block_eraser_1,
16029 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000016030 .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},
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 = "SST",
16039 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016040 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016041 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016042 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016043 .total_size = 1024,
16044 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010016045 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016046 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016047 .probe = probe_jedec,
16048 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016049 .block_erasers =
16050 {
16051 {
16052 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000016053 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016054 }, {
16055 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000016056 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016057 }, {
16058 .eraseblocks = { {1024 * 1024, 1} },
16059 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
16060 }
16061 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016062 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000016063 .unlock = unlock_sst_fwhub,
16064 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016065 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016066 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016067 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016068 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016069 },
16070
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016071 {
16072 .vendor = "SST",
16073 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016074 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016075 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016076 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016077 .total_size = 1024,
16078 .page_size = 4 * 1024,
16079 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016080 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016081 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016082 .block_erasers =
16083 {
16084 {
16085 .eraseblocks = { {4 * 1024, 256} },
16086 .block_erase = erase_sector_49lfxxxc,
16087 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000016088 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000016089 {64 * 1024, 15},
16090 {32 * 1024, 1},
16091 {8 * 1024, 2},
16092 {16 * 1024, 1},
16093 },
Sean Nelson69e58112010-03-23 17:10:28 +000016094 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016095 }
16096 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016097 .printlock = printlock_regspace2_block_eraser_1,
16098 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000016099 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016100 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016101 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016102 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016103 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016104 },
16105
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016106 {
16107 .vendor = "SST",
16108 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016109 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016110 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016111 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016112 .total_size = 2048,
16113 .page_size = 4 * 1024,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016114 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016115 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016116 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016117 .block_erasers =
16118 {
16119 {
16120 .eraseblocks = { {4 * 1024, 512} },
16121 .block_erase = erase_sector_49lfxxxc,
16122 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000016123 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000016124 {64 * 1024, 31},
16125 {32 * 1024, 1},
16126 {8 * 1024, 2},
16127 {16 * 1024, 1},
16128 },
Sean Nelson69e58112010-03-23 17:10:28 +000016129 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016130 }
16131 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016132 .printlock = printlock_regspace2_block_eraser_1,
16133 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000016134 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016135 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016136 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016137 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016138 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016139 },
16140
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016141 {
16142 .vendor = "SST",
16143 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016144 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016145 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016146 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016147 .total_size = 256,
16148 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016149 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000016150 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016151 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000016152 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016153 .block_erasers =
16154 {
16155 {
16156 .eraseblocks = { {4 * 1024, 64} },
16157 .block_erase = erase_sector_jedec,
16158 }, {
16159 .eraseblocks = { {16 * 1024, 16} },
16160 .block_erase = erase_block_jedec,
16161 }, {
16162 .eraseblocks = { {256 * 1024, 1} },
16163 .block_erase = NULL,
16164 }
16165 },
Sean Nelson35727f72010-01-28 23:55:12 +000016166 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016167 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016168 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016169 .prepare_access = prepare_memory_access,
16170 .finish_access = finish_memory_access,
Sven Schnellec208dfb2009-01-07 12:35:09 +000016171 },
16172
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016173 {
16174 .vendor = "SST",
16175 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016176 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016177 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016178 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016179 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000016180 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016181 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000016182 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016183 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000016184 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016185 .block_erasers =
16186 {
16187 {
16188 .eraseblocks = { {4 * 1024, 64} },
16189 .block_erase = erase_sector_jedec,
16190 }, {
16191 .eraseblocks = { {16 * 1024, 16} },
16192 .block_erase = erase_block_jedec,
16193 }, {
16194 .eraseblocks = { {256 * 1024, 1} },
16195 .block_erase = NULL,
16196 }
16197 },
Sean Nelson35727f72010-01-28 23:55:12 +000016198 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016199 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016200 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016201 .prepare_access = prepare_memory_access,
16202 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016203 },
16204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016205 {
16206 .vendor = "SST",
16207 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016208 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016209 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016210 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016211 .total_size = 512,
16212 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000016213 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000016214 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016215 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000016216 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016217 .block_erasers =
16218 {
16219 {
16220 .eraseblocks = { {4 * 1024, 128} },
16221 .block_erase = erase_sector_jedec,
16222 }, {
16223 .eraseblocks = { {64 * 1024, 8} },
16224 .block_erase = erase_block_jedec,
16225 }, {
16226 .eraseblocks = { {512 * 1024, 1} },
16227 .block_erase = NULL,
16228 }
16229 },
Sean Nelson35727f72010-01-28 23:55:12 +000016230 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016231 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016232 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016233 .prepare_access = prepare_memory_access,
16234 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016235 },
16236
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016237 {
16238 .vendor = "SST",
16239 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016240 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016241 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016242 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016243 .total_size = 512,
16244 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010016245 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016246 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016247 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016248 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016249 .block_erasers =
16250 {
16251 {
16252 .eraseblocks = { {4 * 1024, 128} },
16253 .block_erase = erase_sector_jedec,
16254 }, {
16255 .eraseblocks = { {64 * 1024, 8} },
16256 .block_erase = erase_block_jedec,
16257 }, {
16258 .eraseblocks = { {512 * 1024, 1} },
16259 .block_erase = NULL,
16260 }
16261 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016262 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000016263 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016264 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016265 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016266 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016267 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016268 },
16269
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016270 {
16271 .vendor = "SST",
16272 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016273 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016274 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020016275 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016276 .total_size = 1024,
16277 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000016278 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000016279 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016280 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016281 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016282 .block_erasers =
16283 {
16284 {
16285 .eraseblocks = { {4 * 1024, 256} },
16286 .block_erase = erase_sector_jedec,
16287 }, {
16288 .eraseblocks = { {64 * 1024, 16} },
16289 .block_erase = erase_block_jedec,
16290 }, {
16291 .eraseblocks = { {1024 * 1024, 1} },
16292 .block_erase = NULL,
16293 }
16294 },
Sean Nelson35727f72010-01-28 23:55:12 +000016295 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016296 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016297 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016298 .prepare_access = prepare_memory_access,
16299 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016300 },
16301
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016302 {
16303 .vendor = "SST",
16304 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016305 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016306 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016307 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016308 .total_size = 2048,
16309 .page_size = 4 * 1024,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016310 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000016311 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016312 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000016313 .block_erasers =
16314 {
16315 {
16316 .eraseblocks = { {4 * 1024, 512} },
16317 .block_erase = erase_sector_49lfxxxc,
16318 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000016319 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000016320 {64 * 1024, 31},
16321 {32 * 1024, 1},
16322 {8 * 1024, 2},
16323 {16 * 1024, 1},
16324 },
Sean Nelson69e58112010-03-23 17:10:28 +000016325 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000016326 }
16327 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016328 .printlock = printlock_regspace2_block_eraser_1,
16329 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000016330 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016331 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016332 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016333 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016334 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016335 },
16336
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016337 {
16338 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016339 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016340 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016341 .manufacture_id = ST_ID,
16342 .model_id = ST_M29F002B,
16343 .total_size = 256,
16344 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016345 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016346 .tested = TEST_UNTESTED,
16347 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016348 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016349 .block_erasers =
16350 {
16351 {
16352 .eraseblocks = {
16353 {16 * 1024, 1},
16354 {8 * 1024, 2},
16355 {32 * 1024, 1},
16356 {64 * 1024, 3},
16357 },
16358 .block_erase = erase_sector_jedec,
16359 }, {
16360 .eraseblocks = { {256 * 1024, 1} },
16361 .block_erase = erase_chip_block_jedec,
16362 }
16363 },
Sean Nelson35727f72010-01-28 23:55:12 +000016364 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016365 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016366 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010016367 .prepare_access = prepare_memory_access,
16368 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016369 },
16370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016371 {
16372 .vendor = "ST",
16373 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016374 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016375 .manufacture_id = ST_ID,
16376 .model_id = ST_M29F002T,
16377 .total_size = 256,
16378 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016379 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000016380 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016381 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016382 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016383 .block_erasers =
16384 {
16385 {
16386 .eraseblocks = {
16387 {64 * 1024, 3},
16388 {32 * 1024, 1},
16389 {8 * 1024, 2},
16390 {16 * 1024, 1},
16391 },
16392 .block_erase = erase_sector_jedec,
16393 }, {
16394 .eraseblocks = { {256 * 1024, 1} },
16395 .block_erase = erase_chip_block_jedec,
16396 }
16397 },
Sean Nelson35727f72010-01-28 23:55:12 +000016398 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016399 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016400 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010016401 .prepare_access = prepare_memory_access,
16402 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016403 },
16404
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016405 {
16406 .vendor = "ST",
16407 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016408 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016409 .manufacture_id = ST_ID,
16410 .model_id = ST_M29F040B,
16411 .total_size = 512,
16412 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016413 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
16414 .tested = TEST_UNTESTED,
16415 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000016416 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000016417 .block_erasers =
16418 {
16419 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016420 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000016421 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016422 }, {
16423 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000016424 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016425 }
16426 },
Sean Nelson35727f72010-01-28 23:55:12 +000016427 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016428 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016429 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010016430 .prepare_access = prepare_memory_access,
16431 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016432 },
16433
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016434 {
Sean Nelson35727f72010-01-28 23:55:12 +000016435 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016436 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016437 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016438 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016439 .manufacture_id = ST_ID,
16440 .model_id = ST_M29F400BB,
16441 .total_size = 512,
16442 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016443 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000016444 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016445 .probe = probe_jedec,
16446 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016447 .block_erasers =
16448 {
16449 {
16450 .eraseblocks = {
16451 {16 * 1024, 1},
16452 {8 * 1024, 2},
16453 {32 * 1024, 1},
16454 {64 * 1024, 7},
16455 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016456 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016457 }, {
16458 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016459 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016460 }
16461 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016462 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016463 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016464 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010016465 .prepare_access = prepare_memory_access,
16466 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016467 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016468
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000016469 {
16470 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
16471 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016472 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016473 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016474 .manufacture_id = ST_ID,
16475 .model_id = ST_M29F400BT,
16476 .total_size = 512,
16477 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016478 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016479 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016480 .probe = probe_jedec,
16481 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000016482 .block_erasers =
16483 {
16484 {
16485 .eraseblocks = {
16486 {64 * 1024, 7},
16487 {32 * 1024, 1},
16488 {8 * 1024, 2},
16489 {16 * 1024, 1},
16490 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016491 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016492 }, {
16493 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016494 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016495 }
16496 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016497 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016498 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016499 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010016500 .prepare_access = prepare_memory_access,
16501 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016502 },
16503
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016504 {
16505 .vendor = "ST",
16506 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016507 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016508 .manufacture_id = ST_ID,
16509 .model_id = ST_M29W010B,
16510 .total_size = 128,
16511 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016512 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016513 .tested = TEST_UNTESTED,
16514 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016515 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016516 .block_erasers =
16517 {
16518 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016519 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016520 .block_erase = erase_sector_jedec,
16521 }, {
16522 .eraseblocks = { {128 * 1024, 1} },
16523 .block_erase = erase_chip_block_jedec,
16524 }
16525 },
Sean Nelson35727f72010-01-28 23:55:12 +000016526 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016527 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016528 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016529 .prepare_access = prepare_memory_access,
16530 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016531 },
16532
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016533 {
16534 .vendor = "ST",
16535 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016536 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016537 .manufacture_id = ST_ID,
16538 .model_id = ST_M29W040B,
16539 .total_size = 512,
16540 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016541 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016542 .tested = TEST_UNTESTED,
16543 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016544 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016545 .block_erasers =
16546 {
16547 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016548 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016549 .block_erase = erase_sector_jedec,
16550 }, {
16551 .eraseblocks = { {512 * 1024, 1} },
16552 .block_erase = erase_chip_block_jedec,
16553 }
16554 },
Sean Nelson35727f72010-01-28 23:55:12 +000016555 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016556 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016557 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016558 .prepare_access = prepare_memory_access,
16559 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016560 },
16561
Stefan Taunereb582572012-09-21 12:52:50 +000016562 {
16563 .vendor = "ST",
16564 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016565 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100016566 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000016567 .model_id = ST_M29W512B,
16568 .total_size = 64,
16569 .page_size = 64 * 1024,
16570 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016571 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000016572 .probe = probe_jedec,
16573 .probe_timing = TIMING_ZERO,
16574 .block_erasers =
16575 {
16576 {
16577 .eraseblocks = { {64 * 1024, 1} },
16578 .block_erase = erase_chip_block_jedec,
16579 }
16580 },
16581 .write = write_jedec_1,
16582 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016583 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016584 .prepare_access = prepare_memory_access,
16585 .finish_access = finish_memory_access,
Stefan Taunereb582572012-09-21 12:52:50 +000016586 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000016587
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016588 {
16589 .vendor = "ST",
16590 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016591 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016592 .manufacture_id = ST_ID,
16593 .model_id = ST_M50FLW040A,
16594 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016595 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016596 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016597 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016598 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016599 .block_erasers =
16600 {
16601 {
Sean Nelson329bde72010-01-19 16:39:19 +000016602 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016603 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016604 {64 * 1024, 5}, /* block */
16605 {4 * 1024, 16}, /* sector */
16606 {4 * 1024, 16}, /* sector */
16607 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016608 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016609 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016610 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016611 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016612 }
16613 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016614 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100016615 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016616 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016617 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016618 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016619 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016620 },
16621
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016622 {
16623 .vendor = "ST",
16624 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016625 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016626 .manufacture_id = ST_ID,
16627 .model_id = ST_M50FLW040B,
16628 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016629 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016630 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016631 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016632 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016633 .block_erasers =
16634 {
16635 {
Sean Nelson329bde72010-01-19 16:39:19 +000016636 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016637 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016638 {4 * 1024, 16}, /* sector */
16639 {64 * 1024, 5}, /* block */
16640 {4 * 1024, 16}, /* sector */
16641 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016642 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016643 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016644 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016645 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016646 }
16647 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016648 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100016649 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016650 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016651 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016652 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016653 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016654 },
16655
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016656 {
16657 .vendor = "ST",
16658 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016659 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016660 .manufacture_id = ST_ID,
16661 .model_id = ST_M50FLW080A,
16662 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016663 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016664 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016665 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016666 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016667 .block_erasers =
16668 {
16669 {
Sean Nelson329bde72010-01-19 16:39:19 +000016670 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016671 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016672 {64 * 1024, 13}, /* block */
16673 {4 * 1024, 16}, /* sector */
16674 {4 * 1024, 16}, /* sector */
16675 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016676 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016677 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016678 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016679 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016680 }
16681 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016682 .printlock = printlock_regspace2_block_eraser_0,
16683 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016684 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016685 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016686 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016687 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016688 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016689 },
16690
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016691 {
16692 .vendor = "ST",
16693 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016694 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016695 .manufacture_id = ST_ID,
16696 .model_id = ST_M50FLW080B,
16697 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016698 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016699 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016700 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016701 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016702 .block_erasers =
16703 {
16704 {
Sean Nelson329bde72010-01-19 16:39:19 +000016705 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016706 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016707 {4 * 1024, 16}, /* sector */
16708 {64 * 1024, 13}, /* block */
16709 {4 * 1024, 16}, /* sector */
16710 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016711 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016712 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016713 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016714 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016715 }
16716 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016717 .printlock = printlock_regspace2_block_eraser_0,
16718 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016719 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016720 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016721 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016722 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016723 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016724 },
16725
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016726 {
16727 .vendor = "ST",
16728 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016729 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016730 .manufacture_id = ST_ID,
16731 .model_id = ST_M50FW002,
16732 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000016733 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016734 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016735 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016736 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016737 .block_erasers =
16738 {
16739 {
16740 .eraseblocks = {
16741 {64 * 1024, 3},
16742 {32 * 1024, 1},
16743 {8 * 1024, 2},
16744 {16 * 1024, 1},
16745 },
Sean Nelson28accc22010-03-19 18:47:06 +000016746 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016747 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000016748 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016749 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000016750 }
16751 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016752 .printlock = printlock_regspace2_block_eraser_0,
16753 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016754 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016755 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016756 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016757 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016758 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016759 },
16760
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016761 {
16762 .vendor = "ST",
16763 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016764 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016765 .manufacture_id = ST_ID,
16766 .model_id = ST_M50FW016,
16767 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016768 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016769 .tested = TEST_UNTESTED,
16770 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016771 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016772 .block_erasers =
16773 {
16774 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016775 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000016776 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016777 }
16778 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016779 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016780 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016781 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016782 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016783 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016784 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016785 },
16786
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016787 {
16788 .vendor = "ST",
16789 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016790 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016791 .manufacture_id = ST_ID,
16792 .model_id = ST_M50FW040,
16793 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016794 .page_size = 0,
Sean Nelson28accc22010-03-19 18:47:06 +000016795 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016796 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016797 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016798 .block_erasers =
16799 {
16800 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016801 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016802 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016803 }
16804 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016805 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016806 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016807 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016808 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016809 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016810 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016811 },
16812
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016813 {
16814 .vendor = "ST",
16815 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016816 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016817 .manufacture_id = ST_ID,
16818 .model_id = ST_M50FW080,
16819 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016820 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016821 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016822 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016823 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016824 .block_erasers =
16825 {
16826 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016827 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016828 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016829 }
16830 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016831 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016832 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016833 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016834 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016835 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016836 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016837 },
16838
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016839 {
16840 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016841 .name = "M50LPW080",
16842 .bustype = BUS_LPC, /* A/A Mux */
16843 .manufacture_id = ST_ID,
16844 .model_id = ST_M50LPW080,
16845 .total_size = 1024,
16846 .page_size = 0,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016847 .tested = TEST_UNTESTED,
16848 .probe = probe_82802ab,
16849 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16850 .block_erasers =
16851 {
16852 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016853 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016854 .block_erase = erase_block_82802ab,
16855 }
16856 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016857 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016858 .write = write_82802ab,
16859 .read = read_memmapped,
16860 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016861 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016862 .finish_access = finish_memory_access,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016863 },
16864
16865 {
16866 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016867 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016868 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016869 .manufacture_id = ST_ID,
16870 .model_id = ST_M50LPW116,
16871 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016872 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016873 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016874 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000016875 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016876 .block_erasers =
16877 {
16878 {
16879 .eraseblocks = {
16880 {4 * 1024, 16},
16881 {64 * 1024, 30},
16882 {32 * 1024, 1},
16883 {8 * 1024, 2},
16884 {16 * 1024, 1},
16885 },
Sean Nelson28accc22010-03-19 18:47:06 +000016886 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016887 }
16888 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016889 .printlock = printlock_regspace2_block_eraser_0,
16890 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016891 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016892 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016893 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016894 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016895 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016896 },
16897
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016898 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016899 .vendor = "ST",
16900 .name = "M95M02",
16901 .bustype = BUS_SPI,
16902 .manufacture_id = ST_ID,
16903 .model_id = ST_M95M02,
16904 .total_size = 256,
16905 .page_size = 256,
16906 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
16907 .tested = TEST_OK_PREW,
Nico Huber54557862023-05-15 12:01:04 +020016908 .spi_cmd_set = SPI95,
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016909 .probe = probe_spi_st95,
16910 .probe_timing = TIMING_ZERO,
16911 .block_erasers =
16912 {
16913 {
16914 .eraseblocks = { {256 * 1024, 1} },
16915 .block_erase = spi_block_erase_emulation,
16916 }
16917 },
16918
16919 .printlock = spi_prettyprint_status_register_bp1_srwd,
16920 .unlock = spi_disable_blockprotect_bp1_srwd,
16921 .write = spi_chip_write_256,
16922 .read = spi_chip_read,
16923 .voltage = {2500, 5500},
16924 },
16925
16926 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016927 .vendor = "Sanyo",
16928 .name = "LE25FU106B",
16929 .bustype = BUS_SPI,
16930 .manufacture_id = SANYO_ID,
16931 .model_id = SANYO_LE25FU106B,
16932 .total_size = 128,
16933 .page_size = 256,
16934 .feature_bits = FEATURE_WRSR_WREN,
16935 .tested = TEST_UNTESTED,
16936 .probe = probe_spi_res2,
16937 .probe_timing = TIMING_ZERO,
16938 .block_erasers =
16939 {
16940 /* FIXME: Is this correct?
16941 {
16942 .eraseblocks = { {2 * 1024, 64} },
16943 .block_erase = spi_block_erase_d7,
16944 },*/
16945 {
16946 .eraseblocks = { {32 * 1024, 4} },
16947 .block_erase = spi_block_erase_d8,
16948 }, {
16949 .eraseblocks = { {128 * 1024, 1} },
16950 .block_erase = spi_block_erase_c7,
16951 }
16952 },
16953 .printlock = spi_prettyprint_status_register_bp1_srwd,
16954 .unlock = spi_disable_blockprotect_bp1_srwd,
16955 .write = spi_chip_write_256,
16956 .read = spi_chip_read,
16957 .voltage = {2300, 3600},
16958 },
16959
16960 {
16961 .vendor = "Sanyo",
16962 .name = "LE25FU206",
16963 .bustype = BUS_SPI,
16964 .manufacture_id = SANYO_ID,
16965 .model_id = SANYO_LE25FU206,
16966 .total_size = 256,
16967 .page_size = 256,
16968 .feature_bits = FEATURE_WRSR_WREN,
16969 .tested = TEST_UNTESTED,
16970 .probe = probe_spi_res2,
16971 .probe_timing = TIMING_ZERO,
16972 .block_erasers =
16973 {
16974 {
16975 .eraseblocks = { {4 * 1024, 64} },
16976 .block_erase = spi_block_erase_d7,
16977 }, {
16978 .eraseblocks = { {64 * 1024, 4} },
16979 .block_erase = spi_block_erase_d8,
16980 }, {
16981 .eraseblocks = { {256 * 1024, 1} },
16982 .block_erase = spi_block_erase_c7,
16983 }
16984 },
16985 .printlock = spi_prettyprint_status_register_bp1_srwd,
16986 .unlock = spi_disable_blockprotect_bp1_srwd,
16987 .write = spi_chip_write_256,
16988 .read = spi_chip_read,
16989 .voltage = {2300, 3600},
16990 },
16991
16992 {
16993 .vendor = "Sanyo",
16994 .name = "LE25FU206A",
16995 .bustype = BUS_SPI,
16996 .manufacture_id = SANYO_ID,
16997 .model_id = SANYO_LE25FU206A,
16998 .total_size = 256,
16999 .page_size = 256,
17000 .tested = TEST_UNTESTED,
17001 .probe = probe_spi_rdid,
17002 .probe_timing = TIMING_ZERO,
17003 .block_erasers =
17004 {
17005 {
17006 .eraseblocks = { {4 * 1024, 64} },
17007 .block_erase = spi_block_erase_20,
17008 }, {
17009 .eraseblocks = { {4 * 1024, 64} },
17010 .block_erase = spi_block_erase_d7,
17011 }, {
17012 .eraseblocks = { {64 * 1024, 4} },
17013 .block_erase = spi_block_erase_d8,
17014 }, {
17015 .eraseblocks = { {256 * 1024, 1} },
17016 .block_erase = spi_block_erase_60,
17017 }, {
17018 .eraseblocks = { {256 * 1024, 1} },
17019 .block_erase = spi_block_erase_c7,
17020 }
17021 },
17022 .printlock = spi_prettyprint_status_register_bp2_srwd,
17023 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
17024 .write = spi_chip_write_256,
17025 .read = spi_chip_read,
17026 .voltage = {2300, 3600},
17027 },
17028
17029 {
17030 .vendor = "Sanyo",
17031 .name = "LE25FU406B",
17032 .bustype = BUS_SPI,
17033 .manufacture_id = SANYO_ID,
17034 .model_id = SANYO_LE25FU406B,
17035 .total_size = 512,
17036 .page_size = 256,
17037 .feature_bits = FEATURE_WRSR_WREN,
17038 .tested = TEST_OK_PREW,
17039 .probe = probe_spi_res2,
17040 .probe_timing = TIMING_ZERO,
17041 .block_erasers =
17042 {
17043 {
17044 .eraseblocks = { {4 * 1024, 128} },
17045 .block_erase = spi_block_erase_d7,
17046 }, {
17047 .eraseblocks = { {64 * 1024, 8} },
17048 .block_erase = spi_block_erase_d8,
17049 }, {
17050 .eraseblocks = { {512 * 1024, 1} },
17051 .block_erase = spi_block_erase_c7,
17052 }
17053 },
17054 .printlock = spi_prettyprint_status_register_bp2_srwd,
17055 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
17056 .write = spi_chip_write_256,
17057 .read = spi_chip_read,
17058 .voltage = {2300, 3600},
17059 },
17060
17061 {
17062 .vendor = "Sanyo",
17063 .name = "LE25FU406C/LE25U40CMC",
17064 .bustype = BUS_SPI,
17065 .manufacture_id = SANYO_ID,
17066 .model_id = SANYO_LE25FU406C,
17067 .total_size = 512,
17068 .page_size = 256,
17069 .feature_bits = FEATURE_WRSR_WREN,
17070 .tested = TEST_OK_PREW,
17071 .probe = probe_spi_rdid,
17072 .probe_timing = TIMING_ZERO,
17073 .block_erasers =
17074 {
17075 {
17076 .eraseblocks = { {4 * 1024, 128} },
17077 .block_erase = spi_block_erase_20,
17078 }, {
17079 .eraseblocks = { {4 * 1024, 128} },
17080 .block_erase = spi_block_erase_d7,
17081 }, {
17082 .eraseblocks = { {64 * 1024, 8} },
17083 .block_erase = spi_block_erase_d8,
17084 }, {
17085 .eraseblocks = { {512 * 1024, 1} },
17086 .block_erase = spi_block_erase_60,
17087 }, {
17088 .eraseblocks = { {512 * 1024, 1} },
17089 .block_erase = spi_block_erase_c7,
17090 }
17091 },
17092 .printlock = spi_prettyprint_status_register_bp2_srwd,
17093 .unlock = spi_disable_blockprotect_bp2_srwd,
17094 .write = spi_chip_write_256,
17095 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
17096 .voltage = {2300, 3600},
17097 },
17098
17099 {
17100 .vendor = "Sanyo",
17101 .name = "LE25FW106",
17102 .bustype = BUS_SPI,
17103 .manufacture_id = SANYO_ID,
17104 .model_id = SANYO_LE25FW106,
17105 .total_size = 128,
17106 .page_size = 256,
17107 .feature_bits = FEATURE_WRSR_WREN,
17108 .tested = TEST_OK_PREW,
17109 .probe = probe_spi_res2,
17110 .probe_timing = TIMING_ZERO,
17111 .block_erasers =
17112 {
17113 {
17114 .eraseblocks = { {2 * 1024, 64} },
17115 .block_erase = spi_block_erase_d7,
17116 }, {
17117 .eraseblocks = { {32 * 1024, 4} },
17118 .block_erase = spi_block_erase_d8,
17119 }, {
17120 .eraseblocks = { {128 * 1024, 1} },
17121 .block_erase = spi_block_erase_c7,
17122 }
17123 },
17124 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
17125 .unlock = spi_disable_blockprotect_bp1_srwd,
17126 .write = spi_chip_write_256,
17127 .read = spi_chip_read,
17128 .voltage = {2700, 3600},
17129 },
17130
17131 {
17132 .vendor = "Sanyo",
17133 .name = "LE25FW203A",
17134 .bustype = BUS_SPI,
17135 .manufacture_id = SANYO_ID,
17136 .model_id = SANYO_LE25FW203A,
17137 .total_size = 256,
17138 .page_size = 256,
17139 .tested = TEST_UNTESTED,
17140 .probe = probe_spi_rdid,
17141 .probe_timing = TIMING_ZERO,
17142 .block_erasers =
17143 {
17144 {
17145 .eraseblocks = { {256, 1024} },
17146 .block_erase = spi_block_erase_db,
17147 }, {
17148 .eraseblocks = { {64 * 1024, 4} },
17149 .block_erase = spi_block_erase_d8,
17150 }, {
17151 .eraseblocks = { {256 * 1024, 1} },
17152 .block_erase = spi_block_erase_c7,
17153 }
17154 },
17155 .printlock = spi_prettyprint_status_register_default_welwip,
17156 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
17157 .write = spi_chip_write_256,
17158 .read = spi_chip_read,
17159 .voltage = {2700, 3600},
17160 },
17161
17162 {
17163 .vendor = "Sanyo",
17164 .name = "LE25FW403A",
17165 .bustype = BUS_SPI,
17166 .manufacture_id = SANYO_ID,
17167 .model_id = SANYO_LE25FW403A,
17168 .total_size = 512,
17169 .page_size = 256,
17170 .tested = TEST_UNTESTED,
17171 .probe = probe_spi_rdid,
17172 .probe_timing = TIMING_ZERO,
17173 .block_erasers =
17174 {
17175 {
17176 .eraseblocks = { {256, 2 * 1024} },
17177 .block_erase = spi_block_erase_db,
17178 }, {
17179 .eraseblocks = { {64 * 1024, 8} },
17180 .block_erase = spi_block_erase_d8,
17181 }, {
17182 .eraseblocks = { {512 * 1024, 1} },
17183 .block_erase = spi_block_erase_c7,
17184 }
17185 },
17186 .printlock = spi_prettyprint_status_register_default_welwip,
17187 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
17188 .write = spi_chip_write_256,
17189 .read = spi_chip_read,
17190 .voltage = {2700, 3600},
17191 },
17192
17193 {
17194 .vendor = "Sanyo",
17195 .name = "LE25FW406A",
17196 .bustype = BUS_SPI,
17197 .manufacture_id = SANYO_ID,
17198 .model_id = SANYO_LE25FW406A,
17199 .total_size = 512,
17200 .page_size = 256,
17201 .feature_bits = FEATURE_WRSR_WREN,
17202 .tested = TEST_OK_PREW,
17203 .probe = probe_spi_res2,
17204 .probe_timing = TIMING_ZERO,
17205 .block_erasers =
17206 {
17207 {
17208 .eraseblocks = { {4 * 1024, 128} },
17209 .block_erase = spi_block_erase_d7,
17210 }, {
17211 .eraseblocks = { {64 * 1024, 8} },
17212 .block_erase = spi_block_erase_d8,
17213 }, {
17214 .eraseblocks = { {512 * 1024, 1} },
17215 .block_erase = spi_block_erase_c7,
17216 }
17217 },
17218 .printlock = spi_prettyprint_status_register_plain,
17219 .unlock = spi_disable_blockprotect,
17220 .write = spi_chip_write_256,
17221 .read = spi_chip_read,
17222 .voltage = {2700, 3600},
17223 },
17224
17225 {
17226 .vendor = "Sanyo",
17227 .name = "LE25FW418A",
17228 .bustype = BUS_SPI,
17229 .manufacture_id = SANYO_ID,
17230 .model_id = SANYO_LE25FW418A,
17231 .total_size = 512,
17232 .page_size = 256,
17233 .feature_bits = FEATURE_WRSR_WREN,
17234 .tested = TEST_UNTESTED,
17235 .probe = probe_spi_res2,
17236 .probe_timing = TIMING_ZERO,
17237 .block_erasers =
17238 {
17239 {
17240 .eraseblocks = { {4 * 1024, 128} },
17241 .block_erase = spi_block_erase_d7,
17242 }, {
17243 .eraseblocks = { {64 * 1024, 8} },
17244 .block_erase = spi_block_erase_d8,
17245 }, {
17246 .eraseblocks = { {512 * 1024, 1} },
17247 .block_erase = spi_block_erase_c7,
17248 }
17249 },
17250 .printlock = spi_prettyprint_status_register_bp2_srwd,
17251 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
17252 .write = spi_chip_write_256,
17253 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
17254 .voltage = {2700, 3600},
17255 },
17256
17257 {
17258 .vendor = "Sanyo",
17259 .name = "LE25FW806",
17260 .bustype = BUS_SPI,
17261 .manufacture_id = SANYO_ID,
17262 .model_id = SANYO_LE25FW806,
17263 .total_size = 1024,
17264 .page_size = 256,
17265 .feature_bits = FEATURE_WRSR_WREN,
17266 .tested = TEST_UNTESTED,
17267 .probe = probe_spi_res2,
17268 .probe_timing = TIMING_ZERO,
17269 .block_erasers =
17270 {
17271 {
17272 .eraseblocks = { {4 * 1024, 256} },
17273 .block_erase = spi_block_erase_20,
17274 }, {
17275 .eraseblocks = { {4 * 1024, 256} },
17276 .block_erase = spi_block_erase_d7,
17277 }, {
17278 .eraseblocks = { {64 * 1024, 16} },
17279 .block_erase = spi_block_erase_d8,
17280 }, {
17281 .eraseblocks = { {1024 * 1024, 1} },
17282 .block_erase = spi_block_erase_c7,
17283 }
17284 },
17285 .printlock = spi_prettyprint_status_register_bp2_srwd,
17286 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
17287 .write = spi_chip_write_256,
17288 .read = spi_chip_read,
17289 .voltage = {2700, 3600},
17290 },
17291
17292 {
17293 .vendor = "Sanyo",
17294 .name = "LE25FW808",
17295 .bustype = BUS_SPI,
17296 .manufacture_id = SANYO_ID,
17297 .model_id = SANYO_LE25FW808,
17298 .total_size = 1024,
17299 .page_size = 256,
17300 .feature_bits = FEATURE_WRSR_WREN,
17301 .tested = TEST_UNTESTED,
17302 .probe = probe_spi_res2,
17303 .probe_timing = TIMING_ZERO,
17304 .block_erasers =
17305 {
17306 {
17307 .eraseblocks = { {8 * 1024, 128} },
17308 .block_erase = spi_block_erase_d7,
17309 }, {
17310 .eraseblocks = { {64 * 1024, 16} },
17311 .block_erase = spi_block_erase_d8,
17312 }, {
17313 .eraseblocks = { {1024 * 1024, 1} },
17314 .block_erase = spi_block_erase_c7,
17315 }
17316 },
17317 .printlock = spi_prettyprint_status_register_bp2_srwd,
17318 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
17319 .write = spi_chip_write_256,
17320 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
17321 .voltage = {2700, 3600},
17322 },
17323
17324 {
17325 .vendor = "Sharp",
17326 .name = "LH28F008BJT-BTLZ1",
17327 .bustype = BUS_PARALLEL,
17328 .manufacture_id = SHARP_ID,
17329 .model_id = SHARP_LH28F008BJ__PB,
17330 .total_size = 1024,
17331 .page_size = 64 * 1024,
17332 .tested = TEST_OK_PREW,
17333 .probe = probe_82802ab,
17334 .probe_timing = TIMING_ZERO,
17335 .block_erasers =
17336 {
17337 {
17338 .eraseblocks = {
17339 {8 * 1024, 8},
17340 {64 * 1024, 15}
17341 },
17342 .block_erase = erase_block_82802ab,
17343 }, {
17344 .eraseblocks = { {1024 * 1024, 1} },
17345 .block_erase = erase_sector_49lfxxxc,
17346 }
17347 },
17348 .unlock = unlock_lh28f008bjt,
17349 .write = write_82802ab,
17350 .read = read_memmapped,
17351 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017352 .prepare_access = prepare_memory_access,
17353 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017354 },
17355
17356 {
17357 .vendor = "Sharp",
17358 .name = "LHF00L04",
17359 .bustype = BUS_FWH, /* A/A Mux */
17360 .manufacture_id = SHARP_ID,
17361 .model_id = SHARP_LHF00L04,
17362 .total_size = 1024,
17363 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010017364 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017365 .tested = TEST_UNTESTED,
17366 .probe = probe_82802ab,
17367 .probe_timing = TIMING_ZERO,
17368 .block_erasers =
17369 {
17370 {
17371 .eraseblocks = {
17372 {64 * 1024, 15},
17373 {8 * 1024, 8}
17374 },
17375 .block_erase = erase_block_82802ab,
17376 }, {
17377 .eraseblocks = {
17378 {1024 * 1024, 1}
17379 },
17380 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
17381 },
17382 },
17383 .unlock = unlock_regspace2_uniform_64k,
17384 .write = write_82802ab,
17385 .read = read_memmapped,
17386 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010017387 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010017388 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017389 },
17390
17391 {
17392 .vendor = "Spansion",
17393 .name = "S25FL004A",
17394 .bustype = BUS_SPI,
17395 .manufacture_id = SPANSION_ID,
17396 .model_id = SPANSION_S25FL004A,
17397 .total_size = 512,
17398 .page_size = 256,
17399 .feature_bits = FEATURE_WRSR_WREN,
17400 .tested = TEST_UNTESTED,
17401 .probe = probe_spi_rdid,
17402 .probe_timing = TIMING_ZERO,
17403 .block_erasers =
17404 {
17405 {
17406 .eraseblocks = { {64 * 1024, 8} },
17407 .block_erase = spi_block_erase_d8,
17408 }, {
17409 .eraseblocks = { {512 * 1024, 1} },
17410 .block_erase = spi_block_erase_c7,
17411 }
17412 },
17413 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17414 .unlock = spi_disable_blockprotect,
17415 .write = spi_chip_write_256,
17416 .read = spi_chip_read,
17417 .voltage = {2700, 3600},
17418 },
17419
17420 {
17421 .vendor = "Spansion",
17422 .name = "S25FL008A",
17423 .bustype = BUS_SPI,
17424 .manufacture_id = SPANSION_ID,
17425 .model_id = SPANSION_S25FL008A,
17426 .total_size = 1024,
17427 .page_size = 256,
17428 .feature_bits = FEATURE_WRSR_WREN,
17429 .tested = TEST_OK_PRE,
17430 .probe = probe_spi_rdid,
17431 .probe_timing = TIMING_ZERO,
17432 .block_erasers =
17433 {
17434 {
17435 .eraseblocks = { {64 * 1024, 16} },
17436 .block_erase = spi_block_erase_d8,
17437 }, {
17438 .eraseblocks = { {1024 * 1024, 1} },
17439 .block_erase = spi_block_erase_c7,
17440 }
17441 },
17442 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17443 .unlock = spi_disable_blockprotect,
17444 .write = spi_chip_write_256,
17445 .read = spi_chip_read,
17446 .voltage = {2700, 3600},
17447 },
17448
17449 {
17450 .vendor = "Spansion",
17451 .name = "S25FL016A",
17452 .bustype = BUS_SPI,
17453 .manufacture_id = SPANSION_ID,
17454 .model_id = SPANSION_S25FL016A,
17455 .total_size = 2048,
17456 .page_size = 256,
17457 .feature_bits = FEATURE_WRSR_WREN,
17458 .tested = TEST_OK_PREW,
17459 .probe = probe_spi_rdid,
17460 .probe_timing = TIMING_ZERO,
17461 .block_erasers =
17462 {
17463 {
17464 .eraseblocks = { {64 * 1024, 32} },
17465 .block_erase = spi_block_erase_d8,
17466 }, {
17467 .eraseblocks = { {2 * 1024 * 1024, 1} },
17468 .block_erase = spi_block_erase_c7,
17469 }
17470 },
17471 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17472 .unlock = spi_disable_blockprotect,
17473 .write = spi_chip_write_256,
17474 .read = spi_chip_read,
17475 .voltage = {2700, 3600},
17476 },
17477
17478 {
17479 .vendor = "Spansion",
17480 .name = "S25FL032A/P",
17481 .bustype = BUS_SPI,
17482 .manufacture_id = SPANSION_ID,
17483 .model_id = SPANSION_S25FL032A,
17484 .total_size = 4096,
17485 .page_size = 256,
17486 .feature_bits = FEATURE_WRSR_WREN,
17487 .tested = TEST_OK_PREW,
17488 .probe = probe_spi_rdid,
17489 .probe_timing = TIMING_ZERO,
17490 .block_erasers =
17491 {
17492 {
17493 .eraseblocks = { {64 * 1024, 64} },
17494 .block_erase = spi_block_erase_d8,
17495 }, {
17496 .eraseblocks = { {4 * 1024 * 1024, 1} },
17497 .block_erase = spi_block_erase_c7,
17498 }
17499 },
17500 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17501 .unlock = spi_disable_blockprotect,
17502 .write = spi_chip_write_256,
17503 .read = spi_chip_read,
17504 .voltage = {2700, 3600},
17505 },
17506
17507 {
17508 .vendor = "Spansion",
17509 .name = "S25FL064A/P",
17510 .bustype = BUS_SPI,
17511 .manufacture_id = SPANSION_ID,
17512 .model_id = SPANSION_S25FL064A,
17513 .total_size = 8192,
17514 .page_size = 256,
17515 .feature_bits = FEATURE_WRSR_WREN,
17516 .tested = TEST_OK_PREW,
17517 .probe = probe_spi_rdid,
17518 .probe_timing = TIMING_ZERO,
17519 .block_erasers =
17520 {
17521 {
17522 .eraseblocks = { {64 * 1024, 128} },
17523 .block_erase = spi_block_erase_d8,
17524 }, {
17525 .eraseblocks = { {8 * 1024 * 1024, 1} },
17526 .block_erase = spi_block_erase_c7,
17527 }
17528 },
17529 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17530 .unlock = spi_disable_blockprotect,
17531 .write = spi_chip_write_256,
17532 .read = spi_chip_read,
17533 .voltage = {2700, 3600},
17534 },
17535
17536 {
17537 .vendor = "Spansion",
17538 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
17539 .bustype = BUS_SPI,
17540 .manufacture_id = SPANSION_ID,
17541 .model_id = SPANSION_S25FL216,
17542 .total_size = 2048,
17543 .page_size = 256,
17544 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
17545 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17546 .tested = TEST_UNTESTED,
17547 .probe = probe_spi_rdid,
17548 .probe_timing = TIMING_ZERO,
17549 .block_erasers =
17550 {
17551 {
17552 .eraseblocks = { {4 * 1024, 512} },
17553 .block_erase = spi_block_erase_20,
17554 }, {
17555 .eraseblocks = { {64 * 1024, 32} },
17556 .block_erase = spi_block_erase_d8,
17557 }, {
17558 .eraseblocks = { { 2048 * 1024, 1} },
17559 .block_erase = spi_block_erase_60,
17560 }, {
17561 .eraseblocks = { { 2048 * 1024, 1} },
17562 .block_erase = spi_block_erase_c7,
17563 }
17564 },
17565 .printlock = spi_prettyprint_status_register_bp3_srwd,
17566 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17567 .write = spi_chip_write_256,
17568 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17569 .voltage = {2700, 3600},
17570 },
17571
17572 {
17573 .vendor = "Spansion",
17574 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
17575 .bustype = BUS_SPI,
17576 .manufacture_id = SPANSION_ID,
17577 .model_id = SPANSION_S25FL128,
17578 .total_size = 16384,
17579 .page_size = 512,
17580 /* supports 4B addressing */
17581 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17582 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17583 .tested = TEST_UNTESTED,
17584 .probe = probe_spi_rdid,
17585 .probe_timing = TIMING_ZERO,
17586 .block_erasers =
17587 {
17588 {
17589 .eraseblocks = { {256 * 1024, 64} },
17590 .block_erase = spi_block_erase_d8,
17591 }, {
17592 .eraseblocks = { { 16384 * 1024, 1} },
17593 .block_erase = spi_block_erase_60,
17594 }, {
17595 .eraseblocks = { { 16384 * 1024, 1} },
17596 .block_erase = spi_block_erase_c7,
17597 }
17598 },
17599 .printlock = spi_prettyprint_status_register_bp2_srwd,
17600 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17601 .write = spi_chip_write_256, /* Multi I/O supported */
17602 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17603 .voltage = {2700, 3600},
17604 },
17605
17606 {
17607 .vendor = "Spansion",
17608 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17609 .bustype = BUS_SPI,
17610 .manufacture_id = SPANSION_ID,
17611 .model_id = SPANSION_S25FL128,
17612 .total_size = 16384,
17613 .page_size = 256,
17614 /* supports 4B addressing */
17615 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17616 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17617 .tested = TEST_OK_PREW,
17618 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
17619 .probe = probe_spi_rdid,
17620 .probe_timing = TIMING_ZERO,
17621 .block_erasers =
17622 {
17623 {
17624 /* This chip supports erasing of 32 so-called "parameter sectors" with
17625 * opcode 0x20 which may be configured to be on top or bottom of the address
17626 * space. Trying to access an address outside these 4kB blocks does have no
17627 * effect on the memory contents, e.g.
17628 .eraseblocks = {
17629 {4 * 1024, 32},
17630 {64 * 1024, 254} // inaccessible
17631 },
17632 .block_erase = spi_block_erase_20,
17633 }, { */
17634 .eraseblocks = { { 64 * 1024, 256} },
17635 .block_erase = spi_block_erase_d8,
17636 }, {
17637 .eraseblocks = { { 16384 * 1024, 1} },
17638 .block_erase = spi_block_erase_60,
17639 }, {
17640 .eraseblocks = { { 16384 * 1024, 1} },
17641 .block_erase = spi_block_erase_c7,
17642 }
17643 },
17644 .printlock = spi_prettyprint_status_register_bp2_srwd,
17645 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17646 .write = spi_chip_write_256, /* Multi I/O supported */
17647 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17648 .voltage = {2700, 3600},
17649 },
17650
17651 {
17652 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017653 .name = "S25FL128L",
17654 .bustype = BUS_SPI,
17655 .manufacture_id = SPANSION_ID,
17656 .model_id = SPANSION_S25FL128L,
17657 .total_size = 16384,
17658 .page_size = 256,
17659 /* 4 x 256B Security Region (OTP) */
17660 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP,
17661 .tested = TEST_UNTESTED,
17662 .probe = probe_spi_rdid,
17663 .probe_timing = TIMING_ZERO,
17664 .block_erasers =
17665 {
17666 {
17667 .eraseblocks = { {4 * 1024, 4096} },
17668 .block_erase = spi_block_erase_20,
17669 }, {
17670 .eraseblocks = { {32 * 1024, 512} },
17671 .block_erase = spi_block_erase_52,
17672 }, {
17673 .eraseblocks = { {64 * 1024, 256} },
17674 .block_erase = spi_block_erase_d8,
17675 }, {
17676 .eraseblocks = { {16384 * 1024, 1} },
17677 .block_erase = spi_block_erase_60,
17678 }, {
17679 .eraseblocks = { {16384 * 1024, 1} },
17680 .block_erase = spi_block_erase_c7,
17681 }
17682 },
17683 .printlock = spi_prettyprint_status_register_bp2_srwd,
17684 .unlock = spi_disable_blockprotect_bp2_srwd,
17685 .write = spi_chip_write_256,
17686 .read = spi_chip_read, /* Fast read (0x0B) supported */
17687 .voltage = {2700, 3600},
17688 .reg_bits =
17689 {
17690 /*
17691 * Note: This chip has a read-only Status Register 2 that is not
17692 * counted here. Registers are mapped as follows:
17693 * STATUS1 ... Status Register 1
17694 * STATUS2 ... Configuration Register 1
17695 * STATUS3 ... Configuration Register 2
17696 */
17697 .srp = {STATUS1, 7, RW},
17698 .srl = {STATUS2, 0, RW},
17699 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17700 .tb = {STATUS1, 5, RW},
17701 .sec = {STATUS1, 6, RW},
17702 .cmp = {STATUS2, 6, RW},
17703 .wps = {STATUS3, 2, RW},
17704 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017705 .wp_write_cfg = spi_wp_write_cfg,
17706 .wp_read_cfg = spi_wp_read_cfg,
17707 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017708 .decode_range = decode_range_spi25,
17709 },
17710
17711 {
17712 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017713 .name = "S25FL128P......0", /* uniform 64 kB sectors */
17714 .bustype = BUS_SPI,
17715 .manufacture_id = SPANSION_ID,
17716 .model_id = SPANSION_S25FL128,
17717 .total_size = 16384,
17718 .page_size = 256,
17719 .feature_bits = FEATURE_WRSR_WREN,
17720 .tested = TEST_OK_PREW,
17721 .probe = probe_spi_rdid,
17722 .probe_timing = TIMING_ZERO,
17723 .block_erasers =
17724 {
17725 {
17726 .eraseblocks = { {64 * 1024, 256} },
17727 .block_erase = spi_block_erase_20,
17728 }, {
17729 .eraseblocks = { {64 * 1024, 256} },
17730 .block_erase = spi_block_erase_d8,
17731 }, {
17732 .eraseblocks = { { 16384 * 1024, 1} },
17733 .block_erase = spi_block_erase_60,
17734 }, {
17735 .eraseblocks = { { 16384 * 1024, 1} },
17736 .block_erase = spi_block_erase_c7,
17737 }
17738 },
17739 .printlock = spi_prettyprint_status_register_bp3_srwd,
17740 .unlock = spi_disable_blockprotect_bp3_srwd,
17741 .write = spi_chip_write_256,
17742 .read = spi_chip_read, /* Fast read (0x0B) supported */
17743 .voltage = {2700, 3600},
17744 },
17745
17746 {
17747 .vendor = "Spansion",
17748 .name = "S25FL128P......1", /* uniform 256kB sectors */
17749 .bustype = BUS_SPI,
17750 .manufacture_id = SPANSION_ID,
17751 .model_id = SPANSION_S25FL128,
17752 .total_size = 16384,
17753 .page_size = 256,
17754 .feature_bits = FEATURE_WRSR_WREN,
17755 .tested = TEST_UNTESTED,
17756 .probe = probe_spi_rdid,
17757 .probe_timing = TIMING_ZERO,
17758 .block_erasers =
17759 {
17760 {
17761 .eraseblocks = { {256 * 1024, 64} },
17762 .block_erase = spi_block_erase_d8,
17763 }, {
17764 .eraseblocks = { { 16384 * 1024, 1} },
17765 .block_erase = spi_block_erase_c7,
17766 }
17767 },
17768 .printlock = spi_prettyprint_status_register_bp2_srwd,
17769 .unlock = spi_disable_blockprotect_bp2_srwd,
17770 .write = spi_chip_write_256,
17771 .read = spi_chip_read, /* Fast read (0x0B) supported */
17772 .voltage = {2700, 3600},
17773 },
17774
17775 {
17776 .vendor = "Spansion",
17777 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17778 .bustype = BUS_SPI,
17779 .manufacture_id = SPANSION_ID,
17780 .model_id = SPANSION_S25FL128,
17781 .total_size = 16384,
17782 .page_size = 256,
17783 /* supports 4B addressing */
17784 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17785 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17786 .tested = TEST_OK_PREW,
17787 .probe = probe_spi_rdid,
17788 .probe_timing = TIMING_ZERO,
17789 .block_erasers =
17790 {
17791 {
17792 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17793 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17794 * have no effect on the memory contents, but sets a flag in the SR.
17795 .eraseblocks = {
17796 {4 * 1024, 32},
17797 {64 * 1024, 254} // inaccessible
17798 },
17799 .block_erase = spi_block_erase_20,
17800 }, { */
17801 .eraseblocks = { { 64 * 1024, 256} },
17802 .block_erase = spi_block_erase_d8,
17803 }, {
17804 .eraseblocks = { { 16384 * 1024, 1} },
17805 .block_erase = spi_block_erase_60,
17806 }, {
17807 .eraseblocks = { { 16384 * 1024, 1} },
17808 .block_erase = spi_block_erase_c7,
17809 }
17810 },
17811 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17812 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17813 .write = spi_chip_write_256, /* Multi I/O supported */
17814 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17815 .voltage = {2700, 3600},
17816 },
17817
17818 {
17819 .vendor = "Spansion",
17820 .name = "S25FL128S......1", /* uniform 256 kB sectors */
17821 .bustype = BUS_SPI,
17822 .manufacture_id = SPANSION_ID,
17823 .model_id = SPANSION_S25FL128,
17824 .total_size = 16384,
17825 .page_size = 512,
17826 /* supports 4B addressing */
17827 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17828 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17829 .tested = TEST_UNTESTED,
17830 .probe = probe_spi_rdid,
17831 .probe_timing = TIMING_ZERO,
17832 .block_erasers =
17833 {
17834 {
17835 .eraseblocks = { {256 * 1024, 64} },
17836 .block_erase = spi_block_erase_d8,
17837 }, {
17838 .eraseblocks = { { 16384 * 1024, 1} },
17839 .block_erase = spi_block_erase_60,
17840 }, {
17841 .eraseblocks = { { 16384 * 1024, 1} },
17842 .block_erase = spi_block_erase_c7,
17843 }
17844 },
17845 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17846 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17847 .write = spi_chip_write_256, /* Multi I/O supported */
17848 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17849 .voltage = {2700, 3600},
17850 },
17851
17852 {
17853 .vendor = "Spansion",
17854 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17855 .bustype = BUS_SPI,
17856 .manufacture_id = SPANSION_ID,
17857 .model_id = SPANSION_S25FL128,
17858 .total_size = 16384,
17859 .page_size = 256,
17860 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17861 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17862 .tested = TEST_OK_PREW,
17863 .probe = probe_spi_rdid,
17864 .probe_timing = TIMING_ZERO,
17865 .block_erasers =
17866 {
17867 {
17868 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
17869 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
17870 * effect on the memory contents, but sets a flag in the SR.
17871 .eraseblocks = {
17872 {4 * 1024, 32},
17873 {64 * 1024, 254} // inaccessible
17874 },
17875 .block_erase = spi_block_erase_20,
17876 }, { */
17877 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
17878 .eraseblocks = {
17879 {8 * 1024, 16},
17880 {64 * 1024, 254} // inaccessible
17881 },
17882 .block_erase = spi_block_erase_40,
17883 }, { */
17884 .eraseblocks = { { 64 * 1024, 256} },
17885 .block_erase = spi_block_erase_d8,
17886 }, {
17887 .eraseblocks = { { 16384 * 1024, 1} },
17888 .block_erase = spi_block_erase_60,
17889 }, {
17890 .eraseblocks = { { 16384 * 1024, 1} },
17891 .block_erase = spi_block_erase_c7,
17892 }
17893 },
17894 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17895 .unlock = spi_disable_blockprotect_bp2_srwd,
17896 .write = spi_chip_write_256, /* Multi I/O supported */
17897 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17898 .voltage = {2700, 3600},
17899 },
17900
17901 {
17902 .vendor = "Spansion",
17903 .name = "S25FL129P......1", /* uniform 256 kB sectors */
17904 .bustype = BUS_SPI,
17905 .manufacture_id = SPANSION_ID,
17906 .model_id = SPANSION_S25FL128,
17907 .total_size = 16384,
17908 .page_size = 256,
17909 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17910 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17911 .tested = TEST_UNTESTED,
17912 .probe = probe_spi_rdid,
17913 .probe_timing = TIMING_ZERO,
17914 .block_erasers =
17915 {
17916 {
17917 .eraseblocks = { {256 * 1024, 64} },
17918 .block_erase = spi_block_erase_d8,
17919 }, {
17920 .eraseblocks = { { 16384 * 1024, 1} },
17921 .block_erase = spi_block_erase_60,
17922 }, {
17923 .eraseblocks = { { 16384 * 1024, 1} },
17924 .block_erase = spi_block_erase_c7,
17925 }
17926 },
17927 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17928 .unlock = spi_disable_blockprotect_bp2_srwd,
17929 .write = spi_chip_write_256, /* Multi I/O supported */
17930 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17931 .voltage = {2700, 3600},
17932 },
17933
17934 {
17935 .vendor = "Spansion",
17936 .name = "S25FL132K",
17937 .bustype = BUS_SPI,
17938 .manufacture_id = SPANSION_ID,
17939 .model_id = SPANSION_S25FL132K,
17940 .total_size = 4096,
17941 .page_size = 256,
17942 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17943 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17944 .tested = TEST_UNTESTED,
17945 .probe = probe_spi_rdid,
17946 .probe_timing = TIMING_ZERO,
17947 .block_erasers =
17948 {
17949 {
17950 .eraseblocks = { {4 * 1024, 1024} },
17951 .block_erase = spi_block_erase_20,
17952 }, {
17953 .eraseblocks = { {64 * 1024, 64} },
17954 .block_erase = spi_block_erase_d8,
17955 }, {
17956 .eraseblocks = { { 4096 * 1024, 1} },
17957 .block_erase = spi_block_erase_60,
17958 }, {
17959 .eraseblocks = { { 4096 * 1024, 1} },
17960 .block_erase = spi_block_erase_c7,
17961 }
17962 },
17963 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17964 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17965 .write = spi_chip_write_256,
17966 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17967 .voltage = {2700, 3600},
17968 },
17969
17970 {
17971 .vendor = "Spansion",
17972 .name = "S25FL164K",
17973 .bustype = BUS_SPI,
17974 .manufacture_id = SPANSION_ID,
17975 .model_id = SPANSION_S25FL164K,
17976 .total_size = 8192,
17977 .page_size = 256,
17978 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17980 .tested = TEST_OK_PREW,
17981 .probe = probe_spi_rdid,
17982 .probe_timing = TIMING_ZERO,
17983 .block_erasers =
17984 {
17985 {
17986 .eraseblocks = { {4 * 1024, 2048} },
17987 .block_erase = spi_block_erase_20,
17988 }, {
17989 .eraseblocks = { {64 * 1024, 128} },
17990 .block_erase = spi_block_erase_d8,
17991 }, {
17992 .eraseblocks = { { 8192 * 1024, 1} },
17993 .block_erase = spi_block_erase_60,
17994 }, {
17995 .eraseblocks = { { 8192 * 1024, 1} },
17996 .block_erase = spi_block_erase_c7,
17997 }
17998 },
17999 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
18000 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
18001 .write = spi_chip_write_256,
18002 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
18003 .voltage = {2700, 3600},
18004 },
18005
18006 {
18007 .vendor = "Spansion",
18008 .name = "S25FL204K",
18009 .bustype = BUS_SPI,
18010 .manufacture_id = SPANSION_ID,
18011 .model_id = SPANSION_S25FL204,
18012 .total_size = 512,
18013 .page_size = 256,
18014 .feature_bits = FEATURE_WRSR_WREN,
18015 .tested = TEST_OK_PR,
18016 .probe = probe_spi_rdid,
18017 .probe_timing = TIMING_ZERO,
18018 .block_erasers =
18019 {
18020 {
18021 .eraseblocks = { {4 * 1024, 128} },
18022 .block_erase = spi_block_erase_20,
18023 }, {
18024 .eraseblocks = { {64 * 1024, 8} },
18025 .block_erase = spi_block_erase_d8,
18026 }, {
18027 .eraseblocks = { { 512 * 1024, 1} },
18028 .block_erase = spi_block_erase_60,
18029 }, {
18030 .eraseblocks = { { 512 * 1024, 1} },
18031 .block_erase = spi_block_erase_c7,
18032 }
18033 },
18034 .printlock = spi_prettyprint_status_register_bp3_srwd,
18035 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
18036 .write = spi_chip_write_256,
18037 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
18038 .voltage = {2700, 3600},
18039 },
18040
18041 {
18042 .vendor = "Spansion",
18043 .name = "S25FL208K",
18044 .bustype = BUS_SPI,
18045 .manufacture_id = SPANSION_ID,
18046 .model_id = SPANSION_S25FL208,
18047 .total_size = 1024,
18048 .page_size = 256,
18049 .feature_bits = FEATURE_WRSR_WREN,
18050 .tested = TEST_OK_PREW,
18051 .probe = probe_spi_rdid,
18052 .probe_timing = TIMING_ZERO,
18053 .block_erasers =
18054 {
18055 {
18056 .eraseblocks = { {4 * 1024, 256} },
18057 .block_erase = spi_block_erase_20,
18058 }, {
18059 .eraseblocks = { {64 * 1024, 16} },
18060 .block_erase = spi_block_erase_d8,
18061 }, {
18062 .eraseblocks = { { 1024 * 1024, 1} },
18063 .block_erase = spi_block_erase_60,
18064 }, {
18065 .eraseblocks = { { 1024 * 1024, 1} },
18066 .block_erase = spi_block_erase_c7,
18067 }
18068 },
18069 .printlock = spi_prettyprint_status_register_bp3_srwd,
18070 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
18071 .write = spi_chip_write_256,
18072 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
18073 .voltage = {2700, 3600},
18074 },
18075
18076 {
18077 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020018078 .name = "S25FL256L",
18079 .bustype = BUS_SPI,
18080 .manufacture_id = SPANSION_ID,
18081 .model_id = SPANSION_S25FL256L,
18082 .total_size = 32768,
18083 .page_size = 256,
18084 /* 4 x 256B Security Region (OTP) */
18085 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP |
18086 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE,
18087 .tested = TEST_UNTESTED,
18088 .probe = probe_spi_rdid,
18089 .probe_timing = TIMING_ZERO,
18090 .block_erasers =
18091 {
18092 {
18093 .eraseblocks = { {4 * 1024, 8192} },
18094 .block_erase = spi_block_erase_21,
18095 }, {
18096 .eraseblocks = { {4 * 1024, 8192} },
18097 .block_erase = spi_block_erase_20,
18098 }, {
18099 .eraseblocks = { {32 * 1024, 1024} },
18100 .block_erase = spi_block_erase_53,
18101 }, {
18102 .eraseblocks = { {32 * 1024, 1024} },
18103 .block_erase = spi_block_erase_52,
18104 }, {
18105 .eraseblocks = { {64 * 1024, 512} },
18106 .block_erase = spi_block_erase_dc,
18107 }, {
18108 .eraseblocks = { {64 * 1024, 512} },
18109 .block_erase = spi_block_erase_d8,
18110 }, {
18111 .eraseblocks = { {32768 * 1024, 1} },
18112 .block_erase = spi_block_erase_60,
18113 }, {
18114 .eraseblocks = { {32768 * 1024, 1} },
18115 .block_erase = spi_block_erase_c7,
18116 }
18117 },
18118 .printlock = spi_prettyprint_status_register_bp3_srwd,
18119 .unlock = spi_disable_blockprotect_bp3_srwd,
18120 .write = spi_chip_write_256,
18121 .read = spi_chip_read, /* Fast read (0x0B) supported */
18122 .voltage = {2700, 3600},
18123 .reg_bits =
18124 {
18125 /*
18126 * Note: This chip has a read-only Status Register 2 that is not
18127 * counted here. Registers are mapped as follows:
18128 * STATUS1 ... Status Register 1
18129 * STATUS2 ... Configuration Register 1
18130 * STATUS3 ... Configuration Register 2
18131 */
18132 .srp = {STATUS1, 7, RW},
18133 .srl = {STATUS2, 0, RW},
18134 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18135 .tb = {STATUS1, 6, RW},
18136 .cmp = {STATUS2, 6, RW},
18137 .wps = {STATUS3, 2, RW},
18138 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018139 .wp_write_cfg = spi_wp_write_cfg,
18140 .wp_read_cfg = spi_wp_read_cfg,
18141 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020018142 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018143 .prepare_access = spi_prepare_io,
18144 .finish_access = spi_finish_io,
Nico Huberfffc48d2022-05-28 14:26:06 +020018145 },
18146
18147 {
18148 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018149 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
18150 .bustype = BUS_SPI,
18151 .manufacture_id = SPANSION_ID,
18152 .model_id = SPANSION_S25FL256,
18153 .total_size = 32768,
18154 .page_size = 256,
18155 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber9bb8a322022-05-24 15:07:34 +020018156 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18157 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018158 .tested = TEST_OK_PREW,
18159 .probe = probe_spi_rdid,
18160 .probe_timing = TIMING_ZERO,
18161 .block_erasers =
18162 {
18163 {
18164 /* This chip supports erasing of the 32 so-called "parameter sectors" with
18165 * opcode 0x20. Trying to access an address outside these 4kB blocks does
18166 * have no effect on the memory contents, but sets a flag in the SR.
18167 .eraseblocks = {
18168 {4 * 1024, 32},
18169 {64 * 1024, 254} // inaccessible
18170 },
18171 .block_erase = spi_block_erase_20,
18172 }, { */
18173 .eraseblocks = { { 64 * 1024, 512} },
18174 .block_erase = spi_block_erase_dc,
18175 }, {
18176 .eraseblocks = { { 64 * 1024, 512} },
18177 .block_erase = spi_block_erase_d8,
18178 }, {
18179 .eraseblocks = { { 32768 * 1024, 1} },
18180 .block_erase = spi_block_erase_60,
18181 }, {
18182 .eraseblocks = { { 32768 * 1024, 1} },
18183 .block_erase = spi_block_erase_c7,
18184 }
18185 },
18186 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
18187 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
18188 .write = spi_chip_write_256, /* Multi I/O supported */
18189 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
18190 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020018191 .prepare_access = spi_prepare_io,
18192 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018193 },
18194
18195 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010018196 .vendor = "Spansion",
18197 .name = "S25FL512S",
18198 .bustype = BUS_SPI,
18199 .manufacture_id = SPANSION_ID,
18200 .model_id = SPANSION_S25FL512,
18201 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
18202 .page_size = 256,
18203 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber26237922022-06-20 19:37:37 +020018204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18205 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
18206 .tested = TEST_UNTESTED,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010018207 .probe = probe_spi_rdid,
18208 .probe_timing = TIMING_ZERO,
18209 .block_erasers =
18210 {
18211 {
18212 .eraseblocks = { { 256 * 1024, 256} },
18213 .block_erase = spi_block_erase_dc,
18214 }, {
Nico Huberbb608ff2022-05-24 15:33:26 +020018215 .eraseblocks = { { 256 * 1024, 256} },
18216 .block_erase = spi_block_erase_d8,
18217 }, {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010018218 .eraseblocks = { { 65536 * 1024, 1} },
18219 .block_erase = spi_block_erase_60,
18220 }, {
18221 .eraseblocks = { { 65536 * 1024, 1} },
18222 .block_erase = spi_block_erase_c7,
18223 }
18224 },
18225 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
18226 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
18227 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
18228 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
18229 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020018230 .prepare_access = spi_prepare_io,
18231 .finish_access = spi_finish_io,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010018232 },
18233
18234 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000018235 .vendor = "SyncMOS/MoselVitelic",
18236 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018237 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018238 .manufacture_id = SYNCMOS_MVC_ID,
18239 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018240 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018241 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000018242 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018243 .tested = TEST_UNTESTED,
18244 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018245 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018246 .block_erasers =
18247 {
18248 {
18249 .eraseblocks = { {512, 256} },
18250 .block_erase = erase_sector_jedec,
18251 }, {
18252 .eraseblocks = { {128 * 1024, 1} },
18253 .block_erase = erase_chip_block_jedec,
18254 },
18255 },
Sean Nelson35727f72010-01-28 23:55:12 +000018256 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018257 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018258 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018259 .prepare_access = prepare_memory_access,
18260 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000018261 },
18262
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018263 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000018264 .vendor = "SyncMOS/MoselVitelic",
18265 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018266 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018267 .manufacture_id = SYNCMOS_MVC_ID,
18268 .model_id = SM_MVC_29C51001T,
18269 .total_size = 128,
18270 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000018271 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018272 .tested = TEST_UNTESTED,
18273 .probe = probe_jedec,
18274 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
18275 .block_erasers =
18276 {
18277 {
18278 .eraseblocks = { {512, 256} },
18279 .block_erase = erase_sector_jedec,
18280 }, {
18281 .eraseblocks = { {128 * 1024, 1} },
18282 .block_erase = erase_chip_block_jedec,
18283 },
18284 },
18285 .write = write_jedec_1,
18286 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018287 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018288 .prepare_access = prepare_memory_access,
18289 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018290 },
18291
18292 {
18293 .vendor = "SyncMOS/MoselVitelic",
18294 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018295 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018296 .manufacture_id = SYNCMOS_MVC_ID,
18297 .model_id = SM_MVC_29C51002B,
18298 .total_size = 256,
18299 .page_size = 512,
18300 .feature_bits = FEATURE_EITHER_RESET,
18301 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018302 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018303 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018304 .block_erasers =
18305 {
18306 {
18307 .eraseblocks = { {512, 512} },
18308 .block_erase = erase_sector_jedec,
18309 }, {
18310 .eraseblocks = { {256 * 1024, 1} },
18311 .block_erase = erase_chip_block_jedec,
18312 },
18313 },
Sean Nelson35727f72010-01-28 23:55:12 +000018314 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018315 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010018316 .prepare_access = prepare_memory_access,
18317 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000018318 },
18319
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018320 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000018321 .vendor = "SyncMOS/MoselVitelic",
18322 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018323 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018324 .manufacture_id = SYNCMOS_MVC_ID,
18325 .model_id = SM_MVC_29C51002T,
18326 .total_size = 256,
18327 .page_size = 512,
18328 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000018329 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018330 .probe = probe_jedec,
18331 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
18332 .block_erasers =
18333 {
18334 {
18335 .eraseblocks = { {512, 512} },
18336 .block_erase = erase_sector_jedec,
18337 }, {
18338 .eraseblocks = { {256 * 1024, 1} },
18339 .block_erase = erase_chip_block_jedec,
18340 },
18341 },
18342 .write = write_jedec_1,
18343 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010018344 .prepare_access = prepare_memory_access,
18345 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018346 },
18347
18348 {
18349 .vendor = "SyncMOS/MoselVitelic",
18350 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018351 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018352 .manufacture_id = SYNCMOS_MVC_ID,
18353 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018354 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018355 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000018356 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018357 .tested = TEST_UNTESTED,
18358 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018359 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000018360 .block_erasers =
18361 {
18362 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000018363 .eraseblocks = { {1024, 512} },
18364 .block_erase = erase_sector_jedec,
18365 }, {
18366 .eraseblocks = { {512 * 1024, 1} },
18367 .block_erase = erase_chip_block_jedec,
18368 },
18369 },
18370 .write = write_jedec_1,
18371 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018372 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018373 .prepare_access = prepare_memory_access,
18374 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018375 },
18376
18377 {
18378 .vendor = "SyncMOS/MoselVitelic",
18379 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018380 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018381 .manufacture_id = SYNCMOS_MVC_ID,
18382 .model_id = SM_MVC_29C51004T,
18383 .total_size = 512,
18384 .page_size = 1024,
18385 .feature_bits = FEATURE_EITHER_RESET,
18386 .tested = TEST_UNTESTED,
18387 .probe = probe_jedec,
18388 .probe_timing = TIMING_ZERO,
18389 .block_erasers =
18390 {
18391 {
18392 .eraseblocks = { {1024, 512} },
18393 .block_erase = erase_sector_jedec,
18394 }, {
18395 .eraseblocks = { {512 * 1024, 1} },
18396 .block_erase = erase_chip_block_jedec,
18397 },
18398 },
18399 .write = write_jedec_1,
18400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018401 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018402 .prepare_access = prepare_memory_access,
18403 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018404 },
18405
18406 {
18407 .vendor = "SyncMOS/MoselVitelic",
18408 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018409 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018410 .manufacture_id = SYNCMOS_MVC_ID,
18411 .model_id = SM_MVC_29C31004B,
18412 .total_size = 512,
18413 .page_size = 1024,
18414 .feature_bits = FEATURE_EITHER_RESET,
18415 .tested = TEST_UNTESTED,
18416 .probe = probe_jedec,
18417 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
18418 .block_erasers =
18419 {
18420 {
18421 .eraseblocks = { {1024, 512} },
18422 .block_erase = erase_sector_jedec,
18423 }, {
18424 .eraseblocks = { {512 * 1024, 1} },
18425 .block_erase = erase_chip_block_jedec,
18426 },
18427 },
18428 .write = write_jedec_1,
18429 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018430 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010018431 .prepare_access = prepare_memory_access,
18432 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018433 },
18434
18435 {
18436 .vendor = "SyncMOS/MoselVitelic",
18437 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018438 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000018439 .manufacture_id = SYNCMOS_MVC_ID,
18440 .model_id = SM_MVC_29C31004T,
18441 .total_size = 512,
18442 .page_size = 1024,
18443 .feature_bits = FEATURE_EITHER_RESET,
18444 .tested = TEST_UNTESTED,
18445 .probe = probe_jedec,
18446 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
18447 .block_erasers =
18448 {
18449 {
18450 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000018451 .block_erase = erase_sector_jedec,
18452 }, {
18453 .eraseblocks = { {512 * 1024, 1} },
18454 .block_erase = erase_chip_block_jedec,
18455 },
18456 },
Sean Nelson35727f72010-01-28 23:55:12 +000018457 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018458 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018459 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010018460 .prepare_access = prepare_memory_access,
18461 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000018462 },
18463
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018464 {
Uwe Hermanna106d152009-05-27 23:17:40 +000018465 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018466 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018467 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018468 .manufacture_id = TI_OLD_ID,
18469 .model_id = TI_TMS29F002RB,
18470 .total_size = 256,
18471 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000018472 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018473 .tested = TEST_UNTESTED,
18474 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018475 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018476 .block_erasers =
18477 {
18478 {
18479 .eraseblocks = {
18480 {16 * 1024, 1},
18481 {8 * 1024, 2},
18482 {32 * 1024, 1},
18483 {64 * 1024, 3},
18484 },
18485 .block_erase = erase_sector_jedec,
18486 }, {
18487 .eraseblocks = { {256 * 1024, 1} },
18488 .block_erase = erase_chip_block_jedec,
18489 },
18490 },
Sean Nelson35727f72010-01-28 23:55:12 +000018491 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018492 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018493 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018494 .prepare_access = prepare_memory_access,
18495 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018496 },
18497
18498 {
Uwe Hermanna106d152009-05-27 23:17:40 +000018499 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018500 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018501 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018502 .manufacture_id = TI_OLD_ID,
18503 .model_id = TI_TMS29F002RT,
18504 .total_size = 256,
18505 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000018506 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018507 .tested = TEST_UNTESTED,
18508 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018509 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018510 .block_erasers =
18511 {
18512 {
18513 .eraseblocks = {
18514 {64 * 1024, 3},
18515 {32 * 1024, 1},
18516 {8 * 1024, 2},
18517 {16 * 1024, 1},
18518 },
18519 .block_erase = erase_sector_jedec,
18520 }, {
18521 .eraseblocks = { {256 * 1024, 1} },
18522 .block_erase = erase_chip_block_jedec,
18523 },
18524 },
Sean Nelson35727f72010-01-28 23:55:12 +000018525 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018526 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018527 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018528 .prepare_access = prepare_memory_access,
18529 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018530 },
18531
18532 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018533 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018534 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018535 .bustype = BUS_SPI,
18536 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018537 .model_id = WINBOND_NEX_W25P16,
18538 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018539 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018540 .feature_bits = FEATURE_WRSR_WREN,
18541 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018542 .probe = probe_spi_rdid,
18543 .probe_timing = TIMING_ZERO,
18544 .block_erasers =
18545 {
18546 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018547 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018548 .block_erase = spi_block_erase_d8,
18549 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018550 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018551 .block_erase = spi_block_erase_c7,
18552 }
18553 },
18554 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18555 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018556 .write = spi_chip_write_256,
18557 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018558 .voltage = {2700, 3600},
18559 },
18560
18561 {
18562 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018563 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018564 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018565 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018566 .model_id = WINBOND_NEX_W25P32,
18567 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018568 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018569 .feature_bits = FEATURE_WRSR_WREN,
18570 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018571 .probe = probe_spi_rdid,
18572 .probe_timing = TIMING_ZERO,
18573 .block_erasers =
18574 {
18575 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018576 .eraseblocks = { {64 * 1024, 64} },
18577 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018578 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018579 .eraseblocks = { {4096 * 1024, 1} },
18580 .block_erase = spi_block_erase_c7,
18581 }
18582 },
18583 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18584 .unlock = spi_disable_blockprotect,
18585 .write = spi_chip_write_256,
18586 .read = spi_chip_read, /* Fast read (0x0B) supported */
18587 .voltage = {2700, 3600},
18588 },
18589
18590 {
18591 .vendor = "Winbond",
18592 .name = "W25P80",
18593 .bustype = BUS_SPI,
18594 .manufacture_id = WINBOND_NEX_ID,
18595 .model_id = WINBOND_NEX_W25P80,
18596 .total_size = 1024,
18597 .page_size = 256,
18598 .feature_bits = FEATURE_WRSR_WREN,
18599 .tested = TEST_UNTESTED,
18600 .probe = probe_spi_rdid,
18601 .probe_timing = TIMING_ZERO,
18602 .block_erasers =
18603 {
18604 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000018605 .eraseblocks = { {64 * 1024, 16} },
18606 .block_erase = spi_block_erase_d8,
18607 }, {
18608 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000018609 .block_erase = spi_block_erase_c7,
18610 }
18611 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018612 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018613 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018614 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018615 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018616 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000018617 },
18618
18619 {
18620 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018621 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018622 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018623 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018624 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018625 .total_size = 16384,
18626 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018627 /* supports SFDP */
18628 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018629 /* QPI: only FV & JV..M versions */
Nico Huber98970632024-08-30 02:14:05 +020018630 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020018631 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Edward O'Callaghana97e3532022-12-16 15:41:05 +110018632 .tested = TEST_OK_PREWB,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018633 .probe = probe_spi_rdid,
18634 .probe_timing = TIMING_ZERO,
18635 .block_erasers =
18636 {
18637 {
18638 .eraseblocks = { {4 * 1024, 4096} },
18639 .block_erase = spi_block_erase_20,
18640 }, {
18641 .eraseblocks = { {32 * 1024, 512} },
18642 .block_erase = spi_block_erase_52,
18643 }, {
18644 .eraseblocks = { {64 * 1024, 256} },
18645 .block_erase = spi_block_erase_d8,
18646 }, {
18647 .eraseblocks = { {16 * 1024 * 1024, 1} },
18648 .block_erase = spi_block_erase_60,
18649 }, {
18650 .eraseblocks = { {16 * 1024 * 1024, 1} },
18651 .block_erase = spi_block_erase_c7,
18652 }
18653 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018654 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000018655 .unlock = spi_disable_blockprotect,
18656 .write = spi_chip_write_256,
18657 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018658 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018659 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
18660 .reg_bits =
18661 {
Nico Huber2133f592024-01-06 18:30:01 +010018662 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018663 .srp = {STATUS1, 7, RW},
18664 .srl = {STATUS2, 0, RW},
18665 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18666 .tb = {STATUS1, 5, RW},
18667 .sec = {STATUS1, 6, RW},
18668 .cmp = {STATUS2, 6, RW},
18669 .wps = {STATUS3, 2, RW},
18670 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018671 .wp_write_cfg = spi_wp_write_cfg,
18672 .wp_read_cfg = spi_wp_read_cfg,
18673 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018674 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018675 .prepare_access = spi_prepare_io,
18676 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018677 },
18678
18679 {
18680 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020018681 .name = "W25Q128.V..M",
18682 .bustype = BUS_SPI,
18683 .manufacture_id = WINBOND_NEX_ID,
18684 .model_id = WINBOND_NEX_W25Q128_V_M,
18685 .total_size = 16384,
18686 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018687 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18688 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030018689 .tested = TEST_OK_PREWB,
Patrick Rudolph34323492018-10-04 14:59:40 +020018690 .probe = probe_spi_rdid,
18691 .probe_timing = TIMING_ZERO,
18692 .block_erasers =
18693 {
18694 {
18695 .eraseblocks = { {4 * 1024, 4096} },
18696 .block_erase = spi_block_erase_20,
18697 }, {
18698 .eraseblocks = { {32 * 1024, 512} },
18699 .block_erase = spi_block_erase_52,
18700 }, {
18701 .eraseblocks = { {64 * 1024, 256} },
18702 .block_erase = spi_block_erase_d8,
18703 }, {
18704 .eraseblocks = { {16 * 1024 * 1024, 1} },
18705 .block_erase = spi_block_erase_60,
18706 }, {
18707 .eraseblocks = { {16 * 1024 * 1024, 1} },
18708 .block_erase = spi_block_erase_c7,
18709 }
18710 },
Alan Greena1fc01d2019-09-23 17:12:44 +100018711 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020018712 .unlock = spi_disable_blockprotect,
18713 .write = spi_chip_write_256,
18714 .read = spi_chip_read,
18715 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018716 .reg_bits =
18717 {
Nico Huber2133f592024-01-06 18:30:01 +010018718 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018719 .srp = {STATUS1, 7, RW},
18720 .srl = {STATUS2, 0, RW},
18721 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18722 .tb = {STATUS1, 5, RW},
18723 .sec = {STATUS1, 6, RW},
18724 .cmp = {STATUS2, 6, RW},
18725 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018726 .wp_write_cfg = spi_wp_write_cfg,
18727 .wp_read_cfg = spi_wp_read_cfg,
18728 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018729 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018730 .prepare_access = spi_prepare_io,
18731 .finish_access = spi_finish_io,
Patrick Rudolph34323492018-10-04 14:59:40 +020018732 },
18733
18734 {
18735 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018736 .name = "W25Q128.W",
18737 .bustype = BUS_SPI,
18738 .manufacture_id = WINBOND_NEX_ID,
18739 .model_id = WINBOND_NEX_W25Q128_W,
18740 .total_size = 16384,
18741 .page_size = 256,
18742 /* supports SFDP */
18743 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018744 /* QPI: only FW & JW..M versions */
18745 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018746 .tested = TEST_OK_PREW,
18747 .probe = probe_spi_rdid,
18748 .probe_timing = TIMING_ZERO,
18749 .block_erasers =
18750 {
18751 {
18752 .eraseblocks = { {4 * 1024, 4096} },
18753 .block_erase = spi_block_erase_20,
18754 }, {
18755 .eraseblocks = { {32 * 1024, 512} },
18756 .block_erase = spi_block_erase_52,
18757 }, {
18758 .eraseblocks = { {64 * 1024, 256} },
18759 .block_erase = spi_block_erase_d8,
18760 }, {
18761 .eraseblocks = { {16 * 1024 * 1024, 1} },
18762 .block_erase = spi_block_erase_60,
18763 }, {
18764 .eraseblocks = { {16 * 1024 * 1024, 1} },
18765 .block_erase = spi_block_erase_c7,
18766 }
18767 },
18768 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18769 .unlock = spi_disable_blockprotect,
18770 .write = spi_chip_write_256,
18771 .read = spi_chip_read,
18772 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018773 .reg_bits =
18774 {
Nico Huber2133f592024-01-06 18:30:01 +010018775 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018776 .srp = {STATUS1, 7, RW},
18777 .srl = {STATUS2, 0, RW},
18778 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18779 .tb = {STATUS1, 5, RW},
18780 .sec = {STATUS1, 6, RW},
18781 .cmp = {STATUS2, 6, RW},
18782 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018783 .wp_write_cfg = spi_wp_write_cfg,
18784 .wp_read_cfg = spi_wp_read_cfg,
18785 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018786 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018787 .prepare_access = spi_prepare_io,
18788 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018789 },
18790
18791 {
18792 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080018793 .name = "W25Q128.JW.DTR",
18794 .bustype = BUS_SPI,
18795 .manufacture_id = WINBOND_NEX_ID,
18796 .model_id = WINBOND_NEX_W25Q128_DTR,
18797 .total_size = 16384,
18798 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018799 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18800 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Peichao Wang1a119492019-11-11 15:26:41 +080018801 .tested = TEST_OK_PREW,
18802 .probe = probe_spi_rdid,
18803 .probe_timing = TIMING_ZERO,
18804 .block_erasers =
18805 {
18806 {
18807 .eraseblocks = { {4 * 1024, 4096} },
18808 .block_erase = spi_block_erase_20,
18809 }, {
18810 .eraseblocks = { {32 * 1024, 512} },
18811 .block_erase = spi_block_erase_52,
18812 }, {
18813 .eraseblocks = { {64 * 1024, 256} },
18814 .block_erase = spi_block_erase_d8,
18815 }, {
18816 .eraseblocks = { {16 * 1024 * 1024, 1} },
18817 .block_erase = spi_block_erase_60,
18818 }, {
18819 .eraseblocks = { {16 * 1024 * 1024, 1} },
18820 .block_erase = spi_block_erase_c7,
18821 }
18822 },
18823 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18824 .unlock = spi_disable_blockprotect,
18825 .write = spi_chip_write_256,
18826 .read = spi_chip_read,
18827 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018828 .reg_bits =
18829 {
Nico Huber2133f592024-01-06 18:30:01 +010018830 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018831 .srp = {STATUS1, 7, RW},
18832 .srl = {STATUS2, 0, RW},
18833 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18834 .tb = {STATUS1, 5, RW},
18835 .sec = {STATUS1, 6, RW},
18836 .cmp = {STATUS2, 6, RW},
18837 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018838 .wp_write_cfg = spi_wp_write_cfg,
18839 .wp_read_cfg = spi_wp_read_cfg,
18840 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018841 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018842 .prepare_access = spi_prepare_io,
18843 .finish_access = spi_finish_io,
Peichao Wang1a119492019-11-11 15:26:41 +080018844 },
18845
18846 {
18847 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018848 .name = "W25Q16.V",
18849 .bustype = BUS_SPI,
18850 .manufacture_id = WINBOND_NEX_ID,
18851 .model_id = WINBOND_NEX_W25Q16_V,
18852 .total_size = 2048,
18853 .page_size = 256,
18854 /* supports SFDP */
18855 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018856 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018857 .tested = TEST_OK_PREW,
18858 .probe = probe_spi_rdid,
18859 .probe_timing = TIMING_ZERO,
18860 .block_erasers =
18861 {
18862 {
18863 .eraseblocks = { {4 * 1024, 512} },
18864 .block_erase = spi_block_erase_20,
18865 }, {
18866 .eraseblocks = { {32 * 1024, 64} },
18867 .block_erase = spi_block_erase_52,
18868 }, {
18869 .eraseblocks = { {64 * 1024, 32} },
18870 .block_erase = spi_block_erase_d8,
18871 }, {
18872 .eraseblocks = { {2 * 1024 * 1024, 1} },
18873 .block_erase = spi_block_erase_60,
18874 }, {
18875 .eraseblocks = { {2 * 1024 * 1024, 1} },
18876 .block_erase = spi_block_erase_c7,
18877 }
18878 },
Nico Huber2133f592024-01-06 18:30:01 +010018879 .reg_bits =
18880 {
18881 .qe = {STATUS2, 1, RW},
18882 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018883 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18884 .unlock = spi_disable_blockprotect,
18885 .write = spi_chip_write_256,
18886 .read = spi_chip_read,
18887 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020018888 .prepare_access = spi_prepare_io,
18889 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018890 },
18891
18892 {
18893 .vendor = "Winbond",
18894 .name = "W25Q16.W",
18895 .bustype = BUS_SPI,
18896 .manufacture_id = WINBOND_NEX_ID,
18897 .model_id = WINBOND_NEX_W25Q16_W,
18898 .total_size = 2048,
18899 .page_size = 256,
18900 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018901 /* QPI: only FW & JW..M versions .qpi_read_params = { 2, 4, 6, 8 } */
18902 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018903 .tested = TEST_UNTESTED,
18904 .probe = probe_spi_rdid,
18905 .probe_timing = TIMING_ZERO,
18906 .block_erasers =
18907 {
18908 {
18909 .eraseblocks = { {4 * 1024, 512} },
18910 .block_erase = spi_block_erase_20,
18911 }, {
18912 .eraseblocks = { {32 * 1024, 64} },
18913 .block_erase = spi_block_erase_52,
18914 }, {
18915 .eraseblocks = { {64 * 1024, 32} },
18916 .block_erase = spi_block_erase_d8,
18917 }, {
18918 .eraseblocks = { {2 * 1024 * 1024, 1} },
18919 .block_erase = spi_block_erase_60,
18920 }, {
18921 .eraseblocks = { {2 * 1024 * 1024, 1} },
18922 .block_erase = spi_block_erase_c7,
18923 }
18924 },
Nico Huber2133f592024-01-06 18:30:01 +010018925 .reg_bits =
18926 {
18927 .qe = {STATUS2, 1, RW},
18928 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018929 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18930 .unlock = spi_disable_blockprotect,
18931 .write = spi_chip_write_256,
18932 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010018933 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020018934 .prepare_access = spi_prepare_io,
18935 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018936 },
18937
18938 {
18939 .vendor = "Winbond",
18940 .name = "W25Q20.W",
18941 .bustype = BUS_SPI,
18942 .manufacture_id = WINBOND_NEX_ID,
18943 .model_id = WINBOND_NEX_W25Q20_W,
18944 .total_size = 256,
18945 .page_size = 256,
18946 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018947 /* W25Q20EW: FEATURE_WRSR2 */
18948 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018949 .tested = TEST_UNTESTED,
18950 .probe = probe_spi_rdid,
18951 .probe_timing = TIMING_ZERO,
18952 .block_erasers =
18953 {
18954 {
18955 .eraseblocks = { {4 * 1024, 64} },
18956 .block_erase = spi_block_erase_20,
18957 }, {
18958 .eraseblocks = { {32 * 1024, 8} },
18959 .block_erase = spi_block_erase_52,
18960 }, {
18961 .eraseblocks = { {64 * 1024, 4} },
18962 .block_erase = spi_block_erase_d8,
18963 }, {
18964 .eraseblocks = { {256 * 1024, 1} },
18965 .block_erase = spi_block_erase_60,
18966 }, {
18967 .eraseblocks = { {256 * 1024, 1} },
18968 .block_erase = spi_block_erase_c7,
18969 }
18970 },
Nico Huber2133f592024-01-06 18:30:01 +010018971 .reg_bits =
18972 {
18973 .qe = {STATUS2, 1, RW},
18974 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018975 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18976 .unlock = spi_disable_blockprotect,
18977 .write = spi_chip_write_256,
18978 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010018979 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020018980 .prepare_access = spi_prepare_io,
18981 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018982 },
18983
18984 {
18985 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018986 .name = "W25Q256FV",
Boris Baykovaa6c3742016-06-11 18:29:01 +020018987 .bustype = BUS_SPI,
18988 .manufacture_id = WINBOND_NEX_ID,
18989 .model_id = WINBOND_NEX_W25Q256_V,
18990 .total_size = 32768,
18991 .page_size = 256,
18992 /* supports SFDP */
18993 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018994 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
18995 FEATURE_4BA_ENTER_WREN | FEATURE_4BA_EAR_C5C8 |
18996 FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
18997 FEATURE_QPI_SRP,
18998 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons3130cbd2018-09-30 19:32:30 +020018999 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020019000 .probe = probe_spi_rdid,
19001 .probe_timing = TIMING_ZERO,
19002 .block_erasers =
19003 {
19004 {
19005 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020019006 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020019007 }, {
19008 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020019009 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020019010 }, {
19011 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020019012 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020019013 }, {
19014 .eraseblocks = { {32 * 1024 * 1024, 1} },
19015 .block_erase = spi_block_erase_60,
19016 }, {
19017 .eraseblocks = { {32 * 1024 * 1024, 1} },
19018 .block_erase = spi_block_erase_c7,
19019 }
19020 },
19021 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19022 .unlock = spi_disable_blockprotect,
19023 .write = spi_chip_write_256,
19024 .read = spi_chip_read,
19025 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019026 .reg_bits =
19027 {
Nico Huber2133f592024-01-06 18:30:01 +010019028 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019029 .srp = {STATUS1, 7, RW},
19030 .srl = {STATUS2, 0, RW},
19031 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19032 .tb = {STATUS1, 6, RW},
19033 .cmp = {STATUS2, 6, RW},
19034 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019035 .wp_write_cfg = spi_wp_write_cfg,
19036 .wp_read_cfg = spi_wp_read_cfg,
19037 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019038 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019039 .prepare_access = spi_prepare_io,
19040 .finish_access = spi_finish_io,
Boris Baykovaa6c3742016-06-11 18:29:01 +020019041 },
19042
19043 {
19044 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020019045 .name = "W25Q256JV_Q",
19046 .bustype = BUS_SPI,
19047 .manufacture_id = WINBOND_NEX_ID,
19048 .model_id = WINBOND_NEX_W25Q256_V,
19049 .total_size = 32768,
19050 .page_size = 256,
19051 /* supports SFDP */
19052 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019053 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Nico Huberddfbbe82023-12-21 16:31:27 +010019054 .tested = TEST_OK_PREW,
Nico Huber5215eab2022-05-23 15:13:07 +020019055 .probe = probe_spi_rdid,
19056 .probe_timing = TIMING_ZERO,
19057 .block_erasers =
19058 {
19059 {
19060 .eraseblocks = { {4 * 1024, 8192} },
19061 .block_erase = spi_block_erase_21,
19062 }, {
19063 .eraseblocks = { {4 * 1024, 8192} },
19064 .block_erase = spi_block_erase_20,
19065 }, {
19066 .eraseblocks = { {32 * 1024, 1024} },
19067 .block_erase = spi_block_erase_52,
19068 }, {
19069 .eraseblocks = { {64 * 1024, 512} },
19070 .block_erase = spi_block_erase_dc,
19071 }, {
19072 .eraseblocks = { {64 * 1024, 512} },
19073 .block_erase = spi_block_erase_d8,
19074 }, {
19075 .eraseblocks = { {32 * 1024 * 1024, 1} },
19076 .block_erase = spi_block_erase_60,
19077 }, {
19078 .eraseblocks = { {32 * 1024 * 1024, 1} },
19079 .block_erase = spi_block_erase_c7,
19080 }
19081 },
19082 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19083 .unlock = spi_disable_blockprotect,
19084 .write = spi_chip_write_256,
19085 .read = spi_chip_read,
19086 .voltage = {2700, 3600},
19087 .reg_bits =
19088 {
Nico Huber2133f592024-01-06 18:30:01 +010019089 .qe = {STATUS2, 1, RW},
Nico Huber5215eab2022-05-23 15:13:07 +020019090 .srp = {STATUS1, 7, RW},
19091 .srl = {STATUS2, 0, RW},
19092 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19093 .tb = {STATUS1, 6, RW},
19094 .cmp = {STATUS2, 6, RW},
19095 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019096 .wp_write_cfg = spi_wp_write_cfg,
19097 .wp_read_cfg = spi_wp_read_cfg,
19098 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huber5215eab2022-05-23 15:13:07 +020019099 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019100 .prepare_access = spi_prepare_io,
19101 .finish_access = spi_finish_io,
Nico Huber5215eab2022-05-23 15:13:07 +020019102 },
19103
19104 {
19105 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000019106 .name = "W25Q256JV_M",
19107 .bustype = BUS_SPI,
19108 .manufacture_id = WINBOND_NEX_ID,
19109 .model_id = WINBOND_NEX_W25Q256JV_M,
19110 .total_size = 32768,
19111 .page_size = 256,
19112 /* supports SFDP */
19113 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019114 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
19115 FEATURE_4BA | FEATURE_QPI_SRP,
19116 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
David Hendricks49876792018-10-27 20:19:42 +000019117 .tested = TEST_OK_PREW,
19118 .probe = probe_spi_rdid,
19119 .probe_timing = TIMING_ZERO,
19120 .block_erasers =
19121 {
19122 {
19123 .eraseblocks = { {4 * 1024, 8192} },
19124 .block_erase = spi_block_erase_21,
19125 }, {
19126 .eraseblocks = { {4 * 1024, 8192} },
19127 .block_erase = spi_block_erase_20,
19128 }, {
19129 .eraseblocks = { {32 * 1024, 1024} },
19130 .block_erase = spi_block_erase_52,
19131 }, {
19132 .eraseblocks = { {64 * 1024, 512} },
19133 .block_erase = spi_block_erase_dc,
19134 }, {
19135 .eraseblocks = { {64 * 1024, 512} },
19136 .block_erase = spi_block_erase_d8,
19137 }, {
19138 .eraseblocks = { {32 * 1024 * 1024, 1} },
19139 .block_erase = spi_block_erase_60,
19140 }, {
19141 .eraseblocks = { {32 * 1024 * 1024, 1} },
19142 .block_erase = spi_block_erase_c7,
19143 }
19144 },
19145 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19146 .unlock = spi_disable_blockprotect,
19147 .write = spi_chip_write_256,
19148 .read = spi_chip_read,
19149 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019150 .reg_bits =
19151 {
Nico Huber2133f592024-01-06 18:30:01 +010019152 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019153 .srp = {STATUS1, 7, RW},
19154 .srl = {STATUS2, 0, RW},
19155 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19156 .tb = {STATUS1, 6, RW},
19157 .cmp = {STATUS2, 6, RW},
19158 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019159 .wp_write_cfg = spi_wp_write_cfg,
19160 .wp_read_cfg = spi_wp_read_cfg,
19161 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019162 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019163 .prepare_access = spi_prepare_io,
19164 .finish_access = spi_finish_io,
David Hendricks49876792018-10-27 20:19:42 +000019165 },
19166
19167 {
19168 .vendor = "Winbond",
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020019169 .name = "W25Q256JW",
el-coderon01209852020-04-29 12:12:53 +020019170 .bustype = BUS_SPI,
19171 .manufacture_id = WINBOND_NEX_ID,
19172 .model_id = WINBOND_NEX_W25Q256_W,
19173 .total_size = 32768,
19174 .page_size = 256,
19175 /* supports SFDP */
19176 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019177 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19178 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
el-coderon01209852020-04-29 12:12:53 +020019179 .tested = TEST_OK_PREW,
19180 .probe = probe_spi_rdid,
19181 .probe_timing = TIMING_ZERO,
19182 .block_erasers =
19183 {
19184 {
19185 .eraseblocks = { {4 * 1024, 8192} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020019186 .block_erase = spi_block_erase_21,
19187 }, {
19188 .eraseblocks = { {4 * 1024, 8192} },
el-coderon01209852020-04-29 12:12:53 +020019189 .block_erase = spi_block_erase_20,
19190 }, {
19191 .eraseblocks = { {32 * 1024, 1024} },
19192 .block_erase = spi_block_erase_52,
19193 }, {
19194 .eraseblocks = { {64 * 1024, 512} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020019195 .block_erase = spi_block_erase_dc,
19196 }, {
19197 .eraseblocks = { {64 * 1024, 512} },
el-coderon01209852020-04-29 12:12:53 +020019198 .block_erase = spi_block_erase_d8,
19199 }, {
19200 .eraseblocks = { {32 * 1024 * 1024, 1} },
19201 .block_erase = spi_block_erase_60,
19202 }, {
19203 .eraseblocks = { {32 * 1024 * 1024, 1} },
19204 .block_erase = spi_block_erase_c7,
19205 }
19206 },
Nico Huber2133f592024-01-06 18:30:01 +010019207 .reg_bits =
19208 {
19209 .qe = {STATUS2, 1, RW},
19210 },
el-coderon01209852020-04-29 12:12:53 +020019211 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19212 .unlock = spi_disable_blockprotect,
19213 .write = spi_chip_write_256,
19214 .read = spi_chip_read,
19215 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019216 .prepare_access = spi_prepare_io,
19217 .finish_access = spi_finish_io,
el-coderon01209852020-04-29 12:12:53 +020019218 },
19219
19220 {
19221 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070019222 .name = "W25Q256JW_DTR",
19223 .bustype = BUS_SPI,
19224 .manufacture_id = WINBOND_NEX_ID,
19225 .model_id = WINBOND_NEX_W25Q256_DTR,
19226 .total_size = 32768,
19227 .page_size = 256,
19228 /* supports SFDP */
19229 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019230 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19231 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
19232 .dummy_cycles =
19233 {
19234 .qpi_read_params = {
19235 2, /* Datasheet Rev.K says 4 is the default, though.
19236 Will assume that the text is wrong, if not,
19237 we'll know why it doesn't work. */
19238 4, 6, 8
19239 },
19240 },
Kapil Porwal111c3802022-12-09 19:41:27 +053019241 .tested = TEST_OK_PREWB,
David Hendricks31532602020-08-16 17:14:56 -070019242 .probe = probe_spi_rdid,
19243 .probe_timing = TIMING_ZERO,
19244 .block_erasers =
19245 {
19246 {
19247 .eraseblocks = { {4 * 1024, 8192} },
19248 .block_erase = spi_block_erase_21,
19249 }, {
19250 .eraseblocks = { {4 * 1024, 8192} },
19251 .block_erase = spi_block_erase_20,
19252 }, {
19253 .eraseblocks = { {32 * 1024, 1024} },
19254 .block_erase = spi_block_erase_52,
19255 }, {
19256 .eraseblocks = { {64 * 1024, 512} },
19257 .block_erase = spi_block_erase_dc,
19258 }, {
19259 .eraseblocks = { {64 * 1024, 512} },
19260 .block_erase = spi_block_erase_d8,
19261 }, {
19262 .eraseblocks = { {32 * 1024 * 1024, 1} },
19263 .block_erase = spi_block_erase_60,
19264 }, {
19265 .eraseblocks = { {32 * 1024 * 1024, 1} },
19266 .block_erase = spi_block_erase_c7,
19267 }
19268 },
19269 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19270 .unlock = spi_disable_blockprotect,
19271 .write = spi_chip_write_256,
19272 .read = spi_chip_read,
19273 .voltage = {1700, 1950},
Kapil Porwal111c3802022-12-09 19:41:27 +053019274 .reg_bits =
19275 {
Nico Huber2133f592024-01-06 18:30:01 +010019276 .qe = {STATUS2, 1, RW},
Kapil Porwal111c3802022-12-09 19:41:27 +053019277 .srp = {STATUS1, 7, RW},
19278 .srl = {STATUS2, 0, RW},
19279 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19280 .tb = {STATUS1, 6, RW},
19281 .cmp = {STATUS2, 6, RW},
19282 .wps = {STATUS3, 2, RW},
19283 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019284 .wp_write_cfg = spi_wp_write_cfg,
19285 .wp_read_cfg = spi_wp_read_cfg,
19286 .wp_get_ranges = spi_wp_get_available_ranges,
Kapil Porwal111c3802022-12-09 19:41:27 +053019287 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019288 .prepare_access = spi_prepare_io,
19289 .finish_access = spi_finish_io,
David Hendricks31532602020-08-16 17:14:56 -070019290 },
19291
19292 {
19293 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019294 .name = "W25Q32BV/W25Q32CV/W25Q32DV",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019295 .bustype = BUS_SPI,
19296 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019297 .model_id = WINBOND_NEX_W25Q32_V,
19298 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019299 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019300 /* supports SFDP */
19301 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019302 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019303 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019304 .probe = probe_spi_rdid,
19305 .probe_timing = TIMING_ZERO,
19306 .block_erasers =
19307 {
19308 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019309 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019310 .block_erase = spi_block_erase_20,
19311 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019312 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019313 .block_erase = spi_block_erase_52,
19314 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019315 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019316 .block_erase = spi_block_erase_d8,
19317 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019318 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019319 .block_erase = spi_block_erase_60,
19320 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019321 .eraseblocks = { {4 * 1024 * 1024, 1} },
19322 .block_erase = spi_block_erase_c7,
19323 }
19324 },
19325 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19326 .unlock = spi_disable_blockprotect,
19327 .write = spi_chip_write_256,
19328 .read = spi_chip_read,
19329 .voltage = {2700, 3600},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019330 .reg_bits =
19331 {
Nico Huber2133f592024-01-06 18:30:01 +010019332 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019333 .srp = {STATUS1, 7, RW},
19334 .srl = {STATUS2, 0, RW},
19335 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19336 .tb = {STATUS1, 5, RW},
19337 .sec = {STATUS1, 6, RW},
19338 .cmp = {STATUS2, 6, RW},
19339 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019340 .wp_write_cfg = spi_wp_write_cfg,
19341 .wp_read_cfg = spi_wp_read_cfg,
19342 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019343 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019344 .prepare_access = spi_prepare_io,
19345 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019346 },
19347
19348 {
19349 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019350 .name = "W25Q32FV",
19351 .bustype = BUS_SPI,
19352 .manufacture_id = WINBOND_NEX_ID,
19353 .model_id = WINBOND_NEX_W25Q32_V,
19354 .total_size = 4096,
19355 .page_size = 256,
19356 /* supports SFDP */
19357 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019359 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010019360 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019361 .tested = TEST_OK_PREW,
19362 .probe = probe_spi_rdid,
19363 .probe_timing = TIMING_ZERO,
19364 .block_erasers =
19365 {
19366 {
19367 .eraseblocks = { {4 * 1024, 1024} },
19368 .block_erase = spi_block_erase_20,
19369 }, {
19370 .eraseblocks = { {32 * 1024, 128} },
19371 .block_erase = spi_block_erase_52,
19372 }, {
19373 .eraseblocks = { {64 * 1024, 64} },
19374 .block_erase = spi_block_erase_d8,
19375 }, {
19376 .eraseblocks = { {4 * 1024 * 1024, 1} },
19377 .block_erase = spi_block_erase_60,
19378 }, {
19379 .eraseblocks = { {4 * 1024 * 1024, 1} },
19380 .block_erase = spi_block_erase_c7,
19381 }
19382 },
19383 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19384 .unlock = spi_disable_blockprotect,
19385 .write = spi_chip_write_256,
19386 .read = spi_chip_read,
19387 .voltage = {2700, 3600},
19388 .reg_bits =
19389 {
Nico Huber2133f592024-01-06 18:30:01 +010019390 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019391 .srp = {STATUS1, 7, RW},
19392 .srl = {STATUS2, 0, RW},
19393 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19394 .tb = {STATUS1, 5, RW},
19395 .sec = {STATUS1, 6, RW},
19396 .cmp = {STATUS2, 6, RW},
19397 .wps = {STATUS3, 2, RW},
19398 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019399 .wp_write_cfg = spi_wp_write_cfg,
19400 .wp_read_cfg = spi_wp_read_cfg,
19401 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019402 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019403 .prepare_access = spi_prepare_io,
19404 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019405 },
19406
19407 {
19408 .vendor = "Winbond",
19409 .name = "W25Q32JV",
19410 .bustype = BUS_SPI,
19411 .manufacture_id = WINBOND_NEX_ID,
19412 .model_id = WINBOND_NEX_W25Q32_V,
19413 .total_size = 4096,
19414 .page_size = 256,
19415 /* supports SFDP */
19416 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019417 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019418 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
19419 .tested = TEST_OK_PREW,
19420 .probe = probe_spi_rdid,
19421 .probe_timing = TIMING_ZERO,
19422 .block_erasers =
19423 {
19424 {
19425 .eraseblocks = { {4 * 1024, 1024} },
19426 .block_erase = spi_block_erase_20,
19427 }, {
19428 .eraseblocks = { {32 * 1024, 128} },
19429 .block_erase = spi_block_erase_52,
19430 }, {
19431 .eraseblocks = { {64 * 1024, 64} },
19432 .block_erase = spi_block_erase_d8,
19433 }, {
19434 .eraseblocks = { {4 * 1024 * 1024, 1} },
19435 .block_erase = spi_block_erase_60,
19436 }, {
19437 .eraseblocks = { {4 * 1024 * 1024, 1} },
19438 .block_erase = spi_block_erase_c7,
19439 }
19440 },
19441 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19442 .unlock = spi_disable_blockprotect,
19443 .write = spi_chip_write_256,
19444 .read = spi_chip_read,
19445 .voltage = {2700, 3600},
19446 .reg_bits =
19447 {
Nico Huber2133f592024-01-06 18:30:01 +010019448 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019449 .srp = {STATUS1, 7, RW},
19450 .srl = {STATUS2, 0, RW},
19451 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19452 .tb = {STATUS1, 5, RW},
19453 .sec = {STATUS1, 6, RW},
19454 .cmp = {STATUS2, 6, RW},
19455 .wps = {STATUS3, 2, RW},
19456 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019457 .wp_write_cfg = spi_wp_write_cfg,
19458 .wp_read_cfg = spi_wp_read_cfg,
19459 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019460 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019461 .prepare_access = spi_prepare_io,
19462 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019463 },
19464
19465 {
19466 .vendor = "Winbond",
Angel Pons0d4354e2024-05-26 16:33:51 +020019467 .name = "W25Q32JV-.M",
19468 .bustype = BUS_SPI,
19469 .manufacture_id = WINBOND_NEX_ID,
19470 .model_id = WINBOND_NEX_W25Q32JV,
19471 .total_size = 4096,
19472 .page_size = 256,
19473 /* supports SFDP */
Nico Huber1412d9f2024-01-06 18:25:49 +010019474 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Angel Pons0d4354e2024-05-26 16:33:51 +020019475 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010019476 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons0d4354e2024-05-26 16:33:51 +020019477 .tested = TEST_OK_PREW,
19478 .probe = probe_spi_rdid,
19479 .probe_timing = TIMING_ZERO,
19480 .block_erasers =
19481 {
19482 {
19483 .eraseblocks = { {4 * 1024, 1024} },
19484 .block_erase = spi_block_erase_20,
19485 }, {
19486 .eraseblocks = { {32 * 1024, 128} },
19487 .block_erase = spi_block_erase_52,
19488 }, {
19489 .eraseblocks = { {64 * 1024, 64} },
19490 .block_erase = spi_block_erase_d8,
19491 }, {
19492 .eraseblocks = { {4 * 1024 * 1024, 1} },
19493 .block_erase = spi_block_erase_60,
19494 }, {
19495 .eraseblocks = { {4 * 1024 * 1024, 1} },
19496 .block_erase = spi_block_erase_c7,
19497 }
19498 },
19499 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19500 .unlock = spi_disable_blockprotect_bp2_srwd,
19501 .write = spi_chip_write_256,
19502 .read = spi_chip_read,
19503 .voltage = {2700, 3600},
19504 .reg_bits =
19505 {
Nico Huber2133f592024-01-06 18:30:01 +010019506 .qe = {STATUS2, 1, RW},
Angel Pons0d4354e2024-05-26 16:33:51 +020019507 .srp = {STATUS1, 7, RW},
19508 .srl = {STATUS2, 0, RW},
19509 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19510 .tb = {STATUS1, 5, RW},
19511 .sec = {STATUS1, 6, RW},
19512 .cmp = {STATUS2, 6, RW},
19513 .wps = {STATUS3, 2, RW},
19514 },
19515 .wp_write_cfg = spi_wp_write_cfg,
19516 .wp_read_cfg = spi_wp_read_cfg,
19517 .wp_get_ranges = spi_wp_get_available_ranges,
19518 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019519 .prepare_access = spi_prepare_io,
19520 .finish_access = spi_finish_io,
Angel Pons0d4354e2024-05-26 16:33:51 +020019521 },
19522
19523 {
19524 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019525 .name = "W25Q32BW/W25Q32CW/W25Q32DW",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019526 .bustype = BUS_SPI,
19527 .manufacture_id = WINBOND_NEX_ID,
19528 .model_id = WINBOND_NEX_W25Q32_W,
19529 .total_size = 4096,
19530 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019531 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019532 /* QPI: only DW version */
19533 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019534 .tested = TEST_OK_PREW,
19535 .probe = probe_spi_rdid,
19536 .probe_timing = TIMING_ZERO,
19537 .block_erasers =
19538 {
19539 {
19540 .eraseblocks = { {4 * 1024, 1024} },
19541 .block_erase = spi_block_erase_20,
19542 }, {
19543 .eraseblocks = { {32 * 1024, 128} },
19544 .block_erase = spi_block_erase_52,
19545 }, {
19546 .eraseblocks = { {64 * 1024, 64} },
19547 .block_erase = spi_block_erase_d8,
19548 }, {
19549 .eraseblocks = { {4 * 1024 * 1024, 1} },
19550 .block_erase = spi_block_erase_60,
19551 }, {
19552 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019553 .block_erase = spi_block_erase_c7,
19554 }
19555 },
19556 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19557 .unlock = spi_disable_blockprotect,
19558 .write = spi_chip_write_256,
19559 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019560 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019561 .reg_bits =
19562 {
Nico Huber2133f592024-01-06 18:30:01 +010019563 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019564 .srp = {STATUS1, 7, RW},
19565 .srl = {STATUS2, 0, RW},
19566 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19567 .tb = {STATUS1, 5, RW},
19568 .sec = {STATUS1, 6, RW},
19569 .cmp = {STATUS2, 6, RW},
19570 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019571 .wp_write_cfg = spi_wp_write_cfg,
19572 .wp_read_cfg = spi_wp_read_cfg,
19573 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019574 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019575 .prepare_access = spi_prepare_io,
19576 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019577 },
19578
19579 {
19580 .vendor = "Winbond",
19581 .name = "W25Q32FW",
19582 .bustype = BUS_SPI,
19583 .manufacture_id = WINBOND_NEX_ID,
19584 .model_id = WINBOND_NEX_W25Q32_W,
19585 .total_size = 4096,
19586 .page_size = 256,
19587 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019589 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010019590 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019591 .tested = TEST_OK_PREW,
19592 .probe = probe_spi_rdid,
19593 .probe_timing = TIMING_ZERO,
19594 .block_erasers =
19595 {
19596 {
19597 .eraseblocks = { {4 * 1024, 1024} },
19598 .block_erase = spi_block_erase_20,
19599 }, {
19600 .eraseblocks = { {32 * 1024, 128} },
19601 .block_erase = spi_block_erase_52,
19602 }, {
19603 .eraseblocks = { {64 * 1024, 64} },
19604 .block_erase = spi_block_erase_d8,
19605 }, {
19606 .eraseblocks = { {4 * 1024 * 1024, 1} },
19607 .block_erase = spi_block_erase_60,
19608 }, {
19609 .eraseblocks = { {4 * 1024 * 1024, 1} },
19610 .block_erase = spi_block_erase_c7,
19611 }
19612 },
19613 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19614 .unlock = spi_disable_blockprotect,
19615 .write = spi_chip_write_256,
19616 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019617 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019618 .reg_bits =
19619 {
Nico Huber2133f592024-01-06 18:30:01 +010019620 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019621 .srp = {STATUS1, 7, RW},
19622 .srl = {STATUS2, 0, RW},
19623 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19624 .tb = {STATUS1, 5, RW},
19625 .sec = {STATUS1, 6, RW},
19626 .cmp = {STATUS2, 6, RW},
19627 .wps = {STATUS3, 2, RW},
19628 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019629 .wp_write_cfg = spi_wp_write_cfg,
19630 .wp_read_cfg = spi_wp_read_cfg,
19631 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019632 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019633 .prepare_access = spi_prepare_io,
19634 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019635 },
19636
19637 {
19638 .vendor = "Winbond",
19639 .name = "W25Q32JW...Q",
19640 .bustype = BUS_SPI,
19641 .manufacture_id = WINBOND_NEX_ID,
19642 .model_id = WINBOND_NEX_W25Q32_W,
19643 .total_size = 4096,
19644 .page_size = 256,
19645 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19646 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010019647 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019648 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
19649 .tested = TEST_OK_PREW,
19650 .probe = probe_spi_rdid,
19651 .probe_timing = TIMING_ZERO,
19652 .block_erasers =
19653 {
19654 {
19655 .eraseblocks = { {4 * 1024, 1024} },
19656 .block_erase = spi_block_erase_20,
19657 }, {
19658 .eraseblocks = { {32 * 1024, 128} },
19659 .block_erase = spi_block_erase_52,
19660 }, {
19661 .eraseblocks = { {64 * 1024, 64} },
19662 .block_erase = spi_block_erase_d8,
19663 }, {
19664 .eraseblocks = { {4 * 1024 * 1024, 1} },
19665 .block_erase = spi_block_erase_60,
19666 }, {
19667 .eraseblocks = { {4 * 1024 * 1024, 1} },
19668 .block_erase = spi_block_erase_c7,
19669 }
19670 },
19671 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19672 .unlock = spi_disable_blockprotect,
19673 .write = spi_chip_write_256,
19674 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019675 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019676 .reg_bits =
19677 {
19678 .srp = {STATUS1, 7, RW},
19679 .srl = {STATUS2, 0, RW},
19680 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19681 .tb = {STATUS1, 5, RW},
19682 .sec = {STATUS1, 6, RW},
19683 .cmp = {STATUS2, 6, RW},
19684 .wps = {STATUS3, 2, RW},
19685 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019686 .wp_write_cfg = spi_wp_write_cfg,
19687 .wp_read_cfg = spi_wp_read_cfg,
19688 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019689 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019690 .prepare_access = spi_prepare_io,
19691 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019692 },
19693
19694 {
19695 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019696 .name = "W25Q32JW...M",
19697 .bustype = BUS_SPI,
19698 .manufacture_id = WINBOND_NEX_ID,
19699 .model_id = WINBOND_NEX_W25Q32JW_M,
19700 .total_size = 4096,
19701 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019702 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19703 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010019704 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019705 FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2,
Nico Huber2133f592024-01-06 18:30:01 +010019706 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019707 .tested = TEST_OK_PREW,
19708 .probe = probe_spi_rdid,
19709 .probe_timing = TIMING_ZERO,
19710 .block_erasers =
19711 {
19712 {
19713 .eraseblocks = { {4 * 1024, 1024} },
19714 .block_erase = spi_block_erase_20,
19715 }, {
19716 .eraseblocks = { {32 * 1024, 128} },
19717 .block_erase = spi_block_erase_52,
19718 }, {
19719 .eraseblocks = { {64 * 1024, 64} },
19720 .block_erase = spi_block_erase_d8,
19721 }, {
19722 .eraseblocks = { {4 * 1024 * 1024, 1} },
19723 .block_erase = spi_block_erase_60,
19724 }, {
19725 .eraseblocks = { {4 * 1024 * 1024, 1} },
19726 .block_erase = spi_block_erase_c7,
19727 }
19728 },
19729 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19730 .unlock = spi_disable_blockprotect_bp2_srwd,
19731 .write = spi_chip_write_256,
19732 .read = spi_chip_read,
19733 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019734 .reg_bits =
19735 {
Nico Huber2133f592024-01-06 18:30:01 +010019736 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019737 .srp = {STATUS1, 7, RW},
19738 .srl = {STATUS2, 0, RW},
19739 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19740 .tb = {STATUS1, 5, RW},
19741 .sec = {STATUS1, 6, RW},
19742 .cmp = {STATUS2, 6, RW},
19743 .wps = {STATUS3, 2, RW},
19744 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019745 .wp_write_cfg = spi_wp_write_cfg,
19746 .wp_read_cfg = spi_wp_read_cfg,
19747 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019748 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019749 .prepare_access = spi_prepare_io,
19750 .finish_access = spi_finish_io,
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019751 },
19752
19753 {
19754 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019755 .name = "W25Q40.V",
19756 .bustype = BUS_SPI,
19757 .manufacture_id = WINBOND_NEX_ID,
19758 .model_id = WINBOND_NEX_W25Q40_V,
19759 .total_size = 512,
19760 .page_size = 256,
19761 /* supports SFDP */
19762 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019763 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019764 .tested = TEST_OK_PREW,
19765 .probe = probe_spi_rdid,
19766 .probe_timing = TIMING_ZERO,
19767 .block_erasers =
19768 {
19769 {
19770 .eraseblocks = { {4 * 1024, 128} },
19771 .block_erase = spi_block_erase_20,
19772 }, {
19773 .eraseblocks = { {32 * 1024, 16} },
19774 .block_erase = spi_block_erase_52,
19775 }, {
19776 .eraseblocks = { {64 * 1024, 8} },
19777 .block_erase = spi_block_erase_d8,
19778 }, {
19779 .eraseblocks = { {512 * 1024, 1} },
19780 .block_erase = spi_block_erase_60,
19781 }, {
19782 .eraseblocks = { {512 * 1024, 1} },
19783 .block_erase = spi_block_erase_c7,
19784 }
19785 },
Nico Huber2133f592024-01-06 18:30:01 +010019786 .reg_bits =
19787 {
19788 .qe = {STATUS2, 1, RW},
19789 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019790 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19791 .unlock = spi_disable_blockprotect,
19792 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber2133f592024-01-06 18:30:01 +010019793 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019794 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019795 .prepare_access = spi_prepare_io,
19796 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019797 },
19798
19799 {
19800 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019801 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019802 .bustype = BUS_SPI,
19803 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020019804 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019805 .total_size = 512,
19806 .page_size = 256,
19807 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019808 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Angel Pons3164a0c2018-09-30 20:26:06 +020019809 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019810 .probe = probe_spi_rdid,
19811 .probe_timing = TIMING_ZERO,
19812 .block_erasers =
19813 {
19814 {
19815 .eraseblocks = { {4 * 1024, 128} },
19816 .block_erase = spi_block_erase_20,
19817 }, {
19818 .eraseblocks = { {32 * 1024, 16} },
19819 .block_erase = spi_block_erase_52,
19820 }, {
19821 .eraseblocks = { {64 * 1024, 8} },
19822 .block_erase = spi_block_erase_d8,
19823 }, {
19824 .eraseblocks = { {512 * 1024, 1} },
19825 .block_erase = spi_block_erase_60,
19826 }, {
19827 .eraseblocks = { {512 * 1024, 1} },
19828 .block_erase = spi_block_erase_c7,
19829 }
19830 },
Nico Huber2133f592024-01-06 18:30:01 +010019831 .reg_bits =
19832 {
19833 .qe = {STATUS2, 1, RW},
19834 },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019835 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19836 .unlock = spi_disable_blockprotect,
19837 .write = spi_chip_write_256,
19838 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019839 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019840 .prepare_access = spi_prepare_io,
19841 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019842 },
19843
19844 {
19845 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019846 .name = "W25Q40EW",
19847 .bustype = BUS_SPI,
19848 .manufacture_id = WINBOND_NEX_ID,
19849 .model_id = WINBOND_NEX_W25Q40EW,
19850 .total_size = 512,
19851 .page_size = 256,
19852 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019853 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
19854 FEATURE_OTP | FEATURE_QPI_SRP,
19855 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green07b8a172019-09-23 16:47:05 +100019856 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020019857 .probe = probe_spi_rdid,
19858 .probe_timing = TIMING_ZERO,
19859 .block_erasers =
19860 {
19861 {
19862 .eraseblocks = { {4 * 1024, 128} },
19863 .block_erase = spi_block_erase_20,
19864 }, {
19865 .eraseblocks = { {32 * 1024, 16} },
19866 .block_erase = spi_block_erase_52,
19867 }, {
19868 .eraseblocks = { {64 * 1024, 8} },
19869 .block_erase = spi_block_erase_d8,
19870 }, {
19871 .eraseblocks = { {512 * 1024, 1} },
19872 .block_erase = spi_block_erase_60,
19873 }, {
19874 .eraseblocks = { {512 * 1024, 1} },
19875 .block_erase = spi_block_erase_c7,
19876 }
19877 },
Nico Huber2133f592024-01-06 18:30:01 +010019878 .reg_bits =
19879 {
19880 .qe = {STATUS2, 1, RW},
19881 },
Nico Huber25683572018-03-30 13:50:13 +020019882 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19883 .unlock = spi_disable_blockprotect,
19884 .write = spi_chip_write_256,
19885 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019886 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019887 .prepare_access = spi_prepare_io,
19888 .finish_access = spi_finish_io,
Nico Huber25683572018-03-30 13:50:13 +020019889 },
19890
Stanislav Sedovf5775442018-03-07 14:16:51 -080019891 {
19892 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093019893 .name = "W25Q512JV",
19894 .bustype = BUS_SPI,
19895 .manufacture_id = WINBOND_NEX_ID,
19896 .model_id = WINBOND_NEX_W25Q512JV,
19897 .total_size = 64 * 1024,
19898 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
19900 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Joel Stanley55439612019-07-27 19:25:35 +093019901 .tested = TEST_OK_PREW,
19902 .probe = probe_spi_rdid,
19903 .probe_timing = TIMING_ZERO,
19904 .block_erasers =
19905 {
19906 {
19907 .eraseblocks = { {4 * 1024, 16384} },
19908 .block_erase = spi_block_erase_21,
19909 }, {
19910 .eraseblocks = { {4 * 1024, 16384} },
19911 .block_erase = spi_block_erase_20,
19912 }, {
19913 .eraseblocks = { {32 * 1024, 2048} },
19914 .block_erase = spi_block_erase_52,
19915 }, {
19916 .eraseblocks = { {64 * 1024, 1024} },
19917 .block_erase = spi_block_erase_dc,
19918 }, {
19919 .eraseblocks = { {64 * 1024, 1024} },
19920 .block_erase = spi_block_erase_d8,
19921 }, {
19922 .eraseblocks = { {64 * 1024 * 1024, 1} },
19923 .block_erase = spi_block_erase_60,
19924 }, {
19925 .eraseblocks = { {64 * 1024 * 1024, 1} },
19926 .block_erase = spi_block_erase_c7,
19927 }
19928 },
Nico Huber2133f592024-01-06 18:30:01 +010019929 .reg_bits =
19930 {
19931 .qe = {STATUS2, 1, RW},
19932 },
Joel Stanley55439612019-07-27 19:25:35 +093019933 .printlock = spi_prettyprint_status_register_plain,
19934 .unlock = spi_disable_blockprotect,
19935 .write = spi_chip_write_256,
19936 .read = spi_chip_read,
19937 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019938 .prepare_access = spi_prepare_io,
19939 .finish_access = spi_finish_io,
Joel Stanley55439612019-07-27 19:25:35 +093019940 },
19941
19942 {
Alexandru M Stan6ce26a72024-10-11 22:47:24 -070019943 .vendor = "Winbond",
19944 .name = "W25R512NW/W74M51NW",
19945 .bustype = BUS_SPI,
19946 .manufacture_id = WINBOND_NEX_ID,
19947 .model_id = WINBOND_NEX_W25R512NW,
19948 .total_size = 65536,
19949 .page_size = 256,
19950 /* supports SFDP */
19951 /* OTP: 3X256B; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19952 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
19953 .tested = TEST_OK_PREW,
19954 .probe = probe_spi_rdid,
19955 .probe_timing = TIMING_ZERO,
19956 .block_erasers =
19957 {
19958 {
19959 .eraseblocks = { {4 * 1024, 16384} },
19960 .block_erase = spi_block_erase_21,
19961 }, {
19962 .eraseblocks = { {4 * 1024, 16384} },
19963 .block_erase = spi_block_erase_20,
19964 }, {
19965 .eraseblocks = { {32 * 1024, 2048} },
19966 .block_erase = spi_block_erase_52,
19967 }, {
19968 .eraseblocks = { {64 * 1024, 1024} },
19969 .block_erase = spi_block_erase_dc,
19970 }, {
19971 .eraseblocks = { {64 * 1024, 1024} },
19972 .block_erase = spi_block_erase_d8,
19973 }, {
19974 .eraseblocks = { {64 * 1024 * 1024, 1} },
19975 .block_erase = spi_block_erase_60,
19976 }, {
19977 .eraseblocks = { {64 * 1024 * 1024, 1} },
19978 .block_erase = spi_block_erase_c7,
19979 }
19980 },
19981 .printlock = spi_prettyprint_status_register_bp3_srwd,
19982 .unlock = spi_disable_blockprotect,
19983 .write = spi_chip_write_256,
19984 .read = spi_chip_read,
19985 .voltage = {1700, 1950},
19986 .prepare_access = spi_prepare_io,
19987 .finish_access = spi_finish_io,
19988 },
19989
19990 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010019991 .vendor = "Winbond",
19992 .name = "W25Q512NW-IM",
19993 .bustype = BUS_SPI,
19994 .manufacture_id = WINBOND_NEX_ID,
19995 .model_id = WINBOND_NEX_W25Q512NW_IM,
19996 .total_size = 64 * 1024,
19997 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019998 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19999 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
20000 .dummy_cycles =
20001 {
20002 /* Actually has 3 parameter bits, but higher values only help with DTR. */
20003 .qpi_read_params = { 2, 4, 6, 8 },
20004 },
Subrata Banikf5bffd92022-12-14 12:30:43 +053020005 .tested = TEST_OK_PREWB,
Felix Singer3c9bdb92022-12-15 23:30:16 +010020006 .probe = probe_spi_rdid,
20007 .probe_timing = TIMING_ZERO,
20008 .block_erasers =
Atul Dhudase2502dbd2021-09-21 10:02:20 +053020009 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010020010 {
20011 .eraseblocks = { {4 * 1024, 16384} },
20012 .block_erase = spi_block_erase_21,
20013 }, {
20014 .eraseblocks = { {4 * 1024, 16384} },
20015 .block_erase = spi_block_erase_20,
20016 }, {
20017 .eraseblocks = { {32 * 1024, 2048} },
20018 .block_erase = spi_block_erase_52,
20019 }, {
20020 .eraseblocks = { {64 * 1024, 1024} },
20021 .block_erase = spi_block_erase_dc,
20022 }, {
20023 .eraseblocks = { {64 * 1024, 1024} },
20024 .block_erase = spi_block_erase_d8,
20025 }, {
20026 .eraseblocks = { {64 * 1024 * 1024, 1} },
20027 .block_erase = spi_block_erase_60,
20028 }, {
20029 .eraseblocks = { {64 * 1024 * 1024, 1} },
20030 .block_erase = spi_block_erase_c7,
20031 }
20032 },
20033 .unlock = spi_disable_blockprotect,
20034 .write = spi_chip_write_256,
20035 .read = spi_chip_read,
20036 .voltage = {1650, 1950},
Subrata Banikf5bffd92022-12-14 12:30:43 +053020037 .reg_bits =
20038 {
Nico Huber2133f592024-01-06 18:30:01 +010020039 .qe = {STATUS2, 1, RW},
Subrata Banikf5bffd92022-12-14 12:30:43 +053020040 .srp = {STATUS1, 7, RW},
20041 .srl = {STATUS2, 0, RW},
20042 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
20043 .tb = {STATUS1, 6, RW},
20044 .cmp = {STATUS2, 6, RW},
20045 .wps = {STATUS3, 2, RW},
20046 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020047 .wp_write_cfg = spi_wp_write_cfg,
20048 .wp_read_cfg = spi_wp_read_cfg,
20049 .wp_get_ranges = spi_wp_get_available_ranges,
Subrata Banikf5bffd92022-12-14 12:30:43 +053020050 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020051 .prepare_access = spi_prepare_io,
20052 .finish_access = spi_finish_io,
Atul Dhudase2502dbd2021-09-21 10:02:20 +053020053 },
20054
20055 {
Joel Stanley55439612019-07-27 19:25:35 +093020056 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020057 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080020058 .bustype = BUS_SPI,
20059 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020060 .model_id = WINBOND_NEX_W25Q64_V,
20061 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080020062 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020063 /* supports SFDP */
20064 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010020065 /* QPI: only FV version */
20066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030020067 .tested = TEST_OK_PREWB,
Stanislav Sedovf5775442018-03-07 14:16:51 -080020068 .probe = probe_spi_rdid,
20069 .probe_timing = TIMING_ZERO,
20070 .block_erasers =
20071 {
20072 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020073 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080020074 .block_erase = spi_block_erase_20,
20075 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020076 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080020077 .block_erase = spi_block_erase_52,
20078 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020079 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080020080 .block_erase = spi_block_erase_d8,
20081 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020082 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080020083 .block_erase = spi_block_erase_60,
20084 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020085 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080020086 .block_erase = spi_block_erase_c7,
20087 }
20088 },
20089 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20090 .unlock = spi_disable_blockprotect,
20091 .write = spi_chip_write_256,
20092 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020093 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020094 .reg_bits =
20095 {
Nico Huber2133f592024-01-06 18:30:01 +010020096 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020097 .srp = {STATUS1, 7, RW},
20098 .srl = {STATUS2, 0, RW},
20099 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20100 .tb = {STATUS1, 5, RW},
20101 .sec = {STATUS1, 6, RW},
20102 .cmp = {STATUS2, 6, RW},
20103 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020104 .wp_write_cfg = spi_wp_write_cfg,
20105 .wp_read_cfg = spi_wp_read_cfg,
20106 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020107 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020108 .prepare_access = spi_prepare_io,
20109 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000020110 },
20111
20112 {
20113 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020114 .name = "W25Q64JV-.Q",
20115 .bustype = BUS_SPI,
20116 .manufacture_id = WINBOND_NEX_ID,
20117 .model_id = WINBOND_NEX_W25Q64_V,
20118 .total_size = 8192,
20119 .page_size = 256,
20120 /* supports SFDP */
20121 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010020122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020020123 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020124 .tested = TEST_OK_PREW,
20125 .probe = probe_spi_rdid,
20126 .probe_timing = TIMING_ZERO,
20127 .block_erasers =
20128 {
20129 {
20130 .eraseblocks = { {4 * 1024, 2048} },
20131 .block_erase = spi_block_erase_20,
20132 }, {
20133 .eraseblocks = { {32 * 1024, 256} },
20134 .block_erase = spi_block_erase_52,
20135 }, {
20136 .eraseblocks = { {64 * 1024, 128} },
20137 .block_erase = spi_block_erase_d8,
20138 }, {
20139 .eraseblocks = { {8 * 1024 * 1024, 1} },
20140 .block_erase = spi_block_erase_60,
20141 }, {
20142 .eraseblocks = { {8 * 1024 * 1024, 1} },
20143 .block_erase = spi_block_erase_c7,
20144 }
20145 },
20146 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20147 .unlock = spi_disable_blockprotect,
20148 .write = spi_chip_write_256,
20149 .read = spi_chip_read,
20150 .voltage = {2700, 3600},
20151 .reg_bits =
20152 {
Nico Huber2133f592024-01-06 18:30:01 +010020153 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020154 .srp = {STATUS1, 7, RW},
20155 .srl = {STATUS2, 0, RW},
20156 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20157 .tb = {STATUS1, 5, RW},
20158 .sec = {STATUS1, 6, RW},
20159 .cmp = {STATUS2, 6, RW},
20160 .wps = {STATUS3, 2, RW},
20161 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020162 .wp_write_cfg = spi_wp_write_cfg,
20163 .wp_read_cfg = spi_wp_read_cfg,
20164 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020165 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020166 .prepare_access = spi_prepare_io,
20167 .finish_access = spi_finish_io,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020020168 },
20169
20170 {
20171 .vendor = "Winbond",
20172 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010020173 .bustype = BUS_SPI,
20174 .manufacture_id = WINBOND_NEX_ID,
20175 .model_id = WINBOND_NEX_W25Q64JV,
20176 .total_size = 8192,
20177 .page_size = 256,
20178 /* supports SFDP */
Nico Huber2133f592024-01-06 18:30:01 +010020179 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
20180 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010020181 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Simon Buhrow236a38c2021-11-05 11:48:30 +010020182 .tested = TEST_OK_PREW,
20183 .probe = probe_spi_rdid,
20184 .probe_timing = TIMING_ZERO,
20185 .block_erasers =
20186 {
20187 {
20188 .eraseblocks = { {4 * 1024, 2048} },
20189 .block_erase = spi_block_erase_20,
20190 }, {
20191 .eraseblocks = { {32 * 1024, 256} },
20192 .block_erase = spi_block_erase_52,
20193 }, {
20194 .eraseblocks = { {64 * 1024, 128} },
20195 .block_erase = spi_block_erase_d8,
20196 }, {
20197 .eraseblocks = { {8 * 1024 * 1024, 1} },
20198 .block_erase = spi_block_erase_60,
20199 }, {
20200 .eraseblocks = { {8 * 1024 * 1024, 1} },
20201 .block_erase = spi_block_erase_c7,
20202 }
20203 },
Nico Huber2133f592024-01-06 18:30:01 +010020204 .reg_bits =
20205 {
20206 .qe = {STATUS2, 1, RW},
20207 },
Simon Buhrow236a38c2021-11-05 11:48:30 +010020208 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
20209 .unlock = spi_disable_blockprotect_bp2_srwd,
20210 .write = spi_chip_write_256,
20211 .read = spi_chip_read,
20212 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020213 .prepare_access = spi_prepare_io,
20214 .finish_access = spi_finish_io,
Simon Buhrow236a38c2021-11-05 11:48:30 +010020215 },
20216
20217 {
20218 .vendor = "Winbond",
Nico Hubera358b142024-04-14 18:29:06 +020020219 .name = "W25Q64DW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000020220 .bustype = BUS_SPI,
20221 .manufacture_id = WINBOND_NEX_ID,
20222 .model_id = WINBOND_NEX_W25Q64_W,
20223 .total_size = 8192,
20224 .page_size = 256,
20225 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010020226 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
20227 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nico Hubera358b142024-04-14 18:29:06 +020020228 .tested = TEST_OK_PREW,
20229 .probe = probe_spi_rdid,
20230 .probe_timing = TIMING_ZERO,
20231 .block_erasers =
20232 {
20233 {
20234 .eraseblocks = { {4 * 1024, 2048} },
20235 .block_erase = spi_block_erase_20,
20236 }, {
20237 .eraseblocks = { {32 * 1024, 256} },
20238 .block_erase = spi_block_erase_52,
20239 }, {
20240 .eraseblocks = { {64 * 1024, 128} },
20241 .block_erase = spi_block_erase_d8,
20242 }, {
20243 .eraseblocks = { {8 * 1024 * 1024, 1} },
20244 .block_erase = spi_block_erase_60,
20245 }, {
20246 .eraseblocks = { {8 * 1024 * 1024, 1} },
20247 .block_erase = spi_block_erase_c7,
20248 }
20249 },
20250 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20251 .unlock = spi_disable_blockprotect,
20252 .write = spi_chip_write_256,
20253 .read = spi_chip_read,
20254 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
20255 .reg_bits =
20256 {
20257 .srp = {STATUS1, 7, RW},
20258 .srl = {STATUS2, 0, RW},
20259 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20260 .tb = {STATUS1, 5, RW},
20261 .sec = {STATUS1, 6, RW},
20262 .cmp = {STATUS2, 6, RW},
20263 },
20264 .wp_write_cfg = spi_wp_write_cfg,
20265 .wp_read_cfg = spi_wp_read_cfg,
20266 .wp_get_ranges = spi_wp_get_available_ranges,
20267 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020268 .prepare_access = spi_prepare_io,
20269 .finish_access = spi_finish_io,
Nico Hubera358b142024-04-14 18:29:06 +020020270 },
20271
20272 {
20273 .vendor = "Winbond",
20274 .name = "W25Q64FW/W25Q64JW...Q",
20275 .bustype = BUS_SPI,
20276 .manufacture_id = WINBOND_NEX_ID,
20277 .model_id = WINBOND_NEX_W25Q64_W,
20278 .total_size = 8192,
20279 .page_size = 256,
20280 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010020281 /* FEATURE_QPI_SRP (2, 4, 6, 8): only FW version */
Nico Hubera358b142024-04-14 18:29:06 +020020282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
Nico Huber1412d9f2024-01-06 18:25:49 +010020283 FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030020284 .tested = TEST_OK_PREWB,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000020285 .probe = probe_spi_rdid,
20286 .probe_timing = TIMING_ZERO,
20287 .block_erasers =
20288 {
20289 {
20290 .eraseblocks = { {4 * 1024, 2048} },
20291 .block_erase = spi_block_erase_20,
20292 }, {
20293 .eraseblocks = { {32 * 1024, 256} },
20294 .block_erase = spi_block_erase_52,
20295 }, {
20296 .eraseblocks = { {64 * 1024, 128} },
20297 .block_erase = spi_block_erase_d8,
20298 }, {
20299 .eraseblocks = { {8 * 1024 * 1024, 1} },
20300 .block_erase = spi_block_erase_60,
20301 }, {
20302 .eraseblocks = { {8 * 1024 * 1024, 1} },
20303 .block_erase = spi_block_erase_c7,
20304 }
20305 },
20306 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20307 .unlock = spi_disable_blockprotect,
20308 .write = spi_chip_write_256,
20309 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010020310 .voltage = {1700, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020311 .reg_bits =
20312 {
Nico Huber2133f592024-01-06 18:30:01 +010020313 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020314 .srp = {STATUS1, 7, RW},
20315 .srl = {STATUS2, 0, RW},
20316 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20317 .tb = {STATUS1, 5, RW},
20318 .sec = {STATUS1, 6, RW},
20319 .cmp = {STATUS2, 6, RW},
20320 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020321 .wp_write_cfg = spi_wp_write_cfg,
20322 .wp_read_cfg = spi_wp_read_cfg,
20323 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020324 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020325 .prepare_access = spi_prepare_io,
20326 .finish_access = spi_finish_io,
Antony Rheneus0fbba982011-05-26 14:28:51 +000020327 },
20328
20329 {
20330 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100020331 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080020332 .bustype = BUS_SPI,
20333 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100020334 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080020335 .total_size = 8192,
20336 .page_size = 256,
20337 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
20338 /* QPI enable 0x38, disable 0xFF */
Nico Huber1412d9f2024-01-06 18:25:49 +010020339 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
20340 FEATURE_OTP | FEATURE_QPI_SRP,
20341 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Scott Chao1bbc5012020-04-08 22:10:50 +080020342 .tested = TEST_OK_PREW,
20343 .probe = probe_spi_rdid,
20344 .probe_timing = TIMING_ZERO,
20345 .block_erasers =
20346 {
20347 {
20348 .eraseblocks = { {4 * 1024, 2048} },
20349 .block_erase = spi_block_erase_20,
20350 }, {
20351 .eraseblocks = { {32 * 1024, 256} },
20352 .block_erase = spi_block_erase_52,
20353 }, {
20354 .eraseblocks = { {64 * 1024, 128} },
20355 .block_erase = spi_block_erase_d8,
20356 }, {
20357 .eraseblocks = { {8 * 1024 * 1024, 1} },
20358 .block_erase = spi_block_erase_60,
20359 }, {
20360 .eraseblocks = { {8 * 1024 * 1024, 1} },
20361 .block_erase = spi_block_erase_c7,
20362 }
20363 },
20364 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20365 .unlock = spi_disable_blockprotect,
20366 .write = spi_chip_write_256,
20367 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010020368 .voltage = {1700, 1950},
Evan Benn29c8b5d2022-09-13 16:01:10 +100020369 .reg_bits =
20370 {
Nico Huber2133f592024-01-06 18:30:01 +010020371 .qe = {STATUS2, 1, RW},
Evan Benn29c8b5d2022-09-13 16:01:10 +100020372 .srp = {STATUS1, 7, RW},
20373 .srl = {STATUS2, 0, RW},
20374 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20375 .tb = {STATUS1, 5, RW},
20376 .sec = {STATUS1, 6, RW},
20377 .cmp = {STATUS2, 6, RW},
20378 .wps = {STATUS3, 2, RW},
20379 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020380 .wp_write_cfg = spi_wp_write_cfg,
20381 .wp_read_cfg = spi_wp_read_cfg,
20382 .wp_get_ranges = spi_wp_get_available_ranges,
Evan Benn29c8b5d2022-09-13 16:01:10 +100020383 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020020384 .prepare_access = spi_prepare_io,
20385 .finish_access = spi_finish_io,
Scott Chao1bbc5012020-04-08 22:10:50 +080020386 },
20387
20388 {
20389 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020390 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020020391 .bustype = BUS_SPI,
20392 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020393 .model_id = WINBOND_NEX_W25Q80_V,
20394 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020020395 .page_size = 256,
20396 /* supports SFDP */
20397 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010020398 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
David Hendricks48729d32017-12-08 14:44:07 -080020399 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020020400 .probe = probe_spi_rdid,
20401 .probe_timing = TIMING_ZERO,
20402 .block_erasers =
20403 {
20404 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020405 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020020406 .block_erase = spi_block_erase_20,
20407 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020408 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020020409 .block_erase = spi_block_erase_52,
20410 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020411 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020020412 .block_erase = spi_block_erase_d8,
20413 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020414 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020020415 .block_erase = spi_block_erase_60,
20416 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020417 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020020418 .block_erase = spi_block_erase_c7,
20419 }
20420 },
Nico Huber2133f592024-01-06 18:30:01 +010020421 .reg_bits =
20422 {
20423 .qe = {STATUS2, 1, RW},
20424 },
Nico Huber70eed9f2017-04-24 22:19:27 +020020425 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20426 .unlock = spi_disable_blockprotect,
20427 .write = spi_chip_write_256,
20428 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020429 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020430 .prepare_access = spi_prepare_io,
20431 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020432 },
20433
20434 {
20435 .vendor = "Winbond",
20436 .name = "W25Q80BW",
20437 .bustype = BUS_SPI,
20438 .manufacture_id = WINBOND_NEX_ID,
20439 .model_id = WINBOND_NEX_W25Q80BW,
20440 .total_size = 1024,
20441 .page_size = 256,
20442 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010020443 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020444 .tested = TEST_OK_PREW,
20445 .probe = probe_spi_rdid,
20446 .probe_timing = TIMING_ZERO,
20447 .block_erasers =
20448 {
20449 {
20450 .eraseblocks = { {4 * 1024, 256} },
20451 .block_erase = spi_block_erase_20,
20452 }, {
20453 .eraseblocks = { {32 * 1024, 32} },
20454 .block_erase = spi_block_erase_52,
20455 }, {
20456 .eraseblocks = { {64 * 1024, 16} },
20457 .block_erase = spi_block_erase_d8,
20458 }, {
20459 .eraseblocks = { {1 * 1024 * 1024, 1} },
20460 .block_erase = spi_block_erase_60,
20461 }, {
20462 .eraseblocks = { {1 * 1024 * 1024, 1} },
20463 .block_erase = spi_block_erase_c7,
20464 }
20465 },
Nico Huber2133f592024-01-06 18:30:01 +010020466 .reg_bits =
20467 {
20468 .qe = {STATUS2, 1, RW},
20469 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100020470 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20471 .unlock = spi_disable_blockprotect,
20472 .write = spi_chip_write_256,
20473 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010020474 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020020475 .prepare_access = spi_prepare_io,
20476 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020477 },
20478
20479 {
20480 .vendor = "Winbond",
20481 .name = "W25Q80EW",
20482 .bustype = BUS_SPI,
20483 .manufacture_id = WINBOND_NEX_ID,
20484 .model_id = WINBOND_NEX_W25Q80EW,
20485 .total_size = 1024,
20486 .page_size = 256,
20487 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010020488 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
20489 FEATURE_OTP | FEATURE_QPI_SRP,
20490 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green1f9cc7d2019-07-01 11:10:45 +100020491 .tested = TEST_OK_PREW,
20492 .probe = probe_spi_rdid,
20493 .probe_timing = TIMING_ZERO,
20494 .block_erasers =
20495 {
20496 {
20497 .eraseblocks = { {4 * 1024, 256} },
20498 .block_erase = spi_block_erase_20,
20499 }, {
20500 .eraseblocks = { {32 * 1024, 32} },
20501 .block_erase = spi_block_erase_52,
20502 }, {
20503 .eraseblocks = { {64 * 1024, 16} },
20504 .block_erase = spi_block_erase_d8,
20505 }, {
20506 .eraseblocks = { {1 * 1024 * 1024, 1} },
20507 .block_erase = spi_block_erase_60,
20508 }, {
20509 .eraseblocks = { {1 * 1024 * 1024, 1} },
20510 .block_erase = spi_block_erase_c7,
20511 }
20512 },
Nico Huber2133f592024-01-06 18:30:01 +010020513 .reg_bits =
20514 {
20515 .qe = {STATUS2, 1, RW},
20516 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100020517 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20518 .unlock = spi_disable_blockprotect,
20519 .write = spi_chip_write_256,
20520 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010020521 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020020522 .prepare_access = spi_prepare_io,
20523 .finish_access = spi_finish_io,
Nico Huber70eed9f2017-04-24 22:19:27 +020020524 },
20525
20526 {
20527 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020528 .name = "W25X05",
20529 .bustype = BUS_SPI,
20530 .manufacture_id = WINBOND_NEX_ID,
20531 .model_id = WINBOND_NEX_W25X05,
20532 .total_size = 64,
20533 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020534 /* FEATURE_FAST_READ_DIO since W25X05B */
20535 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020536 .tested = TEST_OK_PREW,
20537 .probe = probe_spi_rdid,
20538 .probe_timing = TIMING_ZERO,
20539 .block_erasers =
20540 {
20541 {
20542 .eraseblocks = { {4 * 1024, 16} },
20543 .block_erase = spi_block_erase_20,
20544 }, {
20545 .eraseblocks = { {32 * 1024, 2} },
20546 .block_erase = spi_block_erase_52,
20547 }, {
20548 .eraseblocks = { {64 * 1024, 1} },
20549 .block_erase = spi_block_erase_d8,
20550 }
20551 },
20552 .printlock = spi_prettyprint_status_register_plain,
20553 .unlock = spi_disable_blockprotect,
20554 .write = spi_chip_write_256,
20555 .read = spi_chip_read,
20556 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020557 .prepare_access = spi_prepare_io,
20558 .finish_access = spi_finish_io,
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020559 },
20560
20561 {
20562 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020563 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020564 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020565 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020566 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020567 .total_size = 128,
20568 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020569 /* FEATURE_FAST_READ_DIO since W25X10B */
20570 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunere34e3e82013-01-01 00:06:51 +000020571 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020572 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020573 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020574 .block_erasers =
20575 {
20576 {
20577 .eraseblocks = { {4 * 1024, 32} },
20578 .block_erase = spi_block_erase_20,
20579 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020580 .eraseblocks = { {64 * 1024, 2} },
20581 .block_erase = spi_block_erase_d8,
20582 }, {
20583 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020584 .block_erase = spi_block_erase_c7,
20585 }
20586 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020587 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020588 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000020589 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020590 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020591 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020592 .prepare_access = spi_prepare_io,
20593 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +000020594 },
20595
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020596 {
20597 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020598 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020599 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000020600 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020601 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000020602 .total_size = 2048,
20603 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020604 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner8179be52011-06-04 13:13:34 +000020605 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000020606 .probe = probe_spi_rdid,
20607 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020608 .block_erasers =
20609 {
20610 {
20611 .eraseblocks = { {4 * 1024, 512} },
20612 .block_erase = spi_block_erase_20,
20613 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020614 .eraseblocks = { {64 * 1024, 32} },
20615 .block_erase = spi_block_erase_d8,
20616 }, {
20617 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020618 .block_erase = spi_block_erase_c7,
20619 }
20620 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020621 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020622 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000020623 .write = spi_chip_write_256,
20624 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020625 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020626 .prepare_access = spi_prepare_io,
20627 .finish_access = spi_finish_io,
Hector Martina721ae22009-07-11 19:39:11 +000020628 },
20629
20630 {
20631 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020632 .name = "W25X20",
20633 .bustype = BUS_SPI,
20634 .manufacture_id = WINBOND_NEX_ID,
20635 .model_id = WINBOND_NEX_W25X20,
20636 .total_size = 256,
20637 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020638 /* FEATURE_FAST_READ_DIO since W25X20B */
20639 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020640 .tested = TEST_OK_PREW,
20641 .probe = probe_spi_rdid,
20642 .probe_timing = TIMING_ZERO,
20643 .block_erasers =
20644 {
20645 {
20646 .eraseblocks = { {4 * 1024, 64} },
20647 .block_erase = spi_block_erase_20,
20648 }, {
20649 .eraseblocks = { {64 * 1024, 4} },
20650 .block_erase = spi_block_erase_d8,
20651 }, {
20652 .eraseblocks = { {256 * 1024, 1} },
20653 .block_erase = spi_block_erase_c7,
20654 }
20655 },
20656 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20657 .unlock = spi_disable_blockprotect,
20658 .write = spi_chip_write_256,
20659 .read = spi_chip_read,
20660 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020661 .prepare_access = spi_prepare_io,
20662 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020663 },
20664
20665 {
20666 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020667 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020668 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000020669 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020670 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000020671 .total_size = 4096,
20672 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000020674 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000020675 .probe = probe_spi_rdid,
20676 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020677 .block_erasers =
20678 {
20679 {
20680 .eraseblocks = { {4 * 1024, 1024} },
20681 .block_erase = spi_block_erase_20,
20682 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020683 .eraseblocks = { {64 * 1024, 64} },
20684 .block_erase = spi_block_erase_d8,
20685 }, {
20686 .eraseblocks = { {4 * 1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020687 .block_erase = spi_block_erase_c7,
20688 }
20689 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020690 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020691 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000020692 .write = spi_chip_write_256,
20693 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020694 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020695 .prepare_access = spi_prepare_io,
20696 .finish_access = spi_finish_io,
Zheng Bao1db2b752009-11-26 11:05:01 +000020697 },
20698
20699 {
20700 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020701 .name = "W25X40",
20702 .bustype = BUS_SPI,
20703 .manufacture_id = WINBOND_NEX_ID,
20704 .model_id = WINBOND_NEX_W25X40,
20705 .total_size = 512,
20706 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020707 /* FEATURE_FAST_READ_DIO since W25X40B */
20708 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020709 .tested = TEST_OK_PREW,
20710 .probe = probe_spi_rdid,
20711 .probe_timing = TIMING_ZERO,
20712 .block_erasers =
20713 {
20714 {
20715 .eraseblocks = { {4 * 1024, 128} },
20716 .block_erase = spi_block_erase_20,
20717 }, {
20718 .eraseblocks = { {64 * 1024, 8} },
20719 .block_erase = spi_block_erase_d8,
20720 }, {
20721 .eraseblocks = { {512 * 1024, 1} },
20722 .block_erase = spi_block_erase_c7,
20723 }
20724 },
20725 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20726 .unlock = spi_disable_blockprotect,
20727 .write = spi_chip_write_256,
20728 .read = spi_chip_read,
20729 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020730 .prepare_access = spi_prepare_io,
20731 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020732 },
20733
20734 {
20735 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020736 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020737 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000020738 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020739 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000020740 .total_size = 8192,
20741 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020742 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020743 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000020744 .probe = probe_spi_rdid,
20745 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020746 .block_erasers =
20747 {
20748 {
20749 .eraseblocks = { {4 * 1024, 2048} },
20750 .block_erase = spi_block_erase_20,
20751 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020752 .eraseblocks = { {64 * 1024, 128} },
20753 .block_erase = spi_block_erase_d8,
20754 }, {
20755 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020756 .block_erase = spi_block_erase_c7,
20757 }
20758 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020759 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020760 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000020761 .write = spi_chip_write_256,
20762 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020763 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020764 .prepare_access = spi_prepare_io,
20765 .finish_access = spi_finish_io,
Zheng Bao1db2b752009-11-26 11:05:01 +000020766 },
20767
20768 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100020769 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020770 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100020771 .bustype = BUS_SPI,
20772 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020773 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020774 .total_size = 1024,
20775 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020776 /* FEATURE_FAST_READ_DIO since W25X80B */
20777 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020778 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020779 .probe = probe_spi_rdid,
20780 .probe_timing = TIMING_ZERO,
20781 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020782 {
20783 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020784 .eraseblocks = { {4 * 1024, 256} },
20785 .block_erase = spi_block_erase_20,
20786 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020787 .eraseblocks = { {64 * 1024, 16} },
20788 .block_erase = spi_block_erase_d8,
20789 }, {
20790 .eraseblocks = { {1024 * 1024, 1} },
20791 .block_erase = spi_block_erase_c7,
20792 }
20793 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100020794 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20795 .unlock = spi_disable_blockprotect,
20796 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020797 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020798 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020799 .prepare_access = spi_prepare_io,
20800 .finish_access = spi_finish_io,
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020801 },
20802
Alan Greenf29ea362019-06-27 17:14:02 +100020803 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
20804 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000020805 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020806 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020807 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020808 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020809 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020810 .total_size = 128,
20811 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020812 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000020813 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020814 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020815 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020816 .block_erasers =
20817 {
20818 {
20819 .eraseblocks = { {128 * 1024, 1} },
20820 .block_erase = erase_chip_block_jedec,
20821 }
20822 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020823 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020824 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020825 .prepare_access = prepare_memory_access,
20826 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020827 },
20828
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020829 {
20830 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020831 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
20832 .bustype = BUS_PARALLEL,
20833 .manufacture_id = WINBOND_ID,
20834 .model_id = WINBOND_W29C010,
20835 .total_size = 128,
20836 .page_size = 128,
20837 .feature_bits = FEATURE_LONG_RESET,
20838 .tested = TEST_OK_PREW,
20839 .probe = probe_w29ee011,
20840 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
20841 .block_erasers =
20842 {
20843 {
20844 .eraseblocks = { {128 * 1024, 1} },
20845 .block_erase = erase_chip_block_jedec,
20846 }
20847 },
20848 .write = write_jedec,
20849 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020850 .prepare_access = prepare_memory_access,
20851 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020852 },
20853
20854 {
20855 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020856 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020857 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020858 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020859 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020860 .total_size = 256,
20861 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020862 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020863 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020864 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020865 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020866 .block_erasers =
20867 {
20868 {
20869 .eraseblocks = { {256 * 1024, 1} },
20870 .block_erase = erase_chip_block_jedec,
20871 }
20872 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020873 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020874 .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,
FENG yu ningff692fb2008-12-08 18:15:10 +000020878 },
20879
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020880 {
20881 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020882 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020883 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020884 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020885 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020886 .total_size = 512,
20887 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000020888 .feature_bits = FEATURE_LONG_RESET,
20889 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020890 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020891 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020892 .block_erasers =
20893 {
20894 {
20895 .eraseblocks = { {512 * 1024, 1} },
20896 .block_erase = erase_chip_block_jedec,
20897 }
20898 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020899 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020900 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020901 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020902 .prepare_access = prepare_memory_access,
20903 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020904 },
20905
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020906 {
20907 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020908 .name = "W29C512A/W29EE512",
20909 .bustype = BUS_PARALLEL,
20910 .manufacture_id = WINBOND_ID,
20911 .model_id = WINBOND_W29C512A,
20912 .total_size = 64,
20913 .page_size = 128,
20914 .feature_bits = FEATURE_LONG_RESET,
20915 .tested = TEST_OK_PREW,
20916 .probe = probe_jedec,
20917 .probe_timing = 10,
20918 .block_erasers =
20919 {
20920 {
20921 .eraseblocks = { {64 * 1024, 1} },
20922 .block_erase = erase_chip_block_jedec,
20923 }
20924 },
20925 .write = write_jedec,
20926 .read = read_memmapped,
20927 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020928 .prepare_access = prepare_memory_access,
20929 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020930 },
20931
20932 {
20933 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020934 .name = "W29GL032CB",
20935 .bustype = BUS_PARALLEL,
20936 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20937 .model_id = WINBOND_W29GL032CB,
20938 .total_size = 4096,
20939 .page_size = 128 * 1024, /* actual page size is 16 */
20940 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20941 .tested = TEST_UNTESTED,
20942 .probe = probe_jedec_29gl,
20943 .probe_timing = TIMING_ZERO,
20944 .block_erasers =
20945 {
20946 {
20947 .eraseblocks = {
20948 {8 * 1024, 8},
20949 {64 * 1024, 63},
20950 },
20951 .block_erase = erase_sector_jedec,
20952 }, {
20953 .eraseblocks = { {4 * 1024 * 1024, 1} },
20954 .block_erase = erase_chip_block_jedec,
20955 },
20956 },
20957 .write = write_jedec_1,
20958 .read = read_memmapped,
20959 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020960 .prepare_access = prepare_memory_access,
20961 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020962 },
20963
20964 {
20965 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020966 .name = "W29GL032CH/L",
20967 .bustype = BUS_PARALLEL,
20968 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20969 .model_id = WINBOND_W29GL032CHL,
20970 .total_size = 4096,
20971 .page_size = 128 * 1024, /* actual page size is 16 */
20972 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20973 .tested = TEST_UNTESTED,
20974 .probe = probe_jedec_29gl,
20975 .probe_timing = TIMING_ZERO,
20976 .block_erasers =
20977 {
20978 {
20979 .eraseblocks = { {64 * 1024, 64} },
20980 .block_erase = erase_sector_jedec,
20981 }, {
20982 .eraseblocks = { {4 * 1024 * 1024, 1} },
20983 .block_erase = erase_chip_block_jedec,
20984 },
20985 },
20986 .write = write_jedec_1,
20987 .read = read_memmapped,
20988 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020989 .prepare_access = prepare_memory_access,
20990 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020991 },
20992
20993 {
20994 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020995 .name = "W29GL032CT",
20996 .bustype = BUS_PARALLEL,
20997 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20998 .model_id = WINBOND_W29GL032CT,
20999 .total_size = 4096,
21000 .page_size = 128 * 1024, /* actual page size is 16 */
21001 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
21002 .tested = TEST_UNTESTED,
21003 .probe = probe_jedec_29gl,
21004 .probe_timing = TIMING_ZERO,
21005 .block_erasers =
21006 {
21007 {
21008 .eraseblocks = {
21009 {64 * 1024, 63},
21010 {8 * 1024, 8},
21011 },
21012 .block_erase = erase_sector_jedec,
21013 }, {
21014 .eraseblocks = { {4 * 1024 * 1024, 1} },
21015 .block_erase = erase_chip_block_jedec,
21016 },
21017 },
21018 .write = write_jedec_1,
21019 .read = read_memmapped,
21020 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021021 .prepare_access = prepare_memory_access,
21022 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021023 },
21024
21025 {
21026 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021027 .name = "W29GL064CB",
21028 .bustype = BUS_PARALLEL,
21029 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
21030 .model_id = WINBOND_W29GL064CB,
21031 .total_size = 8192,
21032 .page_size = 128 * 1024, /* actual page size is 16 */
21033 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
21034 .tested = TEST_UNTESTED,
21035 .probe = probe_jedec_29gl,
21036 .probe_timing = TIMING_ZERO,
21037 .block_erasers =
21038 {
21039 {
21040 .eraseblocks = {
21041 {8 * 1024, 8},
21042 {64 * 1024, 127},
21043 },
21044 .block_erase = erase_sector_jedec,
21045 }, {
21046 .eraseblocks = { {8 * 1024 * 1024, 1} },
21047 .block_erase = erase_chip_block_jedec,
21048 },
21049 },
21050 .write = write_jedec_1,
21051 .read = read_memmapped,
21052 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021053 .prepare_access = prepare_memory_access,
21054 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021055 },
21056
21057 {
21058 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100021059 .name = "W29GL064CH/L",
21060 .bustype = BUS_PARALLEL,
21061 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
21062 .model_id = WINBOND_W29GL064CHL,
21063 .total_size = 8192,
21064 .page_size = 128 * 1024, /* actual page size is 16 */
21065 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
21066 .tested = TEST_UNTESTED,
21067 .probe = probe_jedec_29gl,
21068 .probe_timing = TIMING_ZERO,
21069 .block_erasers =
21070 {
21071 {
21072 .eraseblocks = { {64 * 1024, 128} },
21073 .block_erase = erase_sector_jedec,
21074 }, {
21075 .eraseblocks = { {8 * 1024 * 1024, 1} },
21076 .block_erase = erase_chip_block_jedec,
21077 },
21078 },
21079 .write = write_jedec_1,
21080 .read = read_memmapped,
21081 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021082 .prepare_access = prepare_memory_access,
21083 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021084 },
21085
21086 {
21087 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021088 .name = "W29GL064CT",
21089 .bustype = BUS_PARALLEL,
21090 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
21091 .model_id = WINBOND_W29GL064CT,
21092 .total_size = 8192,
21093 .page_size = 128 * 1024, /* actual page size is 16 */
21094 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
21095 .tested = TEST_UNTESTED,
21096 .probe = probe_jedec_29gl,
21097 .probe_timing = TIMING_ZERO,
21098 .block_erasers =
21099 {
21100 {
21101 .eraseblocks = {
21102 {64 * 1024, 127},
21103 {8 * 1024, 8},
21104 },
21105 .block_erase = erase_sector_jedec,
21106 }, {
21107 .eraseblocks = { {8 * 1024 * 1024, 1} },
21108 .block_erase = erase_chip_block_jedec,
21109 },
21110 },
21111 .write = write_jedec_1,
21112 .read = read_memmapped,
21113 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021114 .prepare_access = prepare_memory_access,
21115 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021116 },
21117
21118 {
21119 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021120 .name = "W29GL128C",
21121 .bustype = BUS_PARALLEL,
21122 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
21123 .model_id = WINBOND_W29GL128CHL,
21124 .total_size = 16384,
21125 .page_size = 128 * 1024, /* actual page size is 16 */
21126 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
21127 .tested = TEST_UNTESTED,
21128 .probe = probe_jedec_29gl,
21129 .probe_timing = TIMING_ZERO,
21130 .block_erasers =
21131 {
21132 {
21133 .eraseblocks = { {128 * 1024, 128} },
21134 .block_erase = erase_sector_jedec,
21135 }, {
21136 .eraseblocks = { {16 * 1024 * 1024, 1} },
21137 .block_erase = erase_chip_block_jedec,
21138 },
21139 },
21140 .write = write_jedec_1,
21141 .read = read_memmapped,
21142 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021143 .prepare_access = prepare_memory_access,
21144 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000021145 },
21146
21147 {
21148 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000021149 .name = "W39F010",
21150 .bustype = BUS_PARALLEL,
21151 .manufacture_id = WINBOND_ID,
21152 .model_id = WINBOND_W39F010,
21153 .total_size = 128,
21154 .page_size = 4 * 1024,
21155 .feature_bits = FEATURE_EITHER_RESET,
21156 .tested = TEST_OK_PREW,
21157 .probe = probe_jedec,
21158 .probe_timing = 10,
21159 .block_erasers =
21160 {
21161 {
21162 .eraseblocks = { {4 * 1024, 32} },
21163 .block_erase = erase_block_jedec,
21164 }, {
21165 .eraseblocks = { {128 * 1024, 1} },
21166 .block_erase = erase_chip_block_jedec,
21167 }
21168 },
21169 .printlock = printlock_w39f010,
21170 .write = write_jedec_1,
21171 .read = read_memmapped,
21172 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010021173 .prepare_access = prepare_memory_access,
21174 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000021175 },
21176
21177 {
21178 .vendor = "Winbond",
21179 .name = "W39L010",
21180 .bustype = BUS_PARALLEL,
21181 .manufacture_id = WINBOND_ID,
21182 .model_id = WINBOND_W39L010,
21183 .total_size = 128,
21184 .page_size = 4 * 1024,
21185 .feature_bits = FEATURE_EITHER_RESET,
21186 .tested = TEST_UNTESTED,
21187 .probe = probe_jedec,
21188 .probe_timing = 10,
21189 .block_erasers =
21190 {
21191 {
21192 .eraseblocks = { {4 * 1024, 32} },
21193 .block_erase = erase_block_jedec,
21194 }, {
21195 .eraseblocks = { {128 * 1024, 1} },
21196 .block_erase = erase_chip_block_jedec,
21197 }
21198 },
21199 .printlock = printlock_w39l010,
21200 .write = write_jedec_1,
21201 .read = read_memmapped,
21202 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021203 .prepare_access = prepare_memory_access,
21204 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000021205 },
21206
21207 {
21208 .vendor = "Winbond",
21209 .name = "W39L020",
21210 .bustype = BUS_PARALLEL,
21211 .manufacture_id = WINBOND_ID,
21212 .model_id = WINBOND_W39L020,
21213 .total_size = 256,
21214 .page_size = 4 * 1024,
21215 .feature_bits = FEATURE_EITHER_RESET,
21216 .tested = TEST_UNTESTED,
21217 .probe = probe_jedec,
21218 .probe_timing = 10,
21219 .block_erasers =
21220 {
21221 {
21222 .eraseblocks = { {4 * 1024, 64} },
21223 .block_erase = erase_block_jedec,
21224 }, {
21225 .eraseblocks = { {64 * 1024, 4} },
21226 .block_erase = erase_sector_jedec,
21227 }, {
21228 .eraseblocks = { {256 * 1024, 1} },
21229 .block_erase = erase_chip_block_jedec,
21230 }
21231 },
21232 .printlock = printlock_w39l020,
21233 .write = write_jedec_1,
21234 .read = read_memmapped,
21235 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021236 .prepare_access = prepare_memory_access,
21237 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000021238 },
21239
21240 {
21241 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000021242 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021243 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000021244 .manufacture_id = WINBOND_ID,
21245 .model_id = WINBOND_W39L040,
21246 .total_size = 512,
21247 .page_size = 64 * 1024,
21248 .feature_bits = FEATURE_EITHER_RESET,
21249 .tested = TEST_OK_PR,
21250 .probe = probe_jedec,
21251 .probe_timing = 10,
21252 .block_erasers =
21253 {
21254 {
21255 .eraseblocks = { {4 * 1024, 128} },
21256 .block_erase = erase_block_jedec,
21257 }, {
21258 .eraseblocks = { {64 * 1024, 8} },
21259 .block_erase = erase_sector_jedec,
21260 }, {
21261 .eraseblocks = { {512 * 1024, 1} },
21262 .block_erase = erase_chip_block_jedec,
21263 }
21264 },
21265 .printlock = printlock_w39l040,
21266 .write = write_jedec_1,
21267 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000021268 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021269 .prepare_access = prepare_memory_access,
21270 .finish_access = finish_memory_access,
Michael Karcher19e0aac2011-03-06 17:58:05 +000021271 },
21272
21273 {
21274 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021275 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021276 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021277 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021278 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021279 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000021280 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000021281 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000021282 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021283 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000021284 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021285 .block_erasers =
21286 {
21287 {
21288 .eraseblocks = { {64 * 1024, 8} },
21289 .block_erase = erase_sector_jedec,
21290 }, {
21291 .eraseblocks = { {512 * 1024, 1} },
21292 .block_erase = erase_chip_block_jedec,
21293 }
21294 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021295 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000021296 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021297 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021298 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021299 .prepare_access = prepare_memory_access,
21300 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021301 },
21302
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021303 {
21304 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021305 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021306 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021307 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021308 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021309 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000021310 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000021311 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000021312 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021313 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000021314 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021315 .block_erasers =
21316 {
21317 {
21318 .eraseblocks = { {64 * 1024, 8} },
21319 .block_erase = erase_sector_jedec,
21320 }, {
21321 .eraseblocks = { {512 * 1024, 1} },
21322 .block_erase = erase_chip_block_jedec,
21323 }
21324 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021325 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000021326 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021327 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021328 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021329 .prepare_access = prepare_memory_access,
21330 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021331 },
21332
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021333 {
21334 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021335 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021336 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021337 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021338 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021339 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000021340 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000021341 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000021342 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000021343 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021344 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021345 .block_erasers =
21346 {
21347 {
21348 .eraseblocks = { {64 * 1024, 8} },
21349 .block_erase = erase_sector_jedec,
21350 }, {
21351 .eraseblocks = { {512 * 1024, 1} },
21352 .block_erase = erase_chip_block_jedec,
21353 }
21354 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000021355 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000021356 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021357 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021358 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021359 .prepare_access = prepare_memory_access,
21360 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021361 },
21362
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021363 {
21364 .vendor = "Winbond",
21365 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021366 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021367 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021368 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021369 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000021370 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021371 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000021372 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021373 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000021374 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021375 .block_erasers =
21376 {
21377 {
21378 .eraseblocks = { {4 * 1024, 128} },
21379 .block_erase = erase_block_jedec,
21380 }, {
21381 .eraseblocks = { {64 * 1024, 8} },
21382 .block_erase = erase_sector_jedec,
21383 }, {
21384 .eraseblocks = { {512 * 1024, 1} },
21385 .block_erase = erase_chip_block_jedec,
21386 }
21387 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021388 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000021389 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000021390 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021392 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010021393 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021394 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021395 },
21396
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021397 {
21398 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021399 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021400 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021401 .manufacture_id = WINBOND_ID,
21402 .model_id = WINBOND_W39V040B,
21403 .total_size = 512,
21404 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021405 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000021406 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021407 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000021408 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021409 .block_erasers =
21410 {
21411 {
21412 .eraseblocks = { {64 * 1024, 8} },
21413 .block_erase = erase_sector_jedec,
21414 }, {
21415 .eraseblocks = { {512 * 1024, 1} },
21416 .block_erase = erase_chip_block_jedec,
21417 }
21418 },
21419 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000021420 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021421 .write = write_jedec_1,
21422 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000021423 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021424 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021425 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021426 },
21427
21428 {
21429 .vendor = "Winbond",
21430 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021431 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021432 .manufacture_id = WINBOND_ID,
21433 .model_id = WINBOND_W39V040C,
21434 .total_size = 512,
21435 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021436 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000021437 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021438 .probe = probe_jedec,
21439 .probe_timing = 10,
21440 .block_erasers =
21441 {
21442 {
21443 .eraseblocks = { {64 * 1024, 8} },
21444 .block_erase = erase_sector_jedec,
21445 }, {
21446 .eraseblocks = { {512 * 1024, 1} },
21447 .block_erase = erase_chip_block_jedec,
21448 }
21449 },
21450 .printlock = printlock_w39v040fc,
21451 .write = write_jedec_1,
21452 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000021453 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021454 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021455 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021456 },
21457
21458 {
21459 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021460 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021461 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021462 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021463 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021464 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000021465 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000021466 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000021467 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021468 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000021469 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021470 .block_erasers =
21471 {
21472 {
21473 .eraseblocks = { {64 * 1024, 16} },
21474 .block_erase = erase_sector_jedec,
21475 }, {
21476 .eraseblocks = { {1024 * 1024, 1} },
21477 .block_erase = erase_chip_block_jedec,
21478 }
21479 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000021480 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000021481 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021482 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021483 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021484 .prepare_access = prepare_memory_access,
21485 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021486 },
21487
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021488 {
21489 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100021490 .name = "W39V080FA",
21491 .bustype = BUS_FWH,
21492 .manufacture_id = WINBOND_ID,
21493 .model_id = WINBOND_W39V080FA,
21494 .total_size = 1024,
21495 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021496 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021497 .tested = TEST_OK_PREW,
21498 .probe = probe_jedec,
21499 .probe_timing = 10,
21500 .block_erasers =
21501 {
21502 {
21503 .eraseblocks = { {64 * 1024, 16} },
21504 .block_erase = erase_sector_jedec,
21505 }, {
21506 .eraseblocks = { {1024 * 1024, 1} },
21507 .block_erase = erase_chip_block_jedec,
21508 }
21509 },
21510 .printlock = printlock_w39v080fa,
21511 .unlock = unlock_regspace2_uniform_64k,
21512 .write = write_jedec_1,
21513 .read = read_memmapped,
21514 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021515 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021516 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021517 },
21518
21519 {
21520 .vendor = "Winbond",
21521 .name = "W39V080FA (dual mode)",
21522 .bustype = BUS_FWH,
21523 .manufacture_id = WINBOND_ID,
21524 .model_id = WINBOND_W39V080FA_DM,
21525 .total_size = 512,
21526 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021527 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021528 .tested = TEST_UNTESTED,
21529 .probe = probe_jedec,
21530 .probe_timing = 10,
21531 .block_erasers =
21532 {
21533 {
21534 .eraseblocks = { {64 * 1024, 8} },
21535 .block_erase = erase_sector_jedec,
21536 }, {
21537 .eraseblocks = { {512 * 1024, 1} },
21538 .block_erase = erase_chip_block_jedec,
21539 }
21540 },
21541 .printlock = printlock_w39v080fa_dual,
21542 .write = write_jedec_1,
21543 .read = read_memmapped,
21544 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021545 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021546 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021547 },
21548
21549 {
21550 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000021551 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021552 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021553 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021554 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021555 .total_size = 256,
21556 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021557 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000021558 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021559 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000021560 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021561 .block_erasers =
21562 {
21563 {
21564 .eraseblocks = {
21565 {128 * 1024, 1},
21566 {96 * 1024, 1},
21567 {8 * 1024, 2},
21568 {16 * 1024, 1},
21569 },
21570 .block_erase = erase_sector_jedec,
21571 }, {
21572 .eraseblocks = { {256 * 1024, 1} },
21573 .block_erase = erase_chip_block_jedec,
21574 }
21575 },
Sean Nelson35727f72010-01-28 23:55:12 +000021576 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021577 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021578 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010021579 .prepare_access = prepare_memory_access,
21580 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021581 },
21582
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021583 {
21584 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021585 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021586 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021587 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021588 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021589 .total_size = 256,
21590 .page_size = 128,
21591 .feature_bits = FEATURE_EITHER_RESET,
21592 .tested = TEST_OK_PROBE,
21593 .probe = probe_jedec,
21594 .probe_timing = 10,
21595 .block_erasers =
21596 {
21597 {
21598 .eraseblocks = { {256 * 1024, 1} },
21599 .block_erase = erase_chip_block_jedec,
21600 }
21601 },
21602 .write = write_jedec_1,
21603 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021604 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010021605 .prepare_access = prepare_memory_access,
21606 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021607 },
21608
21609 {
21610 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021611 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021612 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021613 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021614 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021615 .total_size = 256,
21616 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021617 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000021618 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021619 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000021620 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021621 .block_erasers =
21622 {
21623 {
21624 .eraseblocks = {
21625 {64 * 1024, 3},
21626 {32 * 1024, 1},
21627 {8 * 1024, 2},
21628 {16 * 1024, 1},
21629 },
21630 .block_erase = erase_sector_jedec,
21631 }, {
21632 .eraseblocks = { {256 * 1024, 1} },
21633 .block_erase = erase_chip_block_jedec,
21634 }
21635 },
Sean Nelson35727f72010-01-28 23:55:12 +000021636 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021637 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021638 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021639 .prepare_access = prepare_memory_access,
21640 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021641 },
21642
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021643 {
21644 .vendor = "Winbond",
21645 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021646 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021647 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021648 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021649 .total_size = 256,
21650 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021651 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000021652 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021653 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000021654 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021655 .block_erasers =
21656 {
21657 {
21658 .eraseblocks = {
21659 {64 * 1024, 3},
21660 {32 * 1024, 1},
21661 {8 * 1024, 2},
21662 {16 * 1024, 1},
21663 },
21664 .block_erase = erase_sector_jedec,
21665 }, {
21666 .eraseblocks = { {256 * 1024, 1} },
21667 .block_erase = erase_chip_block_jedec,
21668 }
21669 },
Sean Nelson35727f72010-01-28 23:55:12 +000021670 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021671 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021672 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021673 .prepare_access = prepare_memory_access,
21674 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021675 },
21676
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021677 {
luke heef884232020-12-28 18:22:21 +080021678 .vendor = "XMC",
21679 .name = "XM25QH128C",
21680 .bustype = BUS_SPI,
21681 .manufacture_id = ST_ID,
21682 .model_id = XMC_XM25QH128C,
21683 .total_size = 16384,
21684 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010021685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
21686 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021687 .tested = TEST_UNTESTED,
21688 .probe = probe_spi_rdid,
21689 .probe_timing = TIMING_ZERO,
21690 .block_erasers =
21691 {
21692 {
21693 .eraseblocks = { {4 * 1024, 4096} },
21694 .block_erase = spi_block_erase_20,
21695 }, {
21696 .eraseblocks = { {32 * 1024, 512} },
21697 .block_erase = spi_block_erase_52,
21698 }, {
21699 .eraseblocks = { {64 * 1024, 256} },
21700 .block_erase = spi_block_erase_d8,
21701 }, {
21702 .eraseblocks = { {16 * 1024 * 1024, 1} },
21703 .block_erase = spi_block_erase_60,
21704 }, {
21705 .eraseblocks = { {16 * 1024 * 1024, 1} },
21706 .block_erase = spi_block_erase_c7,
21707 }
21708 },
21709 .printlock = spi_prettyprint_status_register_plain,
21710 .unlock = spi_disable_blockprotect,
21711 .write = spi_chip_write_256,
21712 .read = spi_chip_read,
21713 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021714 .reg_bits =
21715 {
Nico Huber96786d02024-01-06 18:30:15 +010021716 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021717 .srp = {STATUS1, 7, RW},
21718 .srl = {STATUS2, 0, RW},
21719 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
21720 .tb = {STATUS1, 5, RW},
21721 .sec = {STATUS1, 6, RW},
21722 .cmp = {STATUS2, 6, RW},
21723 },
Nico Huberaabb3e02023-01-13 00:22:30 +010021724 .wp_write_cfg = spi_wp_write_cfg,
21725 .wp_read_cfg = spi_wp_read_cfg,
21726 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021727 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020021728 .prepare_access = spi_prepare_io,
21729 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021730 },
21731
21732 {
21733 .vendor = "XMC",
21734 .name = "XM25QH256C",
21735 .bustype = BUS_SPI,
21736 .manufacture_id = ST_ID,
21737 .model_id = XMC_XM25QH256C,
21738 .total_size = 32768,
21739 .page_size = 256,
21740 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021741 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21742 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21743 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021744 .tested = TEST_UNTESTED,
21745 .probe = probe_spi_rdid,
21746 .probe_timing = TIMING_ZERO,
21747 .block_erasers =
21748 {
21749 {
21750 .eraseblocks = { {4 * 1024, 8192} },
21751 .block_erase = spi_block_erase_21,
21752 }, {
21753 .eraseblocks = { {4 * 1024, 8192} },
21754 .block_erase = spi_block_erase_20,
21755 }, {
21756 .eraseblocks = { {32 * 1024, 1024} },
21757 .block_erase = spi_block_erase_52,
21758 }, {
21759 .eraseblocks = { {64 * 1024, 512} },
21760 .block_erase = spi_block_erase_dc,
21761 }, {
21762 .eraseblocks = { {64 * 1024, 512} },
21763 .block_erase = spi_block_erase_d8,
21764 }, {
21765 .eraseblocks = { {32 * 1024 * 1024, 1} },
21766 .block_erase = spi_block_erase_60,
21767 }, {
21768 .eraseblocks = { {32 * 1024 * 1024, 1} },
21769 .block_erase = spi_block_erase_c7,
21770 }
21771 },
21772 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21773 .unlock = spi_disable_blockprotect,
21774 .write = spi_chip_write_256,
21775 .read = spi_chip_read,
21776 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021777 .reg_bits =
21778 {
Nico Huber96786d02024-01-06 18:30:15 +010021779 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021780 .srp = {STATUS1, 7, RW},
21781 .srl = {STATUS2, 0, RW},
21782 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
21783 .tb = {STATUS1, 6, RW},
21784 },
Nico Huberaabb3e02023-01-13 00:22:30 +010021785 .wp_write_cfg = spi_wp_write_cfg,
21786 .wp_read_cfg = spi_wp_read_cfg,
21787 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021788 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020021789 .prepare_access = spi_prepare_io,
21790 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021791 },
21792
21793 {
21794 .vendor = "XMC",
21795 .name = "XM25QH64C",
21796 .bustype = BUS_SPI,
21797 .manufacture_id = ST_ID,
21798 .model_id = XMC_XM25QH64C,
21799 .total_size = 8192,
21800 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021802 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021803 .tested = TEST_UNTESTED,
21804 .probe = probe_spi_rdid,
21805 .probe_timing = TIMING_ZERO,
21806 .block_erasers =
21807 {
21808 {
21809 .eraseblocks = { {4 * 1024, 2048} },
21810 .block_erase = spi_block_erase_20,
21811 }, {
21812 .eraseblocks = { {32 * 1024, 256} },
21813 .block_erase = spi_block_erase_52,
21814 }, {
21815 .eraseblocks = { {64 * 1024, 128} },
21816 .block_erase = spi_block_erase_d8,
21817 }, {
21818 .eraseblocks = { {8 * 1024 * 1024, 1} },
21819 .block_erase = spi_block_erase_60,
21820 }, {
21821 .eraseblocks = { {8 * 1024 * 1024, 1} },
21822 .block_erase = spi_block_erase_c7,
21823 }
21824 },
Nico Huber96786d02024-01-06 18:30:15 +010021825 .reg_bits =
21826 {
21827 .qe = {STATUS2, 1, RW},
21828 },
luke heef884232020-12-28 18:22:21 +080021829 .printlock = spi_prettyprint_status_register_plain,
21830 .unlock = spi_disable_blockprotect,
21831 .write = spi_chip_write_256,
21832 .read = spi_chip_read,
21833 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020021834 .prepare_access = spi_prepare_io,
21835 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021836 },
21837
21838 {
21839 .vendor = "XMC",
21840 .name = "XM25QU128C",
21841 .bustype = BUS_SPI,
21842 .manufacture_id = ST_ID,
21843 .model_id = XMC_XM25QU128C,
21844 .total_size = 16384,
21845 .page_size = 256,
21846 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021847 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021848 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021849 .tested = TEST_UNTESTED,
21850 .probe = probe_spi_rdid,
21851 .probe_timing = TIMING_ZERO,
21852 .block_erasers =
21853 {
21854 {
21855 .eraseblocks = { {4 * 1024, 4096} },
21856 .block_erase = spi_block_erase_20,
21857 }, {
21858 .eraseblocks = { {32 * 1024, 512} },
21859 .block_erase = spi_block_erase_52,
21860 }, {
21861 .eraseblocks = { {64 * 1024, 256} },
21862 .block_erase = spi_block_erase_d8,
21863 }, {
21864 .eraseblocks = { {16 * 1024 * 1024, 1} },
21865 .block_erase = spi_block_erase_60,
21866 }, {
21867 .eraseblocks = { {16 * 1024 * 1024, 1} },
21868 .block_erase = spi_block_erase_c7,
21869 }
21870 },
Nico Huber96786d02024-01-06 18:30:15 +010021871 .reg_bits =
21872 {
21873 .qe = {STATUS2, 1, RW},
21874 },
luke heef884232020-12-28 18:22:21 +080021875 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21876 .unlock = spi_disable_blockprotect,
21877 .write = spi_chip_write_256,
21878 .read = spi_chip_read,
21879 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021880 .prepare_access = spi_prepare_io,
21881 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021882 },
21883
21884 {
21885 .vendor = "XMC",
21886 .name = "XM25QU256C",
21887 .bustype = BUS_SPI,
21888 .manufacture_id = ST_ID,
21889 .model_id = XMC_XM25QU256C,
21890 .total_size = 32768,
21891 .page_size = 256,
21892 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021893 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21894 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21895 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021896 .tested = TEST_UNTESTED,
21897 .probe = probe_spi_rdid,
21898 .probe_timing = TIMING_ZERO,
21899 .block_erasers =
21900 {
21901 {
21902 .eraseblocks = { {4 * 1024, 8192} },
21903 .block_erase = spi_block_erase_21,
21904 }, {
21905 .eraseblocks = { {4 * 1024, 8192} },
21906 .block_erase = spi_block_erase_20,
21907 }, {
21908 .eraseblocks = { {32 * 1024, 1024} },
21909 .block_erase = spi_block_erase_52,
21910 }, {
21911 .eraseblocks = { {64 * 1024, 512} },
21912 .block_erase = spi_block_erase_dc,
21913 }, {
21914 .eraseblocks = { {64 * 1024, 512} },
21915 .block_erase = spi_block_erase_d8,
21916 }, {
21917 .eraseblocks = { {32 * 1024 * 1024, 1} },
21918 .block_erase = spi_block_erase_60,
21919 }, {
21920 .eraseblocks = { {32 * 1024 * 1024, 1} },
21921 .block_erase = spi_block_erase_c7,
21922 }
21923 },
Nico Huber96786d02024-01-06 18:30:15 +010021924 .reg_bits =
21925 {
21926 .qe = {STATUS2, 1, RW},
21927 },
luke heef884232020-12-28 18:22:21 +080021928 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21929 .unlock = spi_disable_blockprotect,
21930 .write = spi_chip_write_256,
21931 .read = spi_chip_read,
21932 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021933 .prepare_access = spi_prepare_io,
21934 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021935 },
21936
21937 {
21938 .vendor = "XMC",
21939 .name = "XM25QU64C",
21940 .bustype = BUS_SPI,
21941 .manufacture_id = ST_ID,
21942 .model_id = XMC_XM25QU64C,
21943 .total_size = 8192,
21944 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021946 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021947 .tested = TEST_UNTESTED,
21948 .probe = probe_spi_rdid,
21949 .probe_timing = TIMING_ZERO,
21950 .block_erasers =
21951 {
21952 {
21953 .eraseblocks = { {4 * 1024, 2048} },
21954 .block_erase = spi_block_erase_20,
21955 }, {
21956 .eraseblocks = { {32 * 1024, 256} },
21957 .block_erase = spi_block_erase_52,
21958 }, {
21959 .eraseblocks = { {64 * 1024, 128} },
21960 .block_erase = spi_block_erase_d8,
21961 }, {
21962 .eraseblocks = { {8 * 1024 * 1024, 1} },
21963 .block_erase = spi_block_erase_60,
21964 }, {
21965 .eraseblocks = { {8 * 1024 * 1024, 1} },
21966 .block_erase = spi_block_erase_c7,
21967 }
21968 },
Nico Huber96786d02024-01-06 18:30:15 +010021969 .reg_bits =
21970 {
21971 .qe = {STATUS2, 1, RW},
21972 },
luke heef884232020-12-28 18:22:21 +080021973 .printlock = spi_prettyprint_status_register_plain,
21974 .unlock = spi_disable_blockprotect,
21975 .write = spi_chip_write_256,
21976 .read = spi_chip_read,
21977 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021978 .prepare_access = spi_prepare_io,
21979 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021980 },
21981
21982 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100021983 .vendor = "Zetta Device",
21984 .name = "ZD25D20",
21985 .bustype = BUS_SPI,
21986 .manufacture_id = ZETTADEVICE_ID,
21987 .model_id = ZETTADEVICE_ZD25D20,
21988 .total_size = 256,
21989 .page_size = 256,
21990 .feature_bits = FEATURE_WRSR_WREN,
21991 .tested = TEST_UNTESTED,
21992 .probe = probe_spi_rdid,
21993 .probe_timing = TIMING_ZERO,
21994 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080021995 {
21996 {
21997 .eraseblocks = { {4 * 1024, 64} },
21998 .block_erase = spi_block_erase_20,
21999 }, {
22000 .eraseblocks = { {32 * 1024, 8} },
22001 .block_erase = spi_block_erase_52,
22002 }, {
22003 .eraseblocks = { {64 * 1024, 4} },
22004 .block_erase = spi_block_erase_d8,
22005 }, {
22006 .eraseblocks = { {256 * 1024, 1} },
22007 .block_erase = spi_block_erase_60,
22008 }, {
22009 .eraseblocks = { {256 * 1024, 1} },
22010 .block_erase = spi_block_erase_c7,
22011 }
22012 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100022013 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
22014 .unlock = spi_disable_blockprotect,
22015 .write = spi_chip_write_256,
22016 .read = spi_chip_read,
22017 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080022018 },
22019
22020 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100022021 .vendor = "Zetta Device",
22022 .name = "ZD25D40",
22023 .bustype = BUS_SPI,
22024 .manufacture_id = ZETTADEVICE_ID,
22025 .model_id = ZETTADEVICE_ZD25D40,
22026 .total_size = 512,
22027 .page_size = 256,
22028 .feature_bits = FEATURE_WRSR_WREN,
22029 .tested = TEST_UNTESTED,
22030 .probe = probe_spi_rdid,
22031 .probe_timing = TIMING_ZERO,
22032 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080022033 {
22034 {
22035 .eraseblocks = { {4 * 1024, 128} },
22036 .block_erase = spi_block_erase_20,
22037 }, {
22038 .eraseblocks = { {32 * 1024, 16} },
22039 .block_erase = spi_block_erase_52,
22040 }, {
22041 .eraseblocks = { {64 * 1024, 8} },
22042 .block_erase = spi_block_erase_d8,
22043 }, {
22044 .eraseblocks = { {512 * 1024, 1} },
22045 .block_erase = spi_block_erase_60,
22046 }, {
22047 .eraseblocks = { {512 * 1024, 1} },
22048 .block_erase = spi_block_erase_c7,
22049 }
22050 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100022051 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
22052 .unlock = spi_disable_blockprotect,
22053 .write = spi_chip_write_256,
22054 .read = spi_chip_read,
22055 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080022056 },
22057
Stefan Taunerac1b4c82012-02-17 14:51:04 +000022058 {
Nico Huber34e3de62024-10-20 13:00:12 +020022059 .vendor = "Zetta Device",
22060 .name = "ZD25LQ64",
22061 .bustype = BUS_SPI,
22062 .manufacture_id = ZETTADEVICE_ID,
22063 .model_id = ZETTADEVICE_ZD25LQ64,
22064 .total_size = 8192,
22065 .page_size = 256,
22066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR_EXT2 |
22067 FEATURE_OTP | FEATURE_QPI_SRP,
22068 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
22069 .tested = TEST_UNTESTED,
22070 .probe = probe_spi_rdid,
22071 .probe_timing = TIMING_ZERO,
22072 .block_erasers =
22073 {
22074 {
22075 .eraseblocks = { {4 * 1024, 2048} },
22076 .block_erase = spi_block_erase_20,
22077 }, {
22078 .eraseblocks = { {32 * 1024, 256} },
22079 .block_erase = spi_block_erase_52,
22080 }, {
22081 .eraseblocks = { {64 * 1024, 128} },
22082 .block_erase = spi_block_erase_d8,
22083 }, {
22084 .eraseblocks = { {8192 * 1024, 1} },
22085 .block_erase = spi_block_erase_60,
22086 }, {
22087 .eraseblocks = { {8192 * 1024, 1} },
22088 .block_erase = spi_block_erase_c7,
22089 },
22090 },
22091 .reg_bits =
22092 {
22093 .qe = {STATUS2, 1, RW},
22094 .srp = {STATUS1, 7, RW},
22095 .srl = {STATUS2, 0, RW},
22096 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
22097 .tb = {STATUS1, 5, RW},
22098 .sec = {STATUS1, 6, RW},
22099 .cmp = {STATUS2, 6, RW},
22100 },
22101 .wp_write_cfg = spi_wp_write_cfg,
22102 .wp_read_cfg = spi_wp_read_cfg,
22103 .wp_get_ranges = spi_wp_get_available_ranges,
22104 .decode_range = decode_range_spi25,
22105 .printlock = spi_prettyprint_status_register_bp2_srwd,
22106 .unlock = spi_disable_blockprotect_bp2_srwd,
22107 .write = spi_chip_write_256,
22108 .read = spi_chip_read,
22109 .voltage = {1650, 1950},
22110 .prepare_access = spi_prepare_io,
22111 .finish_access = spi_finish_io,
22112 },
22113
22114 {
22115 .vendor = "Zetta Device",
22116 .name = "ZD25LQ128",
22117 .bustype = BUS_SPI,
22118 .manufacture_id = ZETTADEVICE_ID,
22119 .model_id = ZETTADEVICE_ZD25LQ128,
22120 .total_size = 16384,
22121 .page_size = 256,
22122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR_EXT2 |
22123 FEATURE_OTP | FEATURE_QPI_SRP,
22124 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
22125 .tested = TEST_UNTESTED,
22126 .probe = probe_spi_rdid,
22127 .probe_timing = TIMING_ZERO,
22128 .block_erasers =
22129 {
22130 {
22131 .eraseblocks = { {4 * 1024, 4096} },
22132 .block_erase = spi_block_erase_20,
22133 }, {
22134 .eraseblocks = { {32 * 1024, 512} },
22135 .block_erase = spi_block_erase_52,
22136 }, {
22137 .eraseblocks = { {64 * 1024, 256} },
22138 .block_erase = spi_block_erase_d8,
22139 }, {
22140 .eraseblocks = { {16384 * 1024, 1} },
22141 .block_erase = spi_block_erase_60,
22142 }, {
22143 .eraseblocks = { {16384 * 1024, 1} },
22144 .block_erase = spi_block_erase_c7,
22145 },
22146 },
22147 .reg_bits =
22148 {
22149 .qe = {STATUS2, 1, RW},
22150 .srp = {STATUS1, 7, RW},
22151 .srl = {STATUS2, 0, RW},
22152 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
22153 .tb = {STATUS1, 5, RW},
22154 .sec = {STATUS1, 6, RW},
22155 .cmp = {STATUS2, 6, RW},
22156 },
22157 .wp_write_cfg = spi_wp_write_cfg,
22158 .wp_read_cfg = spi_wp_read_cfg,
22159 .wp_get_ranges = spi_wp_get_available_ranges,
22160 .decode_range = decode_range_spi25,
22161 .printlock = spi_prettyprint_status_register_bp2_srwd,
22162 .unlock = spi_disable_blockprotect_bp2_srwd,
22163 .write = spi_chip_write_256,
22164 .read = spi_chip_read,
22165 .voltage = {1650, 1950},
22166 .prepare_access = spi_prepare_io,
22167 .finish_access = spi_finish_io,
22168 },
22169
22170 {
Alan Greendd592202019-08-23 10:11:37 +100022171 .vendor = "Unknown",
22172 .name = "SFDP-capable chip",
22173 .bustype = BUS_SPI,
22174 .manufacture_id = GENERIC_MANUF_ID,
22175 .model_id = SFDP_DEVICE_ID,
22176 .total_size = 0, /* set by probing function */
22177 .page_size = 0, /* set by probing function */
22178 .feature_bits = 0, /* set by probing function */
22179 /* We present our own "report this" text hence we do not */
22180 /* want the default "This flash part has status UNTESTED..." */
22181 /* text to be printed. */
22182 .tested = TEST_OK_PREW,
22183 .probe = probe_spi_sfdp,
22184 .block_erasers = {}, /* set by probing function */
22185 .unlock = spi_disable_blockprotect, /* is this safe? */
22186 .write = NULL, /* set by probing function */
22187 .read = spi_chip_read,
22188 /* FIXME: some vendor extensions define this */
22189 .voltage = {0},
22190 },
22191
22192 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000022193 .vendor = "Programmer",
22194 .name = "Opaque flash chip",
22195 .bustype = BUS_PROG,
22196 .manufacture_id = PROGMANUF_ID,
22197 .model_id = PROGDEV_ID,
22198 .total_size = 0,
22199 .page_size = 256,
22200 /* probe is assumed to work, rest will be filled in by probe */
22201 .tested = TEST_OK_PROBE,
22202 .probe = probe_opaque,
22203 /* eraseblock sizes will be set by the probing function */
22204 .block_erasers =
22205 {
22206 {
22207 .block_erase = erase_opaque,
22208 }
22209 },
22210 .write = write_opaque,
22211 .read = read_opaque,
22212 },
22213
22214 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000022215 .vendor = "AMIC",
22216 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022217 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000022218 .manufacture_id = AMIC_ID,
22219 .model_id = GENERIC_DEVICE_ID,
22220 .total_size = 0,
22221 .page_size = 256,
22222 .tested = TEST_BAD_PREW,
22223 .probe = probe_spi_rdid4,
22224 .probe_timing = TIMING_ZERO,
22225 .write = NULL,
22226 .read = NULL,
22227 },
22228
22229 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022230 .vendor = "Atmel",
22231 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022232 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022233 .manufacture_id = ATMEL_ID,
22234 .model_id = GENERIC_DEVICE_ID,
22235 .total_size = 0,
22236 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022237 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022238 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022239 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022240 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022241 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022242 },
22243
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022244 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000022245 .vendor = "Eon",
22246 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022247 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022248 .manufacture_id = EON_ID_NOPREFIX,
22249 .model_id = GENERIC_DEVICE_ID,
22250 .total_size = 0,
22251 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022252 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022253 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022254 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022255 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022256 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022257 },
22258
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022259 {
22260 .vendor = "Macronix",
22261 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022262 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000022263 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022264 .model_id = GENERIC_DEVICE_ID,
22265 .total_size = 0,
22266 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022267 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022268 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022269 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022270 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022271 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022272 },
22273
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022274 {
22275 .vendor = "PMC",
22276 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022277 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022278 .manufacture_id = PMC_ID,
22279 .model_id = GENERIC_DEVICE_ID,
22280 .total_size = 0,
22281 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022282 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022283 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022284 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022285 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022286 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022287 },
22288
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022289 {
22290 .vendor = "SST",
22291 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022292 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022293 .manufacture_id = SST_ID,
22294 .model_id = GENERIC_DEVICE_ID,
22295 .total_size = 0,
22296 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022297 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022298 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022299 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022300 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022301 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022302 },
22303
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022304 {
22305 .vendor = "ST",
22306 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022307 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022308 .manufacture_id = ST_ID,
22309 .model_id = GENERIC_DEVICE_ID,
22310 .total_size = 0,
22311 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000022312 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022313 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000022314 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000022315 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000022316 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000022317 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000022318
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022319 {
Sean Nelson118e1d62009-11-24 02:08:11 +000022320 .vendor = "Sanyo",
22321 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022322 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000022323 .manufacture_id = SANYO_ID,
22324 .model_id = GENERIC_DEVICE_ID,
22325 .total_size = 0,
22326 .page_size = 256,
22327 .tested = TEST_BAD_PREW,
22328 .probe = probe_spi_rdid,
22329 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000022330 .write = NULL,
22331 .read = NULL,
22332 },
22333
22334 {
Stefan Taunereb582572012-09-21 12:52:50 +000022335 .vendor = "Winbond",
22336 .name = "unknown Winbond (ex Nexcom) SPI chip",
22337 .bustype = BUS_SPI,
22338 .manufacture_id = WINBOND_NEX_ID,
22339 .model_id = GENERIC_DEVICE_ID,
22340 .total_size = 0,
22341 .page_size = 256,
22342 .tested = TEST_BAD_PREW,
22343 .probe = probe_spi_rdid,
22344 .probe_timing = TIMING_ZERO,
22345 .write = NULL,
22346 .read = NULL,
22347 },
22348
22349 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022350 .vendor = "Generic",
22351 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022352 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022353 .manufacture_id = GENERIC_MANUF_ID,
22354 .model_id = GENERIC_DEVICE_ID,
22355 .total_size = 0,
22356 .page_size = 256,
22357 .tested = TEST_BAD_PREW,
22358 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022359 .write = NULL,
22360 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000022361
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022362 {
22363 .vendor = "Generic",
22364 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000022365 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022366 .manufacture_id = GENERIC_MANUF_ID,
22367 .model_id = GENERIC_DEVICE_ID,
22368 .total_size = 0,
22369 .page_size = 256,
22370 .tested = TEST_BAD_PREW,
22371 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000022372 .write = NULL,
22373 },
22374
Stefan Tauner96658be2014-05-26 22:05:31 +000022375 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000022376};
Stefan Tauner96658be2014-05-26 22:05:31 +000022377
22378const unsigned int flashchips_size = ARRAY_SIZE(flashchips);