blob: 11dc2cf91dd6b91cbb5e1534b5fce52cb78d5c0c [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",
Christian Kudera475a7ee2021-04-20 22:50:01 +02003547 .name = "B.25D16A",
3548 .bustype = BUS_SPI,
3549 .manufacture_id = BOYA_BOHONG_ID,
3550 .model_id = BOYA_BOHONG_B_25D16A,
3551 .total_size = 2048,
3552 .page_size = 256,
3553 .feature_bits = FEATURE_WRSR_WREN,
3554 .tested = TEST_OK_PR,
3555 .probe = probe_spi_rdid,
3556 .probe_timing = TIMING_ZERO,
3557 .block_erasers =
3558 {
3559 {
3560 .eraseblocks = { {4 * 1024, 512} },
3561 .block_erase = spi_block_erase_20,
3562 }, {
3563 .eraseblocks = { {32 * 1024, 64} },
3564 .block_erase = spi_block_erase_52,
3565 }, {
3566 .eraseblocks = { {64 * 1024, 32} },
3567 .block_erase = spi_block_erase_d8,
3568 }, {
3569 .eraseblocks = { {2 * 1024 * 1024, 1} },
3570 .block_erase = spi_block_erase_60,
3571 }, {
3572 .eraseblocks = { {2 * 1024 * 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 },
3582
3583 {
3584 .vendor = "Boya/BoHong Microelectronics",
Angel Pons1ebda782021-04-20 21:39:11 +02003585 .name = "B.25Q128AS",
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003586 .bustype = BUS_SPI,
Angel Pons1ebda782021-04-20 21:39:11 +02003587 .manufacture_id = BOYA_BOHONG_ID,
3588 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003589 .total_size = 16384,
3590 .page_size = 256,
Nico Huber226bb872024-04-09 23:30:34 +02003591 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
3592 FEATURE_OTP | FEATURE_QIO,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003593 .tested = TEST_OK_PREW,
3594 .probe = probe_spi_rdid,
3595 .probe_timing = TIMING_ZERO,
3596 .block_erasers =
3597 {
3598 {
3599 .eraseblocks = { {4 * 1024, 4096} },
3600 .block_erase = spi_block_erase_20,
3601 }, {
3602 .eraseblocks = { {32 * 1024, 512} },
3603 .block_erase = spi_block_erase_52,
3604 }, {
3605 .eraseblocks = { {64 * 1024, 256} },
3606 .block_erase = spi_block_erase_d8,
3607 }, {
3608 .eraseblocks = { {16 * 1024 * 1024, 1} },
3609 .block_erase = spi_block_erase_60,
3610 }, {
3611 .eraseblocks = { {16 * 1024 * 1024, 1} },
3612 .block_erase = spi_block_erase_c7,
3613 }
3614 },
Nico Huber226bb872024-04-09 23:30:34 +02003615 .reg_bits =
3616 {
3617 .qe = {STATUS2, 1, RW},
3618 },
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003619 .printlock = spi_prettyprint_status_register_plain,
3620 .unlock = spi_disable_blockprotect_at25fs040,
3621 .write = spi_chip_write_256,
3622 .read = spi_chip_read,
3623 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02003624 .prepare_access = spi_prepare_io,
3625 .finish_access = spi_finish_io,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003626 },
3627
3628 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003629 .vendor = "Bright",
3630 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003631 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003632 .manufacture_id = BRIGHT_ID,
3633 .model_id = BRIGHT_BM29F040,
3634 .total_size = 512,
3635 .page_size = 64 * 1024,
3636 .feature_bits = FEATURE_EITHER_RESET,
3637 .tested = TEST_OK_PR,
3638 .probe = probe_jedec,
3639 .probe_timing = TIMING_ZERO,
3640 .block_erasers =
3641 {
3642 {
3643 .eraseblocks = { {64 * 1024, 8} },
3644 .block_erase = erase_sector_jedec,
3645 }, {
3646 .eraseblocks = { {512 * 1024, 1} },
3647 .block_erase = erase_chip_block_jedec,
3648 },
3649 },
3650 .write = write_jedec_1,
3651 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003652 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003653 .prepare_access = prepare_memory_access,
3654 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00003655 },
3656
3657 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003658 .vendor = "Catalyst",
3659 .name = "CAT28F512",
3660 .bustype = BUS_PARALLEL,
3661 .manufacture_id = CATALYST_ID,
3662 .model_id = CATALYST_CAT28F512,
3663 .total_size = 64,
3664 .page_size = 0, /* unused */
3665 .feature_bits = 0,
Alan Green908adf42019-07-03 15:34:06 +10003666 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
Alan Green1f9cc7d2019-07-01 11:10:45 +10003667 .probe = probe_jedec, /* FIXME! */
3668 .probe_timing = TIMING_ZERO,
3669 .block_erasers =
3670 {
3671 {
3672 .eraseblocks = { {64 * 1024, 1} },
3673 .block_erase = NULL, /* TODO */
3674 },
3675 },
3676 .write = NULL, /* TODO */
3677 .read = read_memmapped,
3678 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003679 .prepare_access = prepare_memory_access,
3680 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003681 },
3682
3683 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003684 .vendor = "ENE",
3685 .name = "KB9012 (EDI)",
3686 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003687 .total_size = 128,
3688 .page_size = 128,
3689 .feature_bits = FEATURE_ERASED_ZERO,
3690 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10003691 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003692 .probe = edi_probe_kb9012,
3693 .probe_timing = TIMING_ZERO,
3694 .block_erasers =
3695 {
3696 {
3697 .eraseblocks = { {128, 1024} },
3698 .block_erase = edi_chip_block_erase,
3699 },
3700 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003701 .write = edi_chip_write,
3702 .read = edi_chip_read,
3703 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003704 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003705 },
3706
3707 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003708 .vendor = "ESI",
3709 .name = "ES25P16",
3710 .bustype = BUS_SPI,
3711 .manufacture_id = EXCEL_ID_NOPREFIX,
3712 .model_id = EXCEL_ES25P16,
3713 .total_size = 2 * 1024,
3714 .page_size = 256,
3715 /* 256-byte parameter page separate from memory array:
3716 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3717 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003718 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003719 .probe = probe_spi_rdid,
3720 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003721 .block_erasers =
3722 {
3723 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003724 .eraseblocks = { {64 * 1024, 32} },
3725 .block_erase = spi_block_erase_d8,
Sean Nelson54596372010-01-09 05:30:14 +00003726 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003727 .eraseblocks = { {2 * 1024 * 1024, 1} },
3728 .block_erase = spi_block_erase_c7,
Sean Nelson54596372010-01-09 05:30:14 +00003729 }
3730 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003731 .printlock = spi_prettyprint_status_register_bp2_srwd,
3732 .unlock = spi_disable_blockprotect_bp2_srwd,
3733 .write = spi_chip_write_256,
3734 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3735 .voltage = {2700, 3600},
3736 },
3737
3738 {
3739 .vendor = "ESI",
3740 .name = "ES25P40",
3741 .bustype = BUS_SPI,
3742 .manufacture_id = EXCEL_ID_NOPREFIX,
3743 .model_id = EXCEL_ES25P40,
3744 .total_size = 512,
3745 .page_size = 256,
3746 /* 256-byte parameter page separate from memory array:
3747 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3748 .feature_bits = FEATURE_WRSR_WREN,
3749 .tested = TEST_UNTESTED,
3750 .probe = probe_spi_rdid,
3751 .probe_timing = TIMING_ZERO,
3752 .block_erasers =
3753 {
3754 {
3755 .eraseblocks = { {64 * 1024, 8} },
3756 .block_erase = spi_block_erase_d8,
3757 }, {
3758 .eraseblocks = { {512 * 1024, 1} },
3759 .block_erase = spi_block_erase_c7,
3760 }
3761 },
3762 .printlock = spi_prettyprint_status_register_bp2_srwd,
3763 .unlock = spi_disable_blockprotect_bp2_srwd,
3764 .write = spi_chip_write_256,
3765 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3766 .voltage = {2700, 3600},
3767 },
3768
3769 {
3770 .vendor = "ESI",
3771 .name = "ES25P80",
3772 .bustype = BUS_SPI,
3773 .manufacture_id = EXCEL_ID_NOPREFIX,
3774 .model_id = EXCEL_ES25P80,
3775 .total_size = 1024,
3776 .page_size = 256,
3777 /* 256-byte parameter page separate from memory array:
3778 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3779 .feature_bits = FEATURE_WRSR_WREN,
3780 .tested = TEST_UNTESTED,
3781 .probe = probe_spi_rdid,
3782 .probe_timing = TIMING_ZERO,
3783 .block_erasers =
3784 {
3785 {
3786 .eraseblocks = { {64 * 1024, 16} },
3787 .block_erase = spi_block_erase_d8,
3788 }, {
3789 .eraseblocks = { {1024 * 1024, 1} },
3790 .block_erase = spi_block_erase_c7,
3791 }
3792 },
3793 .printlock = spi_prettyprint_status_register_bp2_srwd,
3794 .unlock = spi_disable_blockprotect_bp2_srwd,
3795 .write = spi_chip_write_256,
3796 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3797 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00003798 },
3799
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003800 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003801 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003802 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003803 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003804 .manufacture_id = ESMT_ID,
3805 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003806 .total_size = 1024,
3807 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003808 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003809 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003810 .probe = probe_spi_rdid,
3811 .probe_timing = TIMING_ZERO,
3812 .block_erasers =
3813 {
3814 {
3815 .eraseblocks = { {4 * 1024, 256} },
3816 .block_erase = spi_block_erase_20,
3817 }, {
3818 .eraseblocks = { {64 * 1024, 16} },
3819 .block_erase = spi_block_erase_d8,
3820 }, {
3821 .eraseblocks = { {1024 * 1024, 1} },
3822 .block_erase = spi_block_erase_60,
3823 }, {
3824 .eraseblocks = { {1024 * 1024, 1} },
3825 .block_erase = spi_block_erase_c7,
3826 }
3827 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003828 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003829 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003830 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003831 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003832 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003833 },
3834
3835 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003836 .vendor = "ESMT",
3837 .name = "F25L32PA",
3838 .bustype = BUS_SPI,
3839 .manufacture_id = ESMT_ID,
3840 .model_id = ESMT_F25L32PA,
3841 .total_size = 4096,
3842 .page_size = 256,
3843 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3844 .tested = TEST_UNTESTED,
3845 .probe = probe_spi_rdid,
3846 .probe_timing = TIMING_ZERO,
3847 .block_erasers =
3848 {
3849 {
3850 .eraseblocks = { {4 * 1024, 1024} },
3851 .block_erase = spi_block_erase_20,
3852 }, {
3853 .eraseblocks = { {64 * 1024, 64} },
3854 .block_erase = spi_block_erase_d8,
3855 }, {
3856 .eraseblocks = { {4 * 1024 * 1024, 1} },
3857 .block_erase = spi_block_erase_60,
3858 }, {
3859 .eraseblocks = { {4 * 1024 * 1024, 1} },
3860 .block_erase = spi_block_erase_c7,
3861 }
3862 },
3863 .printlock = spi_prettyprint_status_register_bp2_bpl,
3864 .unlock = spi_disable_blockprotect,
3865 .write = spi_chip_write_256,
3866 .read = spi_chip_read,
3867 .voltage = {2700, 3600},
3868 },
3869
3870 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003871 .vendor = "ESMT",
3872 .name = "F49B002UA",
3873 .bustype = BUS_PARALLEL,
3874 .manufacture_id = ESMT_ID,
3875 .model_id = ESMT_F49B002UA,
3876 .total_size = 256,
3877 .page_size = 4096,
3878 .feature_bits = FEATURE_EITHER_RESET,
3879 .tested = TEST_UNTESTED,
3880 .probe = probe_jedec,
3881 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3882 .block_erasers =
3883 {
3884 {
3885 .eraseblocks = {
3886 {128 * 1024, 1},
3887 {96 * 1024, 1},
3888 {8 * 1024, 2},
3889 {16 * 1024, 1},
3890 },
3891 .block_erase = erase_sector_jedec,
3892 }, {
3893 .eraseblocks = { {256 * 1024, 1} },
3894 .block_erase = erase_chip_block_jedec,
3895 }
3896 },
3897 .write = write_jedec_1,
3898 .read = read_memmapped,
3899 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003900 .prepare_access = prepare_memory_access,
3901 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003902 },
3903
3904 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003905 .vendor = "Eon",
3906 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003907 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003908 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003909 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003910 .total_size = 64,
3911 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003912 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003913 .tested = TEST_UNTESTED,
3914 .probe = probe_spi_rdid,
3915 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003916 .block_erasers =
3917 {
3918 {
3919 .eraseblocks = {
3920 {4 * 1024, 2},
3921 {8 * 1024, 1},
3922 {16 * 1024, 1},
3923 {32 * 1024, 1},
3924 },
3925 .block_erase = spi_block_erase_d8,
3926 }, {
3927 .eraseblocks = { {64 * 1024, 1} },
3928 .block_erase = spi_block_erase_c7,
3929 }
3930 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003931 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003932 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003933 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003934 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003935 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003936 },
3937
3938 {
3939 .vendor = "Eon",
3940 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003941 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003942 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003943 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003944 .total_size = 64,
3945 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003946 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003947 .tested = TEST_UNTESTED,
3948 .probe = probe_spi_rdid,
3949 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003950 .block_erasers =
3951 {
3952 {
3953 .eraseblocks = {
3954 {32 * 1024, 1},
3955 {16 * 1024, 1},
3956 {8 * 1024, 1},
3957 {4 * 1024, 2},
3958 },
3959 .block_erase = spi_block_erase_d8,
3960 }, {
3961 .eraseblocks = { {64 * 1024, 1} },
3962 .block_erase = spi_block_erase_c7,
3963 }
3964 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003965 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003966 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003967 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003968 .read = spi_chip_read, /* Fast read (0x0B) supported */
3969 .voltage = {2700, 3600},
3970 },
3971
3972 {
3973 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003974 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003975 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003976 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003977 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003978 .total_size = 128,
3979 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003980 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003981 .tested = TEST_UNTESTED,
3982 .probe = probe_spi_rdid,
3983 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003984 .block_erasers =
3985 {
3986 {
3987 .eraseblocks = {
3988 {4 * 1024, 2},
3989 {8 * 1024, 1},
3990 {16 * 1024, 1},
3991 {32 * 1024, 3},
3992 },
3993 .block_erase = spi_block_erase_d8,
3994 }, {
3995 .eraseblocks = { {128 * 1024, 1} },
3996 .block_erase = spi_block_erase_c7,
3997 }
3998 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003999 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004000 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004001 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004002 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004003 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004004 },
4005
4006 {
4007 .vendor = "Eon",
4008 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004009 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004010 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004011 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00004012 .total_size = 128,
4013 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004014 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004015 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00004016 .probe = probe_spi_rdid,
4017 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004018 .block_erasers =
4019 {
4020 {
4021 .eraseblocks = {
4022 {32 * 1024, 3},
4023 {16 * 1024, 1},
4024 {8 * 1024, 1},
4025 {4 * 1024, 2},
4026 },
4027 .block_erase = spi_block_erase_d8,
4028 }, {
4029 .eraseblocks = { {128 * 1024, 1} },
4030 .block_erase = spi_block_erase_c7,
4031 }
4032 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004033 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004034 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004035 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004036 .read = spi_chip_read, /* Fast read (0x0B) supported */
4037 .voltage = {2700, 3600},
4038 },
4039
4040 {
4041 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004042 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004043 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004044 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004045 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004046 .total_size = 2048,
4047 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004048 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004049 .tested = TEST_UNTESTED,
4050 .probe = probe_spi_rdid,
4051 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004052 .block_erasers =
4053 {
4054 {
4055 .eraseblocks = {
4056 {4 * 1024, 2},
4057 {8 * 1024, 1},
4058 {16 * 1024, 1},
4059 {32 * 1024, 1},
4060 {64 * 1024, 31},
4061 },
4062 .block_erase = spi_block_erase_d8,
4063 }, {
4064 .eraseblocks = { {2 * 1024 * 1024, 1} },
4065 .block_erase = spi_block_erase_c7,
4066 }
4067 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004068 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004069 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004070 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004071 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004072 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004073 },
4074
4075 {
4076 .vendor = "Eon",
4077 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004078 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004079 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004080 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004081 .total_size = 2048,
4082 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004083 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004084 .tested = TEST_UNTESTED,
4085 .probe = probe_spi_rdid,
4086 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004087 .block_erasers =
4088 {
4089 {
4090 .eraseblocks = {
4091 {64 * 1024, 31},
4092 {32 * 1024, 1},
4093 {16 * 1024, 1},
4094 {8 * 1024, 1},
4095 {4 * 1024, 2},
4096 },
4097 .block_erase = spi_block_erase_d8,
4098 }, {
4099 .eraseblocks = { {2 * 1024 * 1024, 1} },
4100 .block_erase = spi_block_erase_c7,
4101 }
4102 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004103 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004104 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004105 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004106 .read = spi_chip_read, /* Fast read (0x0B) supported */
4107 .voltage = {2700, 3600},
4108 },
4109
4110 {
4111 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004112 .name = "EN25B20",
Stefan Taunerb175af52015-01-24 15:06:27 +00004113 .bustype = BUS_SPI,
4114 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004115 .model_id = EON_EN25B20,
4116 .total_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004117 .page_size = 256,
4118 .feature_bits = FEATURE_WRSR_WREN,
4119 .tested = TEST_UNTESTED,
4120 .probe = probe_spi_rdid,
4121 .probe_timing = TIMING_ZERO,
4122 .block_erasers =
4123 {
4124 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004125 .eraseblocks = {
4126 {4 * 1024, 2},
4127 {8 * 1024, 1},
4128 {16 * 1024, 1},
4129 {32 * 1024, 1},
4130 {64 * 1024, 3}
4131 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004132 .block_erase = spi_block_erase_d8,
4133 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004134 .eraseblocks = { {256 * 1024, 1} },
4135 .block_erase = spi_block_erase_c7,
4136 }
4137 },
4138 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4139 .unlock = spi_disable_blockprotect,
4140 .write = spi_chip_write_256,
4141 .read = spi_chip_read, /* Fast read (0x0B) supported */
4142 .voltage = {2700, 3600},
4143 },
4144
4145 {
4146 .vendor = "Eon",
4147 .name = "EN25B20T",
4148 .bustype = BUS_SPI,
4149 .manufacture_id = EON_ID_NOPREFIX,
4150 .model_id = EON_EN25B20,
4151 .total_size = 256,
4152 .page_size = 256,
4153 .feature_bits = FEATURE_WRSR_WREN,
4154 .tested = TEST_UNTESTED,
4155 .probe = probe_spi_rdid,
4156 .probe_timing = TIMING_ZERO,
4157 .block_erasers =
4158 {
4159 {
4160 .eraseblocks = {
4161 {64 * 1024, 3},
4162 {32 * 1024, 1},
4163 {16 * 1024, 1},
4164 {8 * 1024, 1},
4165 {4 * 1024, 2},
4166 },
4167 .block_erase = spi_block_erase_d8,
4168 }, {
4169 .eraseblocks = { {256 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004170 .block_erase = spi_block_erase_c7,
4171 }
4172 },
4173 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4174 .unlock = spi_disable_blockprotect,
4175 .write = spi_chip_write_256,
4176 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004177 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004178 },
4179
4180 {
4181 .vendor = "Eon",
4182 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004183 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004184 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004185 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004186 .total_size = 4096,
4187 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004188 /* OTP: 512B total; enter 0x3A */
4189 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004190 .tested = TEST_UNTESTED,
4191 .probe = probe_spi_rdid,
4192 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004193 .block_erasers =
4194 {
4195 {
4196 .eraseblocks = {
4197 {4 * 1024, 2},
4198 {8 * 1024, 1},
4199 {16 * 1024, 1},
4200 {32 * 1024, 1},
4201 {64 * 1024, 63},
4202 },
4203 .block_erase = spi_block_erase_d8,
4204 }, {
4205 .eraseblocks = { {4 * 1024 * 1024, 1} },
4206 .block_erase = spi_block_erase_c7,
4207 }
4208 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004209 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004210 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004211 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004212 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004213 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004214 },
4215
4216 {
4217 .vendor = "Eon",
4218 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004219 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004220 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004221 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004222 .total_size = 4096,
4223 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004224 /* OTP: 512B total; enter 0x3A */
4225 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004226 .tested = TEST_UNTESTED,
4227 .probe = probe_spi_rdid,
4228 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004229 .block_erasers =
4230 {
4231 {
4232 .eraseblocks = {
4233 {64 * 1024, 63},
4234 {32 * 1024, 1},
4235 {16 * 1024, 1},
4236 {8 * 1024, 1},
4237 {4 * 1024, 2},
4238 },
4239 .block_erase = spi_block_erase_d8,
4240 }, {
4241 .eraseblocks = { {4 * 1024 * 1024, 1} },
4242 .block_erase = spi_block_erase_c7,
4243 }
4244 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004245 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004246 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004247 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004248 .read = spi_chip_read, /* Fast read (0x0B) supported */
4249 .voltage = {2700, 3600},
4250 },
4251
4252 {
4253 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004254 .name = "EN25B40",
Stefan Taunerb175af52015-01-24 15:06:27 +00004255 .bustype = BUS_SPI,
4256 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004257 .model_id = EON_EN25B40,
4258 .total_size = 512,
Stefan Taunerb175af52015-01-24 15:06:27 +00004259 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004260 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004261 .tested = TEST_UNTESTED,
4262 .probe = probe_spi_rdid,
4263 .probe_timing = TIMING_ZERO,
4264 .block_erasers =
4265 {
4266 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004267 .eraseblocks = {
4268 {4 * 1024, 2},
4269 {8 * 1024, 1},
4270 {16 * 1024, 1},
4271 {32 * 1024, 1},
4272 {64 * 1024, 7}
4273 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004274 .block_erase = spi_block_erase_d8,
4275 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004276 .eraseblocks = { {512 * 1024, 1} },
4277 .block_erase = spi_block_erase_c7,
4278 }
4279 },
4280 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4281 .unlock = spi_disable_blockprotect,
4282 .write = spi_chip_write_256,
4283 .read = spi_chip_read, /* Fast read (0x0B) supported */
4284 .voltage = {2700, 3600},
4285 },
4286
4287 {
4288 .vendor = "Eon",
4289 .name = "EN25B40T",
4290 .bustype = BUS_SPI,
4291 .manufacture_id = EON_ID_NOPREFIX,
4292 .model_id = EON_EN25B40,
4293 .total_size = 512,
4294 .page_size = 256,
4295 .feature_bits = FEATURE_WRSR_WREN,
4296 .tested = TEST_UNTESTED,
4297 .probe = probe_spi_rdid,
4298 .probe_timing = TIMING_ZERO,
4299 .block_erasers =
4300 {
4301 {
4302 .eraseblocks = {
4303 {64 * 1024, 7},
4304 {32 * 1024, 1},
4305 {16 * 1024, 1},
4306 {8 * 1024, 1},
4307 {4 * 1024, 2},
4308 },
4309 .block_erase = spi_block_erase_d8,
4310 }, {
4311 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004312 .block_erase = spi_block_erase_c7,
4313 }
4314 },
4315 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4316 .unlock = spi_disable_blockprotect,
4317 .write = spi_chip_write_256,
4318 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004319 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004320 },
4321
4322 {
4323 .vendor = "Eon",
4324 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004325 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004326 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004327 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004328 .total_size = 8192,
4329 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004330 /* OTP: 512B total; enter 0x3A */
4331 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004332 .tested = TEST_UNTESTED,
4333 .probe = probe_spi_rdid,
4334 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004335 .block_erasers =
4336 {
4337 {
4338 .eraseblocks = {
4339 {4 * 1024, 2},
4340 {8 * 1024, 1},
4341 {16 * 1024, 1},
4342 {32 * 1024, 1},
4343 {64 * 1024, 127},
4344 },
4345 .block_erase = spi_block_erase_d8,
4346 }, {
4347 .eraseblocks = { {8 * 1024 * 1024, 1} },
4348 .block_erase = spi_block_erase_c7,
4349 }
4350 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004351 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004352 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004353 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004354 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004355 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004356 },
4357
4358 {
4359 .vendor = "Eon",
4360 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004361 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004362 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004363 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004364 .total_size = 8192,
4365 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004366 /* OTP: 512B total; enter 0x3A */
4367 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004368 .tested = TEST_UNTESTED,
4369 .probe = probe_spi_rdid,
4370 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004371 .block_erasers =
4372 {
4373 {
4374 .eraseblocks = {
4375 {64 * 1024, 127},
4376 {32 * 1024, 1},
4377 {16 * 1024, 1},
4378 {8 * 1024, 1},
4379 {4 * 1024, 2},
4380 },
4381 .block_erase = spi_block_erase_d8,
4382 }, {
4383 .eraseblocks = { {8 * 1024 * 1024, 1} },
4384 .block_erase = spi_block_erase_c7,
4385 }
4386 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004387 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004388 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004389 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004390 .read = spi_chip_read, /* Fast read (0x0B) supported */
4391 .voltage = {2700, 3600},
4392 },
4393
4394 {
4395 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004396 .name = "EN25B80",
Stefan Taunerb175af52015-01-24 15:06:27 +00004397 .bustype = BUS_SPI,
4398 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004399 .model_id = EON_EN25B80,
4400 .total_size = 1024,
Stefan Taunerb175af52015-01-24 15:06:27 +00004401 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004402 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004403 .tested = TEST_UNTESTED,
4404 .probe = probe_spi_rdid,
4405 .probe_timing = TIMING_ZERO,
4406 .block_erasers =
4407 {
4408 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004409 .eraseblocks = {
4410 {4 * 1024, 2},
4411 {8 * 1024, 1},
4412 {16 * 1024, 1},
4413 {32 * 1024, 1},
4414 {64 * 1024, 15}
4415 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004416 .block_erase = spi_block_erase_d8,
4417 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004418 .eraseblocks = { {1024 * 1024, 1} },
4419 .block_erase = spi_block_erase_c7,
4420 }
4421 },
4422 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4423 .unlock = spi_disable_blockprotect,
4424 .write = spi_chip_write_256,
4425 .read = spi_chip_read, /* Fast read (0x0B) supported */
4426 .voltage = {2700, 3600},
4427 },
4428
4429 {
4430 .vendor = "Eon",
4431 .name = "EN25B80T",
4432 .bustype = BUS_SPI,
4433 .manufacture_id = EON_ID_NOPREFIX,
4434 .model_id = EON_EN25B80,
4435 .total_size = 1024,
4436 .page_size = 256,
4437 .feature_bits = FEATURE_WRSR_WREN,
4438 .tested = TEST_UNTESTED,
4439 .probe = probe_spi_rdid,
4440 .probe_timing = TIMING_ZERO,
4441 .block_erasers =
4442 {
4443 {
4444 .eraseblocks = {
4445 {64 * 1024, 15},
4446 {32 * 1024, 1},
4447 {16 * 1024, 1},
4448 {8 * 1024, 1},
4449 {4 * 1024, 2},
4450 },
4451 .block_erase = spi_block_erase_d8,
4452 }, {
4453 .eraseblocks = { {1024 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004454 .block_erase = spi_block_erase_c7,
4455 }
4456 },
4457 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4458 .unlock = spi_disable_blockprotect,
4459 .write = spi_chip_write_256,
4460 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004461 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004462 },
4463
4464 {
4465 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004466 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004467 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004468 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004469 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004470 .total_size = 64,
4471 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004472 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004473 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004474 .probe = probe_spi_rdid,
4475 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004476 .block_erasers =
4477 {
4478 {
4479 .eraseblocks = { {4 * 1024, 16} },
4480 .block_erase = spi_block_erase_20,
4481 }, {
4482 .eraseblocks = { {32 * 1024, 2} },
4483 .block_erase = spi_block_erase_d8,
4484 }, {
4485 .eraseblocks = { {32 * 1024, 2} },
4486 .block_erase = spi_block_erase_52,
4487 }, {
4488 .eraseblocks = { {64 * 1024, 1} },
4489 .block_erase = spi_block_erase_60,
4490 }, {
4491 .eraseblocks = { {64 * 1024, 1} },
4492 .block_erase = spi_block_erase_c7,
4493 }
4494 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004495 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004496 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004497 .write = spi_chip_write_256,
4498 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004499 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004500 },
4501
4502 {
4503 .vendor = "Eon",
4504 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004505 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004506 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004507 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004508 .total_size = 128,
4509 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004510 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrowd173ed42021-09-29 09:28:07 +02004511 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004512 .probe = probe_spi_rdid,
4513 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004514 .block_erasers =
4515 {
4516 {
4517 .eraseblocks = { {4 * 1024, 32} },
4518 .block_erase = spi_block_erase_20,
4519 }, {
4520 .eraseblocks = { {32 * 1024, 4} },
4521 .block_erase = spi_block_erase_d8,
4522 }, {
4523 .eraseblocks = { {32 * 1024, 4} },
4524 .block_erase = spi_block_erase_52,
4525 }, {
4526 .eraseblocks = { {128 * 1024, 1} },
4527 .block_erase = spi_block_erase_60,
4528 }, {
4529 .eraseblocks = { {128 * 1024, 1} },
4530 .block_erase = spi_block_erase_c7,
4531 }
4532 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004533 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004534 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004535 .write = spi_chip_write_256,
4536 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004537 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004538 },
4539
4540 {
4541 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004542 .name = "EN25F16",
4543 .bustype = BUS_SPI,
4544 .manufacture_id = EON_ID_NOPREFIX,
4545 .model_id = EON_EN25F16,
4546 .total_size = 2048,
4547 .page_size = 256,
4548 .feature_bits = FEATURE_WRSR_WREN,
4549 .tested = TEST_OK_PREW,
4550 .probe = probe_spi_rdid,
4551 .probe_timing = TIMING_ZERO,
4552 .block_erasers =
4553 {
4554 {
4555 .eraseblocks = { {4 * 1024, 512} },
4556 .block_erase = spi_block_erase_20,
4557 }, {
4558 .eraseblocks = { {64 * 1024, 32} },
4559 .block_erase = spi_block_erase_d8,
4560 }, {
4561 .eraseblocks = { {2 * 1024 * 1024, 1} },
4562 .block_erase = spi_block_erase_60,
4563 }, {
4564 .eraseblocks = { {2 * 1024 * 1024, 1} },
4565 .block_erase = spi_block_erase_c7,
4566 }
4567 },
4568 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4569 .unlock = spi_disable_blockprotect,
4570 .write = spi_chip_write_256,
4571 .read = spi_chip_read,
4572 .voltage = {2700, 3600},
4573 },
4574
4575 {
4576 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004577 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004578 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004579 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004580 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004581 .total_size = 256,
4582 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004583 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004584 .tested = TEST_UNTESTED,
4585 .probe = probe_spi_rdid,
4586 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004587 .block_erasers =
4588 {
4589 {
4590 .eraseblocks = { {4 * 1024, 64} },
4591 .block_erase = spi_block_erase_20,
4592 }, {
4593 .eraseblocks = { {64 * 1024, 4} },
4594 .block_erase = spi_block_erase_d8,
4595 }, {
4596 .eraseblocks = { {64 * 1024, 4} },
4597 .block_erase = spi_block_erase_52,
4598 }, {
4599 .eraseblocks = { {256 * 1024, 1} },
4600 .block_erase = spi_block_erase_60,
4601 }, {
4602 .eraseblocks = { {256 * 1024, 1} },
4603 .block_erase = spi_block_erase_c7,
4604 }
4605 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004606 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004607 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004608 .write = spi_chip_write_256,
4609 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004610 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004611 },
4612
4613 {
4614 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004615 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004616 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004617 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004618 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004619 .total_size = 4096,
4620 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004621 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004622 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004623 .probe = probe_spi_rdid,
4624 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004625 .block_erasers =
4626 {
4627 {
4628 .eraseblocks = { {4 * 1024, 1024} },
4629 .block_erase = spi_block_erase_20,
4630 }, {
4631 .eraseblocks = { {64 * 1024, 64} },
4632 .block_erase = spi_block_erase_d8,
4633 }, {
4634 .eraseblocks = { {4 * 1024 * 1024, 1} },
4635 .block_erase = spi_block_erase_60,
4636 }, {
4637 .eraseblocks = { {4 * 1024 * 1024, 1} },
4638 .block_erase = spi_block_erase_c7,
4639 }
4640 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004641 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004642 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004643 .write = spi_chip_write_256,
4644 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004645 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004646 },
4647
4648 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004649 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004650 .name = "EN25F40",
4651 .bustype = BUS_SPI,
4652 .manufacture_id = EON_ID_NOPREFIX,
4653 .model_id = EON_EN25F40,
4654 .total_size = 512,
4655 .page_size = 256,
4656 .feature_bits = FEATURE_WRSR_WREN,
4657 .tested = TEST_OK_PREW,
4658 .probe = probe_spi_rdid,
4659 .probe_timing = TIMING_ZERO,
4660 .block_erasers =
4661 {
4662 {
4663 .eraseblocks = { {4 * 1024, 128} },
4664 .block_erase = spi_block_erase_20,
4665 }, {
4666 .eraseblocks = { {64 * 1024, 8} },
4667 .block_erase = spi_block_erase_d8,
4668 }, {
4669 .eraseblocks = { {512 * 1024, 1} },
4670 .block_erase = spi_block_erase_60,
4671 }, {
4672 .eraseblocks = { {512 * 1024, 1} },
4673 .block_erase = spi_block_erase_c7,
4674 },
4675 },
4676 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4677 .unlock = spi_disable_blockprotect,
4678 .write = spi_chip_write_256,
4679 .read = spi_chip_read,
4680 .voltage = {2700, 3600},
4681 },
4682
4683 {
4684 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004685 .name = "EN25F64",
4686 .bustype = BUS_SPI,
4687 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004688 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004689 .total_size = 8192,
4690 .page_size = 256,
4691 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004692 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004693 .probe = probe_spi_rdid,
4694 .probe_timing = TIMING_ZERO,
4695 .block_erasers =
4696 {
4697 {
4698 .eraseblocks = { {4 * 1024, 2048} },
4699 .block_erase = spi_block_erase_20,
4700 }, {
4701 .eraseblocks = { {64 * 1024, 128} },
4702 .block_erase = spi_block_erase_d8,
4703 }, {
4704 .eraseblocks = { {8 * 1024 * 1024, 1} },
4705 .block_erase = spi_block_erase_60,
4706 }, {
4707 .eraseblocks = { {8 * 1024 * 1024, 1} },
4708 .block_erase = spi_block_erase_c7,
4709 }
4710 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004711 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004712 .unlock = spi_disable_blockprotect,
4713 .write = spi_chip_write_256,
4714 .read = spi_chip_read,
4715 .voltage = {2700, 3600},
4716 },
4717
4718 {
4719 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004720 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004721 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004722 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004723 .model_id = EON_EN25F80,
David Hendricks6d715302011-07-24 22:21:57 +00004724 .total_size = 1024,
4725 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004726 .feature_bits = FEATURE_WRSR_WREN,
4727 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004728 .probe = probe_spi_rdid,
4729 .probe_timing = TIMING_ZERO,
4730 .block_erasers =
4731 {
4732 {
4733 .eraseblocks = { {4 * 1024, 256} },
4734 .block_erase = spi_block_erase_20,
4735 }, {
4736 .eraseblocks = { {64 * 1024, 16} },
4737 .block_erase = spi_block_erase_d8,
4738 }, {
4739 .eraseblocks = { {1024 * 1024, 1} },
4740 .block_erase = spi_block_erase_60,
4741 }, {
4742 .eraseblocks = { {1024 * 1024, 1} },
4743 .block_erase = spi_block_erase_c7,
4744 }
4745 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004746 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004747 .unlock = spi_disable_blockprotect,
4748 .write = spi_chip_write_256,
4749 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004750 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004751 },
4752
4753 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004754 .vendor = "Eon",
4755 .name = "EN25P05",
4756 .bustype = BUS_SPI,
4757 .manufacture_id = EON_ID_NOPREFIX,
4758 .model_id = EON_EN25B05,
4759 .total_size = 64,
4760 .page_size = 256,
4761 .feature_bits = FEATURE_WRSR_WREN,
4762 .tested = TEST_UNTESTED,
4763 .probe = probe_spi_rdid,
4764 .probe_timing = TIMING_ZERO,
4765 .block_erasers =
4766 {
4767 {
4768 .eraseblocks = {
4769 {32 * 1024, 2} },
4770 .block_erase = spi_block_erase_d8,
4771 }, {
4772 .eraseblocks = { {64 * 1024, 1} },
4773 .block_erase = spi_block_erase_c7,
4774 }
4775 },
4776 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4777 .unlock = spi_disable_blockprotect,
4778 .write = spi_chip_write_256,
4779 .read = spi_chip_read, /* Fast read (0x0B) supported */
4780 .voltage = {2700, 3600},
4781 },
4782
4783 {
4784 .vendor = "Eon",
4785 .name = "EN25P10",
4786 .bustype = BUS_SPI,
4787 .manufacture_id = EON_ID_NOPREFIX,
4788 .model_id = EON_EN25B10,
4789 .total_size = 128,
4790 .page_size = 256,
4791 .feature_bits = FEATURE_WRSR_WREN,
4792 .tested = TEST_UNTESTED,
4793 .probe = probe_spi_rdid,
4794 .probe_timing = TIMING_ZERO,
4795 .block_erasers =
4796 {
4797 {
4798 .eraseblocks = { {32 * 1024, 4} },
4799 .block_erase = spi_block_erase_d8,
4800 }, {
4801 .eraseblocks = { {128 * 1024, 1} },
4802 .block_erase = spi_block_erase_c7,
4803 }
4804 },
4805 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4806 .unlock = spi_disable_blockprotect,
4807 .write = spi_chip_write_256,
4808 .read = spi_chip_read, /* Fast read (0x0B) supported */
4809 .voltage = {2700, 3600},
4810 },
4811
4812 {
4813 .vendor = "Eon",
4814 .name = "EN25P16",
4815 .bustype = BUS_SPI,
4816 .manufacture_id = EON_ID_NOPREFIX,
4817 .model_id = EON_EN25B16,
4818 .total_size = 2048,
4819 .page_size = 256,
4820 .feature_bits = FEATURE_WRSR_WREN,
4821 .tested = TEST_UNTESTED,
4822 .probe = probe_spi_rdid,
4823 .probe_timing = TIMING_ZERO,
4824 .block_erasers =
4825 {
4826 {
4827 .eraseblocks = { {64 * 1024, 32} },
4828 .block_erase = spi_block_erase_d8,
4829 }, {
4830 .eraseblocks = { {2 * 1024 * 1024, 1} },
4831 .block_erase = spi_block_erase_c7,
4832 }
4833 },
4834 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4835 .unlock = spi_disable_blockprotect,
4836 .write = spi_chip_write_256,
4837 .read = spi_chip_read, /* Fast read (0x0B) supported */
4838 .voltage = {2700, 3600},
4839 },
4840
4841 {
4842 .vendor = "Eon",
4843 .name = "EN25P20",
4844 .bustype = BUS_SPI,
4845 .manufacture_id = EON_ID_NOPREFIX,
4846 .model_id = EON_EN25B20,
4847 .total_size = 256,
4848 .page_size = 256,
4849 .feature_bits = FEATURE_WRSR_WREN,
4850 .tested = TEST_UNTESTED,
4851 .probe = probe_spi_rdid,
4852 .probe_timing = TIMING_ZERO,
4853 .block_erasers =
4854 {
4855 {
4856 .eraseblocks = { {64 * 1024, 4} },
4857 .block_erase = spi_block_erase_d8,
4858 }, {
4859 .eraseblocks = { {256 * 1024, 1} },
4860 .block_erase = spi_block_erase_c7,
4861 }
4862 },
4863 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4864 .unlock = spi_disable_blockprotect,
4865 .write = spi_chip_write_256,
4866 .read = spi_chip_read, /* Fast read (0x0B) supported */
4867 .voltage = {2700, 3600},
4868 },
4869
4870 {
4871 .vendor = "Eon",
4872 .name = "EN25P32", /* Uniform version of EN25B32 */
4873 .bustype = BUS_SPI,
4874 .manufacture_id = EON_ID_NOPREFIX,
4875 .model_id = EON_EN25B32,
4876 .total_size = 4096,
4877 .page_size = 256,
4878 /* OTP: 512B total; enter 0x3A */
4879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4880 .tested = TEST_UNTESTED,
4881 .probe = probe_spi_rdid,
4882 .probe_timing = TIMING_ZERO,
4883 .block_erasers =
4884 {
4885 {
4886 .eraseblocks = { {64 * 1024, 64} },
4887 .block_erase = spi_block_erase_d8,
4888 }, {
4889 .eraseblocks = { {4 * 1024 * 1024, 1} },
4890 .block_erase = spi_block_erase_c7,
4891 }
4892 },
4893 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4894 .unlock = spi_disable_blockprotect,
4895 .write = spi_chip_write_256,
4896 .read = spi_chip_read, /* Fast read (0x0B) supported */
4897 .voltage = {2700, 3600},
4898 },
4899
4900 {
4901 .vendor = "Eon",
4902 .name = "EN25P40",
4903 .bustype = BUS_SPI,
4904 .manufacture_id = EON_ID_NOPREFIX,
4905 .model_id = EON_EN25B40,
4906 .total_size = 512,
4907 .page_size = 256,
4908 .feature_bits = FEATURE_WRSR_WREN,
4909 .tested = TEST_UNTESTED,
4910 .probe = probe_spi_rdid,
4911 .probe_timing = TIMING_ZERO,
4912 .block_erasers =
4913 {
4914 {
4915 .eraseblocks = { {64 * 1024, 8} },
4916 .block_erase = spi_block_erase_d8,
4917 }, {
4918 .eraseblocks = { {512 * 1024, 1} },
4919 .block_erase = spi_block_erase_c7,
4920 }
4921 },
4922 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4923 .unlock = spi_disable_blockprotect,
4924 .write = spi_chip_write_256,
4925 .read = spi_chip_read, /* Fast read (0x0B) supported */
4926 .voltage = {2700, 3600},
4927 },
4928
4929 {
4930 .vendor = "Eon",
4931 .name = "EN25P64",
4932 .bustype = BUS_SPI,
4933 .manufacture_id = EON_ID_NOPREFIX,
4934 .model_id = EON_EN25B64,
4935 .total_size = 8192,
4936 .page_size = 256,
4937 /* OTP: 512B total; enter 0x3A */
4938 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4939 .tested = TEST_UNTESTED,
4940 .probe = probe_spi_rdid,
4941 .probe_timing = TIMING_ZERO,
4942 .block_erasers =
4943 {
4944 {
4945 .eraseblocks = { {64 * 1024, 128} },
4946 .block_erase = spi_block_erase_d8,
4947 }, {
4948 .eraseblocks = { {8 * 1024 * 1024, 1} },
4949 .block_erase = spi_block_erase_c7,
4950 }
4951 },
4952 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4953 .unlock = spi_disable_blockprotect,
4954 .write = spi_chip_write_256,
4955 .read = spi_chip_read, /* Fast read (0x0B) supported */
4956 .voltage = {2700, 3600},
4957 },
4958
4959 {
4960 .vendor = "Eon",
4961 .name = "EN25P80",
4962 .bustype = BUS_SPI,
4963 .manufacture_id = EON_ID_NOPREFIX,
4964 .model_id = EON_EN25B80,
4965 .total_size = 1024,
4966 .page_size = 256,
4967 .feature_bits = FEATURE_WRSR_WREN,
4968 .tested = TEST_UNTESTED,
4969 .probe = probe_spi_rdid,
4970 .probe_timing = TIMING_ZERO,
4971 .block_erasers =
4972 {
4973 {
4974 .eraseblocks = { {64 * 1024, 16} },
4975 .block_erase = spi_block_erase_d8,
4976 }, {
4977 .eraseblocks = { {1024 * 1024, 1} },
4978 .block_erase = spi_block_erase_c7,
4979 }
4980 },
4981 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4982 .unlock = spi_disable_blockprotect,
4983 .write = spi_chip_write_256,
4984 .read = spi_chip_read, /* Fast read (0x0B) supported */
4985 .voltage = {2700, 3600},
4986 },
4987
4988 {
4989 .vendor = "Eon",
4990 .name = "EN25Q128",
4991 .bustype = BUS_SPI,
4992 .manufacture_id = EON_ID_NOPREFIX,
4993 .model_id = EON_EN25Q128,
4994 .total_size = 16384,
4995 .page_size = 256,
4996 /* OTP: 512B total; enter 0x3A */
4997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4998 .tested = TEST_OK_PREW,
4999 .probe = probe_spi_rdid,
5000 .probe_timing = TIMING_ZERO,
5001 .block_erasers =
5002 {
5003 {
5004 .eraseblocks = { {4 * 1024, 4096} },
5005 .block_erase = spi_block_erase_20,
5006 }, {
5007 .eraseblocks = { {64 * 1024, 256} },
5008 .block_erase = spi_block_erase_d8,
5009 }, {
5010 .eraseblocks = { {16 * 1024 * 1024, 1} },
5011 .block_erase = spi_block_erase_60,
5012 }, {
5013 .eraseblocks = { {16 * 1024 * 1024, 1} },
5014 .block_erase = spi_block_erase_c7,
5015 }
5016 },
5017 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5018 .unlock = spi_disable_blockprotect,
5019 .write = spi_chip_write_256,
5020 .read = spi_chip_read,
5021 },
5022
5023 {
David Hendricks6d715302011-07-24 22:21:57 +00005024 /* Note: EN25D16 is an evil twin which shares the model ID
5025 but has different write protection capabilities */
5026 .vendor = "Eon",
5027 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005028 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005029 .manufacture_id = EON_ID_NOPREFIX,
5030 .model_id = EON_EN25Q16,
5031 .total_size = 2048,
5032 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005033 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
5034 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00005035 .tested = TEST_UNTESTED,
5036 .probe = probe_spi_rdid,
5037 .probe_timing = TIMING_ZERO,
5038 .block_erasers =
5039 {
5040 {
5041 .eraseblocks = { {4 * 1024, 512} },
5042 .block_erase = spi_block_erase_20,
5043 }, {
5044 .eraseblocks = { {64 * 1024, 32} },
5045 .block_erase = spi_block_erase_d8,
5046 }, {
5047 /* not supported by Q16 version */
5048 .eraseblocks = { {64 * 1024, 32} },
5049 .block_erase = spi_block_erase_52,
5050 }, {
5051 .eraseblocks = { {2 * 1024 * 1024, 1} },
5052 .block_erase = spi_block_erase_60,
5053 }, {
5054 .eraseblocks = { {2 * 1024 * 1024, 1} },
5055 .block_erase = spi_block_erase_c7,
5056 }
5057 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005058 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005059 .unlock = spi_disable_blockprotect,
5060 .write = spi_chip_write_256,
5061 .read = spi_chip_read,
5062 .voltage = {2700, 3600},
5063 },
5064
5065 {
5066 .vendor = "Eon",
5067 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005068 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005069 .manufacture_id = EON_ID_NOPREFIX,
5070 .model_id = EON_EN25Q32,
5071 .total_size = 4096,
5072 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005073 /* OTP: 512B total; enter 0x3A */
5074 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005075 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005076 .probe = probe_spi_rdid,
5077 .probe_timing = TIMING_ZERO,
5078 .block_erasers =
5079 {
5080 {
5081 .eraseblocks = { {4 * 1024, 1024} },
5082 .block_erase = spi_block_erase_20,
5083 }, {
5084 .eraseblocks = { {64 * 1024, 64} },
5085 .block_erase = spi_block_erase_d8,
5086 }, {
5087 .eraseblocks = { {4 * 1024 * 1024, 1} },
5088 .block_erase = spi_block_erase_60,
5089 }, {
5090 .eraseblocks = { {4 * 1024 * 1024, 1} },
5091 .block_erase = spi_block_erase_c7,
5092 }
5093 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005094 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005095 .unlock = spi_disable_blockprotect,
5096 .write = spi_chip_write_256,
5097 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005098 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005099 },
5100
5101 {
5102 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005103 .name = "EN25Q40",
5104 .bustype = BUS_SPI,
5105 .manufacture_id = EON_ID_NOPREFIX,
5106 .model_id = EON_EN25Q40,
5107 .total_size = 512,
5108 .page_size = 256,
5109 /* OTP: 256B total; enter 0x3A */
5110 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5111 .tested = TEST_UNTESTED,
5112 .probe = probe_spi_rdid,
5113 .probe_timing = TIMING_ZERO,
5114 .block_erasers =
5115 {
5116 {
5117 .eraseblocks = { {4 * 1024, 128} },
5118 .block_erase = spi_block_erase_20,
5119 }, {
5120 .eraseblocks = { {64 * 1024, 8} },
5121 .block_erase = spi_block_erase_d8,
5122 }, {
5123 .eraseblocks = { {512 * 1024, 1} },
5124 .block_erase = spi_block_erase_60,
5125 }, {
5126 .eraseblocks = { {512 * 1024, 1} },
5127 .block_erase = spi_block_erase_c7,
5128 }
5129 },
5130 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5131 .unlock = spi_disable_blockprotect,
5132 .write = spi_chip_write_256,
5133 .read = spi_chip_read,
5134 .voltage = {2700, 3600},
5135 },
5136
5137 {
5138 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00005139 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005140 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005141 .manufacture_id = EON_ID_NOPREFIX,
5142 .model_id = EON_EN25Q64,
5143 .total_size = 8192,
5144 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005145 /* OTP: 512B total; enter 0x3A */
5146 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005147 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005148 .probe = probe_spi_rdid,
5149 .probe_timing = TIMING_ZERO,
5150 .block_erasers =
5151 {
5152 {
5153 .eraseblocks = { {4 * 1024, 2048} },
5154 .block_erase = spi_block_erase_20,
5155 }, {
5156 .eraseblocks = { {64 * 1024, 128} },
5157 .block_erase = spi_block_erase_d8,
5158 }, {
5159 .eraseblocks = { {8 * 1024 * 1024, 1} },
5160 .block_erase = spi_block_erase_60,
5161 }, {
5162 .eraseblocks = { {8 * 1024 * 1024, 1} },
5163 .block_erase = spi_block_erase_c7,
5164 }
5165 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005166 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005167 .unlock = spi_disable_blockprotect,
5168 .write = spi_chip_write_256,
5169 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005170 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005171 },
5172
5173 {
5174 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005175 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005176 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005177 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005178 .model_id = EON_EN25Q80,
5179 .total_size = 1024,
5180 .page_size = 256,
5181 /* OTP: 256B total; enter 0x3A */
5182 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5183 .tested = TEST_UNTESTED,
5184 .probe = probe_spi_rdid,
5185 .probe_timing = TIMING_ZERO,
5186 .block_erasers =
5187 {
5188 {
5189 .eraseblocks = { {4 * 1024, 256} },
5190 .block_erase = spi_block_erase_20,
5191 }, {
5192 .eraseblocks = { {64 * 1024, 16} },
5193 .block_erase = spi_block_erase_d8,
5194 }, {
5195 .eraseblocks = { {1024 * 1024, 1} },
5196 .block_erase = spi_block_erase_60,
5197 }, {
5198 .eraseblocks = { {1024 * 1024, 1} },
5199 .block_erase = spi_block_erase_c7,
5200 }
5201 },
5202 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5203 .unlock = spi_disable_blockprotect,
5204 .write = spi_chip_write_256,
5205 .read = spi_chip_read,
5206 .voltage = {2700, 3600},
5207 },
5208
5209 {
5210 .vendor = "Eon",
5211 .name = "EN25QH128",
5212 .bustype = BUS_SPI,
5213 .manufacture_id = EON_ID_NOPREFIX,
5214 .model_id = EON_EN25QH128,
David Hendricks6d715302011-07-24 22:21:57 +00005215 .total_size = 16384,
5216 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005217 /* supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00005218 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5220 .dummy_cycles =
5221 {
5222 .qpi_fast_read = 6,
5223 .qpi_fast_read_qio = 6,
5224 },
Tim Chenbfe149a2020-07-06 14:59:21 +08005225 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005226 .probe = probe_spi_rdid,
5227 .probe_timing = TIMING_ZERO,
5228 .block_erasers =
5229 {
5230 {
5231 .eraseblocks = { {4 * 1024, 4096} },
5232 .block_erase = spi_block_erase_20,
5233 }, {
5234 .eraseblocks = { {64 * 1024, 256} },
5235 .block_erase = spi_block_erase_d8,
5236 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005237 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005238 .block_erase = spi_block_erase_60,
5239 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005240 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005241 .block_erase = spi_block_erase_c7,
5242 }
5243 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005244 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5245 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005246 .write = spi_chip_write_256,
5247 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005248 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005249 .reg_bits =
5250 {
5251 .srp = {STATUS1, 7, RW},
5252 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5253 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5254 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005255 .wp_write_cfg = spi_wp_write_cfg,
5256 .wp_read_cfg = spi_wp_read_cfg,
5257 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005258 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02005259 .prepare_access = spi_prepare_io,
5260 .finish_access = spi_finish_io,
David Hendricks6d715302011-07-24 22:21:57 +00005261 },
5262
5263 {
5264 .vendor = "Eon",
5265 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005266 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005267 .manufacture_id = EON_ID_NOPREFIX,
5268 .model_id = EON_EN25QH16,
5269 .total_size = 2048,
5270 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005271 /* supports SFDP */
5272 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5274 .dummy_cycles =
5275 {
5276 .qpi_fast_read = 6,
5277 .qpi_fast_read_qio = 6,
5278 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00005279 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005280 .probe = probe_spi_rdid,
5281 .probe_timing = TIMING_ZERO,
5282 .block_erasers =
5283 {
5284 {
5285 .eraseblocks = { {4 * 1024, 512} },
5286 .block_erase = spi_block_erase_20,
5287 }, {
5288 .eraseblocks = { {64 * 1024, 32} },
5289 .block_erase = spi_block_erase_d8,
5290 }, {
5291 .eraseblocks = { {1024 * 2048, 1} },
5292 .block_erase = spi_block_erase_60,
5293 }, {
5294 .eraseblocks = { {1024 * 2048, 1} },
5295 .block_erase = spi_block_erase_c7,
5296 }
5297 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005298 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005299 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005300 .write = spi_chip_write_256,
5301 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005302 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005303 .prepare_access = spi_prepare_io,
5304 .finish_access = spi_finish_io,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005305 },
5306
5307 {
5308 .vendor = "Eon",
5309 .name = "EN25QH32",
5310 .bustype = BUS_SPI,
5311 .manufacture_id = EON_ID_NOPREFIX,
5312 .model_id = EON_EN25QH32,
5313 .total_size = 4096,
5314 .page_size = 256,
5315 /* supports SFDP */
5316 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005317 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5318 .dummy_cycles =
5319 {
5320 .qpi_fast_read = 6,
5321 .qpi_fast_read_qio = 6,
5322 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005323 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005324 .probe = probe_spi_rdid,
5325 .probe_timing = TIMING_ZERO,
5326 .block_erasers =
5327 {
5328 {
5329 .eraseblocks = { {4 * 1024, 1024} },
5330 .block_erase = spi_block_erase_20,
5331 }, {
5332 .eraseblocks = { {64 * 1024, 64} },
5333 .block_erase = spi_block_erase_d8,
5334 }, {
5335 .eraseblocks = { {1024 * 4096, 1} },
5336 .block_erase = spi_block_erase_60,
5337 }, {
5338 .eraseblocks = { {1024 * 4096, 1} },
5339 .block_erase = spi_block_erase_c7,
5340 }
5341 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005342 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005343 .unlock = spi_disable_blockprotect_bp3_srwd,
5344 .write = spi_chip_write_256,
5345 .read = spi_chip_read,
5346 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005347 .reg_bits =
5348 {
5349 .srp = {STATUS1, 7, RW},
5350 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5351 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5352 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005353 .wp_write_cfg = spi_wp_write_cfg,
5354 .wp_read_cfg = spi_wp_read_cfg,
5355 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005356 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02005357 .prepare_access = spi_prepare_io,
5358 .finish_access = spi_finish_io,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005359 },
5360
5361 {
5362 .vendor = "Eon",
5363 .name = "EN25QH32B",
5364 .bustype = BUS_SPI,
5365 .manufacture_id = EON_ID_NOPREFIX,
5366 .model_id = EON_EN25QH32,
5367 .total_size = 4096,
5368 .page_size = 256,
5369 /* supports SFDP */
5370 /* OTP: 1536B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005371 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_38,
5372 .dummy_cycles =
5373 {
5374 .qpi_fast_read = 6,
5375 .qpi_fast_read_qio = 6,
5376 },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005377 .tested = TEST_OK_PREW,
5378 .probe = probe_spi_rdid,
5379 .probe_timing = TIMING_ZERO,
5380 .block_erasers =
5381 {
5382 {
5383 .eraseblocks = { {4 * 1024, 1024} },
5384 .block_erase = spi_block_erase_20,
5385 }, {
5386 .eraseblocks = { {32 * 1024, 128} },
5387 .block_erase = spi_block_erase_52,
5388 }, {
5389 .eraseblocks = { {64 * 1024, 64} },
5390 .block_erase = spi_block_erase_d8,
5391 }, {
5392 .eraseblocks = { {1024 * 4096, 1} },
5393 .block_erase = spi_block_erase_60,
5394 }, {
5395 .eraseblocks = { {1024 * 4096, 1} },
5396 .block_erase = spi_block_erase_c7,
5397 }
5398 },
5399 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5400 .unlock = spi_disable_blockprotect_bp3_srwd,
5401 .write = spi_chip_write_256,
5402 .read = spi_chip_read,
5403 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005404 .prepare_access = spi_prepare_io,
5405 .finish_access = spi_finish_io,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005406 },
5407
5408 {
5409 .vendor = "Eon",
5410 .name = "EN25QH64",
5411 .bustype = BUS_SPI,
5412 .manufacture_id = EON_ID_NOPREFIX,
5413 .model_id = EON_EN25QH64,
5414 .total_size = 8192,
5415 .page_size = 256,
5416 /* supports SFDP */
5417 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005418 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5419 .dummy_cycles =
5420 {
5421 .qpi_fast_read = 6,
5422 .qpi_fast_read_qio = 6,
5423 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005424 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005425 .probe = probe_spi_rdid,
5426 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005427 .block_erasers =
5428 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005429 {
5430 .eraseblocks = { {4 * 1024, 2048} },
5431 .block_erase = spi_block_erase_20,
5432 }, {
5433 .eraseblocks = { {64 * 1024, 128} },
5434 .block_erase = spi_block_erase_d8,
5435 }, {
5436 .eraseblocks = { { 8192 * 1024, 1} },
5437 .block_erase = spi_block_erase_60,
5438 }, {
5439 .eraseblocks = { { 8192 * 1024, 1} },
5440 .block_erase = spi_block_erase_c7,
5441 }
5442 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005443 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005444 .unlock = spi_disable_blockprotect_bp3_srwd,
5445 .write = spi_chip_write_256,
5446 .read = spi_chip_read,
5447 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005448 .reg_bits =
5449 {
5450 .srp = {STATUS1, 7, RW},
5451 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5452 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5453 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005454 .wp_write_cfg = spi_wp_write_cfg,
5455 .wp_read_cfg = spi_wp_read_cfg,
5456 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005457 .decode_range = decode_range_spi25_64k_block,
Nico Huber930d4212024-05-04 18:59:15 +02005458 .prepare_access = spi_prepare_io,
5459 .finish_access = spi_finish_io,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005460 },
5461
5462 {
5463 .vendor = "Eon",
5464 .name = "EN25QH64A",
5465 .bustype = BUS_SPI,
5466 .manufacture_id = EON_ID_NOPREFIX,
5467 .model_id = EON_EN25QH64,
5468 .total_size = 8192,
5469 .page_size = 256,
5470 /* supports SFDP */
5471 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005472 /* Has a special, volatile status register 3 that is written with
5473 0xc0 like Set Read Parameters. Hence treating as QPI_SRP. */
5474 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP,
5475 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005476 .tested = TEST_OK_PREW,
5477 .probe = probe_spi_rdid,
5478 .probe_timing = TIMING_ZERO,
5479 .block_erasers =
5480 {
5481 {
5482 .eraseblocks = { {4 * 1024, 2048} },
5483 .block_erase = spi_block_erase_20,
5484 }, {
5485 .eraseblocks = { {32 * 1024, 256} },
5486 .block_erase = spi_block_erase_52,
5487 }, {
5488 .eraseblocks = { {64 * 1024, 128} },
5489 .block_erase = spi_block_erase_d8,
5490 }, {
5491 .eraseblocks = { { 8192 * 1024, 1} },
5492 .block_erase = spi_block_erase_60,
5493 }, {
5494 .eraseblocks = { { 8192 * 1024, 1} },
5495 .block_erase = spi_block_erase_c7,
5496 }
5497 },
5498 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5499 .unlock = spi_disable_blockprotect_bp3_srwd,
5500 .write = spi_chip_write_256,
5501 .read = spi_chip_read,
5502 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02005503 .prepare_access = spi_prepare_io,
5504 .finish_access = spi_finish_io,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005505 },
5506
5507 {
5508 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005509 .name = "EN25S10",
5510 .bustype = BUS_SPI,
5511 .manufacture_id = EON_ID_NOPREFIX,
5512 .model_id = EON_EN25S10,
5513 .total_size = 128,
5514 .page_size = 256,
5515 /* OTP: 256B total; enter 0x3A */
5516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5517 .tested = TEST_UNTESTED,
5518 .probe = probe_spi_rdid,
5519 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005520 .block_erasers =
5521 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005522 {
5523 .eraseblocks = { {4 * 1024, 32} },
5524 .block_erase = spi_block_erase_20,
5525 }, {
5526 .eraseblocks = { {32 * 1024, 4} },
5527 .block_erase = spi_block_erase_52,
5528 }, {
5529 .eraseblocks = { {128 * 1024, 1} },
5530 .block_erase = spi_block_erase_60,
5531 }, {
5532 .eraseblocks = { {128 * 1024, 1} },
5533 .block_erase = spi_block_erase_c7,
5534 }
5535 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005536 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005537 .unlock = spi_disable_blockprotect,
5538 .write = spi_chip_write_256,
5539 .read = spi_chip_read,
5540 .voltage = {1650, 1950},
5541 },
5542
5543 {
5544 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005545 .name = "EN25S16",
5546 .bustype = BUS_SPI,
5547 .manufacture_id = EON_ID_NOPREFIX,
5548 .model_id = EON_EN25S16,
5549 .total_size = 2048,
5550 .page_size = 256,
5551 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5553 .dummy_cycles =
5554 {
5555 .qpi_fast_read = 6,
5556 .qpi_fast_read_qio = 6,
5557 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005558 .tested = TEST_UNTESTED,
5559 .probe = probe_spi_rdid,
5560 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005561 .block_erasers =
5562 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005563 {
5564 .eraseblocks = { {4 * 1024, 512} },
5565 .block_erase = spi_block_erase_20,
5566 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005567 .eraseblocks = { {32 * 1024, 64} },
5568 .block_erase = spi_block_erase_d8,
5569 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05305570 .eraseblocks = { {64 * 1024, 32} },
5571 .block_erase = spi_block_erase_52,
5572 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005573 .eraseblocks = { {2048 * 1024, 1} },
5574 .block_erase = spi_block_erase_60,
5575 }, {
5576 .eraseblocks = { {2048 * 1024, 1} },
5577 .block_erase = spi_block_erase_c7,
5578 }
5579 },
5580 .printlock = spi_prettyprint_status_register_en25s_wp,
5581 .unlock = spi_disable_blockprotect_bp3_srwd,
5582 .write = spi_chip_write_256,
5583 .read = spi_chip_read,
5584 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02005585 .prepare_access = spi_prepare_io,
5586 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005587 },
5588
5589 {
5590 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005591 .name = "EN25S20",
5592 .bustype = BUS_SPI,
5593 .manufacture_id = EON_ID_NOPREFIX,
5594 .model_id = EON_EN25S20,
5595 .total_size = 256,
5596 .page_size = 256,
5597 /* OTP: 256B total; enter 0x3A */
5598 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5599 .tested = TEST_UNTESTED,
5600 .probe = probe_spi_rdid,
5601 .probe_timing = TIMING_ZERO,
5602 .block_erasers =
5603 {
5604 {
5605 .eraseblocks = { {4 * 1024, 64} },
5606 .block_erase = spi_block_erase_20,
5607 }, {
5608 .eraseblocks = { {64 * 1024, 4} },
5609 .block_erase = spi_block_erase_d8,
5610 }, {
5611 .eraseblocks = { {256 * 1024, 1} },
5612 .block_erase = spi_block_erase_60,
5613 }, {
5614 .eraseblocks = { {256 * 1024, 1} },
5615 .block_erase = spi_block_erase_c7,
5616 }
5617 },
5618 .printlock = spi_prettyprint_status_register_bp2_srwd,
5619 .unlock = spi_disable_blockprotect,
5620 .write = spi_chip_write_256,
5621 .read = spi_chip_read,
5622 .voltage = {1650, 1950},
5623 },
5624
5625 {
5626 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005627 .name = "EN25S32",
5628 .bustype = BUS_SPI,
5629 .manufacture_id = EON_ID_NOPREFIX,
5630 .model_id = EON_EN25S32,
5631 .total_size = 4096,
5632 .page_size = 256,
5633 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005634 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5635 .dummy_cycles =
5636 {
5637 .qpi_fast_read = 6,
5638 .qpi_fast_read_qio = 6,
5639 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005640 .tested = TEST_UNTESTED,
5641 .probe = probe_spi_rdid,
5642 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005643 .block_erasers =
5644 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005645 {
5646 .eraseblocks = { {4 * 1024, 1024} },
5647 .block_erase = spi_block_erase_20,
5648 }, {
5649 .eraseblocks = { {32 * 1024, 128} },
5650 .block_erase = spi_block_erase_52,
5651 }, {
5652 .eraseblocks = { {64 * 1024, 64} },
5653 .block_erase = spi_block_erase_d8,
5654 }, {
5655 .eraseblocks = { {4096 * 1024, 1} },
5656 .block_erase = spi_block_erase_60,
5657 }, {
5658 .eraseblocks = { {4096 * 1024, 1} },
5659 .block_erase = spi_block_erase_c7,
5660 }
5661 },
5662 .printlock = spi_prettyprint_status_register_en25s_wp,
5663 .unlock = spi_disable_blockprotect_bp3_srwd,
5664 .write = spi_chip_write_256,
5665 .read = spi_chip_read,
5666 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02005667 .prepare_access = spi_prepare_io,
5668 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005669 },
5670
5671 {
5672 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005673 .name = "EN25S40",
5674 .bustype = BUS_SPI,
5675 .manufacture_id = EON_ID_NOPREFIX,
5676 .model_id = EON_EN25S40,
5677 .total_size = 512,
5678 .page_size = 256,
5679 /* OTP: 256B total; enter 0x3A */
5680 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5681 .tested = TEST_OK_PREW,
5682 .probe = probe_spi_rdid,
5683 .probe_timing = TIMING_ZERO,
5684 .block_erasers =
5685 {
5686 {
5687 .eraseblocks = { {4 * 1024, 128} },
5688 .block_erase = spi_block_erase_20,
5689 }, {
5690 .eraseblocks = { {64 * 1024, 8} },
5691 .block_erase = spi_block_erase_d8,
5692 }, {
5693 .eraseblocks = { {512 * 1024, 1} },
5694 .block_erase = spi_block_erase_60,
5695 }, {
5696 .eraseblocks = { {512 * 1024, 1} },
5697 .block_erase = spi_block_erase_c7,
5698 }
5699 },
5700 .printlock = spi_prettyprint_status_register_bp2_srwd,
5701 .unlock = spi_disable_blockprotect,
5702 .write = spi_chip_write_256,
5703 .read = spi_chip_read,
5704 .voltage = {1650, 1950},
5705 },
5706
5707 {
5708 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005709 .name = "EN25S64",
5710 .bustype = BUS_SPI,
5711 .manufacture_id = EON_ID_NOPREFIX,
5712 .model_id = EON_EN25S64,
5713 .total_size = 8192,
5714 .page_size = 256,
5715 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005716 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5717 .dummy_cycles =
5718 {
5719 .qpi_fast_read = 6,
5720 .qpi_fast_read_qio = 6,
5721 },
Nikolai Artemievdf889fa2021-03-23 17:10:45 +11005722 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005723 .probe = probe_spi_rdid,
5724 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005725 .block_erasers =
5726 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005727 {
5728 .eraseblocks = { {4 * 1024, 2048} },
5729 .block_erase = spi_block_erase_20,
5730 }, {
5731 .eraseblocks = { {64 * 1024, 128} },
5732 .block_erase = spi_block_erase_d8,
5733 }, {
5734 .eraseblocks = { {8192 * 1024, 1} },
5735 .block_erase = spi_block_erase_60,
5736 }, {
5737 .eraseblocks = { {8192 * 1024, 1} },
5738 .block_erase = spi_block_erase_c7,
5739 }
5740 },
5741 .printlock = spi_prettyprint_status_register_en25s_wp,
5742 .unlock = spi_disable_blockprotect_bp3_srwd,
5743 .write = spi_chip_write_256,
5744 .read = spi_chip_read,
5745 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02005746 .prepare_access = spi_prepare_io,
5747 .finish_access = spi_finish_io,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005748 },
5749
5750 {
5751 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005752 .name = "EN25S80",
5753 .bustype = BUS_SPI,
5754 .manufacture_id = EON_ID_NOPREFIX,
5755 .model_id = EON_EN25S80,
5756 .total_size = 1024,
5757 .page_size = 256,
5758 /* OTP: 256B total; enter 0x3A */
5759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5760 .tested = TEST_UNTESTED,
5761 .probe = probe_spi_rdid,
5762 .probe_timing = TIMING_ZERO,
Russ Dill3cd5a122010-03-05 08:44:11 +00005763 .block_erasers =
5764 {
5765 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005766 .eraseblocks = { {4 * 1024, 256} },
5767 .block_erase = spi_block_erase_20,
5768 }, {
5769 .eraseblocks = { {64 * 1024, 16} },
5770 .block_erase = spi_block_erase_d8,
5771 }, {
5772 .eraseblocks = { {1024 * 1024, 1} },
5773 .block_erase = spi_block_erase_60,
5774 }, {
5775 .eraseblocks = { {1024 * 1024, 1} },
5776 .block_erase = spi_block_erase_c7,
5777 }
Russ Dill3cd5a122010-03-05 08:44:11 +00005778 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005779 .printlock = spi_prettyprint_status_register_bp2_srwd,
5780 .unlock = spi_disable_blockprotect,
5781 .write = spi_chip_write_256,
5782 .read = spi_chip_read,
5783 .voltage = {1650, 1950},
Russ Dill3cd5a122010-03-05 08:44:11 +00005784 },
5785
5786 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005787 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005788 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005789 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005790 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005791 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005792 .total_size = 256,
5793 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005794 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Green4362e622019-08-26 15:02:12 +10005795 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005796 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005797 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005798 .block_erasers =
5799 {
5800 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005801 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005802 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005803 {8 * 1024, 2},
5804 {32 * 1024, 1},
5805 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005806 },
5807 .block_erase = erase_sector_jedec,
5808 }, {
5809 .eraseblocks = { {256 * 1024, 1} },
5810 .block_erase = erase_chip_block_jedec,
5811 },
5812 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005813 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005814 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005815 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005816 .prepare_access = prepare_memory_access,
5817 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005818 },
5819
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005820 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005821 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005822 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005823 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005824 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005825 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005826 .total_size = 256,
5827 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005828 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005829 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005830 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005831 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005832 .block_erasers =
5833 {
5834 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005835 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005836 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005837 {32 * 1024, 1},
5838 {8 * 1024, 2},
5839 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005840 },
5841 .block_erase = erase_sector_jedec,
5842 }, {
5843 .eraseblocks = { {256 * 1024, 1} },
5844 .block_erase = erase_chip_block_jedec,
5845 },
5846 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005847 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005848 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005849 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005850 .prepare_access = prepare_memory_access,
5851 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005852 },
5853
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005854 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005855 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005856 .name = "EN29F010",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005857 .bustype = BUS_PARALLEL,
5858 .manufacture_id = EON_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005859 .model_id = EON_EN29F010,
5860 .total_size = 128,
5861 .page_size = 128,
5862 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5863 .tested = TEST_OK_PRE,
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005864 .probe = probe_jedec,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005865 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005866 .block_erasers =
5867 {
5868 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005869 .eraseblocks = { {16 * 1024, 8} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005870 .block_erase = erase_sector_jedec,
5871 },
5872 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005873 .eraseblocks = { {128 * 1024, 1} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005874 .block_erase = erase_chip_block_jedec,
5875 },
5876 },
5877 .write = write_jedec_1,
5878 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005879 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005880 .prepare_access = prepare_memory_access,
5881 .finish_access = finish_memory_access,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005882 },
5883
5884 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005885 .vendor = "Eon",
5886 .name = "EN29GL064(A)B",
5887 .bustype = BUS_PARALLEL,
5888 .manufacture_id = EON_ID,
5889 .model_id = EON_EN29GL064B,
5890 .total_size = 8192,
5891 .page_size = 128 * 1024, /* actual page size is 16 */
5892 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5893 .tested = TEST_UNTESTED,
5894 .probe = probe_jedec_29gl,
5895 .probe_timing = TIMING_ZERO,
5896 .block_erasers =
5897 {
5898 {
5899 .eraseblocks = {
5900 {8 * 1024, 8},
5901 {64 * 1024, 127},
5902 },
5903 .block_erase = erase_sector_jedec,
5904 }, {
5905 .eraseblocks = { {8 * 1024 * 1024, 1} },
5906 .block_erase = erase_chip_block_jedec,
5907 },
5908 },
5909 .write = write_jedec_1,
5910 .read = read_memmapped,
5911 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005912 .prepare_access = prepare_memory_access,
5913 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005914 },
5915
5916 {
5917 .vendor = "Eon",
5918 .name = "EN29GL064(A)T",
5919 .bustype = BUS_PARALLEL,
5920 .manufacture_id = EON_ID,
5921 .model_id = EON_EN29GL064T,
5922 .total_size = 8192,
5923 .page_size = 128 * 1024, /* actual page size is 16 */
5924 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5925 .tested = TEST_UNTESTED,
5926 .probe = probe_jedec_29gl,
5927 .probe_timing = TIMING_ZERO,
5928 .block_erasers =
5929 {
5930 {
5931 .eraseblocks = {
5932 {64 * 1024, 127},
5933 {8 * 1024, 8},
5934 },
5935 .block_erase = erase_sector_jedec,
5936 }, {
5937 .eraseblocks = { {8 * 1024 * 1024, 1} },
5938 .block_erase = erase_chip_block_jedec,
5939 },
5940 },
5941 .write = write_jedec_1,
5942 .read = read_memmapped,
5943 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005944 .prepare_access = prepare_memory_access,
5945 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005946 },
5947
5948 {
5949 .vendor = "Eon",
5950 .name = "EN29GL064H/L",
5951 .bustype = BUS_PARALLEL,
5952 .manufacture_id = EON_ID,
5953 .model_id = EON_EN29GL064HL,
5954 .total_size = 8192,
5955 .page_size = 128 * 1024, /* actual page size is 16 */
5956 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5957 .tested = TEST_UNTESTED,
5958 .probe = probe_jedec_29gl,
5959 .probe_timing = TIMING_ZERO,
5960 .block_erasers =
5961 {
5962 {
5963 .eraseblocks = { {64 * 1024, 128} },
5964 .block_erase = erase_sector_jedec,
5965 }, {
5966 .eraseblocks = { {8 * 1024 * 1024, 1} },
5967 .block_erase = erase_chip_block_jedec,
5968 },
5969 },
5970 .write = write_jedec_1,
5971 .read = read_memmapped,
5972 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005973 .prepare_access = prepare_memory_access,
5974 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005975 },
5976
5977 {
5978 .vendor = "Eon",
5979 .name = "EN29GL128",
5980 .bustype = BUS_PARALLEL,
5981 .manufacture_id = EON_ID,
5982 .model_id = EON_EN29GL128HL,
5983 .total_size = 16384,
5984 .page_size = 128 * 1024, /* actual page size is 16 */
5985 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5986 .tested = TEST_UNTESTED,
5987 .probe = probe_jedec_29gl,
5988 .probe_timing = TIMING_ZERO,
5989 .block_erasers =
5990 {
5991 {
5992 .eraseblocks = { {128 * 1024, 128} },
5993 .block_erase = erase_sector_jedec,
5994 }, {
5995 .eraseblocks = { {16 * 1024 * 1024, 1} },
5996 .block_erase = erase_chip_block_jedec,
5997 },
5998 },
5999 .write = write_jedec_1,
6000 .read = read_memmapped,
6001 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006002 .prepare_access = prepare_memory_access,
6003 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006004 },
6005
6006 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006007 .vendor = "Eon",
6008 .name = "EN29LV040(A)",
6009 .bustype = BUS_PARALLEL,
6010 .manufacture_id = EON_ID,
6011 .model_id = EON_EN29LV040,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006012 .total_size = 512,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006013 .page_size = 4 * 1024,
6014 .tested = TEST_OK_PREW,
6015 .probe = probe_jedec,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006016 .probe_timing = TIMING_ZERO,
6017 .block_erasers =
6018 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006019 {
6020 .eraseblocks = { {64 * 1024, 8} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006021 .block_erase = erase_sector_jedec,
6022 },
6023 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006024 .eraseblocks = { {512 * 1024, 1} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006025 .block_erase = erase_chip_block_jedec,
6026 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006027 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006028 .write = write_jedec_1,
6029 .read = read_memmapped,
6030 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006031 .prepare_access = prepare_memory_access,
6032 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006033 },
6034
6035 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006036 .vendor = "Eon",
6037 .name = "EN29LV640B",
6038 .bustype = BUS_PARALLEL,
6039 .manufacture_id = EON_ID,
6040 .model_id = EON_EN29LV640B,
6041 .total_size = 8192,
6042 .page_size = 8192,
6043 .feature_bits = FEATURE_ADDR_SHIFTED,
6044 .tested = TEST_OK_PREW,
6045 .probe = probe_en29lv640b,
6046 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006047 .block_erasers =
6048 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006049 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006050 .eraseblocks = {
6051 {8 * 1024, 8},
6052 {64 * 1024, 127},
6053 },
6054 .block_erase = erase_block_jedec,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006055 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006056 .eraseblocks = { {8 * 1024 * 1024, 1} },
6057 .block_erase = erase_chip_block_jedec,
6058 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006059 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006060 .write = write_en29lv640b,
6061 .read = read_memmapped,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006062 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006063 .prepare_access = prepare_memory_access,
6064 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006065 },
6066
6067 {
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006068 .vendor = "Fudan",
6069 .name = "FM25F005",
6070 .bustype = BUS_SPI,
6071 .manufacture_id = FUDAN_ID_NOPREFIX,
6072 .model_id = FUDAN_FM25F005,
6073 .total_size = 64,
6074 .page_size = 256,
6075 /* OTP: 256B total; enter 0x3A */
6076 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6077 .tested = TEST_UNTESTED,
6078 .probe = probe_spi_rdid,
6079 .probe_timing = TIMING_ZERO,
6080 .block_erasers = {
6081 {
6082 .eraseblocks = { {4 * 1024, 16} },
6083 .block_erase = spi_block_erase_20,
6084 }, {
6085 .eraseblocks = { {32 * 1024, 2} },
6086 .block_erase = spi_block_erase_52,
6087 }, {
6088 .eraseblocks = { {64 * 1024, 1} },
6089 .block_erase = spi_block_erase_d8,
6090 }, {
6091 .eraseblocks = { {64 * 1024, 1} },
6092 .block_erase = spi_block_erase_60,
6093 }, {
6094 .eraseblocks = { {64 * 1024, 1} },
6095 .block_erase = spi_block_erase_c7,
6096 }
6097 },
6098 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6099 .unlock = spi_disable_blockprotect_bp2_srwd,
6100 .write = spi_chip_write_256,
6101 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6102 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6103 },
6104
6105 {
6106 .vendor = "Fudan",
6107 .name = "FM25F01",
6108 .bustype = BUS_SPI,
6109 .manufacture_id = FUDAN_ID_NOPREFIX,
6110 .model_id = FUDAN_FM25F01,
6111 .total_size = 128,
6112 .page_size = 256,
6113 /* OTP: 256B total; enter 0x3A */
6114 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6115 .tested = TEST_UNTESTED,
6116 .probe = probe_spi_rdid,
6117 .probe_timing = TIMING_ZERO,
6118 .block_erasers = {
6119 {
6120 .eraseblocks = { {4 * 1024, 32} },
6121 .block_erase = spi_block_erase_20,
6122 }, {
6123 .eraseblocks = { {32 * 1024, 4} },
6124 .block_erase = spi_block_erase_52,
6125 }, {
6126 .eraseblocks = { {64 * 1024, 2} },
6127 .block_erase = spi_block_erase_d8,
6128 }, {
6129 .eraseblocks = { {128 * 1024, 1} },
6130 .block_erase = spi_block_erase_60,
6131 }, {
6132 .eraseblocks = { {128 * 1024, 1} },
6133 .block_erase = spi_block_erase_c7,
6134 }
6135 },
6136 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6137 .unlock = spi_disable_blockprotect_bp2_srwd,
6138 .write = spi_chip_write_256,
6139 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6140 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6141 },
6142
6143 {
6144 .vendor = "Fudan",
6145 .name = "FM25F02(A)",
6146 .bustype = BUS_SPI,
6147 .manufacture_id = FUDAN_ID_NOPREFIX,
6148 .model_id = FUDAN_FM25F02,
6149 .total_size = 256,
6150 .page_size = 256,
6151 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6152 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6153 .tested = TEST_UNTESTED,
6154 .probe = probe_spi_rdid,
6155 .probe_timing = TIMING_ZERO,
6156 .block_erasers = {
6157 {
6158 .eraseblocks = { {4 * 1024, 64} },
6159 .block_erase = spi_block_erase_20,
6160 }, {
6161 .eraseblocks = { {32 * 1024, 8} },
6162 .block_erase = spi_block_erase_52,
6163 }, {
6164 .eraseblocks = { {64 * 1024, 4} },
6165 .block_erase = spi_block_erase_d8,
6166 }, {
6167 .eraseblocks = { {1024 * 256, 1} },
6168 .block_erase = spi_block_erase_60,
6169 }, {
6170 .eraseblocks = { {1024 * 256, 1} },
6171 .block_erase = spi_block_erase_c7,
6172 },
6173 },
6174 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6175 .unlock = spi_disable_blockprotect_bp2_srwd,
6176 .write = spi_chip_write_256,
6177 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6178 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6179 },
6180
6181 {
6182 .vendor = "Fudan",
6183 .name = "FM25F04(A)",
6184 .bustype = BUS_SPI,
6185 .manufacture_id = FUDAN_ID_NOPREFIX,
6186 .model_id = FUDAN_FM25F04,
6187 .total_size = 512,
6188 .page_size = 256,
6189 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6190 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6191 .tested = TEST_UNTESTED,
6192 .probe = probe_spi_rdid,
6193 .probe_timing = TIMING_ZERO,
6194 .block_erasers = {
6195 {
6196 .eraseblocks = { {4 * 1024, 128} },
6197 .block_erase = spi_block_erase_20,
6198 }, {
6199 .eraseblocks = { {32 * 1024, 16} },
6200 .block_erase = spi_block_erase_52,
6201 }, {
6202 .eraseblocks = { {64 * 1024, 8} },
6203 .block_erase = spi_block_erase_d8,
6204 }, {
6205 .eraseblocks = { {1024 * 512, 1} },
6206 .block_erase = spi_block_erase_60,
6207 }, {
6208 .eraseblocks = { {1024 * 512, 1} },
6209 .block_erase = spi_block_erase_c7,
6210 },
6211 },
6212 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6213 .unlock = spi_disable_blockprotect_bp2_srwd,
6214 .write = spi_chip_write_256,
6215 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6216 .voltage = {2700, 3600},
6217 },
6218
6219 {
6220 .vendor = "Fudan",
6221 .name = "FM25Q08",
6222 .bustype = BUS_SPI,
6223 .manufacture_id = FUDAN_ID_NOPREFIX,
6224 .model_id = FUDAN_FM25Q08,
6225 .total_size = 1024,
6226 .page_size = 256,
6227 /* supports SFDP */
6228 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006229 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6230 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006231 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006232 .tested = TEST_UNTESTED,
6233 .probe = probe_spi_rdid,
6234 .probe_timing = TIMING_ZERO,
6235 .block_erasers = {
6236 {
6237 .eraseblocks = { {4 * 1024, 256} },
6238 .block_erase = spi_block_erase_20,
6239 }, {
6240 .eraseblocks = { {32 * 1024, 32} },
6241 .block_erase = spi_block_erase_52,
6242 }, {
6243 .eraseblocks = { {64 * 1024, 16} },
6244 .block_erase = spi_block_erase_d8,
6245 }, {
6246 .eraseblocks = { {1024 * 1024, 1} },
6247 .block_erase = spi_block_erase_60,
6248 }, {
6249 .eraseblocks = { {1024 * 1024, 1} },
6250 .block_erase = spi_block_erase_c7,
6251 },
6252 },
Nico Huber226bb872024-04-09 23:30:34 +02006253 .reg_bits =
6254 {
6255 .qe = {STATUS2, 1, RW},
6256 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006257 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6258 .unlock = spi_disable_blockprotect_bp2_srwd,
6259 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006260 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006261 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006262 .prepare_access = spi_prepare_io,
6263 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006264 },
6265
6266 {
6267 .vendor = "Fudan",
6268 .name = "FM25Q16",
6269 .bustype = BUS_SPI,
6270 .manufacture_id = FUDAN_ID_NOPREFIX,
6271 .model_id = FUDAN_FM25Q16,
6272 .total_size = 2048,
6273 .page_size = 256,
6274 /* supports SFDP */
6275 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006276 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6277 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006278 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006279 .tested = TEST_UNTESTED,
6280 .probe = probe_spi_rdid,
6281 .probe_timing = TIMING_ZERO,
6282 .block_erasers = {
6283 {
6284 .eraseblocks = { {4 * 1024, 512} },
6285 .block_erase = spi_block_erase_20,
6286 }, {
6287 .eraseblocks = { {32 * 1024, 64} },
6288 .block_erase = spi_block_erase_52,
6289 }, {
6290 .eraseblocks = { {64 * 1024, 32} },
6291 .block_erase = spi_block_erase_d8,
6292 }, {
6293 .eraseblocks = { {2 * 1024 * 1024, 1} },
6294 .block_erase = spi_block_erase_60,
6295 }, {
6296 .eraseblocks = { {2 * 1024 * 1024, 1} },
6297 .block_erase = spi_block_erase_c7,
6298 }
6299 },
Nico Huber226bb872024-04-09 23:30:34 +02006300 .reg_bits =
6301 {
6302 .qe = {STATUS2, 1, RW},
6303 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006304 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6305 .unlock = spi_disable_blockprotect_bp2_srwd,
6306 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006307 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006308 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006309 .prepare_access = spi_prepare_io,
6310 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006311 },
6312
6313 {
6314 .vendor = "Fudan",
6315 .name = "FM25Q32",
6316 .bustype = BUS_SPI,
6317 .manufacture_id = FUDAN_ID_NOPREFIX,
6318 .model_id = FUDAN_FM25Q32,
6319 .total_size = 4096,
6320 .page_size = 256,
6321 /* supports SFDP */
6322 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006323 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6324 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006325 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006326 .tested = TEST_UNTESTED,
6327 .probe = probe_spi_rdid,
6328 .probe_timing = TIMING_ZERO,
6329 .block_erasers = {
6330 {
6331 .eraseblocks = { {4 * 1024, 1024} },
6332 .block_erase = spi_block_erase_20,
6333 }, {
6334 .eraseblocks = { {32 * 1024, 128} },
6335 .block_erase = spi_block_erase_52,
6336 }, {
6337 .eraseblocks = { {64 * 1024, 64} },
6338 .block_erase = spi_block_erase_d8,
6339 }, {
6340 .eraseblocks = { {4 * 1024 * 1024, 1} },
6341 .block_erase = spi_block_erase_60,
6342 }, {
6343 .eraseblocks = { {4 * 1024 * 1024, 1} },
6344 .block_erase = spi_block_erase_c7,
6345 },
6346 },
Nico Huber226bb872024-04-09 23:30:34 +02006347 .reg_bits =
6348 {
6349 .qe = {STATUS2, 1, RW},
6350 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006351 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6352 .unlock = spi_disable_blockprotect_bp2_srwd,
6353 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006354 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006355 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006356 .prepare_access = spi_prepare_io,
6357 .finish_access = spi_finish_io,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006358 },
6359
6360 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006361 .vendor = "Fujitsu",
6362 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006363 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006364 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006365 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006366 .total_size = 512,
6367 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006368 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006369 .tested = TEST_UNTESTED,
6370 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006371 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006372 .block_erasers =
6373 {
6374 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006375 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006376 {16 * 1024, 1},
6377 {8 * 1024, 2},
6378 {32 * 1024, 1},
6379 {64 * 1024, 7},
6380 },
Sean Nelson35727f72010-01-28 23:55:12 +00006381 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006382 }, {
6383 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006384 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006385 },
6386 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006387 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006388 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006389 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006390 .prepare_access = prepare_memory_access,
6391 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006392 },
6393
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006394 {
6395 .vendor = "Fujitsu",
6396 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006397 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006398 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006399 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006400 .total_size = 512,
6401 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006402 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006403 .tested = TEST_UNTESTED,
6404 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006405 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006406 .block_erasers =
6407 {
6408 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006409 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006410 {64 * 1024, 7},
6411 {32 * 1024, 1},
6412 {8 * 1024, 2},
6413 {16 * 1024, 1},
6414 },
Sean Nelson35727f72010-01-28 23:55:12 +00006415 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006416 }, {
6417 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006418 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006419 },
6420 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006421 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006422 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006423 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006424 .prepare_access = prepare_memory_access,
6425 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006426 },
6427
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006428 {
Sean Nelson35727f72010-01-28 23:55:12 +00006429 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006430 .vendor = "Fujitsu",
6431 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006432 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006433 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006434 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006435 .total_size = 512,
6436 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006437 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00006438 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006439 .probe = probe_jedec,
6440 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006441 .block_erasers =
6442 {
6443 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006444 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006445 {16 * 1024, 1},
6446 {8 * 1024, 2},
6447 {32 * 1024, 1},
6448 {64 * 1024, 7},
6449 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006450 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006451 }, {
6452 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006453 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006454 },
6455 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006456 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006457 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006458 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006459 .prepare_access = prepare_memory_access,
6460 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006461 },
6462
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006463 {
6464 .vendor = "Fujitsu",
6465 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006466 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006467 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006468 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006469 .total_size = 512,
6470 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006471 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006472 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006473 .probe = probe_jedec,
6474 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006475 .block_erasers =
6476 {
6477 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006478 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006479 {64 * 1024, 7},
6480 {32 * 1024, 1},
6481 {8 * 1024, 2},
6482 {16 * 1024, 1},
6483 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006484 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006485 }, {
6486 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006487 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006488 },
6489 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006490 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006491 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006492 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006493 .prepare_access = prepare_memory_access,
6494 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006495 },
6496
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006497 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006498 .vendor = "Fujitsu",
6499 .name = "MBM29LV160BE",
6500 .bustype = BUS_PARALLEL,
6501 .manufacture_id = FUJITSU_ID,
6502 .model_id = FUJITSU_MBM29LV160BE,
6503 .total_size = 2 * 1024,
6504 .page_size = 0,
6505 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6506 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006507 .probe = probe_jedec,
6508 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006509 .block_erasers =
6510 {
6511 {
6512 .eraseblocks = {
6513 {16 * 1024, 1},
6514 {8 * 1024, 2},
6515 {32 * 1024, 1},
6516 {64 * 1024, 31},
6517 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006518 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006519 }, {
6520 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006521 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006522 },
6523 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006524 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006525 .read = read_memmapped,
6526 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006527 .prepare_access = prepare_memory_access,
6528 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006529 },
6530
6531 {
6532 .vendor = "Fujitsu",
6533 .name = "MBM29LV160TE",
6534 .bustype = BUS_PARALLEL,
6535 .manufacture_id = FUJITSU_ID,
6536 .model_id = FUJITSU_MBM29LV160TE,
6537 .total_size = 2 * 1024,
6538 .page_size = 0,
6539 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6540 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006541 .probe = probe_jedec,
6542 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006543 .block_erasers =
6544 {
6545 {
6546 .eraseblocks = {
6547 {64 * 1024, 31},
6548 {32 * 1024, 1},
6549 {8 * 1024, 2},
6550 {16 * 1024, 1},
6551 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006552 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006553 }, {
6554 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006555 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006556 },
6557 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006558 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006559 .read = read_memmapped,
6560 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006561 .prepare_access = prepare_memory_access,
6562 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006563 },
6564
6565 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006566 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006567 .name = "GD25B128B/GD25Q128B",
Roman Titov95edc892015-04-03 21:29:04 +00006568 .bustype = BUS_SPI,
6569 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006570 .model_id = GIGADEVICE_GD25Q128,
6571 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006572 .page_size = 256,
6573 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006574 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006575 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006576 .probe = probe_spi_rdid,
6577 .probe_timing = TIMING_ZERO,
6578 .block_erasers =
6579 {
6580 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006581 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006582 .block_erase = spi_block_erase_20,
6583 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006584 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006585 .block_erase = spi_block_erase_52,
6586 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006587 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006588 .block_erase = spi_block_erase_d8,
6589 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006590 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006591 .block_erase = spi_block_erase_60,
6592 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006593 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006594 .block_erase = spi_block_erase_c7,
6595 }
6596 },
Nico Huber4da971f2024-03-27 01:18:12 +01006597 .reg_bits =
6598 {
6599 .qe = {STATUS2, 1, RW}, /* RO 1 in GD25B128B case */
6600 },
Roman Titov95edc892015-04-03 21:29:04 +00006601 .printlock = spi_prettyprint_status_register_bp4_srwd,
6602 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6603 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006604 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006605 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006606 .prepare_access = spi_prepare_io,
6607 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006608 },
6609
6610 {
6611 .vendor = "GigaDevice",
Edward O'Callaghan981a3442021-06-22 11:16:55 +10006612 .name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
Roman Titov95edc892015-04-03 21:29:04 +00006613 .bustype = BUS_SPI,
6614 .manufacture_id = GIGADEVICE_ID,
Alan Green188127e2019-08-06 16:10:34 +10006615 .model_id = GIGADEVICE_GD25LQ128CD,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006616 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006617 .page_size = 256,
6618 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006619 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6620 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006621 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006622 .probe = probe_spi_rdid,
6623 .probe_timing = TIMING_ZERO,
6624 .block_erasers =
6625 {
6626 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006627 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006628 .block_erase = spi_block_erase_20,
6629 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006630 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006631 .block_erase = spi_block_erase_52,
6632 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006633 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006634 .block_erase = spi_block_erase_d8,
6635 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006636 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006637 .block_erase = spi_block_erase_60,
6638 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006639 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006640 .block_erase = spi_block_erase_c7,
6641 }
6642 },
6643 .printlock = spi_prettyprint_status_register_bp4_srwd,
6644 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6645 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006646 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006647 .voltage = {1695, 1950},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006648 .reg_bits =
6649 {
Nico Huber4da971f2024-03-27 01:18:12 +01006650 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006651 .srp = {STATUS1, 7, RW},
6652 .srl = {STATUS2, 0, RW},
6653 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6654 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6655 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6656 .cmp = {STATUS2, 6, RW},
6657 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006658 .wp_write_cfg = spi_wp_write_cfg,
6659 .wp_read_cfg = spi_wp_read_cfg,
6660 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006661 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02006662 .prepare_access = spi_prepare_io,
6663 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006664 },
6665
6666 {
6667 .vendor = "GigaDevice",
6668 .name = "GD25LQ16",
6669 .bustype = BUS_SPI,
6670 .manufacture_id = GIGADEVICE_ID,
6671 .model_id = GIGADEVICE_GD25LQ16,
6672 .total_size = 2048,
6673 .page_size = 256,
6674 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006675 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ16C */
6676 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00006677 .tested = TEST_UNTESTED,
6678 .probe = probe_spi_rdid,
6679 .probe_timing = TIMING_ZERO,
6680 .block_erasers =
6681 {
6682 {
6683 .eraseblocks = { {4 * 1024, 512} },
6684 .block_erase = spi_block_erase_20,
6685 }, {
6686 .eraseblocks = { {32 * 1024, 64} },
6687 .block_erase = spi_block_erase_52,
6688 }, {
6689 .eraseblocks = { {64 * 1024, 32} },
6690 .block_erase = spi_block_erase_d8,
6691 }, {
6692 .eraseblocks = { {2 * 1024 * 1024, 1} },
6693 .block_erase = spi_block_erase_60,
6694 }, {
6695 .eraseblocks = { {2 * 1024 * 1024, 1} },
6696 .block_erase = spi_block_erase_c7,
6697 }
6698 },
Nico Huber4da971f2024-03-27 01:18:12 +01006699 .reg_bits =
6700 {
6701 .qe = {STATUS2, 1, RW},
6702 },
Roman Titov95edc892015-04-03 21:29:04 +00006703 .printlock = spi_prettyprint_status_register_bp4_srwd,
6704 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6705 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006706 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006707 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006708 .prepare_access = spi_prepare_io,
6709 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006710 },
6711
6712 {
6713 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006714 .name = "GD25LQ32",
6715 .bustype = BUS_SPI,
6716 .manufacture_id = GIGADEVICE_ID,
6717 .model_id = GIGADEVICE_GD25LQ32,
6718 .total_size = 4096,
6719 .page_size = 256,
6720 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006721 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6722 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006723 .tested = TEST_OK_PREW,
6724 .probe = probe_spi_rdid,
6725 .probe_timing = TIMING_ZERO,
6726 .block_erasers =
6727 {
6728 {
6729 .eraseblocks = { {4 * 1024, 1024} },
6730 .block_erase = spi_block_erase_20,
6731 }, {
6732 .eraseblocks = { {32 * 1024, 128} },
6733 .block_erase = spi_block_erase_52,
6734 }, {
6735 .eraseblocks = { {64 * 1024, 64} },
6736 .block_erase = spi_block_erase_d8,
6737 }, {
6738 .eraseblocks = { {4 * 1024 * 1024, 1} },
6739 .block_erase = spi_block_erase_60,
6740 }, {
6741 .eraseblocks = { {4 * 1024 * 1024, 1} },
6742 .block_erase = spi_block_erase_c7,
6743 }
6744 },
Nico Huber4da971f2024-03-27 01:18:12 +01006745 .reg_bits =
6746 {
6747 .qe = {STATUS2, 1, RW},
6748 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006749 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006750 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6751 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006752 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006753 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006754 .prepare_access = spi_prepare_io,
6755 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006756 },
6757
6758 {
6759 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006760 .name = "GD25LQ40",
6761 .bustype = BUS_SPI,
6762 .manufacture_id = GIGADEVICE_ID,
6763 .model_id = GIGADEVICE_GD25LQ40,
6764 .total_size = 512,
6765 .page_size = 256,
6766 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006767 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ40B, LQ40C */
6768 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006769 .tested = TEST_UNTESTED,
6770 .probe = probe_spi_rdid,
6771 .probe_timing = TIMING_ZERO,
6772 .block_erasers =
6773 {
6774 {
6775 .eraseblocks = { {4 * 1024, 128} },
6776 .block_erase = spi_block_erase_20,
6777 }, {
6778 .eraseblocks = { {32 * 1024, 16} },
6779 .block_erase = spi_block_erase_52,
6780 }, {
6781 .eraseblocks = { {64 * 1024, 8} },
6782 .block_erase = spi_block_erase_d8,
6783 }, {
6784 .eraseblocks = { {512 * 1024, 1} },
6785 .block_erase = spi_block_erase_60,
6786 }, {
6787 .eraseblocks = { {512 * 1024, 1} },
6788 .block_erase = spi_block_erase_c7,
6789 }
6790 },
Nico Huber4da971f2024-03-27 01:18:12 +01006791 .reg_bits =
6792 {
6793 .qe = {STATUS2, 1, RW},
6794 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006795 .printlock = spi_prettyprint_status_register_bp4_srwd,
6796 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6797 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006798 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006799 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006800 .prepare_access = spi_prepare_io,
6801 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006802 },
6803
6804 {
6805 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00006806 .name = "GD25LQ64(B)",
6807 .bustype = BUS_SPI,
6808 .manufacture_id = GIGADEVICE_ID,
6809 .model_id = GIGADEVICE_GD25LQ64,
6810 .total_size = 8192,
6811 .page_size = 256,
6812 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006813 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6814 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006815 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006816 .probe = probe_spi_rdid,
6817 .probe_timing = TIMING_ZERO,
6818 .block_erasers =
6819 {
6820 {
6821 .eraseblocks = { {4 * 1024, 2048} },
6822 .block_erase = spi_block_erase_20,
6823 }, {
6824 .eraseblocks = { {32 * 1024, 256} },
6825 .block_erase = spi_block_erase_52,
6826 }, {
6827 .eraseblocks = { {64 * 1024, 128} },
6828 .block_erase = spi_block_erase_d8,
6829 }, {
6830 .eraseblocks = { {8 * 1024 * 1024, 1} },
6831 .block_erase = spi_block_erase_60,
6832 }, {
6833 .eraseblocks = { {8 * 1024 * 1024, 1} },
6834 .block_erase = spi_block_erase_c7,
6835 }
6836 },
6837 .printlock = spi_prettyprint_status_register_bp4_srwd,
6838 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6839 .write = spi_chip_write_256,
6840 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6841 .voltage = {1695, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006842 .reg_bits =
6843 {
Nico Huber4da971f2024-03-27 01:18:12 +01006844 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006845 .srp = {STATUS1, 7, RW},
6846 .srl = {STATUS2, 0, RW},
6847 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6848 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6849 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6850 .cmp = {STATUS2, 6, RW},
6851 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006852 .wp_write_cfg = spi_wp_write_cfg,
6853 .wp_read_cfg = spi_wp_read_cfg,
6854 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006855 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02006856 .prepare_access = spi_prepare_io,
6857 .finish_access = spi_finish_io,
Roman Titov95edc892015-04-03 21:29:04 +00006858 },
6859
6860 {
6861 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006862 .name = "GD25LQ80",
Roman Titov95edc892015-04-03 21:29:04 +00006863 .bustype = BUS_SPI,
6864 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006865 .model_id = GIGADEVICE_GD25LQ80,
6866 .total_size = 1024,
Roman Titov95edc892015-04-03 21:29:04 +00006867 .page_size = 256,
6868 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006869 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ80B, LQ80C */
6870 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00006871 .tested = TEST_UNTESTED,
6872 .probe = probe_spi_rdid,
6873 .probe_timing = TIMING_ZERO,
6874 .block_erasers =
6875 {
6876 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006877 .eraseblocks = { {4 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006878 .block_erase = spi_block_erase_20,
6879 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006880 .eraseblocks = { {32 * 1024, 32} },
Roman Titov95edc892015-04-03 21:29:04 +00006881 .block_erase = spi_block_erase_52,
6882 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006883 .eraseblocks = { {64 * 1024, 16} },
Roman Titov95edc892015-04-03 21:29:04 +00006884 .block_erase = spi_block_erase_d8,
6885 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006886 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006887 .block_erase = spi_block_erase_60,
6888 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006889 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006890 .block_erase = spi_block_erase_c7,
6891 }
6892 },
Nico Huber4da971f2024-03-27 01:18:12 +01006893 .reg_bits =
6894 {
6895 .qe = {STATUS2, 1, RW},
6896 },
Roman Titov95edc892015-04-03 21:29:04 +00006897 .printlock = spi_prettyprint_status_register_bp4_srwd,
6898 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6899 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006900 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006901 .voltage = {1695, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02006902 .prepare_access = spi_prepare_io,
6903 .finish_access = spi_finish_io,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006904 },
6905
6906 {
6907 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006908 .name = "GD25Q10",
6909 .bustype = BUS_SPI,
6910 .manufacture_id = GIGADEVICE_ID,
6911 .model_id = GIGADEVICE_GD25Q10,
6912 .total_size = 128,
6913 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01006914 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006915 .tested = TEST_UNTESTED,
6916 .probe = probe_spi_rdid,
6917 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006918 .block_erasers =
6919 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006920 {
6921 .eraseblocks = { {4 * 1024, 32} },
6922 .block_erase = spi_block_erase_20,
6923 }, {
6924 .eraseblocks = { {32 * 1024, 4} },
6925 .block_erase = spi_block_erase_52,
6926 }, {
6927 .eraseblocks = { {64 * 1024, 2} },
6928 .block_erase = spi_block_erase_d8,
6929 }, {
6930 .eraseblocks = { {128 * 1024, 1} },
6931 .block_erase = spi_block_erase_60,
6932 }, {
6933 .eraseblocks = { {128 * 1024, 1} },
6934 .block_erase = spi_block_erase_c7,
6935 }
6936 },
Nico Huber4da971f2024-03-27 01:18:12 +01006937 .reg_bits =
6938 {
6939 .qe = {STATUS2, 1, RW},
6940 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006941 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006942 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6943 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006944 .read = spi_chip_read,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006945 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02006946 .prepare_access = spi_prepare_io,
6947 .finish_access = spi_finish_io,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006948 },
6949
6950 {
6951 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01006952 .name = "GD25Q127C",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006953 .bustype = BUS_SPI,
6954 .manufacture_id = GIGADEVICE_ID,
6955 .model_id = GIGADEVICE_GD25Q128,
6956 .total_size = 16384,
6957 .page_size = 256,
6958 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
Nico Huber1412d9f2024-01-06 18:25:49 +01006959 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006960 .tested = TEST_OK_PREWB,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006961 .probe = probe_spi_rdid,
6962 .probe_timing = TIMING_ZERO,
6963 .block_erasers =
6964 {
6965 {
6966 .eraseblocks = { {4 * 1024, 4096} },
6967 .block_erase = spi_block_erase_20,
6968 }, {
6969 .eraseblocks = { {32 * 1024, 512} },
6970 .block_erase = spi_block_erase_52,
6971 }, {
6972 .eraseblocks = { {64 * 1024, 256} },
6973 .block_erase = spi_block_erase_d8,
6974 }, {
6975 .eraseblocks = { {16 * 1024 * 1024, 1} },
6976 .block_erase = spi_block_erase_60,
6977 }, {
6978 .eraseblocks = { {16 * 1024 * 1024, 1} },
6979 .block_erase = spi_block_erase_c7,
6980 }
6981 },
6982 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6983 .printlock = spi_prettyprint_status_register_bp4_srwd,
6984 .unlock = spi_disable_blockprotect_bp4_srwd,
6985 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006986 .read = spi_chip_read,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006987 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006988 .reg_bits =
6989 {
Nico Huber4da971f2024-03-27 01:18:12 +01006990 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006991 .srp = {STATUS1, 7, RW},
6992 .srl = {STATUS2, 0, RW},
6993 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6994 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6995 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6996 .cmp = {STATUS2, 6, RW},
6997 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006998 .wp_write_cfg = spi_wp_write_cfg,
6999 .wp_read_cfg = spi_wp_read_cfg,
7000 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007001 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007002 .prepare_access = spi_prepare_io,
7003 .finish_access = spi_finish_io,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007004 },
7005
7006 {
7007 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01007008 .name = "GD25Q128C",
7009 .bustype = BUS_SPI,
7010 .manufacture_id = GIGADEVICE_ID,
7011 .model_id = GIGADEVICE_GD25Q128,
7012 .total_size = 16384,
7013 .page_size = 256,
7014 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
7015 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
7016 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
7017 .tested = TEST_OK_PREWB,
7018 .probe = probe_spi_rdid,
7019 .probe_timing = TIMING_ZERO,
7020 .block_erasers =
7021 {
7022 {
7023 .eraseblocks = { {4 * 1024, 4096} },
7024 .block_erase = spi_block_erase_20,
7025 }, {
7026 .eraseblocks = { {32 * 1024, 512} },
7027 .block_erase = spi_block_erase_52,
7028 }, {
7029 .eraseblocks = { {64 * 1024, 256} },
7030 .block_erase = spi_block_erase_d8,
7031 }, {
7032 .eraseblocks = { {16 * 1024 * 1024, 1} },
7033 .block_erase = spi_block_erase_60,
7034 }, {
7035 .eraseblocks = { {16 * 1024 * 1024, 1} },
7036 .block_erase = spi_block_erase_c7,
7037 }
7038 },
7039 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
7040 .printlock = spi_prettyprint_status_register_bp4_srwd,
7041 .unlock = spi_disable_blockprotect_bp4_srwd,
7042 .write = spi_chip_write_256,
7043 .read = spi_chip_read,
7044 .voltage = {2700, 3600},
7045 .reg_bits =
7046 {
7047 .qe = {STATUS2, 1, RW},
7048 .srp = {STATUS1, 7, RW},
7049 .srl = {STATUS2, 0, RW},
7050 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7051 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7052 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7053 .cmp = {STATUS2, 6, RW},
7054 },
7055 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007056 .prepare_access = spi_prepare_io,
7057 .finish_access = spi_finish_io,
Nico Huber68573af2024-01-06 18:28:22 +01007058 },
7059
7060 {
7061 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007062 .name = "GD25Q16(B)",
7063 .bustype = BUS_SPI,
7064 .manufacture_id = GIGADEVICE_ID,
7065 .model_id = GIGADEVICE_GD25Q16,
7066 .total_size = 2048,
7067 .page_size = 256,
7068 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007070 .tested = TEST_OK_PREW,
7071 .probe = probe_spi_rdid,
7072 .probe_timing = TIMING_ZERO,
7073 .block_erasers =
7074 {
7075 {
7076 .eraseblocks = { {4 * 1024, 512} },
7077 .block_erase = spi_block_erase_20,
7078 }, {
7079 .eraseblocks = { {32 * 1024, 64} },
7080 .block_erase = spi_block_erase_52,
7081 }, {
7082 .eraseblocks = { {64 * 1024, 32} },
7083 .block_erase = spi_block_erase_d8,
7084 }, {
7085 .eraseblocks = { {2 * 1024 * 1024, 1} },
7086 .block_erase = spi_block_erase_60,
7087 }, {
7088 .eraseblocks = { {2 * 1024 * 1024, 1} },
7089 .block_erase = spi_block_erase_c7,
7090 }
7091 },
Nico Huber4da971f2024-03-27 01:18:12 +01007092 .reg_bits =
7093 {
7094 .qe = {STATUS2, 1, RW},
7095 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007096 .printlock = spi_prettyprint_status_register_bp4_srwd,
7097 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7098 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007099 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007100 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007101 .prepare_access = spi_prepare_io,
7102 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007103 },
7104
7105 {
7106 .vendor = "GigaDevice",
7107 .name = "GD25Q20(B)",
7108 .bustype = BUS_SPI,
7109 .manufacture_id = GIGADEVICE_ID,
7110 .model_id = GIGADEVICE_GD25Q20,
7111 .total_size = 256,
7112 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007113 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007114 .tested = TEST_OK_PREW,
7115 .probe = probe_spi_rdid,
7116 .probe_timing = TIMING_ZERO,
7117 .block_erasers =
7118 {
7119 {
7120 .eraseblocks = { {4 * 1024, 64} },
7121 .block_erase = spi_block_erase_20,
7122 }, {
7123 .eraseblocks = { {32 * 1024, 8} },
7124 .block_erase = spi_block_erase_52,
7125 }, {
7126 .eraseblocks = { {64 * 1024, 4} },
7127 .block_erase = spi_block_erase_d8,
7128 }, {
7129 .eraseblocks = { {256 * 1024, 1} },
7130 .block_erase = spi_block_erase_60,
7131 }, {
7132 .eraseblocks = { {256 * 1024, 1} },
7133 .block_erase = spi_block_erase_c7,
7134 }
7135 },
Nico Huber4da971f2024-03-27 01:18:12 +01007136 .reg_bits = {
7137 .qe = {STATUS2, 1, RW},
7138 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007139 .printlock = spi_prettyprint_status_register_bp4_srwd,
7140 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7141 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007142 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007143 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007144 .prepare_access = spi_prepare_io,
7145 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007146 },
7147
7148 {
7149 .vendor = "GigaDevice",
Nikolai Artemiev3ca0af02022-06-17 15:10:18 +10007150 .name = "GD25Q256D/GD25Q256E",
Alan Green86fc9cf2019-08-26 15:02:12 +10007151 .bustype = BUS_SPI,
7152 .manufacture_id = GIGADEVICE_ID,
7153 .model_id = GIGADEVICE_GD25Q256D,
7154 .total_size = 32768,
7155 .page_size = 256,
Nikolai Artemievb931e7a2022-12-05 13:06:14 +11007156 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA |
Nico Huber4da971f2024-03-27 01:18:12 +01007157 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
7158 FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007159 .tested = TEST_OK_PREWB,
Alan Green86fc9cf2019-08-26 15:02:12 +10007160 .probe = probe_spi_rdid,
7161 .probe_timing = TIMING_ZERO,
7162 .block_erasers =
7163 {
7164 {
7165 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber5374dc32019-10-04 16:16:15 +02007166 .block_erase = spi_block_erase_21,
7167 }, {
7168 .eraseblocks = { {4 * 1024, 8192} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007169 .block_erase = spi_block_erase_20,
7170 }, {
7171 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber5374dc32019-10-04 16:16:15 +02007172 .block_erase = spi_block_erase_5c,
7173 }, {
7174 .eraseblocks = { {32 * 1024, 1024} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007175 .block_erase = spi_block_erase_52,
7176 }, {
7177 .eraseblocks = { {64 * 1024, 512} },
Nico Huber5374dc32019-10-04 16:16:15 +02007178 .block_erase = spi_block_erase_dc,
7179 }, {
7180 .eraseblocks = { {64 * 1024, 512} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007181 .block_erase = spi_block_erase_d8,
7182 }, {
7183 .eraseblocks = { {32 * 1024 * 1024, 1} },
7184 .block_erase = spi_block_erase_60,
7185 }, {
7186 .eraseblocks = { {32 * 1024 * 1024, 1} },
7187 .block_erase = spi_block_erase_c7,
7188 }
7189 },
7190 .printlock = spi_prettyprint_status_register_bp3_srwd,
7191 .unlock = spi_disable_blockprotect,
7192 .write = spi_chip_write_256,
7193 .read = spi_chip_read,
7194 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007195 .reg_bits =
7196 {
Nico Huber4da971f2024-03-27 01:18:12 +01007197 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007198 .srp = {STATUS1, 7, RW},
7199 .srl = {STATUS2, 6, RW},
7200 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
7201 .tb = {STATUS1, 6, RW},
7202 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007203 .wp_write_cfg = spi_wp_write_cfg,
7204 .wp_read_cfg = spi_wp_read_cfg,
7205 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007206 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007207 .prepare_access = spi_prepare_io,
7208 .finish_access = spi_finish_io,
Alan Green86fc9cf2019-08-26 15:02:12 +10007209 },
7210
7211 {
7212 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007213 .name = "GD25Q32(B)",
7214 .bustype = BUS_SPI,
7215 .manufacture_id = GIGADEVICE_ID,
7216 .model_id = GIGADEVICE_GD25Q32,
7217 .total_size = 4096,
7218 .page_size = 256,
7219 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007220 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007221 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007222 .probe = probe_spi_rdid,
7223 .probe_timing = TIMING_ZERO,
7224 .block_erasers =
7225 {
7226 {
7227 .eraseblocks = { {4 * 1024, 1024} },
7228 .block_erase = spi_block_erase_20,
7229 }, {
7230 .eraseblocks = { {32 * 1024, 128} },
7231 .block_erase = spi_block_erase_52,
7232 }, {
7233 .eraseblocks = { {64 * 1024, 64} },
7234 .block_erase = spi_block_erase_d8,
7235 }, {
7236 .eraseblocks = { {4 * 1024 * 1024, 1} },
7237 .block_erase = spi_block_erase_60,
7238 }, {
7239 .eraseblocks = { {4 * 1024 * 1024, 1} },
7240 .block_erase = spi_block_erase_c7,
7241 }
7242 },
7243 .printlock = spi_prettyprint_status_register_bp4_srwd,
7244 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7245 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007246 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007247 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007248 .reg_bits =
7249 {
Nico Huber4da971f2024-03-27 01:18:12 +01007250 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007251 .srp = {STATUS1, 7, RW},
7252 .srl = {STATUS2, 0, RW},
7253 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7254 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7255 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7256 .cmp = {STATUS2, 6, RW},
7257 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007258 .wp_write_cfg = spi_wp_write_cfg,
7259 .wp_read_cfg = spi_wp_read_cfg,
7260 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007261 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007262 .prepare_access = spi_prepare_io,
7263 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007264 },
7265
7266 {
7267 .vendor = "GigaDevice",
7268 .name = "GD25Q40(B)",
7269 .bustype = BUS_SPI,
7270 .manufacture_id = GIGADEVICE_ID,
7271 .model_id = GIGADEVICE_GD25Q40,
7272 .total_size = 512,
7273 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007274 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Simon Buhrow551664c2022-03-09 16:09:08 +01007275 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007276 .probe = probe_spi_rdid,
7277 .probe_timing = TIMING_ZERO,
7278 .block_erasers =
7279 {
7280 {
7281 .eraseblocks = { {4 * 1024, 128} },
7282 .block_erase = spi_block_erase_20,
7283 }, {
7284 .eraseblocks = { {32 * 1024, 16} },
7285 .block_erase = spi_block_erase_52,
7286 }, {
7287 .eraseblocks = { {64 * 1024, 8} },
7288 .block_erase = spi_block_erase_d8,
7289 }, {
7290 .eraseblocks = { {512 * 1024, 1} },
7291 .block_erase = spi_block_erase_60,
7292 }, {
7293 .eraseblocks = { {512 * 1024, 1} },
7294 .block_erase = spi_block_erase_c7,
7295 }
7296 },
Nico Huber4da971f2024-03-27 01:18:12 +01007297 .reg_bits =
7298 {
7299 .qe = {STATUS2, 1, RW},
7300 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007301 .printlock = spi_prettyprint_status_register_bp4_srwd,
7302 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7303 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007304 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007305 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007306 .prepare_access = spi_prepare_io,
7307 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007308 },
7309
7310 {
7311 .vendor = "GigaDevice",
7312 .name = "GD25Q512",
7313 .bustype = BUS_SPI,
7314 .manufacture_id = GIGADEVICE_ID,
7315 .model_id = GIGADEVICE_GD25Q512,
7316 .total_size = 64,
7317 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007318 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007319 .tested = TEST_OK_PREW,
7320 .probe = probe_spi_rdid,
7321 .probe_timing = TIMING_ZERO,
7322 .block_erasers =
7323 {
7324 {
7325 .eraseblocks = { {4 * 1024, 16} },
7326 .block_erase = spi_block_erase_20,
7327 }, {
7328 .eraseblocks = { {32 * 1024, 2} },
7329 .block_erase = spi_block_erase_52,
7330 }, {
7331 .eraseblocks = { {64 * 1024, 1} },
7332 .block_erase = spi_block_erase_60,
7333 }, {
7334 .eraseblocks = { {64 * 1024, 1} },
7335 .block_erase = spi_block_erase_c7,
7336 }
7337 },
Nico Huber4da971f2024-03-27 01:18:12 +01007338 .reg_bits =
7339 {
7340 .qe = {STATUS2, 1, RW},
7341 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007342 .printlock = spi_prettyprint_status_register_bp4_srwd,
7343 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7344 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007345 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007346 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007347 .prepare_access = spi_prepare_io,
7348 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007349 },
7350
7351 {
7352 .vendor = "GigaDevice",
7353 .name = "GD25Q64(B)",
7354 .bustype = BUS_SPI,
7355 .manufacture_id = GIGADEVICE_ID,
7356 .model_id = GIGADEVICE_GD25Q64,
7357 .total_size = 8192,
7358 .page_size = 256,
7359 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007361 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007362 .probe = probe_spi_rdid,
7363 .probe_timing = TIMING_ZERO,
7364 .block_erasers =
7365 {
7366 {
7367 .eraseblocks = { {4 * 1024, 2048} },
7368 .block_erase = spi_block_erase_20,
7369 }, {
7370 .eraseblocks = { {32 * 1024, 256} },
7371 .block_erase = spi_block_erase_52,
7372 }, {
7373 .eraseblocks = { {64 * 1024, 128} },
7374 .block_erase = spi_block_erase_d8,
7375 }, {
7376 .eraseblocks = { {8 * 1024 * 1024, 1} },
7377 .block_erase = spi_block_erase_60,
7378 }, {
7379 .eraseblocks = { {8 * 1024 * 1024, 1} },
7380 .block_erase = spi_block_erase_c7,
7381 }
7382 },
7383 .printlock = spi_prettyprint_status_register_bp4_srwd,
7384 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7385 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007386 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007387 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007388 .reg_bits =
7389 {
Nico Huber4da971f2024-03-27 01:18:12 +01007390 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007391 .srp = {STATUS1, 7, RW},
7392 .srl = {STATUS2, 0, RW},
7393 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7394 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7395 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7396 .cmp = {STATUS2, 6, RW},
7397 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007398 .wp_write_cfg = spi_wp_write_cfg,
7399 .wp_read_cfg = spi_wp_read_cfg,
7400 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007401 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +02007402 .prepare_access = spi_prepare_io,
7403 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007404 },
7405
7406 {
7407 .vendor = "GigaDevice",
7408 .name = "GD25Q80(B)",
7409 .bustype = BUS_SPI,
7410 .manufacture_id = GIGADEVICE_ID,
7411 .model_id = GIGADEVICE_GD25Q80,
7412 .total_size = 1024,
7413 .page_size = 256,
7414 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007416 .tested = TEST_OK_PREW,
7417 .probe = probe_spi_rdid,
7418 .probe_timing = TIMING_ZERO,
7419 .block_erasers =
7420 {
7421 {
7422 .eraseblocks = { {4 * 1024, 256} },
7423 .block_erase = spi_block_erase_20,
7424 }, {
7425 .eraseblocks = { {32 * 1024, 32} },
7426 .block_erase = spi_block_erase_52,
7427 }, {
7428 .eraseblocks = { {64 * 1024, 16} },
7429 .block_erase = spi_block_erase_d8,
7430 }, {
7431 .eraseblocks = { {1024 * 1024, 1} },
7432 .block_erase = spi_block_erase_60,
7433 }, {
7434 .eraseblocks = { {1024 * 1024, 1} },
7435 .block_erase = spi_block_erase_c7,
7436 }
7437 },
Nico Huber4da971f2024-03-27 01:18:12 +01007438 .reg_bits =
7439 {
7440 .qe = {STATUS2, 1, RW},
7441 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007442 .printlock = spi_prettyprint_status_register_bp4_srwd,
7443 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7444 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007445 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007446 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007447 .prepare_access = spi_prepare_io,
7448 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007449 },
7450
7451 {
7452 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007453 .name = "GD25T80",
7454 .bustype = BUS_SPI,
7455 .manufacture_id = GIGADEVICE_ID,
7456 .model_id = GIGADEVICE_GD25T80,
7457 .total_size = 1024,
7458 .page_size = 256,
7459 /* OTP: 256B total; enter 0x3A */
7460 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7461 .tested = TEST_UNTESTED,
7462 .probe = probe_spi_rdid,
7463 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10007464 .block_erasers =
7465 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007466 {
7467 .eraseblocks = { {4 * 1024, 256} },
7468 .block_erase = spi_block_erase_20,
7469 }, {
7470 .eraseblocks = { {64 * 1024, 16} },
7471 .block_erase = spi_block_erase_52,
7472 }, {
7473 .eraseblocks = { {64 * 1024, 16} },
7474 .block_erase = spi_block_erase_d8,
7475 }, {
7476 .eraseblocks = { {1024 * 1024, 1} },
7477 .block_erase = spi_block_erase_60,
7478 }, {
7479 .eraseblocks = { {1024 * 1024, 1} },
7480 .block_erase = spi_block_erase_c7,
7481 }
7482 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00007483 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007484 .unlock = spi_disable_blockprotect,
7485 .write = spi_chip_write_256,
7486 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00007487 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007488 },
7489
7490 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007491 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007492 .name = "GD25VQ16C",
7493 .bustype = BUS_SPI,
7494 .manufacture_id = GIGADEVICE_ID,
7495 .model_id = GIGADEVICE_GD25VQ16C,
7496 .total_size = 2 * 1024,
7497 .page_size = 256,
7498 /* Supports SFDP */
7499 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007500 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007501 .tested = TEST_UNTESTED,
7502 .probe = probe_spi_rdid,
7503 .probe_timing = TIMING_ZERO,
7504 .block_erasers =
7505 {
7506 {
7507 .eraseblocks = { { 4 * 1024, 512} },
7508 .block_erase = spi_block_erase_20,
7509 }, {
7510 .eraseblocks = { { 32 * 1024, 64} },
7511 .block_erase = spi_block_erase_52,
7512 }, {
7513 .eraseblocks = { { 64 * 1024, 32} },
7514 .block_erase = spi_block_erase_d8,
7515 }, {
7516 .eraseblocks = { {2 * 1024 * 1024, 1} },
7517 .block_erase = spi_block_erase_60,
7518 }, {
7519 .eraseblocks = { {2 * 1024 * 1024, 1} },
7520 .block_erase = spi_block_erase_c7,
7521 }
7522 },
Nico Huber4da971f2024-03-27 01:18:12 +01007523 .reg_bits =
7524 {
7525 .qe = {STATUS2, 1, RW},
7526 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007527 .printlock = spi_prettyprint_status_register_bp4_srwd,
7528 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7529 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007530 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007531 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007532 .prepare_access = spi_prepare_io,
7533 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007534 },
7535
7536 {
7537 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007538 .name = "GD25VQ21B",
7539 .bustype = BUS_SPI,
7540 .manufacture_id = GIGADEVICE_ID,
7541 .model_id = GIGADEVICE_GD25VQ21B,
7542 .total_size = 256,
7543 .page_size = 256,
7544 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007545 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
7546 FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007547 .tested = TEST_UNTESTED,
7548 .probe = probe_spi_rdid,
7549 .probe_timing = TIMING_ZERO,
7550 .block_erasers =
7551 {
7552 {
7553 .eraseblocks = { { 4 * 1024, 64} },
7554 .block_erase = spi_block_erase_20,
7555 }, {
7556 .eraseblocks = { { 32 * 1024, 8} },
7557 .block_erase = spi_block_erase_52,
7558 }, {
7559 .eraseblocks = { { 64 * 1024, 4} },
7560 .block_erase = spi_block_erase_d8,
7561 }, {
7562 .eraseblocks = { {256 * 1024, 1} },
7563 .block_erase = spi_block_erase_60,
7564 }, {
7565 .eraseblocks = { {256 * 1024, 1} },
7566 .block_erase = spi_block_erase_c7,
7567 }
7568 },
Nico Huber4da971f2024-03-27 01:18:12 +01007569 .reg_bits =
7570 {
7571 .qe = {STATUS2, 1, RW},
7572 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007573 .printlock = spi_prettyprint_status_register_bp4_srwd,
7574 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7575 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007576 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007577 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007578 .prepare_access = spi_prepare_io,
7579 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007580 },
7581
7582 {
7583 .vendor = "GigaDevice",
7584 .name = "GD25VQ40C",
7585 .bustype = BUS_SPI,
7586 .manufacture_id = GIGADEVICE_ID,
7587 .model_id = GIGADEVICE_GD25VQ41B,
7588 .total_size = 512,
7589 .page_size = 256,
7590 /* Supports SFDP */
7591 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007592 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007593 .tested = TEST_UNTESTED,
7594 .probe = probe_spi_rdid,
7595 .probe_timing = TIMING_ZERO,
7596 .block_erasers =
7597 {
7598 {
7599 .eraseblocks = { { 4 * 1024, 128} },
7600 .block_erase = spi_block_erase_20,
7601 }, {
7602 .eraseblocks = { { 32 * 1024, 16} },
7603 .block_erase = spi_block_erase_52,
7604 }, {
7605 .eraseblocks = { { 64 * 1024, 8} },
7606 .block_erase = spi_block_erase_d8,
7607 }, {
7608 .eraseblocks = { {512 * 1024, 1} },
7609 .block_erase = spi_block_erase_60,
7610 }, {
7611 .eraseblocks = { {512 * 1024, 1} },
7612 .block_erase = spi_block_erase_c7,
7613 }
7614 },
Nico Huber4da971f2024-03-27 01:18:12 +01007615 .reg_bits =
7616 {
7617 .qe = {STATUS2, 1, RW},
7618 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007619 .printlock = spi_prettyprint_status_register_bp4_srwd,
7620 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7621 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007622 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007623 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007624 .prepare_access = spi_prepare_io,
7625 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007626 },
7627
7628 {
7629 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007630 .name = "GD25VQ41B",
7631 .bustype = BUS_SPI,
7632 .manufacture_id = GIGADEVICE_ID,
7633 .model_id = GIGADEVICE_GD25VQ41B,
7634 .total_size = 512,
7635 .page_size = 256,
7636 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007637 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
7638 FEATURE_OTP | FEATURE_QIO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007639 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007640 .probe = probe_spi_rdid,
7641 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007642 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007643 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00007644 {
7645 .eraseblocks = { { 4 * 1024, 128} },
7646 .block_erase = spi_block_erase_20,
7647 }, {
7648 .eraseblocks = { { 32 * 1024, 16} },
7649 .block_erase = spi_block_erase_52,
7650 }, {
7651 .eraseblocks = { { 64 * 1024, 8} },
7652 .block_erase = spi_block_erase_d8,
7653 }, {
7654 .eraseblocks = { {512 * 1024, 1} },
7655 .block_erase = spi_block_erase_60,
7656 }, {
7657 .eraseblocks = { {512 * 1024, 1} },
7658 .block_erase = spi_block_erase_c7,
7659 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007660 },
Nico Huber4da971f2024-03-27 01:18:12 +01007661 .reg_bits =
7662 {
7663 .qe = {STATUS2, 1, RW},
7664 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007665 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007666 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7667 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007668 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007669 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007670 .prepare_access = spi_prepare_io,
7671 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007672 },
7673
7674 {
7675 .vendor = "GigaDevice",
7676 .name = "GD25VQ80C",
7677 .bustype = BUS_SPI,
7678 .manufacture_id = GIGADEVICE_ID,
7679 .model_id = GIGADEVICE_GD25VQ80C,
7680 .total_size = 1024,
7681 .page_size = 256,
7682 /* Supports SFDP */
7683 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007685 .tested = TEST_UNTESTED,
7686 .probe = probe_spi_rdid,
7687 .probe_timing = TIMING_ZERO,
7688 .block_erasers =
7689 {
7690 {
7691 .eraseblocks = { { 4 * 1024, 256} },
7692 .block_erase = spi_block_erase_20,
7693 }, {
7694 .eraseblocks = { { 32 * 1024, 32} },
7695 .block_erase = spi_block_erase_52,
7696 }, {
7697 .eraseblocks = { { 64 * 1024, 16} },
7698 .block_erase = spi_block_erase_d8,
7699 }, {
7700 .eraseblocks = { {1024 * 1024, 1} },
7701 .block_erase = spi_block_erase_60,
7702 }, {
7703 .eraseblocks = { {1024 * 1024, 1} },
7704 .block_erase = spi_block_erase_c7,
7705 }
7706 },
Nico Huber4da971f2024-03-27 01:18:12 +01007707 .reg_bits =
7708 {
7709 .qe = {STATUS2, 1, RW},
7710 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007711 .printlock = spi_prettyprint_status_register_bp4_srwd,
7712 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7713 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007714 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007715 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007716 .prepare_access = spi_prepare_io,
7717 .finish_access = spi_finish_io,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007718 },
7719
7720 {
Dino Li3214f582020-03-25 17:39:53 +08007721 .vendor = "GigaDevice",
7722 .name = "GD25WQ80E",
7723 .bustype = BUS_SPI,
7724 .manufacture_id = GIGADEVICE_ID,
7725 .model_id = GIGADEVICE_GD25WQ80E,
7726 .total_size = 1024,
7727 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Dino Li3214f582020-03-25 17:39:53 +08007729 .tested = TEST_OK_PREW,
7730 .probe = probe_spi_rdid,
7731 .probe_timing = TIMING_ZERO,
7732 .block_erasers =
7733 {
7734 {
7735 .eraseblocks = { {4 * 1024, 256} },
7736 .block_erase = spi_block_erase_20,
7737 }, {
7738 .eraseblocks = { {32 * 1024, 32} },
7739 .block_erase = spi_block_erase_52,
7740 }, {
7741 .eraseblocks = { {64 * 1024, 16} },
7742 .block_erase = spi_block_erase_d8,
7743 }, {
7744 .eraseblocks = { {1 * 1024 * 1024, 1} },
7745 .block_erase = spi_block_erase_60,
7746 }, {
7747 .eraseblocks = { {1 * 1024 * 1024, 1} },
7748 .block_erase = spi_block_erase_c7,
7749 }
7750 },
Nico Huber4da971f2024-03-27 01:18:12 +01007751 .reg_bits =
7752 {
7753 .qe = {STATUS2, 1, RW},
7754 },
Dino Li3214f582020-03-25 17:39:53 +08007755 .printlock = spi_prettyprint_status_register_bp4_srwd,
7756 .unlock = spi_disable_blockprotect_bp4_srwd,
7757 .write = spi_chip_write_256,
7758 .read = spi_chip_read,
7759 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007760 .prepare_access = spi_prepare_io,
7761 .finish_access = spi_finish_io,
Dino Li3214f582020-03-25 17:39:53 +08007762 },
7763
7764 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007765 .vendor = "Hyundai",
7766 .name = "HY29F002B",
7767 .bustype = BUS_PARALLEL,
7768 .manufacture_id = HYUNDAI_ID,
7769 .model_id = HYUNDAI_HY29F002B,
7770 .total_size = 256,
7771 .page_size = 256 * 1024,
7772 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007773 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007774 .probe = probe_jedec,
7775 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007776 .block_erasers =
7777 {
7778 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007779 .eraseblocks = {
7780 {16 * 1024, 1},
7781 {8 * 1024, 2},
7782 {32 * 1024, 1},
7783 {64 * 1024, 3},
7784 },
7785 .block_erase = erase_sector_jedec,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007786 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007787 .eraseblocks = { {256 * 1024, 1} },
7788 .block_erase = erase_chip_block_jedec,
7789 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007790 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007791 .write = write_jedec_1,
7792 .read = read_memmapped,
7793 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007794 .prepare_access = prepare_memory_access,
7795 .finish_access = finish_memory_access,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007796 },
7797
7798 {
David Borgc96a8bd2010-06-21 16:12:22 +00007799 .vendor = "Hyundai",
7800 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007801 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00007802 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007803 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00007804 .total_size = 256,
7805 .page_size = 256 * 1024,
7806 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007807 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00007808 .probe = probe_jedec,
7809 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7810 .block_erasers =
7811 {
7812 {
7813 .eraseblocks = {
7814 {64 * 1024, 3},
7815 {32 * 1024, 1},
7816 {8 * 1024, 2},
7817 {16 * 1024, 1},
7818 },
7819 .block_erase = erase_sector_jedec,
7820 }, {
7821 .eraseblocks = { {256 * 1024, 1} },
7822 .block_erase = erase_chip_block_jedec,
7823 },
7824 },
7825 .write = write_jedec_1,
7826 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007827 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007828 .prepare_access = prepare_memory_access,
7829 .finish_access = finish_memory_access,
David Borgc96a8bd2010-06-21 16:12:22 +00007830 },
7831
7832 {
7833 .vendor = "Hyundai",
Joshua Roysf1324e02010-09-16 00:51:51 +00007834 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007835 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007836 .manufacture_id = HYUNDAI_ID,
7837 .model_id = HYUNDAI_HY29F040A,
7838 .total_size = 512,
7839 .page_size = 64 * 1024,
7840 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7841 .tested = TEST_UNTESTED,
7842 .probe = probe_jedec,
7843 .probe_timing = TIMING_ZERO,
7844 .block_erasers =
7845 {
7846 {
7847 .eraseblocks = { {64 * 1024, 8} },
7848 .block_erase = erase_sector_jedec,
7849 }, {
7850 .eraseblocks = { {512 * 1024, 1} },
7851 .block_erase = erase_chip_block_jedec,
7852 },
7853 },
7854 .write = write_jedec_1,
7855 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007856 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01007857 .prepare_access = prepare_memory_access,
7858 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00007859 },
7860
7861 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007862 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007863 .name = "IS25LP064",
7864 .bustype = BUS_SPI,
7865 .manufacture_id = ISSI_ID_SPI,
7866 .model_id = ISSI_IS25LP064,
7867 .total_size = 8192,
7868 .page_size = 256,
7869 /* OTP: 1024B total; read 0x48; write 0x42 */
7870 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Simon Buhrow9bf829d2021-10-20 17:09:09 +02007871 .tested = TEST_OK_PREW,
Angel Pons2ef47f32018-09-30 16:47:30 +02007872 .probe = probe_spi_rdid,
7873 .probe_timing = TIMING_ZERO,
7874 .block_erasers =
7875 {
7876 {
7877 .eraseblocks = { {4 * 1024, 2048} },
7878 .block_erase = spi_block_erase_20,
7879 }, {
7880 .eraseblocks = { {4 * 1024, 2048} },
7881 .block_erase = spi_block_erase_d7,
7882 }, {
7883 .eraseblocks = { {32 * 1024, 256} },
7884 .block_erase = spi_block_erase_52,
7885 }, {
7886 .eraseblocks = { {64 * 1024, 128} },
7887 .block_erase = spi_block_erase_d8,
7888 }, {
7889 .eraseblocks = { {8 * 1024 * 1024, 1} },
7890 .block_erase = spi_block_erase_60,
7891 }, {
7892 .eraseblocks = { {8 * 1024 * 1024, 1} },
7893 .block_erase = spi_block_erase_c7,
7894 }
7895 },
7896 .unlock = spi_disable_blockprotect,
7897 .write = spi_chip_write_256,
7898 .read = spi_chip_read,
7899 .voltage = {2300, 3600},
7900 },
7901
7902 {
7903 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007904 .name = "IS25LP128",
7905 .bustype = BUS_SPI,
7906 .manufacture_id = ISSI_ID_SPI,
7907 .model_id = ISSI_IS25LP128,
7908 .total_size = 16384,
7909 .page_size = 256,
7910 /* OTP: 1024B total; read 0x48; write 0x42 */
7911 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7912 .tested = TEST_OK_PREW,
7913 .probe = probe_spi_rdid,
7914 .probe_timing = TIMING_ZERO,
7915 .block_erasers =
7916 {
7917 {
7918 .eraseblocks = { {4 * 1024, 4096} },
7919 .block_erase = spi_block_erase_20,
7920 }, {
7921 .eraseblocks = { {4 * 1024, 4096} },
7922 .block_erase = spi_block_erase_d7,
7923 }, {
7924 .eraseblocks = { {32 * 1024, 512} },
7925 .block_erase = spi_block_erase_52,
7926 }, {
7927 .eraseblocks = { {64 * 1024, 256} },
7928 .block_erase = spi_block_erase_d8,
7929 }, {
7930 .eraseblocks = { {16 * 1024 * 1024, 1} },
7931 .block_erase = spi_block_erase_60,
7932 }, {
7933 .eraseblocks = { {16 * 1024 * 1024, 1} },
7934 .block_erase = spi_block_erase_c7,
7935 }
7936 },
7937 .unlock = spi_disable_blockprotect,
7938 .write = spi_chip_write_256,
7939 .read = spi_chip_read,
7940 .voltage = {2300, 3600},
7941 },
7942
7943 {
7944 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007945 .name = "IS25LP256",
7946 .bustype = BUS_SPI,
7947 .manufacture_id = ISSI_ID_SPI,
7948 .model_id = ISSI_IS25LP256,
7949 .total_size = 32768,
7950 .page_size = 256,
7951 /* supports SFDP */
7952 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02007953 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
7954 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00007955 .tested = TEST_OK_PREW,
7956 .probe = probe_spi_rdid,
7957 .probe_timing = TIMING_ZERO,
7958 .block_erasers =
7959 {
7960 {
7961 .eraseblocks = { {4 * 1024, 8192} },
7962 .block_erase = spi_block_erase_21,
7963 }, {
7964 .eraseblocks = { {4 * 1024, 8192} },
7965 .block_erase = spi_block_erase_20,
7966 /* could also use spi_block_erase_d7 */
7967 }, {
7968 .eraseblocks = { {32 * 1024, 1024} },
7969 .block_erase = spi_block_erase_5c,
7970 }, {
7971 .eraseblocks = { {32 * 1024, 1024} },
7972 .block_erase = spi_block_erase_52,
7973 }, {
7974 .eraseblocks = { {64 * 1024, 512} },
7975 .block_erase = spi_block_erase_dc,
7976 }, {
7977 .eraseblocks = { {64 * 1024, 512} },
7978 .block_erase = spi_block_erase_d8,
7979 }, {
7980 .eraseblocks = { {32 * 1024 * 1024, 1} },
7981 .block_erase = spi_block_erase_60,
7982 }, {
7983 .eraseblocks = { {32 * 1024 * 1024, 1} },
7984 .block_erase = spi_block_erase_c7,
7985 }
7986 },
7987 .unlock = spi_disable_blockprotect,
7988 .write = spi_chip_write_256,
7989 .read = spi_chip_read,
7990 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02007991 .prepare_access = spi_prepare_io,
7992 .finish_access = spi_finish_io,
David Hendricks61818dc2018-10-28 01:02:21 +00007993 },
7994
7995 {
7996 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007997 .name = "IS25WP032",
7998 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007999 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02008000 .model_id = ISSI_IS25WP032,
8001 .total_size = 4096,
8002 .page_size = 256,
8003 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008004 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8005 dummy cycles; non-volatile read parameters, so disable for now */
8006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02008007 .tested = TEST_UNTESTED,
8008 .probe = probe_spi_rdid,
8009 .probe_timing = TIMING_ZERO,
8010 .block_erasers =
8011 {
8012 {
8013 .eraseblocks = { {4 * 1024, 1024} },
8014 .block_erase = spi_block_erase_20,
8015 }, {
8016 .eraseblocks = { {4 * 1024, 1024} },
8017 .block_erase = spi_block_erase_d7,
8018 }, {
8019 .eraseblocks = { {32 * 1024, 128} },
8020 .block_erase = spi_block_erase_52,
8021 }, {
8022 .eraseblocks = { {64 * 1024, 64} },
8023 .block_erase = spi_block_erase_d8,
8024 }, {
8025 .eraseblocks = { {4 * 1024 * 1024, 1} },
8026 .block_erase = spi_block_erase_60,
8027 }, {
8028 .eraseblocks = { {4 * 1024 * 1024, 1} },
8029 .block_erase = spi_block_erase_c7,
8030 }
8031 },
8032 .unlock = spi_disable_blockprotect,
8033 .write = spi_chip_write_256,
8034 .read = spi_chip_read,
8035 .voltage = {1650, 1950},
8036 },
8037
8038 {
8039 .vendor = "ISSI",
8040 .name = "IS25WP064",
8041 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10008042 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02008043 .model_id = ISSI_IS25WP064,
8044 .total_size = 8192,
8045 .page_size = 256,
8046 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008047 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8048 dummy cycles; non-volatile read parameters, so disable for now */
8049 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02008050 .tested = TEST_OK_PREW,
8051 .probe = probe_spi_rdid,
8052 .probe_timing = TIMING_ZERO,
8053 .block_erasers =
8054 {
8055 {
8056 .eraseblocks = { {4 * 1024, 2048} },
8057 .block_erase = spi_block_erase_20,
8058 }, {
8059 .eraseblocks = { {4 * 1024, 2048} },
8060 .block_erase = spi_block_erase_d7,
8061 }, {
8062 .eraseblocks = { {32 * 1024, 256} },
8063 .block_erase = spi_block_erase_52,
8064 }, {
8065 .eraseblocks = { {64 * 1024, 128} },
8066 .block_erase = spi_block_erase_d8,
8067 }, {
8068 .eraseblocks = { {8 * 1024 * 1024, 1} },
8069 .block_erase = spi_block_erase_60,
8070 }, {
8071 .eraseblocks = { {8 * 1024 * 1024, 1} },
8072 .block_erase = spi_block_erase_c7,
8073 }
8074 },
8075 .unlock = spi_disable_blockprotect,
8076 .write = spi_chip_write_256,
8077 .read = spi_chip_read,
8078 .voltage = {1650, 1950},
8079 },
8080
8081 {
8082 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07008083 .name = "IS25WP128",
8084 .bustype = BUS_SPI,
8085 .manufacture_id = ISSI_ID_SPI,
8086 .model_id = ISSI_IS25WP128,
8087 .total_size = 16384,
8088 .page_size = 256,
8089 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008090 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8091 dummy cycles; non-volatile read parameters, so disable for now */
8092 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks3083ed92017-05-02 13:25:56 -07008093 .tested = TEST_OK_PREW,
8094 .probe = probe_spi_rdid,
8095 .probe_timing = TIMING_ZERO,
8096 .block_erasers =
8097 {
8098 {
8099 .eraseblocks = { {4 * 1024, 4096} },
8100 .block_erase = spi_block_erase_20,
8101 }, {
8102 .eraseblocks = { {4 * 1024, 4096} },
8103 .block_erase = spi_block_erase_d7,
8104 }, {
8105 .eraseblocks = { {32 * 1024, 512} },
8106 .block_erase = spi_block_erase_52,
8107 }, {
8108 .eraseblocks = { {64 * 1024, 256} },
8109 .block_erase = spi_block_erase_d8,
8110 }, {
8111 .eraseblocks = { {16 * 1024 * 1024, 1} },
8112 .block_erase = spi_block_erase_60,
8113 }, {
8114 .eraseblocks = { {16 * 1024 * 1024, 1} },
8115 .block_erase = spi_block_erase_c7,
8116 }
8117 },
8118 .unlock = spi_disable_blockprotect,
8119 .write = spi_chip_write_256,
8120 .read = spi_chip_read,
8121 .voltage = {1650, 1950},
8122 },
8123
8124 {
8125 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00008126 .name = "IS25WP256",
8127 .bustype = BUS_SPI,
8128 .manufacture_id = ISSI_ID_SPI,
8129 .model_id = ISSI_IS25WP256,
8130 .total_size = 32768,
8131 .page_size = 256,
8132 /* supports SFDP */
8133 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02008134 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8135 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00008136 .tested = TEST_OK_PREW,
8137 .probe = probe_spi_rdid,
8138 .probe_timing = TIMING_ZERO,
8139 .block_erasers =
8140 {
8141 {
8142 .eraseblocks = { {4 * 1024, 8192} },
8143 .block_erase = spi_block_erase_21,
8144 }, {
8145 .eraseblocks = { {4 * 1024, 8192} },
8146 .block_erase = spi_block_erase_20,
8147 /* could also use spi_block_erase_d7 */
8148 }, {
8149 .eraseblocks = { {32 * 1024, 1024} },
8150 .block_erase = spi_block_erase_5c,
8151 }, {
8152 .eraseblocks = { {32 * 1024, 1024} },
8153 .block_erase = spi_block_erase_52,
8154 }, {
8155 .eraseblocks = { {64 * 1024, 512} },
8156 .block_erase = spi_block_erase_dc,
8157 }, {
8158 .eraseblocks = { {64 * 1024, 512} },
8159 .block_erase = spi_block_erase_d8,
8160 }, {
8161 .eraseblocks = { {32 * 1024 * 1024, 1} },
8162 .block_erase = spi_block_erase_60,
8163 }, {
8164 .eraseblocks = { {32 * 1024 * 1024, 1} },
8165 .block_erase = spi_block_erase_c7,
8166 }
8167 },
8168 .unlock = spi_disable_blockprotect,
8169 .write = spi_chip_write_256,
8170 .read = spi_chip_read,
8171 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +02008172 .prepare_access = spi_prepare_io,
8173 .finish_access = spi_finish_io,
David Hendricks61818dc2018-10-28 01:02:21 +00008174 },
8175
8176 {
8177 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008178 .name = "IS29GL064B",
8179 .bustype = BUS_PARALLEL,
8180 .manufacture_id = ISSI_ID,
8181 .model_id = ISSI_PMC_IS29GL064B,
8182 .total_size = 8192,
8183 .page_size = 128 * 1024, /* actual page size is 16 */
8184 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8185 .tested = TEST_UNTESTED,
8186 .probe = probe_jedec_29gl,
8187 .probe_timing = TIMING_ZERO,
8188 .block_erasers =
8189 {
8190 {
8191 .eraseblocks = {
8192 {8 * 1024, 8},
8193 {64 * 1024, 127},
8194 },
8195 .block_erase = erase_sector_jedec,
8196 }, {
8197 .eraseblocks = { {8 * 1024 * 1024, 1} },
8198 .block_erase = erase_chip_block_jedec,
8199 },
8200 },
8201 .write = write_jedec_1,
8202 .read = read_memmapped,
8203 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008204 .prepare_access = prepare_memory_access,
8205 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008206 },
8207
8208 {
8209 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008210 .name = "IS29GL064H/L",
8211 .bustype = BUS_PARALLEL,
8212 .manufacture_id = ISSI_ID,
8213 .model_id = ISSI_PMC_IS29GL064HL,
8214 .total_size = 8192,
8215 .page_size = 128 * 1024, /* actual page size is 16 */
8216 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8217 .tested = TEST_UNTESTED,
8218 .probe = probe_jedec_29gl,
8219 .probe_timing = TIMING_ZERO,
8220 .block_erasers =
8221 {
8222 {
8223 .eraseblocks = { {64 * 1024, 128} },
8224 .block_erase = erase_sector_jedec,
8225 }, {
8226 .eraseblocks = { {8 * 1024 * 1024, 1} },
8227 .block_erase = erase_chip_block_jedec,
8228 },
8229 },
8230 .write = write_jedec_1,
8231 .read = read_memmapped,
8232 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008233 .prepare_access = prepare_memory_access,
8234 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008235 },
8236
8237 {
8238 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008239 .name = "IS29GL064T",
8240 .bustype = BUS_PARALLEL,
8241 .manufacture_id = ISSI_ID,
8242 .model_id = ISSI_PMC_IS29GL064T,
8243 .total_size = 8192,
8244 .page_size = 128 * 1024, /* actual page size is 16 */
8245 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8246 .tested = TEST_UNTESTED,
8247 .probe = probe_jedec_29gl,
8248 .probe_timing = TIMING_ZERO,
8249 .block_erasers =
8250 {
8251 {
8252 .eraseblocks = {
8253 {64 * 1024, 127},
8254 {8 * 1024, 8},
8255 },
8256 .block_erase = erase_sector_jedec,
8257 }, {
8258 .eraseblocks = { {8 * 1024 * 1024, 1} },
8259 .block_erase = erase_chip_block_jedec,
8260 },
8261 },
8262 .write = write_jedec_1,
8263 .read = read_memmapped,
8264 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008265 .prepare_access = prepare_memory_access,
8266 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008267 },
8268
8269 {
8270 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008271 .name = "IS29GL128H/L",
8272 .bustype = BUS_PARALLEL,
8273 .manufacture_id = ISSI_ID,
8274 .model_id = ISSI_PMC_IS29GL128HL,
8275 .total_size = 16384,
8276 .page_size = 128 * 1024, /* actual page size is 16 */
8277 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8278 .tested = TEST_UNTESTED,
8279 .probe = probe_jedec_29gl,
8280 .probe_timing = TIMING_ZERO,
8281 .block_erasers =
8282 {
8283 {
8284 .eraseblocks = { {128 * 1024, 128} },
8285 .block_erase = erase_sector_jedec,
8286 }, {
8287 .eraseblocks = { {16 * 1024 * 1024, 1} },
8288 .block_erase = erase_chip_block_jedec,
8289 },
8290 },
8291 .write = write_jedec_1,
8292 .read = read_memmapped,
8293 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008294 .prepare_access = prepare_memory_access,
8295 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008296 },
8297
8298 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008299 .vendor = "Intel",
8300 .name = "25F160S33B8",
8301 .bustype = BUS_SPI,
8302 .manufacture_id = INTEL_ID,
8303 .model_id = INTEL_25F160S33B8,
8304 .total_size = 2048,
8305 .page_size = 256,
8306 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8307 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8308 .tested = TEST_UNTESTED,
8309 .probe = probe_spi_rdid,
8310 .probe_timing = TIMING_ZERO,
8311 .block_erasers =
8312 {
8313 {
8314 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8315 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8316 * have no effect on the memory contents, but sets a flag in the SR.
8317 .eraseblocks = {
8318 {8 * 1024, 8},
8319 {64 * 1024, 31} // inaccessible
8320 },
8321 .block_erase = spi_block_erase_40,
8322 }, { */
8323 .eraseblocks = { {64 * 1024, 32} },
8324 .block_erase = spi_block_erase_d8,
8325 }, {
8326 .eraseblocks = { {2 * 1024 * 1024, 1} },
8327 .block_erase = spi_block_erase_c7,
8328 }
8329 },
8330 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8331 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8332 .write = spi_chip_write_256,
8333 .read = spi_chip_read, /* also fast read 0x0B */
8334 .voltage = {2700, 3600},
8335 },
8336
8337 {
8338 .vendor = "Intel",
8339 .name = "25F160S33T8",
8340 .bustype = BUS_SPI,
8341 .manufacture_id = INTEL_ID,
8342 .model_id = INTEL_25F160S33T8,
8343 .total_size = 2048,
8344 .page_size = 256,
8345 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8346 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8347 .tested = TEST_UNTESTED,
8348 .probe = probe_spi_rdid,
8349 .probe_timing = TIMING_ZERO,
8350 .block_erasers =
8351 {
8352 {
8353 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8354 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8355 * have no effect on the memory contents, but sets a flag in the SR.
8356 .eraseblocks = {
8357 {64 * 1024, 31}, // inaccessible
8358 {8 * 1024, 8}
8359 },
8360 .block_erase = spi_block_erase_40,
8361 }, { */
8362 .eraseblocks = { {64 * 1024, 32} },
8363 .block_erase = spi_block_erase_d8,
8364 }, {
8365 .eraseblocks = { {2 * 1024 * 1024, 1} },
8366 .block_erase = spi_block_erase_c7,
8367 }
8368 },
8369 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8370 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8371 .write = spi_chip_write_256,
8372 .read = spi_chip_read, /* also fast read 0x0B */
8373 .voltage = {2700, 3600},
8374 },
8375
8376 {
8377 .vendor = "Intel",
8378 .name = "25F320S33B8",
8379 .bustype = BUS_SPI,
8380 .manufacture_id = INTEL_ID,
8381 .model_id = INTEL_25F320S33B8,
8382 .total_size = 4096,
8383 .page_size = 256,
8384 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8385 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8386 .tested = TEST_UNTESTED,
8387 .probe = probe_spi_rdid,
8388 .probe_timing = TIMING_ZERO,
8389 .block_erasers =
8390 {
8391 {
8392 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8393 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8394 * have no effect on the memory contents, but sets a flag in the SR.
8395 .eraseblocks = {
8396 {8 * 1024, 8},
8397 {64 * 1024, 63} // inaccessible
8398 },
8399 .block_erase = spi_block_erase_40,
8400 }, { */
8401 .eraseblocks = { {64 * 1024, 64} },
8402 .block_erase = spi_block_erase_d8,
8403 }, {
8404 .eraseblocks = { {4 * 1024 * 1024, 1} },
8405 .block_erase = spi_block_erase_c7,
8406 }
8407 },
8408 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8409 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8410 .write = spi_chip_write_256,
8411 .read = spi_chip_read, /* also fast read 0x0B */
8412 .voltage = {2700, 3600},
8413 },
8414
8415 {
8416 .vendor = "Intel",
8417 .name = "25F320S33T8",
8418 .bustype = BUS_SPI,
8419 .manufacture_id = INTEL_ID,
8420 .model_id = INTEL_25F320S33T8,
8421 .total_size = 4096,
8422 .page_size = 256,
8423 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8424 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8425 .tested = TEST_UNTESTED,
8426 .probe = probe_spi_rdid,
8427 .probe_timing = TIMING_ZERO,
8428 .block_erasers =
8429 {
8430 {
8431 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8432 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8433 * have no effect on the memory contents, but sets a flag in the SR.
8434 .eraseblocks = {
8435 {64 * 1024, 63}, // inaccessible
8436 {8 * 1024, 8}
8437 },
8438 .block_erase = spi_block_erase_40,
8439 }, { */
8440 .eraseblocks = { {64 * 1024, 64} },
8441 .block_erase = spi_block_erase_d8,
8442 }, {
8443 .eraseblocks = { {4 * 1024 * 1024, 1} },
8444 .block_erase = spi_block_erase_c7,
8445 }
8446 },
8447 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8448 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8449 .write = spi_chip_write_256,
8450 .read = spi_chip_read, /* also fast read 0x0B */
8451 .voltage = {2700, 3600},
8452 },
8453
8454 {
8455 .vendor = "Intel",
8456 .name = "25F640S33B8",
8457 .bustype = BUS_SPI,
8458 .manufacture_id = INTEL_ID,
8459 .model_id = INTEL_25F640S33B8,
8460 .total_size = 8192,
8461 .page_size = 256,
8462 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8463 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02008464 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008465 .probe = probe_spi_rdid,
8466 .probe_timing = TIMING_ZERO,
8467 .block_erasers =
8468 {
8469 {
8470 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8471 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8472 * have no effect on the memory contents, but sets a flag in the SR.
8473 .eraseblocks = {
8474 {8 * 1024, 8},
8475 {64 * 1024, 127} // inaccessible
8476 },
8477 .block_erase = spi_block_erase_40,
8478 }, { */
8479 .eraseblocks = { {64 * 1024, 128} },
8480 .block_erase = spi_block_erase_d8,
8481 }, {
8482 .eraseblocks = { {8 * 1024 * 1024, 1} },
8483 .block_erase = spi_block_erase_c7,
8484 }
8485 },
8486 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8487 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8488 .write = spi_chip_write_256,
8489 .read = spi_chip_read, /* also fast read 0x0B */
8490 .voltage = {2700, 3600},
8491 },
8492
8493 {
8494 .vendor = "Intel",
8495 .name = "25F640S33T8",
8496 .bustype = BUS_SPI,
8497 .manufacture_id = INTEL_ID,
8498 .model_id = INTEL_25F640S33T8,
8499 .total_size = 8192,
8500 .page_size = 256,
8501 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8502 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8503 .tested = TEST_UNTESTED,
8504 .probe = probe_spi_rdid,
8505 .probe_timing = TIMING_ZERO,
8506 .block_erasers =
8507 {
8508 {
8509 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8510 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8511 * have no effect on the memory contents, but sets a flag in the SR.
8512 .eraseblocks = {
8513 {64 * 1024, 127}, // inaccessible
8514 {8 * 1024, 8}
8515 },
8516 .block_erase = spi_block_erase_40,
8517 }, { */
8518 .eraseblocks = { {64 * 1024, 128} },
8519 .block_erase = spi_block_erase_d8,
8520 }, {
8521 .eraseblocks = { {8 * 1024 * 1024, 1} },
8522 .block_erase = spi_block_erase_c7,
8523 }
8524 },
8525 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8526 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8527 .write = spi_chip_write_256,
8528 .read = spi_chip_read, /* also fast read 0x0B */
8529 .voltage = {2700, 3600},
8530 },
8531
8532 {
8533 .vendor = "Intel",
8534 .name = "28F001BN/BX-B",
8535 .bustype = BUS_PARALLEL,
8536 .manufacture_id = INTEL_ID,
8537 .model_id = INTEL_28F001B,
8538 .total_size = 128,
8539 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8540 .tested = TEST_UNTESTED,
8541 .probe = probe_jedec,
8542 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8543 .block_erasers =
8544 {
8545 {
8546 .eraseblocks = {
8547 {8 * 1024, 1},
8548 {4 * 1024, 2},
8549 {112 * 1024, 1},
8550 },
8551 .block_erase = erase_block_82802ab,
8552 },
8553 },
8554 .write = write_82802ab,
8555 .read = read_memmapped,
8556 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008557 .prepare_access = prepare_memory_access,
8558 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008559 },
8560
8561 {
8562 .vendor = "Intel",
8563 .name = "28F001BN/BX-T",
8564 .bustype = BUS_PARALLEL,
8565 .manufacture_id = INTEL_ID,
8566 .model_id = INTEL_28F001T,
8567 .total_size = 128,
8568 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
8569 .tested = TEST_OK_PREW,
8570 .probe = probe_jedec,
8571 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8572 .block_erasers =
8573 {
8574 {
8575 .eraseblocks = {
8576 {112 * 1024, 1},
8577 {4 * 1024, 2},
8578 {8 * 1024, 1},
8579 },
8580 .block_erase = erase_block_82802ab,
8581 },
8582 },
8583 .write = write_82802ab,
8584 .read = read_memmapped,
8585 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008586 .prepare_access = prepare_memory_access,
8587 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008588 },
8589
8590 {
8591 .vendor = "Intel",
8592 .name = "28F002BC/BL/BV/BX-T",
8593 .bustype = BUS_PARALLEL,
8594 .manufacture_id = INTEL_ID,
8595 .model_id = INTEL_28F002T,
8596 .total_size = 256,
8597 .page_size = 256 * 1024,
8598 .tested = TEST_OK_PRE,
8599 .probe = probe_82802ab,
8600 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8601 .block_erasers =
8602 {
8603 {
8604 .eraseblocks = {
8605 {128 * 1024, 1},
8606 {96 * 1024, 1},
8607 {8 * 1024, 2},
8608 {16 * 1024, 1},
8609 },
8610 .block_erase = erase_block_82802ab,
8611 },
8612 },
8613 .write = write_82802ab,
8614 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008615 .prepare_access = prepare_memory_access,
8616 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008617 },
8618
8619 {
8620 .vendor = "Intel",
8621 .name = "28F004B5/BE/BV/BX-B",
8622 .bustype = BUS_PARALLEL,
8623 .manufacture_id = INTEL_ID,
8624 .model_id = INTEL_28F004B,
8625 .total_size = 512,
8626 .page_size = 128 * 1024, /* maximal block size */
8627 .tested = TEST_UNTESTED,
8628 .probe = probe_82802ab,
8629 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8630 .block_erasers =
8631 {
8632 {
8633 .eraseblocks = {
8634 {16 * 1024, 1},
8635 {8 * 1024, 2},
8636 {96 * 1024, 1},
8637 {128 * 1024, 3},
8638 },
8639 .block_erase = erase_block_82802ab,
8640 },
8641 },
8642 .write = write_82802ab,
8643 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008644 .prepare_access = prepare_memory_access,
8645 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008646 },
8647
8648 {
8649 .vendor = "Intel",
8650 .name = "28F004B5/BE/BV/BX-T",
8651 .bustype = BUS_PARALLEL,
8652 .manufacture_id = INTEL_ID,
8653 .model_id = INTEL_28F004T,
8654 .total_size = 512,
8655 .page_size = 128 * 1024, /* maximal block size */
8656 .tested = TEST_UNTESTED,
8657 .probe = probe_82802ab,
8658 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8659 .block_erasers =
8660 {
8661 {
8662 .eraseblocks = {
8663 {128 * 1024, 3},
8664 {96 * 1024, 1},
8665 {8 * 1024, 2},
8666 {16 * 1024, 1},
8667 },
8668 .block_erase = erase_block_82802ab,
8669 },
8670 },
8671 .write = write_82802ab,
8672 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008673 .prepare_access = prepare_memory_access,
8674 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008675 },
8676
8677 {
8678 .vendor = "Intel",
8679 .name = "28F008S3/S5/SC",
8680 .bustype = BUS_PARALLEL,
8681 .manufacture_id = INTEL_ID,
8682 .model_id = INTEL_28F004S3,
8683 .total_size = 512,
8684 .page_size = 256,
8685 .tested = TEST_UNTESTED,
8686 .probe = probe_82802ab,
8687 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8688 .block_erasers =
8689 {
8690 {
8691 .eraseblocks = { {64 * 1024, 8} },
8692 .block_erase = erase_block_82802ab,
8693 },
8694 },
8695 .unlock = unlock_28f004s5,
8696 .write = write_82802ab,
8697 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008698 .prepare_access = prepare_memory_access,
8699 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008700 },
8701
8702 {
8703 .vendor = "Intel",
8704 .name = "28F400BV/BX/CE/CV-B",
8705 .bustype = BUS_PARALLEL,
8706 .manufacture_id = INTEL_ID,
8707 .model_id = INTEL_28F400B,
8708 .total_size = 512,
8709 .page_size = 128 * 1024, /* maximal block size */
8710 .feature_bits = FEATURE_ADDR_SHIFTED,
8711 .tested = TEST_UNTESTED,
8712 .probe = probe_82802ab,
8713 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8714 .block_erasers =
8715 {
8716 {
8717 .eraseblocks = {
8718 {16 * 1024, 1},
8719 {8 * 1024, 2},
8720 {96 * 1024, 1},
8721 {128 * 1024, 3},
8722 },
8723 .block_erase = erase_block_82802ab,
8724 },
8725 },
8726 .write = write_82802ab,
8727 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008728 .prepare_access = prepare_memory_access,
8729 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008730 },
8731
8732 {
8733 .vendor = "Intel",
8734 .name = "28F400BV/BX/CE/CV-T",
8735 .bustype = BUS_PARALLEL,
8736 .manufacture_id = INTEL_ID,
8737 .model_id = INTEL_28F400T,
8738 .total_size = 512,
8739 .page_size = 128 * 1024, /* maximal block size */
8740 .feature_bits = FEATURE_ADDR_SHIFTED,
8741 .tested = TEST_UNTESTED,
8742 .probe = probe_82802ab,
8743 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8744 .block_erasers =
8745 {
8746 {
8747 .eraseblocks = {
8748 {128 * 1024, 3},
8749 {96 * 1024, 1},
8750 {8 * 1024, 2},
8751 {16 * 1024, 1},
8752 },
8753 .block_erase = erase_block_82802ab,
8754 },
8755 },
8756 .write = write_82802ab,
8757 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008758 .prepare_access = prepare_memory_access,
8759 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008760 },
8761
8762 {
8763 .vendor = "Intel",
8764 .name = "82802AB",
8765 .bustype = BUS_FWH,
8766 .manufacture_id = INTEL_ID,
8767 .model_id = INTEL_82802AB,
8768 .total_size = 512,
8769 .page_size = 64 * 1024,
Alan Green88552572019-07-24 13:56:06 +10008770 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008771 .probe = probe_82802ab,
8772 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8773 .block_erasers =
8774 {
8775 {
8776 .eraseblocks = { {64 * 1024, 8} },
8777 .block_erase = erase_block_82802ab,
8778 },
8779 },
8780 .unlock = unlock_regspace2_uniform_64k,
8781 .write = write_82802ab,
8782 .read = read_memmapped,
8783 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008784 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008785 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008786 },
8787
8788 {
8789 .vendor = "Intel",
8790 .name = "82802AC",
8791 .bustype = BUS_FWH,
8792 .manufacture_id = INTEL_ID,
8793 .model_id = INTEL_82802AC,
8794 .total_size = 1024,
8795 .page_size = 64 * 1024,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008796 .tested = TEST_OK_PR,
8797 .probe = probe_82802ab,
8798 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8799 .block_erasers =
8800 {
8801 {
8802 .eraseblocks = { {64 * 1024, 16} },
8803 .block_erase = erase_block_82802ab,
8804 },
8805 },
8806 .unlock = unlock_regspace2_uniform_64k,
8807 .write = write_82802ab,
8808 .read = read_memmapped,
8809 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008810 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008811 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008812 },
8813
8814 {
8815 .vendor = "Macronix",
8816 .name = "MX23L12854",
8817 .bustype = BUS_SPI,
8818 .manufacture_id = MACRONIX_ID,
8819 .model_id = MACRONIX_MX23L12854,
8820 .total_size = 16384,
8821 .page_size = 256,
8822 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8823 .probe = probe_spi_rdid,
8824 .probe_timing = TIMING_ZERO,
8825 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8826 .read = spi_chip_read, /* Fast read (0x0B) supported */
8827 .voltage = {3000, 3600},
8828 },
8829
8830 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008831 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008832 .name = "MX23L1654",
8833 .bustype = BUS_SPI,
8834 .manufacture_id = MACRONIX_ID,
8835 .model_id = MACRONIX_MX23L1654,
8836 .total_size = 2048,
8837 .page_size = 256,
8838 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8839 .probe = probe_spi_rdid,
8840 .probe_timing = TIMING_ZERO,
8841 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8842 .read = spi_chip_read, /* Fast read (0x0B) supported */
8843 .voltage = {3000, 3600},
8844 },
8845
8846 {
8847 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008848 .name = "MX23L3254",
8849 .bustype = BUS_SPI,
8850 .manufacture_id = MACRONIX_ID,
8851 .model_id = MACRONIX_MX23L3254,
8852 .total_size = 4096,
8853 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00008854 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008855 .probe = probe_spi_rdid,
8856 .probe_timing = TIMING_ZERO,
8857 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8858 .read = spi_chip_read, /* Fast read (0x0B) supported */
8859 .voltage = {3000, 3600},
8860 },
8861
8862 {
8863 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008864 .name = "MX23L6454",
8865 .bustype = BUS_SPI,
8866 .manufacture_id = MACRONIX_ID,
8867 .model_id = MACRONIX_MX23L6454,
8868 .total_size = 8192,
8869 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008870 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00008871 .probe = probe_spi_rdid,
8872 .probe_timing = TIMING_ZERO,
8873 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8874 .read = spi_chip_read, /* Fast read (0x0B) supported */
8875 .voltage = {3000, 3600},
8876 },
8877
8878 {
8879 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00008880 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008881 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008882 .manufacture_id = MACRONIX_ID,
8883 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008884 .total_size = 128,
8885 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008886 /* MX25L1006E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01008887 /* FEATURE_FAST_READ_DOUT: MX25L1006E */
8888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00008889 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008890 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008891 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008892 .block_erasers =
8893 {
8894 {
8895 .eraseblocks = { {4 * 1024, 32} },
8896 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008897 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008898 .eraseblocks = { {64 * 1024, 2} },
8899 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008900 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008901 .eraseblocks = { {128 * 1024, 1} },
8902 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008903 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008904 .eraseblocks = { {128 * 1024, 1} },
8905 .block_erase = spi_block_erase_c7,
8906 },
8907 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008908 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008909 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008910 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008911 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008912 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008913 .prepare_access = spi_prepare_io,
8914 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00008915 },
8916
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008917 {
8918 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008919 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008920 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008921 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008922 .model_id = MACRONIX_MX25L12805D,
8923 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008924 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008925 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01008926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008927 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008928 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008929 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008930 .block_erasers =
8931 {
8932 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008933 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008934 .block_erase = spi_block_erase_20,
8935 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008936 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008937 .block_erase = spi_block_erase_d8,
8938 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008939 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008940 .block_erase = spi_block_erase_60,
8941 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008942 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008943 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008944 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008945 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008946 .printlock = spi_prettyprint_status_register_bp3_srwd,
8947 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008948 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008949 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008950 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008951 },
8952
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008953 {
8954 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08008955 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008956 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008957 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008958 .model_id = MACRONIX_MX25L12805D,
8959 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008960 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08008961 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01008962 /* *F versions: FEATURE_QPI_35 + DC bits (6, 4, 8, 10) in configuration register */
8963 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8964 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stefan Tauner8179be52011-06-04 13:13:34 +00008965 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008966 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008967 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008968 .block_erasers =
8969 {
8970 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008971 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008972 .block_erase = spi_block_erase_20,
8973 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008974 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008975 .block_erase = spi_block_erase_52,
8976 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008977 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008978 .block_erase = spi_block_erase_d8,
8979 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008980 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008981 .block_erase = spi_block_erase_60,
8982 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008983 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008984 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008985 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008986 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008987 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01008988 .reg_bits =
8989 {
8990 .qe = {STATUS1, 6, RW},
8991 },
8992 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008993 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008994 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008995 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008996 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02008997 .prepare_access = spi_prepare_io,
8998 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00008999 },
9000
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009001 {
9002 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009003 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009004 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009005 .manufacture_id = MACRONIX_ID,
9006 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009007 .total_size = 2048,
9008 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009009 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00009010 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009011 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009012 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009013 .block_erasers =
9014 {
9015 {
Stefan Tauner226037d2013-03-16 01:22:12 +00009016 .eraseblocks = { {64 * 1024, 32} },
9017 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009018 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00009019 .eraseblocks = { {64 * 1024, 32} },
9020 .block_erase = spi_block_erase_d8,
9021 }, {
9022 .eraseblocks = { {2 * 1024 * 1024, 1} },
9023 .block_erase = spi_block_erase_60,
9024 }, {
9025 .eraseblocks = { {2 * 1024 * 1024, 1} },
9026 .block_erase = spi_block_erase_c7,
9027 },
9028 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009029 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00009030 .unlock = spi_disable_blockprotect,
9031 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009032 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009033 .voltage = {2700, 3600},
9034 },
9035
9036 {
9037 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009038 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009039 .bustype = BUS_SPI,
9040 .manufacture_id = MACRONIX_ID,
9041 .model_id = MACRONIX_MX25L1605,
9042 .total_size = 2048,
9043 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009044 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Nico Huber46552c82024-03-27 01:18:12 +01009045 /* FEATURE_FAST_READ_DOUT: MX25L1606E & MX25L1608E */
9046 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +00009047 .tested = TEST_OK_PREW,
9048 .probe = probe_spi_rdid,
9049 .probe_timing = TIMING_ZERO,
9050 .block_erasers =
9051 {
9052 {
9053 .eraseblocks = { {4 * 1024, 512} },
9054 .block_erase = spi_block_erase_20,
9055 }, {
9056 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00009057 .block_erase = spi_block_erase_52,
9058 }, {
9059 .eraseblocks = { {64 * 1024, 32} },
9060 .block_erase = spi_block_erase_d8,
9061 }, {
9062 .eraseblocks = { {2 * 1024 * 1024, 1} },
9063 .block_erase = spi_block_erase_60,
9064 }, {
9065 .eraseblocks = { {2 * 1024 * 1024, 1} },
9066 .block_erase = spi_block_erase_c7,
9067 },
9068 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009069 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009070 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009071 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009072 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009073 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009074 .prepare_access = spi_prepare_io,
9075 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009076 },
9077
9078 {
9079 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009080 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009081 .bustype = BUS_SPI,
9082 .manufacture_id = MACRONIX_ID,
9083 .model_id = MACRONIX_MX25L1605,
9084 .total_size = 2048,
9085 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009086 /* FEATURE_QIO: MX25L1673E */
9087 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009088 .tested = TEST_OK_PREW,
9089 .probe = probe_spi_rdid,
9090 .probe_timing = TIMING_ZERO,
9091 .block_erasers =
9092 {
9093 {
9094 .eraseblocks = { {4 * 1024, 512} },
9095 .block_erase = spi_block_erase_20,
9096 }, {
9097 .eraseblocks = { {64 * 1024, 32} },
9098 .block_erase = spi_block_erase_d8,
9099 }, {
9100 .eraseblocks = { {2 * 1024 * 1024, 1} },
9101 .block_erase = spi_block_erase_60,
9102 }, {
9103 .eraseblocks = { {2 * 1024 * 1024, 1} },
9104 .block_erase = spi_block_erase_c7,
9105 },
9106 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009107 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009108 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009109 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009110 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009111 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009112 .prepare_access = spi_prepare_io,
9113 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009114 },
9115
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009116 {
9117 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009118 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009119 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009120 .manufacture_id = MACRONIX_ID,
9121 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009122 .total_size = 2048,
9123 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009124 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009125 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9126 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Angel Ponsc2054872021-01-15 18:57:32 +01009127 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009128 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009129 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009130 .block_erasers =
9131 {
9132 {
9133 .eraseblocks = { {4 * 1024, 512} },
9134 .block_erase = spi_block_erase_20,
9135 }, {
9136 .eraseblocks = { {64 * 1024, 32} },
9137 .block_erase = spi_block_erase_d8,
9138 }, {
9139 .eraseblocks = { {2 * 1024 * 1024, 1} },
9140 .block_erase = spi_block_erase_60,
9141 }, {
9142 .eraseblocks = { {2 * 1024 * 1024, 1} },
9143 .block_erase = spi_block_erase_c7,
9144 }
9145 },
Nico Huber46552c82024-03-27 01:18:12 +01009146 .reg_bits =
9147 {
9148 .qe = {STATUS1, 6, RW},
9149 },
9150 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009151 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009152 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009153 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009154 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009155 .prepare_access = spi_prepare_io,
9156 .finish_access = spi_finish_io,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009157 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00009158
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009159 {
9160 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00009161 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009162 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009163 .manufacture_id = MACRONIX_ID,
9164 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009165 .total_size = 2048,
9166 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009167 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009168 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9169 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009170 .tested = TEST_UNTESTED,
9171 .probe = probe_spi_rdid,
9172 .probe_timing = TIMING_ZERO,
9173 .block_erasers =
9174 {
9175 {
9176 .eraseblocks = { {4 * 1024, 512} },
9177 .block_erase = spi_block_erase_20,
9178 }, {
9179 .eraseblocks = { {64 * 1024, 32} },
9180 .block_erase = spi_block_erase_d8,
9181 }, {
9182 .eraseblocks = { {2 * 1024 * 1024, 1} },
9183 .block_erase = spi_block_erase_60,
9184 }, {
9185 .eraseblocks = { {2 * 1024 * 1024, 1} },
9186 .block_erase = spi_block_erase_c7,
9187 }
9188 },
Nico Huber46552c82024-03-27 01:18:12 +01009189 .reg_bits =
9190 {
9191 .qe = {STATUS1, 6, RW},
9192 },
9193 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009194 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009195 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009196 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009197 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009198 .prepare_access = spi_prepare_io,
9199 .finish_access = spi_finish_io,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009200 },
9201
9202 {
9203 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009204 .name = "MX25L2005(C)/MX25L2006E",
9205 .bustype = BUS_SPI,
9206 .manufacture_id = MACRONIX_ID,
9207 .model_id = MACRONIX_MX25L2005,
9208 .total_size = 256,
9209 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009210 /* FEATURE_FAST_READ_DOUT: MX25L2006E */
9211 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009212 .tested = TEST_OK_PREW,
9213 .probe = probe_spi_rdid,
9214 .probe_timing = TIMING_ZERO,
9215 .block_erasers =
9216 {
9217 {
9218 .eraseblocks = { {4 * 1024, 64} },
9219 .block_erase = spi_block_erase_20,
9220 }, {
9221 .eraseblocks = { {64 * 1024, 4} },
9222 .block_erase = spi_block_erase_52,
9223 }, {
9224 .eraseblocks = { {64 * 1024, 4} },
9225 .block_erase = spi_block_erase_d8,
9226 }, {
9227 .eraseblocks = { {256 * 1024, 1} },
9228 .block_erase = spi_block_erase_60,
9229 }, {
9230 .eraseblocks = { {256 * 1024, 1} },
9231 .block_erase = spi_block_erase_c7,
9232 },
9233 },
9234 .printlock = spi_prettyprint_status_register_bp1_srwd,
9235 .unlock = spi_disable_blockprotect,
9236 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009237 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009238 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009239 .prepare_access = spi_prepare_io,
9240 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009241 },
9242
9243 {
9244 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10009245 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009246 .bustype = BUS_SPI,
9247 .manufacture_id = MACRONIX_ID,
9248 .model_id = MACRONIX_MX25L25635F,
9249 .total_size = 32768,
9250 .page_size = 256,
9251 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
9253 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
9254 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Nico Huberf3ab7892024-08-30 02:06:41 +02009255 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009256 .probe = probe_spi_rdid,
9257 .probe_timing = TIMING_ZERO,
9258 .block_erasers =
9259 {
9260 {
9261 .eraseblocks = { {4 * 1024, 8192} },
9262 .block_erase = spi_block_erase_21,
9263 }, {
9264 .eraseblocks = { {4 * 1024, 8192} },
9265 .block_erase = spi_block_erase_20,
9266 }, {
9267 .eraseblocks = { {32 * 1024, 1024} },
9268 .block_erase = spi_block_erase_5c,
9269 }, {
9270 .eraseblocks = { {32 * 1024, 1024} },
9271 .block_erase = spi_block_erase_52,
9272 }, {
9273 .eraseblocks = { {64 * 1024, 512} },
9274 .block_erase = spi_block_erase_dc,
9275 }, {
9276 .eraseblocks = { {64 * 1024, 512} },
9277 .block_erase = spi_block_erase_d8,
9278 }, {
9279 .eraseblocks = { {32 * 1024 * 1024, 1} },
9280 .block_erase = spi_block_erase_60,
9281 }, {
9282 .eraseblocks = { {32 * 1024 * 1024, 1} },
9283 .block_erase = spi_block_erase_c7,
9284 }
9285 },
9286 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01009287 .reg_bits = {
9288 .qe = {STATUS1, 6, RW},
9289 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
Nico Huberf3ab7892024-08-30 02:06:41 +02009290 .srp = {STATUS1, 7, RW},
9291 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
9292 .tb = {CONFIG, 3, OTP},
Nico Huber46552c82024-03-27 01:18:12 +01009293 },
Nico Huberf3ab7892024-08-30 02:06:41 +02009294 .wp_write_cfg = spi_wp_write_cfg,
9295 .wp_read_cfg = spi_wp_read_cfg,
9296 .wp_get_ranges = spi_wp_get_available_ranges,
9297 .decode_range = decode_range_spi25,
Nico Huber46552c82024-03-27 01:18:12 +01009298 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009299 .unlock = spi_disable_blockprotect_bp3_srwd,
9300 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009301 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009302 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009303 .prepare_access = spi_prepare_io,
9304 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009305 },
9306
9307 {
9308 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00009309 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009310 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009311 .manufacture_id = MACRONIX_ID,
9312 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009313 .total_size = 4096,
9314 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009315 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
David Hendricks22e05322010-12-13 23:54:59 +00009316 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009317 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009318 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009319 .block_erasers =
9320 {
9321 {
Stefan Tauner226037d2013-03-16 01:22:12 +00009322 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009323 .block_erase = spi_block_erase_20,
9324 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00009325 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009326 .block_erase = spi_block_erase_d8,
9327 }, {
9328 .eraseblocks = { {4 * 1024 * 1024, 1} },
9329 .block_erase = spi_block_erase_60,
9330 }, {
9331 .eraseblocks = { {4 * 1024 * 1024, 1} },
9332 .block_erase = spi_block_erase_c7,
9333 },
9334 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009335 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009336 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009337 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009338 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009339 .voltage = {2700, 3600},
9340 },
9341
9342 {
9343 .vendor = "Macronix",
9344 .name = "MX25L3205D/MX25L3208D",
9345 .bustype = BUS_SPI,
9346 .manufacture_id = MACRONIX_ID,
9347 .model_id = MACRONIX_MX25L3205,
9348 .total_size = 4096,
9349 .page_size = 256,
9350 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009351 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009352 .tested = TEST_OK_PREW,
9353 .probe = probe_spi_rdid,
9354 .probe_timing = TIMING_ZERO,
9355 .block_erasers =
9356 {
9357 {
9358 .eraseblocks = { {4 * 1024, 1024} },
9359 .block_erase = spi_block_erase_20,
9360 }, {
9361 .eraseblocks = { {64 * 1024, 64} },
9362 .block_erase = spi_block_erase_d8,
9363 }, {
9364 .eraseblocks = { {4 * 1024 * 1024, 1} },
9365 .block_erase = spi_block_erase_60,
9366 }, {
9367 .eraseblocks = { {4 * 1024 * 1024, 1} },
9368 .block_erase = spi_block_erase_c7,
9369 },
9370 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009371 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009372 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009373 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009374 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009375 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009376 .prepare_access = spi_prepare_io,
9377 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009378 },
9379
9380 {
9381 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009382 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009383 .bustype = BUS_SPI,
9384 .manufacture_id = MACRONIX_ID,
9385 .model_id = MACRONIX_MX25L3205,
9386 .total_size = 4096,
9387 .page_size = 256,
9388 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009389 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner226037d2013-03-16 01:22:12 +00009390 .tested = TEST_OK_PREW,
9391 .probe = probe_spi_rdid,
9392 .probe_timing = TIMING_ZERO,
9393 .block_erasers =
9394 {
9395 {
9396 .eraseblocks = { {4 * 1024, 1024} },
9397 .block_erase = spi_block_erase_20,
9398 }, {
9399 .eraseblocks = { {64 * 1024, 64} },
9400 .block_erase = spi_block_erase_d8,
9401 }, {
9402 .eraseblocks = { {64 * 1024, 64} },
9403 .block_erase = spi_block_erase_52,
9404 }, {
9405 .eraseblocks = { {4 * 1024 * 1024, 1} },
9406 .block_erase = spi_block_erase_60,
9407 }, {
9408 .eraseblocks = { {4 * 1024 * 1024, 1} },
9409 .block_erase = spi_block_erase_c7,
9410 },
9411 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009412 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009413 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009414 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009415 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009416 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009417 .prepare_access = spi_prepare_io,
9418 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +00009419 },
9420
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009421 {
9422 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009423 .name = "MX25L3235D",
9424 .bustype = BUS_SPI,
9425 .manufacture_id = MACRONIX_ID,
9426 .model_id = MACRONIX_MX25L3235D,
9427 .total_size = 4096,
9428 .page_size = 256,
9429 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009430 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9431 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009432 .tested = TEST_UNTESTED,
9433 .probe = probe_spi_rdid,
9434 .probe_timing = TIMING_ZERO,
9435 .block_erasers =
9436 {
9437 {
9438 .eraseblocks = { {4 * 1024, 1024} },
9439 .block_erase = spi_block_erase_20,
9440 }, {
9441 .eraseblocks = { {64 * 1024, 64} },
9442 .block_erase = spi_block_erase_d8,
9443 }, {
9444 .eraseblocks = { {4 * 1024 * 1024, 1} },
9445 .block_erase = spi_block_erase_60,
9446 }, {
9447 .eraseblocks = { {4 * 1024 * 1024, 1} },
9448 .block_erase = spi_block_erase_c7,
9449 }
9450 },
Nico Huber46552c82024-03-27 01:18:12 +01009451 .reg_bits =
9452 {
9453 .qe = {STATUS1, 6, RW},
9454 },
9455 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009456 .unlock = spi_disable_blockprotect_bp3_srwd,
9457 .write = spi_chip_write_256,
9458 .read = spi_chip_read,
9459 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009460 .prepare_access = spi_prepare_io,
9461 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009462 },
9463
9464 {
9465 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02009466 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009467 .bustype = BUS_SPI,
9468 .manufacture_id = MACRONIX_ID,
9469 .model_id = MACRONIX_MX25L3205,
9470 .total_size = 4096,
9471 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02009472 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009473 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009474 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009475 .probe = probe_spi_rdid,
9476 .probe_timing = TIMING_ZERO,
9477 .block_erasers =
9478 {
9479 {
9480 .eraseblocks = { {4 * 1024, 1024} },
9481 .block_erase = spi_block_erase_20,
9482 }, {
9483 .eraseblocks = { {32 * 1024, 128} },
9484 .block_erase = spi_block_erase_52,
9485 }, {
9486 .eraseblocks = { {64 * 1024, 64} },
9487 .block_erase = spi_block_erase_d8,
9488 }, {
9489 .eraseblocks = { {4 * 1024 * 1024, 1} },
9490 .block_erase = spi_block_erase_60,
9491 }, {
9492 .eraseblocks = { {4 * 1024 * 1024, 1} },
9493 .block_erase = spi_block_erase_c7,
9494 },
9495 },
Nico Huber46552c82024-03-27 01:18:12 +01009496 .reg_bits =
9497 {
9498 .qe = {STATUS1, 6, RW},
9499 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009500 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009501 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009502 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009503 .read = spi_chip_read,
Nico Huberb6683e02021-04-21 13:04:29 +02009504 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Nico Huber930d4212024-05-04 18:59:15 +02009505 .prepare_access = spi_prepare_io,
9506 .finish_access = spi_finish_io,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009507 },
9508
9509 {
9510 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009511 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009512 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009513 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009514 .model_id = MACRONIX_MX25L4005,
9515 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009516 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009517 /* FEATURE_FAST_READ_DOUT: MX25L4006E */
9518 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009519 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009520 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009521 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009522 .block_erasers =
9523 {
9524 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009525 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00009526 .block_erase = spi_block_erase_20,
9527 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009528 .eraseblocks = { {64 * 1024, 8} },
9529 .block_erase = spi_block_erase_52,
9530 }, {
9531 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00009532 .block_erase = spi_block_erase_d8,
9533 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009534 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009535 .block_erase = spi_block_erase_60,
9536 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009537 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009538 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009539 },
Sean Nelson54596372010-01-09 05:30:14 +00009540 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009541 .printlock = spi_prettyprint_status_register_bp2_srwd,
9542 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009543 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009544 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009545 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009546 .prepare_access = spi_prepare_io,
9547 .finish_access = spi_finish_io,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009548 },
9549
9550 {
9551 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009552 .name = "MX25L512(E)/MX25V512(C)",
9553 .bustype = BUS_SPI,
9554 .manufacture_id = MACRONIX_ID,
9555 .model_id = MACRONIX_MX25L512,
9556 .total_size = 64,
9557 .page_size = 256,
9558 /* MX25L512E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01009559 /* FEATURE_FAST_READ_DOUT: MX25L512E */
9560 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009561 .tested = TEST_OK_PREW,
9562 .probe = probe_spi_rdid,
9563 .probe_timing = TIMING_ZERO,
9564 .block_erasers =
9565 {
9566 {
9567 .eraseblocks = { {4 * 1024, 16} },
9568 .block_erase = spi_block_erase_20,
9569 }, {
9570 .eraseblocks = { {64 * 1024, 1} },
9571 .block_erase = spi_block_erase_52,
9572 }, {
9573 .eraseblocks = { {64 * 1024, 1} },
9574 .block_erase = spi_block_erase_d8,
9575 }, {
9576 .eraseblocks = { {64 * 1024, 1} },
9577 .block_erase = spi_block_erase_60,
9578 }, {
9579 .eraseblocks = { {64 * 1024, 1} },
9580 .block_erase = spi_block_erase_c7,
9581 },
9582 },
9583 .printlock = spi_prettyprint_status_register_bp1_srwd,
9584 .unlock = spi_disable_blockprotect,
9585 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009586 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009587 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
9588 },
9589
9590 {
9591 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009592 .name = "MX25L5121E",
9593 .bustype = BUS_SPI,
9594 .manufacture_id = MACRONIX_ID,
9595 .model_id = MACRONIX_MX25L5121E,
9596 .total_size = 64,
9597 .page_size = 32,
Nico Huber46552c82024-03-27 01:18:12 +01009598 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009599 .tested = TEST_OK_PREW,
9600 .probe = probe_spi_rdid,
9601 .probe_timing = TIMING_ZERO,
9602 .block_erasers =
9603 {
9604 {
9605 .eraseblocks = { {4 * 1024, 16} },
9606 .block_erase = spi_block_erase_20,
9607 }, {
9608 .eraseblocks = { {64 * 1024, 1} },
9609 .block_erase = spi_block_erase_52,
9610 }, {
9611 .eraseblocks = { {64 * 1024, 1} },
9612 .block_erase = spi_block_erase_d8,
9613 }, {
9614 .eraseblocks = { {64 * 1024, 1} },
9615 .block_erase = spi_block_erase_60,
9616 }, {
9617 .eraseblocks = { {64 * 1024, 1} },
9618 .block_erase = spi_block_erase_c7,
9619 },
9620 },
9621 .printlock = spi_prettyprint_status_register_bp1_srwd,
9622 .unlock = spi_disable_blockprotect,
9623 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009624 .read = spi_chip_read,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009625 .voltage = {2700, 3600},
9626 },
9627
9628 {
9629 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009630 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009631 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009632 .manufacture_id = MACRONIX_ID,
9633 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009634 .total_size = 8192,
9635 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009636 /* Has an additional 512B EEPROM sector */
9637 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00009638 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009639 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009640 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009641 .block_erasers =
9642 {
9643 {
9644 .eraseblocks = { {64 * 1024, 128} },
9645 .block_erase = spi_block_erase_20,
9646 }, {
9647 .eraseblocks = { {64 * 1024, 128} },
9648 .block_erase = spi_block_erase_d8,
9649 }, {
9650 .eraseblocks = { {8 * 1024 * 1024, 1} },
9651 .block_erase = spi_block_erase_60,
9652 }, {
9653 .eraseblocks = { {8 * 1024 * 1024, 1} },
9654 .block_erase = spi_block_erase_c7,
9655 }
9656 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009657 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009658 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009659 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009660 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009661 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009662 },
9663
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009664 {
9665 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009666 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00009667 .bustype = BUS_SPI,
9668 .manufacture_id = MACRONIX_ID,
9669 .model_id = MACRONIX_MX25L6405,
9670 .total_size = 8192,
9671 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009672 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009674 .tested = TEST_OK_PREW,
9675 .probe = probe_spi_rdid,
9676 .probe_timing = TIMING_ZERO,
9677 .block_erasers =
9678 {
9679 {
9680 .eraseblocks = { {4 * 1024, 2048} },
9681 .block_erase = spi_block_erase_20,
9682 }, {
9683 .eraseblocks = { {64 * 1024, 128} },
9684 .block_erase = spi_block_erase_d8,
9685 }, {
9686 .eraseblocks = { {8 * 1024 * 1024, 1} },
9687 .block_erase = spi_block_erase_60,
9688 }, {
9689 .eraseblocks = { {8 * 1024 * 1024, 1} },
9690 .block_erase = spi_block_erase_c7,
9691 }
9692 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009693 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009694 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009695 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009696 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009697 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009698 .prepare_access = spi_prepare_io,
9699 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009700 },
9701
9702 {
9703 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009704 .name = "MX25L6406E/MX25L6408E",
9705 .bustype = BUS_SPI,
9706 .manufacture_id = MACRONIX_ID,
9707 .model_id = MACRONIX_MX25L6405,
9708 .total_size = 8192,
9709 .page_size = 256,
9710 /* MX25L6406E supports SFDP */
9711 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009712 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009713 .tested = TEST_OK_PREW,
9714 .probe = probe_spi_rdid,
9715 .probe_timing = TIMING_ZERO,
9716 .block_erasers =
9717 {
9718 {
9719 .eraseblocks = { {4 * 1024, 2048} },
9720 .block_erase = spi_block_erase_20,
9721 }, {
9722 .eraseblocks = { {64 * 1024, 128} },
9723 .block_erase = spi_block_erase_52,
9724 }, {
9725 .eraseblocks = { {64 * 1024, 128} },
9726 .block_erase = spi_block_erase_d8,
9727 }, {
9728 .eraseblocks = { {8 * 1024 * 1024, 1} },
9729 .block_erase = spi_block_erase_60,
9730 }, {
9731 .eraseblocks = { {8 * 1024 * 1024, 1} },
9732 .block_erase = spi_block_erase_c7,
9733 }
9734 },
9735 .printlock = spi_prettyprint_status_register_bp3_srwd,
9736 .unlock = spi_disable_blockprotect_bp3_srwd,
9737 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009738 .read = spi_chip_read,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009739 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009740 .prepare_access = spi_prepare_io,
9741 .finish_access = spi_finish_io,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009742 },
9743
9744 {
9745 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01009746 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00009747 .bustype = BUS_SPI,
9748 .manufacture_id = MACRONIX_ID,
9749 .model_id = MACRONIX_MX25L6405,
9750 .total_size = 8192,
9751 .page_size = 256,
9752 /* supports SFDP */
9753 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009754 /* FEATURE_QIO: MX25L6473E, MX25L6473F */
9755 /* FEATURE_FAST_READ_DOUT, _QOUT: MX25L6436E */
9756 /* FEATURE_FAST_READ_DIO, _QIO: MX25L6445E, MX25L6465E */
9757 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +00009758 .tested = TEST_OK_PREW,
9759 .probe = probe_spi_rdid,
9760 .probe_timing = TIMING_ZERO,
9761 .block_erasers =
9762 {
9763 {
9764 .eraseblocks = { {4 * 1024, 2048} },
9765 .block_erase = spi_block_erase_20,
9766 }, {
9767 .eraseblocks = { {32 * 1024, 256} },
9768 .block_erase = spi_block_erase_52,
9769 }, {
9770 .eraseblocks = { {64 * 1024, 128} },
9771 .block_erase = spi_block_erase_d8,
9772 }, {
9773 .eraseblocks = { {8 * 1024 * 1024, 1} },
9774 .block_erase = spi_block_erase_60,
9775 }, {
9776 .eraseblocks = { {8 * 1024 * 1024, 1} },
9777 .block_erase = spi_block_erase_c7,
9778 }
9779 },
Nico Huber46552c82024-03-27 01:18:12 +01009780 .reg_bits =
9781 {
9782 .qe = {STATUS1, 6, RW},
9783 },
9784 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009785 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009786 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009787 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009788 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009789 .prepare_access = spi_prepare_io,
9790 .finish_access = spi_finish_io,
Stefan Tauner226037d2013-03-16 01:22:12 +00009791 },
9792
9793 {
9794 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009795 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009796 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009797 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009798 .model_id = MACRONIX_MX25L6495F,
9799 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009800 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009801 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009802 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009803 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009804 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009805 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009806 .block_erasers =
9807 {
9808 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009809 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +00009810 .block_erase = spi_block_erase_20,
9811 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009812 .eraseblocks = { {32 * 1024, 256} },
9813 .block_erase = spi_block_erase_52,
9814 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309815 .eraseblocks = { {64 * 1024, 128} },
9816 .block_erase = spi_block_erase_d8,
9817 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009818 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009819 .block_erase = spi_block_erase_60,
9820 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009821 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009822 .block_erase = spi_block_erase_c7,
9823 }
9824 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009825 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009826 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009827 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009828 .voltage = {2700, 3600},
9829 },
9830
9831 {
9832 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009833 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +00009834 .bustype = BUS_SPI,
9835 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009836 .model_id = MACRONIX_MX25L8005,
9837 .total_size = 1024,
9838 .page_size = 256,
9839 /* MX25L8006E, MX25L8008E support SFDP */
9840 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
Nico Huber46552c82024-03-27 01:18:12 +01009841 /* FEATURE_FAST_READ_DOUT: MX25L8006E, MX25L8008E */
9842 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009843 .tested = TEST_OK_PREW,
9844 .probe = probe_spi_rdid,
9845 .probe_timing = TIMING_ZERO,
9846 .block_erasers =
9847 {
9848 {
9849 .eraseblocks = { {4 * 1024, 256} },
9850 .block_erase = spi_block_erase_20,
9851 }, {
9852 .eraseblocks = { {64 * 1024, 16} },
9853 .block_erase = spi_block_erase_52,
9854 }, {
9855 .eraseblocks = { {64 * 1024, 16} },
9856 .block_erase = spi_block_erase_d8,
9857 }, {
9858 .eraseblocks = { {1024 * 1024, 1} },
9859 .block_erase = spi_block_erase_60,
9860 }, {
9861 .eraseblocks = { {1024 * 1024, 1} },
9862 .block_erase = spi_block_erase_c7,
9863 },
9864 },
9865 .printlock = spi_prettyprint_status_register_bp2_srwd,
9866 .unlock = spi_disable_blockprotect,
9867 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009868 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009869 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9870 },
9871
9872 {
9873 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +09009874 .name = "MX25R3235F",
9875 .bustype = BUS_SPI,
9876 .manufacture_id = MACRONIX_ID,
9877 .model_id = MACRONIX_MX25R3235F,
9878 .total_size = 4096,
9879 .page_size = 256,
9880 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +01009881 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
sibradzicf62623c2020-03-14 17:21:34 +09009882 .tested = TEST_OK_PREW,
9883 .probe = probe_spi_rdid,
9884 .probe_timing = TIMING_ZERO,
9885 .block_erasers =
9886 {
9887 {
9888 .eraseblocks = { {4 * 1024, 1024} },
9889 .block_erase = spi_block_erase_20,
9890 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009891 .eraseblocks = { {32 * 1024, 128} },
9892 .block_erase = spi_block_erase_52,
9893 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309894 .eraseblocks = { {64 * 1024, 64} },
9895 .block_erase = spi_block_erase_d8,
9896 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009897 .eraseblocks = { {4 * 1024 * 1024, 1} },
9898 .block_erase = spi_block_erase_60,
9899 }, {
9900 .eraseblocks = { {4 * 1024 * 1024, 1} },
9901 .block_erase = spi_block_erase_c7,
9902 }
9903 },
Nico Huber5f509992024-03-27 01:18:12 +01009904 .reg_bits =
9905 {
9906 .qe = {STATUS1, 6, RW},
9907 },
9908 .printlock = spi_prettyprint_status_register_bp3_srwd,
sibradzicf62623c2020-03-14 17:21:34 +09009909 .unlock = spi_disable_blockprotect_bp3_srwd,
9910 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +01009911 .read = spi_chip_read,
sibradzicf62623c2020-03-14 17:21:34 +09009912 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009913 .prepare_access = spi_prepare_io,
9914 .finish_access = spi_finish_io,
sibradzicf62623c2020-03-14 17:21:34 +09009915 },
9916
9917 {
9918 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009919 .name = "MX25R6435F",
9920 .bustype = BUS_SPI,
9921 .manufacture_id = MACRONIX_ID,
9922 .model_id = MACRONIX_MX25R6435F,
9923 .total_size = 8192,
9924 .page_size = 256,
9925 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +01009926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009927 .tested = TEST_OK_PREW,
9928 .probe = probe_spi_rdid,
9929 .probe_timing = TIMING_ZERO,
9930 .block_erasers =
9931 {
9932 {
9933 .eraseblocks = { {4 * 1024, 2048} },
9934 .block_erase = spi_block_erase_20,
9935 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009936 .eraseblocks = { {32 * 1024, 256} },
9937 .block_erase = spi_block_erase_52,
9938 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309939 .eraseblocks = { {64 * 1024, 128} },
9940 .block_erase = spi_block_erase_d8,
9941 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009942 .eraseblocks = { {8 * 1024 * 1024, 1} },
9943 .block_erase = spi_block_erase_60,
9944 }, {
9945 .eraseblocks = { {8 * 1024 * 1024, 1} },
9946 .block_erase = spi_block_erase_c7,
9947 }
9948 },
Nico Huber5f509992024-03-27 01:18:12 +01009949 .reg_bits =
9950 {
9951 .qe = {STATUS1, 6, RW},
9952 },
9953 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009954 .unlock = spi_disable_blockprotect_bp3_srwd,
9955 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +01009956 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009957 .voltage = {1650, 3600},
Nico Huber930d4212024-05-04 18:59:15 +02009958 .prepare_access = spi_prepare_io,
9959 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009960 },
9961
9962 {
9963 .vendor = "Macronix",
9964 .name = "MX25U12835F",
9965 .bustype = BUS_SPI,
9966 .manufacture_id = MACRONIX_ID,
9967 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009968 .total_size = 16384,
9969 .page_size = 256,
9970 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +01009971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_35,
9972 .dummy_cycles =
9973 {
9974 /* 133MHz version has configuration register
9975 bit to toggle 8 dummy cycles for QIO, defaults: */
9976 .qpi_fast_read = 4,
9977 .qpi_fast_read_qio = 6,
9978 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00009979 .tested = TEST_OK_PREW,
9980 .probe = probe_spi_rdid,
9981 .probe_timing = TIMING_ZERO,
9982 .block_erasers =
9983 {
9984 {
9985 .eraseblocks = { {4 * 1024, 4096} },
9986 .block_erase = spi_block_erase_20,
9987 }, {
9988 .eraseblocks = { {32 * 1024, 512} },
9989 .block_erase = spi_block_erase_52,
9990 }, {
9991 .eraseblocks = { {64 * 1024, 256} },
9992 .block_erase = spi_block_erase_d8,
9993 }, {
9994 .eraseblocks = { {16 * 1024 * 1024, 1} },
9995 .block_erase = spi_block_erase_60,
9996 }, {
9997 .eraseblocks = { {16 * 1024 * 1024, 1} },
9998 .block_erase = spi_block_erase_c7,
9999 }
10000 },
Angel Ponsf112e242018-09-30 20:14:17 +020010001 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010002 .reg_bits =
10003 {
10004 .qe = {STATUS1, 6, RW},
10005 },
10006 .printlock = spi_prettyprint_status_register_bp3_srwd,
Angel Ponsf112e242018-09-30 20:14:17 +020010007 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010008 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010009 .read = spi_chip_read,
Angel Ponsf112e242018-09-30 20:14:17 +020010010 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010011 .prepare_access = spi_prepare_io,
10012 .finish_access = spi_finish_io,
Angel Ponsf112e242018-09-30 20:14:17 +020010013 },
10014
10015 {
10016 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +000010017 .name = "MX25U1635E",
10018 .bustype = BUS_SPI,
10019 .manufacture_id = MACRONIX_ID,
10020 .model_id = MACRONIX_MX25U1635E,
10021 .total_size = 2048,
10022 .page_size = 256,
10023 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010024 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10025 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10026 .dummy_cycles =
10027 {
10028 .qpi_fast_read = 4,
10029 .qpi_fast_read_qio = 6,
10030 },
Stefan Tauner5c316f92015-02-08 21:57:52 +000010031 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +000010032 .probe = probe_spi_rdid,
10033 .probe_timing = TIMING_ZERO,
10034 .block_erasers =
10035 {
10036 {
10037 .eraseblocks = { {4 * 1024, 512} },
10038 .block_erase = spi_block_erase_20,
10039 }, {
10040 .eraseblocks = { {32 * 1024, 64} },
10041 .block_erase = spi_block_erase_52,
10042 }, {
10043 .eraseblocks = { {64 * 1024, 32} },
10044 .block_erase = spi_block_erase_d8,
10045 }, {
10046 .eraseblocks = { {2 * 1024 * 1024, 1} },
10047 .block_erase = spi_block_erase_60,
10048 }, {
10049 .eraseblocks = { {2 * 1024 * 1024, 1} },
10050 .block_erase = spi_block_erase_c7,
10051 }
10052 },
10053 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010054 .reg_bits =
10055 {
10056 .qe = {STATUS1, 6, RW},
10057 },
10058 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010059 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +000010060 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010061 .read = spi_chip_read,
Vincent Palatinf800f552013-03-15 02:03:16 +000010062 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010063 .prepare_access = spi_prepare_io,
10064 .finish_access = spi_finish_io,
Vincent Palatinf800f552013-03-15 02:03:16 +000010065 },
10066
10067 {
10068 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -070010069 .name = "MX25U25635F",
10070 .bustype = BUS_SPI,
10071 .manufacture_id = MACRONIX_ID,
10072 .model_id = MACRONIX_MX25U25635F,
10073 .total_size = 32768,
10074 .page_size = 256,
10075 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010076 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
10077 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
10078 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Nikolai Artemiev148254b2021-03-23 17:21:10 +110010079 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010080 .probe = probe_spi_rdid,
10081 .probe_timing = TIMING_ZERO,
10082 .block_erasers =
10083 {
10084 {
10085 .eraseblocks = { {4 * 1024, 8192} },
10086 .block_erase = spi_block_erase_21,
10087 }, {
10088 .eraseblocks = { {4 * 1024, 8192} },
10089 .block_erase = spi_block_erase_20,
10090 }, {
10091 .eraseblocks = { {32 * 1024, 1024} },
10092 .block_erase = spi_block_erase_5c,
10093 }, {
10094 .eraseblocks = { {32 * 1024, 1024} },
10095 .block_erase = spi_block_erase_52,
10096 }, {
10097 .eraseblocks = { {64 * 1024, 512} },
10098 .block_erase = spi_block_erase_dc,
10099 }, {
10100 .eraseblocks = { {64 * 1024, 512} },
10101 .block_erase = spi_block_erase_d8,
10102 }, {
10103 .eraseblocks = { {32 * 1024 * 1024, 1} },
10104 .block_erase = spi_block_erase_60,
10105 }, {
10106 .eraseblocks = { {32 * 1024 * 1024, 1} },
10107 .block_erase = spi_block_erase_c7,
10108 }
10109 },
10110 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +010010111 .reg_bits =
10112 {
Nico Huber4fa39c52024-03-27 01:18:12 +010010113 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +010010114 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
10115 },
Nico Huber4fa39c52024-03-27 01:18:12 +010010116 .printlock = spi_prettyprint_status_register_bp3_srwd,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010117 .unlock = spi_disable_blockprotect_bp3_srwd,
10118 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010119 .read = spi_chip_read,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010120 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010121 .prepare_access = spi_prepare_io,
10122 .finish_access = spi_finish_io,
David Tomaschikf75d8c52019-06-20 09:49:01 -070010123 },
10124
10125 {
10126 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010127 .name = "MX25U3235E/F",
10128 .bustype = BUS_SPI,
10129 .manufacture_id = MACRONIX_ID,
10130 .model_id = MACRONIX_MX25U3235E,
10131 .total_size = 4096,
10132 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010133 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010134 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10136 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10137 .dummy_cycles =
10138 {
10139 .qpi_fast_read = 4,
10140 .qpi_fast_read_qio = 6,
10141 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010142 .tested = TEST_OK_PREW,
10143 .probe = probe_spi_rdid,
10144 .probe_timing = TIMING_ZERO,
10145 .block_erasers =
10146 {
10147 {
10148 .eraseblocks = { {4 * 1024, 1024} },
10149 .block_erase = spi_block_erase_20,
10150 }, {
10151 .eraseblocks = { {32 * 1024, 128} },
10152 .block_erase = spi_block_erase_52,
10153 }, {
10154 .eraseblocks = { {64 * 1024, 64} },
10155 .block_erase = spi_block_erase_d8,
10156 }, {
10157 .eraseblocks = { {4 * 1024 * 1024, 1} },
10158 .block_erase = spi_block_erase_60,
10159 }, {
10160 .eraseblocks = { {4 * 1024 * 1024, 1} },
10161 .block_erase = spi_block_erase_c7,
10162 }
10163 },
10164 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010165 .reg_bits =
10166 {
10167 .qe = {STATUS1, 6, RW},
10168 },
10169 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010170 .unlock = spi_disable_blockprotect_bp3_srwd,
10171 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010172 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010173 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010174 .prepare_access = spi_prepare_io,
10175 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010176 },
10177
10178 {
10179 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010180 .name = "MX25U51245G",
10181 .bustype = BUS_SPI,
10182 .manufacture_id = MACRONIX_ID,
10183 .model_id = MACRONIX_MX25U51245G,
10184 .total_size = 65536,
10185 .page_size = 256,
10186 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010187 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
10188 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
10189 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010190 .tested = TEST_OK_PREW,
10191 .probe = probe_spi_rdid,
10192 .probe_timing = TIMING_ZERO,
10193 .block_erasers =
10194 {
10195 {
10196 .eraseblocks = { {4 * 1024, 16384} },
10197 .block_erase = spi_block_erase_21,
10198 }, {
10199 .eraseblocks = { {4 * 1024, 16384} },
10200 .block_erase = spi_block_erase_20,
10201 }, {
10202 .eraseblocks = { {32 * 1024, 2048} },
10203 .block_erase = spi_block_erase_5c,
10204 }, {
10205 .eraseblocks = { {32 * 1024, 2048} },
10206 .block_erase = spi_block_erase_52,
10207 }, {
10208 .eraseblocks = { {64 * 1024, 1024} },
10209 .block_erase = spi_block_erase_dc,
10210 }, {
10211 .eraseblocks = { {64 * 1024, 1024} },
10212 .block_erase = spi_block_erase_d8,
10213 }, {
10214 .eraseblocks = { {64 * 1024 * 1024, 1} },
10215 .block_erase = spi_block_erase_60,
10216 }, {
10217 .eraseblocks = { {64 * 1024 * 1024, 1} },
10218 .block_erase = spi_block_erase_c7,
10219 }
10220 },
10221 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +010010222 .reg_bits =
10223 {
Nico Huber4fa39c52024-03-27 01:18:12 +010010224 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +010010225 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
10226 },
Nico Huber4fa39c52024-03-27 01:18:12 +010010227 .printlock = spi_prettyprint_status_register_bp3_srwd,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010228 .unlock = spi_disable_blockprotect_bp3_srwd,
10229 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010230 .read = spi_chip_read,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010231 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010232 .prepare_access = spi_prepare_io,
10233 .finish_access = spi_finish_io,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010234 },
10235
10236 {
10237 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010238 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010239 .bustype = BUS_SPI,
10240 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010241 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010242 .total_size = 8192,
10243 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010244 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010245 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010246 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10247 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10248 .dummy_cycles =
10249 {
10250 .qpi_fast_read = 4,
10251 .qpi_fast_read_qio = 6,
10252 },
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010253 .tested = TEST_OK_PREW,
10254 .probe = probe_spi_rdid,
10255 .probe_timing = TIMING_ZERO,
10256 .block_erasers =
10257 {
10258 {
10259 .eraseblocks = { {4 * 1024, 2048} },
10260 .block_erase = spi_block_erase_20,
10261 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010262 .eraseblocks = { {32 * 1024, 256} },
10263 .block_erase = spi_block_erase_52,
10264 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010265 .eraseblocks = { {64 * 1024, 128} },
10266 .block_erase = spi_block_erase_d8,
10267 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010268 .eraseblocks = { {8 * 1024 * 1024, 1} },
10269 .block_erase = spi_block_erase_60,
10270 }, {
10271 .eraseblocks = { {8 * 1024 * 1024, 1} },
10272 .block_erase = spi_block_erase_c7,
10273 }
10274 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010275 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010276 .reg_bits =
10277 {
10278 .qe = {STATUS1, 6, RW},
10279 },
10280 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010281 .unlock = spi_disable_blockprotect_bp3_srwd,
10282 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010283 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010284 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010285 .prepare_access = spi_prepare_io,
10286 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010287 },
10288
10289 {
10290 .vendor = "Macronix",
10291 .name = "MX25U8032E",
10292 .bustype = BUS_SPI,
10293 .manufacture_id = MACRONIX_ID,
10294 .model_id = MACRONIX_MX25U8032E,
10295 .total_size = 1024,
10296 .page_size = 256,
10297 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber4fa39c52024-03-27 01:18:12 +010010298 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
10299 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010300 .tested = TEST_OK_PREW,
10301 .probe = probe_spi_rdid,
10302 .probe_timing = TIMING_ZERO,
10303 .block_erasers =
10304 {
10305 {
10306 .eraseblocks = { {4 * 1024, 256} },
10307 .block_erase = spi_block_erase_20,
10308 }, {
10309 .eraseblocks = { {32 * 1024, 32} },
10310 .block_erase = spi_block_erase_52,
10311 }, {
10312 .eraseblocks = { {64 * 1024, 16} },
10313 .block_erase = spi_block_erase_d8,
10314 }, {
10315 .eraseblocks = { {1024 * 1024, 1} },
10316 .block_erase = spi_block_erase_60,
10317 }, {
10318 .eraseblocks = { {1024 * 1024, 1} },
10319 .block_erase = spi_block_erase_c7,
10320 }
10321 },
10322 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010323 .reg_bits =
10324 {
10325 .qe = {STATUS1, 6, RW},
10326 },
10327 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010328 .unlock = spi_disable_blockprotect_bp3_srwd,
10329 .write = spi_chip_write_256,
Nico Huber4fa39c52024-03-27 01:18:12 +010010330 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010331 .voltage = {1650, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020010332 .prepare_access = spi_prepare_io,
10333 .finish_access = spi_finish_io,
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010334 },
10335
10336 {
10337 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +000010338 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010339 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010340 .manufacture_id = MACRONIX_ID,
10341 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010342 .total_size = 128,
10343 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010344 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10345 .tested = TEST_UNTESTED,
10346 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010347 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010348 .block_erasers =
10349 {
10350 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010351 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010352 {8 * 1024, 1},
10353 {4 * 1024, 2},
10354 {8 * 1024, 2},
10355 {32 * 1024, 1},
10356 {64 * 1024, 1},
10357 },
Sean Nelson35727f72010-01-28 23:55:12 +000010358 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010359 }, {
10360 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010361 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010362 }
10363 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010364 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010365 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010366 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010367 .prepare_access = prepare_memory_access,
10368 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010369 },
10370
10371 {
10372 .vendor = "Macronix",
10373 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010374 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010375 .manufacture_id = MACRONIX_ID,
10376 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010377 .total_size = 128,
10378 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010379 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +000010380 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010381 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010382 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010383 .block_erasers =
10384 {
10385 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010386 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010387 {64 * 1024, 1},
10388 {32 * 1024, 1},
10389 {8 * 1024, 2},
10390 {4 * 1024, 2},
10391 {8 * 1024, 1},
10392 },
Sean Nelson35727f72010-01-28 23:55:12 +000010393 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010394 }, {
10395 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010396 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010397 }
10398 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010399 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010401 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010402 .prepare_access = prepare_memory_access,
10403 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010404 },
10405
10406 {
10407 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010408 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010409 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010410 .manufacture_id = MACRONIX_ID,
10411 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010412 .total_size = 256,
10413 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010414 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010415 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010416 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010417 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010418 .block_erasers =
10419 {
10420 {
10421 .eraseblocks = {
10422 {16 * 1024, 1},
10423 {8 * 1024, 2},
10424 {32 * 1024, 1},
10425 {64 * 1024, 3},
10426 },
Sean Nelson35727f72010-01-28 23:55:12 +000010427 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010428 }, {
10429 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010430 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010431 },
10432 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010433 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010434 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010435 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010436 .prepare_access = prepare_memory_access,
10437 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010438 },
10439
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010440 {
10441 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010442 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010443 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010444 .manufacture_id = MACRONIX_ID,
10445 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010446 .total_size = 256,
10447 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010448 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010449 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010450 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010451 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010452 .block_erasers =
10453 {
10454 {
10455 .eraseblocks = {
10456 {64 * 1024, 3},
10457 {32 * 1024, 1},
10458 {8 * 1024, 2},
10459 {16 * 1024, 1},
10460 },
Sean Nelson35727f72010-01-28 23:55:12 +000010461 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010462 }, {
10463 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010464 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010465 },
10466 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010467 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010468 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010469 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010470 .prepare_access = prepare_memory_access,
10471 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010472 },
10473
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010474 {
10475 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +000010476 .name = "MX29F022(N)B",
10477 .bustype = BUS_PARALLEL,
10478 .manufacture_id = MACRONIX_ID,
10479 .model_id = MACRONIX_MX29F022B,
10480 .total_size = 256,
10481 .page_size = 0, /* unused */
10482 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10483 .tested = TEST_UNTESTED,
10484 .probe = probe_jedec,
10485 .probe_timing = TIMING_ZERO,
10486 .block_erasers =
10487 {
10488 {
10489 .eraseblocks = {
10490 {16 * 1024, 1},
10491 {8 * 1024, 2},
10492 {32 * 1024, 1},
10493 {64 * 1024, 3},
10494 },
10495 .block_erase = erase_sector_jedec,
10496 }, {
10497 .eraseblocks = { {256 * 1024, 1} },
10498 .block_erase = erase_chip_block_jedec,
10499 }
10500 },
10501 .write = write_jedec_1,
10502 .read = read_memmapped,
10503 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010504 .prepare_access = prepare_memory_access,
10505 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010506 },
10507
10508 {
10509 .vendor = "Macronix",
10510 .name = "MX29F022(N)T",
10511 .bustype = BUS_PARALLEL,
10512 .manufacture_id = MACRONIX_ID,
10513 .model_id = MACRONIX_MX29F022T,
10514 .total_size = 256,
10515 .page_size = 0, /* unused */
10516 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10517 .tested = TEST_OK_PREW,
10518 .probe = probe_jedec,
10519 .probe_timing = TIMING_ZERO,
10520 .block_erasers =
10521 {
10522 {
10523 .eraseblocks = {
10524 {64 * 1024, 3},
10525 {32 * 1024, 1},
10526 {8 * 1024, 2},
10527 {16 * 1024, 1},
10528 },
10529 .block_erase = erase_sector_jedec,
10530 }, {
10531 .eraseblocks = { {256 * 1024, 1} },
10532 .block_erase = erase_chip_block_jedec,
10533 }
10534 },
10535 .write = write_jedec_1,
10536 .read = read_memmapped,
10537 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010538 .prepare_access = prepare_memory_access,
10539 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010540 },
10541
10542 {
10543 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +000010544 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010545 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +000010546 .manufacture_id = MACRONIX_ID,
10547 .model_id = MACRONIX_MX29F040,
10548 .total_size = 512,
10549 .page_size = 64 * 1024,
10550 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10551 .tested = TEST_UNTESTED,
10552 .probe = probe_jedec,
10553 .probe_timing = TIMING_ZERO,
10554 .block_erasers =
10555 {
10556 {
10557 .eraseblocks = { {64 * 1024, 8} },
10558 .block_erase = erase_sector_jedec,
10559 }, {
10560 .eraseblocks = { {512 * 1024, 1} },
10561 .block_erase = erase_chip_block_jedec,
10562 },
10563 },
10564 .write = write_jedec_1,
10565 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010566 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010567 .prepare_access = prepare_memory_access,
10568 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +000010569 },
10570
10571 {
10572 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010573 .name = "MX29GL128F",
10574 .bustype = BUS_PARALLEL,
10575 .manufacture_id = MACRONIX_ID,
10576 .model_id = MACRONIX_MX29GL128F,
10577 .total_size = 16384,
10578 .page_size = 128 * 1024, /* actual page size is 16 */
10579 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10580 .tested = TEST_UNTESTED,
10581 .probe = probe_jedec_29gl,
10582 .probe_timing = TIMING_ZERO,
10583 .block_erasers =
10584 {
10585 {
10586 .eraseblocks = { {128 * 1024, 128} },
10587 .block_erase = erase_sector_jedec,
10588 }, {
10589 .eraseblocks = { {16 * 1024 * 1024, 1} },
10590 .block_erase = erase_chip_block_jedec,
10591 },
10592 },
10593 .write = write_jedec_1,
10594 .read = read_memmapped,
10595 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010596 .prepare_access = prepare_memory_access,
10597 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010598 },
10599
10600 {
10601 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010602 .name = "MX29GL320EB",
10603 .bustype = BUS_PARALLEL,
10604 .manufacture_id = MACRONIX_ID,
10605 .model_id = MACRONIX_MX29GL320EB,
10606 .total_size = 4096,
10607 .page_size = 128 * 1024, /* actual page size is 16 */
10608 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10609 .tested = TEST_UNTESTED,
10610 .probe = probe_jedec_29gl,
10611 .probe_timing = TIMING_ZERO,
10612 .block_erasers =
10613 {
10614 {
10615 .eraseblocks = {
10616 {8 * 1024, 8},
10617 {64 * 1024, 63},
10618 },
10619 .block_erase = erase_sector_jedec,
10620 }, {
10621 .eraseblocks = { {4 * 1024 * 1024, 1} },
10622 .block_erase = erase_chip_block_jedec,
10623 },
10624 },
10625 .write = write_jedec_1,
10626 .read = read_memmapped,
10627 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010628 .prepare_access = prepare_memory_access,
10629 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010630 },
10631
10632 {
10633 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010634 .name = "MX29GL320EH/L",
10635 .bustype = BUS_PARALLEL,
10636 .manufacture_id = MACRONIX_ID,
10637 .model_id = MACRONIX_MX29GL320EHL,
10638 .total_size = 4096,
10639 .page_size = 128 * 1024, /* actual page size is 16 */
10640 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10641 .tested = TEST_UNTESTED,
10642 .probe = probe_jedec_29gl,
10643 .probe_timing = TIMING_ZERO,
10644 .block_erasers =
10645 {
10646 {
10647 .eraseblocks = { {64 * 1024, 64} },
10648 .block_erase = erase_sector_jedec,
10649 }, {
10650 .eraseblocks = { {4 * 1024 * 1024, 1} },
10651 .block_erase = erase_chip_block_jedec,
10652 },
10653 },
10654 .write = write_jedec_1,
10655 .read = read_memmapped,
10656 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010657 .prepare_access = prepare_memory_access,
10658 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010659 },
10660
10661 {
10662 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010663 .name = "MX29GL320ET",
10664 .bustype = BUS_PARALLEL,
10665 .manufacture_id = MACRONIX_ID,
10666 .model_id = MACRONIX_MX29GL320ET,
10667 .total_size = 4096,
10668 .page_size = 128 * 1024, /* actual page size is 16 */
10669 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10670 .tested = TEST_UNTESTED,
10671 .probe = probe_jedec_29gl,
10672 .probe_timing = TIMING_ZERO,
10673 .block_erasers =
10674 {
10675 {
10676 .eraseblocks = {
10677 {64 * 1024, 63},
10678 {8 * 1024, 8},
10679 },
10680 .block_erase = erase_sector_jedec,
10681 }, {
10682 .eraseblocks = { {4 * 1024 * 1024, 1} },
10683 .block_erase = erase_chip_block_jedec,
10684 },
10685 },
10686 .write = write_jedec_1,
10687 .read = read_memmapped,
10688 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010689 .prepare_access = prepare_memory_access,
10690 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010691 },
10692
10693 {
10694 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010695 .name = "MX29GL640EB",
10696 .bustype = BUS_PARALLEL,
10697 .manufacture_id = MACRONIX_ID,
10698 .model_id = MACRONIX_MX29GL640EB,
10699 .total_size = 8192,
10700 .page_size = 128 * 1024, /* actual page size is 16 */
10701 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10702 .tested = TEST_UNTESTED,
10703 .probe = probe_jedec_29gl,
10704 .probe_timing = TIMING_ZERO,
10705 .block_erasers =
10706 {
10707 {
10708 .eraseblocks = {
10709 {8 * 1024, 8},
10710 {64 * 1024, 127},
10711 },
10712 .block_erase = erase_sector_jedec,
10713 }, {
10714 .eraseblocks = { {8 * 1024 * 1024, 1} },
10715 .block_erase = erase_chip_block_jedec,
10716 },
10717 },
10718 .write = write_jedec_1,
10719 .read = read_memmapped,
10720 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010721 .prepare_access = prepare_memory_access,
10722 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010723 },
10724
10725 {
10726 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010727 .name = "MX29GL640EH/L",
10728 .bustype = BUS_PARALLEL,
10729 .manufacture_id = MACRONIX_ID,
10730 .model_id = MACRONIX_MX29GL640EHL,
10731 .total_size = 8192,
10732 .page_size = 128 * 1024, /* actual page size is 16 */
10733 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10734 .tested = TEST_UNTESTED,
10735 .probe = probe_jedec_29gl,
10736 .probe_timing = TIMING_ZERO,
10737 .block_erasers =
10738 {
10739 {
10740 .eraseblocks = { {64 * 1024, 128} },
10741 .block_erase = erase_sector_jedec,
10742 }, {
10743 .eraseblocks = { {8 * 1024 * 1024, 1} },
10744 .block_erase = erase_chip_block_jedec,
10745 },
10746 },
10747 .write = write_jedec_1,
10748 .read = read_memmapped,
10749 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010750 .prepare_access = prepare_memory_access,
10751 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010752 },
10753
10754 {
10755 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010756 .name = "MX29GL640ET",
10757 .bustype = BUS_PARALLEL,
10758 .manufacture_id = MACRONIX_ID,
10759 .model_id = MACRONIX_MX29GL640ET,
10760 .total_size = 8192,
10761 .page_size = 128 * 1024, /* actual page size is 16 */
10762 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10763 .tested = TEST_UNTESTED,
10764 .probe = probe_jedec_29gl,
10765 .probe_timing = TIMING_ZERO,
10766 .block_erasers =
10767 {
10768 {
10769 .eraseblocks = {
10770 {64 * 1024, 127},
10771 {8 * 1024, 8},
10772 },
10773 .block_erase = erase_sector_jedec,
10774 }, {
10775 .eraseblocks = { {8 * 1024 * 1024, 1} },
10776 .block_erase = erase_chip_block_jedec,
10777 },
10778 },
10779 .write = write_jedec_1,
10780 .read = read_memmapped,
10781 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010782 .prepare_access = prepare_memory_access,
10783 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010784 },
10785
10786 {
10787 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000010788 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010789 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010790 .manufacture_id = MACRONIX_ID,
10791 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010792 .total_size = 512,
10793 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010794 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10795 .tested = TEST_UNTESTED,
10796 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010797 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010798 .block_erasers =
10799 {
10800 {
Stefan Tauner6697f712014-08-06 15:09:15 +000010801 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000010802 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010803 }, {
10804 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010805 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010806 },
10807 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010808 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010809 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010810 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010811 .prepare_access = prepare_memory_access,
10812 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000010813 },
10814
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010815 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010816 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020010817 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010818 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010819 .manufacture_id = MACRONIX_ID,
10820 .model_id = MACRONIX_MX66L51235F,
10821 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010822 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010823 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10824 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010825 .tested = TEST_OK_PREW,
10826 .probe = probe_spi_rdid,
10827 .probe_timing = TIMING_ZERO,
10828 .block_erasers =
10829 {
10830 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010831 .eraseblocks = { {4 * 1024, 16384} },
10832 .block_erase = spi_block_erase_21,
10833 }, {
10834 .eraseblocks = { {4 * 1024, 16384} },
10835 .block_erase = spi_block_erase_20,
10836 }, {
10837 .eraseblocks = { {32 * 1024, 2048} },
10838 .block_erase = spi_block_erase_5c,
10839 }, {
10840 .eraseblocks = { {32 * 1024, 2048} },
10841 .block_erase = spi_block_erase_52,
10842 }, {
10843 .eraseblocks = { {64 * 1024, 1024} },
10844 .block_erase = spi_block_erase_dc,
10845 }, {
10846 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010847 .block_erase = spi_block_erase_d8,
10848 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010849 .eraseblocks = { {64 * 1024 * 1024, 1} },
10850 .block_erase = spi_block_erase_60,
10851 }, {
10852 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010853 .block_erase = spi_block_erase_c7,
10854 }
10855 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010856 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10857 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010858 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010859 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010860 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010861 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010862 .prepare_access = spi_prepare_io,
10863 .finish_access = spi_finish_io,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010864 },
10865
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010866 {
10867 .vendor = "Macronix",
10868 .name = "MX66L1G45G",
10869 .bustype = BUS_SPI,
10870 .manufacture_id = MACRONIX_ID,
10871 .model_id = MACRONIX_MX66L1G45G,
10872 .total_size = 131072,
10873 .page_size = 256,
10874 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10875 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
10876 .tested = TEST_OK_PREW,
10877 .probe = probe_spi_rdid,
10878 .probe_timing = TIMING_ZERO,
10879 .block_erasers =
10880 {
10881 {
10882 .eraseblocks = { {4 * 1024, 32768} },
10883 .block_erase = spi_block_erase_21,
10884 }, {
10885 .eraseblocks = { {4 * 1024, 32768} },
10886 .block_erase = spi_block_erase_20,
10887 }, {
10888 .eraseblocks = { {32 * 1024, 4096} },
10889 .block_erase = spi_block_erase_5c,
10890 }, {
10891 .eraseblocks = { {32 * 1024, 4096} },
10892 .block_erase = spi_block_erase_52,
10893 }, {
10894 .eraseblocks = { {64 * 1024, 2048} },
10895 .block_erase = spi_block_erase_dc,
10896 }, {
10897 .eraseblocks = { {64 * 1024, 2048} },
10898 .block_erase = spi_block_erase_d8,
10899 }, {
10900 .eraseblocks = { {128 * 1024 * 1024, 1} },
10901 .block_erase = spi_block_erase_60,
10902 }, {
10903 .eraseblocks = { {128 * 1024 * 1024, 1} },
10904 .block_erase = spi_block_erase_c7,
10905 }
10906 },
10907 /* TODO: security register and SBLK/SBULK, configuration register */
10908 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10909 .unlock = spi_disable_blockprotect_bp3_srwd,
10910 .write = spi_chip_write_256,
10911 .read = spi_chip_read, /* Fast read (0x0B) supported */
10912 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020010913 .prepare_access = spi_prepare_io,
10914 .finish_access = spi_finish_io,
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010915 },
10916
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010917 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10918 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10919 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10920 * only is successful if RDID does not work.
10921 */
10922 {
10923 .vendor = "Micron/Numonyx/ST",
10924 .name = "M25P05",
10925 .bustype = BUS_SPI,
10926 .manufacture_id = 0, /* Not used. */
10927 .model_id = ST_M25P05_RES,
10928 .total_size = 64,
10929 .page_size = 256,
10930 .feature_bits = FEATURE_WRSR_WREN,
10931 .tested = TEST_UNTESTED,
10932 .probe = probe_spi_res1,
10933 .probe_timing = TIMING_ZERO,
10934 .block_erasers =
10935 {
10936 {
10937 .eraseblocks = { {32 * 1024, 2} },
10938 .block_erase = spi_block_erase_d8,
10939 }, {
10940 .eraseblocks = { {64 * 1024, 1} },
10941 .block_erase = spi_block_erase_c7,
10942 }
10943 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010944 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010945 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010946 .write = spi_chip_write_1, /* 128 */
10947 .read = spi_chip_read,
10948 .voltage = {2700, 3600},
10949 },
10950
10951 {
10952 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010953 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010954 .bustype = BUS_SPI,
10955 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010956 .model_id = ST_M25P05A,
10957 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010958 .page_size = 256,
10959 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010960 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010961 .probe = probe_spi_rdid,
10962 .probe_timing = TIMING_ZERO,
10963 .block_erasers =
10964 {
10965 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010966 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010967 .block_erase = spi_block_erase_d8,
10968 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010969 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010970 .block_erase = spi_block_erase_c7,
10971 }
10972 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010973 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010974 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010975 .write = spi_chip_write_256,
10976 .read = spi_chip_read,
10977 .voltage = {2700, 3600},
10978 },
10979
10980 /* The ST M25P10 has the same problem as the M25P05. */
10981 {
10982 .vendor = "Micron/Numonyx/ST",
10983 .name = "M25P10",
10984 .bustype = BUS_SPI,
10985 .manufacture_id = 0, /* Not used. */
10986 .model_id = ST_M25P10_RES,
10987 .total_size = 128,
10988 .page_size = 256,
10989 .feature_bits = FEATURE_WRSR_WREN,
10990 .tested = TEST_UNTESTED,
10991 .probe = probe_spi_res1,
10992 .probe_timing = TIMING_ZERO,
10993 .block_erasers =
10994 {
10995 {
10996 .eraseblocks = { {32 * 1024, 4} },
10997 .block_erase = spi_block_erase_d8,
10998 }, {
10999 .eraseblocks = { {128 * 1024, 1} },
11000 .block_erase = spi_block_erase_c7,
11001 }
11002 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011003 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011004 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011005 .write = spi_chip_write_1, /* 128 */
11006 .read = spi_chip_read,
11007 .voltage = {2700, 3600},
11008 },
11009
11010 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011011 .vendor = "Micron/Numonyx/ST",
11012 .name = "M25P10-A",
11013 .bustype = BUS_SPI,
11014 .manufacture_id = ST_ID,
11015 .model_id = ST_M25P10A,
11016 .total_size = 128,
11017 .page_size = 256,
11018 .feature_bits = FEATURE_WRSR_WREN,
11019 .tested = TEST_OK_PREW,
11020 .probe = probe_spi_rdid,
11021 .probe_timing = TIMING_ZERO,
11022 .block_erasers =
11023 {
11024 {
11025 .eraseblocks = { {32 * 1024, 4} },
11026 .block_erase = spi_block_erase_d8,
11027 }, {
11028 .eraseblocks = { {128 * 1024, 1} },
11029 .block_erase = spi_block_erase_c7,
11030 }
11031 },
11032 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11033 .unlock = spi_disable_blockprotect_bp3_srwd,
11034 .write = spi_chip_write_256,
11035 .read = spi_chip_read,
11036 .voltage = {2700, 3600},
11037 },
11038
11039 {
11040 .vendor = "Micron/Numonyx/ST",
11041 .name = "M25P128",
11042 .bustype = BUS_SPI,
11043 .manufacture_id = ST_ID,
11044 .model_id = ST_M25P128,
11045 .total_size = 16384,
11046 .page_size = 256,
11047 .feature_bits = FEATURE_WRSR_WREN,
11048 .tested = TEST_OK_PREW,
11049 .probe = probe_spi_rdid,
11050 .probe_timing = TIMING_ZERO,
11051 .block_erasers =
11052 {
11053 {
11054 .eraseblocks = { {256 * 1024, 64} },
11055 .block_erase = spi_block_erase_d8,
11056 }, {
11057 .eraseblocks = { {16 * 1024 * 1024, 1} },
11058 .block_erase = spi_block_erase_c7,
11059 }
11060 },
11061 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11062 .unlock = spi_disable_blockprotect_bp3_srwd,
11063 .write = spi_chip_write_256,
11064 .read = spi_chip_read,
11065 .voltage = {2700, 3600},
11066 },
11067
11068 {
11069 .vendor = "Micron/Numonyx/ST",
11070 .name = "M25P16",
11071 .bustype = BUS_SPI,
11072 .manufacture_id = ST_ID,
11073 .model_id = ST_M25P16,
11074 .total_size = 2048,
11075 .page_size = 256,
11076 .feature_bits = FEATURE_WRSR_WREN,
11077 .tested = TEST_OK_PREW,
11078 .probe = probe_spi_rdid,
11079 .probe_timing = TIMING_ZERO,
11080 .block_erasers =
11081 {
11082 {
11083 .eraseblocks = { {64 * 1024, 32} },
11084 .block_erase = spi_block_erase_d8,
11085 }, {
11086 .eraseblocks = { {2 * 1024 * 1024, 1} },
11087 .block_erase = spi_block_erase_c7,
11088 }
11089 },
11090 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11091 .unlock = spi_disable_blockprotect_bp3_srwd,
11092 .write = spi_chip_write_256,
11093 .read = spi_chip_read,
11094 .voltage = {2700, 3600},
11095 },
11096
11097 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011098 .vendor = "Micron/Numonyx/ST", /* Numonyx */
11099 .name = "M25P20",
11100 .bustype = BUS_SPI,
11101 .manufacture_id = ST_ID,
11102 .model_id = ST_M25P20,
11103 .total_size = 256,
11104 .page_size = 256,
11105 .feature_bits = FEATURE_WRSR_WREN,
11106 .tested = TEST_UNTESTED,
11107 .probe = probe_spi_rdid,
11108 .probe_timing = TIMING_ZERO,
11109 .block_erasers =
11110 {
11111 {
11112 .eraseblocks = { {64 * 1024, 4} },
11113 .block_erase = spi_block_erase_d8,
11114 }, {
11115 .eraseblocks = { {256 * 1024, 1} },
11116 .block_erase = spi_block_erase_c7,
11117 }
11118 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011119 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011120 .unlock = spi_disable_blockprotect,
11121 .write = spi_chip_write_256,
11122 .read = spi_chip_read, /* Fast read (0x0B) supported */
11123 .voltage = {2700, 3600},
11124 },
11125
11126 {
11127 .vendor = "Micron/Numonyx/ST",
11128 .name = "M25P20-old",
11129 .bustype = BUS_SPI,
11130 .manufacture_id = 0, /* Not used. */
11131 .model_id = ST_M25P20_RES,
11132 .total_size = 256,
11133 .page_size = 256,
11134 .feature_bits = FEATURE_WRSR_WREN,
11135 .tested = TEST_OK_PREW,
11136 .probe = probe_spi_res1,
11137 .probe_timing = TIMING_ZERO,
11138 .block_erasers =
11139 {
11140 {
11141 .eraseblocks = { {64 * 1024, 4} },
11142 .block_erase = spi_block_erase_d8,
11143 }, {
11144 .eraseblocks = { {256 * 1024, 1} },
11145 .block_erase = spi_block_erase_c7,
11146 }
11147 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011148 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011149 .unlock = spi_disable_blockprotect,
11150 .write = spi_chip_write_256,
11151 .read = spi_chip_read, /* Fast read (0x0B) supported */
11152 .voltage = {2700, 3600},
11153 },
11154
11155 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011156 .vendor = "Micron/Numonyx/ST",
11157 .name = "M25P32",
11158 .bustype = BUS_SPI,
11159 .manufacture_id = ST_ID,
11160 .model_id = ST_M25P32,
11161 .total_size = 4096,
11162 .page_size = 256,
11163 .feature_bits = FEATURE_WRSR_WREN,
11164 .tested = TEST_OK_PREW,
11165 .probe = probe_spi_rdid,
11166 .probe_timing = TIMING_ZERO,
11167 .block_erasers =
11168 {
11169 {
11170 .eraseblocks = { {64 * 1024, 64} },
11171 .block_erase = spi_block_erase_d8,
11172 }, {
11173 .eraseblocks = { {4 * 1024 * 1024, 1} },
11174 .block_erase = spi_block_erase_c7,
11175 }
11176 },
11177 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11178 .unlock = spi_disable_blockprotect_bp3_srwd,
11179 .write = spi_chip_write_256,
11180 .read = spi_chip_read,
11181 .voltage = {2700, 3600},
11182 },
11183
11184 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011185 .vendor = "Micron/Numonyx/ST", /* Numonyx */
11186 .name = "M25P40",
11187 .bustype = BUS_SPI,
11188 .manufacture_id = ST_ID,
11189 .model_id = ST_M25P40,
11190 .total_size = 512,
11191 .page_size = 256,
11192 .feature_bits = FEATURE_WRSR_WREN,
11193 .tested = TEST_OK_PREW,
11194 .probe = probe_spi_rdid,
11195 .probe_timing = TIMING_ZERO,
11196 .block_erasers =
11197 {
11198 {
11199 .eraseblocks = { {64 * 1024, 8} },
11200 .block_erase = spi_block_erase_d8,
11201 }, {
11202 .eraseblocks = { {512 * 1024, 1} },
11203 .block_erase = spi_block_erase_c7,
11204 }
11205 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011206 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011207 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011208 .write = spi_chip_write_256,
11209 .read = spi_chip_read,
11210 .voltage = {2700, 3600},
11211 },
11212
11213 {
11214 .vendor = "Micron/Numonyx/ST",
11215 .name = "M25P40-old",
11216 .bustype = BUS_SPI,
11217 .manufacture_id = 0, /* Not used. */
11218 .model_id = ST_M25P40_RES,
11219 .total_size = 512,
11220 .page_size = 256,
11221 .feature_bits = FEATURE_WRSR_WREN,
11222 .tested = TEST_UNTESTED,
11223 .probe = probe_spi_res1,
11224 .probe_timing = TIMING_ZERO,
11225 .block_erasers =
11226 {
11227 {
11228 .eraseblocks = { {64 * 1024, 8} },
11229 .block_erase = spi_block_erase_d8,
11230 }, {
11231 .eraseblocks = { {512 * 1024, 1} },
11232 .block_erase = spi_block_erase_c7,
11233 }
11234 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011235 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011236 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011237 .write = spi_chip_write_256,
11238 .read = spi_chip_read,
11239 },
11240
11241 {
11242 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011243 .name = "M25P64",
11244 .bustype = BUS_SPI,
11245 .manufacture_id = ST_ID,
11246 .model_id = ST_M25P64,
11247 .total_size = 8192,
11248 .page_size = 256,
11249 .feature_bits = FEATURE_WRSR_WREN,
11250 .tested = TEST_OK_PREW,
11251 .probe = probe_spi_rdid,
11252 .probe_timing = TIMING_ZERO,
11253 .block_erasers =
11254 {
11255 {
11256 .eraseblocks = { {64 * 1024, 128} },
11257 .block_erase = spi_block_erase_d8,
11258 }, {
11259 .eraseblocks = { {8 * 1024 * 1024, 1} },
11260 .block_erase = spi_block_erase_c7,
11261 }
11262 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011263 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011264 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011265 .write = spi_chip_write_256,
11266 .read = spi_chip_read,
11267 .voltage = {2700, 3600},
11268 },
11269
11270 {
11271 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011272 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011273 .bustype = BUS_SPI,
11274 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011275 .model_id = ST_M25P80,
11276 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011277 .page_size = 256,
11278 .feature_bits = FEATURE_WRSR_WREN,
11279 .tested = TEST_OK_PREW,
11280 .probe = probe_spi_rdid,
11281 .probe_timing = TIMING_ZERO,
11282 .block_erasers =
11283 {
11284 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011285 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011286 .block_erase = spi_block_erase_d8,
11287 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011288 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011289 .block_erase = spi_block_erase_c7,
11290 }
11291 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011292 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011293 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011294 .write = spi_chip_write_256,
11295 .read = spi_chip_read,
11296 .voltage = {2700, 3600},
11297 },
11298
11299 {
11300 .vendor = "Micron/Numonyx/ST",
11301 .name = "M25PE10",
11302 .bustype = BUS_SPI,
11303 .manufacture_id = ST_ID,
11304 .model_id = ST_M25PE10,
11305 .total_size = 128,
11306 .page_size = 256,
11307 .feature_bits = FEATURE_WRSR_WREN,
11308 .tested = TEST_UNTESTED,
11309 .probe = probe_spi_rdid,
11310 .probe_timing = TIMING_ZERO,
11311 .block_erasers =
11312 {
11313 {
11314 .eraseblocks = { {4 * 1024, 32} },
11315 .block_erase = spi_block_erase_20,
11316 }, {
11317 .eraseblocks = { {64 * 1024, 2} },
11318 .block_erase = spi_block_erase_d8,
11319 }, {
11320 .eraseblocks = { {128 * 1024, 1} },
11321 .block_erase = spi_block_erase_c7,
11322 }
11323 },
11324 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11325 .unlock = spi_disable_blockprotect,
11326 .write = spi_chip_write_256,
11327 .read = spi_chip_read,
11328 .voltage = {2700, 3600},
11329 },
11330
11331 {
11332 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011333 .name = "M25PE16",
11334 .bustype = BUS_SPI,
11335 .manufacture_id = ST_ID,
11336 .model_id = ST_M25PE16,
11337 .total_size = 2048,
11338 .page_size = 256,
11339 .feature_bits = FEATURE_WRSR_WREN,
11340 .tested = TEST_UNTESTED,
11341 .probe = probe_spi_rdid,
11342 .probe_timing = TIMING_ZERO,
11343 .block_erasers =
11344 {
11345 {
11346 .eraseblocks = { {4 * 1024, 512} },
11347 .block_erase = spi_block_erase_20,
11348 }, {
11349 .eraseblocks = { {64 * 1024, 32} },
11350 .block_erase = spi_block_erase_d8,
11351 }, {
11352 .eraseblocks = { {2 * 1024 * 1024, 1} },
11353 .block_erase = spi_block_erase_c7,
11354 }
11355 },
11356 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11357 .unlock = spi_disable_blockprotect,
11358 .write = spi_chip_write_256,
11359 .read = spi_chip_read,
11360 .voltage = {2700, 3600},
11361 },
11362
11363 {
11364 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011365 .name = "M25PE20",
11366 .bustype = BUS_SPI,
11367 .manufacture_id = ST_ID,
11368 .model_id = ST_M25PE20,
11369 .total_size = 256,
11370 .page_size = 256,
11371 .feature_bits = FEATURE_WRSR_WREN,
11372 .tested = TEST_UNTESTED,
11373 .probe = probe_spi_rdid,
11374 .probe_timing = TIMING_ZERO,
11375 .block_erasers =
11376 {
11377 {
11378 .eraseblocks = { {4 * 1024, 64} },
11379 .block_erase = spi_block_erase_20,
11380 }, {
11381 .eraseblocks = { {64 * 1024, 4} },
11382 .block_erase = spi_block_erase_d8,
11383 }, {
11384 .eraseblocks = { {256 * 1024, 1} },
11385 .block_erase = spi_block_erase_c7,
11386 }
11387 },
11388 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11389 .unlock = spi_disable_blockprotect,
11390 .write = spi_chip_write_256,
11391 .read = spi_chip_read,
11392 .voltage = {2700, 3600},
11393 },
11394
11395 {
11396 .vendor = "Micron/Numonyx/ST",
11397 .name = "M25PE40",
11398 .bustype = BUS_SPI,
11399 .manufacture_id = ST_ID,
11400 .model_id = ST_M25PE40,
11401 .total_size = 512,
11402 .page_size = 256,
11403 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011404 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011405 .probe = probe_spi_rdid,
11406 .probe_timing = TIMING_ZERO,
11407 .block_erasers =
11408 {
11409 {
11410 .eraseblocks = { {4 * 1024, 128} },
11411 .block_erase = spi_block_erase_20,
11412 }, {
11413 .eraseblocks = { {64 * 1024, 8} },
11414 .block_erase = spi_block_erase_d8,
11415 }, {
11416 .eraseblocks = { {512 * 1024, 1} },
11417 .block_erase = spi_block_erase_c7,
11418 }
11419 },
11420 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11421 .unlock = spi_disable_blockprotect,
11422 .write = spi_chip_write_256,
11423 .read = spi_chip_read,
11424 .voltage = {2700, 3600},
11425 },
11426
11427 {
11428 .vendor = "Micron/Numonyx/ST",
11429 .name = "M25PE80",
11430 .bustype = BUS_SPI,
11431 .manufacture_id = ST_ID,
11432 .model_id = ST_M25PE80,
11433 .total_size = 1024,
11434 .page_size = 256,
11435 .feature_bits = FEATURE_WRSR_WREN,
11436 .tested = TEST_OK_PREW,
11437 .probe = probe_spi_rdid,
11438 .probe_timing = TIMING_ZERO,
11439 .block_erasers =
11440 {
11441 {
11442 .eraseblocks = { {4 * 1024, 256} },
11443 .block_erase = spi_block_erase_20,
11444 }, {
11445 .eraseblocks = { {64 * 1024, 16} },
11446 .block_erase = spi_block_erase_d8,
11447 }, {
11448 .eraseblocks = { {1024 * 1024, 1} },
11449 .block_erase = spi_block_erase_c7,
11450 }
11451 },
11452 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11453 .unlock = spi_disable_blockprotect,
11454 .write = spi_chip_write_256,
11455 .read = spi_chip_read,
11456 .voltage = {2700, 3600},
11457 },
11458
11459 {
11460 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011461 .name = "M25PX16",
11462 .bustype = BUS_SPI,
11463 .manufacture_id = ST_ID,
11464 .model_id = ST_M25PX16,
11465 .total_size = 2048,
11466 .page_size = 256,
11467 /* OTP: 64B total; read 0x4B; write 0x42 */
11468 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11469 .tested = TEST_OK_PREW,
11470 .probe = probe_spi_rdid,
11471 .probe_timing = TIMING_ZERO,
11472 .block_erasers =
11473 {
11474 {
11475 .eraseblocks = { { 4 * 1024, 512 } },
11476 .block_erase = spi_block_erase_20,
11477 }, {
11478 .eraseblocks = { {64 * 1024, 32} },
11479 .block_erase = spi_block_erase_d8,
11480 }, {
11481 .eraseblocks = { {2 * 1024 * 1024, 1} },
11482 .block_erase = spi_block_erase_c7,
11483 }
11484 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011485 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011486 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11487 .write = spi_chip_write_256,
11488 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011489 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011490 },
11491
11492 {
11493 .vendor = "Micron/Numonyx/ST",
11494 .name = "M25PX32",
11495 .bustype = BUS_SPI,
11496 .manufacture_id = ST_ID,
11497 .model_id = ST_M25PX32,
11498 .total_size = 4096,
11499 .page_size = 256,
11500 /* OTP: 64B total; read 0x4B; write 0x42 */
11501 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11502 .tested = TEST_OK_PRE,
11503 .probe = probe_spi_rdid,
11504 .probe_timing = TIMING_ZERO,
11505 .block_erasers =
11506 {
11507 {
11508 .eraseblocks = { { 4 * 1024, 1024 } },
11509 .block_erase = spi_block_erase_20,
11510 }, {
11511 .eraseblocks = { {64 * 1024, 64} },
11512 .block_erase = spi_block_erase_d8,
11513 }, {
11514 .eraseblocks = { {4 * 1024 * 1024, 1} },
11515 .block_erase = spi_block_erase_c7,
11516 }
11517 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011518 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011519 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11520 .write = spi_chip_write_256,
11521 .read = spi_chip_read,
11522 .voltage = {2700, 3600},
11523 },
11524
11525 {
11526 .vendor = "Micron/Numonyx/ST",
11527 .name = "M25PX64",
11528 .bustype = BUS_SPI,
11529 .manufacture_id = ST_ID,
11530 .model_id = ST_M25PX64,
11531 .total_size = 8192,
11532 .page_size = 256,
11533 /* OTP: 64B total; read 0x4B; write 0x42 */
11534 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011535 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011536 .probe = probe_spi_rdid,
11537 .probe_timing = TIMING_ZERO,
11538 .block_erasers =
11539 {
11540 {
11541 .eraseblocks = { { 4 * 1024, 2048 } },
11542 .block_erase = spi_block_erase_20,
11543 }, {
11544 .eraseblocks = { {64 * 1024, 128} },
11545 .block_erase = spi_block_erase_d8,
11546 }, {
11547 .eraseblocks = { {8 * 1024 * 1024, 1} },
11548 .block_erase = spi_block_erase_c7,
11549 }
11550 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011551 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011552 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11553 .write = spi_chip_write_256,
11554 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011555 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011556 },
11557
11558 {
11559 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011560 .name = "M25PX80",
11561 .bustype = BUS_SPI,
11562 .manufacture_id = ST_ID,
11563 .model_id = ST_M25PX80,
11564 .total_size = 1024,
11565 .page_size = 256,
11566 /* OTP: 64B total; read 0x4B, write 0x42 */
11567 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11568 .tested = TEST_OK_PREW,
11569 .probe = probe_spi_rdid,
11570 .probe_timing = TIMING_ZERO,
11571 .block_erasers =
11572 {
11573 {
11574 .eraseblocks = { { 4 * 1024, 256 } },
11575 .block_erase = spi_block_erase_20,
11576 }, {
11577 .eraseblocks = { {64 * 1024, 16} },
11578 .block_erase = spi_block_erase_d8,
11579 }, {
11580 .eraseblocks = { {1024 * 1024, 1} },
11581 .block_erase = spi_block_erase_c7,
11582 }
11583 },
11584 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
11585 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11586 .write = spi_chip_write_256,
11587 .read = spi_chip_read,
11588 .voltage = {2700, 3600},
11589 },
11590
11591 {
11592 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011593 .name = "M45PE10",
11594 .bustype = BUS_SPI,
11595 .manufacture_id = ST_ID,
11596 .model_id = ST_M45PE10,
11597 .total_size = 128,
11598 .page_size = 256,
11599 .tested = TEST_UNTESTED,
11600 .probe = probe_spi_rdid,
11601 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011602 .block_erasers =
11603 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011604 {
11605 .eraseblocks = { {256, 512} },
11606 .block_erase = spi_block_erase_db,
11607 }, {
11608 .eraseblocks = { {64 * 1024, 2} },
11609 .block_erase = spi_block_erase_d8,
11610 }
11611 },
11612 .printlock = spi_prettyprint_status_register_default_welwip,
11613 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11614 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11615 .read = spi_chip_read, /* Fast read (0x0B) supported */
11616 .voltage = {2700, 3600},
11617 },
11618
11619 {
11620 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011621 .name = "M45PE16",
11622 .bustype = BUS_SPI,
11623 .manufacture_id = ST_ID,
11624 .model_id = ST_M45PE16,
11625 .total_size = 2048,
11626 .page_size = 256,
11627 .tested = TEST_UNTESTED,
11628 .probe = probe_spi_rdid,
11629 .probe_timing = TIMING_ZERO,
11630 .block_erasers =
11631 {
11632 {
11633 .eraseblocks = { {256, 8192} },
11634 .block_erase = spi_block_erase_db,
11635 }, {
11636 .eraseblocks = { {64 * 1024, 32} },
11637 .block_erase = spi_block_erase_d8,
11638 }
11639 },
11640 .printlock = spi_prettyprint_status_register_default_welwip,
11641 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11642 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11643 .read = spi_chip_read, /* Fast read (0x0B) supported */
11644 .voltage = {2700, 3600},
11645 },
11646
11647 {
11648 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011649 .name = "M45PE20",
11650 .bustype = BUS_SPI,
11651 .manufacture_id = ST_ID,
11652 .model_id = ST_M45PE20,
11653 .total_size = 256,
11654 .page_size = 256,
11655 .tested = TEST_UNTESTED,
11656 .probe = probe_spi_rdid,
11657 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011658 .block_erasers =
11659 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011660 {
11661 .eraseblocks = { {256, 1024} },
11662 .block_erase = spi_block_erase_db,
11663 }, {
11664 .eraseblocks = { {64 * 1024, 4} },
11665 .block_erase = spi_block_erase_d8,
11666 }
11667 },
11668 .printlock = spi_prettyprint_status_register_default_welwip,
11669 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11670 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11671 .read = spi_chip_read, /* Fast read (0x0B) supported */
11672 .voltage = {2700, 3600},
11673 },
11674
11675 {
11676 .vendor = "Micron/Numonyx/ST",
11677 .name = "M45PE40",
11678 .bustype = BUS_SPI,
11679 .manufacture_id = ST_ID,
11680 .model_id = ST_M45PE40,
11681 .total_size = 512,
11682 .page_size = 256,
11683 .tested = TEST_UNTESTED,
11684 .probe = probe_spi_rdid,
11685 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011686 .block_erasers =
11687 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011688 {
11689 .eraseblocks = { {256, 2048} },
11690 .block_erase = spi_block_erase_db,
11691 }, {
11692 .eraseblocks = { {64 * 1024, 8} },
11693 .block_erase = spi_block_erase_d8,
11694 }
11695 },
11696 .printlock = spi_prettyprint_status_register_default_welwip,
11697 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000011698 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011699 .read = spi_chip_read, /* Fast read (0x0B) supported */
11700 .voltage = {2700, 3600},
11701 },
11702
11703 {
11704 .vendor = "Micron/Numonyx/ST",
11705 .name = "M45PE80",
11706 .bustype = BUS_SPI,
11707 .manufacture_id = ST_ID,
11708 .model_id = ST_M45PE80,
11709 .total_size = 1024,
11710 .page_size = 256,
11711 .tested = TEST_UNTESTED,
11712 .probe = probe_spi_rdid,
11713 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011714 .block_erasers =
11715 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011716 {
11717 .eraseblocks = { {256, 4096} },
11718 .block_erase = spi_block_erase_db,
11719 }, {
11720 .eraseblocks = { {64 * 1024, 16} },
11721 .block_erase = spi_block_erase_d8,
11722 }
11723 },
11724 .printlock = spi_prettyprint_status_register_default_welwip,
11725 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11726 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11727 .read = spi_chip_read, /* Fast read (0x0B) supported */
11728 .voltage = {2700, 3600},
11729 },
11730
11731 {
11732 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011733 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
11734 .bustype = BUS_SPI,
11735 .manufacture_id = ST_ID,
11736 .model_id = ST_N25Q00A__1G,
11737 .total_size = 131072,
11738 .page_size = 256,
11739 /* supports SFDP */
11740 /* OTP: 64B total; read 0x4B, write 0x42 */
11741 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11742 .tested = TEST_UNTESTED,
11743 .probe = probe_spi_rdid,
11744 .probe_timing = TIMING_ZERO,
11745 .block_erasers =
11746 {
11747 {
11748 .eraseblocks = { {4 * 1024, 32768} },
11749 .block_erase = spi_block_erase_21,
11750 }, {
11751 .eraseblocks = { {4 * 1024, 32768} },
11752 .block_erase = spi_block_erase_20,
11753 }, {
11754 .eraseblocks = { {64 * 1024, 2048} },
11755 .block_erase = spi_block_erase_dc,
11756 }, {
11757 .eraseblocks = { {64 * 1024, 2048} },
11758 .block_erase = spi_block_erase_d8,
11759 }, {
11760 .eraseblocks = { {32768 * 1024, 4} },
11761 .block_erase = spi_block_erase_c4,
11762 }
11763 },
11764 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11765 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11766 .write = spi_chip_write_256, /* Multi I/O supported */
11767 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11768 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020011769 .prepare_access = spi_prepare_io,
11770 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011771 },
11772
11773 {
11774 .vendor = "Micron/Numonyx/ST",
11775 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11776 .bustype = BUS_SPI,
11777 .manufacture_id = ST_ID,
11778 .model_id = ST_N25Q00A__3G,
11779 .total_size = 131072,
11780 .page_size = 256,
11781 /* supports SFDP */
11782 /* OTP: 64B total; read 0x4B, write 0x42 */
11783 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11784 .tested = TEST_UNTESTED,
11785 .probe = probe_spi_rdid,
11786 .probe_timing = TIMING_ZERO,
11787 .block_erasers =
11788 {
11789 {
11790 .eraseblocks = { {4 * 1024, 32768} },
11791 .block_erase = spi_block_erase_21,
11792 }, {
11793 .eraseblocks = { {4 * 1024, 32768} },
11794 .block_erase = spi_block_erase_20,
11795 }, {
11796 .eraseblocks = { {64 * 1024, 2048} },
11797 .block_erase = spi_block_erase_dc,
11798 }, {
11799 .eraseblocks = { {64 * 1024, 2048} },
11800 .block_erase = spi_block_erase_d8,
11801 }, {
11802 .eraseblocks = { {32768 * 1024, 4} },
11803 .block_erase = spi_block_erase_c4,
11804 }
11805 },
11806 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11807 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11808 .write = spi_chip_write_256, /* Multi I/O supported */
11809 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11810 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020011811 .prepare_access = spi_prepare_io,
11812 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011813 },
11814
11815 {
11816 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011817 .name = "N25Q016",
11818 .bustype = BUS_SPI,
11819 .manufacture_id = ST_ID,
11820 .model_id = ST_N25Q016__1E,
11821 .total_size = 2048,
11822 .page_size = 256,
11823 /* supports SFDP */
11824 /* OTP: 64B total; read 0x4B, write 0x42 */
11825 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11826 .tested = TEST_UNTESTED,
11827 .probe = probe_spi_rdid,
11828 .probe_timing = TIMING_ZERO,
11829 .block_erasers =
11830 {
11831 {
11832 .eraseblocks = { {4 * 1024, 512} },
11833 .block_erase = spi_block_erase_20,
11834 }, {
11835 .eraseblocks = { {32 * 1024, 64} },
11836 .block_erase = spi_block_erase_52,
11837 }, {
11838 .eraseblocks = { {64 * 1024, 32} },
11839 .block_erase = spi_block_erase_d8,
11840 }, {
11841 .eraseblocks = { {2 * 1024 * 1024, 1} },
11842 .block_erase = spi_block_erase_c7,
11843 }
11844 },
11845 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11846 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11847 .write = spi_chip_write_256, /* Multi I/O supported */
11848 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11849 .voltage = {1700, 2000},
11850 },
11851
11852 {
11853 .vendor = "Micron/Numonyx/ST",
11854 .name = "N25Q032..1E",
11855 .bustype = BUS_SPI,
11856 .manufacture_id = ST_ID,
11857 .model_id = ST_N25Q032__1E,
11858 .total_size = 4096,
11859 .page_size = 256,
11860 /* supports SFDP */
11861 /* OTP: 64B total; read 0x4B, write 0x42 */
11862 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11863 .tested = TEST_UNTESTED,
11864 .probe = probe_spi_rdid,
11865 .probe_timing = TIMING_ZERO,
11866 .block_erasers =
11867 {
11868 {
11869 .eraseblocks = { {4 * 1024, 1024} },
11870 .block_erase = spi_block_erase_20,
11871 }, {
11872 .eraseblocks = { {64 * 1024, 64} },
11873 .block_erase = spi_block_erase_d8,
11874 }, {
11875 .eraseblocks = { {4 * 1024 * 1024, 1} },
11876 .block_erase = spi_block_erase_c7,
11877 }
11878 },
11879 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11880 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11881 .write = spi_chip_write_256, /* Multi I/O supported */
11882 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11883 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011884 .reg_bits =
11885 {
11886 /*
11887 * There is also a volatile lock register per 64KiB sector, which is not
11888 * mutually exclusive with BP-based protection.
11889 */
11890 .srp = {STATUS1, 7, RW},
11891 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11892 .tb = {STATUS1, 5, RW},
11893 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011894 .wp_write_cfg = spi_wp_write_cfg,
11895 .wp_read_cfg = spi_wp_read_cfg,
11896 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011897 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011898 },
11899
11900 {
11901 .vendor = "Micron/Numonyx/ST",
11902 .name = "N25Q032..3E",
11903 .bustype = BUS_SPI,
11904 .manufacture_id = ST_ID,
11905 .model_id = ST_N25Q032__3E,
11906 .total_size = 4096,
11907 .page_size = 256,
11908 /* supports SFDP */
11909 /* OTP: 64B total; read 0x4B, write 0x42 */
11910 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11911 .tested = TEST_OK_PREW,
11912 .probe = probe_spi_rdid,
11913 .probe_timing = TIMING_ZERO,
11914 .block_erasers =
11915 {
11916 {
11917 .eraseblocks = { {4 * 1024, 1024} },
11918 .block_erase = spi_block_erase_20,
11919 }, {
11920 .eraseblocks = { {64 * 1024, 64} },
11921 .block_erase = spi_block_erase_d8,
11922 }, {
11923 .eraseblocks = { {4 * 1024 * 1024, 1} },
11924 .block_erase = spi_block_erase_c7,
11925 }
11926 },
11927 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11928 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11929 .write = spi_chip_write_256, /* Multi I/O supported */
11930 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11931 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011932 .reg_bits =
11933 {
11934 /*
11935 * There is also a volatile lock register per 64KiB sector, which is not
11936 * mutually exclusive with BP-based protection.
11937 */
11938 .srp = {STATUS1, 7, RW},
11939 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11940 .tb = {STATUS1, 5, RW},
11941 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011942 .wp_write_cfg = spi_wp_write_cfg,
11943 .wp_read_cfg = spi_wp_read_cfg,
11944 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011945 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011946 },
11947
11948 {
11949 .vendor = "Micron/Numonyx/ST",
11950 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11951 .bustype = BUS_SPI,
11952 .manufacture_id = ST_ID,
11953 .model_id = ST_N25Q064__1E,
11954 .total_size = 8192,
11955 .page_size = 256,
11956 /* supports SFDP */
11957 /* OTP: 64B total; read 0x4B, write 0x42 */
11958 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011959 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011960 .probe = probe_spi_rdid,
11961 .probe_timing = TIMING_ZERO,
11962 .block_erasers =
11963 {
11964 {
11965 .eraseblocks = { {4 * 1024, 2048 } },
11966 .block_erase = spi_block_erase_20,
11967 }, {
11968 .eraseblocks = { {64 * 1024, 128} },
11969 .block_erase = spi_block_erase_d8,
11970 }, {
11971 .eraseblocks = { {8 * 1024 * 1024, 1} },
11972 .block_erase = spi_block_erase_c7,
11973 }
11974 },
11975 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11976 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11977 .write = spi_chip_write_256, /* Multi I/O supported */
11978 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11979 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011980 .reg_bits =
11981 {
11982 /*
11983 * There is also a volatile lock register per 64KiB sector, which is not
11984 * mutually exclusive with BP-based protection.
11985 */
11986 .srp = {STATUS1, 7, RW},
11987 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
11988 .tb = {STATUS1, 5, RW},
11989 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011990 .wp_write_cfg = spi_wp_write_cfg,
11991 .wp_read_cfg = spi_wp_read_cfg,
11992 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011993 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011994 },
11995
11996 {
11997 .vendor = "Micron/Numonyx/ST",
11998 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11999 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012000 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012001 .model_id = ST_N25Q064__3E,
12002 .total_size = 8192,
12003 .page_size = 256,
12004 /* supports SFDP */
12005 /* OTP: 64B total; read 0x4B, write 0x42 */
12006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12007 .tested = TEST_OK_PREW,
12008 .probe = probe_spi_rdid,
12009 .probe_timing = TIMING_ZERO,
12010 .block_erasers =
12011 {
12012 {
12013 .eraseblocks = { {4 * 1024, 2048 } },
12014 .block_erase = spi_block_erase_20,
12015 }, {
12016 .eraseblocks = { {64 * 1024, 128} },
12017 .block_erase = spi_block_erase_d8,
12018 }, {
12019 .eraseblocks = { {8 * 1024 * 1024, 1} },
12020 .block_erase = spi_block_erase_c7,
12021 }
12022 },
12023 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12024 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12025 .write = spi_chip_write_256, /* Multi I/O supported */
12026 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12027 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012028 .reg_bits =
12029 {
12030 /*
12031 * There is also a volatile lock register per 64KiB sector, which is not
12032 * mutually exclusive with BP-based protection.
12033 */
12034 .srp = {STATUS1, 7, RW},
12035 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12036 .tb = {STATUS1, 5, RW},
12037 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012038 .wp_write_cfg = spi_wp_write_cfg,
12039 .wp_read_cfg = spi_wp_read_cfg,
12040 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012041 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012042 },
12043
12044 {
12045 .vendor = "Micron/Numonyx/ST",
12046 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
12047 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012048 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012049 .model_id = ST_N25Q128__1E,
12050 .total_size = 16384,
12051 .page_size = 256,
12052 /* supports SFDP */
12053 /* OTP: 64B total; read 0x4B, write 0x42 */
12054 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012055 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012056 .probe = probe_spi_rdid,
12057 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012058 .block_erasers =
12059 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012060 {
12061 .eraseblocks = { {4 * 1024, 4096 } },
12062 .block_erase = spi_block_erase_20,
12063 }, {
12064 .eraseblocks = { {64 * 1024, 256} },
12065 .block_erase = spi_block_erase_d8,
12066 }, {
12067 .eraseblocks = { {16384 * 1024, 1} },
12068 .block_erase = spi_block_erase_c7,
12069 }
12070 },
12071 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12072 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12073 .write = spi_chip_write_256, /* Multi I/O supported */
12074 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12075 .voltage = {1700, 2000},
12076 },
12077
12078 {
12079 .vendor = "Micron/Numonyx/ST",
12080 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12081 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012082 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012083 .model_id = ST_N25Q128__3E,
12084 .total_size = 16384,
12085 .page_size = 256,
12086 /* supports SFDP */
12087 /* OTP: 64B total; read 0x4B, write 0x42 */
12088 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12089 .tested = TEST_OK_PREW,
12090 .probe = probe_spi_rdid,
12091 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012092 .block_erasers =
12093 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012094 {
12095 .eraseblocks = { {4 * 1024, 4096 } },
12096 .block_erase = spi_block_erase_20,
12097 }, {
12098 .eraseblocks = { {64 * 1024, 256} },
12099 .block_erase = spi_block_erase_d8,
12100 }, {
12101 .eraseblocks = { {16384 * 1024, 1} },
12102 .block_erase = spi_block_erase_c7,
12103 }
12104 },
12105 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12106 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12107 .write = spi_chip_write_256, /* Multi I/O supported */
12108 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12109 .voltage = {2700, 3600},
12110 },
12111
12112 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012113 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012114 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
12115 .bustype = BUS_SPI,
12116 .manufacture_id = ST_ID,
12117 .model_id = ST_N25Q256__1E,
12118 .total_size = 32768,
12119 .page_size = 256,
12120 /* supports SFDP */
12121 /* OTP: 64B total; read 0x4B, write 0x42 */
12122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12123 .tested = TEST_UNTESTED,
12124 .probe = probe_spi_rdid,
12125 .probe_timing = TIMING_ZERO,
12126 .block_erasers =
12127 {
12128 {
12129 .eraseblocks = { {4 * 1024, 8192} },
12130 .block_erase = spi_block_erase_21,
12131 }, {
12132 .eraseblocks = { {4 * 1024, 8192} },
12133 .block_erase = spi_block_erase_20,
12134 }, {
12135 .eraseblocks = { {64 * 1024, 512} },
12136 .block_erase = spi_block_erase_dc,
12137 }, {
12138 .eraseblocks = { {64 * 1024, 512} },
12139 .block_erase = spi_block_erase_d8,
12140 }, {
12141 .eraseblocks = { {32768 * 1024, 1} },
12142 .block_erase = spi_block_erase_c7,
12143 }
12144 },
12145 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12146 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12147 .write = spi_chip_write_256, /* Multi I/O supported */
12148 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12149 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012150 .prepare_access = spi_prepare_io,
12151 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012152 },
12153
12154 {
12155 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012156 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12157 .bustype = BUS_SPI,
12158 .manufacture_id = ST_ID,
12159 .model_id = ST_N25Q256__3E,
12160 .total_size = 32768,
12161 .page_size = 256,
12162 /* supports SFDP */
12163 /* OTP: 64B total; read 0x4B, write 0x42 */
12164 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12165 .tested = TEST_UNTESTED,
12166 .probe = probe_spi_rdid,
12167 .probe_timing = TIMING_ZERO,
12168 .block_erasers =
12169 {
12170 {
12171 .eraseblocks = { {4 * 1024, 8192} },
12172 .block_erase = spi_block_erase_21,
12173 }, {
12174 .eraseblocks = { {4 * 1024, 8192} },
12175 .block_erase = spi_block_erase_20,
12176 }, {
12177 .eraseblocks = { {64 * 1024, 512} },
12178 .block_erase = spi_block_erase_dc,
12179 }, {
12180 .eraseblocks = { {64 * 1024, 512} },
12181 .block_erase = spi_block_erase_d8,
12182 }, {
12183 .eraseblocks = { {32768 * 1024, 1} },
12184 .block_erase = spi_block_erase_c7,
12185 }
12186 },
12187 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12188 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12189 .write = spi_chip_write_256, /* Multi I/O supported */
12190 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12191 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012192 .prepare_access = spi_prepare_io,
12193 .finish_access = spi_finish_io,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012194 },
12195
12196 {
12197 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012198 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012199 .bustype = BUS_SPI,
12200 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012201 .model_id = ST_N25Q512__1G,
12202 .total_size = 65536,
12203 .page_size = 256,
12204 /* supports SFDP */
12205 /* OTP: 64B total; read 0x4B, write 0x42 */
12206 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12207 .tested = TEST_UNTESTED,
12208 .probe = probe_spi_rdid,
12209 .probe_timing = TIMING_ZERO,
12210 .block_erasers =
12211 {
12212 {
12213 .eraseblocks = { {4 * 1024, 16384} },
12214 .block_erase = spi_block_erase_21,
12215 }, {
12216 .eraseblocks = { {4 * 1024, 16384} },
12217 .block_erase = spi_block_erase_20,
12218 }, {
12219 .eraseblocks = { {64 * 1024, 1024} },
12220 .block_erase = spi_block_erase_dc,
12221 }, {
12222 .eraseblocks = { {64 * 1024, 1024} },
12223 .block_erase = spi_block_erase_d8,
12224 }, {
12225 .eraseblocks = { {32768 * 1024, 2} },
12226 .block_erase = spi_block_erase_c4,
12227 }
12228 },
12229 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12230 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12231 .write = spi_chip_write_256, /* Multi I/O supported */
12232 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12233 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012234 .prepare_access = spi_prepare_io,
12235 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012236 },
12237
12238 {
12239 .vendor = "Micron/Numonyx/ST",
12240 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
12241 .bustype = BUS_SPI,
12242 .manufacture_id = ST_ID,
12243 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012244 .total_size = 65536,
12245 .page_size = 256,
12246 /* supports SFDP */
12247 /* OTP: 64B total; read 0x4B, write 0x42 */
12248 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12249 .tested = TEST_OK_PREW,
12250 .probe = probe_spi_rdid,
12251 .probe_timing = TIMING_ZERO,
12252 .block_erasers =
12253 {
12254 {
12255 .eraseblocks = { {4 * 1024, 16384} },
12256 .block_erase = spi_block_erase_21,
12257 }, {
12258 .eraseblocks = { {4 * 1024, 16384} },
12259 .block_erase = spi_block_erase_20,
12260 }, {
12261 .eraseblocks = { {64 * 1024, 1024} },
12262 .block_erase = spi_block_erase_dc,
12263 }, {
12264 .eraseblocks = { {64 * 1024, 1024} },
12265 .block_erase = spi_block_erase_d8,
12266 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070012267 .eraseblocks = { {32768 * 1024, 2} },
12268 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012269 }
12270 },
12271 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12272 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12273 .write = spi_chip_write_256, /* Multi I/O supported */
12274 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12275 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012276 .prepare_access = spi_prepare_io,
12277 .finish_access = spi_finish_io,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012278 },
12279
12280 {
Ed Swierk199ab392017-07-03 13:33:44 -070012281 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012282 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12283 .bustype = BUS_SPI,
12284 .manufacture_id = ST_ID,
12285 .model_id = ST_N25Q00A__3G,
12286 .total_size = 131072,
12287 .page_size = 256,
12288 /* supports SFDP */
12289 /* OTP: 64B total; read 0x4B, write 0x42 */
12290 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12291 .tested = TEST_OK_PREW,
12292 .probe = probe_spi_rdid,
12293 .probe_timing = TIMING_ZERO,
12294 .block_erasers =
12295 {
12296 {
12297 .eraseblocks = { {4 * 1024, 32768} },
12298 .block_erase = spi_block_erase_21,
12299 }, {
12300 .eraseblocks = { {4 * 1024, 32768} },
12301 .block_erase = spi_block_erase_20,
12302 }, {
12303 .eraseblocks = { {32 * 1024, 4096} },
12304 .block_erase = spi_block_erase_5c,
12305 }, {
12306 .eraseblocks = { {32 * 1024, 4096} },
12307 .block_erase = spi_block_erase_52,
12308 }, {
12309 .eraseblocks = { {64 * 1024, 2048} },
12310 .block_erase = spi_block_erase_dc,
12311 }, {
12312 .eraseblocks = { {64 * 1024, 2048} },
12313 .block_erase = spi_block_erase_d8,
12314 }, {
12315 .eraseblocks = { {65536 * 1024, 2} },
12316 .block_erase = spi_block_erase_c4,
12317 }
12318 },
12319 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12320 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12321 .write = spi_chip_write_256, /* Multi I/O supported */
12322 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12323 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012324 .prepare_access = spi_prepare_io,
12325 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012326 },
12327
12328 {
12329 .vendor = "Micron",
12330 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12331 .bustype = BUS_SPI,
12332 .manufacture_id = ST_ID,
12333 .model_id = ST_N25Q00A__1G,
12334 .total_size = 131072,
12335 .page_size = 256,
12336 /* supports SFDP */
12337 /* OTP: 64B total; read 0x4B, write 0x42 */
12338 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12339 .tested = TEST_UNTESTED,
12340 .probe = probe_spi_rdid,
12341 .probe_timing = TIMING_ZERO,
12342 .block_erasers =
12343 {
12344 {
12345 .eraseblocks = { {4 * 1024, 32768} },
12346 .block_erase = spi_block_erase_21,
12347 }, {
12348 .eraseblocks = { {4 * 1024, 32768} },
12349 .block_erase = spi_block_erase_20,
12350 }, {
12351 .eraseblocks = { {32 * 1024, 4096} },
12352 .block_erase = spi_block_erase_5c,
12353 }, {
12354 .eraseblocks = { {32 * 1024, 4096} },
12355 .block_erase = spi_block_erase_52,
12356 }, {
12357 .eraseblocks = { {64 * 1024, 2048} },
12358 .block_erase = spi_block_erase_dc,
12359 }, {
12360 .eraseblocks = { {64 * 1024, 2048} },
12361 .block_erase = spi_block_erase_d8,
12362 }, {
12363 .eraseblocks = { {65536 * 1024, 2} },
12364 .block_erase = spi_block_erase_c4,
12365 }
12366 },
12367 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12368 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12369 .write = spi_chip_write_256, /* Multi I/O supported */
12370 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12371 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012372 .prepare_access = spi_prepare_io,
12373 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012374 },
12375
12376 {
12377 .vendor = "Micron",
12378 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12379 .bustype = BUS_SPI,
12380 .manufacture_id = ST_ID,
12381 .model_id = ST_MT25QL02G,
12382 .total_size = 262144,
12383 .page_size = 256,
12384 /* supports SFDP */
12385 /* OTP: 64B total; read 0x4B, write 0x42 */
12386 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12387 .tested = TEST_UNTESTED,
12388 .probe = probe_spi_rdid,
12389 .probe_timing = TIMING_ZERO,
12390 .block_erasers =
12391 {
12392 {
12393 .eraseblocks = { {4 * 1024, 65536} },
12394 .block_erase = spi_block_erase_21,
12395 }, {
12396 .eraseblocks = { {4 * 1024, 65536} },
12397 .block_erase = spi_block_erase_20,
12398 }, {
12399 .eraseblocks = { {32 * 1024, 8192} },
12400 .block_erase = spi_block_erase_5c,
12401 }, {
12402 .eraseblocks = { {32 * 1024, 8192} },
12403 .block_erase = spi_block_erase_52,
12404 }, {
12405 .eraseblocks = { {64 * 1024, 4096} },
12406 .block_erase = spi_block_erase_dc,
12407 }, {
12408 .eraseblocks = { {64 * 1024, 4096} },
12409 .block_erase = spi_block_erase_d8,
12410 }, {
12411 .eraseblocks = { {65536 * 1024, 4} },
12412 .block_erase = spi_block_erase_c4,
12413 }
12414 },
12415 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12416 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12417 .write = spi_chip_write_256, /* Multi I/O supported */
12418 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12419 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012420 .prepare_access = spi_prepare_io,
12421 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012422 },
12423
12424 {
12425 .vendor = "Micron",
12426 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12427 .bustype = BUS_SPI,
12428 .manufacture_id = ST_ID,
12429 .model_id = ST_MT25QU02G,
12430 .total_size = 262144,
12431 .page_size = 256,
12432 /* supports SFDP */
12433 /* OTP: 64B total; read 0x4B, write 0x42 */
12434 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12435 .tested = TEST_UNTESTED,
12436 .probe = probe_spi_rdid,
12437 .probe_timing = TIMING_ZERO,
12438 .block_erasers =
12439 {
12440 {
12441 .eraseblocks = { {4 * 1024, 65536} },
12442 .block_erase = spi_block_erase_21,
12443 }, {
12444 .eraseblocks = { {4 * 1024, 65536} },
12445 .block_erase = spi_block_erase_20,
12446 }, {
12447 .eraseblocks = { {32 * 1024, 8192} },
12448 .block_erase = spi_block_erase_5c,
12449 }, {
12450 .eraseblocks = { {32 * 1024, 8192} },
12451 .block_erase = spi_block_erase_52,
12452 }, {
12453 .eraseblocks = { {64 * 1024, 4096} },
12454 .block_erase = spi_block_erase_dc,
12455 }, {
12456 .eraseblocks = { {64 * 1024, 4096} },
12457 .block_erase = spi_block_erase_d8,
12458 }, {
12459 .eraseblocks = { {65536 * 1024, 4} },
12460 .block_erase = spi_block_erase_c4,
12461 }
12462 },
12463 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12464 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12465 .write = spi_chip_write_256, /* Multi I/O supported */
12466 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12467 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012468 .prepare_access = spi_prepare_io,
12469 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012470 },
12471
12472 {
12473 .vendor = "Micron",
12474 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12475 .bustype = BUS_SPI,
12476 .manufacture_id = ST_ID,
12477 .model_id = ST_N25Q128__1E,
12478 .total_size = 16384,
12479 .page_size = 256,
12480 /* supports SFDP */
12481 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huber48dc0902023-03-05 17:20:55 +010012482 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012483 .tested = TEST_UNTESTED,
12484 .probe = probe_spi_rdid,
12485 .probe_timing = TIMING_ZERO,
12486 .block_erasers =
12487 {
12488 {
12489 .eraseblocks = { {4 * 1024, 4096} },
12490 .block_erase = spi_block_erase_20,
12491 }, {
12492 .eraseblocks = { {32 * 1024, 512} },
12493 .block_erase = spi_block_erase_52,
12494 }, {
12495 .eraseblocks = { {64 * 1024, 256} },
12496 .block_erase = spi_block_erase_d8,
12497 }, {
12498 .eraseblocks = { {16384 * 1024, 1} },
12499 .block_erase = spi_block_erase_c7,
12500 }, {
12501 .eraseblocks = { {16384 * 1024, 1} },
12502 .block_erase = spi_block_erase_60,
12503 }
12504 },
12505 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12506 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12507 .write = spi_chip_write_256, /* Multi I/O supported */
12508 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12509 .voltage = {1700, 2000},
12510 },
12511
12512 {
12513 .vendor = "Micron",
12514 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12515 .bustype = BUS_SPI,
12516 .manufacture_id = ST_ID,
12517 .model_id = ST_N25Q128__3E,
12518 .total_size = 16384,
12519 .page_size = 256,
12520 /* supports SFDP */
12521 /* OTP: 64B total; read 0x4B, write 0x42 */
Rick Altherr1e563602022-12-22 10:25:34 -080012522 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12523 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012524 .probe = probe_spi_rdid,
12525 .probe_timing = TIMING_ZERO,
12526 .block_erasers =
12527 {
12528 {
12529 .eraseblocks = { {4 * 1024, 4096} },
12530 .block_erase = spi_block_erase_20,
12531 }, {
12532 .eraseblocks = { {32 * 1024, 512} },
12533 .block_erase = spi_block_erase_52,
12534 }, {
12535 .eraseblocks = { {64 * 1024, 256} },
12536 .block_erase = spi_block_erase_d8,
12537 }, {
12538 .eraseblocks = { {16384 * 1024, 1} },
12539 .block_erase = spi_block_erase_c7,
12540 }, {
12541 .eraseblocks = { {16384 * 1024, 1} },
12542 .block_erase = spi_block_erase_60,
12543 }
12544 },
12545 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12546 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12547 .write = spi_chip_write_256, /* Multi I/O supported */
12548 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12549 .voltage = {2700, 3600},
12550 },
12551
12552 {
12553 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012554 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012555 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012556 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070012557 .model_id = ST_N25Q256__3E,
12558 .total_size = 32768,
12559 .page_size = 256,
12560 /* supports SFDP */
12561 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012562 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010012563 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012564 .probe = probe_spi_rdid,
12565 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012566 .block_erasers =
12567 {
Ed Swierk199ab392017-07-03 13:33:44 -070012568 {
12569 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012570 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012571 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012572 .eraseblocks = { {4 * 1024, 8192} },
12573 .block_erase = spi_block_erase_20,
12574 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012575 .eraseblocks = { {32 * 1024, 1024} },
12576 .block_erase = spi_block_erase_5c,
12577 }, {
12578 .eraseblocks = { {32 * 1024, 1024} },
12579 .block_erase = spi_block_erase_52,
12580 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012581 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012582 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012583 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012584 .eraseblocks = { {64 * 1024, 512} },
12585 .block_erase = spi_block_erase_d8,
12586 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012587 .eraseblocks = { {32768 * 1024, 1} },
12588 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012589 }, {
12590 .eraseblocks = { {32768 * 1024, 1} },
12591 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012592 }
12593 },
12594 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12595 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12596 .write = spi_chip_write_256, /* Multi I/O supported */
12597 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12598 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020012599 .prepare_access = spi_prepare_io,
12600 .finish_access = spi_finish_io,
Ed Swierk199ab392017-07-03 13:33:44 -070012601 },
12602
12603 {
12604 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012605 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12606 .bustype = BUS_SPI,
12607 .manufacture_id = ST_ID,
12608 .model_id = ST_N25Q256__1E,
12609 .total_size = 32768,
12610 .page_size = 256,
12611 /* supports SFDP */
12612 /* OTP: 64B total; read 0x4B, write 0x42 */
12613 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons59052582022-03-08 15:23:58 +010012614 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012615 .probe = probe_spi_rdid,
12616 .probe_timing = TIMING_ZERO,
12617 .block_erasers =
12618 {
12619 {
12620 .eraseblocks = { {4 * 1024, 8192} },
12621 .block_erase = spi_block_erase_21,
12622 }, {
12623 .eraseblocks = { {4 * 1024, 8192} },
12624 .block_erase = spi_block_erase_20,
12625 }, {
12626 .eraseblocks = { {32 * 1024, 1024} },
12627 .block_erase = spi_block_erase_5c,
12628 }, {
12629 .eraseblocks = { {32 * 1024, 1024} },
12630 .block_erase = spi_block_erase_52,
12631 }, {
12632 .eraseblocks = { {64 * 1024, 512} },
12633 .block_erase = spi_block_erase_dc,
12634 }, {
12635 .eraseblocks = { {64 * 1024, 512} },
12636 .block_erase = spi_block_erase_d8,
12637 }, {
12638 .eraseblocks = { {32768 * 1024, 1} },
12639 .block_erase = spi_block_erase_c7,
12640 }, {
12641 .eraseblocks = { {32768 * 1024, 1} },
12642 .block_erase = spi_block_erase_60,
12643 }
12644 },
12645 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12646 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12647 .write = spi_chip_write_256, /* Multi I/O supported */
12648 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12649 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012650 .prepare_access = spi_prepare_io,
12651 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012652 },
12653
12654 {
12655 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012656 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012657 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012658 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012659 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070012660 .total_size = 65536,
12661 .page_size = 256,
12662 /* supports SFDP */
12663 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012664 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020012665 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012666 .probe = probe_spi_rdid,
12667 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012668 .block_erasers =
12669 {
Ed Swierk199ab392017-07-03 13:33:44 -070012670 {
12671 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012672 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012673 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012674 .eraseblocks = { {4 * 1024, 16384} },
12675 .block_erase = spi_block_erase_20,
12676 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012677 .eraseblocks = { {32 * 1024, 2048} },
12678 .block_erase = spi_block_erase_5c,
12679 }, {
12680 .eraseblocks = { {32 * 1024, 2048} },
12681 .block_erase = spi_block_erase_52,
12682 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012683 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012684 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012685 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012686 .eraseblocks = { {64 * 1024, 1024} },
12687 .block_erase = spi_block_erase_d8,
12688 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012689 .eraseblocks = { {65536 * 1024, 1} },
12690 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012691 }, {
12692 .eraseblocks = { {65536 * 1024, 1} },
12693 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012694 }
12695 },
12696 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12697 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12698 .write = spi_chip_write_256, /* Multi I/O supported */
12699 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12700 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012701 .reg_bits =
12702 {
12703 .srp = {STATUS1, 7, RW},
12704 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12705 .tb = {STATUS1, 5, RW},
12706 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012707 .wp_write_cfg = spi_wp_write_cfg,
12708 .wp_read_cfg = spi_wp_read_cfg,
12709 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012710 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020012711 .prepare_access = spi_prepare_io,
12712 .finish_access = spi_finish_io,
Ed Swierk199ab392017-07-03 13:33:44 -070012713 },
12714
12715 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012716 .vendor = "Micron",
12717 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12718 .bustype = BUS_SPI,
12719 .manufacture_id = ST_ID,
12720 .model_id = ST_N25Q512__1G,
12721 .total_size = 65536,
12722 .page_size = 256,
12723 /* supports SFDP */
12724 /* OTP: 64B total; read 0x4B, write 0x42 */
12725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12726 .tested = TEST_OK_PREW,
12727 .probe = probe_spi_rdid,
12728 .probe_timing = TIMING_ZERO,
12729 .block_erasers =
12730 {
12731 {
12732 .eraseblocks = { {4 * 1024, 16384} },
12733 .block_erase = spi_block_erase_21,
12734 }, {
12735 .eraseblocks = { {4 * 1024, 16384} },
12736 .block_erase = spi_block_erase_20,
12737 }, {
12738 .eraseblocks = { {32 * 1024, 2048} },
12739 .block_erase = spi_block_erase_5c,
12740 }, {
12741 .eraseblocks = { {32 * 1024, 2048} },
12742 .block_erase = spi_block_erase_52,
12743 }, {
12744 .eraseblocks = { {64 * 1024, 1024} },
12745 .block_erase = spi_block_erase_dc,
12746 }, {
12747 .eraseblocks = { {64 * 1024, 1024} },
12748 .block_erase = spi_block_erase_d8,
12749 }, {
12750 .eraseblocks = { {65536 * 1024, 1} },
12751 .block_erase = spi_block_erase_c7,
12752 }, {
12753 .eraseblocks = { {65536 * 1024, 1} },
12754 .block_erase = spi_block_erase_60,
12755 }
12756 },
12757 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12758 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12759 .write = spi_chip_write_256, /* Multi I/O supported */
12760 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12761 .voltage = {1700, 2000},
Nico Huber930d4212024-05-04 18:59:15 +020012762 .prepare_access = spi_prepare_io,
12763 .finish_access = spi_finish_io,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012764 },
12765
12766 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012767 .vendor = "MoselVitelic",
12768 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012769 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012770 .manufacture_id = SYNCMOS_MVC_ID,
12771 .model_id = MVC_V29C51000B,
12772 .total_size = 64,
12773 .page_size = 512,
12774 .feature_bits = FEATURE_EITHER_RESET,
12775 .tested = TEST_UNTESTED,
12776 .probe = probe_jedec,
12777 .probe_timing = TIMING_ZERO,
12778 .block_erasers =
12779 {
12780 {
12781 .eraseblocks = { {512, 128} },
12782 .block_erase = erase_sector_jedec,
12783 }, {
12784 .eraseblocks = { {64 * 1024, 1} },
12785 .block_erase = erase_chip_block_jedec,
12786 },
12787 },
12788 .write = write_jedec_1,
12789 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012790 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012791 .prepare_access = prepare_memory_access,
12792 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012793 },
12794
12795 {
12796 .vendor = "MoselVitelic",
12797 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012798 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012799 .manufacture_id = SYNCMOS_MVC_ID,
12800 .model_id = MVC_V29C51000T,
12801 .total_size = 64,
12802 .page_size = 512,
12803 .feature_bits = FEATURE_EITHER_RESET,
12804 .tested = TEST_UNTESTED,
12805 .probe = probe_jedec,
12806 .probe_timing = TIMING_ZERO,
12807 .block_erasers =
12808 {
12809 {
12810 .eraseblocks = { {512, 128} },
12811 .block_erase = erase_sector_jedec,
12812 }, {
12813 .eraseblocks = { {64 * 1024, 1} },
12814 .block_erase = erase_chip_block_jedec,
12815 },
12816 },
12817 .write = write_jedec_1,
12818 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012819 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012820 .prepare_access = prepare_memory_access,
12821 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012822 },
12823
12824 {
12825 .vendor = "MoselVitelic",
12826 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012827 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012828 .manufacture_id = SYNCMOS_MVC_ID,
12829 .model_id = MVC_V29C51400B,
12830 .total_size = 512,
12831 .page_size = 1024,
12832 .feature_bits = FEATURE_EITHER_RESET,
12833 .tested = TEST_UNTESTED,
12834 .probe = probe_jedec,
12835 .probe_timing = TIMING_ZERO,
12836 .block_erasers =
12837 {
12838 {
12839 .eraseblocks = { {1024, 512} },
12840 .block_erase = erase_sector_jedec,
12841 }, {
12842 .eraseblocks = { {512 * 1024, 1} },
12843 .block_erase = erase_chip_block_jedec,
12844 },
12845 },
12846 .write = write_jedec_1,
12847 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012848 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012849 .prepare_access = prepare_memory_access,
12850 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012851 },
12852
12853 {
12854 .vendor = "MoselVitelic",
12855 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012856 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012857 .manufacture_id = SYNCMOS_MVC_ID,
12858 .model_id = MVC_V29C51400T,
12859 .total_size = 512,
12860 .page_size = 1024,
12861 .feature_bits = FEATURE_EITHER_RESET,
12862 .tested = TEST_UNTESTED,
12863 .probe = probe_jedec,
12864 .probe_timing = TIMING_ZERO,
12865 .block_erasers =
12866 {
12867 {
12868 .eraseblocks = { {1024, 512} },
12869 .block_erase = erase_sector_jedec,
12870 }, {
12871 .eraseblocks = { {512 * 1024, 1} },
12872 .block_erase = erase_chip_block_jedec,
12873 },
12874 },
12875 .write = write_jedec_1,
12876 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012877 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012878 .prepare_access = prepare_memory_access,
12879 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012880 },
12881
12882 {
12883 .vendor = "MoselVitelic",
12884 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012885 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012886 .manufacture_id = SYNCMOS_MVC_ID,
12887 .model_id = MVC_V29LC51000,
12888 .total_size = 64,
12889 .page_size = 512,
12890 .feature_bits = FEATURE_EITHER_RESET,
12891 .tested = TEST_UNTESTED,
12892 .probe = probe_jedec,
12893 .probe_timing = TIMING_ZERO,
12894 .block_erasers =
12895 {
12896 {
12897 .eraseblocks = { {512, 128} },
12898 .block_erase = erase_sector_jedec,
12899 }, {
12900 .eraseblocks = { {64 * 1024, 1} },
12901 .block_erase = erase_chip_block_jedec,
12902 },
12903 },
12904 .write = write_jedec_1,
12905 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012906 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012907 .prepare_access = prepare_memory_access,
12908 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012909 },
12910
12911 {
12912 .vendor = "MoselVitelic",
12913 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012914 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012915 .manufacture_id = SYNCMOS_MVC_ID,
12916 .model_id = MVC_V29LC51001,
12917 .total_size = 128,
12918 .page_size = 512,
12919 .feature_bits = FEATURE_EITHER_RESET,
12920 .tested = TEST_UNTESTED,
12921 .probe = probe_jedec,
12922 .probe_timing = TIMING_ZERO,
12923 .block_erasers =
12924 {
12925 {
12926 .eraseblocks = { {512, 256} },
12927 .block_erase = erase_sector_jedec,
12928 }, {
12929 .eraseblocks = { {128 * 1024, 1} },
12930 .block_erase = erase_chip_block_jedec,
12931 },
12932 },
12933 .write = write_jedec_1,
12934 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012935 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012936 .prepare_access = prepare_memory_access,
12937 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012938 },
12939
12940 {
12941 .vendor = "MoselVitelic",
12942 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012943 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012944 .manufacture_id = SYNCMOS_MVC_ID,
12945 .model_id = MVC_V29LC51002,
12946 .total_size = 256,
12947 .page_size = 512,
12948 .feature_bits = FEATURE_EITHER_RESET,
12949 .tested = TEST_UNTESTED,
12950 .probe = probe_jedec,
12951 .probe_timing = TIMING_ZERO,
12952 .block_erasers =
12953 {
12954 {
12955 .eraseblocks = { {512, 512} },
12956 .block_erase = erase_sector_jedec,
12957 }, {
12958 .eraseblocks = { {256 * 1024, 1} },
12959 .block_erase = erase_chip_block_jedec,
12960 },
12961 },
12962 .write = write_jedec_1,
12963 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012964 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012965 .prepare_access = prepare_memory_access,
12966 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012967 },
12968
12969 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012970 .vendor = "Nantronics",
12971 .name = "N25S10",
12972 .bustype = BUS_SPI,
12973 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12974 .model_id = NANTRONICS_N25S10,
12975 .total_size = 128,
12976 .page_size = 256,
12977 .feature_bits = FEATURE_WRSR_WREN,
12978 .tested = TEST_UNTESTED,
12979 .probe = probe_spi_rdid,
12980 .probe_timing = TIMING_ZERO,
12981 .block_erasers =
12982 {
12983 {
12984 .eraseblocks = { {4 * 1024, 32} },
12985 .block_erase = spi_block_erase_20,
12986 }, {
12987 .eraseblocks = { {4 * 1024, 32} },
12988 .block_erase = spi_block_erase_d7,
12989 }, {
12990 .eraseblocks = { {32 * 1024, 4} },
12991 .block_erase = spi_block_erase_52,
12992 }, {
12993 .eraseblocks = { {64 * 1024, 2} },
12994 .block_erase = spi_block_erase_d8,
12995 }, {
12996 .eraseblocks = { {128 * 1024, 1} },
12997 .block_erase = spi_block_erase_60,
12998 }, {
12999 .eraseblocks = { {128 * 1024, 1} },
13000 .block_erase = spi_block_erase_c7,
13001 }
13002 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013003 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013004 .unlock = spi_disable_blockprotect_bp3_srwd,
13005 .write = spi_chip_write_256,
13006 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13007 .voltage = {2700, 3600},
13008 },
13009
13010 {
13011 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013012 .name = "N25S16",
13013 .bustype = BUS_SPI,
13014 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13015 .model_id = NANTRONICS_N25S16,
13016 .total_size = 2048,
13017 .page_size = 256,
13018 .feature_bits = FEATURE_WRSR_WREN,
13019 .tested = TEST_UNTESTED,
13020 .probe = probe_spi_rdid,
13021 .probe_timing = TIMING_ZERO,
13022 .block_erasers =
13023 {
13024 {
13025 .eraseblocks = { {4 * 1024, 512} },
13026 .block_erase = spi_block_erase_20,
13027 }, {
13028 .eraseblocks = { {64 * 1024, 32} },
13029 .block_erase = spi_block_erase_d8,
13030 }, {
13031 .eraseblocks = { {2048 * 1024, 1} },
13032 .block_erase = spi_block_erase_60,
13033 }, {
13034 .eraseblocks = { {2048 * 1024, 1} },
13035 .block_erase = spi_block_erase_c7,
13036 }
13037 },
13038 .printlock = spi_prettyprint_status_register_bp3_srwd,
13039 .unlock = spi_disable_blockprotect_bp3_srwd,
13040 .write = spi_chip_write_256,
13041 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13042 .voltage = {2700, 3600},
13043 },
13044
13045 {
13046 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013047 .name = "N25S20",
13048 .bustype = BUS_SPI,
13049 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13050 .model_id = NANTRONICS_N25S20,
13051 .total_size = 256,
13052 .page_size = 256,
13053 .feature_bits = FEATURE_WRSR_WREN,
13054 .tested = TEST_UNTESTED,
13055 .probe = probe_spi_rdid,
13056 .probe_timing = TIMING_ZERO,
13057 .block_erasers =
13058 {
13059 {
13060 .eraseblocks = { {4 * 1024, 64} },
13061 .block_erase = spi_block_erase_20,
13062 }, {
13063 .eraseblocks = { {4 * 1024, 64} },
13064 .block_erase = spi_block_erase_d7,
13065 }, {
13066 .eraseblocks = { {32 * 1024, 8} },
13067 .block_erase = spi_block_erase_52,
13068 }, {
13069 .eraseblocks = { {64 * 1024, 4} },
13070 .block_erase = spi_block_erase_d8,
13071 }, {
13072 .eraseblocks = { {256 * 1024, 1} },
13073 .block_erase = spi_block_erase_60,
13074 }, {
13075 .eraseblocks = { {256 * 1024, 1} },
13076 .block_erase = spi_block_erase_c7,
13077 }
13078 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013079 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013080 .unlock = spi_disable_blockprotect_bp3_srwd,
13081 .write = spi_chip_write_256,
13082 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13083 .voltage = {2700, 3600},
13084 },
13085
13086 {
13087 .vendor = "Nantronics",
13088 .name = "N25S40",
13089 .bustype = BUS_SPI,
13090 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13091 .model_id = NANTRONICS_N25S40,
13092 .total_size = 512,
13093 .page_size = 256,
13094 .feature_bits = FEATURE_WRSR_WREN,
13095 .tested = TEST_UNTESTED,
13096 .probe = probe_spi_rdid,
13097 .probe_timing = TIMING_ZERO,
13098 .block_erasers =
13099 {
13100 {
13101 .eraseblocks = { {4 * 1024, 128} },
13102 .block_erase = spi_block_erase_20,
13103 }, {
13104 .eraseblocks = { {4 * 1024, 128} },
13105 .block_erase = spi_block_erase_d7,
13106 }, {
13107 .eraseblocks = { {32 * 1024, 16} },
13108 .block_erase = spi_block_erase_52,
13109 }, {
13110 .eraseblocks = { {64 * 1024, 8} },
13111 .block_erase = spi_block_erase_d8,
13112 }, {
13113 .eraseblocks = { {512 * 1024, 1} },
13114 .block_erase = spi_block_erase_60,
13115 }, {
13116 .eraseblocks = { {512 * 1024, 1} },
13117 .block_erase = spi_block_erase_c7,
13118 }
13119 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013120 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013121 .unlock = spi_disable_blockprotect_bp3_srwd,
13122 .write = spi_chip_write_256,
13123 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13124 .voltage = {2700, 3600},
13125 },
13126
13127 {
13128 .vendor = "Nantronics",
13129 .name = "N25S80",
13130 .bustype = BUS_SPI,
13131 .manufacture_id = NANTRONICS_ID_NOPREFIX,
13132 .model_id = NANTRONICS_N25S80,
13133 .total_size = 1024,
13134 .page_size = 256,
13135 .feature_bits = FEATURE_WRSR_WREN,
13136 .tested = TEST_UNTESTED,
13137 .probe = probe_spi_rdid,
13138 .probe_timing = TIMING_ZERO,
13139 .block_erasers =
13140 {
13141 {
13142 .eraseblocks = { {4 * 1024, 256} },
13143 .block_erase = spi_block_erase_20,
13144 }, {
13145 .eraseblocks = { {32 * 1024, 32} },
13146 .block_erase = spi_block_erase_52,
13147 }, {
13148 .eraseblocks = { {64 * 1024, 16} },
13149 .block_erase = spi_block_erase_d8,
13150 }, {
13151 .eraseblocks = { {1024 * 1024, 1} },
13152 .block_erase = spi_block_erase_60,
13153 }, {
13154 .eraseblocks = { {1024 * 1024, 1} },
13155 .block_erase = spi_block_erase_c7,
13156 }
13157 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013158 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013159 .unlock = spi_disable_blockprotect_bp3_srwd,
13160 .write = spi_chip_write_256,
13161 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13162 .voltage = {2700, 3600},
13163 },
13164
13165 {
Stefan Taunerf4451612013-04-19 01:59:15 +000013166 .vendor = "PMC",
13167 .name = "Pm25LD010(C)",
13168 .bustype = BUS_SPI,
13169 .manufacture_id = PMC_ID,
13170 .model_id = PMC_PM25LD010,
13171 .total_size = 128,
13172 .page_size = 256,
13173 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013174 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013175 .probe = probe_spi_rdid,
13176 .probe_timing = TIMING_ZERO,
13177 .block_erasers =
13178 {
13179 {
13180 .eraseblocks = { {4 * 1024, 32} },
13181 .block_erase = spi_block_erase_20,
13182 }, {
13183 .eraseblocks = { {4 * 1024, 32} },
13184 .block_erase = spi_block_erase_d7,
13185 }, {
13186 .eraseblocks = { {32 * 1024, 4} },
13187 .block_erase = spi_block_erase_d8,
13188 }, {
13189 .eraseblocks = { {128 * 1024, 1} },
13190 .block_erase = spi_block_erase_60,
13191 }, {
13192 .eraseblocks = { {128 * 1024, 1} },
13193 .block_erase = spi_block_erase_c7,
13194 }
13195 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013196 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013197 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13198 .write = spi_chip_write_256,
13199 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13200 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
13201 },
13202
13203 {
13204 .vendor = "PMC",
13205 .name = "Pm25LD020(C)",
13206 .bustype = BUS_SPI,
13207 .manufacture_id = PMC_ID,
13208 .model_id = PMC_PM25LD020,
13209 .total_size = 256,
13210 .page_size = 256,
13211 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020013212 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013213 .probe = probe_spi_rdid,
13214 .probe_timing = TIMING_ZERO,
13215 .block_erasers =
13216 {
13217 {
13218 .eraseblocks = { {4 * 1024, 64} },
13219 .block_erase = spi_block_erase_20,
13220 }, {
13221 .eraseblocks = { {4 * 1024, 64} },
13222 .block_erase = spi_block_erase_d7,
13223 }, {
13224 .eraseblocks = { {64 * 1024, 4} },
13225 .block_erase = spi_block_erase_d8,
13226 }, {
13227 .eraseblocks = { {256 * 1024, 1} },
13228 .block_erase = spi_block_erase_60,
13229 }, {
13230 .eraseblocks = { {256 * 1024, 1} },
13231 .block_erase = spi_block_erase_c7,
13232 }
13233 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013234 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013235 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13236 .write = spi_chip_write_256,
13237 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13238 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
13239 },
13240
13241 {
13242 .vendor = "PMC",
13243 .name = "Pm25LD040(C)",
13244 .bustype = BUS_SPI,
13245 .manufacture_id = PMC_ID,
13246 .model_id = PMC_PM25LV040,
13247 .total_size = 512,
13248 .page_size = 256,
13249 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020013250 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013251 .probe = probe_spi_rdid,
13252 .probe_timing = TIMING_ZERO,
13253 .block_erasers =
13254 {
13255 {
13256 .eraseblocks = { {4 * 1024, 128} },
13257 .block_erase = spi_block_erase_20,
13258 }, {
13259 .eraseblocks = { {4 * 1024, 128} },
13260 .block_erase = spi_block_erase_d7,
13261 }, {
13262 .eraseblocks = { {64 * 1024, 8} },
13263 .block_erase = spi_block_erase_d8,
13264 }, {
13265 .eraseblocks = { {512 * 1024, 1} },
13266 .block_erase = spi_block_erase_60,
13267 }, {
13268 .eraseblocks = { {512 * 1024, 1} },
13269 .block_erase = spi_block_erase_c7,
13270 }
13271 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013272 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013273 .unlock = spi_disable_blockprotect,
13274 .write = spi_chip_write_256,
13275 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13276 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
13277 },
13278
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013279 {
13280 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013281 .name = "Pm25LD256C",
13282 .bustype = BUS_SPI,
13283 .manufacture_id = PMC_ID,
13284 .model_id = PMC_PM25LD256C,
13285 .total_size = 32,
13286 .page_size = 256,
13287 .feature_bits = FEATURE_WRSR_WREN,
13288 .tested = TEST_UNTESTED,
13289 .probe = probe_spi_rdid,
13290 .probe_timing = TIMING_ZERO,
13291 .block_erasers =
13292 {
13293 {
13294 .eraseblocks = { {4 * 1024, 8} },
13295 .block_erase = spi_block_erase_20,
13296 }, {
13297 .eraseblocks = { {4 * 1024, 8} },
13298 .block_erase = spi_block_erase_d7,
13299 }, {
13300 .eraseblocks = { {32 * 1024, 1} },
13301 .block_erase = spi_block_erase_d8,
13302 }, {
13303 .eraseblocks = { {32 * 1024, 1} },
13304 .block_erase = spi_block_erase_60,
13305 }, {
13306 .eraseblocks = { {32 * 1024, 1} },
13307 .block_erase = spi_block_erase_c7,
13308 }
13309 },
13310 .printlock = spi_prettyprint_status_register_bp2_srwd,
13311 .unlock = spi_disable_blockprotect,
13312 .write = spi_chip_write_256,
13313 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13314 .voltage = {2700, 3600},
13315 },
13316
13317 {
13318 .vendor = "PMC",
13319 .name = "Pm25LD512(C)",
13320 .bustype = BUS_SPI,
13321 .manufacture_id = PMC_ID,
13322 .model_id = PMC_PM25LD512,
13323 .total_size = 64,
13324 .page_size = 256,
13325 .feature_bits = FEATURE_WRSR_WREN,
13326 .tested = TEST_OK_PREW,
13327 .probe = probe_spi_rdid,
13328 .probe_timing = TIMING_ZERO,
13329 .block_erasers =
13330 {
13331 {
13332 .eraseblocks = { {4 * 1024, 16} },
13333 .block_erase = spi_block_erase_20,
13334 }, {
13335 .eraseblocks = { {4 * 1024, 16} },
13336 .block_erase = spi_block_erase_d7,
13337 }, {
13338 .eraseblocks = { {32 * 1024, 2} },
13339 .block_erase = spi_block_erase_d8,
13340 }, {
13341 .eraseblocks = { {64 * 1024, 1} },
13342 .block_erase = spi_block_erase_60,
13343 }, {
13344 .eraseblocks = { {64 * 1024, 1} },
13345 .block_erase = spi_block_erase_c7,
13346 }
13347 },
13348 .printlock = spi_prettyprint_status_register_bp2_srwd,
13349 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13350 .write = spi_chip_write_256,
13351 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13352 .voltage = {2300, 3600},
13353 },
13354
13355 {
13356 .vendor = "PMC",
13357 .name = "Pm25LQ016",
13358 .bustype = BUS_SPI,
13359 .manufacture_id = PMC_ID,
13360 .model_id = PMC_PM25LQ016,
13361 .total_size = 2048,
13362 .page_size = 256,
13363 /* OTP: 256B total; read 0x4B, write 0xB1 */
13364 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13365 .tested = TEST_UNTESTED,
13366 .probe = probe_spi_rdid,
13367 .probe_timing = TIMING_ZERO,
13368 .block_erasers =
13369 {
13370 {
13371 .eraseblocks = { {4 * 1024, 512} },
13372 .block_erase = spi_block_erase_20,
13373 }, {
13374 .eraseblocks = { {4 * 1024, 512} },
13375 .block_erase = spi_block_erase_d7,
13376 }, {
13377 .eraseblocks = { {64 * 1024, 32} },
13378 .block_erase = spi_block_erase_d8,
13379 }, {
13380 .eraseblocks = { {2048 * 1024, 1} },
13381 .block_erase = spi_block_erase_60,
13382 }, {
13383 .eraseblocks = { {2048 * 1024, 1} },
13384 .block_erase = spi_block_erase_c7,
13385 }
13386 },
13387 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13388 .unlock = spi_disable_blockprotect_bp3_srwd,
13389 .write = spi_chip_write_256,
13390 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13391 .voltage = {2300, 3600},
13392 },
13393
13394 {
13395 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013396 .name = "Pm25LQ020",
13397 .bustype = BUS_SPI,
13398 .manufacture_id = PMC_ID,
13399 .model_id = PMC_PM25LQ020,
13400 .total_size = 256,
13401 .page_size = 256,
13402 /* OTP: 256B total; read 0x4B, write 0xB1 */
13403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13404 .tested = TEST_UNTESTED,
13405 .probe = probe_spi_rdid,
13406 .probe_timing = TIMING_ZERO,
13407 .block_erasers =
13408 {
13409 {
13410 .eraseblocks = { {4 * 1024, 64} },
13411 .block_erase = spi_block_erase_20,
13412 }, {
13413 .eraseblocks = { {4 * 1024, 64} },
13414 .block_erase = spi_block_erase_d7,
13415 }, {
13416 .eraseblocks = { {64 * 1024, 4} },
13417 .block_erase = spi_block_erase_d8,
13418 }, {
13419 .eraseblocks = { {256 * 1024, 1} },
13420 .block_erase = spi_block_erase_60,
13421 }, {
13422 .eraseblocks = { {256 * 1024, 1} },
13423 .block_erase = spi_block_erase_c7,
13424 }
13425 },
13426 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13427 .unlock = spi_disable_blockprotect_bp3_srwd,
13428 .write = spi_chip_write_256,
13429 .read = spi_chip_read,
13430 .voltage = {2300, 3600},
13431 },
13432
13433 {
13434 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013435 .name = "Pm25LQ032C",
13436 .bustype = BUS_SPI,
13437 .manufacture_id = PMC_ID,
13438 .model_id = PMC_PM25LQ032C,
13439 .total_size = 4096,
13440 .page_size = 256,
13441 /* OTP: 64B total; read 0x4B, write 0xB1 */
13442 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13443 .tested = TEST_OK_PREW,
13444 .probe = probe_spi_rdid,
13445 .probe_timing = TIMING_ZERO,
13446 .block_erasers =
13447 {
13448 {
13449 .eraseblocks = { {4 * 1024, 1024} },
13450 .block_erase = spi_block_erase_20,
13451 }, {
13452 .eraseblocks = { {4 * 1024, 1024} },
13453 .block_erase = spi_block_erase_d7,
13454 }, {
13455 .eraseblocks = { {64 * 1024, 64} },
13456 .block_erase = spi_block_erase_d8,
13457 }, {
13458 .eraseblocks = { {4096 * 1024, 1} },
13459 .block_erase = spi_block_erase_60,
13460 }, {
13461 .eraseblocks = { {4096 * 1024, 1} },
13462 .block_erase = spi_block_erase_c7,
13463 }
13464 },
13465 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13466 .unlock = spi_disable_blockprotect_bp3_srwd,
13467 .write = spi_chip_write_256,
13468 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13469 .voltage = {2700, 3600},
13470 },
13471
13472 {
13473 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013474 .name = "Pm25LQ040",
13475 .bustype = BUS_SPI,
13476 .manufacture_id = PMC_ID,
13477 .model_id = PMC_PM25LQ040,
13478 .total_size = 512,
13479 .page_size = 256,
13480 /* OTP: 256B total; read 0x4B, write 0xB1 */
13481 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13482 .tested = TEST_UNTESTED,
13483 .probe = probe_spi_rdid,
13484 .probe_timing = TIMING_ZERO,
13485 .block_erasers =
13486 {
13487 {
13488 .eraseblocks = { {4 * 1024, 128} },
13489 .block_erase = spi_block_erase_20,
13490 }, {
13491 .eraseblocks = { {4 * 1024, 128} },
13492 .block_erase = spi_block_erase_d7,
13493 }, {
13494 .eraseblocks = { {64 * 1024, 8} },
13495 .block_erase = spi_block_erase_d8,
13496 }, {
13497 .eraseblocks = { {512 * 1024, 1} },
13498 .block_erase = spi_block_erase_60,
13499 }, {
13500 .eraseblocks = { {512 * 1024, 1} },
13501 .block_erase = spi_block_erase_c7,
13502 }
13503 },
13504 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13505 .unlock = spi_disable_blockprotect_bp3_srwd,
13506 .write = spi_chip_write_256,
13507 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13508 .voltage = {2300, 3600},
13509 },
13510
13511 {
13512 .vendor = "PMC",
13513 .name = "Pm25LQ080",
13514 .bustype = BUS_SPI,
13515 .manufacture_id = PMC_ID,
13516 .model_id = PMC_PM25LQ080,
13517 .total_size = 1024,
13518 .page_size = 256,
13519 /* OTP: 64B total; read 0x4B, write 0xB1 */
13520 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13521 .tested = TEST_UNTESTED,
13522 .probe = probe_spi_rdid,
13523 .probe_timing = TIMING_ZERO,
13524 .block_erasers =
13525 {
13526 {
13527 .eraseblocks = { {4 * 1024, 256} },
13528 .block_erase = spi_block_erase_20,
13529 }, {
13530 .eraseblocks = { {4 * 1024, 256} },
13531 .block_erase = spi_block_erase_d7,
13532 }, {
13533 .eraseblocks = { {64 * 1024, 16} },
13534 .block_erase = spi_block_erase_d8,
13535 }, {
13536 .eraseblocks = { {1024 * 1024, 1} },
13537 .block_erase = spi_block_erase_60,
13538 }, {
13539 .eraseblocks = { {1024 * 1024, 1} },
13540 .block_erase = spi_block_erase_c7,
13541 }
13542 },
13543 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13544 .unlock = spi_disable_blockprotect_bp3_srwd,
13545 .write = spi_chip_write_256,
13546 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13547 .voltage = {2300, 3600},
13548 },
13549
13550 {
13551 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013552 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013553 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000013554 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013555 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013556 .total_size = 128,
13557 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013558 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000013559 .tested = TEST_OK_PREW,
13560 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013561 .probe_timing = TIMING_ZERO,
13562 .block_erasers =
13563 {
13564 {
13565 .eraseblocks = { {4 * 1024, 32} },
13566 .block_erase = spi_block_erase_d7,
13567 }, {
13568 .eraseblocks = { {32 * 1024, 4} },
13569 .block_erase = spi_block_erase_d8,
13570 }, {
13571 .eraseblocks = { {128 * 1024, 1} },
13572 .block_erase = spi_block_erase_c7,
13573 }
13574 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013575 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013576 .unlock = spi_disable_blockprotect,
13577 .write = spi_chip_write_256,
13578 .read = spi_chip_read, /* Fast read (0x0B) supported */
13579 .voltage = {2700, 3600},
13580 },
13581
13582 {
13583 .vendor = "PMC",
13584 .name = "Pm25LV010A",
13585 .bustype = BUS_SPI,
13586 .manufacture_id = PMC_ID,
13587 .model_id = PMC_PM25LV010,
13588 .total_size = 128,
13589 .page_size = 256,
13590 .feature_bits = FEATURE_WRSR_WREN,
13591 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013592 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013593 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013594 .block_erasers =
13595 {
13596 {
13597 .eraseblocks = { {4 * 1024, 32} },
13598 .block_erase = spi_block_erase_d7,
13599 }, {
13600 .eraseblocks = { {32 * 1024, 4} },
13601 .block_erase = spi_block_erase_d8,
13602 }, {
13603 .eraseblocks = { {128 * 1024, 1} },
13604 .block_erase = spi_block_erase_c7,
13605 }
13606 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013607 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013608 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013609 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013610 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013611 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013612 },
13613
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013614 {
13615 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013616 .name = "Pm25LV016B",
13617 .bustype = BUS_SPI,
13618 .manufacture_id = PMC_ID,
13619 .model_id = PMC_PM25LV016B,
13620 .total_size = 2048,
13621 .page_size = 256,
13622 .feature_bits = FEATURE_WRSR_WREN,
13623 .tested = TEST_UNTESTED,
13624 .probe = probe_spi_rdid,
13625 .probe_timing = TIMING_ZERO,
13626 .block_erasers =
13627 {
13628 {
13629 .eraseblocks = { {4 * 1024, 512} },
13630 .block_erase = spi_block_erase_d7,
13631 }, {
13632 .eraseblocks = { {4 * 1024, 512} },
13633 .block_erase = spi_block_erase_20,
13634 }, {
13635 .eraseblocks = { {64 * 1024, 32} },
13636 .block_erase = spi_block_erase_d8,
13637 }, {
13638 .eraseblocks = { {2 * 1024 * 1024, 1} },
13639 .block_erase = spi_block_erase_60,
13640 }, {
13641 .eraseblocks = { {2 * 1024 * 1024, 1} },
13642 .block_erase = spi_block_erase_c7,
13643 }
13644 },
13645 .printlock = spi_prettyprint_status_register_bp2_srwd,
13646 .unlock = spi_disable_blockprotect,
13647 .write = spi_chip_write_256,
13648 .read = spi_chip_read, /* Fast read (0x0B) supported */
13649 .voltage = {2700, 3600},
13650 },
13651
13652 {
13653 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013654 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013655 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013656 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013657 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013658 .total_size = 256,
13659 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013660 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013661 .tested = TEST_UNTESTED,
13662 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013663 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013664 .block_erasers =
13665 {
13666 {
13667 .eraseblocks = { {4 * 1024, 64} },
13668 .block_erase = spi_block_erase_d7,
13669 }, {
13670 .eraseblocks = { {64 * 1024, 4} },
13671 .block_erase = spi_block_erase_d8,
13672 }, {
13673 .eraseblocks = { {256 * 1024, 1} },
13674 .block_erase = spi_block_erase_c7,
13675 }
13676 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013677 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013678 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013679 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013680 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013681 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013682 },
13683
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013684 {
13685 .vendor = "PMC",
13686 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013687 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013688 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013689 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013690 .total_size = 512,
13691 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013692 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000013693 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013694 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013695 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013696 .block_erasers =
13697 {
13698 {
13699 .eraseblocks = { {4 * 1024, 128} },
13700 .block_erase = spi_block_erase_d7,
13701 }, {
13702 .eraseblocks = { {64 * 1024, 8} },
13703 .block_erase = spi_block_erase_d8,
13704 }, {
13705 .eraseblocks = { {512 * 1024, 1} },
13706 .block_erase = spi_block_erase_c7,
13707 }
13708 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013709 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013710 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013711 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013712 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013713 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013714 },
13715
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013716 {
13717 .vendor = "PMC",
13718 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013719 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013720 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013721 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013722 .total_size = 1024,
13723 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013724 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013725 .tested = TEST_UNTESTED,
13726 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013727 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013728 .block_erasers =
13729 {
13730 {
13731 .eraseblocks = { {4 * 1024, 256} },
13732 .block_erase = spi_block_erase_d7,
13733 }, {
13734 .eraseblocks = { {4 * 1024, 256} },
13735 .block_erase = spi_block_erase_20,
13736 }, {
13737 .eraseblocks = { {64 * 1024, 16} },
13738 .block_erase = spi_block_erase_d8,
13739 }, {
13740 .eraseblocks = { {1024 * 1024, 1} },
13741 .block_erase = spi_block_erase_60,
13742 }, {
13743 .eraseblocks = { {1024 * 1024, 1} },
13744 .block_erase = spi_block_erase_c7,
13745 }
13746 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013747 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013748 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013749 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013750 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013751 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013752 },
13753
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013754 {
13755 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013756 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013757 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013758 .manufacture_id = PMC_ID_NOPREFIX,
13759 .model_id = PMC_PM25LV512,
13760 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013761 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013762 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013763 .tested = TEST_OK_PREW,
13764 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013765 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013766 .block_erasers =
13767 {
13768 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013769 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000013770 .block_erase = spi_block_erase_d7,
13771 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013772 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000013773 .block_erase = spi_block_erase_d8,
13774 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013775 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000013776 .block_erase = spi_block_erase_c7,
13777 }
13778 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013779 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013780 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013781 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013782 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013783 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013784 },
13785
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013786 {
13787 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000013788 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013789 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013790 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013791 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013792 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000013793 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013794 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013795 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000013796 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000013797 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000013798 .block_erasers =
13799 {
13800 {
13801 .eraseblocks = {
13802 {16 * 1024, 1},
13803 {8 * 1024, 2},
13804 {96 * 1024, 1},
13805 {128 * 1024, 1},
13806 },
Sean Nelson35727f72010-01-28 23:55:12 +000013807 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013808 }, {
13809 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000013810 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013811 },
13812 },
Sean Nelson35727f72010-01-28 23:55:12 +000013813 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013814 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013815 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013816 .prepare_access = prepare_memory_access,
13817 .finish_access = finish_memory_access,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013818 },
13819
13820 {
13821 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013822 .name = "Pm29F002T",
13823 .bustype = BUS_PARALLEL,
13824 .manufacture_id = PMC_ID_NOPREFIX,
13825 .model_id = PMC_PM29F002T,
13826 .total_size = 256,
13827 .page_size = 8 * 1024,
13828 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13829 .tested = TEST_OK_PREW,
13830 .probe = probe_jedec,
13831 .probe_timing = TIMING_FIXME,
13832 .block_erasers =
13833 {
13834 {
13835 .eraseblocks = {
13836 {128 * 1024, 1},
13837 {96 * 1024, 1},
13838 {8 * 1024, 2},
13839 {16 * 1024, 1},
13840 },
13841 .block_erase = erase_sector_jedec,
13842 }, {
13843 .eraseblocks = { {256 * 1024, 1} },
13844 .block_erase = erase_chip_block_jedec,
13845 },
13846 },
13847 .write = write_jedec_1,
13848 .read = read_memmapped,
13849 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013850 .prepare_access = prepare_memory_access,
13851 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013852 },
13853
13854 {
13855 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013856 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013857 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013858 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013859 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013860 .total_size = 128,
13861 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013862 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013863 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013864 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013865 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000013866 .block_erasers =
13867 {
13868 {
13869 .eraseblocks = { {4 * 1024, 32} },
13870 .block_erase = erase_sector_jedec,
13871 }, {
13872 .eraseblocks = { {64 * 1024, 2} },
13873 .block_erase = erase_block_jedec,
13874 }, {
13875 .eraseblocks = { {128 * 1024, 1} },
13876 .block_erase = erase_chip_block_jedec,
13877 }
13878 },
Sean Nelson35727f72010-01-28 23:55:12 +000013879 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013880 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013881 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013882 .prepare_access = prepare_memory_access,
13883 .finish_access = finish_memory_access,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013884 },
13885
13886 {
13887 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013888 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013889 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013890 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013891 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013892 .total_size = 256,
13893 .page_size = 4096,
13894 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13895 .tested = TEST_UNTESTED,
13896 .probe = probe_jedec,
13897 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013898 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013899 {
13900 {
13901 .eraseblocks = { {4 * 1024, 64} },
13902 .block_erase = erase_sector_jedec,
13903 }, {
13904 .eraseblocks = { {64 * 1024, 4} },
13905 .block_erase = erase_block_jedec,
13906 }, {
13907 .eraseblocks = { {256 * 1024, 1} },
13908 .block_erase = erase_chip_block_jedec,
13909 }
13910 },
13911 .write = write_jedec_1,
13912 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013913 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013914 .prepare_access = prepare_memory_access,
13915 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013916 },
13917
13918 {
13919 .vendor = "PMC",
13920 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013921 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013922 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013923 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013924 .total_size = 512,
13925 .page_size = 4096,
13926 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013927 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013928 .probe = probe_jedec,
13929 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013930 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013931 {
13932 {
13933 .eraseblocks = { {4 * 1024, 128} },
13934 .block_erase = erase_sector_jedec,
13935 }, {
13936 .eraseblocks = { {64 * 1024, 8} },
13937 .block_erase = erase_block_jedec,
13938 }, {
13939 .eraseblocks = { {512 * 1024, 1} },
13940 .block_erase = erase_chip_block_jedec,
13941 }
13942 },
13943 .write = write_jedec_1,
13944 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013945 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013946 .prepare_access = prepare_memory_access,
13947 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013948 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013949
13950 {
13951 .vendor = "PMC",
13952 .name = "Pm39LV512",
13953 .bustype = BUS_PARALLEL,
13954 .manufacture_id = PMC_ID_NOPREFIX,
13955 .model_id = PMC_PM39LV512,
13956 .total_size = 64,
13957 .page_size = 4096,
13958 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13959 .tested = TEST_OK_PREW,
13960 .probe = probe_jedec,
13961 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13962 .block_erasers =
13963 {
13964 {
13965 .eraseblocks = { {4 * 1024, 16} },
13966 .block_erase = erase_sector_jedec,
13967 }, {
13968 .eraseblocks = { {64 * 1024, 1} },
13969 .block_erase = erase_block_jedec,
13970 }, {
13971 .eraseblocks = { {64 * 1024, 1} },
13972 .block_erase = erase_chip_block_jedec,
13973 }
13974 },
13975 .write = write_jedec_1,
13976 .read = read_memmapped,
13977 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013978 .prepare_access = prepare_memory_access,
13979 .finish_access = finish_memory_access,
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013980 },
13981
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013982 {
13983 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013984 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013985 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013986 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013987 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013988 .total_size = 256,
13989 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010013990 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013991 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013992 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013993 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000013994 .block_erasers =
13995 {
13996 {
13997 .eraseblocks = { {4 * 1024, 64} },
13998 .block_erase = erase_sector_jedec,
13999 }, {
14000 .eraseblocks = { {16 * 1024, 16} },
14001 .block_erase = erase_block_jedec,
14002 }, {
14003 .eraseblocks = { {256 * 1024, 1} },
14004 .block_erase = erase_chip_block_jedec,
14005 }
14006 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014007 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000014008 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014009 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014010 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010014011 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010014012 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014013 },
14014
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014015 {
14016 .vendor = "PMC",
14017 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014018 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014019 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014020 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014021 .total_size = 512,
14022 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010014023 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000014024 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014025 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000014026 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000014027 .block_erasers =
14028 {
14029 {
14030 .eraseblocks = { {4 * 1024, 128} },
14031 .block_erase = erase_sector_jedec,
14032 }, {
14033 .eraseblocks = { {64 * 1024, 8} },
14034 .block_erase = erase_block_jedec,
14035 }, {
14036 .eraseblocks = { {512 * 1024, 1} },
14037 .block_erase = erase_chip_block_jedec,
14038 }
14039 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014040 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000014041 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014042 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014043 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010014044 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010014045 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014046 },
14047
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014048 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014049 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000014050 .name = "SST25LF020A",
14051 .bustype = BUS_SPI,
14052 .manufacture_id = SST_ID,
14053 .model_id = SST_SST25VF020_REMS,
14054 .total_size = 256,
14055 .page_size = 256,
14056 .feature_bits = FEATURE_WRSR_EWSR,
14057 .tested = TEST_OK_PREW,
14058 .probe = probe_spi_rems,
14059 .probe_timing = TIMING_ZERO,
14060 .block_erasers =
14061 {
14062 {
14063 .eraseblocks = { {4 * 1024, 64} },
14064 .block_erase = spi_block_erase_20,
14065 }, {
14066 .eraseblocks = { {32 * 1024, 8} },
14067 .block_erase = spi_block_erase_52,
14068 }, {
14069 .eraseblocks = { {256 * 1024, 1} },
14070 .block_erase = spi_block_erase_60,
14071 },
14072 },
14073 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14074 .unlock = spi_disable_blockprotect,
14075 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14076 .read = spi_chip_read, /* Fast read (0x0B) supported */
14077 .voltage = {2700, 3600},
14078 },
14079
14080 {
14081 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000014082 .name = "SST25LF040A",
14083 .bustype = BUS_SPI,
14084 .manufacture_id = SST_ID,
14085 .model_id = SST_SST25VF040_REMS,
14086 .total_size = 512,
14087 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014088 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000014089 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000014090 .probe = probe_spi_res2,
14091 .probe_timing = TIMING_ZERO,
14092 .block_erasers =
14093 {
14094 {
14095 .eraseblocks = { {4 * 1024, 128} },
14096 .block_erase = spi_block_erase_20,
14097 }, {
14098 .eraseblocks = { {32 * 1024, 16} },
14099 .block_erase = spi_block_erase_52,
14100 }, {
14101 .eraseblocks = { {512 * 1024, 1} },
14102 .block_erase = spi_block_erase_60,
14103 },
14104 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014105 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000014106 .unlock = spi_disable_blockprotect,
14107 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14108 .read = spi_chip_read,
14109 .voltage = {3000, 3600},
14110 },
14111
14112 {
14113 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000014114 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000014115 .bustype = BUS_SPI,
14116 .manufacture_id = SST_ID,
14117 .model_id = SST_SST25VF080_REMS,
14118 .total_size = 1024,
14119 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014120 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000014121 .tested = TEST_UNTESTED,
14122 .probe = probe_spi_res2,
14123 .probe_timing = TIMING_ZERO,
14124 .block_erasers =
14125 {
14126 {
14127 .eraseblocks = { {4 * 1024, 256} },
14128 .block_erase = spi_block_erase_20,
14129 }, {
14130 .eraseblocks = { {32 * 1024, 32} },
14131 .block_erase = spi_block_erase_52,
14132 }, {
14133 .eraseblocks = { {1024 * 1024, 1} },
14134 .block_erase = spi_block_erase_60,
14135 },
14136 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014137 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000014138 .unlock = spi_disable_blockprotect,
14139 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14140 .read = spi_chip_read,
14141 .voltage = {3000, 3600},
14142 },
14143
14144 {
14145 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000014146 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014147 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000014148 .manufacture_id = SST_ID,
14149 .model_id = SST_SST25VF010_REMS,
14150 .total_size = 128,
14151 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014152 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000014153 .tested = TEST_OK_PREW,
14154 .probe = probe_spi_rems,
14155 .probe_timing = TIMING_ZERO,
14156 .block_erasers =
14157 {
14158 {
14159 .eraseblocks = { {4 * 1024, 32} },
14160 .block_erase = spi_block_erase_20,
14161 }, {
14162 .eraseblocks = { {32 * 1024, 4} },
14163 .block_erase = spi_block_erase_52,
14164 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000014165 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014166 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014167 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000014168 .eraseblocks = { {128 * 1024, 1} },
14169 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000014170 }, {
14171 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014172 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014173 },
14174 },
14175 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14176 .unlock = spi_disable_blockprotect,
14177 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000014178 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014179 .voltage = {2700, 3600},
14180 },
14181
14182 {
14183 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014184 .name = "SST25VF016B",
14185 .bustype = BUS_SPI,
14186 .manufacture_id = SST_ID,
14187 .model_id = SST_SST25VF016B,
14188 .total_size = 2048,
14189 .page_size = 256,
14190 .feature_bits = FEATURE_WRSR_EITHER,
14191 .tested = TEST_OK_PREW,
14192 .probe = probe_spi_rdid,
14193 .probe_timing = TIMING_ZERO,
14194 .block_erasers =
14195 {
14196 {
14197 .eraseblocks = { {4 * 1024, 512} },
14198 .block_erase = spi_block_erase_20,
14199 }, {
14200 .eraseblocks = { {32 * 1024, 64} },
14201 .block_erase = spi_block_erase_52,
14202 }, {
14203 .eraseblocks = { {64 * 1024, 32} },
14204 .block_erase = spi_block_erase_d8,
14205 }, {
14206 .eraseblocks = { {2 * 1024 * 1024, 1} },
14207 .block_erase = spi_block_erase_60,
14208 }, {
14209 .eraseblocks = { {2 * 1024 * 1024, 1} },
14210 .block_erase = spi_block_erase_c7,
14211 },
14212 },
14213 .printlock = spi_prettyprint_status_register_sst25vf016,
14214 .unlock = spi_disable_blockprotect,
14215 .write = spi_aai_write,
14216 .read = spi_chip_read,
14217 .voltage = {2700, 3600},
14218 },
14219
14220 {
14221 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014222 .name = "SST25VF020",
14223 .bustype = BUS_SPI,
14224 .manufacture_id = SST_ID,
14225 .model_id = SST_SST25VF020_REMS,
14226 .total_size = 256,
14227 .page_size = 256,
14228 .feature_bits = FEATURE_WRSR_EWSR,
14229 .tested = TEST_UNTESTED,
14230 .probe = probe_spi_rems,
14231 .probe_timing = TIMING_ZERO,
14232 .block_erasers =
14233 {
14234 {
14235 .eraseblocks = { {4 * 1024, 64} },
14236 .block_erase = spi_block_erase_20,
14237 }, {
14238 .eraseblocks = { {32 * 1024, 8} },
14239 .block_erase = spi_block_erase_52,
14240 }, {
14241 .eraseblocks = { {256 * 1024, 1} },
14242 .block_erase = spi_block_erase_60,
14243 },
14244 },
14245 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14246 .unlock = spi_disable_blockprotect,
14247 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14248 .read = spi_chip_read, /* only */
14249 .voltage = {2700, 3600},
14250 },
14251
14252 {
14253 .vendor = "SST",
14254 .name = "SST25VF020B",
14255 .bustype = BUS_SPI,
14256 .manufacture_id = SST_ID,
14257 .model_id = SST_SST25VF020B,
14258 .total_size = 256,
14259 .page_size = 256,
14260 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014261 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000014262 .probe = probe_spi_rdid,
14263 .probe_timing = TIMING_ZERO,
14264 .block_erasers =
14265 {
14266 {
14267 .eraseblocks = { {4 * 1024, 64} },
14268 .block_erase = spi_block_erase_20,
14269 }, {
14270 .eraseblocks = { {32 * 1024, 8} },
14271 .block_erase = spi_block_erase_52,
14272 }, {
14273 .eraseblocks = { {64 * 1024, 4} },
14274 .block_erase = spi_block_erase_d8,
14275 }, {
14276 .eraseblocks = { {256 * 1024, 1} },
14277 .block_erase = spi_block_erase_60,
14278 }, {
14279 .eraseblocks = { {256 * 1024, 1} },
14280 .block_erase = spi_block_erase_c7,
14281 },
14282 },
14283 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
14284 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
14285 .write = spi_aai_write, /* AAI supported (0xAD) */
14286 .read = spi_chip_read, /* Fast read (0x0B) supported */
14287 .voltage = {2700, 3600},
14288 },
14289
14290 {
14291 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014292 .name = "SST25VF032B",
14293 .bustype = BUS_SPI,
14294 .manufacture_id = SST_ID,
14295 .model_id = SST_SST25VF032B,
14296 .total_size = 4096,
14297 .page_size = 256,
14298 .feature_bits = FEATURE_WRSR_EWSR,
14299 .tested = TEST_OK_PREW,
14300 .probe = probe_spi_rdid,
14301 .probe_timing = TIMING_ZERO,
14302 .block_erasers =
14303 {
14304 {
14305 .eraseblocks = { {4 * 1024, 1024} },
14306 .block_erase = spi_block_erase_20,
14307 }, {
14308 .eraseblocks = { {32 * 1024, 128} },
14309 .block_erase = spi_block_erase_52,
14310 }, {
14311 .eraseblocks = { {64 * 1024, 64} },
14312 .block_erase = spi_block_erase_d8,
14313 }, {
14314 .eraseblocks = { {4 * 1024 * 1024, 1} },
14315 .block_erase = spi_block_erase_60,
14316 }, {
14317 .eraseblocks = { {4 * 1024 * 1024, 1} },
14318 .block_erase = spi_block_erase_c7,
14319 },
14320 },
14321 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14322 .unlock = spi_disable_blockprotect,
14323 .write = spi_aai_write,
14324 .read = spi_chip_read,
14325 .voltage = {2700, 3600},
14326 },
14327
14328 {
14329 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014330 .name = "SST25VF040",
14331 .bustype = BUS_SPI,
14332 .manufacture_id = SST_ID,
14333 .model_id = SST_SST25VF040_REMS,
14334 .total_size = 512,
14335 .page_size = 256,
14336 .feature_bits = FEATURE_WRSR_EWSR,
14337 .tested = TEST_OK_PR,
14338 .probe = probe_spi_rems,
14339 .probe_timing = TIMING_ZERO,
14340 .block_erasers =
14341 {
14342 {
14343 .eraseblocks = { {4 * 1024, 128} },
14344 .block_erase = spi_block_erase_20,
14345 }, {
14346 .eraseblocks = { {32 * 1024, 16} },
14347 .block_erase = spi_block_erase_52,
14348 }, {
14349 .eraseblocks = { {512 * 1024, 1} },
14350 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000014351 },
14352 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014353 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000014354 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000014355 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14356 .read = spi_chip_read,
14357 .voltage = {2700, 3600},
14358 },
14359
14360 {
14361 .vendor = "SST",
14362 .name = "SST25VF040B",
14363 .bustype = BUS_SPI,
14364 .manufacture_id = SST_ID,
14365 .model_id = SST_SST25VF040B,
14366 .total_size = 512,
14367 .page_size = 256,
14368 .feature_bits = FEATURE_WRSR_EWSR,
14369 .tested = TEST_OK_PREW,
14370 .probe = probe_spi_rdid,
14371 .probe_timing = TIMING_ZERO,
14372 .block_erasers =
14373 {
14374 {
14375 .eraseblocks = { {4 * 1024, 128} },
14376 .block_erase = spi_block_erase_20,
14377 }, {
14378 .eraseblocks = { {32 * 1024, 16} },
14379 .block_erase = spi_block_erase_52,
14380 }, {
14381 .eraseblocks = { {64 * 1024, 8} },
14382 .block_erase = spi_block_erase_d8,
14383 }, {
14384 .eraseblocks = { {512 * 1024, 1} },
14385 .block_erase = spi_block_erase_60,
14386 }, {
14387 .eraseblocks = { {512 * 1024, 1} },
14388 .block_erase = spi_block_erase_c7,
14389 },
14390 },
14391 .printlock = spi_prettyprint_status_register_sst25vf040b,
14392 .unlock = spi_disable_blockprotect,
14393 .write = spi_aai_write, /* AAI supported (0xAD) */
14394 .read = spi_chip_read, /* Fast read (0x0B) supported */
14395 .voltage = {2700, 3600},
14396 },
14397
14398 {
14399 .vendor = "SST",
14400 .name = "SST25VF040B.REMS",
14401 .bustype = BUS_SPI,
14402 .manufacture_id = SST_ID,
14403 .model_id = SST_SST25VF040B_REMS,
14404 .total_size = 512,
14405 .page_size = 256,
14406 .feature_bits = FEATURE_WRSR_EWSR,
14407 .tested = TEST_OK_PREW,
14408 .probe = probe_spi_rems,
14409 .probe_timing = TIMING_ZERO,
14410 .block_erasers =
14411 {
14412 {
14413 .eraseblocks = { {4 * 1024, 128} },
14414 .block_erase = spi_block_erase_20,
14415 }, {
14416 .eraseblocks = { {32 * 1024, 16} },
14417 .block_erase = spi_block_erase_52,
14418 }, {
14419 .eraseblocks = { {64 * 1024, 8} },
14420 .block_erase = spi_block_erase_d8,
14421 }, {
14422 .eraseblocks = { {512 * 1024, 1} },
14423 .block_erase = spi_block_erase_60,
14424 }, {
14425 .eraseblocks = { {512 * 1024, 1} },
14426 .block_erase = spi_block_erase_c7,
14427 },
14428 },
14429 .printlock = spi_prettyprint_status_register_sst25vf040b,
14430 .unlock = spi_disable_blockprotect,
14431 .write = spi_aai_write,
14432 .read = spi_chip_read,
14433 .voltage = {2700, 3600},
14434 },
14435
14436 {
14437 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014438 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000014439 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014440 .manufacture_id = SST_ID,
14441 .model_id = SST_SST25VF064C,
14442 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014443 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014444 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014445 .tested = TEST_OK_PREW,
14446 .probe = probe_spi_rdid,
14447 .probe_timing = TIMING_ZERO,
14448 .block_erasers =
14449 {
14450 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014451 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014452 .block_erase = spi_block_erase_20,
14453 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014454 .eraseblocks = { {32 * 1024, 256} },
14455 .block_erase = spi_block_erase_52,
14456 }, {
14457 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014458 .block_erase = spi_block_erase_d8,
14459 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014460 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014461 .block_erase = spi_block_erase_60,
14462 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014463 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014464 .block_erase = spi_block_erase_c7,
14465 },
14466 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014467 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14468 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014469 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014470 .read = spi_chip_read,
14471 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000014472 },
14473
14474 {
14475 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014476 .name = "SST25VF080B",
14477 .bustype = BUS_SPI,
14478 .manufacture_id = SST_ID,
14479 .model_id = SST_SST25VF080B,
14480 .total_size = 1024,
14481 .page_size = 256,
14482 .feature_bits = FEATURE_WRSR_EWSR,
14483 .tested = TEST_OK_PREW,
14484 .probe = probe_spi_rdid,
14485 .probe_timing = TIMING_ZERO,
14486 .block_erasers =
14487 {
14488 {
14489 .eraseblocks = { {4 * 1024, 256} },
14490 .block_erase = spi_block_erase_20,
14491 }, {
14492 .eraseblocks = { {32 * 1024, 32} },
14493 .block_erase = spi_block_erase_52,
14494 }, {
14495 .eraseblocks = { {64 * 1024, 16} },
14496 .block_erase = spi_block_erase_d8,
14497 }, {
14498 .eraseblocks = { {1024 * 1024, 1} },
14499 .block_erase = spi_block_erase_60,
14500 }, {
14501 .eraseblocks = { {1024 * 1024, 1} },
14502 .block_erase = spi_block_erase_c7,
14503 },
14504 },
14505 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14506 .unlock = spi_disable_blockprotect,
14507 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000014508 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014509 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000014510 },
14511
14512 {
14513 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014514 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014515 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014516 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014517 .model_id = SST_SST25VF512_REMS,
14518 .total_size = 64,
14519 .page_size = 256,
14520 .feature_bits = FEATURE_WRSR_EWSR,
14521 .tested = TEST_OK_PREW,
14522 .probe = probe_spi_rems,
14523 .probe_timing = TIMING_ZERO,
14524 .block_erasers =
14525 {
14526 {
14527 .eraseblocks = { {4 * 1024, 16} },
14528 .block_erase = spi_block_erase_20,
14529 }, {
14530 .eraseblocks = { {32 * 1024, 2} },
14531 .block_erase = spi_block_erase_52,
14532 }, {
14533 .eraseblocks = { {32 * 1024, 2} },
14534 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
14535 }, {
14536 .eraseblocks = { {64 * 1024, 1} },
14537 .block_erase = spi_block_erase_60,
14538 }, {
14539 .eraseblocks = { {64 * 1024, 1} },
14540 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
14541 },
14542 },
14543 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14544 .unlock = spi_disable_blockprotect,
14545 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14546 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
14547 .voltage = {2700, 3600},
14548 },
14549
14550 {
14551 .vendor = "SST",
14552 .name = "SST25WF010",
14553 .bustype = BUS_SPI,
14554 .manufacture_id = SST_ID,
14555 .model_id = SST_SST25WF010,
14556 .total_size = 128,
14557 .page_size = 256,
14558 .feature_bits = FEATURE_WRSR_EITHER,
14559 .tested = TEST_UNTESTED,
14560 .probe = probe_spi_rdid,
14561 .probe_timing = TIMING_ZERO,
14562 .block_erasers =
14563 {
14564 {
14565 .eraseblocks = { {4 * 1024, 32} },
14566 .block_erase = spi_block_erase_20,
14567 }, {
14568 .eraseblocks = { {32 * 1024, 4} },
14569 .block_erase = spi_block_erase_52,
14570 }, {
14571 .eraseblocks = { {1024 * 128, 1} },
14572 .block_erase = spi_block_erase_60,
14573 }, {
14574 .eraseblocks = { {1024 * 128, 1} },
14575 .block_erase = spi_block_erase_c7,
14576 },
14577 },
14578 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14579 .unlock = spi_disable_blockprotect_bp2_srwd,
14580 .write = spi_aai_write,
14581 .read = spi_chip_read, /* Fast read (0x0B) supported */
14582 .voltage = {1650, 1950},
14583 },
14584
14585 {
14586 .vendor = "SST",
14587 .name = "SST25WF020",
14588 .bustype = BUS_SPI,
14589 .manufacture_id = SST_ID,
14590 .model_id = SST_SST25WF020,
14591 .total_size = 256,
14592 .page_size = 256,
14593 .feature_bits = FEATURE_WRSR_EITHER,
14594 .tested = TEST_UNTESTED,
14595 .probe = probe_spi_rdid,
14596 .probe_timing = TIMING_ZERO,
14597 .block_erasers =
14598 {
14599 {
14600 .eraseblocks = { {4 * 1024, 64} },
14601 .block_erase = spi_block_erase_20,
14602 }, {
14603 .eraseblocks = { {32 * 1024, 8} },
14604 .block_erase = spi_block_erase_52,
14605 }, {
14606 .eraseblocks = { {64 * 1024, 4} },
14607 .block_erase = spi_block_erase_d8,
14608 }, {
14609 .eraseblocks = { {1024 * 256, 1} },
14610 .block_erase = spi_block_erase_60,
14611 }, {
14612 .eraseblocks = { {1024 * 256, 1} },
14613 .block_erase = spi_block_erase_c7,
14614 },
14615 },
14616 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14617 .unlock = spi_disable_blockprotect_bp2_srwd,
14618 .write = spi_aai_write,
14619 .read = spi_chip_read, /* Fast read (0x0B) supported */
14620 .voltage = {1650, 1950},
14621 },
14622
14623 {
14624 .vendor = "SST",
14625 .name = "SST25WF020A",
14626 .bustype = BUS_SPI,
14627 .manufacture_id = SANYO_ID, /* See flashchips.h */
14628 .model_id = SST_SST25WF020A,
14629 .total_size = 256,
14630 .page_size = 256,
14631 .feature_bits = FEATURE_WRSR_WREN,
14632 .tested = TEST_UNTESTED,
14633 .probe = probe_spi_rdid,
14634 .probe_timing = TIMING_ZERO,
14635 .block_erasers =
14636 {
14637 {
14638 .eraseblocks = { {4 * 1024, 64} },
14639 .block_erase = spi_block_erase_20,
14640 }, {
14641 .eraseblocks = { {64 * 1024, 4} },
14642 .block_erase = spi_block_erase_d8,
14643 }, {
14644 .eraseblocks = { {256 * 1024, 1} },
14645 .block_erase = spi_block_erase_60,
14646 }, {
14647 .eraseblocks = { {256 * 1024, 1} },
14648 .block_erase = spi_block_erase_c7,
14649 },
14650 },
14651 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14652 .unlock = spi_disable_blockprotect_bp2_srwd,
14653 .write = spi_chip_write_256,
14654 .read = spi_chip_read, /* Fast read (0x0B) supported */
14655 .voltage = {1650, 1950},
14656 },
14657
14658 {
14659 .vendor = "SST",
14660 .name = "SST25WF040",
14661 .bustype = BUS_SPI,
14662 .manufacture_id = SST_ID,
14663 .model_id = SST_SST25WF040,
14664 .total_size = 512,
14665 .page_size = 256,
14666 .feature_bits = FEATURE_WRSR_EITHER,
14667 .tested = TEST_UNTESTED,
14668 .probe = probe_spi_rdid,
14669 .probe_timing = TIMING_ZERO,
14670 .block_erasers =
14671 {
14672 {
14673 .eraseblocks = { {4 * 1024, 128} },
14674 .block_erase = spi_block_erase_20,
14675 }, {
14676 .eraseblocks = { {32 * 1024, 16} },
14677 .block_erase = spi_block_erase_52,
14678 }, {
14679 .eraseblocks = { {64 * 1024, 8} },
14680 .block_erase = spi_block_erase_d8,
14681 }, {
14682 .eraseblocks = { {1024 * 512, 1} },
14683 .block_erase = spi_block_erase_60,
14684 }, {
14685 .eraseblocks = { {1024 * 512, 1} },
14686 .block_erase = spi_block_erase_c7,
14687 },
14688 },
14689 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14690 .unlock = spi_disable_blockprotect_bp2_srwd,
14691 .write = spi_aai_write,
14692 .read = spi_chip_read, /* Fast read (0x0B) supported */
14693 .voltage = {1650, 1950},
14694 },
14695
14696 {
14697 .vendor = "SST",
14698 .name = "SST25WF040B",
14699 .bustype = BUS_SPI,
14700 .manufacture_id = SANYO_ID, /* See flashchips.h */
14701 .model_id = SST_SST25WF040B,
14702 .total_size = 512,
14703 .page_size = 256,
14704 .feature_bits = FEATURE_WRSR_WREN,
14705 .tested = TEST_UNTESTED,
14706 .probe = probe_spi_rdid,
14707 .probe_timing = TIMING_ZERO,
14708 .block_erasers =
14709 {
14710 {
14711 .eraseblocks = { {4 * 1024, 128} },
14712 .block_erase = spi_block_erase_20,
14713 }, {
14714 .eraseblocks = { {64 * 1024, 8} },
14715 .block_erase = spi_block_erase_d8,
14716 }, {
14717 .eraseblocks = { {512 * 1024, 1} },
14718 .block_erase = spi_block_erase_60,
14719 }, {
14720 .eraseblocks = { {512 * 1024, 1} },
14721 .block_erase = spi_block_erase_c7,
14722 },
14723 },
14724 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14725 .unlock = spi_disable_blockprotect_bp2_srwd,
14726 .write = spi_chip_write_256,
14727 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14728 .voltage = {1650, 1950},
14729 },
14730
14731 {
14732 .vendor = "SST",
14733 .name = "SST25WF080",
14734 .bustype = BUS_SPI,
14735 .manufacture_id = SST_ID,
14736 .model_id = SST_SST25WF080,
14737 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014738 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014739 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000014740 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014741 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014742 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014743 .block_erasers =
14744 {
14745 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014746 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014747 .block_erase = spi_block_erase_20,
14748 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014749 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014750 .block_erase = spi_block_erase_52,
14751 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014752 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014753 .block_erase = spi_block_erase_d8,
14754 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014755 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014756 .block_erase = spi_block_erase_60,
14757 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014758 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014759 .block_erase = spi_block_erase_c7,
14760 },
14761 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014762 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
14763 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000014764 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014765 .read = spi_chip_read, /* Fast read (0x0B) supported */
14766 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000014767 },
14768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014769 {
14770 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014771 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014772 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014773 .manufacture_id = SANYO_ID, /* See flashchips.h */
14774 .model_id = SST_SST25WF080B,
14775 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014776 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014777 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000014778 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014779 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014780 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014781 .block_erasers =
14782 {
14783 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014784 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014785 .block_erase = spi_block_erase_20,
14786 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014787 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014788 .block_erase = spi_block_erase_d8,
14789 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014790 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014791 .block_erase = spi_block_erase_60,
14792 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014793 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014794 .block_erase = spi_block_erase_c7,
14795 },
14796 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014797 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14798 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000014799 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014800 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14801 .voltage = {1650, 1950},
14802 },
14803
14804 {
14805 .vendor = "SST",
14806 .name = "SST25WF512",
14807 .bustype = BUS_SPI,
14808 .manufacture_id = SST_ID,
14809 .model_id = SST_SST25WF512,
14810 .total_size = 64,
14811 .page_size = 256,
14812 .feature_bits = FEATURE_WRSR_EITHER,
14813 .tested = TEST_UNTESTED,
14814 .probe = probe_spi_rdid,
14815 .probe_timing = TIMING_ZERO,
14816 .block_erasers =
14817 {
14818 {
14819 .eraseblocks = { {4 * 1024, 16} },
14820 .block_erase = spi_block_erase_20,
14821 }, {
14822 .eraseblocks = { {32 * 1024, 2} },
14823 .block_erase = spi_block_erase_52,
14824 }, {
14825 .eraseblocks = { {1024 * 64, 1} },
14826 .block_erase = spi_block_erase_60,
14827 }, {
14828 .eraseblocks = { {1024 * 64, 1} },
14829 .block_erase = spi_block_erase_c7,
14830 },
14831 },
14832 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14833 .unlock = spi_disable_blockprotect_bp2_srwd,
14834 .write = spi_aai_write,
14835 .read = spi_chip_read, /* Fast read (0x0B) supported */
14836 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000014837 },
14838
14839 {
14840 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014841 .name = "SST26VF016",
14842 .bustype = BUS_SPI,
14843 .manufacture_id = SST_ID,
14844 .model_id = SST_SST26VF016,
14845 .total_size = 2048,
14846 .page_size = 256,
14847 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14848 .tested = TEST_UNTESTED,
14849 .probe = probe_spi_rdid,
14850 .probe_timing = TIMING_ZERO,
14851 .block_erasers =
14852 {
14853 {
14854 .eraseblocks = { {4 * 1024, 512} },
14855 .block_erase = spi_block_erase_20,
14856 }, {
14857 .eraseblocks = {
14858 {8 * 1024, 4},
14859 {32 * 1024, 1},
14860 {64 * 1024, 30},
14861 {32 * 1024, 1},
14862 {8 * 1024, 4},
14863 },
14864 .block_erase = spi_block_erase_d8,
14865 }, {
14866 .eraseblocks = { {2 * 1024 * 1024, 1} },
14867 .block_erase = spi_block_erase_c7,
14868 },
14869 },
14870 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14871 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14872 .write = spi_chip_write_256, /* Multi I/O supported */
14873 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14874 .voltage = {2700, 3600},
14875 },
14876
14877 {
14878 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014879 .name = "SST26VF016B(A)",
14880 .bustype = BUS_SPI,
14881 .manufacture_id = SST_ID,
14882 .model_id = SST_SST26VF016B,
14883 .total_size = 2048,
14884 .page_size = 256,
14885 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14886 .tested = TEST_OK_PREW,
14887 .probe = probe_spi_rdid,
14888 .probe_timing = TIMING_ZERO,
14889 .block_erasers =
14890 {
14891 {
14892 .eraseblocks = { {4 * 1024, 512} },
14893 .block_erase = spi_block_erase_20,
14894 }, {
14895 .eraseblocks = {
14896 {8 * 1024, 4},
14897 {32 * 1024, 1},
14898 {64 * 1024, 30},
14899 {32 * 1024, 1},
14900 {8 * 1024, 4},
14901 },
14902 .block_erase = spi_block_erase_d8,
14903 }, {
14904 .eraseblocks = { {2 * 1024 * 1024, 1} },
14905 .block_erase = spi_block_erase_c7,
14906 },
14907 },
14908 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14909 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14910 .write = spi_chip_write_256, /* Multi I/O supported */
14911 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14912 .voltage = {2700, 3600},
14913 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014914
Wei Hu25584de2018-04-30 14:02:08 -070014915 {
14916 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014917 .name = "SST26VF032",
14918 .bustype = BUS_SPI,
14919 .manufacture_id = SST_ID,
14920 .model_id = SST_SST26VF032,
14921 .total_size = 4096,
14922 .page_size = 256,
14923 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14924 .tested = TEST_UNTESTED,
14925 .probe = probe_spi_rdid,
14926 .probe_timing = TIMING_ZERO,
14927 .block_erasers =
14928 {
14929 {
14930 .eraseblocks = { {4 * 1024, 1024} },
14931 .block_erase = spi_block_erase_20,
14932 }, {
14933 .eraseblocks = {
14934 {8 * 1024, 4},
14935 {32 * 1024, 1},
14936 {64 * 1024, 62},
14937 {32 * 1024, 1},
14938 {8 * 1024, 4},
14939 },
14940 .block_erase = spi_block_erase_d8,
14941 }, {
14942 .eraseblocks = { {4 * 1024 * 1024, 1} },
14943 .block_erase = spi_block_erase_c7,
14944 },
14945 },
14946 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14947 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14948 .write = spi_chip_write_256, /* Multi I/O supported */
14949 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14950 .voltage = {2700, 3600},
14951 },
14952
14953 {
14954 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014955 .name = "SST26VF032B(A)",
14956 .bustype = BUS_SPI,
14957 .manufacture_id = SST_ID,
14958 .model_id = SST_SST26VF032B,
14959 .total_size = 4096,
14960 .page_size = 256,
14961 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14962 .tested = TEST_UNTESTED,
14963 .probe = probe_spi_rdid,
14964 .probe_timing = TIMING_ZERO,
14965 .block_erasers =
14966 {
14967 {
14968 .eraseblocks = { {4 * 1024, 1024} },
14969 .block_erase = spi_block_erase_20,
14970 }, {
14971 .eraseblocks = {
14972 {8 * 1024, 4},
14973 {32 * 1024, 1},
14974 {64 * 1024, 62},
14975 {32 * 1024, 1},
14976 {8 * 1024, 4},
14977 },
14978 .block_erase = spi_block_erase_d8,
14979 }, {
14980 .eraseblocks = { {4 * 1024 * 1024, 1} },
14981 .block_erase = spi_block_erase_c7,
14982 },
14983 },
14984 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14985 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14986 .write = spi_chip_write_256, /* Multi I/O supported */
14987 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14988 .voltage = {2700, 3600},
14989 },
14990
Wei Hu25584de2018-04-30 14:02:08 -070014991 {
14992 .vendor = "SST",
14993 .name = "SST26VF064B(A)",
14994 .bustype = BUS_SPI,
14995 .manufacture_id = SST_ID,
14996 .model_id = SST_SST26VF064B,
14997 .total_size = 8192,
14998 .page_size = 256,
14999 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15000 .tested = TEST_OK_PREW,
15001 .probe = probe_spi_rdid,
15002 .probe_timing = TIMING_ZERO,
15003 .block_erasers =
15004 {
15005 {
15006 .eraseblocks = { {4 * 1024, 2048} },
15007 .block_erase = spi_block_erase_20,
15008 }, {
15009 .eraseblocks = {
15010 {8 * 1024, 4},
15011 {32 * 1024, 1},
15012 {64 * 1024, 126},
15013 {32 * 1024, 1},
15014 {8 * 1024, 4},
15015 },
15016 .block_erase = spi_block_erase_d8,
15017 }, {
15018 .eraseblocks = { {8 * 1024 * 1024, 1} },
15019 .block_erase = spi_block_erase_c7,
15020 },
15021 },
15022 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15023 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
15024 .write = spi_chip_write_256, /* Multi I/O supported */
15025 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15026 .voltage = {2700, 3600},
15027 },
15028
15029 {
15030 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015031 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015032 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015033 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015034 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015035 .total_size = 512,
15036 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000015037 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015038 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015039 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015040 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015041 .block_erasers =
15042 {
15043 {
15044 .eraseblocks = { {128, 4096} },
15045 .block_erase = erase_sector_28sf040,
15046 }, {
15047 .eraseblocks = { {512 * 1024, 1} },
15048 .block_erase = erase_chip_28sf040,
15049 }
15050 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015051 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015052 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015053 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015054 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015055 .prepare_access = prepare_memory_access,
15056 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015057 },
15058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015059 {
15060 .vendor = "SST",
15061 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015062 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015063 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015064 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015065 .total_size = 128,
15066 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015067 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015068 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015069 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015070 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015071 .block_erasers =
15072 {
15073 {
15074 .eraseblocks = { {128 * 1024, 1} },
15075 .block_erase = erase_chip_block_jedec,
15076 }
15077 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015078 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015079 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015080 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015081 .prepare_access = prepare_memory_access,
15082 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015083 },
15084
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015085 {
15086 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015087 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015088 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015089 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015090 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015091 .total_size = 256,
15092 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015093 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015094 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015095 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015096 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015097 .block_erasers =
15098 {
15099 {
15100 .eraseblocks = { {256 * 1024, 1} },
15101 .block_erase = erase_chip_block_jedec,
15102 }
15103 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015104 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015105 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015106 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015107 .prepare_access = prepare_memory_access,
15108 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015109 },
15110
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015111 {
15112 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015113 .name = "SST29LE010",
15114 .bustype = BUS_PARALLEL,
15115 .manufacture_id = SST_ID,
15116 .model_id = SST_SST29LE010,
15117 .total_size = 128,
15118 .page_size = 128,
15119 .feature_bits = FEATURE_LONG_RESET,
15120 .tested = TEST_UNTESTED,
15121 .probe = probe_jedec,
15122 .probe_timing = 10,
15123 .block_erasers =
15124 {
15125 {
15126 .eraseblocks = { {128 * 1024, 1} },
15127 .block_erase = erase_chip_block_jedec,
15128 }
15129 },
15130 .write = write_jedec,
15131 .read = read_memmapped,
15132 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015133 .prepare_access = prepare_memory_access,
15134 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015135 },
15136
15137 {
15138 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015139 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015140 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015141 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015142 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015143 .total_size = 256,
15144 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015145 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015146 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015147 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015148 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015149 .block_erasers =
15150 {
15151 {
15152 .eraseblocks = { {256 * 1024, 1} },
15153 .block_erase = erase_chip_block_jedec,
15154 }
15155 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015156 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015157 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015158 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015159 .prepare_access = prepare_memory_access,
15160 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015161 },
15162
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015163 {
15164 .vendor = "SST",
15165 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015166 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015167 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015168 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015169 .total_size = 128,
15170 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015171 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015172 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015173 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015174 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015175 .block_erasers =
15176 {
15177 {
15178 .eraseblocks = { {4 * 1024, 32} },
15179 .block_erase = erase_sector_jedec,
15180 }, {
15181 .eraseblocks = { {128 * 1024, 1} },
15182 .block_erase = erase_chip_block_jedec,
15183 }
15184 },
Sean Nelson35727f72010-01-28 23:55:12 +000015185 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015186 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015187 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015188 .prepare_access = prepare_memory_access,
15189 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015190 },
15191
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015192 {
15193 .vendor = "SST",
15194 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015195 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015196 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015197 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015198 .total_size = 256,
15199 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015200 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000015201 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015202 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015203 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015204 .block_erasers =
15205 {
15206 {
15207 .eraseblocks = { {4 * 1024, 64} },
15208 .block_erase = erase_sector_jedec,
15209 }, {
15210 .eraseblocks = { {256 * 1024, 1} },
15211 .block_erase = erase_chip_block_jedec,
15212 }
15213 },
Sean Nelson35727f72010-01-28 23:55:12 +000015214 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015215 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015216 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015217 .prepare_access = prepare_memory_access,
15218 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015219 },
15220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015221 {
15222 .vendor = "SST",
15223 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015224 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015225 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015226 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015227 .total_size = 512,
15228 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015229 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000015230 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015231 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015232 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015233 .block_erasers =
15234 {
15235 {
15236 .eraseblocks = { {4 * 1024, 128} },
15237 .block_erase = erase_sector_jedec,
15238 }, {
15239 .eraseblocks = { {512 * 1024, 1} },
15240 .block_erase = erase_chip_block_jedec,
15241 }
15242 },
Sean Nelson35727f72010-01-28 23:55:12 +000015243 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015244 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015245 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015246 .prepare_access = prepare_memory_access,
15247 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015248 },
15249
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015250 {
15251 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015252 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015253 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015254 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015255 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015256 .total_size = 64,
15257 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015258 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000015259 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015260 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015261 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015262 .block_erasers =
15263 {
15264 {
15265 .eraseblocks = { {4 * 1024, 16} },
15266 .block_erase = erase_sector_jedec,
15267 }, {
15268 .eraseblocks = { {64 * 1024, 1} },
15269 .block_erase = erase_chip_block_jedec,
15270 }
15271 },
Sean Nelson35727f72010-01-28 23:55:12 +000015272 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015273 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015274 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015275 .prepare_access = prepare_memory_access,
15276 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015277 },
15278
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015279 {
15280 .vendor = "SST",
15281 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015282 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015283 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015284 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015285 .total_size = 128,
15286 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015287 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000015288 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015289 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015290 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015291 .block_erasers =
15292 {
15293 {
15294 .eraseblocks = { {4 * 1024, 32} },
15295 .block_erase = erase_sector_jedec,
15296 }, {
15297 .eraseblocks = { {128 * 1024, 1} },
15298 .block_erase = erase_chip_block_jedec,
15299 }
15300 },
Sean Nelson35727f72010-01-28 23:55:12 +000015301 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015302 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015303 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015304 .prepare_access = prepare_memory_access,
15305 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015306 },
15307
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015308 {
15309 .vendor = "SST",
15310 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015311 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015312 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015313 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015314 .total_size = 256,
15315 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015316 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000015317 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015318 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015319 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015320 .block_erasers =
15321 {
15322 {
15323 .eraseblocks = { {4 * 1024, 64} },
15324 .block_erase = erase_sector_jedec,
15325 }, {
15326 .eraseblocks = { {256 * 1024, 1} },
15327 .block_erase = erase_chip_block_jedec,
15328 }
15329 },
Sean Nelson35727f72010-01-28 23:55:12 +000015330 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015331 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015332 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015333 .prepare_access = prepare_memory_access,
15334 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015335 },
15336
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015337 {
15338 .vendor = "SST",
15339 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015340 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015341 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015342 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015343 .total_size = 512,
15344 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015345 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015346 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015347 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015348 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015349 .block_erasers =
15350 {
15351 {
15352 .eraseblocks = { {4 * 1024, 128} },
15353 .block_erase = erase_sector_jedec,
15354 }, {
15355 .eraseblocks = { {512 * 1024, 1} },
15356 .block_erase = erase_chip_block_jedec,
15357 }
15358 },
Sean Nelson35727f72010-01-28 23:55:12 +000015359 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015360 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015361 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015362 .prepare_access = prepare_memory_access,
15363 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000015364 },
FENG yu ningff692fb2008-12-08 18:15:10 +000015365
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015366 {
15367 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000015368 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015369 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015370 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015371 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000015372 .total_size = 1024,
15373 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015374 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000015375 .tested = TEST_UNTESTED,
15376 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015377 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015378 .block_erasers =
15379 {
15380 {
15381 .eraseblocks = { {4 * 1024, 256} },
15382 .block_erase = erase_sector_jedec,
15383 }, {
15384 .eraseblocks = { {64 * 1024, 16} },
15385 .block_erase = erase_block_jedec,
15386 }, {
15387 .eraseblocks = { {1024 * 1024, 1} },
15388 .block_erase = erase_chip_block_jedec,
15389 }
15390 },
Sean Nelson35727f72010-01-28 23:55:12 +000015391 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015392 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015393 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015394 .prepare_access = prepare_memory_access,
15395 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +000015396 },
15397
15398 {
15399 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015400 .name = "SST39VF512",
15401 .bustype = BUS_PARALLEL,
15402 .manufacture_id = SST_ID,
15403 .model_id = SST_SST39VF512,
15404 .total_size = 64,
15405 .page_size = 4096,
15406 .feature_bits = FEATURE_EITHER_RESET,
15407 .tested = TEST_OK_PREW,
15408 .probe = probe_jedec,
15409 .probe_timing = 1, /* 150 ns */
15410 .block_erasers =
15411 {
15412 {
15413 .eraseblocks = { {4 * 1024, 16} },
15414 .block_erase = erase_sector_jedec,
15415 }, {
15416 .eraseblocks = { {64 * 1024, 1} },
15417 .block_erase = erase_chip_block_jedec,
15418 }
15419 },
15420 .write = write_jedec_1,
15421 .read = read_memmapped,
15422 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015423 .prepare_access = prepare_memory_access,
15424 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015425 },
15426
15427 {
15428 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015429 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015430 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015431 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015432 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015433 .total_size = 256,
15434 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015435 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015436 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015437 .probe = probe_jedec,
15438 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015439 .block_erasers =
15440 {
15441 {
15442 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015443 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015444 }, {
15445 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015446 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015447 }, {
15448 .eraseblocks = { {256 * 1024, 1} },
15449 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15450 }
15451 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015452 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015453 .unlock = unlock_sst_fwhub,
15454 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015455 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015456 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015457 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015458 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015459 },
15460
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015461 {
15462 .vendor = "SST",
15463 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015464 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015465 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015466 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015467 .total_size = 384,
15468 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015469 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000015470 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015471 .probe = probe_jedec,
15472 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015473 .block_erasers =
15474 {
15475 {
15476 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015477 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015478 }, {
15479 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015480 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015481 }, {
15482 .eraseblocks = { {384 * 1024, 1} },
15483 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15484 }
15485 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015486 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015487 .unlock = unlock_sst_fwhub,
15488 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015489 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015490 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015491 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015492 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015493 },
15494
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015495 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015496 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
15497 * and is only honored for 64k block erase, but not 4k sector erase.
15498 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015499 .vendor = "SST",
15500 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015501 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015502 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015503 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015504 .total_size = 512,
15505 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015506 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015507 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015508 .probe = probe_jedec,
15509 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015510 .block_erasers =
15511 {
15512 {
15513 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015514 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015515 }, {
15516 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015517 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015518 }, {
15519 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000015520 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015521 },
15522 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015523 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015524 .unlock = unlock_sst_fwhub,
15525 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015526 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015527 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015528 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015529 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015530 },
15531
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015532 {
15533 .vendor = "SST",
15534 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015535 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015536 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015537 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015538 .total_size = 512,
15539 .page_size = 4 * 1024,
15540 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015541 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015542 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015543 .block_erasers =
15544 {
15545 {
15546 .eraseblocks = { {4 * 1024, 128} },
15547 .block_erase = erase_sector_49lfxxxc,
15548 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015549 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015550 {64 * 1024, 7},
15551 {32 * 1024, 1},
15552 {8 * 1024, 2},
15553 {16 * 1024, 1},
15554 },
Sean Nelson69e58112010-03-23 17:10:28 +000015555 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015556 }
15557 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015558 .printlock = printlock_regspace2_block_eraser_1,
15559 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015560 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015561 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015562 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015563 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015564 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015565 },
15566
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015567 {
15568 .vendor = "SST",
15569 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015570 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015571 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015572 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015573 .total_size = 1024,
15574 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015575 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015576 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015577 .probe = probe_jedec,
15578 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015579 .block_erasers =
15580 {
15581 {
15582 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015583 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015584 }, {
15585 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015586 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015587 }, {
15588 .eraseblocks = { {1024 * 1024, 1} },
15589 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15590 }
15591 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015592 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015593 .unlock = unlock_sst_fwhub,
15594 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015595 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015596 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015597 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015598 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015599 },
15600
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015601 {
15602 .vendor = "SST",
15603 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015604 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015605 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015606 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015607 .total_size = 1024,
15608 .page_size = 4 * 1024,
15609 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015610 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015611 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015612 .block_erasers =
15613 {
15614 {
15615 .eraseblocks = { {4 * 1024, 256} },
15616 .block_erase = erase_sector_49lfxxxc,
15617 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015618 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015619 {64 * 1024, 15},
15620 {32 * 1024, 1},
15621 {8 * 1024, 2},
15622 {16 * 1024, 1},
15623 },
Sean Nelson69e58112010-03-23 17:10:28 +000015624 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015625 }
15626 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015627 .printlock = printlock_regspace2_block_eraser_1,
15628 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015629 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015630 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015631 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015632 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015633 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015634 },
15635
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015636 {
15637 .vendor = "SST",
15638 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015639 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015640 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015641 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015642 .total_size = 2048,
15643 .page_size = 4 * 1024,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015644 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015645 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015646 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015647 .block_erasers =
15648 {
15649 {
15650 .eraseblocks = { {4 * 1024, 512} },
15651 .block_erase = erase_sector_49lfxxxc,
15652 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015653 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015654 {64 * 1024, 31},
15655 {32 * 1024, 1},
15656 {8 * 1024, 2},
15657 {16 * 1024, 1},
15658 },
Sean Nelson69e58112010-03-23 17:10:28 +000015659 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015660 }
15661 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015662 .printlock = printlock_regspace2_block_eraser_1,
15663 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015664 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015665 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015666 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015667 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015668 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015669 },
15670
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015671 {
15672 .vendor = "SST",
15673 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015674 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015675 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015676 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015677 .total_size = 256,
15678 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015679 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000015680 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015681 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015682 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015683 .block_erasers =
15684 {
15685 {
15686 .eraseblocks = { {4 * 1024, 64} },
15687 .block_erase = erase_sector_jedec,
15688 }, {
15689 .eraseblocks = { {16 * 1024, 16} },
15690 .block_erase = erase_block_jedec,
15691 }, {
15692 .eraseblocks = { {256 * 1024, 1} },
15693 .block_erase = NULL,
15694 }
15695 },
Sean Nelson35727f72010-01-28 23:55:12 +000015696 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015697 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015698 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015699 .prepare_access = prepare_memory_access,
15700 .finish_access = finish_memory_access,
Sven Schnellec208dfb2009-01-07 12:35:09 +000015701 },
15702
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015703 {
15704 .vendor = "SST",
15705 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015706 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015707 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015708 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015709 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000015710 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015711 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015712 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015713 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015714 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015715 .block_erasers =
15716 {
15717 {
15718 .eraseblocks = { {4 * 1024, 64} },
15719 .block_erase = erase_sector_jedec,
15720 }, {
15721 .eraseblocks = { {16 * 1024, 16} },
15722 .block_erase = erase_block_jedec,
15723 }, {
15724 .eraseblocks = { {256 * 1024, 1} },
15725 .block_erase = NULL,
15726 }
15727 },
Sean Nelson35727f72010-01-28 23:55:12 +000015728 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015729 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015730 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015731 .prepare_access = prepare_memory_access,
15732 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015733 },
15734
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015735 {
15736 .vendor = "SST",
15737 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015738 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015739 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015740 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015741 .total_size = 512,
15742 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015743 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015744 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015745 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015746 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015747 .block_erasers =
15748 {
15749 {
15750 .eraseblocks = { {4 * 1024, 128} },
15751 .block_erase = erase_sector_jedec,
15752 }, {
15753 .eraseblocks = { {64 * 1024, 8} },
15754 .block_erase = erase_block_jedec,
15755 }, {
15756 .eraseblocks = { {512 * 1024, 1} },
15757 .block_erase = NULL,
15758 }
15759 },
Sean Nelson35727f72010-01-28 23:55:12 +000015760 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015761 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015762 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015763 .prepare_access = prepare_memory_access,
15764 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015765 },
15766
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015767 {
15768 .vendor = "SST",
15769 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015770 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015771 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015772 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015773 .total_size = 512,
15774 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015775 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015776 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015777 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015778 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015779 .block_erasers =
15780 {
15781 {
15782 .eraseblocks = { {4 * 1024, 128} },
15783 .block_erase = erase_sector_jedec,
15784 }, {
15785 .eraseblocks = { {64 * 1024, 8} },
15786 .block_erase = erase_block_jedec,
15787 }, {
15788 .eraseblocks = { {512 * 1024, 1} },
15789 .block_erase = NULL,
15790 }
15791 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015792 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000015793 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015794 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015795 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015796 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015797 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015798 },
15799
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015800 {
15801 .vendor = "SST",
15802 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015803 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015804 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020015805 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015806 .total_size = 1024,
15807 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015808 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000015809 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015810 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015811 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015812 .block_erasers =
15813 {
15814 {
15815 .eraseblocks = { {4 * 1024, 256} },
15816 .block_erase = erase_sector_jedec,
15817 }, {
15818 .eraseblocks = { {64 * 1024, 16} },
15819 .block_erase = erase_block_jedec,
15820 }, {
15821 .eraseblocks = { {1024 * 1024, 1} },
15822 .block_erase = NULL,
15823 }
15824 },
Sean Nelson35727f72010-01-28 23:55:12 +000015825 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015827 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015828 .prepare_access = prepare_memory_access,
15829 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015830 },
15831
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015832 {
15833 .vendor = "SST",
15834 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015835 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015836 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015837 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015838 .total_size = 2048,
15839 .page_size = 4 * 1024,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015840 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015841 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015842 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015843 .block_erasers =
15844 {
15845 {
15846 .eraseblocks = { {4 * 1024, 512} },
15847 .block_erase = erase_sector_49lfxxxc,
15848 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015849 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015850 {64 * 1024, 31},
15851 {32 * 1024, 1},
15852 {8 * 1024, 2},
15853 {16 * 1024, 1},
15854 },
Sean Nelson69e58112010-03-23 17:10:28 +000015855 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015856 }
15857 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015858 .printlock = printlock_regspace2_block_eraser_1,
15859 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015860 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015861 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015862 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015863 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015864 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015865 },
15866
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015867 {
15868 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015869 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015870 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015871 .manufacture_id = ST_ID,
15872 .model_id = ST_M29F002B,
15873 .total_size = 256,
15874 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015875 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015876 .tested = TEST_UNTESTED,
15877 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015878 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015879 .block_erasers =
15880 {
15881 {
15882 .eraseblocks = {
15883 {16 * 1024, 1},
15884 {8 * 1024, 2},
15885 {32 * 1024, 1},
15886 {64 * 1024, 3},
15887 },
15888 .block_erase = erase_sector_jedec,
15889 }, {
15890 .eraseblocks = { {256 * 1024, 1} },
15891 .block_erase = erase_chip_block_jedec,
15892 }
15893 },
Sean Nelson35727f72010-01-28 23:55:12 +000015894 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015895 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015896 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015897 .prepare_access = prepare_memory_access,
15898 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015899 },
15900
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015901 {
15902 .vendor = "ST",
15903 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015904 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015905 .manufacture_id = ST_ID,
15906 .model_id = ST_M29F002T,
15907 .total_size = 256,
15908 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015909 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015910 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015911 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015912 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015913 .block_erasers =
15914 {
15915 {
15916 .eraseblocks = {
15917 {64 * 1024, 3},
15918 {32 * 1024, 1},
15919 {8 * 1024, 2},
15920 {16 * 1024, 1},
15921 },
15922 .block_erase = erase_sector_jedec,
15923 }, {
15924 .eraseblocks = { {256 * 1024, 1} },
15925 .block_erase = erase_chip_block_jedec,
15926 }
15927 },
Sean Nelson35727f72010-01-28 23:55:12 +000015928 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015929 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015930 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015931 .prepare_access = prepare_memory_access,
15932 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015933 },
15934
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015935 {
15936 .vendor = "ST",
15937 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015938 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015939 .manufacture_id = ST_ID,
15940 .model_id = ST_M29F040B,
15941 .total_size = 512,
15942 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015943 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
15944 .tested = TEST_UNTESTED,
15945 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000015946 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000015947 .block_erasers =
15948 {
15949 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015950 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000015951 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015952 }, {
15953 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000015954 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015955 }
15956 },
Sean Nelson35727f72010-01-28 23:55:12 +000015957 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015958 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015959 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015960 .prepare_access = prepare_memory_access,
15961 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015962 },
15963
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015964 {
Sean Nelson35727f72010-01-28 23:55:12 +000015965 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015966 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015967 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015968 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015969 .manufacture_id = ST_ID,
15970 .model_id = ST_M29F400BB,
15971 .total_size = 512,
15972 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015973 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015974 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015975 .probe = probe_jedec,
15976 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015977 .block_erasers =
15978 {
15979 {
15980 .eraseblocks = {
15981 {16 * 1024, 1},
15982 {8 * 1024, 2},
15983 {32 * 1024, 1},
15984 {64 * 1024, 7},
15985 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015986 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015987 }, {
15988 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015989 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015990 }
15991 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015992 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015993 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015994 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015995 .prepare_access = prepare_memory_access,
15996 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015997 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100015998
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015999 {
16000 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
16001 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016002 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016003 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016004 .manufacture_id = ST_ID,
16005 .model_id = ST_M29F400BT,
16006 .total_size = 512,
16007 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016008 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016009 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016010 .probe = probe_jedec,
16011 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000016012 .block_erasers =
16013 {
16014 {
16015 .eraseblocks = {
16016 {64 * 1024, 7},
16017 {32 * 1024, 1},
16018 {8 * 1024, 2},
16019 {16 * 1024, 1},
16020 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016021 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016022 }, {
16023 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016024 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000016025 }
16026 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000016027 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016028 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016029 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010016030 .prepare_access = prepare_memory_access,
16031 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016032 },
16033
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016034 {
16035 .vendor = "ST",
16036 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016037 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016038 .manufacture_id = ST_ID,
16039 .model_id = ST_M29W010B,
16040 .total_size = 128,
16041 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016042 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016043 .tested = TEST_UNTESTED,
16044 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016045 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016046 .block_erasers =
16047 {
16048 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016049 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016050 .block_erase = erase_sector_jedec,
16051 }, {
16052 .eraseblocks = { {128 * 1024, 1} },
16053 .block_erase = erase_chip_block_jedec,
16054 }
16055 },
Sean Nelson35727f72010-01-28 23:55:12 +000016056 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016057 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016058 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016059 .prepare_access = prepare_memory_access,
16060 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016061 },
16062
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016063 {
16064 .vendor = "ST",
16065 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016066 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016067 .manufacture_id = ST_ID,
16068 .model_id = ST_M29W040B,
16069 .total_size = 512,
16070 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016071 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016072 .tested = TEST_UNTESTED,
16073 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016074 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016075 .block_erasers =
16076 {
16077 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016078 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016079 .block_erase = erase_sector_jedec,
16080 }, {
16081 .eraseblocks = { {512 * 1024, 1} },
16082 .block_erase = erase_chip_block_jedec,
16083 }
16084 },
Sean Nelson35727f72010-01-28 23:55:12 +000016085 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016087 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016088 .prepare_access = prepare_memory_access,
16089 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016090 },
16091
Stefan Taunereb582572012-09-21 12:52:50 +000016092 {
16093 .vendor = "ST",
16094 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016095 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100016096 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000016097 .model_id = ST_M29W512B,
16098 .total_size = 64,
16099 .page_size = 64 * 1024,
16100 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016101 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000016102 .probe = probe_jedec,
16103 .probe_timing = TIMING_ZERO,
16104 .block_erasers =
16105 {
16106 {
16107 .eraseblocks = { {64 * 1024, 1} },
16108 .block_erase = erase_chip_block_jedec,
16109 }
16110 },
16111 .write = write_jedec_1,
16112 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016113 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016114 .prepare_access = prepare_memory_access,
16115 .finish_access = finish_memory_access,
Stefan Taunereb582572012-09-21 12:52:50 +000016116 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000016117
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016118 {
16119 .vendor = "ST",
16120 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016121 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016122 .manufacture_id = ST_ID,
16123 .model_id = ST_M50FLW040A,
16124 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016125 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016126 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016127 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016128 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016129 .block_erasers =
16130 {
16131 {
Sean Nelson329bde72010-01-19 16:39:19 +000016132 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016133 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016134 {64 * 1024, 5}, /* block */
16135 {4 * 1024, 16}, /* sector */
16136 {4 * 1024, 16}, /* sector */
16137 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016138 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016139 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016140 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016141 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016142 }
16143 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016144 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100016145 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016146 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016147 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016148 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016149 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016150 },
16151
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016152 {
16153 .vendor = "ST",
16154 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016155 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016156 .manufacture_id = ST_ID,
16157 .model_id = ST_M50FLW040B,
16158 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016159 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016160 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016161 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016162 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016163 .block_erasers =
16164 {
16165 {
Sean Nelson329bde72010-01-19 16:39:19 +000016166 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016167 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016168 {4 * 1024, 16}, /* sector */
16169 {64 * 1024, 5}, /* block */
16170 {4 * 1024, 16}, /* sector */
16171 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016172 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016173 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016174 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016175 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016176 }
16177 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016178 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100016179 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016180 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016181 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016182 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016183 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016184 },
16185
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016186 {
16187 .vendor = "ST",
16188 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016189 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016190 .manufacture_id = ST_ID,
16191 .model_id = ST_M50FLW080A,
16192 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016193 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016194 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016195 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016196 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016197 .block_erasers =
16198 {
16199 {
Sean Nelson329bde72010-01-19 16:39:19 +000016200 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016201 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016202 {64 * 1024, 13}, /* block */
16203 {4 * 1024, 16}, /* sector */
16204 {4 * 1024, 16}, /* sector */
16205 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016206 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016207 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016208 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016209 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016210 }
16211 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016212 .printlock = printlock_regspace2_block_eraser_0,
16213 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016214 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016215 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016216 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016217 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016218 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016219 },
16220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016221 {
16222 .vendor = "ST",
16223 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016224 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016225 .manufacture_id = ST_ID,
16226 .model_id = ST_M50FLW080B,
16227 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016228 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016229 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016230 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016231 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016232 .block_erasers =
16233 {
16234 {
Sean Nelson329bde72010-01-19 16:39:19 +000016235 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016236 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016237 {4 * 1024, 16}, /* sector */
16238 {64 * 1024, 13}, /* block */
16239 {4 * 1024, 16}, /* sector */
16240 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016241 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016242 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016243 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016244 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016245 }
16246 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016247 .printlock = printlock_regspace2_block_eraser_0,
16248 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016249 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016250 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016251 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016252 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016253 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016254 },
16255
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016256 {
16257 .vendor = "ST",
16258 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016259 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016260 .manufacture_id = ST_ID,
16261 .model_id = ST_M50FW002,
16262 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000016263 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016264 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016265 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016266 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016267 .block_erasers =
16268 {
16269 {
16270 .eraseblocks = {
16271 {64 * 1024, 3},
16272 {32 * 1024, 1},
16273 {8 * 1024, 2},
16274 {16 * 1024, 1},
16275 },
Sean Nelson28accc22010-03-19 18:47:06 +000016276 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016277 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000016278 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016279 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000016280 }
16281 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016282 .printlock = printlock_regspace2_block_eraser_0,
16283 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016284 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016285 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016286 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016287 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016288 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016289 },
16290
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016291 {
16292 .vendor = "ST",
16293 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016294 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016295 .manufacture_id = ST_ID,
16296 .model_id = ST_M50FW016,
16297 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016298 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016299 .tested = TEST_UNTESTED,
16300 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016301 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016302 .block_erasers =
16303 {
16304 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016305 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000016306 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016307 }
16308 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016309 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016310 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016311 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016312 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016313 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016314 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016315 },
16316
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016317 {
16318 .vendor = "ST",
16319 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016320 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016321 .manufacture_id = ST_ID,
16322 .model_id = ST_M50FW040,
16323 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016324 .page_size = 0,
Sean Nelson28accc22010-03-19 18:47:06 +000016325 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016326 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016327 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016328 .block_erasers =
16329 {
16330 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016331 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016332 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016333 }
16334 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016335 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016336 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016337 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016338 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016339 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016340 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016341 },
16342
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016343 {
16344 .vendor = "ST",
16345 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016346 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016347 .manufacture_id = ST_ID,
16348 .model_id = ST_M50FW080,
16349 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016350 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016351 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016352 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016353 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016354 .block_erasers =
16355 {
16356 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016357 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016358 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016359 }
16360 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016361 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016362 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016363 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016364 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016365 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016366 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016367 },
16368
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016369 {
16370 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016371 .name = "M50LPW080",
16372 .bustype = BUS_LPC, /* A/A Mux */
16373 .manufacture_id = ST_ID,
16374 .model_id = ST_M50LPW080,
16375 .total_size = 1024,
16376 .page_size = 0,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016377 .tested = TEST_UNTESTED,
16378 .probe = probe_82802ab,
16379 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16380 .block_erasers =
16381 {
16382 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016383 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016384 .block_erase = erase_block_82802ab,
16385 }
16386 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016387 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016388 .write = write_82802ab,
16389 .read = read_memmapped,
16390 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016391 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016392 .finish_access = finish_memory_access,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016393 },
16394
16395 {
16396 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016397 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016398 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016399 .manufacture_id = ST_ID,
16400 .model_id = ST_M50LPW116,
16401 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016402 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016403 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016404 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000016405 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016406 .block_erasers =
16407 {
16408 {
16409 .eraseblocks = {
16410 {4 * 1024, 16},
16411 {64 * 1024, 30},
16412 {32 * 1024, 1},
16413 {8 * 1024, 2},
16414 {16 * 1024, 1},
16415 },
Sean Nelson28accc22010-03-19 18:47:06 +000016416 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016417 }
16418 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016419 .printlock = printlock_regspace2_block_eraser_0,
16420 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016421 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016422 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016423 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016424 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016425 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016426 },
16427
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016428 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016429 .vendor = "ST",
16430 .name = "M95M02",
16431 .bustype = BUS_SPI,
16432 .manufacture_id = ST_ID,
16433 .model_id = ST_M95M02,
16434 .total_size = 256,
16435 .page_size = 256,
16436 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
16437 .tested = TEST_OK_PREW,
Nico Huber54557862023-05-15 12:01:04 +020016438 .spi_cmd_set = SPI95,
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016439 .probe = probe_spi_st95,
16440 .probe_timing = TIMING_ZERO,
16441 .block_erasers =
16442 {
16443 {
16444 .eraseblocks = { {256 * 1024, 1} },
16445 .block_erase = spi_block_erase_emulation,
16446 }
16447 },
16448
16449 .printlock = spi_prettyprint_status_register_bp1_srwd,
16450 .unlock = spi_disable_blockprotect_bp1_srwd,
16451 .write = spi_chip_write_256,
16452 .read = spi_chip_read,
16453 .voltage = {2500, 5500},
16454 },
16455
16456 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016457 .vendor = "Sanyo",
16458 .name = "LE25FU106B",
16459 .bustype = BUS_SPI,
16460 .manufacture_id = SANYO_ID,
16461 .model_id = SANYO_LE25FU106B,
16462 .total_size = 128,
16463 .page_size = 256,
16464 .feature_bits = FEATURE_WRSR_WREN,
16465 .tested = TEST_UNTESTED,
16466 .probe = probe_spi_res2,
16467 .probe_timing = TIMING_ZERO,
16468 .block_erasers =
16469 {
16470 /* FIXME: Is this correct?
16471 {
16472 .eraseblocks = { {2 * 1024, 64} },
16473 .block_erase = spi_block_erase_d7,
16474 },*/
16475 {
16476 .eraseblocks = { {32 * 1024, 4} },
16477 .block_erase = spi_block_erase_d8,
16478 }, {
16479 .eraseblocks = { {128 * 1024, 1} },
16480 .block_erase = spi_block_erase_c7,
16481 }
16482 },
16483 .printlock = spi_prettyprint_status_register_bp1_srwd,
16484 .unlock = spi_disable_blockprotect_bp1_srwd,
16485 .write = spi_chip_write_256,
16486 .read = spi_chip_read,
16487 .voltage = {2300, 3600},
16488 },
16489
16490 {
16491 .vendor = "Sanyo",
16492 .name = "LE25FU206",
16493 .bustype = BUS_SPI,
16494 .manufacture_id = SANYO_ID,
16495 .model_id = SANYO_LE25FU206,
16496 .total_size = 256,
16497 .page_size = 256,
16498 .feature_bits = FEATURE_WRSR_WREN,
16499 .tested = TEST_UNTESTED,
16500 .probe = probe_spi_res2,
16501 .probe_timing = TIMING_ZERO,
16502 .block_erasers =
16503 {
16504 {
16505 .eraseblocks = { {4 * 1024, 64} },
16506 .block_erase = spi_block_erase_d7,
16507 }, {
16508 .eraseblocks = { {64 * 1024, 4} },
16509 .block_erase = spi_block_erase_d8,
16510 }, {
16511 .eraseblocks = { {256 * 1024, 1} },
16512 .block_erase = spi_block_erase_c7,
16513 }
16514 },
16515 .printlock = spi_prettyprint_status_register_bp1_srwd,
16516 .unlock = spi_disable_blockprotect_bp1_srwd,
16517 .write = spi_chip_write_256,
16518 .read = spi_chip_read,
16519 .voltage = {2300, 3600},
16520 },
16521
16522 {
16523 .vendor = "Sanyo",
16524 .name = "LE25FU206A",
16525 .bustype = BUS_SPI,
16526 .manufacture_id = SANYO_ID,
16527 .model_id = SANYO_LE25FU206A,
16528 .total_size = 256,
16529 .page_size = 256,
16530 .tested = TEST_UNTESTED,
16531 .probe = probe_spi_rdid,
16532 .probe_timing = TIMING_ZERO,
16533 .block_erasers =
16534 {
16535 {
16536 .eraseblocks = { {4 * 1024, 64} },
16537 .block_erase = spi_block_erase_20,
16538 }, {
16539 .eraseblocks = { {4 * 1024, 64} },
16540 .block_erase = spi_block_erase_d7,
16541 }, {
16542 .eraseblocks = { {64 * 1024, 4} },
16543 .block_erase = spi_block_erase_d8,
16544 }, {
16545 .eraseblocks = { {256 * 1024, 1} },
16546 .block_erase = spi_block_erase_60,
16547 }, {
16548 .eraseblocks = { {256 * 1024, 1} },
16549 .block_erase = spi_block_erase_c7,
16550 }
16551 },
16552 .printlock = spi_prettyprint_status_register_bp2_srwd,
16553 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16554 .write = spi_chip_write_256,
16555 .read = spi_chip_read,
16556 .voltage = {2300, 3600},
16557 },
16558
16559 {
16560 .vendor = "Sanyo",
16561 .name = "LE25FU406B",
16562 .bustype = BUS_SPI,
16563 .manufacture_id = SANYO_ID,
16564 .model_id = SANYO_LE25FU406B,
16565 .total_size = 512,
16566 .page_size = 256,
16567 .feature_bits = FEATURE_WRSR_WREN,
16568 .tested = TEST_OK_PREW,
16569 .probe = probe_spi_res2,
16570 .probe_timing = TIMING_ZERO,
16571 .block_erasers =
16572 {
16573 {
16574 .eraseblocks = { {4 * 1024, 128} },
16575 .block_erase = spi_block_erase_d7,
16576 }, {
16577 .eraseblocks = { {64 * 1024, 8} },
16578 .block_erase = spi_block_erase_d8,
16579 }, {
16580 .eraseblocks = { {512 * 1024, 1} },
16581 .block_erase = spi_block_erase_c7,
16582 }
16583 },
16584 .printlock = spi_prettyprint_status_register_bp2_srwd,
16585 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16586 .write = spi_chip_write_256,
16587 .read = spi_chip_read,
16588 .voltage = {2300, 3600},
16589 },
16590
16591 {
16592 .vendor = "Sanyo",
16593 .name = "LE25FU406C/LE25U40CMC",
16594 .bustype = BUS_SPI,
16595 .manufacture_id = SANYO_ID,
16596 .model_id = SANYO_LE25FU406C,
16597 .total_size = 512,
16598 .page_size = 256,
16599 .feature_bits = FEATURE_WRSR_WREN,
16600 .tested = TEST_OK_PREW,
16601 .probe = probe_spi_rdid,
16602 .probe_timing = TIMING_ZERO,
16603 .block_erasers =
16604 {
16605 {
16606 .eraseblocks = { {4 * 1024, 128} },
16607 .block_erase = spi_block_erase_20,
16608 }, {
16609 .eraseblocks = { {4 * 1024, 128} },
16610 .block_erase = spi_block_erase_d7,
16611 }, {
16612 .eraseblocks = { {64 * 1024, 8} },
16613 .block_erase = spi_block_erase_d8,
16614 }, {
16615 .eraseblocks = { {512 * 1024, 1} },
16616 .block_erase = spi_block_erase_60,
16617 }, {
16618 .eraseblocks = { {512 * 1024, 1} },
16619 .block_erase = spi_block_erase_c7,
16620 }
16621 },
16622 .printlock = spi_prettyprint_status_register_bp2_srwd,
16623 .unlock = spi_disable_blockprotect_bp2_srwd,
16624 .write = spi_chip_write_256,
16625 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
16626 .voltage = {2300, 3600},
16627 },
16628
16629 {
16630 .vendor = "Sanyo",
16631 .name = "LE25FW106",
16632 .bustype = BUS_SPI,
16633 .manufacture_id = SANYO_ID,
16634 .model_id = SANYO_LE25FW106,
16635 .total_size = 128,
16636 .page_size = 256,
16637 .feature_bits = FEATURE_WRSR_WREN,
16638 .tested = TEST_OK_PREW,
16639 .probe = probe_spi_res2,
16640 .probe_timing = TIMING_ZERO,
16641 .block_erasers =
16642 {
16643 {
16644 .eraseblocks = { {2 * 1024, 64} },
16645 .block_erase = spi_block_erase_d7,
16646 }, {
16647 .eraseblocks = { {32 * 1024, 4} },
16648 .block_erase = spi_block_erase_d8,
16649 }, {
16650 .eraseblocks = { {128 * 1024, 1} },
16651 .block_erase = spi_block_erase_c7,
16652 }
16653 },
16654 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
16655 .unlock = spi_disable_blockprotect_bp1_srwd,
16656 .write = spi_chip_write_256,
16657 .read = spi_chip_read,
16658 .voltage = {2700, 3600},
16659 },
16660
16661 {
16662 .vendor = "Sanyo",
16663 .name = "LE25FW203A",
16664 .bustype = BUS_SPI,
16665 .manufacture_id = SANYO_ID,
16666 .model_id = SANYO_LE25FW203A,
16667 .total_size = 256,
16668 .page_size = 256,
16669 .tested = TEST_UNTESTED,
16670 .probe = probe_spi_rdid,
16671 .probe_timing = TIMING_ZERO,
16672 .block_erasers =
16673 {
16674 {
16675 .eraseblocks = { {256, 1024} },
16676 .block_erase = spi_block_erase_db,
16677 }, {
16678 .eraseblocks = { {64 * 1024, 4} },
16679 .block_erase = spi_block_erase_d8,
16680 }, {
16681 .eraseblocks = { {256 * 1024, 1} },
16682 .block_erase = spi_block_erase_c7,
16683 }
16684 },
16685 .printlock = spi_prettyprint_status_register_default_welwip,
16686 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16687 .write = spi_chip_write_256,
16688 .read = spi_chip_read,
16689 .voltage = {2700, 3600},
16690 },
16691
16692 {
16693 .vendor = "Sanyo",
16694 .name = "LE25FW403A",
16695 .bustype = BUS_SPI,
16696 .manufacture_id = SANYO_ID,
16697 .model_id = SANYO_LE25FW403A,
16698 .total_size = 512,
16699 .page_size = 256,
16700 .tested = TEST_UNTESTED,
16701 .probe = probe_spi_rdid,
16702 .probe_timing = TIMING_ZERO,
16703 .block_erasers =
16704 {
16705 {
16706 .eraseblocks = { {256, 2 * 1024} },
16707 .block_erase = spi_block_erase_db,
16708 }, {
16709 .eraseblocks = { {64 * 1024, 8} },
16710 .block_erase = spi_block_erase_d8,
16711 }, {
16712 .eraseblocks = { {512 * 1024, 1} },
16713 .block_erase = spi_block_erase_c7,
16714 }
16715 },
16716 .printlock = spi_prettyprint_status_register_default_welwip,
16717 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16718 .write = spi_chip_write_256,
16719 .read = spi_chip_read,
16720 .voltage = {2700, 3600},
16721 },
16722
16723 {
16724 .vendor = "Sanyo",
16725 .name = "LE25FW406A",
16726 .bustype = BUS_SPI,
16727 .manufacture_id = SANYO_ID,
16728 .model_id = SANYO_LE25FW406A,
16729 .total_size = 512,
16730 .page_size = 256,
16731 .feature_bits = FEATURE_WRSR_WREN,
16732 .tested = TEST_OK_PREW,
16733 .probe = probe_spi_res2,
16734 .probe_timing = TIMING_ZERO,
16735 .block_erasers =
16736 {
16737 {
16738 .eraseblocks = { {4 * 1024, 128} },
16739 .block_erase = spi_block_erase_d7,
16740 }, {
16741 .eraseblocks = { {64 * 1024, 8} },
16742 .block_erase = spi_block_erase_d8,
16743 }, {
16744 .eraseblocks = { {512 * 1024, 1} },
16745 .block_erase = spi_block_erase_c7,
16746 }
16747 },
16748 .printlock = spi_prettyprint_status_register_plain,
16749 .unlock = spi_disable_blockprotect,
16750 .write = spi_chip_write_256,
16751 .read = spi_chip_read,
16752 .voltage = {2700, 3600},
16753 },
16754
16755 {
16756 .vendor = "Sanyo",
16757 .name = "LE25FW418A",
16758 .bustype = BUS_SPI,
16759 .manufacture_id = SANYO_ID,
16760 .model_id = SANYO_LE25FW418A,
16761 .total_size = 512,
16762 .page_size = 256,
16763 .feature_bits = FEATURE_WRSR_WREN,
16764 .tested = TEST_UNTESTED,
16765 .probe = probe_spi_res2,
16766 .probe_timing = TIMING_ZERO,
16767 .block_erasers =
16768 {
16769 {
16770 .eraseblocks = { {4 * 1024, 128} },
16771 .block_erase = spi_block_erase_d7,
16772 }, {
16773 .eraseblocks = { {64 * 1024, 8} },
16774 .block_erase = spi_block_erase_d8,
16775 }, {
16776 .eraseblocks = { {512 * 1024, 1} },
16777 .block_erase = spi_block_erase_c7,
16778 }
16779 },
16780 .printlock = spi_prettyprint_status_register_bp2_srwd,
16781 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16782 .write = spi_chip_write_256,
16783 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16784 .voltage = {2700, 3600},
16785 },
16786
16787 {
16788 .vendor = "Sanyo",
16789 .name = "LE25FW806",
16790 .bustype = BUS_SPI,
16791 .manufacture_id = SANYO_ID,
16792 .model_id = SANYO_LE25FW806,
16793 .total_size = 1024,
16794 .page_size = 256,
16795 .feature_bits = FEATURE_WRSR_WREN,
16796 .tested = TEST_UNTESTED,
16797 .probe = probe_spi_res2,
16798 .probe_timing = TIMING_ZERO,
16799 .block_erasers =
16800 {
16801 {
16802 .eraseblocks = { {4 * 1024, 256} },
16803 .block_erase = spi_block_erase_20,
16804 }, {
16805 .eraseblocks = { {4 * 1024, 256} },
16806 .block_erase = spi_block_erase_d7,
16807 }, {
16808 .eraseblocks = { {64 * 1024, 16} },
16809 .block_erase = spi_block_erase_d8,
16810 }, {
16811 .eraseblocks = { {1024 * 1024, 1} },
16812 .block_erase = spi_block_erase_c7,
16813 }
16814 },
16815 .printlock = spi_prettyprint_status_register_bp2_srwd,
16816 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16817 .write = spi_chip_write_256,
16818 .read = spi_chip_read,
16819 .voltage = {2700, 3600},
16820 },
16821
16822 {
16823 .vendor = "Sanyo",
16824 .name = "LE25FW808",
16825 .bustype = BUS_SPI,
16826 .manufacture_id = SANYO_ID,
16827 .model_id = SANYO_LE25FW808,
16828 .total_size = 1024,
16829 .page_size = 256,
16830 .feature_bits = FEATURE_WRSR_WREN,
16831 .tested = TEST_UNTESTED,
16832 .probe = probe_spi_res2,
16833 .probe_timing = TIMING_ZERO,
16834 .block_erasers =
16835 {
16836 {
16837 .eraseblocks = { {8 * 1024, 128} },
16838 .block_erase = spi_block_erase_d7,
16839 }, {
16840 .eraseblocks = { {64 * 1024, 16} },
16841 .block_erase = spi_block_erase_d8,
16842 }, {
16843 .eraseblocks = { {1024 * 1024, 1} },
16844 .block_erase = spi_block_erase_c7,
16845 }
16846 },
16847 .printlock = spi_prettyprint_status_register_bp2_srwd,
16848 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16849 .write = spi_chip_write_256,
16850 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16851 .voltage = {2700, 3600},
16852 },
16853
16854 {
16855 .vendor = "Sharp",
16856 .name = "LH28F008BJT-BTLZ1",
16857 .bustype = BUS_PARALLEL,
16858 .manufacture_id = SHARP_ID,
16859 .model_id = SHARP_LH28F008BJ__PB,
16860 .total_size = 1024,
16861 .page_size = 64 * 1024,
16862 .tested = TEST_OK_PREW,
16863 .probe = probe_82802ab,
16864 .probe_timing = TIMING_ZERO,
16865 .block_erasers =
16866 {
16867 {
16868 .eraseblocks = {
16869 {8 * 1024, 8},
16870 {64 * 1024, 15}
16871 },
16872 .block_erase = erase_block_82802ab,
16873 }, {
16874 .eraseblocks = { {1024 * 1024, 1} },
16875 .block_erase = erase_sector_49lfxxxc,
16876 }
16877 },
16878 .unlock = unlock_lh28f008bjt,
16879 .write = write_82802ab,
16880 .read = read_memmapped,
16881 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016882 .prepare_access = prepare_memory_access,
16883 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016884 },
16885
16886 {
16887 .vendor = "Sharp",
16888 .name = "LHF00L04",
16889 .bustype = BUS_FWH, /* A/A Mux */
16890 .manufacture_id = SHARP_ID,
16891 .model_id = SHARP_LHF00L04,
16892 .total_size = 1024,
16893 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010016894 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016895 .tested = TEST_UNTESTED,
16896 .probe = probe_82802ab,
16897 .probe_timing = TIMING_ZERO,
16898 .block_erasers =
16899 {
16900 {
16901 .eraseblocks = {
16902 {64 * 1024, 15},
16903 {8 * 1024, 8}
16904 },
16905 .block_erase = erase_block_82802ab,
16906 }, {
16907 .eraseblocks = {
16908 {1024 * 1024, 1}
16909 },
16910 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
16911 },
16912 },
16913 .unlock = unlock_regspace2_uniform_64k,
16914 .write = write_82802ab,
16915 .read = read_memmapped,
16916 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016917 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016918 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016919 },
16920
16921 {
16922 .vendor = "Spansion",
16923 .name = "S25FL004A",
16924 .bustype = BUS_SPI,
16925 .manufacture_id = SPANSION_ID,
16926 .model_id = SPANSION_S25FL004A,
16927 .total_size = 512,
16928 .page_size = 256,
16929 .feature_bits = FEATURE_WRSR_WREN,
16930 .tested = TEST_UNTESTED,
16931 .probe = probe_spi_rdid,
16932 .probe_timing = TIMING_ZERO,
16933 .block_erasers =
16934 {
16935 {
16936 .eraseblocks = { {64 * 1024, 8} },
16937 .block_erase = spi_block_erase_d8,
16938 }, {
16939 .eraseblocks = { {512 * 1024, 1} },
16940 .block_erase = spi_block_erase_c7,
16941 }
16942 },
16943 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16944 .unlock = spi_disable_blockprotect,
16945 .write = spi_chip_write_256,
16946 .read = spi_chip_read,
16947 .voltage = {2700, 3600},
16948 },
16949
16950 {
16951 .vendor = "Spansion",
16952 .name = "S25FL008A",
16953 .bustype = BUS_SPI,
16954 .manufacture_id = SPANSION_ID,
16955 .model_id = SPANSION_S25FL008A,
16956 .total_size = 1024,
16957 .page_size = 256,
16958 .feature_bits = FEATURE_WRSR_WREN,
16959 .tested = TEST_OK_PRE,
16960 .probe = probe_spi_rdid,
16961 .probe_timing = TIMING_ZERO,
16962 .block_erasers =
16963 {
16964 {
16965 .eraseblocks = { {64 * 1024, 16} },
16966 .block_erase = spi_block_erase_d8,
16967 }, {
16968 .eraseblocks = { {1024 * 1024, 1} },
16969 .block_erase = spi_block_erase_c7,
16970 }
16971 },
16972 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16973 .unlock = spi_disable_blockprotect,
16974 .write = spi_chip_write_256,
16975 .read = spi_chip_read,
16976 .voltage = {2700, 3600},
16977 },
16978
16979 {
16980 .vendor = "Spansion",
16981 .name = "S25FL016A",
16982 .bustype = BUS_SPI,
16983 .manufacture_id = SPANSION_ID,
16984 .model_id = SPANSION_S25FL016A,
16985 .total_size = 2048,
16986 .page_size = 256,
16987 .feature_bits = FEATURE_WRSR_WREN,
16988 .tested = TEST_OK_PREW,
16989 .probe = probe_spi_rdid,
16990 .probe_timing = TIMING_ZERO,
16991 .block_erasers =
16992 {
16993 {
16994 .eraseblocks = { {64 * 1024, 32} },
16995 .block_erase = spi_block_erase_d8,
16996 }, {
16997 .eraseblocks = { {2 * 1024 * 1024, 1} },
16998 .block_erase = spi_block_erase_c7,
16999 }
17000 },
17001 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17002 .unlock = spi_disable_blockprotect,
17003 .write = spi_chip_write_256,
17004 .read = spi_chip_read,
17005 .voltage = {2700, 3600},
17006 },
17007
17008 {
17009 .vendor = "Spansion",
17010 .name = "S25FL032A/P",
17011 .bustype = BUS_SPI,
17012 .manufacture_id = SPANSION_ID,
17013 .model_id = SPANSION_S25FL032A,
17014 .total_size = 4096,
17015 .page_size = 256,
17016 .feature_bits = FEATURE_WRSR_WREN,
17017 .tested = TEST_OK_PREW,
17018 .probe = probe_spi_rdid,
17019 .probe_timing = TIMING_ZERO,
17020 .block_erasers =
17021 {
17022 {
17023 .eraseblocks = { {64 * 1024, 64} },
17024 .block_erase = spi_block_erase_d8,
17025 }, {
17026 .eraseblocks = { {4 * 1024 * 1024, 1} },
17027 .block_erase = spi_block_erase_c7,
17028 }
17029 },
17030 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17031 .unlock = spi_disable_blockprotect,
17032 .write = spi_chip_write_256,
17033 .read = spi_chip_read,
17034 .voltage = {2700, 3600},
17035 },
17036
17037 {
17038 .vendor = "Spansion",
17039 .name = "S25FL064A/P",
17040 .bustype = BUS_SPI,
17041 .manufacture_id = SPANSION_ID,
17042 .model_id = SPANSION_S25FL064A,
17043 .total_size = 8192,
17044 .page_size = 256,
17045 .feature_bits = FEATURE_WRSR_WREN,
17046 .tested = TEST_OK_PREW,
17047 .probe = probe_spi_rdid,
17048 .probe_timing = TIMING_ZERO,
17049 .block_erasers =
17050 {
17051 {
17052 .eraseblocks = { {64 * 1024, 128} },
17053 .block_erase = spi_block_erase_d8,
17054 }, {
17055 .eraseblocks = { {8 * 1024 * 1024, 1} },
17056 .block_erase = spi_block_erase_c7,
17057 }
17058 },
17059 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17060 .unlock = spi_disable_blockprotect,
17061 .write = spi_chip_write_256,
17062 .read = spi_chip_read,
17063 .voltage = {2700, 3600},
17064 },
17065
17066 {
17067 .vendor = "Spansion",
17068 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
17069 .bustype = BUS_SPI,
17070 .manufacture_id = SPANSION_ID,
17071 .model_id = SPANSION_S25FL216,
17072 .total_size = 2048,
17073 .page_size = 256,
17074 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
17075 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17076 .tested = TEST_UNTESTED,
17077 .probe = probe_spi_rdid,
17078 .probe_timing = TIMING_ZERO,
17079 .block_erasers =
17080 {
17081 {
17082 .eraseblocks = { {4 * 1024, 512} },
17083 .block_erase = spi_block_erase_20,
17084 }, {
17085 .eraseblocks = { {64 * 1024, 32} },
17086 .block_erase = spi_block_erase_d8,
17087 }, {
17088 .eraseblocks = { { 2048 * 1024, 1} },
17089 .block_erase = spi_block_erase_60,
17090 }, {
17091 .eraseblocks = { { 2048 * 1024, 1} },
17092 .block_erase = spi_block_erase_c7,
17093 }
17094 },
17095 .printlock = spi_prettyprint_status_register_bp3_srwd,
17096 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17097 .write = spi_chip_write_256,
17098 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17099 .voltage = {2700, 3600},
17100 },
17101
17102 {
17103 .vendor = "Spansion",
17104 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
17105 .bustype = BUS_SPI,
17106 .manufacture_id = SPANSION_ID,
17107 .model_id = SPANSION_S25FL128,
17108 .total_size = 16384,
17109 .page_size = 512,
17110 /* supports 4B addressing */
17111 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17112 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17113 .tested = TEST_UNTESTED,
17114 .probe = probe_spi_rdid,
17115 .probe_timing = TIMING_ZERO,
17116 .block_erasers =
17117 {
17118 {
17119 .eraseblocks = { {256 * 1024, 64} },
17120 .block_erase = spi_block_erase_d8,
17121 }, {
17122 .eraseblocks = { { 16384 * 1024, 1} },
17123 .block_erase = spi_block_erase_60,
17124 }, {
17125 .eraseblocks = { { 16384 * 1024, 1} },
17126 .block_erase = spi_block_erase_c7,
17127 }
17128 },
17129 .printlock = spi_prettyprint_status_register_bp2_srwd,
17130 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17131 .write = spi_chip_write_256, /* Multi I/O supported */
17132 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17133 .voltage = {2700, 3600},
17134 },
17135
17136 {
17137 .vendor = "Spansion",
17138 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17139 .bustype = BUS_SPI,
17140 .manufacture_id = SPANSION_ID,
17141 .model_id = SPANSION_S25FL128,
17142 .total_size = 16384,
17143 .page_size = 256,
17144 /* supports 4B addressing */
17145 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17146 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17147 .tested = TEST_OK_PREW,
17148 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
17149 .probe = probe_spi_rdid,
17150 .probe_timing = TIMING_ZERO,
17151 .block_erasers =
17152 {
17153 {
17154 /* This chip supports erasing of 32 so-called "parameter sectors" with
17155 * opcode 0x20 which may be configured to be on top or bottom of the address
17156 * space. Trying to access an address outside these 4kB blocks does have no
17157 * effect on the memory contents, e.g.
17158 .eraseblocks = {
17159 {4 * 1024, 32},
17160 {64 * 1024, 254} // inaccessible
17161 },
17162 .block_erase = spi_block_erase_20,
17163 }, { */
17164 .eraseblocks = { { 64 * 1024, 256} },
17165 .block_erase = spi_block_erase_d8,
17166 }, {
17167 .eraseblocks = { { 16384 * 1024, 1} },
17168 .block_erase = spi_block_erase_60,
17169 }, {
17170 .eraseblocks = { { 16384 * 1024, 1} },
17171 .block_erase = spi_block_erase_c7,
17172 }
17173 },
17174 .printlock = spi_prettyprint_status_register_bp2_srwd,
17175 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17176 .write = spi_chip_write_256, /* Multi I/O supported */
17177 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17178 .voltage = {2700, 3600},
17179 },
17180
17181 {
17182 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017183 .name = "S25FL128L",
17184 .bustype = BUS_SPI,
17185 .manufacture_id = SPANSION_ID,
17186 .model_id = SPANSION_S25FL128L,
17187 .total_size = 16384,
17188 .page_size = 256,
17189 /* 4 x 256B Security Region (OTP) */
17190 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP,
17191 .tested = TEST_UNTESTED,
17192 .probe = probe_spi_rdid,
17193 .probe_timing = TIMING_ZERO,
17194 .block_erasers =
17195 {
17196 {
17197 .eraseblocks = { {4 * 1024, 4096} },
17198 .block_erase = spi_block_erase_20,
17199 }, {
17200 .eraseblocks = { {32 * 1024, 512} },
17201 .block_erase = spi_block_erase_52,
17202 }, {
17203 .eraseblocks = { {64 * 1024, 256} },
17204 .block_erase = spi_block_erase_d8,
17205 }, {
17206 .eraseblocks = { {16384 * 1024, 1} },
17207 .block_erase = spi_block_erase_60,
17208 }, {
17209 .eraseblocks = { {16384 * 1024, 1} },
17210 .block_erase = spi_block_erase_c7,
17211 }
17212 },
17213 .printlock = spi_prettyprint_status_register_bp2_srwd,
17214 .unlock = spi_disable_blockprotect_bp2_srwd,
17215 .write = spi_chip_write_256,
17216 .read = spi_chip_read, /* Fast read (0x0B) supported */
17217 .voltage = {2700, 3600},
17218 .reg_bits =
17219 {
17220 /*
17221 * Note: This chip has a read-only Status Register 2 that is not
17222 * counted here. Registers are mapped as follows:
17223 * STATUS1 ... Status Register 1
17224 * STATUS2 ... Configuration Register 1
17225 * STATUS3 ... Configuration Register 2
17226 */
17227 .srp = {STATUS1, 7, RW},
17228 .srl = {STATUS2, 0, RW},
17229 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17230 .tb = {STATUS1, 5, RW},
17231 .sec = {STATUS1, 6, RW},
17232 .cmp = {STATUS2, 6, RW},
17233 .wps = {STATUS3, 2, RW},
17234 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017235 .wp_write_cfg = spi_wp_write_cfg,
17236 .wp_read_cfg = spi_wp_read_cfg,
17237 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017238 .decode_range = decode_range_spi25,
17239 },
17240
17241 {
17242 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017243 .name = "S25FL128P......0", /* uniform 64 kB sectors */
17244 .bustype = BUS_SPI,
17245 .manufacture_id = SPANSION_ID,
17246 .model_id = SPANSION_S25FL128,
17247 .total_size = 16384,
17248 .page_size = 256,
17249 .feature_bits = FEATURE_WRSR_WREN,
17250 .tested = TEST_OK_PREW,
17251 .probe = probe_spi_rdid,
17252 .probe_timing = TIMING_ZERO,
17253 .block_erasers =
17254 {
17255 {
17256 .eraseblocks = { {64 * 1024, 256} },
17257 .block_erase = spi_block_erase_20,
17258 }, {
17259 .eraseblocks = { {64 * 1024, 256} },
17260 .block_erase = spi_block_erase_d8,
17261 }, {
17262 .eraseblocks = { { 16384 * 1024, 1} },
17263 .block_erase = spi_block_erase_60,
17264 }, {
17265 .eraseblocks = { { 16384 * 1024, 1} },
17266 .block_erase = spi_block_erase_c7,
17267 }
17268 },
17269 .printlock = spi_prettyprint_status_register_bp3_srwd,
17270 .unlock = spi_disable_blockprotect_bp3_srwd,
17271 .write = spi_chip_write_256,
17272 .read = spi_chip_read, /* Fast read (0x0B) supported */
17273 .voltage = {2700, 3600},
17274 },
17275
17276 {
17277 .vendor = "Spansion",
17278 .name = "S25FL128P......1", /* uniform 256kB sectors */
17279 .bustype = BUS_SPI,
17280 .manufacture_id = SPANSION_ID,
17281 .model_id = SPANSION_S25FL128,
17282 .total_size = 16384,
17283 .page_size = 256,
17284 .feature_bits = FEATURE_WRSR_WREN,
17285 .tested = TEST_UNTESTED,
17286 .probe = probe_spi_rdid,
17287 .probe_timing = TIMING_ZERO,
17288 .block_erasers =
17289 {
17290 {
17291 .eraseblocks = { {256 * 1024, 64} },
17292 .block_erase = spi_block_erase_d8,
17293 }, {
17294 .eraseblocks = { { 16384 * 1024, 1} },
17295 .block_erase = spi_block_erase_c7,
17296 }
17297 },
17298 .printlock = spi_prettyprint_status_register_bp2_srwd,
17299 .unlock = spi_disable_blockprotect_bp2_srwd,
17300 .write = spi_chip_write_256,
17301 .read = spi_chip_read, /* Fast read (0x0B) supported */
17302 .voltage = {2700, 3600},
17303 },
17304
17305 {
17306 .vendor = "Spansion",
17307 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17308 .bustype = BUS_SPI,
17309 .manufacture_id = SPANSION_ID,
17310 .model_id = SPANSION_S25FL128,
17311 .total_size = 16384,
17312 .page_size = 256,
17313 /* supports 4B addressing */
17314 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17315 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17316 .tested = TEST_OK_PREW,
17317 .probe = probe_spi_rdid,
17318 .probe_timing = TIMING_ZERO,
17319 .block_erasers =
17320 {
17321 {
17322 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17323 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17324 * have no effect on the memory contents, but sets a flag in the SR.
17325 .eraseblocks = {
17326 {4 * 1024, 32},
17327 {64 * 1024, 254} // inaccessible
17328 },
17329 .block_erase = spi_block_erase_20,
17330 }, { */
17331 .eraseblocks = { { 64 * 1024, 256} },
17332 .block_erase = spi_block_erase_d8,
17333 }, {
17334 .eraseblocks = { { 16384 * 1024, 1} },
17335 .block_erase = spi_block_erase_60,
17336 }, {
17337 .eraseblocks = { { 16384 * 1024, 1} },
17338 .block_erase = spi_block_erase_c7,
17339 }
17340 },
17341 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17342 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17343 .write = spi_chip_write_256, /* Multi I/O supported */
17344 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17345 .voltage = {2700, 3600},
17346 },
17347
17348 {
17349 .vendor = "Spansion",
17350 .name = "S25FL128S......1", /* uniform 256 kB sectors */
17351 .bustype = BUS_SPI,
17352 .manufacture_id = SPANSION_ID,
17353 .model_id = SPANSION_S25FL128,
17354 .total_size = 16384,
17355 .page_size = 512,
17356 /* supports 4B addressing */
17357 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17359 .tested = TEST_UNTESTED,
17360 .probe = probe_spi_rdid,
17361 .probe_timing = TIMING_ZERO,
17362 .block_erasers =
17363 {
17364 {
17365 .eraseblocks = { {256 * 1024, 64} },
17366 .block_erase = spi_block_erase_d8,
17367 }, {
17368 .eraseblocks = { { 16384 * 1024, 1} },
17369 .block_erase = spi_block_erase_60,
17370 }, {
17371 .eraseblocks = { { 16384 * 1024, 1} },
17372 .block_erase = spi_block_erase_c7,
17373 }
17374 },
17375 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17376 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17377 .write = spi_chip_write_256, /* Multi I/O supported */
17378 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17379 .voltage = {2700, 3600},
17380 },
17381
17382 {
17383 .vendor = "Spansion",
17384 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17385 .bustype = BUS_SPI,
17386 .manufacture_id = SPANSION_ID,
17387 .model_id = SPANSION_S25FL128,
17388 .total_size = 16384,
17389 .page_size = 256,
17390 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17391 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17392 .tested = TEST_OK_PREW,
17393 .probe = probe_spi_rdid,
17394 .probe_timing = TIMING_ZERO,
17395 .block_erasers =
17396 {
17397 {
17398 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
17399 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
17400 * effect on the memory contents, but sets a flag in the SR.
17401 .eraseblocks = {
17402 {4 * 1024, 32},
17403 {64 * 1024, 254} // inaccessible
17404 },
17405 .block_erase = spi_block_erase_20,
17406 }, { */
17407 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
17408 .eraseblocks = {
17409 {8 * 1024, 16},
17410 {64 * 1024, 254} // inaccessible
17411 },
17412 .block_erase = spi_block_erase_40,
17413 }, { */
17414 .eraseblocks = { { 64 * 1024, 256} },
17415 .block_erase = spi_block_erase_d8,
17416 }, {
17417 .eraseblocks = { { 16384 * 1024, 1} },
17418 .block_erase = spi_block_erase_60,
17419 }, {
17420 .eraseblocks = { { 16384 * 1024, 1} },
17421 .block_erase = spi_block_erase_c7,
17422 }
17423 },
17424 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17425 .unlock = spi_disable_blockprotect_bp2_srwd,
17426 .write = spi_chip_write_256, /* Multi I/O supported */
17427 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17428 .voltage = {2700, 3600},
17429 },
17430
17431 {
17432 .vendor = "Spansion",
17433 .name = "S25FL129P......1", /* uniform 256 kB sectors */
17434 .bustype = BUS_SPI,
17435 .manufacture_id = SPANSION_ID,
17436 .model_id = SPANSION_S25FL128,
17437 .total_size = 16384,
17438 .page_size = 256,
17439 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17440 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17441 .tested = TEST_UNTESTED,
17442 .probe = probe_spi_rdid,
17443 .probe_timing = TIMING_ZERO,
17444 .block_erasers =
17445 {
17446 {
17447 .eraseblocks = { {256 * 1024, 64} },
17448 .block_erase = spi_block_erase_d8,
17449 }, {
17450 .eraseblocks = { { 16384 * 1024, 1} },
17451 .block_erase = spi_block_erase_60,
17452 }, {
17453 .eraseblocks = { { 16384 * 1024, 1} },
17454 .block_erase = spi_block_erase_c7,
17455 }
17456 },
17457 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17458 .unlock = spi_disable_blockprotect_bp2_srwd,
17459 .write = spi_chip_write_256, /* Multi I/O supported */
17460 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17461 .voltage = {2700, 3600},
17462 },
17463
17464 {
17465 .vendor = "Spansion",
17466 .name = "S25FL132K",
17467 .bustype = BUS_SPI,
17468 .manufacture_id = SPANSION_ID,
17469 .model_id = SPANSION_S25FL132K,
17470 .total_size = 4096,
17471 .page_size = 256,
17472 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17473 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17474 .tested = TEST_UNTESTED,
17475 .probe = probe_spi_rdid,
17476 .probe_timing = TIMING_ZERO,
17477 .block_erasers =
17478 {
17479 {
17480 .eraseblocks = { {4 * 1024, 1024} },
17481 .block_erase = spi_block_erase_20,
17482 }, {
17483 .eraseblocks = { {64 * 1024, 64} },
17484 .block_erase = spi_block_erase_d8,
17485 }, {
17486 .eraseblocks = { { 4096 * 1024, 1} },
17487 .block_erase = spi_block_erase_60,
17488 }, {
17489 .eraseblocks = { { 4096 * 1024, 1} },
17490 .block_erase = spi_block_erase_c7,
17491 }
17492 },
17493 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17494 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17495 .write = spi_chip_write_256,
17496 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17497 .voltage = {2700, 3600},
17498 },
17499
17500 {
17501 .vendor = "Spansion",
17502 .name = "S25FL164K",
17503 .bustype = BUS_SPI,
17504 .manufacture_id = SPANSION_ID,
17505 .model_id = SPANSION_S25FL164K,
17506 .total_size = 8192,
17507 .page_size = 256,
17508 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17509 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17510 .tested = TEST_OK_PREW,
17511 .probe = probe_spi_rdid,
17512 .probe_timing = TIMING_ZERO,
17513 .block_erasers =
17514 {
17515 {
17516 .eraseblocks = { {4 * 1024, 2048} },
17517 .block_erase = spi_block_erase_20,
17518 }, {
17519 .eraseblocks = { {64 * 1024, 128} },
17520 .block_erase = spi_block_erase_d8,
17521 }, {
17522 .eraseblocks = { { 8192 * 1024, 1} },
17523 .block_erase = spi_block_erase_60,
17524 }, {
17525 .eraseblocks = { { 8192 * 1024, 1} },
17526 .block_erase = spi_block_erase_c7,
17527 }
17528 },
17529 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17530 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17531 .write = spi_chip_write_256,
17532 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17533 .voltage = {2700, 3600},
17534 },
17535
17536 {
17537 .vendor = "Spansion",
17538 .name = "S25FL204K",
17539 .bustype = BUS_SPI,
17540 .manufacture_id = SPANSION_ID,
17541 .model_id = SPANSION_S25FL204,
17542 .total_size = 512,
17543 .page_size = 256,
17544 .feature_bits = FEATURE_WRSR_WREN,
17545 .tested = TEST_OK_PR,
17546 .probe = probe_spi_rdid,
17547 .probe_timing = TIMING_ZERO,
17548 .block_erasers =
17549 {
17550 {
17551 .eraseblocks = { {4 * 1024, 128} },
17552 .block_erase = spi_block_erase_20,
17553 }, {
17554 .eraseblocks = { {64 * 1024, 8} },
17555 .block_erase = spi_block_erase_d8,
17556 }, {
17557 .eraseblocks = { { 512 * 1024, 1} },
17558 .block_erase = spi_block_erase_60,
17559 }, {
17560 .eraseblocks = { { 512 * 1024, 1} },
17561 .block_erase = spi_block_erase_c7,
17562 }
17563 },
17564 .printlock = spi_prettyprint_status_register_bp3_srwd,
17565 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17566 .write = spi_chip_write_256,
17567 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17568 .voltage = {2700, 3600},
17569 },
17570
17571 {
17572 .vendor = "Spansion",
17573 .name = "S25FL208K",
17574 .bustype = BUS_SPI,
17575 .manufacture_id = SPANSION_ID,
17576 .model_id = SPANSION_S25FL208,
17577 .total_size = 1024,
17578 .page_size = 256,
17579 .feature_bits = FEATURE_WRSR_WREN,
17580 .tested = TEST_OK_PREW,
17581 .probe = probe_spi_rdid,
17582 .probe_timing = TIMING_ZERO,
17583 .block_erasers =
17584 {
17585 {
17586 .eraseblocks = { {4 * 1024, 256} },
17587 .block_erase = spi_block_erase_20,
17588 }, {
17589 .eraseblocks = { {64 * 1024, 16} },
17590 .block_erase = spi_block_erase_d8,
17591 }, {
17592 .eraseblocks = { { 1024 * 1024, 1} },
17593 .block_erase = spi_block_erase_60,
17594 }, {
17595 .eraseblocks = { { 1024 * 1024, 1} },
17596 .block_erase = spi_block_erase_c7,
17597 }
17598 },
17599 .printlock = spi_prettyprint_status_register_bp3_srwd,
17600 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17601 .write = spi_chip_write_256,
17602 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17603 .voltage = {2700, 3600},
17604 },
17605
17606 {
17607 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017608 .name = "S25FL256L",
17609 .bustype = BUS_SPI,
17610 .manufacture_id = SPANSION_ID,
17611 .model_id = SPANSION_S25FL256L,
17612 .total_size = 32768,
17613 .page_size = 256,
17614 /* 4 x 256B Security Region (OTP) */
17615 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP |
17616 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE,
17617 .tested = TEST_UNTESTED,
17618 .probe = probe_spi_rdid,
17619 .probe_timing = TIMING_ZERO,
17620 .block_erasers =
17621 {
17622 {
17623 .eraseblocks = { {4 * 1024, 8192} },
17624 .block_erase = spi_block_erase_21,
17625 }, {
17626 .eraseblocks = { {4 * 1024, 8192} },
17627 .block_erase = spi_block_erase_20,
17628 }, {
17629 .eraseblocks = { {32 * 1024, 1024} },
17630 .block_erase = spi_block_erase_53,
17631 }, {
17632 .eraseblocks = { {32 * 1024, 1024} },
17633 .block_erase = spi_block_erase_52,
17634 }, {
17635 .eraseblocks = { {64 * 1024, 512} },
17636 .block_erase = spi_block_erase_dc,
17637 }, {
17638 .eraseblocks = { {64 * 1024, 512} },
17639 .block_erase = spi_block_erase_d8,
17640 }, {
17641 .eraseblocks = { {32768 * 1024, 1} },
17642 .block_erase = spi_block_erase_60,
17643 }, {
17644 .eraseblocks = { {32768 * 1024, 1} },
17645 .block_erase = spi_block_erase_c7,
17646 }
17647 },
17648 .printlock = spi_prettyprint_status_register_bp3_srwd,
17649 .unlock = spi_disable_blockprotect_bp3_srwd,
17650 .write = spi_chip_write_256,
17651 .read = spi_chip_read, /* Fast read (0x0B) supported */
17652 .voltage = {2700, 3600},
17653 .reg_bits =
17654 {
17655 /*
17656 * Note: This chip has a read-only Status Register 2 that is not
17657 * counted here. Registers are mapped as follows:
17658 * STATUS1 ... Status Register 1
17659 * STATUS2 ... Configuration Register 1
17660 * STATUS3 ... Configuration Register 2
17661 */
17662 .srp = {STATUS1, 7, RW},
17663 .srl = {STATUS2, 0, RW},
17664 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17665 .tb = {STATUS1, 6, RW},
17666 .cmp = {STATUS2, 6, RW},
17667 .wps = {STATUS3, 2, RW},
17668 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017669 .wp_write_cfg = spi_wp_write_cfg,
17670 .wp_read_cfg = spi_wp_read_cfg,
17671 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017672 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020017673 .prepare_access = spi_prepare_io,
17674 .finish_access = spi_finish_io,
Nico Huberfffc48d2022-05-28 14:26:06 +020017675 },
17676
17677 {
17678 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017679 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17680 .bustype = BUS_SPI,
17681 .manufacture_id = SPANSION_ID,
17682 .model_id = SPANSION_S25FL256,
17683 .total_size = 32768,
17684 .page_size = 256,
17685 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber9bb8a322022-05-24 15:07:34 +020017686 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17687 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017688 .tested = TEST_OK_PREW,
17689 .probe = probe_spi_rdid,
17690 .probe_timing = TIMING_ZERO,
17691 .block_erasers =
17692 {
17693 {
17694 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17695 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17696 * have no effect on the memory contents, but sets a flag in the SR.
17697 .eraseblocks = {
17698 {4 * 1024, 32},
17699 {64 * 1024, 254} // inaccessible
17700 },
17701 .block_erase = spi_block_erase_20,
17702 }, { */
17703 .eraseblocks = { { 64 * 1024, 512} },
17704 .block_erase = spi_block_erase_dc,
17705 }, {
17706 .eraseblocks = { { 64 * 1024, 512} },
17707 .block_erase = spi_block_erase_d8,
17708 }, {
17709 .eraseblocks = { { 32768 * 1024, 1} },
17710 .block_erase = spi_block_erase_60,
17711 }, {
17712 .eraseblocks = { { 32768 * 1024, 1} },
17713 .block_erase = spi_block_erase_c7,
17714 }
17715 },
17716 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17717 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17718 .write = spi_chip_write_256, /* Multi I/O supported */
17719 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17720 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020017721 .prepare_access = spi_prepare_io,
17722 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017723 },
17724
17725 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017726 .vendor = "Spansion",
17727 .name = "S25FL512S",
17728 .bustype = BUS_SPI,
17729 .manufacture_id = SPANSION_ID,
17730 .model_id = SPANSION_S25FL512,
17731 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
17732 .page_size = 256,
17733 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber26237922022-06-20 19:37:37 +020017734 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17735 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
17736 .tested = TEST_UNTESTED,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017737 .probe = probe_spi_rdid,
17738 .probe_timing = TIMING_ZERO,
17739 .block_erasers =
17740 {
17741 {
17742 .eraseblocks = { { 256 * 1024, 256} },
17743 .block_erase = spi_block_erase_dc,
17744 }, {
Nico Huberbb608ff2022-05-24 15:33:26 +020017745 .eraseblocks = { { 256 * 1024, 256} },
17746 .block_erase = spi_block_erase_d8,
17747 }, {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017748 .eraseblocks = { { 65536 * 1024, 1} },
17749 .block_erase = spi_block_erase_60,
17750 }, {
17751 .eraseblocks = { { 65536 * 1024, 1} },
17752 .block_erase = spi_block_erase_c7,
17753 }
17754 },
17755 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17756 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17757 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
17758 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17759 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020017760 .prepare_access = spi_prepare_io,
17761 .finish_access = spi_finish_io,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017762 },
17763
17764 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017765 .vendor = "SyncMOS/MoselVitelic",
17766 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017767 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017768 .manufacture_id = SYNCMOS_MVC_ID,
17769 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017770 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017771 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017772 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017773 .tested = TEST_UNTESTED,
17774 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017775 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017776 .block_erasers =
17777 {
17778 {
17779 .eraseblocks = { {512, 256} },
17780 .block_erase = erase_sector_jedec,
17781 }, {
17782 .eraseblocks = { {128 * 1024, 1} },
17783 .block_erase = erase_chip_block_jedec,
17784 },
17785 },
Sean Nelson35727f72010-01-28 23:55:12 +000017786 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017787 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017788 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017789 .prepare_access = prepare_memory_access,
17790 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017791 },
17792
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017793 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017794 .vendor = "SyncMOS/MoselVitelic",
17795 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017796 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017797 .manufacture_id = SYNCMOS_MVC_ID,
17798 .model_id = SM_MVC_29C51001T,
17799 .total_size = 128,
17800 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017801 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017802 .tested = TEST_UNTESTED,
17803 .probe = probe_jedec,
17804 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17805 .block_erasers =
17806 {
17807 {
17808 .eraseblocks = { {512, 256} },
17809 .block_erase = erase_sector_jedec,
17810 }, {
17811 .eraseblocks = { {128 * 1024, 1} },
17812 .block_erase = erase_chip_block_jedec,
17813 },
17814 },
17815 .write = write_jedec_1,
17816 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017817 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017818 .prepare_access = prepare_memory_access,
17819 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017820 },
17821
17822 {
17823 .vendor = "SyncMOS/MoselVitelic",
17824 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017825 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017826 .manufacture_id = SYNCMOS_MVC_ID,
17827 .model_id = SM_MVC_29C51002B,
17828 .total_size = 256,
17829 .page_size = 512,
17830 .feature_bits = FEATURE_EITHER_RESET,
17831 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017832 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017833 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017834 .block_erasers =
17835 {
17836 {
17837 .eraseblocks = { {512, 512} },
17838 .block_erase = erase_sector_jedec,
17839 }, {
17840 .eraseblocks = { {256 * 1024, 1} },
17841 .block_erase = erase_chip_block_jedec,
17842 },
17843 },
Sean Nelson35727f72010-01-28 23:55:12 +000017844 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017845 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017846 .prepare_access = prepare_memory_access,
17847 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017848 },
17849
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017850 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017851 .vendor = "SyncMOS/MoselVitelic",
17852 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017853 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017854 .manufacture_id = SYNCMOS_MVC_ID,
17855 .model_id = SM_MVC_29C51002T,
17856 .total_size = 256,
17857 .page_size = 512,
17858 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017859 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017860 .probe = probe_jedec,
17861 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17862 .block_erasers =
17863 {
17864 {
17865 .eraseblocks = { {512, 512} },
17866 .block_erase = erase_sector_jedec,
17867 }, {
17868 .eraseblocks = { {256 * 1024, 1} },
17869 .block_erase = erase_chip_block_jedec,
17870 },
17871 },
17872 .write = write_jedec_1,
17873 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017874 .prepare_access = prepare_memory_access,
17875 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017876 },
17877
17878 {
17879 .vendor = "SyncMOS/MoselVitelic",
17880 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017881 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017882 .manufacture_id = SYNCMOS_MVC_ID,
17883 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017884 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017885 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017886 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017887 .tested = TEST_UNTESTED,
17888 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017889 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000017890 .block_erasers =
17891 {
17892 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017893 .eraseblocks = { {1024, 512} },
17894 .block_erase = erase_sector_jedec,
17895 }, {
17896 .eraseblocks = { {512 * 1024, 1} },
17897 .block_erase = erase_chip_block_jedec,
17898 },
17899 },
17900 .write = write_jedec_1,
17901 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017902 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017903 .prepare_access = prepare_memory_access,
17904 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017905 },
17906
17907 {
17908 .vendor = "SyncMOS/MoselVitelic",
17909 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017910 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017911 .manufacture_id = SYNCMOS_MVC_ID,
17912 .model_id = SM_MVC_29C51004T,
17913 .total_size = 512,
17914 .page_size = 1024,
17915 .feature_bits = FEATURE_EITHER_RESET,
17916 .tested = TEST_UNTESTED,
17917 .probe = probe_jedec,
17918 .probe_timing = TIMING_ZERO,
17919 .block_erasers =
17920 {
17921 {
17922 .eraseblocks = { {1024, 512} },
17923 .block_erase = erase_sector_jedec,
17924 }, {
17925 .eraseblocks = { {512 * 1024, 1} },
17926 .block_erase = erase_chip_block_jedec,
17927 },
17928 },
17929 .write = write_jedec_1,
17930 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017931 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017932 .prepare_access = prepare_memory_access,
17933 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017934 },
17935
17936 {
17937 .vendor = "SyncMOS/MoselVitelic",
17938 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017939 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017940 .manufacture_id = SYNCMOS_MVC_ID,
17941 .model_id = SM_MVC_29C31004B,
17942 .total_size = 512,
17943 .page_size = 1024,
17944 .feature_bits = FEATURE_EITHER_RESET,
17945 .tested = TEST_UNTESTED,
17946 .probe = probe_jedec,
17947 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17948 .block_erasers =
17949 {
17950 {
17951 .eraseblocks = { {1024, 512} },
17952 .block_erase = erase_sector_jedec,
17953 }, {
17954 .eraseblocks = { {512 * 1024, 1} },
17955 .block_erase = erase_chip_block_jedec,
17956 },
17957 },
17958 .write = write_jedec_1,
17959 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017960 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017961 .prepare_access = prepare_memory_access,
17962 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017963 },
17964
17965 {
17966 .vendor = "SyncMOS/MoselVitelic",
17967 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017968 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017969 .manufacture_id = SYNCMOS_MVC_ID,
17970 .model_id = SM_MVC_29C31004T,
17971 .total_size = 512,
17972 .page_size = 1024,
17973 .feature_bits = FEATURE_EITHER_RESET,
17974 .tested = TEST_UNTESTED,
17975 .probe = probe_jedec,
17976 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17977 .block_erasers =
17978 {
17979 {
17980 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000017981 .block_erase = erase_sector_jedec,
17982 }, {
17983 .eraseblocks = { {512 * 1024, 1} },
17984 .block_erase = erase_chip_block_jedec,
17985 },
17986 },
Sean Nelson35727f72010-01-28 23:55:12 +000017987 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017988 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017989 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017990 .prepare_access = prepare_memory_access,
17991 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017992 },
17993
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017994 {
Uwe Hermanna106d152009-05-27 23:17:40 +000017995 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017996 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017997 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017998 .manufacture_id = TI_OLD_ID,
17999 .model_id = TI_TMS29F002RB,
18000 .total_size = 256,
18001 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000018002 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018003 .tested = TEST_UNTESTED,
18004 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018005 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018006 .block_erasers =
18007 {
18008 {
18009 .eraseblocks = {
18010 {16 * 1024, 1},
18011 {8 * 1024, 2},
18012 {32 * 1024, 1},
18013 {64 * 1024, 3},
18014 },
18015 .block_erase = erase_sector_jedec,
18016 }, {
18017 .eraseblocks = { {256 * 1024, 1} },
18018 .block_erase = erase_chip_block_jedec,
18019 },
18020 },
Sean Nelson35727f72010-01-28 23:55:12 +000018021 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018022 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018023 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018024 .prepare_access = prepare_memory_access,
18025 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018026 },
18027
18028 {
Uwe Hermanna106d152009-05-27 23:17:40 +000018029 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018030 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018031 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018032 .manufacture_id = TI_OLD_ID,
18033 .model_id = TI_TMS29F002RT,
18034 .total_size = 256,
18035 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000018036 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018037 .tested = TEST_UNTESTED,
18038 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018039 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000018040 .block_erasers =
18041 {
18042 {
18043 .eraseblocks = {
18044 {64 * 1024, 3},
18045 {32 * 1024, 1},
18046 {8 * 1024, 2},
18047 {16 * 1024, 1},
18048 },
18049 .block_erase = erase_sector_jedec,
18050 }, {
18051 .eraseblocks = { {256 * 1024, 1} },
18052 .block_erase = erase_chip_block_jedec,
18053 },
18054 },
Sean Nelson35727f72010-01-28 23:55:12 +000018055 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018056 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018057 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010018058 .prepare_access = prepare_memory_access,
18059 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000018060 },
18061
18062 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018063 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018064 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018065 .bustype = BUS_SPI,
18066 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018067 .model_id = WINBOND_NEX_W25P16,
18068 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018069 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018070 .feature_bits = FEATURE_WRSR_WREN,
18071 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018072 .probe = probe_spi_rdid,
18073 .probe_timing = TIMING_ZERO,
18074 .block_erasers =
18075 {
18076 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018077 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018078 .block_erase = spi_block_erase_d8,
18079 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018080 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018081 .block_erase = spi_block_erase_c7,
18082 }
18083 },
18084 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18085 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018086 .write = spi_chip_write_256,
18087 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000018088 .voltage = {2700, 3600},
18089 },
18090
18091 {
18092 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018093 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018094 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018095 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018096 .model_id = WINBOND_NEX_W25P32,
18097 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018098 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018099 .feature_bits = FEATURE_WRSR_WREN,
18100 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018101 .probe = probe_spi_rdid,
18102 .probe_timing = TIMING_ZERO,
18103 .block_erasers =
18104 {
18105 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018106 .eraseblocks = { {64 * 1024, 64} },
18107 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018108 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018109 .eraseblocks = { {4096 * 1024, 1} },
18110 .block_erase = spi_block_erase_c7,
18111 }
18112 },
18113 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18114 .unlock = spi_disable_blockprotect,
18115 .write = spi_chip_write_256,
18116 .read = spi_chip_read, /* Fast read (0x0B) supported */
18117 .voltage = {2700, 3600},
18118 },
18119
18120 {
18121 .vendor = "Winbond",
18122 .name = "W25P80",
18123 .bustype = BUS_SPI,
18124 .manufacture_id = WINBOND_NEX_ID,
18125 .model_id = WINBOND_NEX_W25P80,
18126 .total_size = 1024,
18127 .page_size = 256,
18128 .feature_bits = FEATURE_WRSR_WREN,
18129 .tested = TEST_UNTESTED,
18130 .probe = probe_spi_rdid,
18131 .probe_timing = TIMING_ZERO,
18132 .block_erasers =
18133 {
18134 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000018135 .eraseblocks = { {64 * 1024, 16} },
18136 .block_erase = spi_block_erase_d8,
18137 }, {
18138 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000018139 .block_erase = spi_block_erase_c7,
18140 }
18141 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018142 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018143 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000018144 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018145 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018146 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000018147 },
18148
18149 {
18150 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018151 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018152 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018153 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018154 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018155 .total_size = 16384,
18156 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018157 /* supports SFDP */
18158 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018159 /* QPI: only FV & JV..M versions */
18160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020018161 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Edward O'Callaghana97e3532022-12-16 15:41:05 +110018162 .tested = TEST_OK_PREWB,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018163 .probe = probe_spi_rdid,
18164 .probe_timing = TIMING_ZERO,
18165 .block_erasers =
18166 {
18167 {
18168 .eraseblocks = { {4 * 1024, 4096} },
18169 .block_erase = spi_block_erase_20,
18170 }, {
18171 .eraseblocks = { {32 * 1024, 512} },
18172 .block_erase = spi_block_erase_52,
18173 }, {
18174 .eraseblocks = { {64 * 1024, 256} },
18175 .block_erase = spi_block_erase_d8,
18176 }, {
18177 .eraseblocks = { {16 * 1024 * 1024, 1} },
18178 .block_erase = spi_block_erase_60,
18179 }, {
18180 .eraseblocks = { {16 * 1024 * 1024, 1} },
18181 .block_erase = spi_block_erase_c7,
18182 }
18183 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018184 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000018185 .unlock = spi_disable_blockprotect,
18186 .write = spi_chip_write_256,
18187 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018188 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018189 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
18190 .reg_bits =
18191 {
Nico Huber2133f592024-01-06 18:30:01 +010018192 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018193 .srp = {STATUS1, 7, RW},
18194 .srl = {STATUS2, 0, RW},
18195 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18196 .tb = {STATUS1, 5, RW},
18197 .sec = {STATUS1, 6, RW},
18198 .cmp = {STATUS2, 6, RW},
18199 .wps = {STATUS3, 2, RW},
18200 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018201 .wp_write_cfg = spi_wp_write_cfg,
18202 .wp_read_cfg = spi_wp_read_cfg,
18203 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018204 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018205 .prepare_access = spi_prepare_io,
18206 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018207 },
18208
18209 {
18210 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020018211 .name = "W25Q128.V..M",
18212 .bustype = BUS_SPI,
18213 .manufacture_id = WINBOND_NEX_ID,
18214 .model_id = WINBOND_NEX_W25Q128_V_M,
18215 .total_size = 16384,
18216 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018217 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18218 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030018219 .tested = TEST_OK_PREWB,
Patrick Rudolph34323492018-10-04 14:59:40 +020018220 .probe = probe_spi_rdid,
18221 .probe_timing = TIMING_ZERO,
18222 .block_erasers =
18223 {
18224 {
18225 .eraseblocks = { {4 * 1024, 4096} },
18226 .block_erase = spi_block_erase_20,
18227 }, {
18228 .eraseblocks = { {32 * 1024, 512} },
18229 .block_erase = spi_block_erase_52,
18230 }, {
18231 .eraseblocks = { {64 * 1024, 256} },
18232 .block_erase = spi_block_erase_d8,
18233 }, {
18234 .eraseblocks = { {16 * 1024 * 1024, 1} },
18235 .block_erase = spi_block_erase_60,
18236 }, {
18237 .eraseblocks = { {16 * 1024 * 1024, 1} },
18238 .block_erase = spi_block_erase_c7,
18239 }
18240 },
Alan Greena1fc01d2019-09-23 17:12:44 +100018241 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020018242 .unlock = spi_disable_blockprotect,
18243 .write = spi_chip_write_256,
18244 .read = spi_chip_read,
18245 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018246 .reg_bits =
18247 {
Nico Huber2133f592024-01-06 18:30:01 +010018248 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018249 .srp = {STATUS1, 7, RW},
18250 .srl = {STATUS2, 0, RW},
18251 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18252 .tb = {STATUS1, 5, RW},
18253 .sec = {STATUS1, 6, RW},
18254 .cmp = {STATUS2, 6, RW},
18255 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018256 .wp_write_cfg = spi_wp_write_cfg,
18257 .wp_read_cfg = spi_wp_read_cfg,
18258 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018259 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018260 .prepare_access = spi_prepare_io,
18261 .finish_access = spi_finish_io,
Patrick Rudolph34323492018-10-04 14:59:40 +020018262 },
18263
18264 {
18265 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018266 .name = "W25Q128.W",
18267 .bustype = BUS_SPI,
18268 .manufacture_id = WINBOND_NEX_ID,
18269 .model_id = WINBOND_NEX_W25Q128_W,
18270 .total_size = 16384,
18271 .page_size = 256,
18272 /* supports SFDP */
18273 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018274 /* QPI: only FW & JW..M versions */
18275 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018276 .tested = TEST_OK_PREW,
18277 .probe = probe_spi_rdid,
18278 .probe_timing = TIMING_ZERO,
18279 .block_erasers =
18280 {
18281 {
18282 .eraseblocks = { {4 * 1024, 4096} },
18283 .block_erase = spi_block_erase_20,
18284 }, {
18285 .eraseblocks = { {32 * 1024, 512} },
18286 .block_erase = spi_block_erase_52,
18287 }, {
18288 .eraseblocks = { {64 * 1024, 256} },
18289 .block_erase = spi_block_erase_d8,
18290 }, {
18291 .eraseblocks = { {16 * 1024 * 1024, 1} },
18292 .block_erase = spi_block_erase_60,
18293 }, {
18294 .eraseblocks = { {16 * 1024 * 1024, 1} },
18295 .block_erase = spi_block_erase_c7,
18296 }
18297 },
18298 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18299 .unlock = spi_disable_blockprotect,
18300 .write = spi_chip_write_256,
18301 .read = spi_chip_read,
18302 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018303 .reg_bits =
18304 {
Nico Huber2133f592024-01-06 18:30:01 +010018305 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018306 .srp = {STATUS1, 7, RW},
18307 .srl = {STATUS2, 0, RW},
18308 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18309 .tb = {STATUS1, 5, RW},
18310 .sec = {STATUS1, 6, RW},
18311 .cmp = {STATUS2, 6, RW},
18312 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018313 .wp_write_cfg = spi_wp_write_cfg,
18314 .wp_read_cfg = spi_wp_read_cfg,
18315 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018316 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018317 .prepare_access = spi_prepare_io,
18318 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018319 },
18320
18321 {
18322 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080018323 .name = "W25Q128.JW.DTR",
18324 .bustype = BUS_SPI,
18325 .manufacture_id = WINBOND_NEX_ID,
18326 .model_id = WINBOND_NEX_W25Q128_DTR,
18327 .total_size = 16384,
18328 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018329 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18330 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Peichao Wang1a119492019-11-11 15:26:41 +080018331 .tested = TEST_OK_PREW,
18332 .probe = probe_spi_rdid,
18333 .probe_timing = TIMING_ZERO,
18334 .block_erasers =
18335 {
18336 {
18337 .eraseblocks = { {4 * 1024, 4096} },
18338 .block_erase = spi_block_erase_20,
18339 }, {
18340 .eraseblocks = { {32 * 1024, 512} },
18341 .block_erase = spi_block_erase_52,
18342 }, {
18343 .eraseblocks = { {64 * 1024, 256} },
18344 .block_erase = spi_block_erase_d8,
18345 }, {
18346 .eraseblocks = { {16 * 1024 * 1024, 1} },
18347 .block_erase = spi_block_erase_60,
18348 }, {
18349 .eraseblocks = { {16 * 1024 * 1024, 1} },
18350 .block_erase = spi_block_erase_c7,
18351 }
18352 },
18353 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18354 .unlock = spi_disable_blockprotect,
18355 .write = spi_chip_write_256,
18356 .read = spi_chip_read,
18357 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018358 .reg_bits =
18359 {
Nico Huber2133f592024-01-06 18:30:01 +010018360 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018361 .srp = {STATUS1, 7, RW},
18362 .srl = {STATUS2, 0, RW},
18363 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18364 .tb = {STATUS1, 5, RW},
18365 .sec = {STATUS1, 6, RW},
18366 .cmp = {STATUS2, 6, RW},
18367 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018368 .wp_write_cfg = spi_wp_write_cfg,
18369 .wp_read_cfg = spi_wp_read_cfg,
18370 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018371 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018372 .prepare_access = spi_prepare_io,
18373 .finish_access = spi_finish_io,
Peichao Wang1a119492019-11-11 15:26:41 +080018374 },
18375
18376 {
18377 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018378 .name = "W25Q16.V",
18379 .bustype = BUS_SPI,
18380 .manufacture_id = WINBOND_NEX_ID,
18381 .model_id = WINBOND_NEX_W25Q16_V,
18382 .total_size = 2048,
18383 .page_size = 256,
18384 /* supports SFDP */
18385 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018386 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018387 .tested = TEST_OK_PREW,
18388 .probe = probe_spi_rdid,
18389 .probe_timing = TIMING_ZERO,
18390 .block_erasers =
18391 {
18392 {
18393 .eraseblocks = { {4 * 1024, 512} },
18394 .block_erase = spi_block_erase_20,
18395 }, {
18396 .eraseblocks = { {32 * 1024, 64} },
18397 .block_erase = spi_block_erase_52,
18398 }, {
18399 .eraseblocks = { {64 * 1024, 32} },
18400 .block_erase = spi_block_erase_d8,
18401 }, {
18402 .eraseblocks = { {2 * 1024 * 1024, 1} },
18403 .block_erase = spi_block_erase_60,
18404 }, {
18405 .eraseblocks = { {2 * 1024 * 1024, 1} },
18406 .block_erase = spi_block_erase_c7,
18407 }
18408 },
Nico Huber2133f592024-01-06 18:30:01 +010018409 .reg_bits =
18410 {
18411 .qe = {STATUS2, 1, RW},
18412 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018413 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18414 .unlock = spi_disable_blockprotect,
18415 .write = spi_chip_write_256,
18416 .read = spi_chip_read,
18417 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020018418 .prepare_access = spi_prepare_io,
18419 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018420 },
18421
18422 {
18423 .vendor = "Winbond",
18424 .name = "W25Q16.W",
18425 .bustype = BUS_SPI,
18426 .manufacture_id = WINBOND_NEX_ID,
18427 .model_id = WINBOND_NEX_W25Q16_W,
18428 .total_size = 2048,
18429 .page_size = 256,
18430 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018431 /* QPI: only FW & JW..M versions .qpi_read_params = { 2, 4, 6, 8 } */
18432 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018433 .tested = TEST_UNTESTED,
18434 .probe = probe_spi_rdid,
18435 .probe_timing = TIMING_ZERO,
18436 .block_erasers =
18437 {
18438 {
18439 .eraseblocks = { {4 * 1024, 512} },
18440 .block_erase = spi_block_erase_20,
18441 }, {
18442 .eraseblocks = { {32 * 1024, 64} },
18443 .block_erase = spi_block_erase_52,
18444 }, {
18445 .eraseblocks = { {64 * 1024, 32} },
18446 .block_erase = spi_block_erase_d8,
18447 }, {
18448 .eraseblocks = { {2 * 1024 * 1024, 1} },
18449 .block_erase = spi_block_erase_60,
18450 }, {
18451 .eraseblocks = { {2 * 1024 * 1024, 1} },
18452 .block_erase = spi_block_erase_c7,
18453 }
18454 },
Nico Huber2133f592024-01-06 18:30:01 +010018455 .reg_bits =
18456 {
18457 .qe = {STATUS2, 1, RW},
18458 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018459 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18460 .unlock = spi_disable_blockprotect,
18461 .write = spi_chip_write_256,
18462 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010018463 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020018464 .prepare_access = spi_prepare_io,
18465 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018466 },
18467
18468 {
18469 .vendor = "Winbond",
18470 .name = "W25Q20.W",
18471 .bustype = BUS_SPI,
18472 .manufacture_id = WINBOND_NEX_ID,
18473 .model_id = WINBOND_NEX_W25Q20_W,
18474 .total_size = 256,
18475 .page_size = 256,
18476 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018477 /* W25Q20EW: FEATURE_WRSR2 */
18478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018479 .tested = TEST_UNTESTED,
18480 .probe = probe_spi_rdid,
18481 .probe_timing = TIMING_ZERO,
18482 .block_erasers =
18483 {
18484 {
18485 .eraseblocks = { {4 * 1024, 64} },
18486 .block_erase = spi_block_erase_20,
18487 }, {
18488 .eraseblocks = { {32 * 1024, 8} },
18489 .block_erase = spi_block_erase_52,
18490 }, {
18491 .eraseblocks = { {64 * 1024, 4} },
18492 .block_erase = spi_block_erase_d8,
18493 }, {
18494 .eraseblocks = { {256 * 1024, 1} },
18495 .block_erase = spi_block_erase_60,
18496 }, {
18497 .eraseblocks = { {256 * 1024, 1} },
18498 .block_erase = spi_block_erase_c7,
18499 }
18500 },
Nico Huber2133f592024-01-06 18:30:01 +010018501 .reg_bits =
18502 {
18503 .qe = {STATUS2, 1, RW},
18504 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018505 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18506 .unlock = spi_disable_blockprotect,
18507 .write = spi_chip_write_256,
18508 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010018509 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020018510 .prepare_access = spi_prepare_io,
18511 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018512 },
18513
18514 {
18515 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018516 .name = "W25Q256FV",
Boris Baykovaa6c3742016-06-11 18:29:01 +020018517 .bustype = BUS_SPI,
18518 .manufacture_id = WINBOND_NEX_ID,
18519 .model_id = WINBOND_NEX_W25Q256_V,
18520 .total_size = 32768,
18521 .page_size = 256,
18522 /* supports SFDP */
18523 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
18525 FEATURE_4BA_ENTER_WREN | FEATURE_4BA_EAR_C5C8 |
18526 FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
18527 FEATURE_QPI_SRP,
18528 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons3130cbd2018-09-30 19:32:30 +020018529 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018530 .probe = probe_spi_rdid,
18531 .probe_timing = TIMING_ZERO,
18532 .block_erasers =
18533 {
18534 {
18535 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020018536 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018537 }, {
18538 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020018539 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018540 }, {
18541 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020018542 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018543 }, {
18544 .eraseblocks = { {32 * 1024 * 1024, 1} },
18545 .block_erase = spi_block_erase_60,
18546 }, {
18547 .eraseblocks = { {32 * 1024 * 1024, 1} },
18548 .block_erase = spi_block_erase_c7,
18549 }
18550 },
18551 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18552 .unlock = spi_disable_blockprotect,
18553 .write = spi_chip_write_256,
18554 .read = spi_chip_read,
18555 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018556 .reg_bits =
18557 {
Nico Huber2133f592024-01-06 18:30:01 +010018558 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018559 .srp = {STATUS1, 7, RW},
18560 .srl = {STATUS2, 0, RW},
18561 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18562 .tb = {STATUS1, 6, RW},
18563 .cmp = {STATUS2, 6, RW},
18564 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018565 .wp_write_cfg = spi_wp_write_cfg,
18566 .wp_read_cfg = spi_wp_read_cfg,
18567 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018568 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018569 .prepare_access = spi_prepare_io,
18570 .finish_access = spi_finish_io,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018571 },
18572
18573 {
18574 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018575 .name = "W25Q256JV_Q",
18576 .bustype = BUS_SPI,
18577 .manufacture_id = WINBOND_NEX_ID,
18578 .model_id = WINBOND_NEX_W25Q256_V,
18579 .total_size = 32768,
18580 .page_size = 256,
18581 /* supports SFDP */
18582 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018583 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Nico Huberddfbbe82023-12-21 16:31:27 +010018584 .tested = TEST_OK_PREW,
Nico Huber5215eab2022-05-23 15:13:07 +020018585 .probe = probe_spi_rdid,
18586 .probe_timing = TIMING_ZERO,
18587 .block_erasers =
18588 {
18589 {
18590 .eraseblocks = { {4 * 1024, 8192} },
18591 .block_erase = spi_block_erase_21,
18592 }, {
18593 .eraseblocks = { {4 * 1024, 8192} },
18594 .block_erase = spi_block_erase_20,
18595 }, {
18596 .eraseblocks = { {32 * 1024, 1024} },
18597 .block_erase = spi_block_erase_52,
18598 }, {
18599 .eraseblocks = { {64 * 1024, 512} },
18600 .block_erase = spi_block_erase_dc,
18601 }, {
18602 .eraseblocks = { {64 * 1024, 512} },
18603 .block_erase = spi_block_erase_d8,
18604 }, {
18605 .eraseblocks = { {32 * 1024 * 1024, 1} },
18606 .block_erase = spi_block_erase_60,
18607 }, {
18608 .eraseblocks = { {32 * 1024 * 1024, 1} },
18609 .block_erase = spi_block_erase_c7,
18610 }
18611 },
18612 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18613 .unlock = spi_disable_blockprotect,
18614 .write = spi_chip_write_256,
18615 .read = spi_chip_read,
18616 .voltage = {2700, 3600},
18617 .reg_bits =
18618 {
Nico Huber2133f592024-01-06 18:30:01 +010018619 .qe = {STATUS2, 1, RW},
Nico Huber5215eab2022-05-23 15:13:07 +020018620 .srp = {STATUS1, 7, RW},
18621 .srl = {STATUS2, 0, RW},
18622 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18623 .tb = {STATUS1, 6, RW},
18624 .cmp = {STATUS2, 6, RW},
18625 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018626 .wp_write_cfg = spi_wp_write_cfg,
18627 .wp_read_cfg = spi_wp_read_cfg,
18628 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huber5215eab2022-05-23 15:13:07 +020018629 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018630 .prepare_access = spi_prepare_io,
18631 .finish_access = spi_finish_io,
Nico Huber5215eab2022-05-23 15:13:07 +020018632 },
18633
18634 {
18635 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000018636 .name = "W25Q256JV_M",
18637 .bustype = BUS_SPI,
18638 .manufacture_id = WINBOND_NEX_ID,
18639 .model_id = WINBOND_NEX_W25Q256JV_M,
18640 .total_size = 32768,
18641 .page_size = 256,
18642 /* supports SFDP */
18643 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018644 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
18645 FEATURE_4BA | FEATURE_QPI_SRP,
18646 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
David Hendricks49876792018-10-27 20:19:42 +000018647 .tested = TEST_OK_PREW,
18648 .probe = probe_spi_rdid,
18649 .probe_timing = TIMING_ZERO,
18650 .block_erasers =
18651 {
18652 {
18653 .eraseblocks = { {4 * 1024, 8192} },
18654 .block_erase = spi_block_erase_21,
18655 }, {
18656 .eraseblocks = { {4 * 1024, 8192} },
18657 .block_erase = spi_block_erase_20,
18658 }, {
18659 .eraseblocks = { {32 * 1024, 1024} },
18660 .block_erase = spi_block_erase_52,
18661 }, {
18662 .eraseblocks = { {64 * 1024, 512} },
18663 .block_erase = spi_block_erase_dc,
18664 }, {
18665 .eraseblocks = { {64 * 1024, 512} },
18666 .block_erase = spi_block_erase_d8,
18667 }, {
18668 .eraseblocks = { {32 * 1024 * 1024, 1} },
18669 .block_erase = spi_block_erase_60,
18670 }, {
18671 .eraseblocks = { {32 * 1024 * 1024, 1} },
18672 .block_erase = spi_block_erase_c7,
18673 }
18674 },
18675 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18676 .unlock = spi_disable_blockprotect,
18677 .write = spi_chip_write_256,
18678 .read = spi_chip_read,
18679 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018680 .reg_bits =
18681 {
Nico Huber2133f592024-01-06 18:30:01 +010018682 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018683 .srp = {STATUS1, 7, RW},
18684 .srl = {STATUS2, 0, RW},
18685 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18686 .tb = {STATUS1, 6, RW},
18687 .cmp = {STATUS2, 6, RW},
18688 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018689 .wp_write_cfg = spi_wp_write_cfg,
18690 .wp_read_cfg = spi_wp_read_cfg,
18691 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018692 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018693 .prepare_access = spi_prepare_io,
18694 .finish_access = spi_finish_io,
David Hendricks49876792018-10-27 20:19:42 +000018695 },
18696
18697 {
18698 .vendor = "Winbond",
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018699 .name = "W25Q256JW",
el-coderon01209852020-04-29 12:12:53 +020018700 .bustype = BUS_SPI,
18701 .manufacture_id = WINBOND_NEX_ID,
18702 .model_id = WINBOND_NEX_W25Q256_W,
18703 .total_size = 32768,
18704 .page_size = 256,
18705 /* supports SFDP */
18706 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018707 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
18708 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
el-coderon01209852020-04-29 12:12:53 +020018709 .tested = TEST_OK_PREW,
18710 .probe = probe_spi_rdid,
18711 .probe_timing = TIMING_ZERO,
18712 .block_erasers =
18713 {
18714 {
18715 .eraseblocks = { {4 * 1024, 8192} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018716 .block_erase = spi_block_erase_21,
18717 }, {
18718 .eraseblocks = { {4 * 1024, 8192} },
el-coderon01209852020-04-29 12:12:53 +020018719 .block_erase = spi_block_erase_20,
18720 }, {
18721 .eraseblocks = { {32 * 1024, 1024} },
18722 .block_erase = spi_block_erase_52,
18723 }, {
18724 .eraseblocks = { {64 * 1024, 512} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018725 .block_erase = spi_block_erase_dc,
18726 }, {
18727 .eraseblocks = { {64 * 1024, 512} },
el-coderon01209852020-04-29 12:12:53 +020018728 .block_erase = spi_block_erase_d8,
18729 }, {
18730 .eraseblocks = { {32 * 1024 * 1024, 1} },
18731 .block_erase = spi_block_erase_60,
18732 }, {
18733 .eraseblocks = { {32 * 1024 * 1024, 1} },
18734 .block_erase = spi_block_erase_c7,
18735 }
18736 },
Nico Huber2133f592024-01-06 18:30:01 +010018737 .reg_bits =
18738 {
18739 .qe = {STATUS2, 1, RW},
18740 },
el-coderon01209852020-04-29 12:12:53 +020018741 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18742 .unlock = spi_disable_blockprotect,
18743 .write = spi_chip_write_256,
18744 .read = spi_chip_read,
18745 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020018746 .prepare_access = spi_prepare_io,
18747 .finish_access = spi_finish_io,
el-coderon01209852020-04-29 12:12:53 +020018748 },
18749
18750 {
18751 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070018752 .name = "W25Q256JW_DTR",
18753 .bustype = BUS_SPI,
18754 .manufacture_id = WINBOND_NEX_ID,
18755 .model_id = WINBOND_NEX_W25Q256_DTR,
18756 .total_size = 32768,
18757 .page_size = 256,
18758 /* supports SFDP */
18759 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018760 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
18761 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
18762 .dummy_cycles =
18763 {
18764 .qpi_read_params = {
18765 2, /* Datasheet Rev.K says 4 is the default, though.
18766 Will assume that the text is wrong, if not,
18767 we'll know why it doesn't work. */
18768 4, 6, 8
18769 },
18770 },
Kapil Porwal111c3802022-12-09 19:41:27 +053018771 .tested = TEST_OK_PREWB,
David Hendricks31532602020-08-16 17:14:56 -070018772 .probe = probe_spi_rdid,
18773 .probe_timing = TIMING_ZERO,
18774 .block_erasers =
18775 {
18776 {
18777 .eraseblocks = { {4 * 1024, 8192} },
18778 .block_erase = spi_block_erase_21,
18779 }, {
18780 .eraseblocks = { {4 * 1024, 8192} },
18781 .block_erase = spi_block_erase_20,
18782 }, {
18783 .eraseblocks = { {32 * 1024, 1024} },
18784 .block_erase = spi_block_erase_52,
18785 }, {
18786 .eraseblocks = { {64 * 1024, 512} },
18787 .block_erase = spi_block_erase_dc,
18788 }, {
18789 .eraseblocks = { {64 * 1024, 512} },
18790 .block_erase = spi_block_erase_d8,
18791 }, {
18792 .eraseblocks = { {32 * 1024 * 1024, 1} },
18793 .block_erase = spi_block_erase_60,
18794 }, {
18795 .eraseblocks = { {32 * 1024 * 1024, 1} },
18796 .block_erase = spi_block_erase_c7,
18797 }
18798 },
18799 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18800 .unlock = spi_disable_blockprotect,
18801 .write = spi_chip_write_256,
18802 .read = spi_chip_read,
18803 .voltage = {1700, 1950},
Kapil Porwal111c3802022-12-09 19:41:27 +053018804 .reg_bits =
18805 {
Nico Huber2133f592024-01-06 18:30:01 +010018806 .qe = {STATUS2, 1, RW},
Kapil Porwal111c3802022-12-09 19:41:27 +053018807 .srp = {STATUS1, 7, RW},
18808 .srl = {STATUS2, 0, RW},
18809 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18810 .tb = {STATUS1, 6, RW},
18811 .cmp = {STATUS2, 6, RW},
18812 .wps = {STATUS3, 2, RW},
18813 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018814 .wp_write_cfg = spi_wp_write_cfg,
18815 .wp_read_cfg = spi_wp_read_cfg,
18816 .wp_get_ranges = spi_wp_get_available_ranges,
Kapil Porwal111c3802022-12-09 19:41:27 +053018817 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018818 .prepare_access = spi_prepare_io,
18819 .finish_access = spi_finish_io,
David Hendricks31532602020-08-16 17:14:56 -070018820 },
18821
18822 {
18823 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018824 .name = "W25Q32BV/W25Q32CV/W25Q32DV",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018825 .bustype = BUS_SPI,
18826 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018827 .model_id = WINBOND_NEX_W25Q32_V,
18828 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018829 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018830 /* supports SFDP */
18831 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018832 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018833 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018834 .probe = probe_spi_rdid,
18835 .probe_timing = TIMING_ZERO,
18836 .block_erasers =
18837 {
18838 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018839 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018840 .block_erase = spi_block_erase_20,
18841 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018842 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018843 .block_erase = spi_block_erase_52,
18844 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018845 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018846 .block_erase = spi_block_erase_d8,
18847 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018848 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018849 .block_erase = spi_block_erase_60,
18850 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018851 .eraseblocks = { {4 * 1024 * 1024, 1} },
18852 .block_erase = spi_block_erase_c7,
18853 }
18854 },
18855 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18856 .unlock = spi_disable_blockprotect,
18857 .write = spi_chip_write_256,
18858 .read = spi_chip_read,
18859 .voltage = {2700, 3600},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018860 .reg_bits =
18861 {
Nico Huber2133f592024-01-06 18:30:01 +010018862 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018863 .srp = {STATUS1, 7, RW},
18864 .srl = {STATUS2, 0, RW},
18865 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18866 .tb = {STATUS1, 5, RW},
18867 .sec = {STATUS1, 6, RW},
18868 .cmp = {STATUS2, 6, RW},
18869 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018870 .wp_write_cfg = spi_wp_write_cfg,
18871 .wp_read_cfg = spi_wp_read_cfg,
18872 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018873 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018874 .prepare_access = spi_prepare_io,
18875 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018876 },
18877
18878 {
18879 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018880 .name = "W25Q32FV",
18881 .bustype = BUS_SPI,
18882 .manufacture_id = WINBOND_NEX_ID,
18883 .model_id = WINBOND_NEX_W25Q32_V,
18884 .total_size = 4096,
18885 .page_size = 256,
18886 /* supports SFDP */
18887 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018889 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010018890 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018891 .tested = TEST_OK_PREW,
18892 .probe = probe_spi_rdid,
18893 .probe_timing = TIMING_ZERO,
18894 .block_erasers =
18895 {
18896 {
18897 .eraseblocks = { {4 * 1024, 1024} },
18898 .block_erase = spi_block_erase_20,
18899 }, {
18900 .eraseblocks = { {32 * 1024, 128} },
18901 .block_erase = spi_block_erase_52,
18902 }, {
18903 .eraseblocks = { {64 * 1024, 64} },
18904 .block_erase = spi_block_erase_d8,
18905 }, {
18906 .eraseblocks = { {4 * 1024 * 1024, 1} },
18907 .block_erase = spi_block_erase_60,
18908 }, {
18909 .eraseblocks = { {4 * 1024 * 1024, 1} },
18910 .block_erase = spi_block_erase_c7,
18911 }
18912 },
18913 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18914 .unlock = spi_disable_blockprotect,
18915 .write = spi_chip_write_256,
18916 .read = spi_chip_read,
18917 .voltage = {2700, 3600},
18918 .reg_bits =
18919 {
Nico Huber2133f592024-01-06 18:30:01 +010018920 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018921 .srp = {STATUS1, 7, RW},
18922 .srl = {STATUS2, 0, RW},
18923 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18924 .tb = {STATUS1, 5, RW},
18925 .sec = {STATUS1, 6, RW},
18926 .cmp = {STATUS2, 6, RW},
18927 .wps = {STATUS3, 2, RW},
18928 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018929 .wp_write_cfg = spi_wp_write_cfg,
18930 .wp_read_cfg = spi_wp_read_cfg,
18931 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018932 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018933 .prepare_access = spi_prepare_io,
18934 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018935 },
18936
18937 {
18938 .vendor = "Winbond",
18939 .name = "W25Q32JV",
18940 .bustype = BUS_SPI,
18941 .manufacture_id = WINBOND_NEX_ID,
18942 .model_id = WINBOND_NEX_W25Q32_V,
18943 .total_size = 4096,
18944 .page_size = 256,
18945 /* supports SFDP */
18946 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018947 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018948 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18949 .tested = TEST_OK_PREW,
18950 .probe = probe_spi_rdid,
18951 .probe_timing = TIMING_ZERO,
18952 .block_erasers =
18953 {
18954 {
18955 .eraseblocks = { {4 * 1024, 1024} },
18956 .block_erase = spi_block_erase_20,
18957 }, {
18958 .eraseblocks = { {32 * 1024, 128} },
18959 .block_erase = spi_block_erase_52,
18960 }, {
18961 .eraseblocks = { {64 * 1024, 64} },
18962 .block_erase = spi_block_erase_d8,
18963 }, {
18964 .eraseblocks = { {4 * 1024 * 1024, 1} },
18965 .block_erase = spi_block_erase_60,
18966 }, {
18967 .eraseblocks = { {4 * 1024 * 1024, 1} },
18968 .block_erase = spi_block_erase_c7,
18969 }
18970 },
18971 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18972 .unlock = spi_disable_blockprotect,
18973 .write = spi_chip_write_256,
18974 .read = spi_chip_read,
18975 .voltage = {2700, 3600},
18976 .reg_bits =
18977 {
Nico Huber2133f592024-01-06 18:30:01 +010018978 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018979 .srp = {STATUS1, 7, RW},
18980 .srl = {STATUS2, 0, RW},
18981 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18982 .tb = {STATUS1, 5, RW},
18983 .sec = {STATUS1, 6, RW},
18984 .cmp = {STATUS2, 6, RW},
18985 .wps = {STATUS3, 2, RW},
18986 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018987 .wp_write_cfg = spi_wp_write_cfg,
18988 .wp_read_cfg = spi_wp_read_cfg,
18989 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018990 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020018991 .prepare_access = spi_prepare_io,
18992 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018993 },
18994
18995 {
18996 .vendor = "Winbond",
Angel Pons0d4354e2024-05-26 16:33:51 +020018997 .name = "W25Q32JV-.M",
18998 .bustype = BUS_SPI,
18999 .manufacture_id = WINBOND_NEX_ID,
19000 .model_id = WINBOND_NEX_W25Q32JV,
19001 .total_size = 4096,
19002 .page_size = 256,
19003 /* supports SFDP */
Nico Huber1412d9f2024-01-06 18:25:49 +010019004 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Angel Pons0d4354e2024-05-26 16:33:51 +020019005 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010019006 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons0d4354e2024-05-26 16:33:51 +020019007 .tested = TEST_OK_PREW,
19008 .probe = probe_spi_rdid,
19009 .probe_timing = TIMING_ZERO,
19010 .block_erasers =
19011 {
19012 {
19013 .eraseblocks = { {4 * 1024, 1024} },
19014 .block_erase = spi_block_erase_20,
19015 }, {
19016 .eraseblocks = { {32 * 1024, 128} },
19017 .block_erase = spi_block_erase_52,
19018 }, {
19019 .eraseblocks = { {64 * 1024, 64} },
19020 .block_erase = spi_block_erase_d8,
19021 }, {
19022 .eraseblocks = { {4 * 1024 * 1024, 1} },
19023 .block_erase = spi_block_erase_60,
19024 }, {
19025 .eraseblocks = { {4 * 1024 * 1024, 1} },
19026 .block_erase = spi_block_erase_c7,
19027 }
19028 },
19029 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19030 .unlock = spi_disable_blockprotect_bp2_srwd,
19031 .write = spi_chip_write_256,
19032 .read = spi_chip_read,
19033 .voltage = {2700, 3600},
19034 .reg_bits =
19035 {
Nico Huber2133f592024-01-06 18:30:01 +010019036 .qe = {STATUS2, 1, RW},
Angel Pons0d4354e2024-05-26 16:33:51 +020019037 .srp = {STATUS1, 7, RW},
19038 .srl = {STATUS2, 0, RW},
19039 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19040 .tb = {STATUS1, 5, RW},
19041 .sec = {STATUS1, 6, RW},
19042 .cmp = {STATUS2, 6, RW},
19043 .wps = {STATUS3, 2, RW},
19044 },
19045 .wp_write_cfg = spi_wp_write_cfg,
19046 .wp_read_cfg = spi_wp_read_cfg,
19047 .wp_get_ranges = spi_wp_get_available_ranges,
19048 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019049 .prepare_access = spi_prepare_io,
19050 .finish_access = spi_finish_io,
Angel Pons0d4354e2024-05-26 16:33:51 +020019051 },
19052
19053 {
19054 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019055 .name = "W25Q32BW/W25Q32CW/W25Q32DW",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019056 .bustype = BUS_SPI,
19057 .manufacture_id = WINBOND_NEX_ID,
19058 .model_id = WINBOND_NEX_W25Q32_W,
19059 .total_size = 4096,
19060 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019061 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019062 /* QPI: only DW version */
19063 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019064 .tested = TEST_OK_PREW,
19065 .probe = probe_spi_rdid,
19066 .probe_timing = TIMING_ZERO,
19067 .block_erasers =
19068 {
19069 {
19070 .eraseblocks = { {4 * 1024, 1024} },
19071 .block_erase = spi_block_erase_20,
19072 }, {
19073 .eraseblocks = { {32 * 1024, 128} },
19074 .block_erase = spi_block_erase_52,
19075 }, {
19076 .eraseblocks = { {64 * 1024, 64} },
19077 .block_erase = spi_block_erase_d8,
19078 }, {
19079 .eraseblocks = { {4 * 1024 * 1024, 1} },
19080 .block_erase = spi_block_erase_60,
19081 }, {
19082 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019083 .block_erase = spi_block_erase_c7,
19084 }
19085 },
19086 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19087 .unlock = spi_disable_blockprotect,
19088 .write = spi_chip_write_256,
19089 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019090 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019091 .reg_bits =
19092 {
Nico Huber2133f592024-01-06 18:30:01 +010019093 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019094 .srp = {STATUS1, 7, RW},
19095 .srl = {STATUS2, 0, RW},
19096 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19097 .tb = {STATUS1, 5, RW},
19098 .sec = {STATUS1, 6, RW},
19099 .cmp = {STATUS2, 6, RW},
19100 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019101 .wp_write_cfg = spi_wp_write_cfg,
19102 .wp_read_cfg = spi_wp_read_cfg,
19103 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019104 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019105 .prepare_access = spi_prepare_io,
19106 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019107 },
19108
19109 {
19110 .vendor = "Winbond",
19111 .name = "W25Q32FW",
19112 .bustype = BUS_SPI,
19113 .manufacture_id = WINBOND_NEX_ID,
19114 .model_id = WINBOND_NEX_W25Q32_W,
19115 .total_size = 4096,
19116 .page_size = 256,
19117 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019118 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019119 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010019120 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019121 .tested = TEST_OK_PREW,
19122 .probe = probe_spi_rdid,
19123 .probe_timing = TIMING_ZERO,
19124 .block_erasers =
19125 {
19126 {
19127 .eraseblocks = { {4 * 1024, 1024} },
19128 .block_erase = spi_block_erase_20,
19129 }, {
19130 .eraseblocks = { {32 * 1024, 128} },
19131 .block_erase = spi_block_erase_52,
19132 }, {
19133 .eraseblocks = { {64 * 1024, 64} },
19134 .block_erase = spi_block_erase_d8,
19135 }, {
19136 .eraseblocks = { {4 * 1024 * 1024, 1} },
19137 .block_erase = spi_block_erase_60,
19138 }, {
19139 .eraseblocks = { {4 * 1024 * 1024, 1} },
19140 .block_erase = spi_block_erase_c7,
19141 }
19142 },
19143 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19144 .unlock = spi_disable_blockprotect,
19145 .write = spi_chip_write_256,
19146 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019147 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019148 .reg_bits =
19149 {
Nico Huber2133f592024-01-06 18:30:01 +010019150 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019151 .srp = {STATUS1, 7, RW},
19152 .srl = {STATUS2, 0, RW},
19153 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19154 .tb = {STATUS1, 5, RW},
19155 .sec = {STATUS1, 6, RW},
19156 .cmp = {STATUS2, 6, RW},
19157 .wps = {STATUS3, 2, 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,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019162 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019163 .prepare_access = spi_prepare_io,
19164 .finish_access = spi_finish_io,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019165 },
19166
19167 {
19168 .vendor = "Winbond",
19169 .name = "W25Q32JW...Q",
19170 .bustype = BUS_SPI,
19171 .manufacture_id = WINBOND_NEX_ID,
19172 .model_id = WINBOND_NEX_W25Q32_W,
19173 .total_size = 4096,
19174 .page_size = 256,
19175 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19176 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010019177 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019178 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
19179 .tested = TEST_OK_PREW,
19180 .probe = probe_spi_rdid,
19181 .probe_timing = TIMING_ZERO,
19182 .block_erasers =
19183 {
19184 {
19185 .eraseblocks = { {4 * 1024, 1024} },
19186 .block_erase = spi_block_erase_20,
19187 }, {
19188 .eraseblocks = { {32 * 1024, 128} },
19189 .block_erase = spi_block_erase_52,
19190 }, {
19191 .eraseblocks = { {64 * 1024, 64} },
19192 .block_erase = spi_block_erase_d8,
19193 }, {
19194 .eraseblocks = { {4 * 1024 * 1024, 1} },
19195 .block_erase = spi_block_erase_60,
19196 }, {
19197 .eraseblocks = { {4 * 1024 * 1024, 1} },
19198 .block_erase = spi_block_erase_c7,
19199 }
19200 },
19201 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19202 .unlock = spi_disable_blockprotect,
19203 .write = spi_chip_write_256,
19204 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019205 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019206 .reg_bits =
19207 {
19208 .srp = {STATUS1, 7, RW},
19209 .srl = {STATUS2, 0, RW},
19210 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19211 .tb = {STATUS1, 5, RW},
19212 .sec = {STATUS1, 6, RW},
19213 .cmp = {STATUS2, 6, RW},
19214 .wps = {STATUS3, 2, RW},
19215 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019216 .wp_write_cfg = spi_wp_write_cfg,
19217 .wp_read_cfg = spi_wp_read_cfg,
19218 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019219 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019220 .prepare_access = spi_prepare_io,
19221 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019222 },
19223
19224 {
19225 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019226 .name = "W25Q32JW...M",
19227 .bustype = BUS_SPI,
19228 .manufacture_id = WINBOND_NEX_ID,
19229 .model_id = WINBOND_NEX_W25Q32JW_M,
19230 .total_size = 4096,
19231 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019232 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19233 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010019234 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019235 FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2,
Nico Huber2133f592024-01-06 18:30:01 +010019236 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019237 .tested = TEST_OK_PREW,
19238 .probe = probe_spi_rdid,
19239 .probe_timing = TIMING_ZERO,
19240 .block_erasers =
19241 {
19242 {
19243 .eraseblocks = { {4 * 1024, 1024} },
19244 .block_erase = spi_block_erase_20,
19245 }, {
19246 .eraseblocks = { {32 * 1024, 128} },
19247 .block_erase = spi_block_erase_52,
19248 }, {
19249 .eraseblocks = { {64 * 1024, 64} },
19250 .block_erase = spi_block_erase_d8,
19251 }, {
19252 .eraseblocks = { {4 * 1024 * 1024, 1} },
19253 .block_erase = spi_block_erase_60,
19254 }, {
19255 .eraseblocks = { {4 * 1024 * 1024, 1} },
19256 .block_erase = spi_block_erase_c7,
19257 }
19258 },
19259 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19260 .unlock = spi_disable_blockprotect_bp2_srwd,
19261 .write = spi_chip_write_256,
19262 .read = spi_chip_read,
19263 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019264 .reg_bits =
19265 {
Nico Huber2133f592024-01-06 18:30:01 +010019266 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019267 .srp = {STATUS1, 7, RW},
19268 .srl = {STATUS2, 0, RW},
19269 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19270 .tb = {STATUS1, 5, RW},
19271 .sec = {STATUS1, 6, RW},
19272 .cmp = {STATUS2, 6, RW},
19273 .wps = {STATUS3, 2, RW},
19274 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019275 .wp_write_cfg = spi_wp_write_cfg,
19276 .wp_read_cfg = spi_wp_read_cfg,
19277 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019278 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019279 .prepare_access = spi_prepare_io,
19280 .finish_access = spi_finish_io,
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019281 },
19282
19283 {
19284 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019285 .name = "W25Q40.V",
19286 .bustype = BUS_SPI,
19287 .manufacture_id = WINBOND_NEX_ID,
19288 .model_id = WINBOND_NEX_W25Q40_V,
19289 .total_size = 512,
19290 .page_size = 256,
19291 /* supports SFDP */
19292 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019293 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019294 .tested = TEST_OK_PREW,
19295 .probe = probe_spi_rdid,
19296 .probe_timing = TIMING_ZERO,
19297 .block_erasers =
19298 {
19299 {
19300 .eraseblocks = { {4 * 1024, 128} },
19301 .block_erase = spi_block_erase_20,
19302 }, {
19303 .eraseblocks = { {32 * 1024, 16} },
19304 .block_erase = spi_block_erase_52,
19305 }, {
19306 .eraseblocks = { {64 * 1024, 8} },
19307 .block_erase = spi_block_erase_d8,
19308 }, {
19309 .eraseblocks = { {512 * 1024, 1} },
19310 .block_erase = spi_block_erase_60,
19311 }, {
19312 .eraseblocks = { {512 * 1024, 1} },
19313 .block_erase = spi_block_erase_c7,
19314 }
19315 },
Nico Huber2133f592024-01-06 18:30:01 +010019316 .reg_bits =
19317 {
19318 .qe = {STATUS2, 1, RW},
19319 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019320 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19321 .unlock = spi_disable_blockprotect,
19322 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber2133f592024-01-06 18:30:01 +010019323 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019324 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019325 .prepare_access = spi_prepare_io,
19326 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019327 },
19328
19329 {
19330 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019331 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019332 .bustype = BUS_SPI,
19333 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020019334 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019335 .total_size = 512,
19336 .page_size = 256,
19337 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019338 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Angel Pons3164a0c2018-09-30 20:26:06 +020019339 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019340 .probe = probe_spi_rdid,
19341 .probe_timing = TIMING_ZERO,
19342 .block_erasers =
19343 {
19344 {
19345 .eraseblocks = { {4 * 1024, 128} },
19346 .block_erase = spi_block_erase_20,
19347 }, {
19348 .eraseblocks = { {32 * 1024, 16} },
19349 .block_erase = spi_block_erase_52,
19350 }, {
19351 .eraseblocks = { {64 * 1024, 8} },
19352 .block_erase = spi_block_erase_d8,
19353 }, {
19354 .eraseblocks = { {512 * 1024, 1} },
19355 .block_erase = spi_block_erase_60,
19356 }, {
19357 .eraseblocks = { {512 * 1024, 1} },
19358 .block_erase = spi_block_erase_c7,
19359 }
19360 },
Nico Huber2133f592024-01-06 18:30:01 +010019361 .reg_bits =
19362 {
19363 .qe = {STATUS2, 1, RW},
19364 },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019365 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19366 .unlock = spi_disable_blockprotect,
19367 .write = spi_chip_write_256,
19368 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019369 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019370 .prepare_access = spi_prepare_io,
19371 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019372 },
19373
19374 {
19375 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019376 .name = "W25Q40EW",
19377 .bustype = BUS_SPI,
19378 .manufacture_id = WINBOND_NEX_ID,
19379 .model_id = WINBOND_NEX_W25Q40EW,
19380 .total_size = 512,
19381 .page_size = 256,
19382 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019383 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
19384 FEATURE_OTP | FEATURE_QPI_SRP,
19385 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green07b8a172019-09-23 16:47:05 +100019386 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020019387 .probe = probe_spi_rdid,
19388 .probe_timing = TIMING_ZERO,
19389 .block_erasers =
19390 {
19391 {
19392 .eraseblocks = { {4 * 1024, 128} },
19393 .block_erase = spi_block_erase_20,
19394 }, {
19395 .eraseblocks = { {32 * 1024, 16} },
19396 .block_erase = spi_block_erase_52,
19397 }, {
19398 .eraseblocks = { {64 * 1024, 8} },
19399 .block_erase = spi_block_erase_d8,
19400 }, {
19401 .eraseblocks = { {512 * 1024, 1} },
19402 .block_erase = spi_block_erase_60,
19403 }, {
19404 .eraseblocks = { {512 * 1024, 1} },
19405 .block_erase = spi_block_erase_c7,
19406 }
19407 },
Nico Huber2133f592024-01-06 18:30:01 +010019408 .reg_bits =
19409 {
19410 .qe = {STATUS2, 1, RW},
19411 },
Nico Huber25683572018-03-30 13:50:13 +020019412 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19413 .unlock = spi_disable_blockprotect,
19414 .write = spi_chip_write_256,
19415 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019416 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019417 .prepare_access = spi_prepare_io,
19418 .finish_access = spi_finish_io,
Nico Huber25683572018-03-30 13:50:13 +020019419 },
19420
Stanislav Sedovf5775442018-03-07 14:16:51 -080019421 {
19422 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093019423 .name = "W25Q512JV",
19424 .bustype = BUS_SPI,
19425 .manufacture_id = WINBOND_NEX_ID,
19426 .model_id = WINBOND_NEX_W25Q512JV,
19427 .total_size = 64 * 1024,
19428 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019429 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
19430 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Joel Stanley55439612019-07-27 19:25:35 +093019431 .tested = TEST_OK_PREW,
19432 .probe = probe_spi_rdid,
19433 .probe_timing = TIMING_ZERO,
19434 .block_erasers =
19435 {
19436 {
19437 .eraseblocks = { {4 * 1024, 16384} },
19438 .block_erase = spi_block_erase_21,
19439 }, {
19440 .eraseblocks = { {4 * 1024, 16384} },
19441 .block_erase = spi_block_erase_20,
19442 }, {
19443 .eraseblocks = { {32 * 1024, 2048} },
19444 .block_erase = spi_block_erase_52,
19445 }, {
19446 .eraseblocks = { {64 * 1024, 1024} },
19447 .block_erase = spi_block_erase_dc,
19448 }, {
19449 .eraseblocks = { {64 * 1024, 1024} },
19450 .block_erase = spi_block_erase_d8,
19451 }, {
19452 .eraseblocks = { {64 * 1024 * 1024, 1} },
19453 .block_erase = spi_block_erase_60,
19454 }, {
19455 .eraseblocks = { {64 * 1024 * 1024, 1} },
19456 .block_erase = spi_block_erase_c7,
19457 }
19458 },
Nico Huber2133f592024-01-06 18:30:01 +010019459 .reg_bits =
19460 {
19461 .qe = {STATUS2, 1, RW},
19462 },
Joel Stanley55439612019-07-27 19:25:35 +093019463 .printlock = spi_prettyprint_status_register_plain,
19464 .unlock = spi_disable_blockprotect,
19465 .write = spi_chip_write_256,
19466 .read = spi_chip_read,
19467 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019468 .prepare_access = spi_prepare_io,
19469 .finish_access = spi_finish_io,
Joel Stanley55439612019-07-27 19:25:35 +093019470 },
19471
19472 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010019473 .vendor = "Winbond",
19474 .name = "W25Q512NW-IM",
19475 .bustype = BUS_SPI,
19476 .manufacture_id = WINBOND_NEX_ID,
19477 .model_id = WINBOND_NEX_W25Q512NW_IM,
19478 .total_size = 64 * 1024,
19479 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19481 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
19482 .dummy_cycles =
19483 {
19484 /* Actually has 3 parameter bits, but higher values only help with DTR. */
19485 .qpi_read_params = { 2, 4, 6, 8 },
19486 },
Subrata Banikf5bffd92022-12-14 12:30:43 +053019487 .tested = TEST_OK_PREWB,
Felix Singer3c9bdb92022-12-15 23:30:16 +010019488 .probe = probe_spi_rdid,
19489 .probe_timing = TIMING_ZERO,
19490 .block_erasers =
Atul Dhudase2502dbd2021-09-21 10:02:20 +053019491 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010019492 {
19493 .eraseblocks = { {4 * 1024, 16384} },
19494 .block_erase = spi_block_erase_21,
19495 }, {
19496 .eraseblocks = { {4 * 1024, 16384} },
19497 .block_erase = spi_block_erase_20,
19498 }, {
19499 .eraseblocks = { {32 * 1024, 2048} },
19500 .block_erase = spi_block_erase_52,
19501 }, {
19502 .eraseblocks = { {64 * 1024, 1024} },
19503 .block_erase = spi_block_erase_dc,
19504 }, {
19505 .eraseblocks = { {64 * 1024, 1024} },
19506 .block_erase = spi_block_erase_d8,
19507 }, {
19508 .eraseblocks = { {64 * 1024 * 1024, 1} },
19509 .block_erase = spi_block_erase_60,
19510 }, {
19511 .eraseblocks = { {64 * 1024 * 1024, 1} },
19512 .block_erase = spi_block_erase_c7,
19513 }
19514 },
19515 .unlock = spi_disable_blockprotect,
19516 .write = spi_chip_write_256,
19517 .read = spi_chip_read,
19518 .voltage = {1650, 1950},
Subrata Banikf5bffd92022-12-14 12:30:43 +053019519 .reg_bits =
19520 {
Nico Huber2133f592024-01-06 18:30:01 +010019521 .qe = {STATUS2, 1, RW},
Subrata Banikf5bffd92022-12-14 12:30:43 +053019522 .srp = {STATUS1, 7, RW},
19523 .srl = {STATUS2, 0, RW},
19524 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19525 .tb = {STATUS1, 6, RW},
19526 .cmp = {STATUS2, 6, RW},
19527 .wps = {STATUS3, 2, RW},
19528 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019529 .wp_write_cfg = spi_wp_write_cfg,
19530 .wp_read_cfg = spi_wp_read_cfg,
19531 .wp_get_ranges = spi_wp_get_available_ranges,
Subrata Banikf5bffd92022-12-14 12:30:43 +053019532 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019533 .prepare_access = spi_prepare_io,
19534 .finish_access = spi_finish_io,
Atul Dhudase2502dbd2021-09-21 10:02:20 +053019535 },
19536
19537 {
Joel Stanley55439612019-07-27 19:25:35 +093019538 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019539 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080019540 .bustype = BUS_SPI,
19541 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019542 .model_id = WINBOND_NEX_W25Q64_V,
19543 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080019544 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019545 /* supports SFDP */
19546 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019547 /* QPI: only FV version */
19548 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030019549 .tested = TEST_OK_PREWB,
Stanislav Sedovf5775442018-03-07 14:16:51 -080019550 .probe = probe_spi_rdid,
19551 .probe_timing = TIMING_ZERO,
19552 .block_erasers =
19553 {
19554 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019555 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019556 .block_erase = spi_block_erase_20,
19557 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019558 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019559 .block_erase = spi_block_erase_52,
19560 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019561 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019562 .block_erase = spi_block_erase_d8,
19563 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019564 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019565 .block_erase = spi_block_erase_60,
19566 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019567 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019568 .block_erase = spi_block_erase_c7,
19569 }
19570 },
19571 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19572 .unlock = spi_disable_blockprotect,
19573 .write = spi_chip_write_256,
19574 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019575 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019576 .reg_bits =
19577 {
Nico Huber2133f592024-01-06 18:30:01 +010019578 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019579 .srp = {STATUS1, 7, RW},
19580 .srl = {STATUS2, 0, RW},
19581 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19582 .tb = {STATUS1, 5, RW},
19583 .sec = {STATUS1, 6, RW},
19584 .cmp = {STATUS2, 6, RW},
19585 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019586 .wp_write_cfg = spi_wp_write_cfg,
19587 .wp_read_cfg = spi_wp_read_cfg,
19588 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019589 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019590 .prepare_access = spi_prepare_io,
19591 .finish_access = spi_finish_io,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019592 },
19593
19594 {
19595 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019596 .name = "W25Q64JV-.Q",
19597 .bustype = BUS_SPI,
19598 .manufacture_id = WINBOND_NEX_ID,
19599 .model_id = WINBOND_NEX_W25Q64_V,
19600 .total_size = 8192,
19601 .page_size = 256,
19602 /* supports SFDP */
19603 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019604 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020019605 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019606 .tested = TEST_OK_PREW,
19607 .probe = probe_spi_rdid,
19608 .probe_timing = TIMING_ZERO,
19609 .block_erasers =
19610 {
19611 {
19612 .eraseblocks = { {4 * 1024, 2048} },
19613 .block_erase = spi_block_erase_20,
19614 }, {
19615 .eraseblocks = { {32 * 1024, 256} },
19616 .block_erase = spi_block_erase_52,
19617 }, {
19618 .eraseblocks = { {64 * 1024, 128} },
19619 .block_erase = spi_block_erase_d8,
19620 }, {
19621 .eraseblocks = { {8 * 1024 * 1024, 1} },
19622 .block_erase = spi_block_erase_60,
19623 }, {
19624 .eraseblocks = { {8 * 1024 * 1024, 1} },
19625 .block_erase = spi_block_erase_c7,
19626 }
19627 },
19628 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19629 .unlock = spi_disable_blockprotect,
19630 .write = spi_chip_write_256,
19631 .read = spi_chip_read,
19632 .voltage = {2700, 3600},
19633 .reg_bits =
19634 {
Nico Huber2133f592024-01-06 18:30:01 +010019635 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019636 .srp = {STATUS1, 7, RW},
19637 .srl = {STATUS2, 0, RW},
19638 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19639 .tb = {STATUS1, 5, RW},
19640 .sec = {STATUS1, 6, RW},
19641 .cmp = {STATUS2, 6, RW},
19642 .wps = {STATUS3, 2, RW},
19643 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019644 .wp_write_cfg = spi_wp_write_cfg,
19645 .wp_read_cfg = spi_wp_read_cfg,
19646 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019647 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019648 .prepare_access = spi_prepare_io,
19649 .finish_access = spi_finish_io,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019650 },
19651
19652 {
19653 .vendor = "Winbond",
19654 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010019655 .bustype = BUS_SPI,
19656 .manufacture_id = WINBOND_NEX_ID,
19657 .model_id = WINBOND_NEX_W25Q64JV,
19658 .total_size = 8192,
19659 .page_size = 256,
19660 /* supports SFDP */
Nico Huber2133f592024-01-06 18:30:01 +010019661 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
19662 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010019663 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Simon Buhrow236a38c2021-11-05 11:48:30 +010019664 .tested = TEST_OK_PREW,
19665 .probe = probe_spi_rdid,
19666 .probe_timing = TIMING_ZERO,
19667 .block_erasers =
19668 {
19669 {
19670 .eraseblocks = { {4 * 1024, 2048} },
19671 .block_erase = spi_block_erase_20,
19672 }, {
19673 .eraseblocks = { {32 * 1024, 256} },
19674 .block_erase = spi_block_erase_52,
19675 }, {
19676 .eraseblocks = { {64 * 1024, 128} },
19677 .block_erase = spi_block_erase_d8,
19678 }, {
19679 .eraseblocks = { {8 * 1024 * 1024, 1} },
19680 .block_erase = spi_block_erase_60,
19681 }, {
19682 .eraseblocks = { {8 * 1024 * 1024, 1} },
19683 .block_erase = spi_block_erase_c7,
19684 }
19685 },
Nico Huber2133f592024-01-06 18:30:01 +010019686 .reg_bits =
19687 {
19688 .qe = {STATUS2, 1, RW},
19689 },
Simon Buhrow236a38c2021-11-05 11:48:30 +010019690 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19691 .unlock = spi_disable_blockprotect_bp2_srwd,
19692 .write = spi_chip_write_256,
19693 .read = spi_chip_read,
19694 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019695 .prepare_access = spi_prepare_io,
19696 .finish_access = spi_finish_io,
Simon Buhrow236a38c2021-11-05 11:48:30 +010019697 },
19698
19699 {
19700 .vendor = "Winbond",
Nico Hubera358b142024-04-14 18:29:06 +020019701 .name = "W25Q64DW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019702 .bustype = BUS_SPI,
19703 .manufacture_id = WINBOND_NEX_ID,
19704 .model_id = WINBOND_NEX_W25Q64_W,
19705 .total_size = 8192,
19706 .page_size = 256,
19707 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019708 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
19709 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nico Hubera358b142024-04-14 18:29:06 +020019710 .tested = TEST_OK_PREW,
19711 .probe = probe_spi_rdid,
19712 .probe_timing = TIMING_ZERO,
19713 .block_erasers =
19714 {
19715 {
19716 .eraseblocks = { {4 * 1024, 2048} },
19717 .block_erase = spi_block_erase_20,
19718 }, {
19719 .eraseblocks = { {32 * 1024, 256} },
19720 .block_erase = spi_block_erase_52,
19721 }, {
19722 .eraseblocks = { {64 * 1024, 128} },
19723 .block_erase = spi_block_erase_d8,
19724 }, {
19725 .eraseblocks = { {8 * 1024 * 1024, 1} },
19726 .block_erase = spi_block_erase_60,
19727 }, {
19728 .eraseblocks = { {8 * 1024 * 1024, 1} },
19729 .block_erase = spi_block_erase_c7,
19730 }
19731 },
19732 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19733 .unlock = spi_disable_blockprotect,
19734 .write = spi_chip_write_256,
19735 .read = spi_chip_read,
19736 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
19737 .reg_bits =
19738 {
19739 .srp = {STATUS1, 7, RW},
19740 .srl = {STATUS2, 0, RW},
19741 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19742 .tb = {STATUS1, 5, RW},
19743 .sec = {STATUS1, 6, RW},
19744 .cmp = {STATUS2, 6, RW},
19745 },
19746 .wp_write_cfg = spi_wp_write_cfg,
19747 .wp_read_cfg = spi_wp_read_cfg,
19748 .wp_get_ranges = spi_wp_get_available_ranges,
19749 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019750 .prepare_access = spi_prepare_io,
19751 .finish_access = spi_finish_io,
Nico Hubera358b142024-04-14 18:29:06 +020019752 },
19753
19754 {
19755 .vendor = "Winbond",
19756 .name = "W25Q64FW/W25Q64JW...Q",
19757 .bustype = BUS_SPI,
19758 .manufacture_id = WINBOND_NEX_ID,
19759 .model_id = WINBOND_NEX_W25Q64_W,
19760 .total_size = 8192,
19761 .page_size = 256,
19762 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019763 /* FEATURE_QPI_SRP (2, 4, 6, 8): only FW version */
Nico Hubera358b142024-04-14 18:29:06 +020019764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
Nico Huber1412d9f2024-01-06 18:25:49 +010019765 FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030019766 .tested = TEST_OK_PREWB,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019767 .probe = probe_spi_rdid,
19768 .probe_timing = TIMING_ZERO,
19769 .block_erasers =
19770 {
19771 {
19772 .eraseblocks = { {4 * 1024, 2048} },
19773 .block_erase = spi_block_erase_20,
19774 }, {
19775 .eraseblocks = { {32 * 1024, 256} },
19776 .block_erase = spi_block_erase_52,
19777 }, {
19778 .eraseblocks = { {64 * 1024, 128} },
19779 .block_erase = spi_block_erase_d8,
19780 }, {
19781 .eraseblocks = { {8 * 1024 * 1024, 1} },
19782 .block_erase = spi_block_erase_60,
19783 }, {
19784 .eraseblocks = { {8 * 1024 * 1024, 1} },
19785 .block_erase = spi_block_erase_c7,
19786 }
19787 },
19788 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19789 .unlock = spi_disable_blockprotect,
19790 .write = spi_chip_write_256,
19791 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019792 .voltage = {1700, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019793 .reg_bits =
19794 {
Nico Huber2133f592024-01-06 18:30:01 +010019795 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019796 .srp = {STATUS1, 7, RW},
19797 .srl = {STATUS2, 0, RW},
19798 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19799 .tb = {STATUS1, 5, RW},
19800 .sec = {STATUS1, 6, RW},
19801 .cmp = {STATUS2, 6, RW},
19802 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019803 .wp_write_cfg = spi_wp_write_cfg,
19804 .wp_read_cfg = spi_wp_read_cfg,
19805 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019806 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019807 .prepare_access = spi_prepare_io,
19808 .finish_access = spi_finish_io,
Antony Rheneus0fbba982011-05-26 14:28:51 +000019809 },
19810
19811 {
19812 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019813 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080019814 .bustype = BUS_SPI,
19815 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019816 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080019817 .total_size = 8192,
19818 .page_size = 256,
19819 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19820 /* QPI enable 0x38, disable 0xFF */
Nico Huber1412d9f2024-01-06 18:25:49 +010019821 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19822 FEATURE_OTP | FEATURE_QPI_SRP,
19823 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Scott Chao1bbc5012020-04-08 22:10:50 +080019824 .tested = TEST_OK_PREW,
19825 .probe = probe_spi_rdid,
19826 .probe_timing = TIMING_ZERO,
19827 .block_erasers =
19828 {
19829 {
19830 .eraseblocks = { {4 * 1024, 2048} },
19831 .block_erase = spi_block_erase_20,
19832 }, {
19833 .eraseblocks = { {32 * 1024, 256} },
19834 .block_erase = spi_block_erase_52,
19835 }, {
19836 .eraseblocks = { {64 * 1024, 128} },
19837 .block_erase = spi_block_erase_d8,
19838 }, {
19839 .eraseblocks = { {8 * 1024 * 1024, 1} },
19840 .block_erase = spi_block_erase_60,
19841 }, {
19842 .eraseblocks = { {8 * 1024 * 1024, 1} },
19843 .block_erase = spi_block_erase_c7,
19844 }
19845 },
19846 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19847 .unlock = spi_disable_blockprotect,
19848 .write = spi_chip_write_256,
19849 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019850 .voltage = {1700, 1950},
Evan Benn29c8b5d2022-09-13 16:01:10 +100019851 .reg_bits =
19852 {
Nico Huber2133f592024-01-06 18:30:01 +010019853 .qe = {STATUS2, 1, RW},
Evan Benn29c8b5d2022-09-13 16:01:10 +100019854 .srp = {STATUS1, 7, RW},
19855 .srl = {STATUS2, 0, RW},
19856 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19857 .tb = {STATUS1, 5, RW},
19858 .sec = {STATUS1, 6, RW},
19859 .cmp = {STATUS2, 6, RW},
19860 .wps = {STATUS3, 2, RW},
19861 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019862 .wp_write_cfg = spi_wp_write_cfg,
19863 .wp_read_cfg = spi_wp_read_cfg,
19864 .wp_get_ranges = spi_wp_get_available_ranges,
Evan Benn29c8b5d2022-09-13 16:01:10 +100019865 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020019866 .prepare_access = spi_prepare_io,
19867 .finish_access = spi_finish_io,
Scott Chao1bbc5012020-04-08 22:10:50 +080019868 },
19869
19870 {
19871 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019872 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020019873 .bustype = BUS_SPI,
19874 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019875 .model_id = WINBOND_NEX_W25Q80_V,
19876 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020019877 .page_size = 256,
19878 /* supports SFDP */
19879 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019880 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
David Hendricks48729d32017-12-08 14:44:07 -080019881 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020019882 .probe = probe_spi_rdid,
19883 .probe_timing = TIMING_ZERO,
19884 .block_erasers =
19885 {
19886 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019887 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019888 .block_erase = spi_block_erase_20,
19889 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019890 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019891 .block_erase = spi_block_erase_52,
19892 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019893 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019894 .block_erase = spi_block_erase_d8,
19895 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019896 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019897 .block_erase = spi_block_erase_60,
19898 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019899 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019900 .block_erase = spi_block_erase_c7,
19901 }
19902 },
Nico Huber2133f592024-01-06 18:30:01 +010019903 .reg_bits =
19904 {
19905 .qe = {STATUS2, 1, RW},
19906 },
Nico Huber70eed9f2017-04-24 22:19:27 +020019907 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19908 .unlock = spi_disable_blockprotect,
19909 .write = spi_chip_write_256,
19910 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019911 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020019912 .prepare_access = spi_prepare_io,
19913 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019914 },
19915
19916 {
19917 .vendor = "Winbond",
19918 .name = "W25Q80BW",
19919 .bustype = BUS_SPI,
19920 .manufacture_id = WINBOND_NEX_ID,
19921 .model_id = WINBOND_NEX_W25Q80BW,
19922 .total_size = 1024,
19923 .page_size = 256,
19924 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019925 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019926 .tested = TEST_OK_PREW,
19927 .probe = probe_spi_rdid,
19928 .probe_timing = TIMING_ZERO,
19929 .block_erasers =
19930 {
19931 {
19932 .eraseblocks = { {4 * 1024, 256} },
19933 .block_erase = spi_block_erase_20,
19934 }, {
19935 .eraseblocks = { {32 * 1024, 32} },
19936 .block_erase = spi_block_erase_52,
19937 }, {
19938 .eraseblocks = { {64 * 1024, 16} },
19939 .block_erase = spi_block_erase_d8,
19940 }, {
19941 .eraseblocks = { {1 * 1024 * 1024, 1} },
19942 .block_erase = spi_block_erase_60,
19943 }, {
19944 .eraseblocks = { {1 * 1024 * 1024, 1} },
19945 .block_erase = spi_block_erase_c7,
19946 }
19947 },
Nico Huber2133f592024-01-06 18:30:01 +010019948 .reg_bits =
19949 {
19950 .qe = {STATUS2, 1, RW},
19951 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019952 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19953 .unlock = spi_disable_blockprotect,
19954 .write = spi_chip_write_256,
19955 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019956 .voltage = {1700, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020019957 .prepare_access = spi_prepare_io,
19958 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019959 },
19960
19961 {
19962 .vendor = "Winbond",
19963 .name = "W25Q80EW",
19964 .bustype = BUS_SPI,
19965 .manufacture_id = WINBOND_NEX_ID,
19966 .model_id = WINBOND_NEX_W25Q80EW,
19967 .total_size = 1024,
19968 .page_size = 256,
19969 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019970 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
19971 FEATURE_OTP | FEATURE_QPI_SRP,
19972 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019973 .tested = TEST_OK_PREW,
19974 .probe = probe_spi_rdid,
19975 .probe_timing = TIMING_ZERO,
19976 .block_erasers =
19977 {
19978 {
19979 .eraseblocks = { {4 * 1024, 256} },
19980 .block_erase = spi_block_erase_20,
19981 }, {
19982 .eraseblocks = { {32 * 1024, 32} },
19983 .block_erase = spi_block_erase_52,
19984 }, {
19985 .eraseblocks = { {64 * 1024, 16} },
19986 .block_erase = spi_block_erase_d8,
19987 }, {
19988 .eraseblocks = { {1 * 1024 * 1024, 1} },
19989 .block_erase = spi_block_erase_60,
19990 }, {
19991 .eraseblocks = { {1 * 1024 * 1024, 1} },
19992 .block_erase = spi_block_erase_c7,
19993 }
19994 },
Nico Huber2133f592024-01-06 18:30:01 +010019995 .reg_bits =
19996 {
19997 .qe = {STATUS2, 1, RW},
19998 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019999 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20000 .unlock = spi_disable_blockprotect,
20001 .write = spi_chip_write_256,
20002 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010020003 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020020004 .prepare_access = spi_prepare_io,
20005 .finish_access = spi_finish_io,
Nico Huber70eed9f2017-04-24 22:19:27 +020020006 },
20007
20008 {
20009 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020010 .name = "W25X05",
20011 .bustype = BUS_SPI,
20012 .manufacture_id = WINBOND_NEX_ID,
20013 .model_id = WINBOND_NEX_W25X05,
20014 .total_size = 64,
20015 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020016 /* FEATURE_FAST_READ_DIO since W25X05B */
20017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020018 .tested = TEST_OK_PREW,
20019 .probe = probe_spi_rdid,
20020 .probe_timing = TIMING_ZERO,
20021 .block_erasers =
20022 {
20023 {
20024 .eraseblocks = { {4 * 1024, 16} },
20025 .block_erase = spi_block_erase_20,
20026 }, {
20027 .eraseblocks = { {32 * 1024, 2} },
20028 .block_erase = spi_block_erase_52,
20029 }, {
20030 .eraseblocks = { {64 * 1024, 1} },
20031 .block_erase = spi_block_erase_d8,
20032 }
20033 },
20034 .printlock = spi_prettyprint_status_register_plain,
20035 .unlock = spi_disable_blockprotect,
20036 .write = spi_chip_write_256,
20037 .read = spi_chip_read,
20038 .voltage = {2300, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020039 .prepare_access = spi_prepare_io,
20040 .finish_access = spi_finish_io,
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040020041 },
20042
20043 {
20044 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020045 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020046 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020047 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020048 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020049 .total_size = 128,
20050 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020051 /* FEATURE_FAST_READ_DIO since W25X10B */
20052 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunere34e3e82013-01-01 00:06:51 +000020053 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020054 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020055 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020056 .block_erasers =
20057 {
20058 {
20059 .eraseblocks = { {4 * 1024, 32} },
20060 .block_erase = spi_block_erase_20,
20061 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020062 .eraseblocks = { {64 * 1024, 2} },
20063 .block_erase = spi_block_erase_d8,
20064 }, {
20065 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020066 .block_erase = spi_block_erase_c7,
20067 }
20068 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020069 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020070 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000020071 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020072 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020073 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020074 .prepare_access = spi_prepare_io,
20075 .finish_access = spi_finish_io,
FENG yu ningff692fb2008-12-08 18:15:10 +000020076 },
20077
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020078 {
20079 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020080 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020081 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000020082 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020083 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000020084 .total_size = 2048,
20085 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020086 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner8179be52011-06-04 13:13:34 +000020087 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000020088 .probe = probe_spi_rdid,
20089 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020090 .block_erasers =
20091 {
20092 {
20093 .eraseblocks = { {4 * 1024, 512} },
20094 .block_erase = spi_block_erase_20,
20095 }, {
20096 .eraseblocks = { {32 * 1024, 64} },
20097 .block_erase = spi_block_erase_52,
20098 }, {
20099 .eraseblocks = { {64 * 1024, 32} },
20100 .block_erase = spi_block_erase_d8,
20101 }, {
20102 .eraseblocks = { {2 * 1024 * 1024, 1} },
20103 .block_erase = spi_block_erase_60,
20104 }, {
20105 .eraseblocks = { {2 * 1024 * 1024, 1} },
20106 .block_erase = spi_block_erase_c7,
20107 }
20108 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020109 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020110 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000020111 .write = spi_chip_write_256,
20112 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020113 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020114 .prepare_access = spi_prepare_io,
20115 .finish_access = spi_finish_io,
Hector Martina721ae22009-07-11 19:39:11 +000020116 },
20117
20118 {
20119 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020120 .name = "W25X20",
20121 .bustype = BUS_SPI,
20122 .manufacture_id = WINBOND_NEX_ID,
20123 .model_id = WINBOND_NEX_W25X20,
20124 .total_size = 256,
20125 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020126 /* FEATURE_FAST_READ_DIO since W25X20B */
20127 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020128 .tested = TEST_OK_PREW,
20129 .probe = probe_spi_rdid,
20130 .probe_timing = TIMING_ZERO,
20131 .block_erasers =
20132 {
20133 {
20134 .eraseblocks = { {4 * 1024, 64} },
20135 .block_erase = spi_block_erase_20,
20136 }, {
20137 .eraseblocks = { {64 * 1024, 4} },
20138 .block_erase = spi_block_erase_d8,
20139 }, {
20140 .eraseblocks = { {256 * 1024, 1} },
20141 .block_erase = spi_block_erase_c7,
20142 }
20143 },
20144 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20145 .unlock = spi_disable_blockprotect,
20146 .write = spi_chip_write_256,
20147 .read = spi_chip_read,
20148 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020149 .prepare_access = spi_prepare_io,
20150 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020151 },
20152
20153 {
20154 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020155 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020156 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000020157 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020158 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000020159 .total_size = 4096,
20160 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020161 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000020162 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000020163 .probe = probe_spi_rdid,
20164 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020165 .block_erasers =
20166 {
20167 {
20168 .eraseblocks = { {4 * 1024, 1024} },
20169 .block_erase = spi_block_erase_20,
20170 }, {
20171 .eraseblocks = { {32 * 1024, 128} },
20172 .block_erase = spi_block_erase_52,
20173 }, {
20174 .eraseblocks = { {64 * 1024, 64} },
20175 .block_erase = spi_block_erase_d8,
20176 }, {
20177 .eraseblocks = { {4 * 1024 * 1024, 1} },
20178 .block_erase = spi_block_erase_60,
20179 }, {
20180 .eraseblocks = { {4 * 1024 * 1024, 1} },
20181 .block_erase = spi_block_erase_c7,
20182 }
20183 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020184 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020185 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000020186 .write = spi_chip_write_256,
20187 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020188 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020189 .prepare_access = spi_prepare_io,
20190 .finish_access = spi_finish_io,
Zheng Bao1db2b752009-11-26 11:05:01 +000020191 },
20192
20193 {
20194 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020195 .name = "W25X40",
20196 .bustype = BUS_SPI,
20197 .manufacture_id = WINBOND_NEX_ID,
20198 .model_id = WINBOND_NEX_W25X40,
20199 .total_size = 512,
20200 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020201 /* FEATURE_FAST_READ_DIO since W25X40B */
20202 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020203 .tested = TEST_OK_PREW,
20204 .probe = probe_spi_rdid,
20205 .probe_timing = TIMING_ZERO,
20206 .block_erasers =
20207 {
20208 {
20209 .eraseblocks = { {4 * 1024, 128} },
20210 .block_erase = spi_block_erase_20,
20211 }, {
20212 .eraseblocks = { {64 * 1024, 8} },
20213 .block_erase = spi_block_erase_d8,
20214 }, {
20215 .eraseblocks = { {512 * 1024, 1} },
20216 .block_erase = spi_block_erase_c7,
20217 }
20218 },
20219 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20220 .unlock = spi_disable_blockprotect,
20221 .write = spi_chip_write_256,
20222 .read = spi_chip_read,
20223 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020224 .prepare_access = spi_prepare_io,
20225 .finish_access = spi_finish_io,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020226 },
20227
20228 {
20229 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020230 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020231 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000020232 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020233 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000020234 .total_size = 8192,
20235 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020236 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020237 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000020238 .probe = probe_spi_rdid,
20239 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020240 .block_erasers =
20241 {
20242 {
20243 .eraseblocks = { {4 * 1024, 2048} },
20244 .block_erase = spi_block_erase_20,
20245 }, {
20246 .eraseblocks = { {32 * 1024, 256} },
20247 .block_erase = spi_block_erase_52,
20248 }, {
20249 .eraseblocks = { {64 * 1024, 128} },
20250 .block_erase = spi_block_erase_d8,
20251 }, {
20252 .eraseblocks = { {8 * 1024 * 1024, 1} },
20253 .block_erase = spi_block_erase_60,
20254 }, {
20255 .eraseblocks = { {8 * 1024 * 1024, 1} },
20256 .block_erase = spi_block_erase_c7,
20257 }
20258 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020259 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020260 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000020261 .write = spi_chip_write_256,
20262 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020263 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020264 .prepare_access = spi_prepare_io,
20265 .finish_access = spi_finish_io,
Zheng Bao1db2b752009-11-26 11:05:01 +000020266 },
20267
20268 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100020269 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020270 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100020271 .bustype = BUS_SPI,
20272 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020273 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020274 .total_size = 1024,
20275 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020276 /* FEATURE_FAST_READ_DIO since W25X80B */
20277 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020278 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020279 .probe = probe_spi_rdid,
20280 .probe_timing = TIMING_ZERO,
20281 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020282 {
20283 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020284 .eraseblocks = { {4 * 1024, 256} },
20285 .block_erase = spi_block_erase_20,
20286 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020287 .eraseblocks = { {64 * 1024, 16} },
20288 .block_erase = spi_block_erase_d8,
20289 }, {
20290 .eraseblocks = { {1024 * 1024, 1} },
20291 .block_erase = spi_block_erase_c7,
20292 }
20293 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100020294 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20295 .unlock = spi_disable_blockprotect,
20296 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020297 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020298 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020020299 .prepare_access = spi_prepare_io,
20300 .finish_access = spi_finish_io,
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020301 },
20302
Alan Greenf29ea362019-06-27 17:14:02 +100020303 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
20304 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000020305 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020306 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020307 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020308 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020309 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020310 .total_size = 128,
20311 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020312 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000020313 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020314 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020315 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020316 .block_erasers =
20317 {
20318 {
20319 .eraseblocks = { {128 * 1024, 1} },
20320 .block_erase = erase_chip_block_jedec,
20321 }
20322 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020323 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020324 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020325 .prepare_access = prepare_memory_access,
20326 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020327 },
20328
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020329 {
20330 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020331 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
20332 .bustype = BUS_PARALLEL,
20333 .manufacture_id = WINBOND_ID,
20334 .model_id = WINBOND_W29C010,
20335 .total_size = 128,
20336 .page_size = 128,
20337 .feature_bits = FEATURE_LONG_RESET,
20338 .tested = TEST_OK_PREW,
20339 .probe = probe_w29ee011,
20340 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
20341 .block_erasers =
20342 {
20343 {
20344 .eraseblocks = { {128 * 1024, 1} },
20345 .block_erase = erase_chip_block_jedec,
20346 }
20347 },
20348 .write = write_jedec,
20349 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020350 .prepare_access = prepare_memory_access,
20351 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020352 },
20353
20354 {
20355 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020356 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020357 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020358 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020359 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020360 .total_size = 256,
20361 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020362 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020363 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020364 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020365 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020366 .block_erasers =
20367 {
20368 {
20369 .eraseblocks = { {256 * 1024, 1} },
20370 .block_erase = erase_chip_block_jedec,
20371 }
20372 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020373 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020374 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020375 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020376 .prepare_access = prepare_memory_access,
20377 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020378 },
20379
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020380 {
20381 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020382 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020383 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020384 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020385 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020386 .total_size = 512,
20387 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000020388 .feature_bits = FEATURE_LONG_RESET,
20389 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020390 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020391 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020392 .block_erasers =
20393 {
20394 {
20395 .eraseblocks = { {512 * 1024, 1} },
20396 .block_erase = erase_chip_block_jedec,
20397 }
20398 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020399 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020401 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020402 .prepare_access = prepare_memory_access,
20403 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020404 },
20405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020406 {
20407 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020408 .name = "W29C512A/W29EE512",
20409 .bustype = BUS_PARALLEL,
20410 .manufacture_id = WINBOND_ID,
20411 .model_id = WINBOND_W29C512A,
20412 .total_size = 64,
20413 .page_size = 128,
20414 .feature_bits = FEATURE_LONG_RESET,
20415 .tested = TEST_OK_PREW,
20416 .probe = probe_jedec,
20417 .probe_timing = 10,
20418 .block_erasers =
20419 {
20420 {
20421 .eraseblocks = { {64 * 1024, 1} },
20422 .block_erase = erase_chip_block_jedec,
20423 }
20424 },
20425 .write = write_jedec,
20426 .read = read_memmapped,
20427 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020428 .prepare_access = prepare_memory_access,
20429 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020430 },
20431
20432 {
20433 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020434 .name = "W29GL032CB",
20435 .bustype = BUS_PARALLEL,
20436 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20437 .model_id = WINBOND_W29GL032CB,
20438 .total_size = 4096,
20439 .page_size = 128 * 1024, /* actual page size is 16 */
20440 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20441 .tested = TEST_UNTESTED,
20442 .probe = probe_jedec_29gl,
20443 .probe_timing = TIMING_ZERO,
20444 .block_erasers =
20445 {
20446 {
20447 .eraseblocks = {
20448 {8 * 1024, 8},
20449 {64 * 1024, 63},
20450 },
20451 .block_erase = erase_sector_jedec,
20452 }, {
20453 .eraseblocks = { {4 * 1024 * 1024, 1} },
20454 .block_erase = erase_chip_block_jedec,
20455 },
20456 },
20457 .write = write_jedec_1,
20458 .read = read_memmapped,
20459 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020460 .prepare_access = prepare_memory_access,
20461 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020462 },
20463
20464 {
20465 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020466 .name = "W29GL032CH/L",
20467 .bustype = BUS_PARALLEL,
20468 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20469 .model_id = WINBOND_W29GL032CHL,
20470 .total_size = 4096,
20471 .page_size = 128 * 1024, /* actual page size is 16 */
20472 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20473 .tested = TEST_UNTESTED,
20474 .probe = probe_jedec_29gl,
20475 .probe_timing = TIMING_ZERO,
20476 .block_erasers =
20477 {
20478 {
20479 .eraseblocks = { {64 * 1024, 64} },
20480 .block_erase = erase_sector_jedec,
20481 }, {
20482 .eraseblocks = { {4 * 1024 * 1024, 1} },
20483 .block_erase = erase_chip_block_jedec,
20484 },
20485 },
20486 .write = write_jedec_1,
20487 .read = read_memmapped,
20488 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020489 .prepare_access = prepare_memory_access,
20490 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020491 },
20492
20493 {
20494 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020495 .name = "W29GL032CT",
20496 .bustype = BUS_PARALLEL,
20497 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20498 .model_id = WINBOND_W29GL032CT,
20499 .total_size = 4096,
20500 .page_size = 128 * 1024, /* actual page size is 16 */
20501 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20502 .tested = TEST_UNTESTED,
20503 .probe = probe_jedec_29gl,
20504 .probe_timing = TIMING_ZERO,
20505 .block_erasers =
20506 {
20507 {
20508 .eraseblocks = {
20509 {64 * 1024, 63},
20510 {8 * 1024, 8},
20511 },
20512 .block_erase = erase_sector_jedec,
20513 }, {
20514 .eraseblocks = { {4 * 1024 * 1024, 1} },
20515 .block_erase = erase_chip_block_jedec,
20516 },
20517 },
20518 .write = write_jedec_1,
20519 .read = read_memmapped,
20520 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020521 .prepare_access = prepare_memory_access,
20522 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020523 },
20524
20525 {
20526 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020527 .name = "W29GL064CB",
20528 .bustype = BUS_PARALLEL,
20529 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20530 .model_id = WINBOND_W29GL064CB,
20531 .total_size = 8192,
20532 .page_size = 128 * 1024, /* actual page size is 16 */
20533 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20534 .tested = TEST_UNTESTED,
20535 .probe = probe_jedec_29gl,
20536 .probe_timing = TIMING_ZERO,
20537 .block_erasers =
20538 {
20539 {
20540 .eraseblocks = {
20541 {8 * 1024, 8},
20542 {64 * 1024, 127},
20543 },
20544 .block_erase = erase_sector_jedec,
20545 }, {
20546 .eraseblocks = { {8 * 1024 * 1024, 1} },
20547 .block_erase = erase_chip_block_jedec,
20548 },
20549 },
20550 .write = write_jedec_1,
20551 .read = read_memmapped,
20552 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020553 .prepare_access = prepare_memory_access,
20554 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020555 },
20556
20557 {
20558 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020559 .name = "W29GL064CH/L",
20560 .bustype = BUS_PARALLEL,
20561 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20562 .model_id = WINBOND_W29GL064CHL,
20563 .total_size = 8192,
20564 .page_size = 128 * 1024, /* actual page size is 16 */
20565 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20566 .tested = TEST_UNTESTED,
20567 .probe = probe_jedec_29gl,
20568 .probe_timing = TIMING_ZERO,
20569 .block_erasers =
20570 {
20571 {
20572 .eraseblocks = { {64 * 1024, 128} },
20573 .block_erase = erase_sector_jedec,
20574 }, {
20575 .eraseblocks = { {8 * 1024 * 1024, 1} },
20576 .block_erase = erase_chip_block_jedec,
20577 },
20578 },
20579 .write = write_jedec_1,
20580 .read = read_memmapped,
20581 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020582 .prepare_access = prepare_memory_access,
20583 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020584 },
20585
20586 {
20587 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020588 .name = "W29GL064CT",
20589 .bustype = BUS_PARALLEL,
20590 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20591 .model_id = WINBOND_W29GL064CT,
20592 .total_size = 8192,
20593 .page_size = 128 * 1024, /* actual page size is 16 */
20594 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20595 .tested = TEST_UNTESTED,
20596 .probe = probe_jedec_29gl,
20597 .probe_timing = TIMING_ZERO,
20598 .block_erasers =
20599 {
20600 {
20601 .eraseblocks = {
20602 {64 * 1024, 127},
20603 {8 * 1024, 8},
20604 },
20605 .block_erase = erase_sector_jedec,
20606 }, {
20607 .eraseblocks = { {8 * 1024 * 1024, 1} },
20608 .block_erase = erase_chip_block_jedec,
20609 },
20610 },
20611 .write = write_jedec_1,
20612 .read = read_memmapped,
20613 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020614 .prepare_access = prepare_memory_access,
20615 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020616 },
20617
20618 {
20619 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020620 .name = "W29GL128C",
20621 .bustype = BUS_PARALLEL,
20622 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20623 .model_id = WINBOND_W29GL128CHL,
20624 .total_size = 16384,
20625 .page_size = 128 * 1024, /* actual page size is 16 */
20626 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20627 .tested = TEST_UNTESTED,
20628 .probe = probe_jedec_29gl,
20629 .probe_timing = TIMING_ZERO,
20630 .block_erasers =
20631 {
20632 {
20633 .eraseblocks = { {128 * 1024, 128} },
20634 .block_erase = erase_sector_jedec,
20635 }, {
20636 .eraseblocks = { {16 * 1024 * 1024, 1} },
20637 .block_erase = erase_chip_block_jedec,
20638 },
20639 },
20640 .write = write_jedec_1,
20641 .read = read_memmapped,
20642 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020643 .prepare_access = prepare_memory_access,
20644 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020645 },
20646
20647 {
20648 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020649 .name = "W39F010",
20650 .bustype = BUS_PARALLEL,
20651 .manufacture_id = WINBOND_ID,
20652 .model_id = WINBOND_W39F010,
20653 .total_size = 128,
20654 .page_size = 4 * 1024,
20655 .feature_bits = FEATURE_EITHER_RESET,
20656 .tested = TEST_OK_PREW,
20657 .probe = probe_jedec,
20658 .probe_timing = 10,
20659 .block_erasers =
20660 {
20661 {
20662 .eraseblocks = { {4 * 1024, 32} },
20663 .block_erase = erase_block_jedec,
20664 }, {
20665 .eraseblocks = { {128 * 1024, 1} },
20666 .block_erase = erase_chip_block_jedec,
20667 }
20668 },
20669 .printlock = printlock_w39f010,
20670 .write = write_jedec_1,
20671 .read = read_memmapped,
20672 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020673 .prepare_access = prepare_memory_access,
20674 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020675 },
20676
20677 {
20678 .vendor = "Winbond",
20679 .name = "W39L010",
20680 .bustype = BUS_PARALLEL,
20681 .manufacture_id = WINBOND_ID,
20682 .model_id = WINBOND_W39L010,
20683 .total_size = 128,
20684 .page_size = 4 * 1024,
20685 .feature_bits = FEATURE_EITHER_RESET,
20686 .tested = TEST_UNTESTED,
20687 .probe = probe_jedec,
20688 .probe_timing = 10,
20689 .block_erasers =
20690 {
20691 {
20692 .eraseblocks = { {4 * 1024, 32} },
20693 .block_erase = erase_block_jedec,
20694 }, {
20695 .eraseblocks = { {128 * 1024, 1} },
20696 .block_erase = erase_chip_block_jedec,
20697 }
20698 },
20699 .printlock = printlock_w39l010,
20700 .write = write_jedec_1,
20701 .read = read_memmapped,
20702 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020703 .prepare_access = prepare_memory_access,
20704 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020705 },
20706
20707 {
20708 .vendor = "Winbond",
20709 .name = "W39L020",
20710 .bustype = BUS_PARALLEL,
20711 .manufacture_id = WINBOND_ID,
20712 .model_id = WINBOND_W39L020,
20713 .total_size = 256,
20714 .page_size = 4 * 1024,
20715 .feature_bits = FEATURE_EITHER_RESET,
20716 .tested = TEST_UNTESTED,
20717 .probe = probe_jedec,
20718 .probe_timing = 10,
20719 .block_erasers =
20720 {
20721 {
20722 .eraseblocks = { {4 * 1024, 64} },
20723 .block_erase = erase_block_jedec,
20724 }, {
20725 .eraseblocks = { {64 * 1024, 4} },
20726 .block_erase = erase_sector_jedec,
20727 }, {
20728 .eraseblocks = { {256 * 1024, 1} },
20729 .block_erase = erase_chip_block_jedec,
20730 }
20731 },
20732 .printlock = printlock_w39l020,
20733 .write = write_jedec_1,
20734 .read = read_memmapped,
20735 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020736 .prepare_access = prepare_memory_access,
20737 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020738 },
20739
20740 {
20741 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000020742 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020743 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020744 .manufacture_id = WINBOND_ID,
20745 .model_id = WINBOND_W39L040,
20746 .total_size = 512,
20747 .page_size = 64 * 1024,
20748 .feature_bits = FEATURE_EITHER_RESET,
20749 .tested = TEST_OK_PR,
20750 .probe = probe_jedec,
20751 .probe_timing = 10,
20752 .block_erasers =
20753 {
20754 {
20755 .eraseblocks = { {4 * 1024, 128} },
20756 .block_erase = erase_block_jedec,
20757 }, {
20758 .eraseblocks = { {64 * 1024, 8} },
20759 .block_erase = erase_sector_jedec,
20760 }, {
20761 .eraseblocks = { {512 * 1024, 1} },
20762 .block_erase = erase_chip_block_jedec,
20763 }
20764 },
20765 .printlock = printlock_w39l040,
20766 .write = write_jedec_1,
20767 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020768 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020769 .prepare_access = prepare_memory_access,
20770 .finish_access = finish_memory_access,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020771 },
20772
20773 {
20774 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020775 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020776 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020777 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020778 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020779 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020780 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020781 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000020782 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020783 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000020784 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020785 .block_erasers =
20786 {
20787 {
20788 .eraseblocks = { {64 * 1024, 8} },
20789 .block_erase = erase_sector_jedec,
20790 }, {
20791 .eraseblocks = { {512 * 1024, 1} },
20792 .block_erase = erase_chip_block_jedec,
20793 }
20794 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020795 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000020796 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020797 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020798 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020799 .prepare_access = prepare_memory_access,
20800 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020801 },
20802
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020803 {
20804 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020805 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020806 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020807 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020808 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020809 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020810 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020811 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020812 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020813 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000020814 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020815 .block_erasers =
20816 {
20817 {
20818 .eraseblocks = { {64 * 1024, 8} },
20819 .block_erase = erase_sector_jedec,
20820 }, {
20821 .eraseblocks = { {512 * 1024, 1} },
20822 .block_erase = erase_chip_block_jedec,
20823 }
20824 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020825 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000020826 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020827 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020828 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020829 .prepare_access = prepare_memory_access,
20830 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020831 },
20832
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020833 {
20834 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020835 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020836 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020837 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020838 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020839 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020840 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020841 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020842 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000020843 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020844 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020845 .block_erasers =
20846 {
20847 {
20848 .eraseblocks = { {64 * 1024, 8} },
20849 .block_erase = erase_sector_jedec,
20850 }, {
20851 .eraseblocks = { {512 * 1024, 1} },
20852 .block_erase = erase_chip_block_jedec,
20853 }
20854 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000020855 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000020856 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020857 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020858 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020859 .prepare_access = prepare_memory_access,
20860 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020861 },
20862
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020863 {
20864 .vendor = "Winbond",
20865 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020866 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020867 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020868 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020869 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020870 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020871 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020872 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020873 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000020874 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020875 .block_erasers =
20876 {
20877 {
20878 .eraseblocks = { {4 * 1024, 128} },
20879 .block_erase = erase_block_jedec,
20880 }, {
20881 .eraseblocks = { {64 * 1024, 8} },
20882 .block_erase = erase_sector_jedec,
20883 }, {
20884 .eraseblocks = { {512 * 1024, 1} },
20885 .block_erase = erase_chip_block_jedec,
20886 }
20887 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020888 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020889 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000020890 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020891 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020892 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010020893 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020894 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020895 },
20896
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020897 {
20898 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020899 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020900 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020901 .manufacture_id = WINBOND_ID,
20902 .model_id = WINBOND_W39V040B,
20903 .total_size = 512,
20904 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020905 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000020906 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020907 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020908 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020909 .block_erasers =
20910 {
20911 {
20912 .eraseblocks = { {64 * 1024, 8} },
20913 .block_erase = erase_sector_jedec,
20914 }, {
20915 .eraseblocks = { {512 * 1024, 1} },
20916 .block_erase = erase_chip_block_jedec,
20917 }
20918 },
20919 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020920 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020921 .write = write_jedec_1,
20922 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020923 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020924 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020925 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020926 },
20927
20928 {
20929 .vendor = "Winbond",
20930 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020931 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020932 .manufacture_id = WINBOND_ID,
20933 .model_id = WINBOND_W39V040C,
20934 .total_size = 512,
20935 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020936 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000020937 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020938 .probe = probe_jedec,
20939 .probe_timing = 10,
20940 .block_erasers =
20941 {
20942 {
20943 .eraseblocks = { {64 * 1024, 8} },
20944 .block_erase = erase_sector_jedec,
20945 }, {
20946 .eraseblocks = { {512 * 1024, 1} },
20947 .block_erase = erase_chip_block_jedec,
20948 }
20949 },
20950 .printlock = printlock_w39v040fc,
20951 .write = write_jedec_1,
20952 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020953 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020954 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020955 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020956 },
20957
20958 {
20959 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020960 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020961 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020962 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020963 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020964 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000020965 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020966 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000020967 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020968 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000020969 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020970 .block_erasers =
20971 {
20972 {
20973 .eraseblocks = { {64 * 1024, 16} },
20974 .block_erase = erase_sector_jedec,
20975 }, {
20976 .eraseblocks = { {1024 * 1024, 1} },
20977 .block_erase = erase_chip_block_jedec,
20978 }
20979 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020980 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000020981 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020982 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020983 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020984 .prepare_access = prepare_memory_access,
20985 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020986 },
20987
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020988 {
20989 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020990 .name = "W39V080FA",
20991 .bustype = BUS_FWH,
20992 .manufacture_id = WINBOND_ID,
20993 .model_id = WINBOND_W39V080FA,
20994 .total_size = 1024,
20995 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020996 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020997 .tested = TEST_OK_PREW,
20998 .probe = probe_jedec,
20999 .probe_timing = 10,
21000 .block_erasers =
21001 {
21002 {
21003 .eraseblocks = { {64 * 1024, 16} },
21004 .block_erase = erase_sector_jedec,
21005 }, {
21006 .eraseblocks = { {1024 * 1024, 1} },
21007 .block_erase = erase_chip_block_jedec,
21008 }
21009 },
21010 .printlock = printlock_w39v080fa,
21011 .unlock = unlock_regspace2_uniform_64k,
21012 .write = write_jedec_1,
21013 .read = read_memmapped,
21014 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021015 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021016 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021017 },
21018
21019 {
21020 .vendor = "Winbond",
21021 .name = "W39V080FA (dual mode)",
21022 .bustype = BUS_FWH,
21023 .manufacture_id = WINBOND_ID,
21024 .model_id = WINBOND_W39V080FA_DM,
21025 .total_size = 512,
21026 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010021027 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021028 .tested = TEST_UNTESTED,
21029 .probe = probe_jedec,
21030 .probe_timing = 10,
21031 .block_erasers =
21032 {
21033 {
21034 .eraseblocks = { {64 * 1024, 8} },
21035 .block_erase = erase_sector_jedec,
21036 }, {
21037 .eraseblocks = { {512 * 1024, 1} },
21038 .block_erase = erase_chip_block_jedec,
21039 }
21040 },
21041 .printlock = printlock_w39v080fa_dual,
21042 .write = write_jedec_1,
21043 .read = read_memmapped,
21044 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010021045 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010021046 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100021047 },
21048
21049 {
21050 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000021051 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021052 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021053 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021054 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021055 .total_size = 256,
21056 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021057 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000021058 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021059 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000021060 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021061 .block_erasers =
21062 {
21063 {
21064 .eraseblocks = {
21065 {128 * 1024, 1},
21066 {96 * 1024, 1},
21067 {8 * 1024, 2},
21068 {16 * 1024, 1},
21069 },
21070 .block_erase = erase_sector_jedec,
21071 }, {
21072 .eraseblocks = { {256 * 1024, 1} },
21073 .block_erase = erase_chip_block_jedec,
21074 }
21075 },
Sean Nelson35727f72010-01-28 23:55:12 +000021076 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021077 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021078 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010021079 .prepare_access = prepare_memory_access,
21080 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021081 },
21082
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021083 {
21084 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021085 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021086 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021087 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021088 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021089 .total_size = 256,
21090 .page_size = 128,
21091 .feature_bits = FEATURE_EITHER_RESET,
21092 .tested = TEST_OK_PROBE,
21093 .probe = probe_jedec,
21094 .probe_timing = 10,
21095 .block_erasers =
21096 {
21097 {
21098 .eraseblocks = { {256 * 1024, 1} },
21099 .block_erase = erase_chip_block_jedec,
21100 }
21101 },
21102 .write = write_jedec_1,
21103 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021104 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010021105 .prepare_access = prepare_memory_access,
21106 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000021107 },
21108
21109 {
21110 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021111 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021112 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021113 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021114 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021115 .total_size = 256,
21116 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021117 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000021118 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021119 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000021120 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021121 .block_erasers =
21122 {
21123 {
21124 .eraseblocks = {
21125 {64 * 1024, 3},
21126 {32 * 1024, 1},
21127 {8 * 1024, 2},
21128 {16 * 1024, 1},
21129 },
21130 .block_erase = erase_sector_jedec,
21131 }, {
21132 .eraseblocks = { {256 * 1024, 1} },
21133 .block_erase = erase_chip_block_jedec,
21134 }
21135 },
Sean Nelson35727f72010-01-28 23:55:12 +000021136 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021137 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021138 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021139 .prepare_access = prepare_memory_access,
21140 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021141 },
21142
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021143 {
21144 .vendor = "Winbond",
21145 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021146 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021147 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000021148 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021149 .total_size = 256,
21150 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000021151 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000021152 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021153 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000021154 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000021155 .block_erasers =
21156 {
21157 {
21158 .eraseblocks = {
21159 {64 * 1024, 3},
21160 {32 * 1024, 1},
21161 {8 * 1024, 2},
21162 {16 * 1024, 1},
21163 },
21164 .block_erase = erase_sector_jedec,
21165 }, {
21166 .eraseblocks = { {256 * 1024, 1} },
21167 .block_erase = erase_chip_block_jedec,
21168 }
21169 },
Sean Nelson35727f72010-01-28 23:55:12 +000021170 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021171 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000021172 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010021173 .prepare_access = prepare_memory_access,
21174 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000021175 },
21176
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021177 {
luke heef884232020-12-28 18:22:21 +080021178 .vendor = "XMC",
21179 .name = "XM25QH128C",
21180 .bustype = BUS_SPI,
21181 .manufacture_id = ST_ID,
21182 .model_id = XMC_XM25QH128C,
21183 .total_size = 16384,
21184 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010021185 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
21186 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021187 .tested = TEST_UNTESTED,
21188 .probe = probe_spi_rdid,
21189 .probe_timing = TIMING_ZERO,
21190 .block_erasers =
21191 {
21192 {
21193 .eraseblocks = { {4 * 1024, 4096} },
21194 .block_erase = spi_block_erase_20,
21195 }, {
21196 .eraseblocks = { {32 * 1024, 512} },
21197 .block_erase = spi_block_erase_52,
21198 }, {
21199 .eraseblocks = { {64 * 1024, 256} },
21200 .block_erase = spi_block_erase_d8,
21201 }, {
21202 .eraseblocks = { {16 * 1024 * 1024, 1} },
21203 .block_erase = spi_block_erase_60,
21204 }, {
21205 .eraseblocks = { {16 * 1024 * 1024, 1} },
21206 .block_erase = spi_block_erase_c7,
21207 }
21208 },
21209 .printlock = spi_prettyprint_status_register_plain,
21210 .unlock = spi_disable_blockprotect,
21211 .write = spi_chip_write_256,
21212 .read = spi_chip_read,
21213 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021214 .reg_bits =
21215 {
Nico Huber96786d02024-01-06 18:30:15 +010021216 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021217 .srp = {STATUS1, 7, RW},
21218 .srl = {STATUS2, 0, RW},
21219 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
21220 .tb = {STATUS1, 5, RW},
21221 .sec = {STATUS1, 6, RW},
21222 .cmp = {STATUS2, 6, RW},
21223 },
Nico Huberaabb3e02023-01-13 00:22:30 +010021224 .wp_write_cfg = spi_wp_write_cfg,
21225 .wp_read_cfg = spi_wp_read_cfg,
21226 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021227 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020021228 .prepare_access = spi_prepare_io,
21229 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021230 },
21231
21232 {
21233 .vendor = "XMC",
21234 .name = "XM25QH256C",
21235 .bustype = BUS_SPI,
21236 .manufacture_id = ST_ID,
21237 .model_id = XMC_XM25QH256C,
21238 .total_size = 32768,
21239 .page_size = 256,
21240 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021241 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21242 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21243 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021244 .tested = TEST_UNTESTED,
21245 .probe = probe_spi_rdid,
21246 .probe_timing = TIMING_ZERO,
21247 .block_erasers =
21248 {
21249 {
21250 .eraseblocks = { {4 * 1024, 8192} },
21251 .block_erase = spi_block_erase_21,
21252 }, {
21253 .eraseblocks = { {4 * 1024, 8192} },
21254 .block_erase = spi_block_erase_20,
21255 }, {
21256 .eraseblocks = { {32 * 1024, 1024} },
21257 .block_erase = spi_block_erase_52,
21258 }, {
21259 .eraseblocks = { {64 * 1024, 512} },
21260 .block_erase = spi_block_erase_dc,
21261 }, {
21262 .eraseblocks = { {64 * 1024, 512} },
21263 .block_erase = spi_block_erase_d8,
21264 }, {
21265 .eraseblocks = { {32 * 1024 * 1024, 1} },
21266 .block_erase = spi_block_erase_60,
21267 }, {
21268 .eraseblocks = { {32 * 1024 * 1024, 1} },
21269 .block_erase = spi_block_erase_c7,
21270 }
21271 },
21272 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21273 .unlock = spi_disable_blockprotect,
21274 .write = spi_chip_write_256,
21275 .read = spi_chip_read,
21276 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021277 .reg_bits =
21278 {
Nico Huber96786d02024-01-06 18:30:15 +010021279 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021280 .srp = {STATUS1, 7, RW},
21281 .srl = {STATUS2, 0, RW},
21282 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
21283 .tb = {STATUS1, 6, RW},
21284 },
Nico Huberaabb3e02023-01-13 00:22:30 +010021285 .wp_write_cfg = spi_wp_write_cfg,
21286 .wp_read_cfg = spi_wp_read_cfg,
21287 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021288 .decode_range = decode_range_spi25,
Nico Huber930d4212024-05-04 18:59:15 +020021289 .prepare_access = spi_prepare_io,
21290 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021291 },
21292
21293 {
21294 .vendor = "XMC",
21295 .name = "XM25QH64C",
21296 .bustype = BUS_SPI,
21297 .manufacture_id = ST_ID,
21298 .model_id = XMC_XM25QH64C,
21299 .total_size = 8192,
21300 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021301 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021302 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021303 .tested = TEST_UNTESTED,
21304 .probe = probe_spi_rdid,
21305 .probe_timing = TIMING_ZERO,
21306 .block_erasers =
21307 {
21308 {
21309 .eraseblocks = { {4 * 1024, 2048} },
21310 .block_erase = spi_block_erase_20,
21311 }, {
21312 .eraseblocks = { {32 * 1024, 256} },
21313 .block_erase = spi_block_erase_52,
21314 }, {
21315 .eraseblocks = { {64 * 1024, 128} },
21316 .block_erase = spi_block_erase_d8,
21317 }, {
21318 .eraseblocks = { {8 * 1024 * 1024, 1} },
21319 .block_erase = spi_block_erase_60,
21320 }, {
21321 .eraseblocks = { {8 * 1024 * 1024, 1} },
21322 .block_erase = spi_block_erase_c7,
21323 }
21324 },
Nico Huber96786d02024-01-06 18:30:15 +010021325 .reg_bits =
21326 {
21327 .qe = {STATUS2, 1, RW},
21328 },
luke heef884232020-12-28 18:22:21 +080021329 .printlock = spi_prettyprint_status_register_plain,
21330 .unlock = spi_disable_blockprotect,
21331 .write = spi_chip_write_256,
21332 .read = spi_chip_read,
21333 .voltage = {2700, 3600},
Nico Huber930d4212024-05-04 18:59:15 +020021334 .prepare_access = spi_prepare_io,
21335 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021336 },
21337
21338 {
21339 .vendor = "XMC",
21340 .name = "XM25QU128C",
21341 .bustype = BUS_SPI,
21342 .manufacture_id = ST_ID,
21343 .model_id = XMC_XM25QU128C,
21344 .total_size = 16384,
21345 .page_size = 256,
21346 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021347 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021348 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021349 .tested = TEST_UNTESTED,
21350 .probe = probe_spi_rdid,
21351 .probe_timing = TIMING_ZERO,
21352 .block_erasers =
21353 {
21354 {
21355 .eraseblocks = { {4 * 1024, 4096} },
21356 .block_erase = spi_block_erase_20,
21357 }, {
21358 .eraseblocks = { {32 * 1024, 512} },
21359 .block_erase = spi_block_erase_52,
21360 }, {
21361 .eraseblocks = { {64 * 1024, 256} },
21362 .block_erase = spi_block_erase_d8,
21363 }, {
21364 .eraseblocks = { {16 * 1024 * 1024, 1} },
21365 .block_erase = spi_block_erase_60,
21366 }, {
21367 .eraseblocks = { {16 * 1024 * 1024, 1} },
21368 .block_erase = spi_block_erase_c7,
21369 }
21370 },
Nico Huber96786d02024-01-06 18:30:15 +010021371 .reg_bits =
21372 {
21373 .qe = {STATUS2, 1, RW},
21374 },
luke heef884232020-12-28 18:22:21 +080021375 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21376 .unlock = spi_disable_blockprotect,
21377 .write = spi_chip_write_256,
21378 .read = spi_chip_read,
21379 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021380 .prepare_access = spi_prepare_io,
21381 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021382 },
21383
21384 {
21385 .vendor = "XMC",
21386 .name = "XM25QU256C",
21387 .bustype = BUS_SPI,
21388 .manufacture_id = ST_ID,
21389 .model_id = XMC_XM25QU256C,
21390 .total_size = 32768,
21391 .page_size = 256,
21392 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021393 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21394 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21395 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021396 .tested = TEST_UNTESTED,
21397 .probe = probe_spi_rdid,
21398 .probe_timing = TIMING_ZERO,
21399 .block_erasers =
21400 {
21401 {
21402 .eraseblocks = { {4 * 1024, 8192} },
21403 .block_erase = spi_block_erase_21,
21404 }, {
21405 .eraseblocks = { {4 * 1024, 8192} },
21406 .block_erase = spi_block_erase_20,
21407 }, {
21408 .eraseblocks = { {32 * 1024, 1024} },
21409 .block_erase = spi_block_erase_52,
21410 }, {
21411 .eraseblocks = { {64 * 1024, 512} },
21412 .block_erase = spi_block_erase_dc,
21413 }, {
21414 .eraseblocks = { {64 * 1024, 512} },
21415 .block_erase = spi_block_erase_d8,
21416 }, {
21417 .eraseblocks = { {32 * 1024 * 1024, 1} },
21418 .block_erase = spi_block_erase_60,
21419 }, {
21420 .eraseblocks = { {32 * 1024 * 1024, 1} },
21421 .block_erase = spi_block_erase_c7,
21422 }
21423 },
Nico Huber96786d02024-01-06 18:30:15 +010021424 .reg_bits =
21425 {
21426 .qe = {STATUS2, 1, RW},
21427 },
luke heef884232020-12-28 18:22:21 +080021428 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21429 .unlock = spi_disable_blockprotect,
21430 .write = spi_chip_write_256,
21431 .read = spi_chip_read,
21432 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021433 .prepare_access = spi_prepare_io,
21434 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021435 },
21436
21437 {
21438 .vendor = "XMC",
21439 .name = "XM25QU64C",
21440 .bustype = BUS_SPI,
21441 .manufacture_id = ST_ID,
21442 .model_id = XMC_XM25QU64C,
21443 .total_size = 8192,
21444 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021445 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021446 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021447 .tested = TEST_UNTESTED,
21448 .probe = probe_spi_rdid,
21449 .probe_timing = TIMING_ZERO,
21450 .block_erasers =
21451 {
21452 {
21453 .eraseblocks = { {4 * 1024, 2048} },
21454 .block_erase = spi_block_erase_20,
21455 }, {
21456 .eraseblocks = { {32 * 1024, 256} },
21457 .block_erase = spi_block_erase_52,
21458 }, {
21459 .eraseblocks = { {64 * 1024, 128} },
21460 .block_erase = spi_block_erase_d8,
21461 }, {
21462 .eraseblocks = { {8 * 1024 * 1024, 1} },
21463 .block_erase = spi_block_erase_60,
21464 }, {
21465 .eraseblocks = { {8 * 1024 * 1024, 1} },
21466 .block_erase = spi_block_erase_c7,
21467 }
21468 },
Nico Huber96786d02024-01-06 18:30:15 +010021469 .reg_bits =
21470 {
21471 .qe = {STATUS2, 1, RW},
21472 },
luke heef884232020-12-28 18:22:21 +080021473 .printlock = spi_prettyprint_status_register_plain,
21474 .unlock = spi_disable_blockprotect,
21475 .write = spi_chip_write_256,
21476 .read = spi_chip_read,
21477 .voltage = {1650, 1950},
Nico Huber930d4212024-05-04 18:59:15 +020021478 .prepare_access = spi_prepare_io,
21479 .finish_access = spi_finish_io,
luke heef884232020-12-28 18:22:21 +080021480 },
21481
21482 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100021483 .vendor = "Zetta Device",
21484 .name = "ZD25D20",
21485 .bustype = BUS_SPI,
21486 .manufacture_id = ZETTADEVICE_ID,
21487 .model_id = ZETTADEVICE_ZD25D20,
21488 .total_size = 256,
21489 .page_size = 256,
21490 .feature_bits = FEATURE_WRSR_WREN,
21491 .tested = TEST_UNTESTED,
21492 .probe = probe_spi_rdid,
21493 .probe_timing = TIMING_ZERO,
21494 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080021495 {
21496 {
21497 .eraseblocks = { {4 * 1024, 64} },
21498 .block_erase = spi_block_erase_20,
21499 }, {
21500 .eraseblocks = { {32 * 1024, 8} },
21501 .block_erase = spi_block_erase_52,
21502 }, {
21503 .eraseblocks = { {64 * 1024, 4} },
21504 .block_erase = spi_block_erase_d8,
21505 }, {
21506 .eraseblocks = { {256 * 1024, 1} },
21507 .block_erase = spi_block_erase_60,
21508 }, {
21509 .eraseblocks = { {256 * 1024, 1} },
21510 .block_erase = spi_block_erase_c7,
21511 }
21512 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100021513 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21514 .unlock = spi_disable_blockprotect,
21515 .write = spi_chip_write_256,
21516 .read = spi_chip_read,
21517 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080021518 },
21519
21520 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100021521 .vendor = "Zetta Device",
21522 .name = "ZD25D40",
21523 .bustype = BUS_SPI,
21524 .manufacture_id = ZETTADEVICE_ID,
21525 .model_id = ZETTADEVICE_ZD25D40,
21526 .total_size = 512,
21527 .page_size = 256,
21528 .feature_bits = FEATURE_WRSR_WREN,
21529 .tested = TEST_UNTESTED,
21530 .probe = probe_spi_rdid,
21531 .probe_timing = TIMING_ZERO,
21532 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080021533 {
21534 {
21535 .eraseblocks = { {4 * 1024, 128} },
21536 .block_erase = spi_block_erase_20,
21537 }, {
21538 .eraseblocks = { {32 * 1024, 16} },
21539 .block_erase = spi_block_erase_52,
21540 }, {
21541 .eraseblocks = { {64 * 1024, 8} },
21542 .block_erase = spi_block_erase_d8,
21543 }, {
21544 .eraseblocks = { {512 * 1024, 1} },
21545 .block_erase = spi_block_erase_60,
21546 }, {
21547 .eraseblocks = { {512 * 1024, 1} },
21548 .block_erase = spi_block_erase_c7,
21549 }
21550 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100021551 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21552 .unlock = spi_disable_blockprotect,
21553 .write = spi_chip_write_256,
21554 .read = spi_chip_read,
21555 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080021556 },
21557
Stefan Taunerac1b4c82012-02-17 14:51:04 +000021558 {
Alan Greendd592202019-08-23 10:11:37 +100021559 .vendor = "Unknown",
21560 .name = "SFDP-capable chip",
21561 .bustype = BUS_SPI,
21562 .manufacture_id = GENERIC_MANUF_ID,
21563 .model_id = SFDP_DEVICE_ID,
21564 .total_size = 0, /* set by probing function */
21565 .page_size = 0, /* set by probing function */
21566 .feature_bits = 0, /* set by probing function */
21567 /* We present our own "report this" text hence we do not */
21568 /* want the default "This flash part has status UNTESTED..." */
21569 /* text to be printed. */
21570 .tested = TEST_OK_PREW,
21571 .probe = probe_spi_sfdp,
21572 .block_erasers = {}, /* set by probing function */
21573 .unlock = spi_disable_blockprotect, /* is this safe? */
21574 .write = NULL, /* set by probing function */
21575 .read = spi_chip_read,
21576 /* FIXME: some vendor extensions define this */
21577 .voltage = {0},
21578 },
21579
21580 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000021581 .vendor = "Programmer",
21582 .name = "Opaque flash chip",
21583 .bustype = BUS_PROG,
21584 .manufacture_id = PROGMANUF_ID,
21585 .model_id = PROGDEV_ID,
21586 .total_size = 0,
21587 .page_size = 256,
21588 /* probe is assumed to work, rest will be filled in by probe */
21589 .tested = TEST_OK_PROBE,
21590 .probe = probe_opaque,
21591 /* eraseblock sizes will be set by the probing function */
21592 .block_erasers =
21593 {
21594 {
21595 .block_erase = erase_opaque,
21596 }
21597 },
21598 .write = write_opaque,
21599 .read = read_opaque,
21600 },
21601
21602 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000021603 .vendor = "AMIC",
21604 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021605 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000021606 .manufacture_id = AMIC_ID,
21607 .model_id = GENERIC_DEVICE_ID,
21608 .total_size = 0,
21609 .page_size = 256,
21610 .tested = TEST_BAD_PREW,
21611 .probe = probe_spi_rdid4,
21612 .probe_timing = TIMING_ZERO,
21613 .write = NULL,
21614 .read = NULL,
21615 },
21616
21617 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021618 .vendor = "Atmel",
21619 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021620 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021621 .manufacture_id = ATMEL_ID,
21622 .model_id = GENERIC_DEVICE_ID,
21623 .total_size = 0,
21624 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021625 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021626 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021627 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021628 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021629 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021630 },
21631
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021632 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000021633 .vendor = "Eon",
21634 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021635 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021636 .manufacture_id = EON_ID_NOPREFIX,
21637 .model_id = GENERIC_DEVICE_ID,
21638 .total_size = 0,
21639 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021640 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021641 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021642 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021643 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021644 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021645 },
21646
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021647 {
21648 .vendor = "Macronix",
21649 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021650 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000021651 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021652 .model_id = GENERIC_DEVICE_ID,
21653 .total_size = 0,
21654 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021655 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021656 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021657 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021658 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021659 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021660 },
21661
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021662 {
21663 .vendor = "PMC",
21664 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021665 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021666 .manufacture_id = PMC_ID,
21667 .model_id = GENERIC_DEVICE_ID,
21668 .total_size = 0,
21669 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021670 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021671 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021672 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021673 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021674 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021675 },
21676
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021677 {
21678 .vendor = "SST",
21679 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021680 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021681 .manufacture_id = SST_ID,
21682 .model_id = GENERIC_DEVICE_ID,
21683 .total_size = 0,
21684 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021685 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021686 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021687 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021688 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021689 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021690 },
21691
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021692 {
21693 .vendor = "ST",
21694 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021695 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021696 .manufacture_id = ST_ID,
21697 .model_id = GENERIC_DEVICE_ID,
21698 .total_size = 0,
21699 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021700 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021701 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021702 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021703 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021704 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021705 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000021706
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021707 {
Sean Nelson118e1d62009-11-24 02:08:11 +000021708 .vendor = "Sanyo",
21709 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021710 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000021711 .manufacture_id = SANYO_ID,
21712 .model_id = GENERIC_DEVICE_ID,
21713 .total_size = 0,
21714 .page_size = 256,
21715 .tested = TEST_BAD_PREW,
21716 .probe = probe_spi_rdid,
21717 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000021718 .write = NULL,
21719 .read = NULL,
21720 },
21721
21722 {
Stefan Taunereb582572012-09-21 12:52:50 +000021723 .vendor = "Winbond",
21724 .name = "unknown Winbond (ex Nexcom) SPI chip",
21725 .bustype = BUS_SPI,
21726 .manufacture_id = WINBOND_NEX_ID,
21727 .model_id = GENERIC_DEVICE_ID,
21728 .total_size = 0,
21729 .page_size = 256,
21730 .tested = TEST_BAD_PREW,
21731 .probe = probe_spi_rdid,
21732 .probe_timing = TIMING_ZERO,
21733 .write = NULL,
21734 .read = NULL,
21735 },
21736
21737 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021738 .vendor = "Generic",
21739 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021740 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021741 .manufacture_id = GENERIC_MANUF_ID,
21742 .model_id = GENERIC_DEVICE_ID,
21743 .total_size = 0,
21744 .page_size = 256,
21745 .tested = TEST_BAD_PREW,
21746 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021747 .write = NULL,
21748 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000021749
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021750 {
21751 .vendor = "Generic",
21752 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021753 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021754 .manufacture_id = GENERIC_MANUF_ID,
21755 .model_id = GENERIC_DEVICE_ID,
21756 .total_size = 0,
21757 .page_size = 256,
21758 .tested = TEST_BAD_PREW,
21759 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021760 .write = NULL,
21761 },
21762
Stefan Tauner96658be2014-05-26 22:05:31 +000021763 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000021764};
Stefan Tauner96658be2014-05-26 22:05:31 +000021765
21766const unsigned int flashchips_size = ARRAY_SIZE(flashchips);