blob: 96ecf245584d8605f900b9d23ebc98a1abcef377 [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 */
1374 /* QPI enable 0x35, disable 0xF5 */
1375 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1376 .tested = TEST_UNTESTED,
1377 .probe = probe_spi_rdid,
1378 .probe_timing = TIMING_ZERO,
1379 .block_erasers =
1380 {
1381 {
1382 .eraseblocks = { { 4 * 1024, 2048 } },
1383 .block_erase = spi_block_erase_20,
1384 }, {
1385 .eraseblocks = { { 32 * 1024, 256 } },
1386 .block_erase = spi_block_erase_52,
1387 }, {
1388 .eraseblocks = { { 64 * 1024, 128 } },
1389 .block_erase = spi_block_erase_d8,
1390 }, {
1391 .eraseblocks = { { 8192 * 1024, 1 } },
1392 .block_erase = spi_block_erase_60,
1393 }, {
1394 .eraseblocks = { { 8192 * 1024, 1 } },
1395 .block_erase = spi_block_erase_c7,
1396 }
1397 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001398 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001399 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001400 .write = spi_chip_write_256,
1401 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001402 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001403 },
1404
1405 {
1406 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001407 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001408 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001409 .manufacture_id = AMIC_ID_NOPREFIX,
1410 .model_id = AMIC_A29002B,
1411 .total_size = 256,
1412 .page_size = 64 * 1024,
1413 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1414 .tested = TEST_UNTESTED,
1415 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001416 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001417 .block_erasers =
1418 {
1419 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001420 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001421 {16 * 1024, 1},
1422 {8 * 1024, 2},
1423 {32 * 1024, 1},
1424 {64 * 1024, 3},
1425 },
1426 .block_erase = erase_sector_jedec,
1427 }, {
1428 .eraseblocks = { {256 * 1024, 1} },
1429 .block_erase = erase_chip_block_jedec,
1430 },
1431 },
1432 .write = write_jedec_1,
1433 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001434 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001435 .prepare_access = prepare_memory_access,
1436 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001437 },
1438
1439 {
1440 .vendor = "AMIC",
1441 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001442 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001443 .manufacture_id = AMIC_ID_NOPREFIX,
1444 .model_id = AMIC_A29002T,
1445 .total_size = 256,
1446 .page_size = 64 * 1024,
1447 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001448 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001449 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001450 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001451 .block_erasers =
1452 {
1453 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001454 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001455 {64 * 1024, 3},
1456 {32 * 1024, 1},
1457 {8 * 1024, 2},
1458 {16 * 1024, 1},
1459 },
1460 .block_erase = erase_sector_jedec,
1461 }, {
1462 .eraseblocks = { {256 * 1024, 1} },
1463 .block_erase = erase_chip_block_jedec,
1464 },
1465 },
1466 .write = write_jedec_1,
1467 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001468 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001469 .prepare_access = prepare_memory_access,
1470 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001471 },
1472
1473 {
1474 .vendor = "AMIC",
1475 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001476 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001477 .manufacture_id = AMIC_ID_NOPREFIX,
1478 .model_id = AMIC_A29040B,
1479 .total_size = 512,
1480 .page_size = 64 * 1024,
1481 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001482 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001483 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001484 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001485 .block_erasers =
1486 {
1487 {
1488 .eraseblocks = { {64 * 1024, 8} },
1489 .block_erase = erase_sector_jedec,
1490 }, {
1491 .eraseblocks = { {512 * 1024, 1} },
1492 .block_erase = erase_chip_block_jedec,
1493 },
1494 },
1495 .write = write_jedec_1,
1496 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001497 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001498 .prepare_access = prepare_memory_access,
1499 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001500 },
1501
1502 {
1503 .vendor = "AMIC",
1504 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001505 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001506 .manufacture_id = AMIC_ID_NOPREFIX,
1507 .model_id = AMIC_A49LF040A,
1508 .total_size = 512,
1509 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +01001510 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001511 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001512 .probe = probe_jedec,
1513 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1514 .block_erasers =
1515 {
1516 {
1517 .eraseblocks = { {64 * 1024, 8} },
1518 .block_erase = erase_block_jedec,
1519 }, {
1520 .eraseblocks = { {512 * 1024, 1} },
1521 .block_erase = erase_chip_block_jedec,
1522 }
1523 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001524 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001525 .write = write_jedec_1,
1526 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001527 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01001528 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01001529 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001530 },
1531
1532 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001533 .vendor = "Atmel",
1534 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001535 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001536 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001537 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001538 .total_size = 256,
1539 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001540 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1541 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001542 .tested = TEST_UNTESTED,
1543 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001544 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001545 .block_erasers =
1546 {
1547 {
1548 .eraseblocks = { {4 * 1024, 64} },
1549 .block_erase = spi_block_erase_20,
1550 }, {
1551 .eraseblocks = { {32 * 1024, 8} },
1552 .block_erase = spi_block_erase_52,
1553 }, {
1554 .eraseblocks = { {64 * 1024, 4} },
1555 .block_erase = spi_block_erase_d8,
1556 }, {
1557 .eraseblocks = { {256 * 1024, 1} },
1558 .block_erase = spi_block_erase_60,
1559 }, {
1560 .eraseblocks = { {256 * 1024, 1} },
1561 .block_erase = spi_block_erase_c7,
1562 }
1563 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001564 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001565 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001566 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001568 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001569 },
1570
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001571 {
1572 .vendor = "Atmel",
Steffen Mauch0b59b0d2018-06-02 23:46:03 +02001573 .name = "AT25DF021A",
1574 .bustype = BUS_SPI,
1575 .manufacture_id = ATMEL_ID,
1576 .model_id = ATMEL_AT25DF021A,
1577 .total_size = 256,
1578 .page_size = 256,
1579 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1580 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1581 .tested = TEST_OK_PREW,
1582 .probe = probe_spi_rdid,
1583 .probe_timing = TIMING_ZERO,
1584 .block_erasers =
1585 {
1586 {
1587 .eraseblocks = { {4 * 1024, 64} },
1588 .block_erase = spi_block_erase_20,
1589 }, {
1590 .eraseblocks = { {32 * 1024, 8} },
1591 .block_erase = spi_block_erase_52,
1592 }, {
1593 .eraseblocks = { {64 * 1024, 4} },
1594 .block_erase = spi_block_erase_d8,
1595 }, {
1596 .eraseblocks = { {256 * 1024, 1} },
1597 .block_erase = spi_block_erase_60,
1598 }, {
1599 .eraseblocks = { {256 * 1024, 1} },
1600 .block_erase = spi_block_erase_c7,
1601 }
1602 },
1603 .printlock = spi_prettyprint_status_register_at25df,
1604 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1605 .write = spi_chip_write_256,
1606 .read = spi_chip_read,
1607 .voltage = {1650, 3600},
1608 },
1609
1610 {
1611 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001612 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001613 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001614 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001615 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001616 .total_size = 512,
1617 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001618 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001619 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001620 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001621 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001622 .block_erasers =
1623 {
1624 {
1625 .eraseblocks = { {4 * 1024, 128} },
1626 .block_erase = spi_block_erase_20,
1627 }, {
1628 .eraseblocks = { {32 * 1024, 16} },
1629 .block_erase = spi_block_erase_52,
1630 }, {
1631 .eraseblocks = { {64 * 1024, 8} },
1632 .block_erase = spi_block_erase_d8,
1633 }, {
1634 .eraseblocks = { {512 * 1024, 1} },
1635 .block_erase = spi_block_erase_60,
1636 }, {
1637 .eraseblocks = { {512 * 1024, 1} },
1638 .block_erase = spi_block_erase_c7,
1639 }
1640 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001641 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001642 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001643 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001645 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001646 },
1647
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001648 {
1649 .vendor = "Atmel",
1650 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001651 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001652 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001653 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001654 .total_size = 1024,
1655 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001656 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001657 .tested = TEST_UNTESTED,
1658 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001659 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001660 .block_erasers =
1661 {
1662 {
1663 .eraseblocks = { {4 * 1024, 256} },
1664 .block_erase = spi_block_erase_20,
1665 }, {
1666 .eraseblocks = { {32 * 1024, 32} },
1667 .block_erase = spi_block_erase_52,
1668 }, {
1669 .eraseblocks = { {64 * 1024, 16} },
1670 .block_erase = spi_block_erase_d8,
1671 }, {
1672 .eraseblocks = { {1024 * 1024, 1} },
1673 .block_erase = spi_block_erase_60,
1674 }, {
1675 .eraseblocks = { {1024 * 1024, 1} },
1676 .block_erase = spi_block_erase_c7,
1677 }
1678 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001679 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001680 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001681 .write = spi_chip_write_256,
1682 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001683 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001684 },
1685
1686 {
1687 .vendor = "Atmel",
1688 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001689 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001690 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001691 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001692 .total_size = 1024,
1693 .page_size = 256,
1694 .feature_bits = FEATURE_WRSR_WREN,
1695 .tested = TEST_UNTESTED,
1696 .probe = probe_spi_rdid,
1697 .probe_timing = TIMING_ZERO,
1698 .block_erasers =
1699 {
1700 {
1701 .eraseblocks = { {4 * 1024, 256} },
1702 .block_erase = spi_block_erase_20,
1703 }, {
1704 .eraseblocks = { {32 * 1024, 32} },
1705 .block_erase = spi_block_erase_52,
1706 }, {
1707 .eraseblocks = { {64 * 1024, 16} },
1708 .block_erase = spi_block_erase_d8,
1709 }, {
1710 .eraseblocks = { {1024 * 1024, 1} },
1711 .block_erase = spi_block_erase_60,
1712 }, {
1713 .eraseblocks = { {1024 * 1024, 1} },
1714 .block_erase = spi_block_erase_c7,
1715 }
1716 },
1717 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001718 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001719 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001720 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001721 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001722 },
1723
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001724 {
1725 .vendor = "Atmel",
1726 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001727 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001728 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001729 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001730 .total_size = 2048,
1731 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001732 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons8b5b9622018-09-30 19:13:15 +02001733 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001734 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001735 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001736 .block_erasers =
1737 {
1738 {
1739 .eraseblocks = { {4 * 1024, 512} },
1740 .block_erase = spi_block_erase_20,
1741 }, {
1742 .eraseblocks = { {32 * 1024, 64} },
1743 .block_erase = spi_block_erase_52,
1744 }, {
1745 .eraseblocks = { {64 * 1024, 32} },
1746 .block_erase = spi_block_erase_d8,
1747 }, {
1748 .eraseblocks = { {2 * 1024 * 1024, 1} },
1749 .block_erase = spi_block_erase_60,
1750 }, {
1751 .eraseblocks = { {2 * 1024 * 1024, 1} },
1752 .block_erase = spi_block_erase_c7,
1753 }
1754 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001755 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001756 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001757 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001758 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001759 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001760 },
1761
Alan Green86bf6ab2019-06-27 16:58:20 +10001762 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001763 {
1764 .vendor = "Atmel",
1765 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001766 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001767 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001768 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001769 .total_size = 4096,
1770 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001771 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001772 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001773 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001774 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001775 .block_erasers =
1776 {
1777 {
1778 .eraseblocks = { {4 * 1024, 1024} },
1779 .block_erase = spi_block_erase_20,
1780 }, {
1781 .eraseblocks = { {32 * 1024, 128} },
1782 .block_erase = spi_block_erase_52,
1783 }, {
1784 .eraseblocks = { {64 * 1024, 64} },
1785 .block_erase = spi_block_erase_d8,
1786 }, {
1787 .eraseblocks = { {4 * 1024 * 1024, 1} },
1788 .block_erase = spi_block_erase_60,
1789 }, {
1790 .eraseblocks = { {4 * 1024 * 1024, 1} },
1791 .block_erase = spi_block_erase_c7,
1792 }
1793 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001794 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001795 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001796 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001797 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001798 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001799 },
1800
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001801 {
1802 .vendor = "Atmel",
1803 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001804 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001805 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001806 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001807 .total_size = 4096,
1808 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001809 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1810 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001811 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001813 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001814 .block_erasers =
1815 {
1816 {
1817 .eraseblocks = { {4 * 1024, 1024} },
1818 .block_erase = spi_block_erase_20,
1819 }, {
1820 .eraseblocks = { {32 * 1024, 128} },
1821 .block_erase = spi_block_erase_52,
1822 }, {
1823 .eraseblocks = { {64 * 1024, 64} },
1824 .block_erase = spi_block_erase_d8,
1825 }, {
1826 .eraseblocks = { {4 * 1024 * 1024, 1} },
1827 .block_erase = spi_block_erase_60,
1828 }, {
1829 .eraseblocks = { {4 * 1024 * 1024, 1} },
1830 .block_erase = spi_block_erase_c7,
1831 }
1832 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001833 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001834 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001835 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001836 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001837 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001838 },
1839
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001840 {
1841 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001842 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001843 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001844 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001845 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001846 .total_size = 8192,
1847 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001848 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001849 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001850 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001851 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001852 .block_erasers =
1853 {
1854 {
1855 .eraseblocks = { {4 * 1024, 2048} },
1856 .block_erase = spi_block_erase_20,
1857 }, {
1858 .eraseblocks = { {32 * 1024, 256} },
1859 .block_erase = spi_block_erase_52,
1860 }, {
1861 .eraseblocks = { {64 * 1024, 128} },
1862 .block_erase = spi_block_erase_d8,
1863 }, {
1864 .eraseblocks = { {8 * 1024 * 1024, 1} },
1865 .block_erase = spi_block_erase_60,
1866 }, {
1867 .eraseblocks = { {8 * 1024 * 1024, 1} },
1868 .block_erase = spi_block_erase_c7,
1869 }
1870 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001871 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001872 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001873 .write = spi_chip_write_256,
1874 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001875 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001876 },
1877
1878 {
1879 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001880 .name = "AT25DL081",
1881 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001882 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001883 .model_id = ATMEL_AT25DF081,
1884 .total_size = 1024,
1885 .page_size = 256,
1886 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1887 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1888 .tested = TEST_UNTESTED,
1889 .probe = probe_spi_rdid,
1890 .probe_timing = TIMING_ZERO,
1891 .block_erasers =
1892 {
1893 {
1894 .eraseblocks = { {4 * 1024, 256} },
1895 .block_erase = spi_block_erase_20,
1896 }, {
1897 .eraseblocks = { {32 * 1024, 32} },
1898 .block_erase = spi_block_erase_52,
1899 }, {
1900 .eraseblocks = { {64 * 1024, 16} },
1901 .block_erase = spi_block_erase_d8,
1902 }, {
1903 .eraseblocks = { {1 * 1024 * 1024, 1} },
1904 .block_erase = spi_block_erase_60,
1905 }, {
1906 .eraseblocks = { {1 * 1024 * 1024, 1} },
1907 .block_erase = spi_block_erase_c7,
1908 }
1909 },
1910 .printlock = spi_prettyprint_status_register_at25df_sec,
1911 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1912 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1913 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1914 .voltage = {1650, 1950},
1915 },
1916
1917 {
1918 .vendor = "Atmel",
1919 .name = "AT25DL161",
1920 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001921 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001922 .model_id = ATMEL_AT25DL161,
1923 .total_size = 2048,
1924 .page_size = 256,
1925 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1927 .tested = TEST_UNTESTED,
1928 .probe = probe_spi_rdid,
1929 .probe_timing = TIMING_ZERO,
1930 .block_erasers =
1931 {
1932 {
1933 .eraseblocks = { {4 * 1024, 512} },
1934 .block_erase = spi_block_erase_20,
1935 }, {
1936 .eraseblocks = { {32 * 1024, 64} },
1937 .block_erase = spi_block_erase_52,
1938 }, {
1939 .eraseblocks = { {64 * 1024, 32} },
1940 .block_erase = spi_block_erase_d8,
1941 }, {
1942 .eraseblocks = { {2 * 1024 * 1024, 1} },
1943 .block_erase = spi_block_erase_60,
1944 }, {
1945 .eraseblocks = { {2 * 1024 * 1024, 1} },
1946 .block_erase = spi_block_erase_c7,
1947 }
1948 },
1949 .printlock = spi_prettyprint_status_register_at25df_sec,
1950 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1951 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1952 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1953 .voltage = {1650, 1950},
1954 },
1955
1956 {
1957 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001958 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001959 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001960 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001961 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001962 .total_size = 2048,
1963 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001964 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1965 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001966 .tested = TEST_UNTESTED,
1967 .probe = probe_spi_rdid,
1968 .probe_timing = TIMING_ZERO,
1969 .block_erasers =
1970 {
1971 {
1972 .eraseblocks = { {4 * 1024, 512} },
1973 .block_erase = spi_block_erase_20,
1974 }, {
1975 .eraseblocks = { {32 * 1024, 64} },
1976 .block_erase = spi_block_erase_52,
1977 }, {
1978 .eraseblocks = { {64 * 1024, 32} },
1979 .block_erase = spi_block_erase_d8,
1980 }, {
1981 .eraseblocks = { {2 * 1024 * 1024, 1} },
1982 .block_erase = spi_block_erase_60,
1983 }, {
1984 .eraseblocks = { {2 * 1024 * 1024, 1} },
1985 .block_erase = spi_block_erase_c7,
1986 }
1987 },
1988 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001989 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001990 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001991 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001992 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001993 },
1994
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001995 {
1996 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001997 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1998 * All other properties seem to be the same.*/
1999 .name = "AT25F1024(A)",
2000 .bustype = BUS_SPI,
2001 .manufacture_id = ATMEL_ID,
2002 .model_id = ATMEL_AT25F1024,
2003 .total_size = 128,
2004 .page_size = 256,
2005 .feature_bits = FEATURE_WRSR_WREN,
2006 .tested = TEST_OK_PREW,
2007 .probe = probe_spi_at25f,
2008 .probe_timing = TIMING_ZERO,
2009 .block_erasers =
2010 {
2011 {
2012 .eraseblocks = { {32 * 1024, 4} },
2013 .block_erase = spi_block_erase_52,
2014 }, {
2015 .eraseblocks = { {128 * 1024, 1} },
2016 .block_erase = spi_block_erase_62,
2017 }
2018 },
2019 .printlock = spi_prettyprint_status_register_at25f,
2020 .unlock = spi_disable_blockprotect_at25f,
2021 .write = spi_chip_write_256,
2022 .read = spi_chip_read,
2023 .voltage = {2700, 3600},
2024 },
2025
2026 {
2027 .vendor = "Atmel",
2028 .name = "AT25F2048",
2029 .bustype = BUS_SPI,
2030 .manufacture_id = ATMEL_ID,
2031 .model_id = ATMEL_AT25F2048,
2032 .total_size = 256,
2033 .page_size = 256,
2034 .feature_bits = FEATURE_WRSR_WREN,
2035 .tested = TEST_UNTESTED,
2036 .probe = probe_spi_at25f,
2037 .probe_timing = TIMING_ZERO,
2038 .block_erasers =
2039 {
2040 {
2041 .eraseblocks = { {64 * 1024, 4} },
2042 .block_erase = spi_block_erase_52,
2043 }, {
2044 .eraseblocks = { {256 * 1024, 1} },
2045 .block_erase = spi_block_erase_62,
2046 }
2047 },
2048 .printlock = spi_prettyprint_status_register_at25f,
2049 .unlock = spi_disable_blockprotect_at25f,
2050 .write = spi_chip_write_256,
2051 .read = spi_chip_read,
2052 .voltage = {2700, 3600},
2053 },
2054
2055 {
2056 .vendor = "Atmel",
2057 .name = "AT25F4096",
2058 .bustype = BUS_SPI,
2059 .manufacture_id = ATMEL_ID,
2060 .model_id = ATMEL_AT25F4096,
2061 .total_size = 512,
2062 .page_size = 256,
2063 .feature_bits = FEATURE_WRSR_WREN,
2064 .tested = TEST_OK_PREW,
2065 .probe = probe_spi_at25f,
2066 .probe_timing = TIMING_ZERO,
2067 .block_erasers =
2068 {
2069 {
2070 .eraseblocks = { {64 * 1024, 8} },
2071 .block_erase = spi_block_erase_52,
2072 }, {
2073 .eraseblocks = { {512 * 1024, 1} },
2074 .block_erase = spi_block_erase_62,
2075 }
2076 },
2077 .printlock = spi_prettyprint_status_register_at25f4096,
2078 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2079 .unlock = spi_disable_blockprotect_bp2_srwd,
2080 .write = spi_chip_write_256,
2081 .read = spi_chip_read,
2082 .voltage = {2700, 3600},
2083 },
2084
2085 {
2086 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002087 .name = "AT25F512",
2088 .bustype = BUS_SPI,
2089 .manufacture_id = ATMEL_ID,
2090 .model_id = ATMEL_AT25F512,
2091 .total_size = 64,
2092 .page_size = 256,
2093 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002094 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002095 .probe = probe_spi_at25f,
2096 .probe_timing = TIMING_ZERO,
2097 .block_erasers =
2098 {
2099 {
2100 .eraseblocks = { {32 * 1024, 2} },
2101 .block_erase = spi_block_erase_52,
2102 }, {
2103 .eraseblocks = { {64 * 1024, 1} },
2104 .block_erase = spi_block_erase_62,
2105 }
2106 },
2107 .printlock = spi_prettyprint_status_register_at25f,
2108 .unlock = spi_disable_blockprotect_at25f,
2109 .write = spi_chip_write_256,
2110 .read = spi_chip_read,
2111 .voltage = {2700, 3600},
2112 },
2113
2114 {
2115 .vendor = "Atmel",
2116 .name = "AT25F512A",
2117 .bustype = BUS_SPI,
2118 .manufacture_id = ATMEL_ID,
2119 .model_id = ATMEL_AT25F512A,
2120 .total_size = 64,
2121 .page_size = 128,
2122 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002123 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002124 .probe = probe_spi_at25f,
2125 .probe_timing = TIMING_ZERO,
2126 .block_erasers =
2127 {
2128 {
2129 .eraseblocks = { {32 * 1024, 2} },
2130 .block_erase = spi_block_erase_52,
2131 }, {
2132 .eraseblocks = { {64 * 1024, 1} },
2133 .block_erase = spi_block_erase_62,
2134 }
2135 },
2136 .printlock = spi_prettyprint_status_register_at25f512a,
2137 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2138 .unlock = spi_disable_blockprotect_at25f512a,
2139 .write = spi_chip_write_256,
2140 .read = spi_chip_read,
2141 .voltage = {2700, 3600},
2142 },
2143
2144 {
2145 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002146 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002147 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002148 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002149 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002150 .total_size = 64,
2151 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002152 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2153 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002154 .tested = TEST_UNTESTED,
2155 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002156 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002157 .block_erasers =
2158 {
2159 {
2160 .eraseblocks = { {4 * 1024, 16} },
2161 .block_erase = spi_block_erase_20,
2162 }, {
2163 .eraseblocks = { {32 * 1024, 2} },
2164 .block_erase = spi_block_erase_52,
2165 }, {
2166 .eraseblocks = { {32 * 1024, 2} },
2167 .block_erase = spi_block_erase_d8,
2168 }, {
2169 .eraseblocks = { {64 * 1024, 1} },
2170 .block_erase = spi_block_erase_60,
2171 }, {
2172 .eraseblocks = { {64 * 1024, 1} },
2173 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002174 }, {
2175 .eraseblocks = { {64 * 1024, 1} },
2176 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002177 }
2178 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002179 .printlock = spi_prettyprint_status_register_at25f512b,
2180 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002181 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002182 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002183 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002184 },
2185
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002186 {
2187 .vendor = "Atmel",
2188 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002189 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002190 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002191 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002192 .total_size = 128,
2193 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002194 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002195 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002196 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002197 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002198 .block_erasers =
2199 {
2200 {
2201 .eraseblocks = { {4 * 1024, 32} },
2202 .block_erase = spi_block_erase_20,
2203 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002204 .eraseblocks = { {4 * 1024, 32} },
2205 .block_erase = spi_block_erase_d7,
2206 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002207 .eraseblocks = { {32 * 1024, 4} },
2208 .block_erase = spi_block_erase_52,
2209 }, {
2210 .eraseblocks = { {32 * 1024, 4} },
2211 .block_erase = spi_block_erase_d8,
2212 }, {
2213 .eraseblocks = { {128 * 1024, 1} },
2214 .block_erase = spi_block_erase_60,
2215 }, {
2216 .eraseblocks = { {128 * 1024, 1} },
2217 .block_erase = spi_block_erase_c7,
2218 }
2219 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002220 .printlock = spi_prettyprint_status_register_at25fs010,
2221 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002222 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002223 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002224 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002225 },
2226
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002227 {
2228 .vendor = "Atmel",
2229 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002230 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002231 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002232 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002233 .total_size = 512,
2234 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002235 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002236 .tested = TEST_UNTESTED,
2237 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002238 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002239 .block_erasers =
2240 {
2241 {
2242 .eraseblocks = { {4 * 1024, 128} },
2243 .block_erase = spi_block_erase_20,
2244 }, {
2245 .eraseblocks = { {64 * 1024, 8} },
2246 .block_erase = spi_block_erase_52,
2247 }, {
2248 .eraseblocks = { {64 * 1024, 8} },
2249 .block_erase = spi_block_erase_d8,
2250 }, {
2251 .eraseblocks = { {512 * 1024, 1} },
2252 .block_erase = spi_block_erase_60,
2253 }, {
2254 .eraseblocks = { {512 * 1024, 1} },
2255 .block_erase = spi_block_erase_c7,
2256 }
2257 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002258 .printlock = spi_prettyprint_status_register_at25fs040,
2259 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002260 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002261 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002262 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002263 },
2264
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002265 {
2266 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002267 .name = "AT25SF041",
2268 .bustype = BUS_SPI,
2269 .manufacture_id = ATMEL_ID,
2270 .model_id = ATMEL_AT25SF041,
2271 .total_size = 512,
2272 .page_size = 256,
2273 .feature_bits = FEATURE_WRSR_WREN,
2274 .tested = TEST_OK_PREW,
2275 .probe = probe_spi_rdid,
2276 .probe_timing = TIMING_ZERO,
2277 .block_erasers =
2278 {
2279 {
2280 .eraseblocks = { {4 * 1024, 128} },
2281 .block_erase = spi_block_erase_20,
2282 }, {
2283 .eraseblocks = { {32 * 1024, 16} },
2284 .block_erase = spi_block_erase_52,
2285 }, {
2286 .eraseblocks = { {64 * 1024, 8} },
2287 .block_erase = spi_block_erase_d8,
2288 }, {
2289 .eraseblocks = { {512 * 1024, 1} },
2290 .block_erase = spi_block_erase_60,
2291 }, {
2292 .eraseblocks = { {512 * 1024, 1} },
2293 .block_erase = spi_block_erase_c7,
2294 }
2295 },
2296 .printlock = spi_prettyprint_status_register_plain,
2297 .unlock = spi_disable_blockprotect,
2298 .write = spi_chip_write_256,
2299 .read = spi_chip_read,
2300 .voltage = {2500, 3600},
2301 },
2302
2303 {
2304 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002305 .name = "AT25SF081",
2306 .bustype = BUS_SPI,
2307 .manufacture_id = ATMEL_ID,
2308 .model_id = ATMEL_AT25SF081,
2309 .total_size = 1024,
2310 .page_size = 256,
2311 .feature_bits = FEATURE_WRSR_WREN,
2312 .tested = TEST_OK_PREW,
2313 .probe = probe_spi_rdid,
2314 .probe_timing = TIMING_ZERO,
2315 .block_erasers =
2316 {
2317 {
2318 .eraseblocks = { {4 * 1024, 256} },
2319 .block_erase = spi_block_erase_20,
2320 }, {
2321 .eraseblocks = { {32 * 1024, 32} },
2322 .block_erase = spi_block_erase_52,
2323 }, {
2324 .eraseblocks = { {64 * 1024, 16} },
2325 .block_erase = spi_block_erase_d8,
2326 }, {
2327 .eraseblocks = { {1024 * 1024, 1} },
2328 .block_erase = spi_block_erase_60,
2329 }, {
2330 .eraseblocks = { {1024 * 1024, 1} },
2331 .block_erase = spi_block_erase_c7,
2332 }
2333 },
2334 .printlock = spi_prettyprint_status_register_plain,
2335 .unlock = spi_disable_blockprotect,
2336 .write = spi_chip_write_256,
2337 .read = spi_chip_read,
2338 .voltage = {2300, 3600},
2339 },
2340
2341 {
2342 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002343 .name = "AT25SF161",
2344 .bustype = BUS_SPI,
2345 .manufacture_id = ATMEL_ID,
2346 .model_id = ATMEL_AT25SF161,
2347 .total_size = 2048,
2348 .page_size = 256,
2349 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2350 .tested = TEST_OK_PREW,
2351 .probe = probe_spi_rdid,
2352 .probe_timing = TIMING_ZERO,
2353 .block_erasers =
2354 {
2355 {
2356 .eraseblocks = { {4 * 1024, 512} },
2357 .block_erase = spi_block_erase_20,
2358 }, {
2359 .eraseblocks = { {32 * 1024, 64} },
2360 .block_erase = spi_block_erase_52,
2361 }, {
2362 .eraseblocks = { {64 * 1024, 32} },
2363 .block_erase = spi_block_erase_d8,
2364 }, {
2365 .eraseblocks = { {2048 * 1024, 1} },
2366 .block_erase = spi_block_erase_60,
2367 }, {
2368 .eraseblocks = { {2048 * 1024, 1} },
2369 .block_erase = spi_block_erase_c7,
2370 }
2371 },
2372 .printlock = spi_prettyprint_status_register_plain,
2373 .unlock = spi_disable_blockprotect,
2374 .write = spi_chip_write_256,
2375 .read = spi_chip_read,
2376 .voltage = {2500, 3600},
2377 },
2378
2379 {
Alan Green57938f82019-06-27 15:06:43 +10002380 .vendor = "Atmel",
darkarnium41394382019-11-04 20:06:48 +00002381 .name = "AT25SF321",
2382 .bustype = BUS_SPI,
2383 .manufacture_id = ATMEL_ID,
2384 .model_id = ATMEL_AT25SF321,
2385 .total_size = 4096,
2386 .page_size = 256,
2387 .feature_bits = FEATURE_WRSR_WREN,
2388 .tested = TEST_OK_PR,
2389 .probe = probe_spi_rdid,
2390 .probe_timing = TIMING_ZERO,
2391 .block_erasers =
2392 {
2393 {
2394 .eraseblocks = { {4 * 1024, 1024} },
2395 .block_erase = spi_block_erase_20,
2396 }, {
2397 .eraseblocks = { {32 * 1024, 128} },
2398 .block_erase = spi_block_erase_52,
2399 }, {
2400 .eraseblocks = { {64 * 1024, 64} },
2401 .block_erase = spi_block_erase_d8,
2402 }, {
2403 .eraseblocks = { {4096 * 1024, 1} },
2404 .block_erase = spi_block_erase_60,
2405 }, {
2406 .eraseblocks = { {4096 * 1024, 1} },
2407 .block_erase = spi_block_erase_c7,
2408 }
2409 },
2410 .printlock = spi_prettyprint_status_register_plain,
2411 .unlock = spi_disable_blockprotect,
2412 .write = spi_chip_write_256,
2413 .read = spi_chip_read,
2414 .voltage = {2500, 3600},
2415 },
2416
2417 {
2418 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002419 .name = "AT25SL128A",
2420 .bustype = BUS_SPI,
2421 .manufacture_id = ATMEL_ID,
2422 .model_id = ATMEL_AT25SL128A,
2423 .total_size = 16384,
2424 .page_size = 256,
2425 /* supports SFDP */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002426 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Hal Martin49e23d22018-05-27 14:18:43 +02002427 .tested = TEST_OK_PREW,
2428 .probe = probe_spi_rdid,
2429 .probe_timing = TIMING_ZERO,
2430 .block_erasers =
2431 {
2432 {
2433 .eraseblocks = { {4 * 1024, 4096} },
2434 .block_erase = spi_block_erase_20,
2435 }, {
2436 .eraseblocks = { {32 * 1024, 512} },
2437 .block_erase = spi_block_erase_52,
2438 }, {
2439 .eraseblocks = { {64 * 1024, 256} },
2440 .block_erase = spi_block_erase_d8,
2441 }, {
2442 .eraseblocks = { {16 * 1024 * 1024, 1} },
2443 .block_erase = spi_block_erase_60,
2444 }, {
2445 .eraseblocks = { {16 * 1024 * 1024, 1} },
2446 .block_erase = spi_block_erase_c7,
2447 }
2448 },
2449 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2450 .unlock = spi_disable_blockprotect,
2451 .write = spi_chip_write_256,
2452 .read = spi_chip_read,
2453 .voltage = {1700, 2000},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002454 .reg_bits =
2455 {
2456 .srp = {STATUS1, 7, RW},
2457 .srl = {STATUS2, 0, RW},
2458 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
2459 .tb = {STATUS1, 5, RW},
2460 .sec = {STATUS1, 6, RW},
2461 .cmp = {STATUS2, 6, RW},
2462 },
Nico Huberaabb3e02023-01-13 00:22:30 +01002463 .wp_write_cfg = spi_wp_write_cfg,
2464 .wp_read_cfg = spi_wp_read_cfg,
2465 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002466 .decode_range = decode_range_spi25,
Hal Martin49e23d22018-05-27 14:18:43 +02002467 },
2468
2469 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002470 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002471 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002472 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002473 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002474 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002475 .total_size = 512,
2476 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002477 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002478 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002479 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002480 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002481 .block_erasers =
2482 {
2483 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002484 .eraseblocks = { {256, 2048} },
2485 .block_erase = spi_block_erase_81,
2486 }, {
2487 .eraseblocks = { {2 * 1024, 256} },
2488 .block_erase = spi_block_erase_50,
2489 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002490 .eraseblocks = { {4 * 1024, 128} },
2491 .block_erase = spi_block_erase_20,
2492 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002493 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002494 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002495 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002496 .write = spi_chip_write_1,
2497 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002498 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002499 },
2500
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002501 {
2502 .vendor = "Atmel",
2503 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002504 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002505 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002506 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002507 .total_size = 1024,
2508 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002509 .feature_bits = FEATURE_WRSR_WREN,
2510 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002511 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002512 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002513 .block_erasers =
2514 {
2515 {
2516 .eraseblocks = { {4 * 1024, 256} },
2517 .block_erase = spi_block_erase_20,
2518 }, {
2519 .eraseblocks = { {32 * 1024, 32} },
2520 .block_erase = spi_block_erase_52,
2521 }, {
2522 .eraseblocks = { {64 * 1024, 16} },
2523 .block_erase = spi_block_erase_d8,
2524 }, {
2525 .eraseblocks = { {1024 * 1024, 1} },
2526 .block_erase = spi_block_erase_60,
2527 }, {
2528 .eraseblocks = { {1024 * 1024, 1} },
2529 .block_erase = spi_block_erase_c7,
2530 }
2531 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002532 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002533 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002534 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002535 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002536 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002537 },
2538
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002539 {
2540 .vendor = "Atmel",
2541 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002542 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002543 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002544 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002545 .total_size = 2048,
2546 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002547 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002548 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002549 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002550 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002551 .block_erasers =
2552 {
2553 {
2554 .eraseblocks = { {4 * 1024, 512} },
2555 .block_erase = spi_block_erase_20,
2556 }, {
2557 .eraseblocks = { {32 * 1024, 64} },
2558 .block_erase = spi_block_erase_52,
2559 }, {
2560 .eraseblocks = { {64 * 1024, 32} },
2561 .block_erase = spi_block_erase_d8,
2562 }, {
2563 .eraseblocks = { {2 * 1024 * 1024, 1} },
2564 .block_erase = spi_block_erase_60,
2565 }, {
2566 .eraseblocks = { {2 * 1024 * 1024, 1} },
2567 .block_erase = spi_block_erase_c7,
2568 }
2569 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002570 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002571 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002572 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002573 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002574 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002575 },
2576
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002577 {
2578 .vendor = "Atmel",
2579 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002580 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002581 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002582 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002583 .total_size = 2048,
2584 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002585 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002586 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002587 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002588 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002589 .block_erasers =
2590 {
2591 {
2592 .eraseblocks = { {4 * 1024, 512} },
2593 .block_erase = spi_block_erase_20,
2594 }, {
2595 .eraseblocks = { {32 * 1024, 64} },
2596 .block_erase = spi_block_erase_52,
2597 }, {
2598 .eraseblocks = { {64 * 1024, 32} },
2599 .block_erase = spi_block_erase_d8,
2600 }, {
2601 .eraseblocks = { {2 * 1024 * 1024, 1} },
2602 .block_erase = spi_block_erase_60,
2603 }, {
2604 .eraseblocks = { {2 * 1024 * 1024, 1} },
2605 .block_erase = spi_block_erase_c7,
2606 }
2607 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002608 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002609 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002610 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002611 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002612 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002613 },
2614
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002615 {
2616 .vendor = "Atmel",
2617 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002618 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002619 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002620 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002621 .total_size = 512,
2622 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002623 .feature_bits = FEATURE_WRSR_WREN,
Alan Green908adf42019-07-03 15:34:06 +10002624 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002625 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002626 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002627 .block_erasers =
2628 {
2629 {
2630 .eraseblocks = { {4 * 1024, 128} },
2631 .block_erase = spi_block_erase_20,
2632 }, {
2633 .eraseblocks = { {32 * 1024, 16} },
2634 .block_erase = spi_block_erase_52,
2635 }, {
2636 .eraseblocks = { {64 * 1024, 8} },
2637 .block_erase = spi_block_erase_d8,
2638 }, {
2639 .eraseblocks = { {512 * 1024, 1} },
2640 .block_erase = spi_block_erase_60,
2641 }, {
2642 .eraseblocks = { {512 * 1024, 1} },
2643 .block_erase = spi_block_erase_c7,
2644 }
2645 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002646 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002647 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002648 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002649 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002650 },
2651
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002652 {
2653 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002654 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002655 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002656 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002657 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002658 .total_size = 128,
2659 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002660 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002661 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002662 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002663 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002664 .block_erasers =
2665 {
2666 {
2667 .eraseblocks = { {128 * 1024, 1} },
2668 .block_erase = erase_chip_block_jedec,
2669 }
2670 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002671 .write = write_jedec, /* FIXME */
2672 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002673 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002674 .prepare_access = prepare_memory_access,
2675 .finish_access = finish_memory_access,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002676 },
2677
2678 {
2679 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002680 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002681 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002682 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002683 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002684 .total_size = 256,
2685 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002686 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002687 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002688 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002689 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002690 .block_erasers =
2691 {
2692 {
2693 .eraseblocks = { {256 * 1024, 1} },
2694 .block_erase = erase_chip_block_jedec,
2695 }
2696 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002697 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002698 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002699 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002700 .prepare_access = prepare_memory_access,
2701 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002702 },
2703
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002704 {
2705 .vendor = "Atmel",
2706 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002707 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002708 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002709 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002710 .total_size = 512,
2711 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002712 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002713 .tested = TEST_UNTESTED,
2714 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002715 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002716 .block_erasers =
2717 {
2718 {
2719 .eraseblocks = { {512 * 1024, 1} },
2720 .block_erase = erase_chip_block_jedec,
2721 }
2722 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002723 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002724 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002725 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002726 .prepare_access = prepare_memory_access,
2727 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002728 },
2729
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002730 {
2731 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002732 .name = "AT29C512",
2733 .bustype = BUS_PARALLEL,
2734 .manufacture_id = ATMEL_ID,
2735 .model_id = ATMEL_AT29C512,
2736 .total_size = 64,
2737 .page_size = 128,
2738 .feature_bits = FEATURE_LONG_RESET,
2739 .tested = TEST_OK_PREW,
2740 .probe = probe_jedec,
2741 .probe_timing = 10000, /* 10mS, Enter=Exec */
2742 .block_erasers =
2743 {
2744 {
2745 .eraseblocks = { {64 * 1024, 1} },
2746 .block_erase = erase_chip_block_jedec,
2747 }
2748 },
2749 .write = write_jedec,
2750 .read = read_memmapped,
2751 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002752 .prepare_access = prepare_memory_access,
2753 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10002754 },
2755
2756 {
2757 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002758 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002759 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002760 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002761 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002762 .total_size = 16896, /* No power of two sizes */
2763 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002764 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002765 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2766 .feature_bits = FEATURE_OTP,
2767 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002768 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002769 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002770 .block_erasers =
2771 {
2772 {
2773 .eraseblocks = {
2774 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2775 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2776 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2777 },
2778 .block_erase = spi_erase_at45cs_sector,
2779 }
2780 },
2781 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002782 .write = spi_write_at45db,
2783 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002784 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002785 .gran = write_gran_1056bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002786 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002787
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002788 {
2789 .vendor = "Atmel",
2790 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002791 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002792 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002793 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002794 .total_size = 128, /* or 132, determined from status register */
2795 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002796 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002797 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2798 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002799 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002800 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002801 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002802 .block_erasers =
2803 {
2804 {
2805 .eraseblocks = { {256, 512} },
2806 .block_erase = spi_erase_at45db_page,
2807 }, {
2808 .eraseblocks = { {8 * 256, 512/8} },
2809 .block_erase = spi_erase_at45db_block,
2810 }, {
2811 .eraseblocks = {
2812 {8 * 256, 1},
2813 {120 * 256, 1},
2814 {128 * 256, 3},
2815 },
2816 .block_erase = spi_erase_at45db_sector
2817 }, {
2818 .eraseblocks = { {128 * 1024, 1} },
2819 .block_erase = spi_erase_at45db_chip,
2820 }
2821 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002822 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002823 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002824 /* granularity will be set by the probing function. */
2825 .write = spi_write_at45db,
2826 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002827 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002828 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002829
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002830 {
2831 .vendor = "Atmel",
2832 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002833 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002834 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002835 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002836 .total_size = 256, /* or 264, determined from status register */
2837 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002838 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002839 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2840 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002841 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002842 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002843 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002844 .block_erasers =
2845 {
2846 {
2847 .eraseblocks = { {256, 1024} },
2848 .block_erase = spi_erase_at45db_page,
2849 }, {
2850 .eraseblocks = { {8 * 256, 1024/8} },
2851 .block_erase = spi_erase_at45db_block,
2852 }, {
2853 .eraseblocks = {
2854 {8 * 256, 1},
2855 {120 * 256, 1},
2856 {128 * 256, 7},
2857 },
2858 .block_erase = spi_erase_at45db_sector
2859 }, {
2860 .eraseblocks = { {256 * 1024, 1} },
2861 .block_erase = spi_erase_at45db_chip,
2862 }
2863 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002864 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002865 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002866 /* granularity will be set by the probing function. */
2867 .write = spi_write_at45db,
2868 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002869 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002870 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002871
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002872 {
2873 .vendor = "Atmel",
2874 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002875 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002876 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002877 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002878 .total_size = 512, /* or 528, determined from status register */
2879 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002880 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002881 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2882 .feature_bits = FEATURE_OTP,
2883 .tested = TEST_OK_PREW,
2884 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002885 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002886 .block_erasers =
2887 {
2888 {
2889 .eraseblocks = { {256, 2048} },
2890 .block_erase = spi_erase_at45db_page,
2891 }, {
2892 .eraseblocks = { {8 * 256, 2048/8} },
2893 .block_erase = spi_erase_at45db_block,
2894 }, {
2895 .eraseblocks = {
2896 {8 * 256, 1},
2897 {248 * 256, 1},
2898 {256 * 256, 7},
2899 },
2900 .block_erase = spi_erase_at45db_sector
2901 }, {
2902 .eraseblocks = { {512 * 1024, 1} },
2903 .block_erase = spi_erase_at45db_chip,
2904 }
2905 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002906 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002907 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002908 /* granularity will be set by the probing function. */
2909 .write = spi_write_at45db,
2910 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2911 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002912 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002913
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002914 {
2915 .vendor = "Atmel",
2916 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002917 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002918 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002919 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002920 .total_size = 1024, /* or 1056, determined from status register */
2921 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002922 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002923 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2924 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002925 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002926 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002927 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002928 .block_erasers =
2929 {
2930 {
2931 .eraseblocks = { {256, 4096} },
2932 .block_erase = spi_erase_at45db_page,
2933 }, {
2934 .eraseblocks = { {8 * 256, 4096/8} },
2935 .block_erase = spi_erase_at45db_block,
2936 }, {
2937 .eraseblocks = {
2938 {8 * 256, 1},
2939 {248 * 256, 1},
2940 {256 * 256, 15},
2941 },
2942 .block_erase = spi_erase_at45db_sector
2943 }, {
2944 .eraseblocks = { {1024 * 1024, 1} },
2945 .block_erase = spi_erase_at45db_chip,
2946 }
2947 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002948 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002949 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002950 /* granularity will be set by the probing function. */
2951 .write = spi_write_at45db,
2952 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002953 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002954 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002955
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002956 {
2957 .vendor = "Atmel",
2958 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002959 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002960 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002961 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002962 .total_size = 2048, /* or 2112, determined from status register */
2963 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002964 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002965 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2966 .feature_bits = FEATURE_OTP,
2967 .tested = TEST_OK_PREW,
2968 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002969 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002970 .block_erasers =
2971 {
2972 {
2973 .eraseblocks = { {512, 4096} },
2974 .block_erase = spi_erase_at45db_page,
2975 }, {
2976 .eraseblocks = { {8 * 512, 4096/8} },
2977 .block_erase = spi_erase_at45db_block,
2978 }, {
2979 .eraseblocks = {
2980 {8 * 512, 1},
2981 {248 * 512, 1},
2982 {256 * 512, 15},
2983 },
2984 .block_erase = spi_erase_at45db_sector
2985 }, {
2986 .eraseblocks = { {2048 * 1024, 1} },
2987 .block_erase = spi_erase_at45db_chip,
2988 }
2989 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002990 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002991 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002992 /* granularity will be set by the probing function. */
2993 .write = spi_write_at45db,
2994 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002995 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002996 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002997
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002998 {
2999 .vendor = "Atmel",
3000 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003001 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003002 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003003 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003004 .total_size = 4224, /* No power of two sizes */
3005 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00003006 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003007 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
3008 .feature_bits = FEATURE_OTP,
3009 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003010 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003011 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003012 .block_erasers =
3013 {
3014 {
3015 .eraseblocks = { {528, 8192} },
3016 .block_erase = spi_erase_at45db_page,
3017 }, {
3018 .eraseblocks = { {8 * 528, 8192/8} },
3019 .block_erase = spi_erase_at45db_block,
3020 }, /* Although the datasheets describes sectors (which can be write protected)
3021 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00003022 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003023 .eraseblocks = {
3024 {8 * 528, 1},
3025 {120 * 528, 1},
3026 {128 * 528, 63},
3027 },
3028 .block_erase = spi_erase_at45db_sector
3029 }, */ {
3030 .eraseblocks = { {4224 * 1024, 1} },
3031 .block_erase = spi_erase_at45db_chip,
3032 }
3033 },
3034 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003035 .write = spi_write_at45db,
3036 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003037 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003038 .gran = write_gran_528bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003039 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003040
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003041 {
3042 .vendor = "Atmel",
3043 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003044 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003045 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003046 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10003047 .total_size = 4096, /* or 4224, determined from status register */
3048 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003049 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003050 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00003051 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00003052 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003053 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003054 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003055 .block_erasers =
3056 {
3057 {
3058 .eraseblocks = { {512, 8192} },
3059 .block_erase = spi_erase_at45db_page,
3060 }, {
3061 .eraseblocks = { {8 * 512, 8192/8} },
3062 .block_erase = spi_erase_at45db_block,
3063 }, {
3064 .eraseblocks = {
3065 {8 * 512, 1},
3066 {120 * 512, 1},
3067 {128 * 512, 63},
3068 },
3069 .block_erase = spi_erase_at45db_sector
3070 }, {
3071 .eraseblocks = { {4096 * 1024, 1} },
3072 .block_erase = spi_erase_at45db_chip,
3073 }
3074 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003075 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003076 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003077 /* granularity will be set by the probing function. */
3078 .write = spi_write_at45db,
3079 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3080 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
3081 },
3082
3083 {
3084 .vendor = "Atmel",
3085 .name = "AT45DB321E",
3086 .bustype = BUS_SPI,
3087 .manufacture_id = ATMEL_ID,
3088 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003089 .total_size = 4096, /* or 4224, determined from status register */
3090 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003091 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3092 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3093 .feature_bits = FEATURE_OTP,
3094 .tested = TEST_UNTESTED,
3095 .probe = probe_spi_at45db,
3096 .probe_timing = TIMING_ZERO,
3097 .block_erasers =
3098 {
3099 {
3100 .eraseblocks = { {512, 8192} },
3101 .block_erase = spi_erase_at45db_page,
3102 }, {
3103 .eraseblocks = { {8 * 512, 8192/8} },
3104 .block_erase = spi_erase_at45db_block,
3105 }, {
3106 .eraseblocks = {
3107 {8 * 512, 1},
3108 {120 * 512, 1},
3109 {128 * 512, 63},
3110 },
3111 .block_erase = spi_erase_at45db_sector
3112 }, {
3113 .eraseblocks = { {4096 * 1024, 1} },
3114 .block_erase = spi_erase_at45db_chip,
3115 }
3116 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003117 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
Alan Greenc1863ca2019-06-27 15:08:03 +10003118 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003119 /* granularity will be set by the probing function. */
3120 .write = spi_write_at45db,
3121 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3122 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003123 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003124
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003125 {
3126 .vendor = "Atmel",
3127 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003128 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003129 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003130 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003131 .total_size = 8192, /* or 8448, determined from status register */
3132 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003133 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003134 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3135 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003136 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003137 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003138 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003139 .block_erasers =
3140 {
3141 {
3142 .eraseblocks = { {1024, 8192} },
3143 .block_erase = spi_erase_at45db_page,
3144 }, {
3145 .eraseblocks = { {8 * 1024, 8192/8} },
3146 .block_erase = spi_erase_at45db_block,
3147 }, {
3148 .eraseblocks = {
3149 {8 * 1024, 1},
3150 {248 * 1024, 1},
3151 {256 * 1024, 31},
3152 },
3153 .block_erase = spi_erase_at45db_sector
3154 }, {
3155 .eraseblocks = { {8192 * 1024, 1} },
3156 .block_erase = spi_erase_at45db_chip,
3157 }
3158 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003159 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003160 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003161 /* granularity will be set by the probing function. */
3162 .write = spi_write_at45db,
3163 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003164 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003165 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003166
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003167 {
3168 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10003169 .name = "AT49(H)F010",
3170 .bustype = BUS_PARALLEL,
3171 .manufacture_id = ATMEL_ID,
3172 .model_id = ATMEL_AT49F010,
3173 .total_size = 128,
3174 .page_size = 0, /* unused */
3175 .feature_bits = FEATURE_EITHER_RESET,
3176 .tested = TEST_OK_PREW,
3177 .probe = probe_jedec,
3178 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3179 .block_erasers =
3180 {
3181 {
3182 .eraseblocks = { {128 * 1024, 1} },
3183 .block_erase = erase_chip_block_jedec,
3184 }
3185 },
3186 .printlock = printlock_at49f,
3187 .write = write_jedec_1,
3188 .read = read_memmapped,
3189 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003190 .prepare_access = prepare_memory_access,
3191 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003192 },
3193
3194 {
3195 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003196 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003197 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003198 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003199 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003200 .total_size = 64,
3201 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003202 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003203 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003204 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003205 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003206 .block_erasers =
3207 {
3208 {
3209 .eraseblocks = { {64 * 1024, 1} },
3210 .block_erase = erase_chip_block_jedec,
3211 }
3212 },
Sean Nelson35727f72010-01-28 23:55:12 +00003213 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003214 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003215 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01003216 .prepare_access = prepare_memory_access,
3217 .finish_access = finish_memory_access,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003218 },
3219
3220 {
3221 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003222 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003223 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003224 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003225 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003226 .total_size = 256,
3227 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003228 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003229 .tested = TEST_UNTESTED,
3230 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003231 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003232 .block_erasers =
3233 {
3234 {
3235 .eraseblocks = {
3236 {16 * 1024, 1},
3237 {8 * 1024, 2},
3238 {96 * 1024, 1},
3239 {128 * 1024, 1},
3240 },
3241 .block_erase = erase_sector_jedec,
3242 }, {
3243 .eraseblocks = { {256 * 1024, 1} },
3244 .block_erase = erase_chip_block_jedec,
3245 }
3246 },
Sean Nelson35727f72010-01-28 23:55:12 +00003247 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003248 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003249 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003250 .prepare_access = prepare_memory_access,
3251 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003252 },
3253
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003254 {
3255 .vendor = "Atmel",
3256 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003257 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003258 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003259 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003260 .total_size = 256,
3261 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003262 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003263 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003264 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003265 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003266 .block_erasers =
3267 {
3268 {
3269 .eraseblocks = {
3270 {128 * 1024, 1},
3271 {96 * 1024, 1},
3272 {8 * 1024, 2},
3273 {16 * 1024, 1},
3274 },
3275 .block_erase = erase_sector_jedec,
3276 }, {
3277 .eraseblocks = { {256 * 1024, 1} },
3278 .block_erase = erase_chip_block_jedec,
3279 }
3280 },
Sean Nelson35727f72010-01-28 23:55:12 +00003281 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003282 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003283 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003284 .prepare_access = prepare_memory_access,
3285 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003286 },
3287
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003288 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003289 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003290 .name = "AT49F020",
3291 .bustype = BUS_PARALLEL,
3292 .manufacture_id = ATMEL_ID,
3293 .model_id = ATMEL_AT49F020,
3294 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003295 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003296 .feature_bits = FEATURE_EITHER_RESET,
3297 .tested = TEST_OK_PRE,
3298 .probe = probe_jedec,
3299 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3300 .block_erasers =
3301 {
3302 {
3303 .eraseblocks = { {256 * 1024, 1} },
3304 .block_erase = erase_chip_block_jedec,
3305 }
3306 /* Chip features an optional permanent write protection
3307 * of the first 8 kB. The erase function is the same as
3308 * above, but 00000H to 01FFFH will not be erased.
3309 * FIXME: add another eraser when partial erasers are
3310 * supported.
3311 */
3312 },
3313 .printlock = printlock_at49f,
3314 .write = write_jedec_1,
3315 .read = read_memmapped,
3316 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003317 .prepare_access = prepare_memory_access,
3318 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003319 },
3320
3321 {
3322 .vendor = "Atmel",
3323 .name = "AT49F040",
3324 .bustype = BUS_PARALLEL,
3325 .manufacture_id = ATMEL_ID,
3326 .model_id = ATMEL_AT49F040,
3327 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003328 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003329 .feature_bits = FEATURE_EITHER_RESET,
3330 .tested = TEST_UNTESTED,
3331 .probe = probe_jedec,
3332 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3333 .block_erasers =
3334 {
3335 {
3336 .eraseblocks = { {512 * 1024, 1} },
3337 .block_erase = erase_chip_block_jedec,
3338 }
3339 /* Chip features an optional permanent write protection
3340 * of the first 16 kB. The erase function is the same as
3341 * above, but 00000H to 03FFFH will not be erased.
3342 * FIXME: add another eraser when partial erasers are
3343 * supported.
3344 */
3345 },
3346 .printlock = printlock_at49f,
3347 .write = write_jedec_1,
3348 .read = read_memmapped,
3349 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003350 .prepare_access = prepare_memory_access,
3351 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003352 },
3353
3354 {
3355 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003356 .name = "AT49F080",
3357 .bustype = BUS_PARALLEL,
3358 .manufacture_id = ATMEL_ID,
3359 .model_id = ATMEL_AT49F080,
3360 .total_size = 1024,
3361 .page_size = 0, /* unused */
3362 .feature_bits = FEATURE_EITHER_RESET,
3363 .tested = TEST_UNTESTED,
3364 .probe = probe_jedec,
3365 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3366 .block_erasers =
3367 {
3368 {
3369 .eraseblocks = { {1024 * 1024, 1} },
3370 .block_erase = erase_chip_block_jedec,
3371 }
3372 /* Chip features an optional permanent write protection
3373 * of the first 16 kB. The erase function is the same as
3374 * above, but 00000H to 03FFFH will not be erased.
3375 * FIXME: add another eraser when partial erasers are
3376 * supported.
3377 */
3378 },
3379 .printlock = printlock_at49f,
3380 .write = write_jedec_1,
3381 .read = read_memmapped,
3382 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003383 .prepare_access = prepare_memory_access,
3384 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003385 },
3386
3387 {
3388 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3389 .vendor = "Atmel",
3390 .name = "AT49F080T",
3391 .bustype = BUS_PARALLEL,
3392 .manufacture_id = ATMEL_ID,
3393 .model_id = ATMEL_AT49F080T,
3394 .total_size = 1024,
3395 .page_size = 0, /* unused */
3396 .feature_bits = FEATURE_EITHER_RESET,
3397 .tested = TEST_UNTESTED,
3398 .probe = probe_jedec,
3399 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3400 .block_erasers =
3401 {
3402 {
3403 .eraseblocks = { {1024 * 1024, 1} },
3404 .block_erase = erase_chip_block_jedec,
3405 }
3406 /* Chip features an optional permanent write protection
3407 * of the first 16 kB. The erase function is the same as
3408 * above, but FC000H to FFFFFH will not be erased.
3409 * FIXME: add another eraser when partial erasers are
3410 * supported.
3411 */
3412 },
3413 .printlock = printlock_at49f,
3414 .write = write_jedec_1,
3415 .read = read_memmapped,
3416 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003417 .prepare_access = prepare_memory_access,
3418 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003419 },
3420
3421 {
3422 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003423 .name = "AT49LH002",
3424 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3425 .manufacture_id = ATMEL_ID,
3426 .model_id = ATMEL_AT49LH002,
3427 .total_size = 256,
3428 .page_size = 0, /* unused */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003429 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003430 .probe = probe_82802ab,
3431 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003432 .block_erasers =
3433 {
3434 {
3435 .eraseblocks = {
3436 {64 * 1024, 3},
3437 {32 * 1024, 1},
3438 {8 * 1024, 2},
3439 {16 * 1024, 1},
3440 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003441 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003442 }, {
3443 .eraseblocks = {
3444 {64 * 1024, 4},
3445 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003446 .block_erase = erase_block_82802ab,
3447 },
3448 },
3449 .printlock = printlock_regspace2_block_eraser_0,
3450 .unlock = unlock_regspace2_block_eraser_0,
3451 .write = write_82802ab,
3452 .read = read_memmapped,
3453 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003454 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003455 .finish_access = finish_memory_access,
Stefan Tauner7de93932014-08-03 13:05:45 +00003456 },
3457
3458 {
3459 .vendor = "Atmel",
Stefan Tauner7de93932014-08-03 13:05:45 +00003460 .name = "AT49LH004",
3461 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3462 .manufacture_id = ATMEL_ID,
3463 .model_id = ATMEL_AT49LH004,
3464 .total_size = 512,
3465 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003466 .tested = TEST_UNTESTED,
3467 .probe = probe_82802ab,
3468 .probe_timing = TIMING_ZERO,
3469 .block_erasers =
3470 {
3471 {
3472 .eraseblocks = {
3473 {64 * 1024, 7},
3474 {32 * 1024, 1},
3475 {8 * 1024, 2},
3476 {16 * 1024, 1},
3477 },
3478 .block_erase = erase_block_82802ab,
3479 }, {
3480 .eraseblocks = {
3481 {64 * 1024, 8},
3482 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003483 .block_erase = NULL, /* TODO: Implement. */
3484 },
3485 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003486 .printlock = printlock_regspace2_block_eraser_0,
3487 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003488 .write = write_82802ab,
3489 .read = read_memmapped,
3490 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003491 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003492 .finish_access = finish_memory_access,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003493 },
3494
3495 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003496 .vendor = "Atmel",
3497 .name = "AT49LH00B4",
3498 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3499 .manufacture_id = ATMEL_ID,
3500 .model_id = ATMEL_AT49LH00B4,
3501 .total_size = 512,
Andrew Morganca081462011-09-13 22:05:44 +00003502 .page_size = 0, /* unused */
Alan Green1f9cc7d2019-07-01 11:10:45 +10003503 .tested = TEST_UNTESTED,
3504 .probe = probe_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003505 .probe_timing = TIMING_ZERO,
3506 .block_erasers =
3507 {
3508 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003509 .eraseblocks = {
3510 {8 * 1024, 2},
3511 {16 * 1024, 1},
3512 {32 * 1024, 1},
3513 {64 * 1024, 7},
3514 },
3515 .block_erase = NULL, /* TODO: Implement. */
3516 }, {
3517 .eraseblocks = {
3518 {64 * 1024, 8},
3519 },
3520 .block_erase = erase_block_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003521 },
3522 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003523 .printlock = printlock_regspace2_block_eraser_0,
3524 .unlock = unlock_regspace2_block_eraser_0,
3525 .write = write_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003526 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003527 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003528 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003529 .finish_access = finish_memory_access,
Andrew Morganca081462011-09-13 22:05:44 +00003530 },
3531
3532 {
Angel Pons1ebda782021-04-20 21:39:11 +02003533 .vendor = "Boya/BoHong Microelectronics",
Christian Kudera475a7ee2021-04-20 22:50:01 +02003534 .name = "B.25D16A",
3535 .bustype = BUS_SPI,
3536 .manufacture_id = BOYA_BOHONG_ID,
3537 .model_id = BOYA_BOHONG_B_25D16A,
3538 .total_size = 2048,
3539 .page_size = 256,
3540 .feature_bits = FEATURE_WRSR_WREN,
3541 .tested = TEST_OK_PR,
3542 .probe = probe_spi_rdid,
3543 .probe_timing = TIMING_ZERO,
3544 .block_erasers =
3545 {
3546 {
3547 .eraseblocks = { {4 * 1024, 512} },
3548 .block_erase = spi_block_erase_20,
3549 }, {
3550 .eraseblocks = { {32 * 1024, 64} },
3551 .block_erase = spi_block_erase_52,
3552 }, {
3553 .eraseblocks = { {64 * 1024, 32} },
3554 .block_erase = spi_block_erase_d8,
3555 }, {
3556 .eraseblocks = { {2 * 1024 * 1024, 1} },
3557 .block_erase = spi_block_erase_60,
3558 }, {
3559 .eraseblocks = { {2 * 1024 * 1024, 1} },
3560 .block_erase = spi_block_erase_c7,
3561 }
3562 },
3563 .printlock = spi_prettyprint_status_register_bp2_srwd,
3564 .unlock = spi_disable_blockprotect_bp2_srwd,
3565 .write = spi_chip_write_256,
3566 .read = spi_chip_read,
3567 .voltage = {2700, 3600},
3568 },
3569
3570 {
3571 .vendor = "Boya/BoHong Microelectronics",
Angel Pons1ebda782021-04-20 21:39:11 +02003572 .name = "B.25Q128AS",
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003573 .bustype = BUS_SPI,
Angel Pons1ebda782021-04-20 21:39:11 +02003574 .manufacture_id = BOYA_BOHONG_ID,
3575 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003576 .total_size = 16384,
3577 .page_size = 256,
3578 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
3579 .tested = TEST_OK_PREW,
3580 .probe = probe_spi_rdid,
3581 .probe_timing = TIMING_ZERO,
3582 .block_erasers =
3583 {
3584 {
3585 .eraseblocks = { {4 * 1024, 4096} },
3586 .block_erase = spi_block_erase_20,
3587 }, {
3588 .eraseblocks = { {32 * 1024, 512} },
3589 .block_erase = spi_block_erase_52,
3590 }, {
3591 .eraseblocks = { {64 * 1024, 256} },
3592 .block_erase = spi_block_erase_d8,
3593 }, {
3594 .eraseblocks = { {16 * 1024 * 1024, 1} },
3595 .block_erase = spi_block_erase_60,
3596 }, {
3597 .eraseblocks = { {16 * 1024 * 1024, 1} },
3598 .block_erase = spi_block_erase_c7,
3599 }
3600 },
3601 .printlock = spi_prettyprint_status_register_plain,
3602 .unlock = spi_disable_blockprotect_at25fs040,
3603 .write = spi_chip_write_256,
3604 .read = spi_chip_read,
3605 .voltage = {2700, 3600},
3606 },
3607
3608 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003609 .vendor = "Bright",
3610 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003611 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003612 .manufacture_id = BRIGHT_ID,
3613 .model_id = BRIGHT_BM29F040,
3614 .total_size = 512,
3615 .page_size = 64 * 1024,
3616 .feature_bits = FEATURE_EITHER_RESET,
3617 .tested = TEST_OK_PR,
3618 .probe = probe_jedec,
3619 .probe_timing = TIMING_ZERO,
3620 .block_erasers =
3621 {
3622 {
3623 .eraseblocks = { {64 * 1024, 8} },
3624 .block_erase = erase_sector_jedec,
3625 }, {
3626 .eraseblocks = { {512 * 1024, 1} },
3627 .block_erase = erase_chip_block_jedec,
3628 },
3629 },
3630 .write = write_jedec_1,
3631 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003632 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003633 .prepare_access = prepare_memory_access,
3634 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00003635 },
3636
3637 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003638 .vendor = "Catalyst",
3639 .name = "CAT28F512",
3640 .bustype = BUS_PARALLEL,
3641 .manufacture_id = CATALYST_ID,
3642 .model_id = CATALYST_CAT28F512,
3643 .total_size = 64,
3644 .page_size = 0, /* unused */
3645 .feature_bits = 0,
Alan Green908adf42019-07-03 15:34:06 +10003646 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
Alan Green1f9cc7d2019-07-01 11:10:45 +10003647 .probe = probe_jedec, /* FIXME! */
3648 .probe_timing = TIMING_ZERO,
3649 .block_erasers =
3650 {
3651 {
3652 .eraseblocks = { {64 * 1024, 1} },
3653 .block_erase = NULL, /* TODO */
3654 },
3655 },
3656 .write = NULL, /* TODO */
3657 .read = read_memmapped,
3658 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003659 .prepare_access = prepare_memory_access,
3660 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003661 },
3662
3663 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003664 .vendor = "ENE",
3665 .name = "KB9012 (EDI)",
3666 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003667 .total_size = 128,
3668 .page_size = 128,
3669 .feature_bits = FEATURE_ERASED_ZERO,
3670 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10003671 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003672 .probe = edi_probe_kb9012,
3673 .probe_timing = TIMING_ZERO,
3674 .block_erasers =
3675 {
3676 {
3677 .eraseblocks = { {128, 1024} },
3678 .block_erase = edi_chip_block_erase,
3679 },
3680 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003681 .write = edi_chip_write,
3682 .read = edi_chip_read,
3683 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003684 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003685 },
3686
3687 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003688 .vendor = "ESI",
3689 .name = "ES25P16",
3690 .bustype = BUS_SPI,
3691 .manufacture_id = EXCEL_ID_NOPREFIX,
3692 .model_id = EXCEL_ES25P16,
3693 .total_size = 2 * 1024,
3694 .page_size = 256,
3695 /* 256-byte parameter page separate from memory array:
3696 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3697 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003698 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003699 .probe = probe_spi_rdid,
3700 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003701 .block_erasers =
3702 {
3703 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003704 .eraseblocks = { {64 * 1024, 32} },
3705 .block_erase = spi_block_erase_d8,
Sean Nelson54596372010-01-09 05:30:14 +00003706 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003707 .eraseblocks = { {2 * 1024 * 1024, 1} },
3708 .block_erase = spi_block_erase_c7,
Sean Nelson54596372010-01-09 05:30:14 +00003709 }
3710 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003711 .printlock = spi_prettyprint_status_register_bp2_srwd,
3712 .unlock = spi_disable_blockprotect_bp2_srwd,
3713 .write = spi_chip_write_256,
3714 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3715 .voltage = {2700, 3600},
3716 },
3717
3718 {
3719 .vendor = "ESI",
3720 .name = "ES25P40",
3721 .bustype = BUS_SPI,
3722 .manufacture_id = EXCEL_ID_NOPREFIX,
3723 .model_id = EXCEL_ES25P40,
3724 .total_size = 512,
3725 .page_size = 256,
3726 /* 256-byte parameter page separate from memory array:
3727 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3728 .feature_bits = FEATURE_WRSR_WREN,
3729 .tested = TEST_UNTESTED,
3730 .probe = probe_spi_rdid,
3731 .probe_timing = TIMING_ZERO,
3732 .block_erasers =
3733 {
3734 {
3735 .eraseblocks = { {64 * 1024, 8} },
3736 .block_erase = spi_block_erase_d8,
3737 }, {
3738 .eraseblocks = { {512 * 1024, 1} },
3739 .block_erase = spi_block_erase_c7,
3740 }
3741 },
3742 .printlock = spi_prettyprint_status_register_bp2_srwd,
3743 .unlock = spi_disable_blockprotect_bp2_srwd,
3744 .write = spi_chip_write_256,
3745 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3746 .voltage = {2700, 3600},
3747 },
3748
3749 {
3750 .vendor = "ESI",
3751 .name = "ES25P80",
3752 .bustype = BUS_SPI,
3753 .manufacture_id = EXCEL_ID_NOPREFIX,
3754 .model_id = EXCEL_ES25P80,
3755 .total_size = 1024,
3756 .page_size = 256,
3757 /* 256-byte parameter page separate from memory array:
3758 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3759 .feature_bits = FEATURE_WRSR_WREN,
3760 .tested = TEST_UNTESTED,
3761 .probe = probe_spi_rdid,
3762 .probe_timing = TIMING_ZERO,
3763 .block_erasers =
3764 {
3765 {
3766 .eraseblocks = { {64 * 1024, 16} },
3767 .block_erase = spi_block_erase_d8,
3768 }, {
3769 .eraseblocks = { {1024 * 1024, 1} },
3770 .block_erase = spi_block_erase_c7,
3771 }
3772 },
3773 .printlock = spi_prettyprint_status_register_bp2_srwd,
3774 .unlock = spi_disable_blockprotect_bp2_srwd,
3775 .write = spi_chip_write_256,
3776 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3777 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00003778 },
3779
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003780 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003781 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003782 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003783 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003784 .manufacture_id = ESMT_ID,
3785 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003786 .total_size = 1024,
3787 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003788 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003789 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003790 .probe = probe_spi_rdid,
3791 .probe_timing = TIMING_ZERO,
3792 .block_erasers =
3793 {
3794 {
3795 .eraseblocks = { {4 * 1024, 256} },
3796 .block_erase = spi_block_erase_20,
3797 }, {
3798 .eraseblocks = { {64 * 1024, 16} },
3799 .block_erase = spi_block_erase_d8,
3800 }, {
3801 .eraseblocks = { {1024 * 1024, 1} },
3802 .block_erase = spi_block_erase_60,
3803 }, {
3804 .eraseblocks = { {1024 * 1024, 1} },
3805 .block_erase = spi_block_erase_c7,
3806 }
3807 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003808 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003809 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003810 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003811 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003812 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003813 },
3814
3815 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003816 .vendor = "ESMT",
3817 .name = "F25L32PA",
3818 .bustype = BUS_SPI,
3819 .manufacture_id = ESMT_ID,
3820 .model_id = ESMT_F25L32PA,
3821 .total_size = 4096,
3822 .page_size = 256,
3823 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3824 .tested = TEST_UNTESTED,
3825 .probe = probe_spi_rdid,
3826 .probe_timing = TIMING_ZERO,
3827 .block_erasers =
3828 {
3829 {
3830 .eraseblocks = { {4 * 1024, 1024} },
3831 .block_erase = spi_block_erase_20,
3832 }, {
3833 .eraseblocks = { {64 * 1024, 64} },
3834 .block_erase = spi_block_erase_d8,
3835 }, {
3836 .eraseblocks = { {4 * 1024 * 1024, 1} },
3837 .block_erase = spi_block_erase_60,
3838 }, {
3839 .eraseblocks = { {4 * 1024 * 1024, 1} },
3840 .block_erase = spi_block_erase_c7,
3841 }
3842 },
3843 .printlock = spi_prettyprint_status_register_bp2_bpl,
3844 .unlock = spi_disable_blockprotect,
3845 .write = spi_chip_write_256,
3846 .read = spi_chip_read,
3847 .voltage = {2700, 3600},
3848 },
3849
3850 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003851 .vendor = "ESMT",
3852 .name = "F49B002UA",
3853 .bustype = BUS_PARALLEL,
3854 .manufacture_id = ESMT_ID,
3855 .model_id = ESMT_F49B002UA,
3856 .total_size = 256,
3857 .page_size = 4096,
3858 .feature_bits = FEATURE_EITHER_RESET,
3859 .tested = TEST_UNTESTED,
3860 .probe = probe_jedec,
3861 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3862 .block_erasers =
3863 {
3864 {
3865 .eraseblocks = {
3866 {128 * 1024, 1},
3867 {96 * 1024, 1},
3868 {8 * 1024, 2},
3869 {16 * 1024, 1},
3870 },
3871 .block_erase = erase_sector_jedec,
3872 }, {
3873 .eraseblocks = { {256 * 1024, 1} },
3874 .block_erase = erase_chip_block_jedec,
3875 }
3876 },
3877 .write = write_jedec_1,
3878 .read = read_memmapped,
3879 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003880 .prepare_access = prepare_memory_access,
3881 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003882 },
3883
3884 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003885 .vendor = "Eon",
3886 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003887 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003888 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003889 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003890 .total_size = 64,
3891 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003892 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003893 .tested = TEST_UNTESTED,
3894 .probe = probe_spi_rdid,
3895 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003896 .block_erasers =
3897 {
3898 {
3899 .eraseblocks = {
3900 {4 * 1024, 2},
3901 {8 * 1024, 1},
3902 {16 * 1024, 1},
3903 {32 * 1024, 1},
3904 },
3905 .block_erase = spi_block_erase_d8,
3906 }, {
3907 .eraseblocks = { {64 * 1024, 1} },
3908 .block_erase = spi_block_erase_c7,
3909 }
3910 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003911 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003912 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003913 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003914 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003915 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003916 },
3917
3918 {
3919 .vendor = "Eon",
3920 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003921 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003922 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003923 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003924 .total_size = 64,
3925 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003926 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003927 .tested = TEST_UNTESTED,
3928 .probe = probe_spi_rdid,
3929 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003930 .block_erasers =
3931 {
3932 {
3933 .eraseblocks = {
3934 {32 * 1024, 1},
3935 {16 * 1024, 1},
3936 {8 * 1024, 1},
3937 {4 * 1024, 2},
3938 },
3939 .block_erase = spi_block_erase_d8,
3940 }, {
3941 .eraseblocks = { {64 * 1024, 1} },
3942 .block_erase = spi_block_erase_c7,
3943 }
3944 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003945 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003946 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003947 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003948 .read = spi_chip_read, /* Fast read (0x0B) supported */
3949 .voltage = {2700, 3600},
3950 },
3951
3952 {
3953 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003954 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003955 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003956 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003957 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003958 .total_size = 128,
3959 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003960 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003961 .tested = TEST_UNTESTED,
3962 .probe = probe_spi_rdid,
3963 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003964 .block_erasers =
3965 {
3966 {
3967 .eraseblocks = {
3968 {4 * 1024, 2},
3969 {8 * 1024, 1},
3970 {16 * 1024, 1},
3971 {32 * 1024, 3},
3972 },
3973 .block_erase = spi_block_erase_d8,
3974 }, {
3975 .eraseblocks = { {128 * 1024, 1} },
3976 .block_erase = spi_block_erase_c7,
3977 }
3978 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003979 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003980 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003981 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003982 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003983 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003984 },
3985
3986 {
3987 .vendor = "Eon",
3988 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003989 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003990 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003991 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003992 .total_size = 128,
3993 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003994 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003995 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003996 .probe = probe_spi_rdid,
3997 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003998 .block_erasers =
3999 {
4000 {
4001 .eraseblocks = {
4002 {32 * 1024, 3},
4003 {16 * 1024, 1},
4004 {8 * 1024, 1},
4005 {4 * 1024, 2},
4006 },
4007 .block_erase = spi_block_erase_d8,
4008 }, {
4009 .eraseblocks = { {128 * 1024, 1} },
4010 .block_erase = spi_block_erase_c7,
4011 }
4012 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004013 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004014 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004015 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004016 .read = spi_chip_read, /* Fast read (0x0B) supported */
4017 .voltage = {2700, 3600},
4018 },
4019
4020 {
4021 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004022 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004023 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004024 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004025 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004026 .total_size = 2048,
4027 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004028 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004029 .tested = TEST_UNTESTED,
4030 .probe = probe_spi_rdid,
4031 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004032 .block_erasers =
4033 {
4034 {
4035 .eraseblocks = {
4036 {4 * 1024, 2},
4037 {8 * 1024, 1},
4038 {16 * 1024, 1},
4039 {32 * 1024, 1},
4040 {64 * 1024, 31},
4041 },
4042 .block_erase = spi_block_erase_d8,
4043 }, {
4044 .eraseblocks = { {2 * 1024 * 1024, 1} },
4045 .block_erase = spi_block_erase_c7,
4046 }
4047 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004048 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004049 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004050 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004051 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004052 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004053 },
4054
4055 {
4056 .vendor = "Eon",
4057 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004058 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004059 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004060 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004061 .total_size = 2048,
4062 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004063 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004064 .tested = TEST_UNTESTED,
4065 .probe = probe_spi_rdid,
4066 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004067 .block_erasers =
4068 {
4069 {
4070 .eraseblocks = {
4071 {64 * 1024, 31},
4072 {32 * 1024, 1},
4073 {16 * 1024, 1},
4074 {8 * 1024, 1},
4075 {4 * 1024, 2},
4076 },
4077 .block_erase = spi_block_erase_d8,
4078 }, {
4079 .eraseblocks = { {2 * 1024 * 1024, 1} },
4080 .block_erase = spi_block_erase_c7,
4081 }
4082 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004083 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004084 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004085 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004086 .read = spi_chip_read, /* Fast read (0x0B) supported */
4087 .voltage = {2700, 3600},
4088 },
4089
4090 {
4091 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004092 .name = "EN25B20",
Stefan Taunerb175af52015-01-24 15:06:27 +00004093 .bustype = BUS_SPI,
4094 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004095 .model_id = EON_EN25B20,
4096 .total_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004097 .page_size = 256,
4098 .feature_bits = FEATURE_WRSR_WREN,
4099 .tested = TEST_UNTESTED,
4100 .probe = probe_spi_rdid,
4101 .probe_timing = TIMING_ZERO,
4102 .block_erasers =
4103 {
4104 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004105 .eraseblocks = {
4106 {4 * 1024, 2},
4107 {8 * 1024, 1},
4108 {16 * 1024, 1},
4109 {32 * 1024, 1},
4110 {64 * 1024, 3}
4111 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004112 .block_erase = spi_block_erase_d8,
4113 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004114 .eraseblocks = { {256 * 1024, 1} },
4115 .block_erase = spi_block_erase_c7,
4116 }
4117 },
4118 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4119 .unlock = spi_disable_blockprotect,
4120 .write = spi_chip_write_256,
4121 .read = spi_chip_read, /* Fast read (0x0B) supported */
4122 .voltage = {2700, 3600},
4123 },
4124
4125 {
4126 .vendor = "Eon",
4127 .name = "EN25B20T",
4128 .bustype = BUS_SPI,
4129 .manufacture_id = EON_ID_NOPREFIX,
4130 .model_id = EON_EN25B20,
4131 .total_size = 256,
4132 .page_size = 256,
4133 .feature_bits = FEATURE_WRSR_WREN,
4134 .tested = TEST_UNTESTED,
4135 .probe = probe_spi_rdid,
4136 .probe_timing = TIMING_ZERO,
4137 .block_erasers =
4138 {
4139 {
4140 .eraseblocks = {
4141 {64 * 1024, 3},
4142 {32 * 1024, 1},
4143 {16 * 1024, 1},
4144 {8 * 1024, 1},
4145 {4 * 1024, 2},
4146 },
4147 .block_erase = spi_block_erase_d8,
4148 }, {
4149 .eraseblocks = { {256 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004150 .block_erase = spi_block_erase_c7,
4151 }
4152 },
4153 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4154 .unlock = spi_disable_blockprotect,
4155 .write = spi_chip_write_256,
4156 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004157 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004158 },
4159
4160 {
4161 .vendor = "Eon",
4162 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004163 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004164 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004165 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004166 .total_size = 4096,
4167 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004168 /* OTP: 512B total; enter 0x3A */
4169 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004170 .tested = TEST_UNTESTED,
4171 .probe = probe_spi_rdid,
4172 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004173 .block_erasers =
4174 {
4175 {
4176 .eraseblocks = {
4177 {4 * 1024, 2},
4178 {8 * 1024, 1},
4179 {16 * 1024, 1},
4180 {32 * 1024, 1},
4181 {64 * 1024, 63},
4182 },
4183 .block_erase = spi_block_erase_d8,
4184 }, {
4185 .eraseblocks = { {4 * 1024 * 1024, 1} },
4186 .block_erase = spi_block_erase_c7,
4187 }
4188 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004189 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004190 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004191 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004192 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004193 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004194 },
4195
4196 {
4197 .vendor = "Eon",
4198 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004199 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004200 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004201 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004202 .total_size = 4096,
4203 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004204 /* OTP: 512B total; enter 0x3A */
4205 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004206 .tested = TEST_UNTESTED,
4207 .probe = probe_spi_rdid,
4208 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004209 .block_erasers =
4210 {
4211 {
4212 .eraseblocks = {
4213 {64 * 1024, 63},
4214 {32 * 1024, 1},
4215 {16 * 1024, 1},
4216 {8 * 1024, 1},
4217 {4 * 1024, 2},
4218 },
4219 .block_erase = spi_block_erase_d8,
4220 }, {
4221 .eraseblocks = { {4 * 1024 * 1024, 1} },
4222 .block_erase = spi_block_erase_c7,
4223 }
4224 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004225 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004226 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004227 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004228 .read = spi_chip_read, /* Fast read (0x0B) supported */
4229 .voltage = {2700, 3600},
4230 },
4231
4232 {
4233 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004234 .name = "EN25B40",
Stefan Taunerb175af52015-01-24 15:06:27 +00004235 .bustype = BUS_SPI,
4236 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004237 .model_id = EON_EN25B40,
4238 .total_size = 512,
Stefan Taunerb175af52015-01-24 15:06:27 +00004239 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004240 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004241 .tested = TEST_UNTESTED,
4242 .probe = probe_spi_rdid,
4243 .probe_timing = TIMING_ZERO,
4244 .block_erasers =
4245 {
4246 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004247 .eraseblocks = {
4248 {4 * 1024, 2},
4249 {8 * 1024, 1},
4250 {16 * 1024, 1},
4251 {32 * 1024, 1},
4252 {64 * 1024, 7}
4253 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004254 .block_erase = spi_block_erase_d8,
4255 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004256 .eraseblocks = { {512 * 1024, 1} },
4257 .block_erase = spi_block_erase_c7,
4258 }
4259 },
4260 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4261 .unlock = spi_disable_blockprotect,
4262 .write = spi_chip_write_256,
4263 .read = spi_chip_read, /* Fast read (0x0B) supported */
4264 .voltage = {2700, 3600},
4265 },
4266
4267 {
4268 .vendor = "Eon",
4269 .name = "EN25B40T",
4270 .bustype = BUS_SPI,
4271 .manufacture_id = EON_ID_NOPREFIX,
4272 .model_id = EON_EN25B40,
4273 .total_size = 512,
4274 .page_size = 256,
4275 .feature_bits = FEATURE_WRSR_WREN,
4276 .tested = TEST_UNTESTED,
4277 .probe = probe_spi_rdid,
4278 .probe_timing = TIMING_ZERO,
4279 .block_erasers =
4280 {
4281 {
4282 .eraseblocks = {
4283 {64 * 1024, 7},
4284 {32 * 1024, 1},
4285 {16 * 1024, 1},
4286 {8 * 1024, 1},
4287 {4 * 1024, 2},
4288 },
4289 .block_erase = spi_block_erase_d8,
4290 }, {
4291 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004292 .block_erase = spi_block_erase_c7,
4293 }
4294 },
4295 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4296 .unlock = spi_disable_blockprotect,
4297 .write = spi_chip_write_256,
4298 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004299 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004300 },
4301
4302 {
4303 .vendor = "Eon",
4304 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004305 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004306 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004307 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004308 .total_size = 8192,
4309 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004310 /* OTP: 512B total; enter 0x3A */
4311 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004312 .tested = TEST_UNTESTED,
4313 .probe = probe_spi_rdid,
4314 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004315 .block_erasers =
4316 {
4317 {
4318 .eraseblocks = {
4319 {4 * 1024, 2},
4320 {8 * 1024, 1},
4321 {16 * 1024, 1},
4322 {32 * 1024, 1},
4323 {64 * 1024, 127},
4324 },
4325 .block_erase = spi_block_erase_d8,
4326 }, {
4327 .eraseblocks = { {8 * 1024 * 1024, 1} },
4328 .block_erase = spi_block_erase_c7,
4329 }
4330 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004331 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004332 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004333 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004334 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004335 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004336 },
4337
4338 {
4339 .vendor = "Eon",
4340 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004341 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004342 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004343 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004344 .total_size = 8192,
4345 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004346 /* OTP: 512B total; enter 0x3A */
4347 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004348 .tested = TEST_UNTESTED,
4349 .probe = probe_spi_rdid,
4350 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004351 .block_erasers =
4352 {
4353 {
4354 .eraseblocks = {
4355 {64 * 1024, 127},
4356 {32 * 1024, 1},
4357 {16 * 1024, 1},
4358 {8 * 1024, 1},
4359 {4 * 1024, 2},
4360 },
4361 .block_erase = spi_block_erase_d8,
4362 }, {
4363 .eraseblocks = { {8 * 1024 * 1024, 1} },
4364 .block_erase = spi_block_erase_c7,
4365 }
4366 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004367 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004368 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004369 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004370 .read = spi_chip_read, /* Fast read (0x0B) supported */
4371 .voltage = {2700, 3600},
4372 },
4373
4374 {
4375 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004376 .name = "EN25B80",
Stefan Taunerb175af52015-01-24 15:06:27 +00004377 .bustype = BUS_SPI,
4378 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004379 .model_id = EON_EN25B80,
4380 .total_size = 1024,
Stefan Taunerb175af52015-01-24 15:06:27 +00004381 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004382 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004383 .tested = TEST_UNTESTED,
4384 .probe = probe_spi_rdid,
4385 .probe_timing = TIMING_ZERO,
4386 .block_erasers =
4387 {
4388 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004389 .eraseblocks = {
4390 {4 * 1024, 2},
4391 {8 * 1024, 1},
4392 {16 * 1024, 1},
4393 {32 * 1024, 1},
4394 {64 * 1024, 15}
4395 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004396 .block_erase = spi_block_erase_d8,
4397 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004398 .eraseblocks = { {1024 * 1024, 1} },
4399 .block_erase = spi_block_erase_c7,
4400 }
4401 },
4402 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4403 .unlock = spi_disable_blockprotect,
4404 .write = spi_chip_write_256,
4405 .read = spi_chip_read, /* Fast read (0x0B) supported */
4406 .voltage = {2700, 3600},
4407 },
4408
4409 {
4410 .vendor = "Eon",
4411 .name = "EN25B80T",
4412 .bustype = BUS_SPI,
4413 .manufacture_id = EON_ID_NOPREFIX,
4414 .model_id = EON_EN25B80,
4415 .total_size = 1024,
4416 .page_size = 256,
4417 .feature_bits = FEATURE_WRSR_WREN,
4418 .tested = TEST_UNTESTED,
4419 .probe = probe_spi_rdid,
4420 .probe_timing = TIMING_ZERO,
4421 .block_erasers =
4422 {
4423 {
4424 .eraseblocks = {
4425 {64 * 1024, 15},
4426 {32 * 1024, 1},
4427 {16 * 1024, 1},
4428 {8 * 1024, 1},
4429 {4 * 1024, 2},
4430 },
4431 .block_erase = spi_block_erase_d8,
4432 }, {
4433 .eraseblocks = { {1024 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004434 .block_erase = spi_block_erase_c7,
4435 }
4436 },
4437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4438 .unlock = spi_disable_blockprotect,
4439 .write = spi_chip_write_256,
4440 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004441 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004442 },
4443
4444 {
4445 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004446 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004447 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004448 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004449 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004450 .total_size = 64,
4451 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004452 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004453 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004454 .probe = probe_spi_rdid,
4455 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004456 .block_erasers =
4457 {
4458 {
4459 .eraseblocks = { {4 * 1024, 16} },
4460 .block_erase = spi_block_erase_20,
4461 }, {
4462 .eraseblocks = { {32 * 1024, 2} },
4463 .block_erase = spi_block_erase_d8,
4464 }, {
4465 .eraseblocks = { {32 * 1024, 2} },
4466 .block_erase = spi_block_erase_52,
4467 }, {
4468 .eraseblocks = { {64 * 1024, 1} },
4469 .block_erase = spi_block_erase_60,
4470 }, {
4471 .eraseblocks = { {64 * 1024, 1} },
4472 .block_erase = spi_block_erase_c7,
4473 }
4474 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004475 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004476 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004477 .write = spi_chip_write_256,
4478 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004479 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004480 },
4481
4482 {
4483 .vendor = "Eon",
4484 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004485 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004486 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004487 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004488 .total_size = 128,
4489 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004490 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrowd173ed42021-09-29 09:28:07 +02004491 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004492 .probe = probe_spi_rdid,
4493 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004494 .block_erasers =
4495 {
4496 {
4497 .eraseblocks = { {4 * 1024, 32} },
4498 .block_erase = spi_block_erase_20,
4499 }, {
4500 .eraseblocks = { {32 * 1024, 4} },
4501 .block_erase = spi_block_erase_d8,
4502 }, {
4503 .eraseblocks = { {32 * 1024, 4} },
4504 .block_erase = spi_block_erase_52,
4505 }, {
4506 .eraseblocks = { {128 * 1024, 1} },
4507 .block_erase = spi_block_erase_60,
4508 }, {
4509 .eraseblocks = { {128 * 1024, 1} },
4510 .block_erase = spi_block_erase_c7,
4511 }
4512 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004513 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004514 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004515 .write = spi_chip_write_256,
4516 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004517 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004518 },
4519
4520 {
4521 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004522 .name = "EN25F16",
4523 .bustype = BUS_SPI,
4524 .manufacture_id = EON_ID_NOPREFIX,
4525 .model_id = EON_EN25F16,
4526 .total_size = 2048,
4527 .page_size = 256,
4528 .feature_bits = FEATURE_WRSR_WREN,
4529 .tested = TEST_OK_PREW,
4530 .probe = probe_spi_rdid,
4531 .probe_timing = TIMING_ZERO,
4532 .block_erasers =
4533 {
4534 {
4535 .eraseblocks = { {4 * 1024, 512} },
4536 .block_erase = spi_block_erase_20,
4537 }, {
4538 .eraseblocks = { {64 * 1024, 32} },
4539 .block_erase = spi_block_erase_d8,
4540 }, {
4541 .eraseblocks = { {2 * 1024 * 1024, 1} },
4542 .block_erase = spi_block_erase_60,
4543 }, {
4544 .eraseblocks = { {2 * 1024 * 1024, 1} },
4545 .block_erase = spi_block_erase_c7,
4546 }
4547 },
4548 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4549 .unlock = spi_disable_blockprotect,
4550 .write = spi_chip_write_256,
4551 .read = spi_chip_read,
4552 .voltage = {2700, 3600},
4553 },
4554
4555 {
4556 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004557 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004558 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004559 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004560 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004561 .total_size = 256,
4562 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004563 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004564 .tested = TEST_UNTESTED,
4565 .probe = probe_spi_rdid,
4566 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004567 .block_erasers =
4568 {
4569 {
4570 .eraseblocks = { {4 * 1024, 64} },
4571 .block_erase = spi_block_erase_20,
4572 }, {
4573 .eraseblocks = { {64 * 1024, 4} },
4574 .block_erase = spi_block_erase_d8,
4575 }, {
4576 .eraseblocks = { {64 * 1024, 4} },
4577 .block_erase = spi_block_erase_52,
4578 }, {
4579 .eraseblocks = { {256 * 1024, 1} },
4580 .block_erase = spi_block_erase_60,
4581 }, {
4582 .eraseblocks = { {256 * 1024, 1} },
4583 .block_erase = spi_block_erase_c7,
4584 }
4585 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004586 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004587 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004588 .write = spi_chip_write_256,
4589 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004590 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004591 },
4592
4593 {
4594 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004595 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004596 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004597 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004598 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004599 .total_size = 4096,
4600 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004601 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004602 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004603 .probe = probe_spi_rdid,
4604 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004605 .block_erasers =
4606 {
4607 {
4608 .eraseblocks = { {4 * 1024, 1024} },
4609 .block_erase = spi_block_erase_20,
4610 }, {
4611 .eraseblocks = { {64 * 1024, 64} },
4612 .block_erase = spi_block_erase_d8,
4613 }, {
4614 .eraseblocks = { {4 * 1024 * 1024, 1} },
4615 .block_erase = spi_block_erase_60,
4616 }, {
4617 .eraseblocks = { {4 * 1024 * 1024, 1} },
4618 .block_erase = spi_block_erase_c7,
4619 }
4620 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004621 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004622 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004623 .write = spi_chip_write_256,
4624 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004625 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004626 },
4627
4628 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004629 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004630 .name = "EN25F40",
4631 .bustype = BUS_SPI,
4632 .manufacture_id = EON_ID_NOPREFIX,
4633 .model_id = EON_EN25F40,
4634 .total_size = 512,
4635 .page_size = 256,
4636 .feature_bits = FEATURE_WRSR_WREN,
4637 .tested = TEST_OK_PREW,
4638 .probe = probe_spi_rdid,
4639 .probe_timing = TIMING_ZERO,
4640 .block_erasers =
4641 {
4642 {
4643 .eraseblocks = { {4 * 1024, 128} },
4644 .block_erase = spi_block_erase_20,
4645 }, {
4646 .eraseblocks = { {64 * 1024, 8} },
4647 .block_erase = spi_block_erase_d8,
4648 }, {
4649 .eraseblocks = { {512 * 1024, 1} },
4650 .block_erase = spi_block_erase_60,
4651 }, {
4652 .eraseblocks = { {512 * 1024, 1} },
4653 .block_erase = spi_block_erase_c7,
4654 },
4655 },
4656 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4657 .unlock = spi_disable_blockprotect,
4658 .write = spi_chip_write_256,
4659 .read = spi_chip_read,
4660 .voltage = {2700, 3600},
4661 },
4662
4663 {
4664 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004665 .name = "EN25F64",
4666 .bustype = BUS_SPI,
4667 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004668 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004669 .total_size = 8192,
4670 .page_size = 256,
4671 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004672 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004673 .probe = probe_spi_rdid,
4674 .probe_timing = TIMING_ZERO,
4675 .block_erasers =
4676 {
4677 {
4678 .eraseblocks = { {4 * 1024, 2048} },
4679 .block_erase = spi_block_erase_20,
4680 }, {
4681 .eraseblocks = { {64 * 1024, 128} },
4682 .block_erase = spi_block_erase_d8,
4683 }, {
4684 .eraseblocks = { {8 * 1024 * 1024, 1} },
4685 .block_erase = spi_block_erase_60,
4686 }, {
4687 .eraseblocks = { {8 * 1024 * 1024, 1} },
4688 .block_erase = spi_block_erase_c7,
4689 }
4690 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004691 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004692 .unlock = spi_disable_blockprotect,
4693 .write = spi_chip_write_256,
4694 .read = spi_chip_read,
4695 .voltage = {2700, 3600},
4696 },
4697
4698 {
4699 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004700 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004701 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004702 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004703 .model_id = EON_EN25F80,
David Hendricks6d715302011-07-24 22:21:57 +00004704 .total_size = 1024,
4705 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004706 .feature_bits = FEATURE_WRSR_WREN,
4707 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004708 .probe = probe_spi_rdid,
4709 .probe_timing = TIMING_ZERO,
4710 .block_erasers =
4711 {
4712 {
4713 .eraseblocks = { {4 * 1024, 256} },
4714 .block_erase = spi_block_erase_20,
4715 }, {
4716 .eraseblocks = { {64 * 1024, 16} },
4717 .block_erase = spi_block_erase_d8,
4718 }, {
4719 .eraseblocks = { {1024 * 1024, 1} },
4720 .block_erase = spi_block_erase_60,
4721 }, {
4722 .eraseblocks = { {1024 * 1024, 1} },
4723 .block_erase = spi_block_erase_c7,
4724 }
4725 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004726 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004727 .unlock = spi_disable_blockprotect,
4728 .write = spi_chip_write_256,
4729 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004730 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004731 },
4732
4733 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004734 .vendor = "Eon",
4735 .name = "EN25P05",
4736 .bustype = BUS_SPI,
4737 .manufacture_id = EON_ID_NOPREFIX,
4738 .model_id = EON_EN25B05,
4739 .total_size = 64,
4740 .page_size = 256,
4741 .feature_bits = FEATURE_WRSR_WREN,
4742 .tested = TEST_UNTESTED,
4743 .probe = probe_spi_rdid,
4744 .probe_timing = TIMING_ZERO,
4745 .block_erasers =
4746 {
4747 {
4748 .eraseblocks = {
4749 {32 * 1024, 2} },
4750 .block_erase = spi_block_erase_d8,
4751 }, {
4752 .eraseblocks = { {64 * 1024, 1} },
4753 .block_erase = spi_block_erase_c7,
4754 }
4755 },
4756 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4757 .unlock = spi_disable_blockprotect,
4758 .write = spi_chip_write_256,
4759 .read = spi_chip_read, /* Fast read (0x0B) supported */
4760 .voltage = {2700, 3600},
4761 },
4762
4763 {
4764 .vendor = "Eon",
4765 .name = "EN25P10",
4766 .bustype = BUS_SPI,
4767 .manufacture_id = EON_ID_NOPREFIX,
4768 .model_id = EON_EN25B10,
4769 .total_size = 128,
4770 .page_size = 256,
4771 .feature_bits = FEATURE_WRSR_WREN,
4772 .tested = TEST_UNTESTED,
4773 .probe = probe_spi_rdid,
4774 .probe_timing = TIMING_ZERO,
4775 .block_erasers =
4776 {
4777 {
4778 .eraseblocks = { {32 * 1024, 4} },
4779 .block_erase = spi_block_erase_d8,
4780 }, {
4781 .eraseblocks = { {128 * 1024, 1} },
4782 .block_erase = spi_block_erase_c7,
4783 }
4784 },
4785 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4786 .unlock = spi_disable_blockprotect,
4787 .write = spi_chip_write_256,
4788 .read = spi_chip_read, /* Fast read (0x0B) supported */
4789 .voltage = {2700, 3600},
4790 },
4791
4792 {
4793 .vendor = "Eon",
4794 .name = "EN25P16",
4795 .bustype = BUS_SPI,
4796 .manufacture_id = EON_ID_NOPREFIX,
4797 .model_id = EON_EN25B16,
4798 .total_size = 2048,
4799 .page_size = 256,
4800 .feature_bits = FEATURE_WRSR_WREN,
4801 .tested = TEST_UNTESTED,
4802 .probe = probe_spi_rdid,
4803 .probe_timing = TIMING_ZERO,
4804 .block_erasers =
4805 {
4806 {
4807 .eraseblocks = { {64 * 1024, 32} },
4808 .block_erase = spi_block_erase_d8,
4809 }, {
4810 .eraseblocks = { {2 * 1024 * 1024, 1} },
4811 .block_erase = spi_block_erase_c7,
4812 }
4813 },
4814 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4815 .unlock = spi_disable_blockprotect,
4816 .write = spi_chip_write_256,
4817 .read = spi_chip_read, /* Fast read (0x0B) supported */
4818 .voltage = {2700, 3600},
4819 },
4820
4821 {
4822 .vendor = "Eon",
4823 .name = "EN25P20",
4824 .bustype = BUS_SPI,
4825 .manufacture_id = EON_ID_NOPREFIX,
4826 .model_id = EON_EN25B20,
4827 .total_size = 256,
4828 .page_size = 256,
4829 .feature_bits = FEATURE_WRSR_WREN,
4830 .tested = TEST_UNTESTED,
4831 .probe = probe_spi_rdid,
4832 .probe_timing = TIMING_ZERO,
4833 .block_erasers =
4834 {
4835 {
4836 .eraseblocks = { {64 * 1024, 4} },
4837 .block_erase = spi_block_erase_d8,
4838 }, {
4839 .eraseblocks = { {256 * 1024, 1} },
4840 .block_erase = spi_block_erase_c7,
4841 }
4842 },
4843 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4844 .unlock = spi_disable_blockprotect,
4845 .write = spi_chip_write_256,
4846 .read = spi_chip_read, /* Fast read (0x0B) supported */
4847 .voltage = {2700, 3600},
4848 },
4849
4850 {
4851 .vendor = "Eon",
4852 .name = "EN25P32", /* Uniform version of EN25B32 */
4853 .bustype = BUS_SPI,
4854 .manufacture_id = EON_ID_NOPREFIX,
4855 .model_id = EON_EN25B32,
4856 .total_size = 4096,
4857 .page_size = 256,
4858 /* OTP: 512B total; enter 0x3A */
4859 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4860 .tested = TEST_UNTESTED,
4861 .probe = probe_spi_rdid,
4862 .probe_timing = TIMING_ZERO,
4863 .block_erasers =
4864 {
4865 {
4866 .eraseblocks = { {64 * 1024, 64} },
4867 .block_erase = spi_block_erase_d8,
4868 }, {
4869 .eraseblocks = { {4 * 1024 * 1024, 1} },
4870 .block_erase = spi_block_erase_c7,
4871 }
4872 },
4873 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4874 .unlock = spi_disable_blockprotect,
4875 .write = spi_chip_write_256,
4876 .read = spi_chip_read, /* Fast read (0x0B) supported */
4877 .voltage = {2700, 3600},
4878 },
4879
4880 {
4881 .vendor = "Eon",
4882 .name = "EN25P40",
4883 .bustype = BUS_SPI,
4884 .manufacture_id = EON_ID_NOPREFIX,
4885 .model_id = EON_EN25B40,
4886 .total_size = 512,
4887 .page_size = 256,
4888 .feature_bits = FEATURE_WRSR_WREN,
4889 .tested = TEST_UNTESTED,
4890 .probe = probe_spi_rdid,
4891 .probe_timing = TIMING_ZERO,
4892 .block_erasers =
4893 {
4894 {
4895 .eraseblocks = { {64 * 1024, 8} },
4896 .block_erase = spi_block_erase_d8,
4897 }, {
4898 .eraseblocks = { {512 * 1024, 1} },
4899 .block_erase = spi_block_erase_c7,
4900 }
4901 },
4902 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4903 .unlock = spi_disable_blockprotect,
4904 .write = spi_chip_write_256,
4905 .read = spi_chip_read, /* Fast read (0x0B) supported */
4906 .voltage = {2700, 3600},
4907 },
4908
4909 {
4910 .vendor = "Eon",
4911 .name = "EN25P64",
4912 .bustype = BUS_SPI,
4913 .manufacture_id = EON_ID_NOPREFIX,
4914 .model_id = EON_EN25B64,
4915 .total_size = 8192,
4916 .page_size = 256,
4917 /* OTP: 512B total; enter 0x3A */
4918 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4919 .tested = TEST_UNTESTED,
4920 .probe = probe_spi_rdid,
4921 .probe_timing = TIMING_ZERO,
4922 .block_erasers =
4923 {
4924 {
4925 .eraseblocks = { {64 * 1024, 128} },
4926 .block_erase = spi_block_erase_d8,
4927 }, {
4928 .eraseblocks = { {8 * 1024 * 1024, 1} },
4929 .block_erase = spi_block_erase_c7,
4930 }
4931 },
4932 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4933 .unlock = spi_disable_blockprotect,
4934 .write = spi_chip_write_256,
4935 .read = spi_chip_read, /* Fast read (0x0B) supported */
4936 .voltage = {2700, 3600},
4937 },
4938
4939 {
4940 .vendor = "Eon",
4941 .name = "EN25P80",
4942 .bustype = BUS_SPI,
4943 .manufacture_id = EON_ID_NOPREFIX,
4944 .model_id = EON_EN25B80,
4945 .total_size = 1024,
4946 .page_size = 256,
4947 .feature_bits = FEATURE_WRSR_WREN,
4948 .tested = TEST_UNTESTED,
4949 .probe = probe_spi_rdid,
4950 .probe_timing = TIMING_ZERO,
4951 .block_erasers =
4952 {
4953 {
4954 .eraseblocks = { {64 * 1024, 16} },
4955 .block_erase = spi_block_erase_d8,
4956 }, {
4957 .eraseblocks = { {1024 * 1024, 1} },
4958 .block_erase = spi_block_erase_c7,
4959 }
4960 },
4961 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4962 .unlock = spi_disable_blockprotect,
4963 .write = spi_chip_write_256,
4964 .read = spi_chip_read, /* Fast read (0x0B) supported */
4965 .voltage = {2700, 3600},
4966 },
4967
4968 {
4969 .vendor = "Eon",
4970 .name = "EN25Q128",
4971 .bustype = BUS_SPI,
4972 .manufacture_id = EON_ID_NOPREFIX,
4973 .model_id = EON_EN25Q128,
4974 .total_size = 16384,
4975 .page_size = 256,
4976 /* OTP: 512B total; enter 0x3A */
4977 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4978 .tested = TEST_OK_PREW,
4979 .probe = probe_spi_rdid,
4980 .probe_timing = TIMING_ZERO,
4981 .block_erasers =
4982 {
4983 {
4984 .eraseblocks = { {4 * 1024, 4096} },
4985 .block_erase = spi_block_erase_20,
4986 }, {
4987 .eraseblocks = { {64 * 1024, 256} },
4988 .block_erase = spi_block_erase_d8,
4989 }, {
4990 .eraseblocks = { {16 * 1024 * 1024, 1} },
4991 .block_erase = spi_block_erase_60,
4992 }, {
4993 .eraseblocks = { {16 * 1024 * 1024, 1} },
4994 .block_erase = spi_block_erase_c7,
4995 }
4996 },
4997 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4998 .unlock = spi_disable_blockprotect,
4999 .write = spi_chip_write_256,
5000 .read = spi_chip_read,
5001 },
5002
5003 {
David Hendricks6d715302011-07-24 22:21:57 +00005004 /* Note: EN25D16 is an evil twin which shares the model ID
5005 but has different write protection capabilities */
5006 .vendor = "Eon",
5007 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005008 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005009 .manufacture_id = EON_ID_NOPREFIX,
5010 .model_id = EON_EN25Q16,
5011 .total_size = 2048,
5012 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005013 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
5014 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00005015 .tested = TEST_UNTESTED,
5016 .probe = probe_spi_rdid,
5017 .probe_timing = TIMING_ZERO,
5018 .block_erasers =
5019 {
5020 {
5021 .eraseblocks = { {4 * 1024, 512} },
5022 .block_erase = spi_block_erase_20,
5023 }, {
5024 .eraseblocks = { {64 * 1024, 32} },
5025 .block_erase = spi_block_erase_d8,
5026 }, {
5027 /* not supported by Q16 version */
5028 .eraseblocks = { {64 * 1024, 32} },
5029 .block_erase = spi_block_erase_52,
5030 }, {
5031 .eraseblocks = { {2 * 1024 * 1024, 1} },
5032 .block_erase = spi_block_erase_60,
5033 }, {
5034 .eraseblocks = { {2 * 1024 * 1024, 1} },
5035 .block_erase = spi_block_erase_c7,
5036 }
5037 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005038 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005039 .unlock = spi_disable_blockprotect,
5040 .write = spi_chip_write_256,
5041 .read = spi_chip_read,
5042 .voltage = {2700, 3600},
5043 },
5044
5045 {
5046 .vendor = "Eon",
5047 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005048 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005049 .manufacture_id = EON_ID_NOPREFIX,
5050 .model_id = EON_EN25Q32,
5051 .total_size = 4096,
5052 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005053 /* OTP: 512B total; enter 0x3A */
5054 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005055 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005056 .probe = probe_spi_rdid,
5057 .probe_timing = TIMING_ZERO,
5058 .block_erasers =
5059 {
5060 {
5061 .eraseblocks = { {4 * 1024, 1024} },
5062 .block_erase = spi_block_erase_20,
5063 }, {
5064 .eraseblocks = { {64 * 1024, 64} },
5065 .block_erase = spi_block_erase_d8,
5066 }, {
5067 .eraseblocks = { {4 * 1024 * 1024, 1} },
5068 .block_erase = spi_block_erase_60,
5069 }, {
5070 .eraseblocks = { {4 * 1024 * 1024, 1} },
5071 .block_erase = spi_block_erase_c7,
5072 }
5073 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005074 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005075 .unlock = spi_disable_blockprotect,
5076 .write = spi_chip_write_256,
5077 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005078 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005079 },
5080
5081 {
5082 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005083 .name = "EN25Q40",
5084 .bustype = BUS_SPI,
5085 .manufacture_id = EON_ID_NOPREFIX,
5086 .model_id = EON_EN25Q40,
5087 .total_size = 512,
5088 .page_size = 256,
5089 /* OTP: 256B total; enter 0x3A */
5090 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5091 .tested = TEST_UNTESTED,
5092 .probe = probe_spi_rdid,
5093 .probe_timing = TIMING_ZERO,
5094 .block_erasers =
5095 {
5096 {
5097 .eraseblocks = { {4 * 1024, 128} },
5098 .block_erase = spi_block_erase_20,
5099 }, {
5100 .eraseblocks = { {64 * 1024, 8} },
5101 .block_erase = spi_block_erase_d8,
5102 }, {
5103 .eraseblocks = { {512 * 1024, 1} },
5104 .block_erase = spi_block_erase_60,
5105 }, {
5106 .eraseblocks = { {512 * 1024, 1} },
5107 .block_erase = spi_block_erase_c7,
5108 }
5109 },
5110 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5111 .unlock = spi_disable_blockprotect,
5112 .write = spi_chip_write_256,
5113 .read = spi_chip_read,
5114 .voltage = {2700, 3600},
5115 },
5116
5117 {
5118 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00005119 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005120 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005121 .manufacture_id = EON_ID_NOPREFIX,
5122 .model_id = EON_EN25Q64,
5123 .total_size = 8192,
5124 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005125 /* OTP: 512B total; enter 0x3A */
5126 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005127 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005128 .probe = probe_spi_rdid,
5129 .probe_timing = TIMING_ZERO,
5130 .block_erasers =
5131 {
5132 {
5133 .eraseblocks = { {4 * 1024, 2048} },
5134 .block_erase = spi_block_erase_20,
5135 }, {
5136 .eraseblocks = { {64 * 1024, 128} },
5137 .block_erase = spi_block_erase_d8,
5138 }, {
5139 .eraseblocks = { {8 * 1024 * 1024, 1} },
5140 .block_erase = spi_block_erase_60,
5141 }, {
5142 .eraseblocks = { {8 * 1024 * 1024, 1} },
5143 .block_erase = spi_block_erase_c7,
5144 }
5145 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005146 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005147 .unlock = spi_disable_blockprotect,
5148 .write = spi_chip_write_256,
5149 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005150 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005151 },
5152
5153 {
5154 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005155 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005156 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005157 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005158 .model_id = EON_EN25Q80,
5159 .total_size = 1024,
5160 .page_size = 256,
5161 /* OTP: 256B total; enter 0x3A */
5162 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5163 .tested = TEST_UNTESTED,
5164 .probe = probe_spi_rdid,
5165 .probe_timing = TIMING_ZERO,
5166 .block_erasers =
5167 {
5168 {
5169 .eraseblocks = { {4 * 1024, 256} },
5170 .block_erase = spi_block_erase_20,
5171 }, {
5172 .eraseblocks = { {64 * 1024, 16} },
5173 .block_erase = spi_block_erase_d8,
5174 }, {
5175 .eraseblocks = { {1024 * 1024, 1} },
5176 .block_erase = spi_block_erase_60,
5177 }, {
5178 .eraseblocks = { {1024 * 1024, 1} },
5179 .block_erase = spi_block_erase_c7,
5180 }
5181 },
5182 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5183 .unlock = spi_disable_blockprotect,
5184 .write = spi_chip_write_256,
5185 .read = spi_chip_read,
5186 .voltage = {2700, 3600},
5187 },
5188
5189 {
5190 .vendor = "Eon",
5191 .name = "EN25QH128",
5192 .bustype = BUS_SPI,
5193 .manufacture_id = EON_ID_NOPREFIX,
5194 .model_id = EON_EN25QH128,
David Hendricks6d715302011-07-24 22:21:57 +00005195 .total_size = 16384,
5196 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005197 /* supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00005198 /* OTP: 512B total; enter 0x3A */
Alan Green1f9cc7d2019-07-01 11:10:45 +10005199 /* QPI enable 0x38, disable 0xFF */
5200 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Tim Chenbfe149a2020-07-06 14:59:21 +08005201 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005202 .probe = probe_spi_rdid,
5203 .probe_timing = TIMING_ZERO,
5204 .block_erasers =
5205 {
5206 {
5207 .eraseblocks = { {4 * 1024, 4096} },
5208 .block_erase = spi_block_erase_20,
5209 }, {
5210 .eraseblocks = { {64 * 1024, 256} },
5211 .block_erase = spi_block_erase_d8,
5212 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005213 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005214 .block_erase = spi_block_erase_60,
5215 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005216 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005217 .block_erase = spi_block_erase_c7,
5218 }
5219 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005220 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5221 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005222 .write = spi_chip_write_256,
5223 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005224 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005225 .reg_bits =
5226 {
5227 .srp = {STATUS1, 7, RW},
5228 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5229 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5230 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005231 .wp_write_cfg = spi_wp_write_cfg,
5232 .wp_read_cfg = spi_wp_read_cfg,
5233 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005234 .decode_range = decode_range_spi25,
David Hendricks6d715302011-07-24 22:21:57 +00005235 },
5236
5237 {
5238 .vendor = "Eon",
5239 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005240 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005241 .manufacture_id = EON_ID_NOPREFIX,
5242 .model_id = EON_EN25QH16,
5243 .total_size = 2048,
5244 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005245 /* supports SFDP */
5246 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005247 /* QPI enable 0x38, disable 0xFF */
5248 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00005249 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005250 .probe = probe_spi_rdid,
5251 .probe_timing = TIMING_ZERO,
5252 .block_erasers =
5253 {
5254 {
5255 .eraseblocks = { {4 * 1024, 512} },
5256 .block_erase = spi_block_erase_20,
5257 }, {
5258 .eraseblocks = { {64 * 1024, 32} },
5259 .block_erase = spi_block_erase_d8,
5260 }, {
5261 .eraseblocks = { {1024 * 2048, 1} },
5262 .block_erase = spi_block_erase_60,
5263 }, {
5264 .eraseblocks = { {1024 * 2048, 1} },
5265 .block_erase = spi_block_erase_c7,
5266 }
5267 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005268 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005269 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005270 .write = spi_chip_write_256,
5271 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005272 .voltage = {2700, 3600},
5273 },
5274
5275 {
5276 .vendor = "Eon",
5277 .name = "EN25QH32",
5278 .bustype = BUS_SPI,
5279 .manufacture_id = EON_ID_NOPREFIX,
5280 .model_id = EON_EN25QH32,
5281 .total_size = 4096,
5282 .page_size = 256,
5283 /* supports SFDP */
5284 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005285 /* QPI enable 0x38, disable 0xFF */
5286 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005287 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005288 .probe = probe_spi_rdid,
5289 .probe_timing = TIMING_ZERO,
5290 .block_erasers =
5291 {
5292 {
5293 .eraseblocks = { {4 * 1024, 1024} },
5294 .block_erase = spi_block_erase_20,
5295 }, {
5296 .eraseblocks = { {64 * 1024, 64} },
5297 .block_erase = spi_block_erase_d8,
5298 }, {
5299 .eraseblocks = { {1024 * 4096, 1} },
5300 .block_erase = spi_block_erase_60,
5301 }, {
5302 .eraseblocks = { {1024 * 4096, 1} },
5303 .block_erase = spi_block_erase_c7,
5304 }
5305 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005306 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005307 .unlock = spi_disable_blockprotect_bp3_srwd,
5308 .write = spi_chip_write_256,
5309 .read = spi_chip_read,
5310 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005311 .reg_bits =
5312 {
5313 .srp = {STATUS1, 7, RW},
5314 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5315 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5316 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005317 .wp_write_cfg = spi_wp_write_cfg,
5318 .wp_read_cfg = spi_wp_read_cfg,
5319 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005320 .decode_range = decode_range_spi25,
5321 },
5322
5323 {
5324 .vendor = "Eon",
5325 .name = "EN25QH32B",
5326 .bustype = BUS_SPI,
5327 .manufacture_id = EON_ID_NOPREFIX,
5328 .model_id = EON_EN25QH32,
5329 .total_size = 4096,
5330 .page_size = 256,
5331 /* supports SFDP */
5332 /* OTP: 1536B total; enter 0x3A */
5333 /* QPI enable 0x38, disable 0xFF */
5334 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5335 .tested = TEST_OK_PREW,
5336 .probe = probe_spi_rdid,
5337 .probe_timing = TIMING_ZERO,
5338 .block_erasers =
5339 {
5340 {
5341 .eraseblocks = { {4 * 1024, 1024} },
5342 .block_erase = spi_block_erase_20,
5343 }, {
5344 .eraseblocks = { {32 * 1024, 128} },
5345 .block_erase = spi_block_erase_52,
5346 }, {
5347 .eraseblocks = { {64 * 1024, 64} },
5348 .block_erase = spi_block_erase_d8,
5349 }, {
5350 .eraseblocks = { {1024 * 4096, 1} },
5351 .block_erase = spi_block_erase_60,
5352 }, {
5353 .eraseblocks = { {1024 * 4096, 1} },
5354 .block_erase = spi_block_erase_c7,
5355 }
5356 },
5357 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5358 .unlock = spi_disable_blockprotect_bp3_srwd,
5359 .write = spi_chip_write_256,
5360 .read = spi_chip_read,
5361 .voltage = {2700, 3600},
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005362 },
5363
5364 {
5365 .vendor = "Eon",
5366 .name = "EN25QH64",
5367 .bustype = BUS_SPI,
5368 .manufacture_id = EON_ID_NOPREFIX,
5369 .model_id = EON_EN25QH64,
5370 .total_size = 8192,
5371 .page_size = 256,
5372 /* supports SFDP */
5373 /* OTP: 512B total; enter 0x3A */
5374 /* QPI enable 0x38, disable 0xFF */
5375 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005376 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005377 .probe = probe_spi_rdid,
5378 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005379 .block_erasers =
5380 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005381 {
5382 .eraseblocks = { {4 * 1024, 2048} },
5383 .block_erase = spi_block_erase_20,
5384 }, {
5385 .eraseblocks = { {64 * 1024, 128} },
5386 .block_erase = spi_block_erase_d8,
5387 }, {
5388 .eraseblocks = { { 8192 * 1024, 1} },
5389 .block_erase = spi_block_erase_60,
5390 }, {
5391 .eraseblocks = { { 8192 * 1024, 1} },
5392 .block_erase = spi_block_erase_c7,
5393 }
5394 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005395 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005396 .unlock = spi_disable_blockprotect_bp3_srwd,
5397 .write = spi_chip_write_256,
5398 .read = spi_chip_read,
5399 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005400 .reg_bits =
5401 {
5402 .srp = {STATUS1, 7, RW},
5403 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5404 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5405 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005406 .wp_write_cfg = spi_wp_write_cfg,
5407 .wp_read_cfg = spi_wp_read_cfg,
5408 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005409 .decode_range = decode_range_spi25_64k_block,
5410 },
5411
5412 {
5413 .vendor = "Eon",
5414 .name = "EN25QH64A",
5415 .bustype = BUS_SPI,
5416 .manufacture_id = EON_ID_NOPREFIX,
5417 .model_id = EON_EN25QH64,
5418 .total_size = 8192,
5419 .page_size = 256,
5420 /* supports SFDP */
5421 /* OTP: 512B total; enter 0x3A */
5422 /* QPI enable 0x38, disable 0xFF */
5423 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5424 .tested = TEST_OK_PREW,
5425 .probe = probe_spi_rdid,
5426 .probe_timing = TIMING_ZERO,
5427 .block_erasers =
5428 {
5429 {
5430 .eraseblocks = { {4 * 1024, 2048} },
5431 .block_erase = spi_block_erase_20,
5432 }, {
5433 .eraseblocks = { {32 * 1024, 256} },
5434 .block_erase = spi_block_erase_52,
5435 }, {
5436 .eraseblocks = { {64 * 1024, 128} },
5437 .block_erase = spi_block_erase_d8,
5438 }, {
5439 .eraseblocks = { { 8192 * 1024, 1} },
5440 .block_erase = spi_block_erase_60,
5441 }, {
5442 .eraseblocks = { { 8192 * 1024, 1} },
5443 .block_erase = spi_block_erase_c7,
5444 }
5445 },
5446 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5447 .unlock = spi_disable_blockprotect_bp3_srwd,
5448 .write = spi_chip_write_256,
5449 .read = spi_chip_read,
5450 .voltage = {2700, 3600},
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005451 },
5452
5453 {
5454 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005455 .name = "EN25S10",
5456 .bustype = BUS_SPI,
5457 .manufacture_id = EON_ID_NOPREFIX,
5458 .model_id = EON_EN25S10,
5459 .total_size = 128,
5460 .page_size = 256,
5461 /* OTP: 256B total; enter 0x3A */
5462 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5463 .tested = TEST_UNTESTED,
5464 .probe = probe_spi_rdid,
5465 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005466 .block_erasers =
5467 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005468 {
5469 .eraseblocks = { {4 * 1024, 32} },
5470 .block_erase = spi_block_erase_20,
5471 }, {
5472 .eraseblocks = { {32 * 1024, 4} },
5473 .block_erase = spi_block_erase_52,
5474 }, {
5475 .eraseblocks = { {128 * 1024, 1} },
5476 .block_erase = spi_block_erase_60,
5477 }, {
5478 .eraseblocks = { {128 * 1024, 1} },
5479 .block_erase = spi_block_erase_c7,
5480 }
5481 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005482 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005483 .unlock = spi_disable_blockprotect,
5484 .write = spi_chip_write_256,
5485 .read = spi_chip_read,
5486 .voltage = {1650, 1950},
5487 },
5488
5489 {
5490 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005491 .name = "EN25S16",
5492 .bustype = BUS_SPI,
5493 .manufacture_id = EON_ID_NOPREFIX,
5494 .model_id = EON_EN25S16,
5495 .total_size = 2048,
5496 .page_size = 256,
5497 /* OTP: 512B total; enter 0x3A */
5498 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5499 .tested = TEST_UNTESTED,
5500 .probe = probe_spi_rdid,
5501 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005502 .block_erasers =
5503 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005504 {
5505 .eraseblocks = { {4 * 1024, 512} },
5506 .block_erase = spi_block_erase_20,
5507 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005508 .eraseblocks = { {32 * 1024, 64} },
5509 .block_erase = spi_block_erase_d8,
5510 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05305511 .eraseblocks = { {64 * 1024, 32} },
5512 .block_erase = spi_block_erase_52,
5513 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005514 .eraseblocks = { {2048 * 1024, 1} },
5515 .block_erase = spi_block_erase_60,
5516 }, {
5517 .eraseblocks = { {2048 * 1024, 1} },
5518 .block_erase = spi_block_erase_c7,
5519 }
5520 },
5521 .printlock = spi_prettyprint_status_register_en25s_wp,
5522 .unlock = spi_disable_blockprotect_bp3_srwd,
5523 .write = spi_chip_write_256,
5524 .read = spi_chip_read,
5525 .voltage = {1650, 1950},
5526 },
5527
5528 {
5529 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005530 .name = "EN25S20",
5531 .bustype = BUS_SPI,
5532 .manufacture_id = EON_ID_NOPREFIX,
5533 .model_id = EON_EN25S20,
5534 .total_size = 256,
5535 .page_size = 256,
5536 /* OTP: 256B total; enter 0x3A */
5537 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5538 .tested = TEST_UNTESTED,
5539 .probe = probe_spi_rdid,
5540 .probe_timing = TIMING_ZERO,
5541 .block_erasers =
5542 {
5543 {
5544 .eraseblocks = { {4 * 1024, 64} },
5545 .block_erase = spi_block_erase_20,
5546 }, {
5547 .eraseblocks = { {64 * 1024, 4} },
5548 .block_erase = spi_block_erase_d8,
5549 }, {
5550 .eraseblocks = { {256 * 1024, 1} },
5551 .block_erase = spi_block_erase_60,
5552 }, {
5553 .eraseblocks = { {256 * 1024, 1} },
5554 .block_erase = spi_block_erase_c7,
5555 }
5556 },
5557 .printlock = spi_prettyprint_status_register_bp2_srwd,
5558 .unlock = spi_disable_blockprotect,
5559 .write = spi_chip_write_256,
5560 .read = spi_chip_read,
5561 .voltage = {1650, 1950},
5562 },
5563
5564 {
5565 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005566 .name = "EN25S32",
5567 .bustype = BUS_SPI,
5568 .manufacture_id = EON_ID_NOPREFIX,
5569 .model_id = EON_EN25S32,
5570 .total_size = 4096,
5571 .page_size = 256,
5572 /* OTP: 512B total; enter 0x3A */
5573 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5574 .tested = TEST_UNTESTED,
5575 .probe = probe_spi_rdid,
5576 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005577 .block_erasers =
5578 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005579 {
5580 .eraseblocks = { {4 * 1024, 1024} },
5581 .block_erase = spi_block_erase_20,
5582 }, {
5583 .eraseblocks = { {32 * 1024, 128} },
5584 .block_erase = spi_block_erase_52,
5585 }, {
5586 .eraseblocks = { {64 * 1024, 64} },
5587 .block_erase = spi_block_erase_d8,
5588 }, {
5589 .eraseblocks = { {4096 * 1024, 1} },
5590 .block_erase = spi_block_erase_60,
5591 }, {
5592 .eraseblocks = { {4096 * 1024, 1} },
5593 .block_erase = spi_block_erase_c7,
5594 }
5595 },
5596 .printlock = spi_prettyprint_status_register_en25s_wp,
5597 .unlock = spi_disable_blockprotect_bp3_srwd,
5598 .write = spi_chip_write_256,
5599 .read = spi_chip_read,
5600 .voltage = {1650, 1950},
5601 },
5602
5603 {
5604 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005605 .name = "EN25S40",
5606 .bustype = BUS_SPI,
5607 .manufacture_id = EON_ID_NOPREFIX,
5608 .model_id = EON_EN25S40,
5609 .total_size = 512,
5610 .page_size = 256,
5611 /* OTP: 256B total; enter 0x3A */
5612 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5613 .tested = TEST_OK_PREW,
5614 .probe = probe_spi_rdid,
5615 .probe_timing = TIMING_ZERO,
5616 .block_erasers =
5617 {
5618 {
5619 .eraseblocks = { {4 * 1024, 128} },
5620 .block_erase = spi_block_erase_20,
5621 }, {
5622 .eraseblocks = { {64 * 1024, 8} },
5623 .block_erase = spi_block_erase_d8,
5624 }, {
5625 .eraseblocks = { {512 * 1024, 1} },
5626 .block_erase = spi_block_erase_60,
5627 }, {
5628 .eraseblocks = { {512 * 1024, 1} },
5629 .block_erase = spi_block_erase_c7,
5630 }
5631 },
5632 .printlock = spi_prettyprint_status_register_bp2_srwd,
5633 .unlock = spi_disable_blockprotect,
5634 .write = spi_chip_write_256,
5635 .read = spi_chip_read,
5636 .voltage = {1650, 1950},
5637 },
5638
5639 {
5640 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005641 .name = "EN25S64",
5642 .bustype = BUS_SPI,
5643 .manufacture_id = EON_ID_NOPREFIX,
5644 .model_id = EON_EN25S64,
5645 .total_size = 8192,
5646 .page_size = 256,
5647 /* OTP: 512B total; enter 0x3A */
5648 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Nikolai Artemievdf889fa2021-03-23 17:10:45 +11005649 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005650 .probe = probe_spi_rdid,
5651 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005652 .block_erasers =
5653 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005654 {
5655 .eraseblocks = { {4 * 1024, 2048} },
5656 .block_erase = spi_block_erase_20,
5657 }, {
5658 .eraseblocks = { {64 * 1024, 128} },
5659 .block_erase = spi_block_erase_d8,
5660 }, {
5661 .eraseblocks = { {8192 * 1024, 1} },
5662 .block_erase = spi_block_erase_60,
5663 }, {
5664 .eraseblocks = { {8192 * 1024, 1} },
5665 .block_erase = spi_block_erase_c7,
5666 }
5667 },
5668 .printlock = spi_prettyprint_status_register_en25s_wp,
5669 .unlock = spi_disable_blockprotect_bp3_srwd,
5670 .write = spi_chip_write_256,
5671 .read = spi_chip_read,
5672 .voltage = {1650, 1950},
5673 },
5674
5675 {
5676 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005677 .name = "EN25S80",
5678 .bustype = BUS_SPI,
5679 .manufacture_id = EON_ID_NOPREFIX,
5680 .model_id = EON_EN25S80,
5681 .total_size = 1024,
5682 .page_size = 256,
5683 /* OTP: 256B total; enter 0x3A */
5684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5685 .tested = TEST_UNTESTED,
5686 .probe = probe_spi_rdid,
5687 .probe_timing = TIMING_ZERO,
Russ Dill3cd5a122010-03-05 08:44:11 +00005688 .block_erasers =
5689 {
5690 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005691 .eraseblocks = { {4 * 1024, 256} },
5692 .block_erase = spi_block_erase_20,
5693 }, {
5694 .eraseblocks = { {64 * 1024, 16} },
5695 .block_erase = spi_block_erase_d8,
5696 }, {
5697 .eraseblocks = { {1024 * 1024, 1} },
5698 .block_erase = spi_block_erase_60,
5699 }, {
5700 .eraseblocks = { {1024 * 1024, 1} },
5701 .block_erase = spi_block_erase_c7,
5702 }
Russ Dill3cd5a122010-03-05 08:44:11 +00005703 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005704 .printlock = spi_prettyprint_status_register_bp2_srwd,
5705 .unlock = spi_disable_blockprotect,
5706 .write = spi_chip_write_256,
5707 .read = spi_chip_read,
5708 .voltage = {1650, 1950},
Russ Dill3cd5a122010-03-05 08:44:11 +00005709 },
5710
5711 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005712 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005713 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005714 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005715 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005716 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005717 .total_size = 256,
5718 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005719 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Green4362e622019-08-26 15:02:12 +10005720 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005721 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005722 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005723 .block_erasers =
5724 {
5725 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005726 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005727 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005728 {8 * 1024, 2},
5729 {32 * 1024, 1},
5730 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005731 },
5732 .block_erase = erase_sector_jedec,
5733 }, {
5734 .eraseblocks = { {256 * 1024, 1} },
5735 .block_erase = erase_chip_block_jedec,
5736 },
5737 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005738 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005739 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005740 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005741 .prepare_access = prepare_memory_access,
5742 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005743 },
5744
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005745 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005746 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005747 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005748 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005749 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005750 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005751 .total_size = 256,
5752 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005753 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005754 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005755 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005756 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005757 .block_erasers =
5758 {
5759 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005760 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005761 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005762 {32 * 1024, 1},
5763 {8 * 1024, 2},
5764 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005765 },
5766 .block_erase = erase_sector_jedec,
5767 }, {
5768 .eraseblocks = { {256 * 1024, 1} },
5769 .block_erase = erase_chip_block_jedec,
5770 },
5771 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005772 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005773 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005774 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005775 .prepare_access = prepare_memory_access,
5776 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005777 },
5778
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005779 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005780 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005781 .name = "EN29F010",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005782 .bustype = BUS_PARALLEL,
5783 .manufacture_id = EON_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005784 .model_id = EON_EN29F010,
5785 .total_size = 128,
5786 .page_size = 128,
5787 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5788 .tested = TEST_OK_PRE,
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005789 .probe = probe_jedec,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005790 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005791 .block_erasers =
5792 {
5793 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005794 .eraseblocks = { {16 * 1024, 8} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005795 .block_erase = erase_sector_jedec,
5796 },
5797 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005798 .eraseblocks = { {128 * 1024, 1} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005799 .block_erase = erase_chip_block_jedec,
5800 },
5801 },
5802 .write = write_jedec_1,
5803 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005804 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005805 .prepare_access = prepare_memory_access,
5806 .finish_access = finish_memory_access,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005807 },
5808
5809 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005810 .vendor = "Eon",
5811 .name = "EN29GL064(A)B",
5812 .bustype = BUS_PARALLEL,
5813 .manufacture_id = EON_ID,
5814 .model_id = EON_EN29GL064B,
5815 .total_size = 8192,
5816 .page_size = 128 * 1024, /* actual page size is 16 */
5817 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5818 .tested = TEST_UNTESTED,
5819 .probe = probe_jedec_29gl,
5820 .probe_timing = TIMING_ZERO,
5821 .block_erasers =
5822 {
5823 {
5824 .eraseblocks = {
5825 {8 * 1024, 8},
5826 {64 * 1024, 127},
5827 },
5828 .block_erase = erase_sector_jedec,
5829 }, {
5830 .eraseblocks = { {8 * 1024 * 1024, 1} },
5831 .block_erase = erase_chip_block_jedec,
5832 },
5833 },
5834 .write = write_jedec_1,
5835 .read = read_memmapped,
5836 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005837 .prepare_access = prepare_memory_access,
5838 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005839 },
5840
5841 {
5842 .vendor = "Eon",
5843 .name = "EN29GL064(A)T",
5844 .bustype = BUS_PARALLEL,
5845 .manufacture_id = EON_ID,
5846 .model_id = EON_EN29GL064T,
5847 .total_size = 8192,
5848 .page_size = 128 * 1024, /* actual page size is 16 */
5849 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5850 .tested = TEST_UNTESTED,
5851 .probe = probe_jedec_29gl,
5852 .probe_timing = TIMING_ZERO,
5853 .block_erasers =
5854 {
5855 {
5856 .eraseblocks = {
5857 {64 * 1024, 127},
5858 {8 * 1024, 8},
5859 },
5860 .block_erase = erase_sector_jedec,
5861 }, {
5862 .eraseblocks = { {8 * 1024 * 1024, 1} },
5863 .block_erase = erase_chip_block_jedec,
5864 },
5865 },
5866 .write = write_jedec_1,
5867 .read = read_memmapped,
5868 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005869 .prepare_access = prepare_memory_access,
5870 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005871 },
5872
5873 {
5874 .vendor = "Eon",
5875 .name = "EN29GL064H/L",
5876 .bustype = BUS_PARALLEL,
5877 .manufacture_id = EON_ID,
5878 .model_id = EON_EN29GL064HL,
5879 .total_size = 8192,
5880 .page_size = 128 * 1024, /* actual page size is 16 */
5881 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5882 .tested = TEST_UNTESTED,
5883 .probe = probe_jedec_29gl,
5884 .probe_timing = TIMING_ZERO,
5885 .block_erasers =
5886 {
5887 {
5888 .eraseblocks = { {64 * 1024, 128} },
5889 .block_erase = erase_sector_jedec,
5890 }, {
5891 .eraseblocks = { {8 * 1024 * 1024, 1} },
5892 .block_erase = erase_chip_block_jedec,
5893 },
5894 },
5895 .write = write_jedec_1,
5896 .read = read_memmapped,
5897 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005898 .prepare_access = prepare_memory_access,
5899 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005900 },
5901
5902 {
5903 .vendor = "Eon",
5904 .name = "EN29GL128",
5905 .bustype = BUS_PARALLEL,
5906 .manufacture_id = EON_ID,
5907 .model_id = EON_EN29GL128HL,
5908 .total_size = 16384,
5909 .page_size = 128 * 1024, /* actual page size is 16 */
5910 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5911 .tested = TEST_UNTESTED,
5912 .probe = probe_jedec_29gl,
5913 .probe_timing = TIMING_ZERO,
5914 .block_erasers =
5915 {
5916 {
5917 .eraseblocks = { {128 * 1024, 128} },
5918 .block_erase = erase_sector_jedec,
5919 }, {
5920 .eraseblocks = { {16 * 1024 * 1024, 1} },
5921 .block_erase = erase_chip_block_jedec,
5922 },
5923 },
5924 .write = write_jedec_1,
5925 .read = read_memmapped,
5926 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005927 .prepare_access = prepare_memory_access,
5928 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005929 },
5930
5931 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005932 .vendor = "Eon",
5933 .name = "EN29LV040(A)",
5934 .bustype = BUS_PARALLEL,
5935 .manufacture_id = EON_ID,
5936 .model_id = EON_EN29LV040,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005937 .total_size = 512,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005938 .page_size = 4 * 1024,
5939 .tested = TEST_OK_PREW,
5940 .probe = probe_jedec,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005941 .probe_timing = TIMING_ZERO,
5942 .block_erasers =
5943 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005944 {
5945 .eraseblocks = { {64 * 1024, 8} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005946 .block_erase = erase_sector_jedec,
5947 },
5948 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005949 .eraseblocks = { {512 * 1024, 1} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005950 .block_erase = erase_chip_block_jedec,
5951 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005952 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005953 .write = write_jedec_1,
5954 .read = read_memmapped,
5955 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01005956 .prepare_access = prepare_memory_access,
5957 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005958 },
5959
5960 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005961 .vendor = "Eon",
5962 .name = "EN29LV640B",
5963 .bustype = BUS_PARALLEL,
5964 .manufacture_id = EON_ID,
5965 .model_id = EON_EN29LV640B,
5966 .total_size = 8192,
5967 .page_size = 8192,
5968 .feature_bits = FEATURE_ADDR_SHIFTED,
5969 .tested = TEST_OK_PREW,
5970 .probe = probe_en29lv640b,
5971 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005972 .block_erasers =
5973 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005974 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005975 .eraseblocks = {
5976 {8 * 1024, 8},
5977 {64 * 1024, 127},
5978 },
5979 .block_erase = erase_block_jedec,
Stefan Tauner0be072c2016-03-13 15:16:30 +00005980 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005981 .eraseblocks = { {8 * 1024 * 1024, 1} },
5982 .block_erase = erase_chip_block_jedec,
5983 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005984 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005985 .write = write_en29lv640b,
5986 .read = read_memmapped,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005987 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005988 .prepare_access = prepare_memory_access,
5989 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005990 },
5991
5992 {
Jakob Petersson0cf3e122019-02-18 01:55:43 +01005993 .vendor = "Fudan",
5994 .name = "FM25F005",
5995 .bustype = BUS_SPI,
5996 .manufacture_id = FUDAN_ID_NOPREFIX,
5997 .model_id = FUDAN_FM25F005,
5998 .total_size = 64,
5999 .page_size = 256,
6000 /* OTP: 256B total; enter 0x3A */
6001 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6002 .tested = TEST_UNTESTED,
6003 .probe = probe_spi_rdid,
6004 .probe_timing = TIMING_ZERO,
6005 .block_erasers = {
6006 {
6007 .eraseblocks = { {4 * 1024, 16} },
6008 .block_erase = spi_block_erase_20,
6009 }, {
6010 .eraseblocks = { {32 * 1024, 2} },
6011 .block_erase = spi_block_erase_52,
6012 }, {
6013 .eraseblocks = { {64 * 1024, 1} },
6014 .block_erase = spi_block_erase_d8,
6015 }, {
6016 .eraseblocks = { {64 * 1024, 1} },
6017 .block_erase = spi_block_erase_60,
6018 }, {
6019 .eraseblocks = { {64 * 1024, 1} },
6020 .block_erase = spi_block_erase_c7,
6021 }
6022 },
6023 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6024 .unlock = spi_disable_blockprotect_bp2_srwd,
6025 .write = spi_chip_write_256,
6026 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6027 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6028 },
6029
6030 {
6031 .vendor = "Fudan",
6032 .name = "FM25F01",
6033 .bustype = BUS_SPI,
6034 .manufacture_id = FUDAN_ID_NOPREFIX,
6035 .model_id = FUDAN_FM25F01,
6036 .total_size = 128,
6037 .page_size = 256,
6038 /* OTP: 256B total; enter 0x3A */
6039 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6040 .tested = TEST_UNTESTED,
6041 .probe = probe_spi_rdid,
6042 .probe_timing = TIMING_ZERO,
6043 .block_erasers = {
6044 {
6045 .eraseblocks = { {4 * 1024, 32} },
6046 .block_erase = spi_block_erase_20,
6047 }, {
6048 .eraseblocks = { {32 * 1024, 4} },
6049 .block_erase = spi_block_erase_52,
6050 }, {
6051 .eraseblocks = { {64 * 1024, 2} },
6052 .block_erase = spi_block_erase_d8,
6053 }, {
6054 .eraseblocks = { {128 * 1024, 1} },
6055 .block_erase = spi_block_erase_60,
6056 }, {
6057 .eraseblocks = { {128 * 1024, 1} },
6058 .block_erase = spi_block_erase_c7,
6059 }
6060 },
6061 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6062 .unlock = spi_disable_blockprotect_bp2_srwd,
6063 .write = spi_chip_write_256,
6064 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6065 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6066 },
6067
6068 {
6069 .vendor = "Fudan",
6070 .name = "FM25F02(A)",
6071 .bustype = BUS_SPI,
6072 .manufacture_id = FUDAN_ID_NOPREFIX,
6073 .model_id = FUDAN_FM25F02,
6074 .total_size = 256,
6075 .page_size = 256,
6076 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6077 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6078 .tested = TEST_UNTESTED,
6079 .probe = probe_spi_rdid,
6080 .probe_timing = TIMING_ZERO,
6081 .block_erasers = {
6082 {
6083 .eraseblocks = { {4 * 1024, 64} },
6084 .block_erase = spi_block_erase_20,
6085 }, {
6086 .eraseblocks = { {32 * 1024, 8} },
6087 .block_erase = spi_block_erase_52,
6088 }, {
6089 .eraseblocks = { {64 * 1024, 4} },
6090 .block_erase = spi_block_erase_d8,
6091 }, {
6092 .eraseblocks = { {1024 * 256, 1} },
6093 .block_erase = spi_block_erase_60,
6094 }, {
6095 .eraseblocks = { {1024 * 256, 1} },
6096 .block_erase = spi_block_erase_c7,
6097 },
6098 },
6099 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6100 .unlock = spi_disable_blockprotect_bp2_srwd,
6101 .write = spi_chip_write_256,
6102 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6103 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6104 },
6105
6106 {
6107 .vendor = "Fudan",
6108 .name = "FM25F04(A)",
6109 .bustype = BUS_SPI,
6110 .manufacture_id = FUDAN_ID_NOPREFIX,
6111 .model_id = FUDAN_FM25F04,
6112 .total_size = 512,
6113 .page_size = 256,
6114 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6115 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6116 .tested = TEST_UNTESTED,
6117 .probe = probe_spi_rdid,
6118 .probe_timing = TIMING_ZERO,
6119 .block_erasers = {
6120 {
6121 .eraseblocks = { {4 * 1024, 128} },
6122 .block_erase = spi_block_erase_20,
6123 }, {
6124 .eraseblocks = { {32 * 1024, 16} },
6125 .block_erase = spi_block_erase_52,
6126 }, {
6127 .eraseblocks = { {64 * 1024, 8} },
6128 .block_erase = spi_block_erase_d8,
6129 }, {
6130 .eraseblocks = { {1024 * 512, 1} },
6131 .block_erase = spi_block_erase_60,
6132 }, {
6133 .eraseblocks = { {1024 * 512, 1} },
6134 .block_erase = spi_block_erase_c7,
6135 },
6136 },
6137 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6138 .unlock = spi_disable_blockprotect_bp2_srwd,
6139 .write = spi_chip_write_256,
6140 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6141 .voltage = {2700, 3600},
6142 },
6143
6144 {
6145 .vendor = "Fudan",
6146 .name = "FM25Q08",
6147 .bustype = BUS_SPI,
6148 .manufacture_id = FUDAN_ID_NOPREFIX,
6149 .model_id = FUDAN_FM25Q08,
6150 .total_size = 1024,
6151 .page_size = 256,
6152 /* supports SFDP */
6153 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6154 /* QPI enable 0x38, disable 0xFF */
6155 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6156 .tested = TEST_UNTESTED,
6157 .probe = probe_spi_rdid,
6158 .probe_timing = TIMING_ZERO,
6159 .block_erasers = {
6160 {
6161 .eraseblocks = { {4 * 1024, 256} },
6162 .block_erase = spi_block_erase_20,
6163 }, {
6164 .eraseblocks = { {32 * 1024, 32} },
6165 .block_erase = spi_block_erase_52,
6166 }, {
6167 .eraseblocks = { {64 * 1024, 16} },
6168 .block_erase = spi_block_erase_d8,
6169 }, {
6170 .eraseblocks = { {1024 * 1024, 1} },
6171 .block_erase = spi_block_erase_60,
6172 }, {
6173 .eraseblocks = { {1024 * 1024, 1} },
6174 .block_erase = spi_block_erase_c7,
6175 },
6176 },
6177 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6178 .unlock = spi_disable_blockprotect_bp2_srwd,
6179 .write = spi_chip_write_256,
6180 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6181 .voltage = {2700, 3600},
6182 },
6183
6184 {
6185 .vendor = "Fudan",
6186 .name = "FM25Q16",
6187 .bustype = BUS_SPI,
6188 .manufacture_id = FUDAN_ID_NOPREFIX,
6189 .model_id = FUDAN_FM25Q16,
6190 .total_size = 2048,
6191 .page_size = 256,
6192 /* supports SFDP */
6193 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6194 /* QPI enable 0x38, disable 0xFF */
6195 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6196 .tested = TEST_UNTESTED,
6197 .probe = probe_spi_rdid,
6198 .probe_timing = TIMING_ZERO,
6199 .block_erasers = {
6200 {
6201 .eraseblocks = { {4 * 1024, 512} },
6202 .block_erase = spi_block_erase_20,
6203 }, {
6204 .eraseblocks = { {32 * 1024, 64} },
6205 .block_erase = spi_block_erase_52,
6206 }, {
6207 .eraseblocks = { {64 * 1024, 32} },
6208 .block_erase = spi_block_erase_d8,
6209 }, {
6210 .eraseblocks = { {2 * 1024 * 1024, 1} },
6211 .block_erase = spi_block_erase_60,
6212 }, {
6213 .eraseblocks = { {2 * 1024 * 1024, 1} },
6214 .block_erase = spi_block_erase_c7,
6215 }
6216 },
6217 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6218 .unlock = spi_disable_blockprotect_bp2_srwd,
6219 .write = spi_chip_write_256,
6220 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6221 .voltage = {2700, 3600},
6222 },
6223
6224 {
6225 .vendor = "Fudan",
6226 .name = "FM25Q32",
6227 .bustype = BUS_SPI,
6228 .manufacture_id = FUDAN_ID_NOPREFIX,
6229 .model_id = FUDAN_FM25Q32,
6230 .total_size = 4096,
6231 .page_size = 256,
6232 /* supports SFDP */
6233 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6234 /* QPI enable 0x38, disable 0xFF */
6235 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6236 .tested = TEST_UNTESTED,
6237 .probe = probe_spi_rdid,
6238 .probe_timing = TIMING_ZERO,
6239 .block_erasers = {
6240 {
6241 .eraseblocks = { {4 * 1024, 1024} },
6242 .block_erase = spi_block_erase_20,
6243 }, {
6244 .eraseblocks = { {32 * 1024, 128} },
6245 .block_erase = spi_block_erase_52,
6246 }, {
6247 .eraseblocks = { {64 * 1024, 64} },
6248 .block_erase = spi_block_erase_d8,
6249 }, {
6250 .eraseblocks = { {4 * 1024 * 1024, 1} },
6251 .block_erase = spi_block_erase_60,
6252 }, {
6253 .eraseblocks = { {4 * 1024 * 1024, 1} },
6254 .block_erase = spi_block_erase_c7,
6255 },
6256 },
6257 .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,
6260 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6261 .voltage = {2700, 3600},
6262 },
6263
6264 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006265 .vendor = "Fujitsu",
6266 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006267 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006268 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006269 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006270 .total_size = 512,
6271 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006273 .tested = TEST_UNTESTED,
6274 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006275 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006276 .block_erasers =
6277 {
6278 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006279 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006280 {16 * 1024, 1},
6281 {8 * 1024, 2},
6282 {32 * 1024, 1},
6283 {64 * 1024, 7},
6284 },
Sean Nelson35727f72010-01-28 23:55:12 +00006285 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006286 }, {
6287 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006288 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006289 },
6290 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006291 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006292 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006293 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006294 .prepare_access = prepare_memory_access,
6295 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006296 },
6297
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006298 {
6299 .vendor = "Fujitsu",
6300 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006301 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006302 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006303 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006304 .total_size = 512,
6305 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006306 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006307 .tested = TEST_UNTESTED,
6308 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006309 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006310 .block_erasers =
6311 {
6312 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006313 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006314 {64 * 1024, 7},
6315 {32 * 1024, 1},
6316 {8 * 1024, 2},
6317 {16 * 1024, 1},
6318 },
Sean Nelson35727f72010-01-28 23:55:12 +00006319 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006320 }, {
6321 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006322 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006323 },
6324 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006325 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006326 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006327 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006328 .prepare_access = prepare_memory_access,
6329 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006330 },
6331
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006332 {
Sean Nelson35727f72010-01-28 23:55:12 +00006333 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006334 .vendor = "Fujitsu",
6335 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006336 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006337 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006338 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006339 .total_size = 512,
6340 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006341 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00006342 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006343 .probe = probe_jedec,
6344 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006345 .block_erasers =
6346 {
6347 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006348 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006349 {16 * 1024, 1},
6350 {8 * 1024, 2},
6351 {32 * 1024, 1},
6352 {64 * 1024, 7},
6353 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006354 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006355 }, {
6356 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006357 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006358 },
6359 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006360 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006361 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006362 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006363 .prepare_access = prepare_memory_access,
6364 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006365 },
6366
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006367 {
6368 .vendor = "Fujitsu",
6369 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006370 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006371 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006372 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006373 .total_size = 512,
6374 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006375 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006376 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006377 .probe = probe_jedec,
6378 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006379 .block_erasers =
6380 {
6381 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006382 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006383 {64 * 1024, 7},
6384 {32 * 1024, 1},
6385 {8 * 1024, 2},
6386 {16 * 1024, 1},
6387 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006388 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006389 }, {
6390 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006391 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006392 },
6393 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006394 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006395 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006396 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006397 .prepare_access = prepare_memory_access,
6398 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006399 },
6400
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006401 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006402 .vendor = "Fujitsu",
6403 .name = "MBM29LV160BE",
6404 .bustype = BUS_PARALLEL,
6405 .manufacture_id = FUJITSU_ID,
6406 .model_id = FUJITSU_MBM29LV160BE,
6407 .total_size = 2 * 1024,
6408 .page_size = 0,
6409 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6410 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006411 .probe = probe_jedec,
6412 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006413 .block_erasers =
6414 {
6415 {
6416 .eraseblocks = {
6417 {16 * 1024, 1},
6418 {8 * 1024, 2},
6419 {32 * 1024, 1},
6420 {64 * 1024, 31},
6421 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006422 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006423 }, {
6424 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006425 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006426 },
6427 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006428 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006429 .read = read_memmapped,
6430 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006431 .prepare_access = prepare_memory_access,
6432 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006433 },
6434
6435 {
6436 .vendor = "Fujitsu",
6437 .name = "MBM29LV160TE",
6438 .bustype = BUS_PARALLEL,
6439 .manufacture_id = FUJITSU_ID,
6440 .model_id = FUJITSU_MBM29LV160TE,
6441 .total_size = 2 * 1024,
6442 .page_size = 0,
6443 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6444 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006445 .probe = probe_jedec,
6446 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006447 .block_erasers =
6448 {
6449 {
6450 .eraseblocks = {
6451 {64 * 1024, 31},
6452 {32 * 1024, 1},
6453 {8 * 1024, 2},
6454 {16 * 1024, 1},
6455 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006456 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006457 }, {
6458 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006459 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006460 },
6461 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006462 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006463 .read = read_memmapped,
6464 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006465 .prepare_access = prepare_memory_access,
6466 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006467 },
6468
6469 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006470 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006471 .name = "GD25B128B/GD25Q128B",
Roman Titov95edc892015-04-03 21:29:04 +00006472 .bustype = BUS_SPI,
6473 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006474 .model_id = GIGADEVICE_GD25Q128,
6475 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006476 .page_size = 256,
6477 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006479 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006480 .probe = probe_spi_rdid,
6481 .probe_timing = TIMING_ZERO,
6482 .block_erasers =
6483 {
6484 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006485 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006486 .block_erase = spi_block_erase_20,
6487 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006488 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006489 .block_erase = spi_block_erase_52,
6490 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006491 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006492 .block_erase = spi_block_erase_d8,
6493 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006494 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006495 .block_erase = spi_block_erase_60,
6496 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006497 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006498 .block_erase = spi_block_erase_c7,
6499 }
6500 },
6501 .printlock = spi_prettyprint_status_register_bp4_srwd,
6502 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6503 .write = spi_chip_write_256,
6504 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green1f9cc7d2019-07-01 11:10:45 +10006505 .voltage = {2700, 3600},
Roman Titov95edc892015-04-03 21:29:04 +00006506 },
6507
6508 {
6509 .vendor = "GigaDevice",
Edward O'Callaghan981a3442021-06-22 11:16:55 +10006510 .name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
Roman Titov95edc892015-04-03 21:29:04 +00006511 .bustype = BUS_SPI,
6512 .manufacture_id = GIGADEVICE_ID,
Alan Green188127e2019-08-06 16:10:34 +10006513 .model_id = GIGADEVICE_GD25LQ128CD,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006514 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006515 .page_size = 256,
6516 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber3f3c1f32022-05-28 16:48:26 +02006517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006518 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006519 .probe = probe_spi_rdid,
6520 .probe_timing = TIMING_ZERO,
6521 .block_erasers =
6522 {
6523 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006524 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006525 .block_erase = spi_block_erase_20,
6526 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006527 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006528 .block_erase = spi_block_erase_52,
6529 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006530 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006531 .block_erase = spi_block_erase_d8,
6532 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006533 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006534 .block_erase = spi_block_erase_60,
6535 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006536 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006537 .block_erase = spi_block_erase_c7,
6538 }
6539 },
6540 .printlock = spi_prettyprint_status_register_bp4_srwd,
6541 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6542 .write = spi_chip_write_256,
6543 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6544 .voltage = {1695, 1950},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006545 .reg_bits =
6546 {
6547 .srp = {STATUS1, 7, RW},
6548 .srl = {STATUS2, 0, RW},
6549 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6550 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6551 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6552 .cmp = {STATUS2, 6, RW},
6553 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006554 .wp_write_cfg = spi_wp_write_cfg,
6555 .wp_read_cfg = spi_wp_read_cfg,
6556 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006557 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006558 },
6559
6560 {
6561 .vendor = "GigaDevice",
6562 .name = "GD25LQ16",
6563 .bustype = BUS_SPI,
6564 .manufacture_id = GIGADEVICE_ID,
6565 .model_id = GIGADEVICE_GD25LQ16,
6566 .total_size = 2048,
6567 .page_size = 256,
6568 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6569 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6570 .tested = TEST_UNTESTED,
6571 .probe = probe_spi_rdid,
6572 .probe_timing = TIMING_ZERO,
6573 .block_erasers =
6574 {
6575 {
6576 .eraseblocks = { {4 * 1024, 512} },
6577 .block_erase = spi_block_erase_20,
6578 }, {
6579 .eraseblocks = { {32 * 1024, 64} },
6580 .block_erase = spi_block_erase_52,
6581 }, {
6582 .eraseblocks = { {64 * 1024, 32} },
6583 .block_erase = spi_block_erase_d8,
6584 }, {
6585 .eraseblocks = { {2 * 1024 * 1024, 1} },
6586 .block_erase = spi_block_erase_60,
6587 }, {
6588 .eraseblocks = { {2 * 1024 * 1024, 1} },
6589 .block_erase = spi_block_erase_c7,
6590 }
6591 },
6592 .printlock = spi_prettyprint_status_register_bp4_srwd,
6593 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6594 .write = spi_chip_write_256,
6595 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6596 .voltage = {1695, 1950},
6597 },
6598
6599 {
6600 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006601 .name = "GD25LQ32",
6602 .bustype = BUS_SPI,
6603 .manufacture_id = GIGADEVICE_ID,
6604 .model_id = GIGADEVICE_GD25LQ32,
6605 .total_size = 4096,
6606 .page_size = 256,
6607 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6608 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6609 .tested = TEST_OK_PREW,
6610 .probe = probe_spi_rdid,
6611 .probe_timing = TIMING_ZERO,
6612 .block_erasers =
6613 {
6614 {
6615 .eraseblocks = { {4 * 1024, 1024} },
6616 .block_erase = spi_block_erase_20,
6617 }, {
6618 .eraseblocks = { {32 * 1024, 128} },
6619 .block_erase = spi_block_erase_52,
6620 }, {
6621 .eraseblocks = { {64 * 1024, 64} },
6622 .block_erase = spi_block_erase_d8,
6623 }, {
6624 .eraseblocks = { {4 * 1024 * 1024, 1} },
6625 .block_erase = spi_block_erase_60,
6626 }, {
6627 .eraseblocks = { {4 * 1024 * 1024, 1} },
6628 .block_erase = spi_block_erase_c7,
6629 }
6630 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006631 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006632 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6633 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00006634 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6635 .voltage = {1695, 1950},
6636 },
6637
6638 {
6639 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006640 .name = "GD25LQ40",
6641 .bustype = BUS_SPI,
6642 .manufacture_id = GIGADEVICE_ID,
6643 .model_id = GIGADEVICE_GD25LQ40,
6644 .total_size = 512,
6645 .page_size = 256,
6646 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6647 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6648 .tested = TEST_UNTESTED,
6649 .probe = probe_spi_rdid,
6650 .probe_timing = TIMING_ZERO,
6651 .block_erasers =
6652 {
6653 {
6654 .eraseblocks = { {4 * 1024, 128} },
6655 .block_erase = spi_block_erase_20,
6656 }, {
6657 .eraseblocks = { {32 * 1024, 16} },
6658 .block_erase = spi_block_erase_52,
6659 }, {
6660 .eraseblocks = { {64 * 1024, 8} },
6661 .block_erase = spi_block_erase_d8,
6662 }, {
6663 .eraseblocks = { {512 * 1024, 1} },
6664 .block_erase = spi_block_erase_60,
6665 }, {
6666 .eraseblocks = { {512 * 1024, 1} },
6667 .block_erase = spi_block_erase_c7,
6668 }
6669 },
6670 .printlock = spi_prettyprint_status_register_bp4_srwd,
6671 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6672 .write = spi_chip_write_256,
6673 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6674 .voltage = {1695, 1950},
6675 },
6676
6677 {
6678 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00006679 .name = "GD25LQ64(B)",
6680 .bustype = BUS_SPI,
6681 .manufacture_id = GIGADEVICE_ID,
6682 .model_id = GIGADEVICE_GD25LQ64,
6683 .total_size = 8192,
6684 .page_size = 256,
6685 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber3f3c1f32022-05-28 16:48:26 +02006686 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006687 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006688 .probe = probe_spi_rdid,
6689 .probe_timing = TIMING_ZERO,
6690 .block_erasers =
6691 {
6692 {
6693 .eraseblocks = { {4 * 1024, 2048} },
6694 .block_erase = spi_block_erase_20,
6695 }, {
6696 .eraseblocks = { {32 * 1024, 256} },
6697 .block_erase = spi_block_erase_52,
6698 }, {
6699 .eraseblocks = { {64 * 1024, 128} },
6700 .block_erase = spi_block_erase_d8,
6701 }, {
6702 .eraseblocks = { {8 * 1024 * 1024, 1} },
6703 .block_erase = spi_block_erase_60,
6704 }, {
6705 .eraseblocks = { {8 * 1024 * 1024, 1} },
6706 .block_erase = spi_block_erase_c7,
6707 }
6708 },
6709 .printlock = spi_prettyprint_status_register_bp4_srwd,
6710 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6711 .write = spi_chip_write_256,
6712 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6713 .voltage = {1695, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006714 .reg_bits =
6715 {
6716 .srp = {STATUS1, 7, RW},
6717 .srl = {STATUS2, 0, RW},
6718 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6719 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6720 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6721 .cmp = {STATUS2, 6, RW},
6722 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006723 .wp_write_cfg = spi_wp_write_cfg,
6724 .wp_read_cfg = spi_wp_read_cfg,
6725 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006726 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006727 },
6728
6729 {
6730 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006731 .name = "GD25LQ80",
Roman Titov95edc892015-04-03 21:29:04 +00006732 .bustype = BUS_SPI,
6733 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006734 .model_id = GIGADEVICE_GD25LQ80,
6735 .total_size = 1024,
Roman Titov95edc892015-04-03 21:29:04 +00006736 .page_size = 256,
6737 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6738 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6739 .tested = TEST_UNTESTED,
6740 .probe = probe_spi_rdid,
6741 .probe_timing = TIMING_ZERO,
6742 .block_erasers =
6743 {
6744 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006745 .eraseblocks = { {4 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006746 .block_erase = spi_block_erase_20,
6747 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006748 .eraseblocks = { {32 * 1024, 32} },
Roman Titov95edc892015-04-03 21:29:04 +00006749 .block_erase = spi_block_erase_52,
6750 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006751 .eraseblocks = { {64 * 1024, 16} },
Roman Titov95edc892015-04-03 21:29:04 +00006752 .block_erase = spi_block_erase_d8,
6753 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006754 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006755 .block_erase = spi_block_erase_60,
6756 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006757 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006758 .block_erase = spi_block_erase_c7,
6759 }
6760 },
6761 .printlock = spi_prettyprint_status_register_bp4_srwd,
6762 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6763 .write = spi_chip_write_256,
6764 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6765 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006766 },
6767
6768 {
6769 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006770 .name = "GD25Q10",
6771 .bustype = BUS_SPI,
6772 .manufacture_id = GIGADEVICE_ID,
6773 .model_id = GIGADEVICE_GD25Q10,
6774 .total_size = 128,
6775 .page_size = 256,
6776 .feature_bits = FEATURE_WRSR_WREN,
6777 .tested = TEST_UNTESTED,
6778 .probe = probe_spi_rdid,
6779 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006780 .block_erasers =
6781 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006782 {
6783 .eraseblocks = { {4 * 1024, 32} },
6784 .block_erase = spi_block_erase_20,
6785 }, {
6786 .eraseblocks = { {32 * 1024, 4} },
6787 .block_erase = spi_block_erase_52,
6788 }, {
6789 .eraseblocks = { {64 * 1024, 2} },
6790 .block_erase = spi_block_erase_d8,
6791 }, {
6792 .eraseblocks = { {128 * 1024, 1} },
6793 .block_erase = spi_block_erase_60,
6794 }, {
6795 .eraseblocks = { {128 * 1024, 1} },
6796 .block_erase = spi_block_erase_c7,
6797 }
6798 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006799 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006800 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6801 .write = spi_chip_write_256,
6802 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6803 .voltage = {2700, 3600},
6804 },
6805
6806 {
6807 .vendor = "GigaDevice",
Alan Green4f009122019-08-26 10:45:18 +10006808 .name = "GD25Q127C/GD25Q128C",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006809 .bustype = BUS_SPI,
6810 .manufacture_id = GIGADEVICE_ID,
6811 .model_id = GIGADEVICE_GD25Q128,
6812 .total_size = 16384,
6813 .page_size = 256,
6814 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6815 /* QPI: enable 0x38, disable 0xFF */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006816 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006817 .tested = TEST_OK_PREWB,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006818 .probe = probe_spi_rdid,
6819 .probe_timing = TIMING_ZERO,
6820 .block_erasers =
6821 {
6822 {
6823 .eraseblocks = { {4 * 1024, 4096} },
6824 .block_erase = spi_block_erase_20,
6825 }, {
6826 .eraseblocks = { {32 * 1024, 512} },
6827 .block_erase = spi_block_erase_52,
6828 }, {
6829 .eraseblocks = { {64 * 1024, 256} },
6830 .block_erase = spi_block_erase_d8,
6831 }, {
6832 .eraseblocks = { {16 * 1024 * 1024, 1} },
6833 .block_erase = spi_block_erase_60,
6834 }, {
6835 .eraseblocks = { {16 * 1024 * 1024, 1} },
6836 .block_erase = spi_block_erase_c7,
6837 }
6838 },
6839 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6840 .printlock = spi_prettyprint_status_register_bp4_srwd,
6841 .unlock = spi_disable_blockprotect_bp4_srwd,
6842 .write = spi_chip_write_256,
6843 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6844 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006845 .reg_bits =
6846 {
6847 .srp = {STATUS1, 7, RW},
6848 .srl = {STATUS2, 0, RW},
6849 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6850 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6851 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6852 .cmp = {STATUS2, 6, RW},
6853 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006854 .wp_write_cfg = spi_wp_write_cfg,
6855 .wp_read_cfg = spi_wp_read_cfg,
6856 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006857 .decode_range = decode_range_spi25,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006858 },
6859
6860 {
6861 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006862 .name = "GD25Q16(B)",
6863 .bustype = BUS_SPI,
6864 .manufacture_id = GIGADEVICE_ID,
6865 .model_id = GIGADEVICE_GD25Q16,
6866 .total_size = 2048,
6867 .page_size = 256,
6868 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
6869 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6870 .tested = TEST_OK_PREW,
6871 .probe = probe_spi_rdid,
6872 .probe_timing = TIMING_ZERO,
6873 .block_erasers =
6874 {
6875 {
6876 .eraseblocks = { {4 * 1024, 512} },
6877 .block_erase = spi_block_erase_20,
6878 }, {
6879 .eraseblocks = { {32 * 1024, 64} },
6880 .block_erase = spi_block_erase_52,
6881 }, {
6882 .eraseblocks = { {64 * 1024, 32} },
6883 .block_erase = spi_block_erase_d8,
6884 }, {
6885 .eraseblocks = { {2 * 1024 * 1024, 1} },
6886 .block_erase = spi_block_erase_60,
6887 }, {
6888 .eraseblocks = { {2 * 1024 * 1024, 1} },
6889 .block_erase = spi_block_erase_c7,
6890 }
6891 },
6892 .printlock = spi_prettyprint_status_register_bp4_srwd,
6893 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6894 .write = spi_chip_write_256,
6895 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6896 .voltage = {2700, 3600},
6897 },
6898
6899 {
6900 .vendor = "GigaDevice",
6901 .name = "GD25Q20(B)",
6902 .bustype = BUS_SPI,
6903 .manufacture_id = GIGADEVICE_ID,
6904 .model_id = GIGADEVICE_GD25Q20,
6905 .total_size = 256,
6906 .page_size = 256,
6907 .feature_bits = FEATURE_WRSR_WREN,
6908 .tested = TEST_OK_PREW,
6909 .probe = probe_spi_rdid,
6910 .probe_timing = TIMING_ZERO,
6911 .block_erasers =
6912 {
6913 {
6914 .eraseblocks = { {4 * 1024, 64} },
6915 .block_erase = spi_block_erase_20,
6916 }, {
6917 .eraseblocks = { {32 * 1024, 8} },
6918 .block_erase = spi_block_erase_52,
6919 }, {
6920 .eraseblocks = { {64 * 1024, 4} },
6921 .block_erase = spi_block_erase_d8,
6922 }, {
6923 .eraseblocks = { {256 * 1024, 1} },
6924 .block_erase = spi_block_erase_60,
6925 }, {
6926 .eraseblocks = { {256 * 1024, 1} },
6927 .block_erase = spi_block_erase_c7,
6928 }
6929 },
6930 .printlock = spi_prettyprint_status_register_bp4_srwd,
6931 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6932 .write = spi_chip_write_256,
6933 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6934 .voltage = {2700, 3600},
6935 },
6936
6937 {
6938 .vendor = "GigaDevice",
Nikolai Artemiev3ca0af02022-06-17 15:10:18 +10006939 .name = "GD25Q256D/GD25Q256E",
Alan Green86fc9cf2019-08-26 15:02:12 +10006940 .bustype = BUS_SPI,
6941 .manufacture_id = GIGADEVICE_ID,
6942 .model_id = GIGADEVICE_GD25Q256D,
6943 .total_size = 32768,
6944 .page_size = 256,
Nikolai Artemievb931e7a2022-12-05 13:06:14 +11006945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA |
Nico Huber3f3c1f32022-05-28 16:48:26 +02006946 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006947 .tested = TEST_OK_PREWB,
Alan Green86fc9cf2019-08-26 15:02:12 +10006948 .probe = probe_spi_rdid,
6949 .probe_timing = TIMING_ZERO,
6950 .block_erasers =
6951 {
6952 {
6953 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber5374dc32019-10-04 16:16:15 +02006954 .block_erase = spi_block_erase_21,
6955 }, {
6956 .eraseblocks = { {4 * 1024, 8192} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006957 .block_erase = spi_block_erase_20,
6958 }, {
6959 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber5374dc32019-10-04 16:16:15 +02006960 .block_erase = spi_block_erase_5c,
6961 }, {
6962 .eraseblocks = { {32 * 1024, 1024} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006963 .block_erase = spi_block_erase_52,
6964 }, {
6965 .eraseblocks = { {64 * 1024, 512} },
Nico Huber5374dc32019-10-04 16:16:15 +02006966 .block_erase = spi_block_erase_dc,
6967 }, {
6968 .eraseblocks = { {64 * 1024, 512} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006969 .block_erase = spi_block_erase_d8,
6970 }, {
6971 .eraseblocks = { {32 * 1024 * 1024, 1} },
6972 .block_erase = spi_block_erase_60,
6973 }, {
6974 .eraseblocks = { {32 * 1024 * 1024, 1} },
6975 .block_erase = spi_block_erase_c7,
6976 }
6977 },
6978 .printlock = spi_prettyprint_status_register_bp3_srwd,
6979 .unlock = spi_disable_blockprotect,
6980 .write = spi_chip_write_256,
6981 .read = spi_chip_read,
6982 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006983 .reg_bits =
6984 {
6985 .srp = {STATUS1, 7, RW},
6986 .srl = {STATUS2, 6, RW},
6987 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
6988 .tb = {STATUS1, 6, RW},
6989 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006990 .wp_write_cfg = spi_wp_write_cfg,
6991 .wp_read_cfg = spi_wp_read_cfg,
6992 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006993 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +01006994 .prepare_access = spi_prepare_4ba,
Alan Green86fc9cf2019-08-26 15:02:12 +10006995 },
6996
6997 {
6998 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006999 .name = "GD25Q32(B)",
7000 .bustype = BUS_SPI,
7001 .manufacture_id = GIGADEVICE_ID,
7002 .model_id = GIGADEVICE_GD25Q32,
7003 .total_size = 4096,
7004 .page_size = 256,
7005 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemiev9de3f872021-10-20 22:32:25 +11007006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007007 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007008 .probe = probe_spi_rdid,
7009 .probe_timing = TIMING_ZERO,
7010 .block_erasers =
7011 {
7012 {
7013 .eraseblocks = { {4 * 1024, 1024} },
7014 .block_erase = spi_block_erase_20,
7015 }, {
7016 .eraseblocks = { {32 * 1024, 128} },
7017 .block_erase = spi_block_erase_52,
7018 }, {
7019 .eraseblocks = { {64 * 1024, 64} },
7020 .block_erase = spi_block_erase_d8,
7021 }, {
7022 .eraseblocks = { {4 * 1024 * 1024, 1} },
7023 .block_erase = spi_block_erase_60,
7024 }, {
7025 .eraseblocks = { {4 * 1024 * 1024, 1} },
7026 .block_erase = spi_block_erase_c7,
7027 }
7028 },
7029 .printlock = spi_prettyprint_status_register_bp4_srwd,
7030 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7031 .write = spi_chip_write_256,
7032 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7033 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007034 .reg_bits =
7035 {
7036 .srp = {STATUS1, 7, RW},
7037 .srl = {STATUS2, 0, RW},
7038 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7039 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7040 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7041 .cmp = {STATUS2, 6, RW},
7042 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007043 .wp_write_cfg = spi_wp_write_cfg,
7044 .wp_read_cfg = spi_wp_read_cfg,
7045 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007046 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007047 },
7048
7049 {
7050 .vendor = "GigaDevice",
7051 .name = "GD25Q40(B)",
7052 .bustype = BUS_SPI,
7053 .manufacture_id = GIGADEVICE_ID,
7054 .model_id = GIGADEVICE_GD25Q40,
7055 .total_size = 512,
7056 .page_size = 256,
7057 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrow551664c2022-03-09 16:09:08 +01007058 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007059 .probe = probe_spi_rdid,
7060 .probe_timing = TIMING_ZERO,
7061 .block_erasers =
7062 {
7063 {
7064 .eraseblocks = { {4 * 1024, 128} },
7065 .block_erase = spi_block_erase_20,
7066 }, {
7067 .eraseblocks = { {32 * 1024, 16} },
7068 .block_erase = spi_block_erase_52,
7069 }, {
7070 .eraseblocks = { {64 * 1024, 8} },
7071 .block_erase = spi_block_erase_d8,
7072 }, {
7073 .eraseblocks = { {512 * 1024, 1} },
7074 .block_erase = spi_block_erase_60,
7075 }, {
7076 .eraseblocks = { {512 * 1024, 1} },
7077 .block_erase = spi_block_erase_c7,
7078 }
7079 },
7080 .printlock = spi_prettyprint_status_register_bp4_srwd,
7081 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7082 .write = spi_chip_write_256,
7083 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7084 .voltage = {2700, 3600},
7085 },
7086
7087 {
7088 .vendor = "GigaDevice",
7089 .name = "GD25Q512",
7090 .bustype = BUS_SPI,
7091 .manufacture_id = GIGADEVICE_ID,
7092 .model_id = GIGADEVICE_GD25Q512,
7093 .total_size = 64,
7094 .page_size = 256,
7095 .feature_bits = FEATURE_WRSR_WREN,
7096 .tested = TEST_OK_PREW,
7097 .probe = probe_spi_rdid,
7098 .probe_timing = TIMING_ZERO,
7099 .block_erasers =
7100 {
7101 {
7102 .eraseblocks = { {4 * 1024, 16} },
7103 .block_erase = spi_block_erase_20,
7104 }, {
7105 .eraseblocks = { {32 * 1024, 2} },
7106 .block_erase = spi_block_erase_52,
7107 }, {
7108 .eraseblocks = { {64 * 1024, 1} },
7109 .block_erase = spi_block_erase_60,
7110 }, {
7111 .eraseblocks = { {64 * 1024, 1} },
7112 .block_erase = spi_block_erase_c7,
7113 }
7114 },
7115 .printlock = spi_prettyprint_status_register_bp4_srwd,
7116 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7117 .write = spi_chip_write_256,
7118 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7119 .voltage = {2700, 3600},
7120 },
7121
7122 {
7123 .vendor = "GigaDevice",
7124 .name = "GD25Q64(B)",
7125 .bustype = BUS_SPI,
7126 .manufacture_id = GIGADEVICE_ID,
7127 .model_id = GIGADEVICE_GD25Q64,
7128 .total_size = 8192,
7129 .page_size = 256,
7130 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007131 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007132 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007133 .probe = probe_spi_rdid,
7134 .probe_timing = TIMING_ZERO,
7135 .block_erasers =
7136 {
7137 {
7138 .eraseblocks = { {4 * 1024, 2048} },
7139 .block_erase = spi_block_erase_20,
7140 }, {
7141 .eraseblocks = { {32 * 1024, 256} },
7142 .block_erase = spi_block_erase_52,
7143 }, {
7144 .eraseblocks = { {64 * 1024, 128} },
7145 .block_erase = spi_block_erase_d8,
7146 }, {
7147 .eraseblocks = { {8 * 1024 * 1024, 1} },
7148 .block_erase = spi_block_erase_60,
7149 }, {
7150 .eraseblocks = { {8 * 1024 * 1024, 1} },
7151 .block_erase = spi_block_erase_c7,
7152 }
7153 },
7154 .printlock = spi_prettyprint_status_register_bp4_srwd,
7155 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7156 .write = spi_chip_write_256,
7157 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7158 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007159 .reg_bits =
7160 {
7161 .srp = {STATUS1, 7, RW},
7162 .srl = {STATUS2, 0, RW},
7163 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7164 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7165 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7166 .cmp = {STATUS2, 6, RW},
7167 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007168 .wp_write_cfg = spi_wp_write_cfg,
7169 .wp_read_cfg = spi_wp_read_cfg,
7170 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007171 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007172 },
7173
7174 {
7175 .vendor = "GigaDevice",
7176 .name = "GD25Q80(B)",
7177 .bustype = BUS_SPI,
7178 .manufacture_id = GIGADEVICE_ID,
7179 .model_id = GIGADEVICE_GD25Q80,
7180 .total_size = 1024,
7181 .page_size = 256,
7182 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
7183 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7184 .tested = TEST_OK_PREW,
7185 .probe = probe_spi_rdid,
7186 .probe_timing = TIMING_ZERO,
7187 .block_erasers =
7188 {
7189 {
7190 .eraseblocks = { {4 * 1024, 256} },
7191 .block_erase = spi_block_erase_20,
7192 }, {
7193 .eraseblocks = { {32 * 1024, 32} },
7194 .block_erase = spi_block_erase_52,
7195 }, {
7196 .eraseblocks = { {64 * 1024, 16} },
7197 .block_erase = spi_block_erase_d8,
7198 }, {
7199 .eraseblocks = { {1024 * 1024, 1} },
7200 .block_erase = spi_block_erase_60,
7201 }, {
7202 .eraseblocks = { {1024 * 1024, 1} },
7203 .block_erase = spi_block_erase_c7,
7204 }
7205 },
7206 .printlock = spi_prettyprint_status_register_bp4_srwd,
7207 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7208 .write = spi_chip_write_256,
7209 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7210 .voltage = {2700, 3600},
7211 },
7212
7213 {
7214 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007215 .name = "GD25T80",
7216 .bustype = BUS_SPI,
7217 .manufacture_id = GIGADEVICE_ID,
7218 .model_id = GIGADEVICE_GD25T80,
7219 .total_size = 1024,
7220 .page_size = 256,
7221 /* OTP: 256B total; enter 0x3A */
7222 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7223 .tested = TEST_UNTESTED,
7224 .probe = probe_spi_rdid,
7225 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10007226 .block_erasers =
7227 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007228 {
7229 .eraseblocks = { {4 * 1024, 256} },
7230 .block_erase = spi_block_erase_20,
7231 }, {
7232 .eraseblocks = { {64 * 1024, 16} },
7233 .block_erase = spi_block_erase_52,
7234 }, {
7235 .eraseblocks = { {64 * 1024, 16} },
7236 .block_erase = spi_block_erase_d8,
7237 }, {
7238 .eraseblocks = { {1024 * 1024, 1} },
7239 .block_erase = spi_block_erase_60,
7240 }, {
7241 .eraseblocks = { {1024 * 1024, 1} },
7242 .block_erase = spi_block_erase_c7,
7243 }
7244 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00007245 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007246 .unlock = spi_disable_blockprotect,
7247 .write = spi_chip_write_256,
7248 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00007249 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007250 },
7251
7252 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007253 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007254 .name = "GD25VQ16C",
7255 .bustype = BUS_SPI,
7256 .manufacture_id = GIGADEVICE_ID,
7257 .model_id = GIGADEVICE_GD25VQ16C,
7258 .total_size = 2 * 1024,
7259 .page_size = 256,
7260 /* Supports SFDP */
7261 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7262 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7263 .tested = TEST_UNTESTED,
7264 .probe = probe_spi_rdid,
7265 .probe_timing = TIMING_ZERO,
7266 .block_erasers =
7267 {
7268 {
7269 .eraseblocks = { { 4 * 1024, 512} },
7270 .block_erase = spi_block_erase_20,
7271 }, {
7272 .eraseblocks = { { 32 * 1024, 64} },
7273 .block_erase = spi_block_erase_52,
7274 }, {
7275 .eraseblocks = { { 64 * 1024, 32} },
7276 .block_erase = spi_block_erase_d8,
7277 }, {
7278 .eraseblocks = { {2 * 1024 * 1024, 1} },
7279 .block_erase = spi_block_erase_60,
7280 }, {
7281 .eraseblocks = { {2 * 1024 * 1024, 1} },
7282 .block_erase = spi_block_erase_c7,
7283 }
7284 },
7285 .printlock = spi_prettyprint_status_register_bp4_srwd,
7286 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7287 .write = spi_chip_write_256,
7288 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7289 .voltage = {2300, 3600},
7290 },
7291
7292 {
7293 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007294 .name = "GD25VQ21B",
7295 .bustype = BUS_SPI,
7296 .manufacture_id = GIGADEVICE_ID,
7297 .model_id = GIGADEVICE_GD25VQ21B,
7298 .total_size = 256,
7299 .page_size = 256,
7300 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
7301 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7302 .tested = TEST_UNTESTED,
7303 .probe = probe_spi_rdid,
7304 .probe_timing = TIMING_ZERO,
7305 .block_erasers =
7306 {
7307 {
7308 .eraseblocks = { { 4 * 1024, 64} },
7309 .block_erase = spi_block_erase_20,
7310 }, {
7311 .eraseblocks = { { 32 * 1024, 8} },
7312 .block_erase = spi_block_erase_52,
7313 }, {
7314 .eraseblocks = { { 64 * 1024, 4} },
7315 .block_erase = spi_block_erase_d8,
7316 }, {
7317 .eraseblocks = { {256 * 1024, 1} },
7318 .block_erase = spi_block_erase_60,
7319 }, {
7320 .eraseblocks = { {256 * 1024, 1} },
7321 .block_erase = spi_block_erase_c7,
7322 }
7323 },
7324 .printlock = spi_prettyprint_status_register_bp4_srwd,
7325 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7326 .write = spi_chip_write_256,
7327 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7328 .voltage = {2300, 3600},
7329 },
7330
7331 {
7332 .vendor = "GigaDevice",
7333 .name = "GD25VQ40C",
7334 .bustype = BUS_SPI,
7335 .manufacture_id = GIGADEVICE_ID,
7336 .model_id = GIGADEVICE_GD25VQ41B,
7337 .total_size = 512,
7338 .page_size = 256,
7339 /* Supports SFDP */
7340 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7341 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7342 .tested = TEST_UNTESTED,
7343 .probe = probe_spi_rdid,
7344 .probe_timing = TIMING_ZERO,
7345 .block_erasers =
7346 {
7347 {
7348 .eraseblocks = { { 4 * 1024, 128} },
7349 .block_erase = spi_block_erase_20,
7350 }, {
7351 .eraseblocks = { { 32 * 1024, 16} },
7352 .block_erase = spi_block_erase_52,
7353 }, {
7354 .eraseblocks = { { 64 * 1024, 8} },
7355 .block_erase = spi_block_erase_d8,
7356 }, {
7357 .eraseblocks = { {512 * 1024, 1} },
7358 .block_erase = spi_block_erase_60,
7359 }, {
7360 .eraseblocks = { {512 * 1024, 1} },
7361 .block_erase = spi_block_erase_c7,
7362 }
7363 },
7364 .printlock = spi_prettyprint_status_register_bp4_srwd,
7365 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7366 .write = spi_chip_write_256,
7367 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7368 .voltage = {2300, 3600},
7369 },
7370
7371 {
7372 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007373 .name = "GD25VQ41B",
7374 .bustype = BUS_SPI,
7375 .manufacture_id = GIGADEVICE_ID,
7376 .model_id = GIGADEVICE_GD25VQ41B,
7377 .total_size = 512,
7378 .page_size = 256,
7379 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
7380 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007381 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007382 .probe = probe_spi_rdid,
7383 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007384 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007385 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00007386 {
7387 .eraseblocks = { { 4 * 1024, 128} },
7388 .block_erase = spi_block_erase_20,
7389 }, {
7390 .eraseblocks = { { 32 * 1024, 16} },
7391 .block_erase = spi_block_erase_52,
7392 }, {
7393 .eraseblocks = { { 64 * 1024, 8} },
7394 .block_erase = spi_block_erase_d8,
7395 }, {
7396 .eraseblocks = { {512 * 1024, 1} },
7397 .block_erase = spi_block_erase_60,
7398 }, {
7399 .eraseblocks = { {512 * 1024, 1} },
7400 .block_erase = spi_block_erase_c7,
7401 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007402 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007403 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007404 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7405 .write = spi_chip_write_256,
7406 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7407 .voltage = {2300, 3600},
7408 },
7409
7410 {
7411 .vendor = "GigaDevice",
7412 .name = "GD25VQ80C",
7413 .bustype = BUS_SPI,
7414 .manufacture_id = GIGADEVICE_ID,
7415 .model_id = GIGADEVICE_GD25VQ80C,
7416 .total_size = 1024,
7417 .page_size = 256,
7418 /* Supports SFDP */
7419 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7420 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7421 .tested = TEST_UNTESTED,
7422 .probe = probe_spi_rdid,
7423 .probe_timing = TIMING_ZERO,
7424 .block_erasers =
7425 {
7426 {
7427 .eraseblocks = { { 4 * 1024, 256} },
7428 .block_erase = spi_block_erase_20,
7429 }, {
7430 .eraseblocks = { { 32 * 1024, 32} },
7431 .block_erase = spi_block_erase_52,
7432 }, {
7433 .eraseblocks = { { 64 * 1024, 16} },
7434 .block_erase = spi_block_erase_d8,
7435 }, {
7436 .eraseblocks = { {1024 * 1024, 1} },
7437 .block_erase = spi_block_erase_60,
7438 }, {
7439 .eraseblocks = { {1024 * 1024, 1} },
7440 .block_erase = spi_block_erase_c7,
7441 }
7442 },
7443 .printlock = spi_prettyprint_status_register_bp4_srwd,
7444 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7445 .write = spi_chip_write_256,
7446 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7447 .voltage = {2300, 3600},
7448 },
7449
7450 {
Dino Li3214f582020-03-25 17:39:53 +08007451 .vendor = "GigaDevice",
7452 .name = "GD25WQ80E",
7453 .bustype = BUS_SPI,
7454 .manufacture_id = GIGADEVICE_ID,
7455 .model_id = GIGADEVICE_GD25WQ80E,
7456 .total_size = 1024,
7457 .page_size = 256,
7458 .feature_bits = FEATURE_WRSR_WREN,
7459 .tested = TEST_OK_PREW,
7460 .probe = probe_spi_rdid,
7461 .probe_timing = TIMING_ZERO,
7462 .block_erasers =
7463 {
7464 {
7465 .eraseblocks = { {4 * 1024, 256} },
7466 .block_erase = spi_block_erase_20,
7467 }, {
7468 .eraseblocks = { {32 * 1024, 32} },
7469 .block_erase = spi_block_erase_52,
7470 }, {
7471 .eraseblocks = { {64 * 1024, 16} },
7472 .block_erase = spi_block_erase_d8,
7473 }, {
7474 .eraseblocks = { {1 * 1024 * 1024, 1} },
7475 .block_erase = spi_block_erase_60,
7476 }, {
7477 .eraseblocks = { {1 * 1024 * 1024, 1} },
7478 .block_erase = spi_block_erase_c7,
7479 }
7480 },
7481 .printlock = spi_prettyprint_status_register_bp4_srwd,
7482 .unlock = spi_disable_blockprotect_bp4_srwd,
7483 .write = spi_chip_write_256,
7484 .read = spi_chip_read,
7485 .voltage = {1650, 3600},
7486 },
7487
7488 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007489 .vendor = "Hyundai",
7490 .name = "HY29F002B",
7491 .bustype = BUS_PARALLEL,
7492 .manufacture_id = HYUNDAI_ID,
7493 .model_id = HYUNDAI_HY29F002B,
7494 .total_size = 256,
7495 .page_size = 256 * 1024,
7496 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007497 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007498 .probe = probe_jedec,
7499 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007500 .block_erasers =
7501 {
7502 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007503 .eraseblocks = {
7504 {16 * 1024, 1},
7505 {8 * 1024, 2},
7506 {32 * 1024, 1},
7507 {64 * 1024, 3},
7508 },
7509 .block_erase = erase_sector_jedec,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007510 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007511 .eraseblocks = { {256 * 1024, 1} },
7512 .block_erase = erase_chip_block_jedec,
7513 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007514 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007515 .write = write_jedec_1,
7516 .read = read_memmapped,
7517 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007518 .prepare_access = prepare_memory_access,
7519 .finish_access = finish_memory_access,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007520 },
7521
7522 {
David Borgc96a8bd2010-06-21 16:12:22 +00007523 .vendor = "Hyundai",
7524 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007525 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00007526 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007527 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00007528 .total_size = 256,
7529 .page_size = 256 * 1024,
7530 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007531 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00007532 .probe = probe_jedec,
7533 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7534 .block_erasers =
7535 {
7536 {
7537 .eraseblocks = {
7538 {64 * 1024, 3},
7539 {32 * 1024, 1},
7540 {8 * 1024, 2},
7541 {16 * 1024, 1},
7542 },
7543 .block_erase = erase_sector_jedec,
7544 }, {
7545 .eraseblocks = { {256 * 1024, 1} },
7546 .block_erase = erase_chip_block_jedec,
7547 },
7548 },
7549 .write = write_jedec_1,
7550 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007551 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007552 .prepare_access = prepare_memory_access,
7553 .finish_access = finish_memory_access,
David Borgc96a8bd2010-06-21 16:12:22 +00007554 },
7555
7556 {
7557 .vendor = "Hyundai",
Joshua Roysf1324e02010-09-16 00:51:51 +00007558 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007559 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007560 .manufacture_id = HYUNDAI_ID,
7561 .model_id = HYUNDAI_HY29F040A,
7562 .total_size = 512,
7563 .page_size = 64 * 1024,
7564 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7565 .tested = TEST_UNTESTED,
7566 .probe = probe_jedec,
7567 .probe_timing = TIMING_ZERO,
7568 .block_erasers =
7569 {
7570 {
7571 .eraseblocks = { {64 * 1024, 8} },
7572 .block_erase = erase_sector_jedec,
7573 }, {
7574 .eraseblocks = { {512 * 1024, 1} },
7575 .block_erase = erase_chip_block_jedec,
7576 },
7577 },
7578 .write = write_jedec_1,
7579 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007580 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01007581 .prepare_access = prepare_memory_access,
7582 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00007583 },
7584
7585 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007586 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007587 .name = "IS25LP064",
7588 .bustype = BUS_SPI,
7589 .manufacture_id = ISSI_ID_SPI,
7590 .model_id = ISSI_IS25LP064,
7591 .total_size = 8192,
7592 .page_size = 256,
7593 /* OTP: 1024B total; read 0x48; write 0x42 */
7594 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Simon Buhrow9bf829d2021-10-20 17:09:09 +02007595 .tested = TEST_OK_PREW,
Angel Pons2ef47f32018-09-30 16:47:30 +02007596 .probe = probe_spi_rdid,
7597 .probe_timing = TIMING_ZERO,
7598 .block_erasers =
7599 {
7600 {
7601 .eraseblocks = { {4 * 1024, 2048} },
7602 .block_erase = spi_block_erase_20,
7603 }, {
7604 .eraseblocks = { {4 * 1024, 2048} },
7605 .block_erase = spi_block_erase_d7,
7606 }, {
7607 .eraseblocks = { {32 * 1024, 256} },
7608 .block_erase = spi_block_erase_52,
7609 }, {
7610 .eraseblocks = { {64 * 1024, 128} },
7611 .block_erase = spi_block_erase_d8,
7612 }, {
7613 .eraseblocks = { {8 * 1024 * 1024, 1} },
7614 .block_erase = spi_block_erase_60,
7615 }, {
7616 .eraseblocks = { {8 * 1024 * 1024, 1} },
7617 .block_erase = spi_block_erase_c7,
7618 }
7619 },
7620 .unlock = spi_disable_blockprotect,
7621 .write = spi_chip_write_256,
7622 .read = spi_chip_read,
7623 .voltage = {2300, 3600},
7624 },
7625
7626 {
7627 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007628 .name = "IS25LP128",
7629 .bustype = BUS_SPI,
7630 .manufacture_id = ISSI_ID_SPI,
7631 .model_id = ISSI_IS25LP128,
7632 .total_size = 16384,
7633 .page_size = 256,
7634 /* OTP: 1024B total; read 0x48; write 0x42 */
7635 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7636 .tested = TEST_OK_PREW,
7637 .probe = probe_spi_rdid,
7638 .probe_timing = TIMING_ZERO,
7639 .block_erasers =
7640 {
7641 {
7642 .eraseblocks = { {4 * 1024, 4096} },
7643 .block_erase = spi_block_erase_20,
7644 }, {
7645 .eraseblocks = { {4 * 1024, 4096} },
7646 .block_erase = spi_block_erase_d7,
7647 }, {
7648 .eraseblocks = { {32 * 1024, 512} },
7649 .block_erase = spi_block_erase_52,
7650 }, {
7651 .eraseblocks = { {64 * 1024, 256} },
7652 .block_erase = spi_block_erase_d8,
7653 }, {
7654 .eraseblocks = { {16 * 1024 * 1024, 1} },
7655 .block_erase = spi_block_erase_60,
7656 }, {
7657 .eraseblocks = { {16 * 1024 * 1024, 1} },
7658 .block_erase = spi_block_erase_c7,
7659 }
7660 },
7661 .unlock = spi_disable_blockprotect,
7662 .write = spi_chip_write_256,
7663 .read = spi_chip_read,
7664 .voltage = {2300, 3600},
7665 },
7666
7667 {
7668 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007669 .name = "IS25LP256",
7670 .bustype = BUS_SPI,
7671 .manufacture_id = ISSI_ID_SPI,
7672 .model_id = ISSI_IS25LP256,
7673 .total_size = 32768,
7674 .page_size = 256,
7675 /* supports SFDP */
7676 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02007677 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
7678 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00007679 .tested = TEST_OK_PREW,
7680 .probe = probe_spi_rdid,
7681 .probe_timing = TIMING_ZERO,
7682 .block_erasers =
7683 {
7684 {
7685 .eraseblocks = { {4 * 1024, 8192} },
7686 .block_erase = spi_block_erase_21,
7687 }, {
7688 .eraseblocks = { {4 * 1024, 8192} },
7689 .block_erase = spi_block_erase_20,
7690 /* could also use spi_block_erase_d7 */
7691 }, {
7692 .eraseblocks = { {32 * 1024, 1024} },
7693 .block_erase = spi_block_erase_5c,
7694 }, {
7695 .eraseblocks = { {32 * 1024, 1024} },
7696 .block_erase = spi_block_erase_52,
7697 }, {
7698 .eraseblocks = { {64 * 1024, 512} },
7699 .block_erase = spi_block_erase_dc,
7700 }, {
7701 .eraseblocks = { {64 * 1024, 512} },
7702 .block_erase = spi_block_erase_d8,
7703 }, {
7704 .eraseblocks = { {32 * 1024 * 1024, 1} },
7705 .block_erase = spi_block_erase_60,
7706 }, {
7707 .eraseblocks = { {32 * 1024 * 1024, 1} },
7708 .block_erase = spi_block_erase_c7,
7709 }
7710 },
7711 .unlock = spi_disable_blockprotect,
7712 .write = spi_chip_write_256,
7713 .read = spi_chip_read,
7714 .voltage = {2300, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +01007715 .prepare_access = spi_prepare_4ba,
David Hendricks61818dc2018-10-28 01:02:21 +00007716 },
7717
7718 {
7719 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007720 .name = "IS25WP032",
7721 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007722 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007723 .model_id = ISSI_IS25WP032,
7724 .total_size = 4096,
7725 .page_size = 256,
7726 /* OTP: 1024B total; read 0x48; write 0x42 */
7727 /* QPI enable 0x35, disable 0xF5 */
7728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7729 .tested = TEST_UNTESTED,
7730 .probe = probe_spi_rdid,
7731 .probe_timing = TIMING_ZERO,
7732 .block_erasers =
7733 {
7734 {
7735 .eraseblocks = { {4 * 1024, 1024} },
7736 .block_erase = spi_block_erase_20,
7737 }, {
7738 .eraseblocks = { {4 * 1024, 1024} },
7739 .block_erase = spi_block_erase_d7,
7740 }, {
7741 .eraseblocks = { {32 * 1024, 128} },
7742 .block_erase = spi_block_erase_52,
7743 }, {
7744 .eraseblocks = { {64 * 1024, 64} },
7745 .block_erase = spi_block_erase_d8,
7746 }, {
7747 .eraseblocks = { {4 * 1024 * 1024, 1} },
7748 .block_erase = spi_block_erase_60,
7749 }, {
7750 .eraseblocks = { {4 * 1024 * 1024, 1} },
7751 .block_erase = spi_block_erase_c7,
7752 }
7753 },
7754 .unlock = spi_disable_blockprotect,
7755 .write = spi_chip_write_256,
7756 .read = spi_chip_read,
7757 .voltage = {1650, 1950},
7758 },
7759
7760 {
7761 .vendor = "ISSI",
7762 .name = "IS25WP064",
7763 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007764 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007765 .model_id = ISSI_IS25WP064,
7766 .total_size = 8192,
7767 .page_size = 256,
7768 /* OTP: 1024B total; read 0x48; write 0x42 */
7769 /* QPI enable 0x35, disable 0xF5 */
7770 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7771 .tested = TEST_OK_PREW,
7772 .probe = probe_spi_rdid,
7773 .probe_timing = TIMING_ZERO,
7774 .block_erasers =
7775 {
7776 {
7777 .eraseblocks = { {4 * 1024, 2048} },
7778 .block_erase = spi_block_erase_20,
7779 }, {
7780 .eraseblocks = { {4 * 1024, 2048} },
7781 .block_erase = spi_block_erase_d7,
7782 }, {
7783 .eraseblocks = { {32 * 1024, 256} },
7784 .block_erase = spi_block_erase_52,
7785 }, {
7786 .eraseblocks = { {64 * 1024, 128} },
7787 .block_erase = spi_block_erase_d8,
7788 }, {
7789 .eraseblocks = { {8 * 1024 * 1024, 1} },
7790 .block_erase = spi_block_erase_60,
7791 }, {
7792 .eraseblocks = { {8 * 1024 * 1024, 1} },
7793 .block_erase = spi_block_erase_c7,
7794 }
7795 },
7796 .unlock = spi_disable_blockprotect,
7797 .write = spi_chip_write_256,
7798 .read = spi_chip_read,
7799 .voltage = {1650, 1950},
7800 },
7801
7802 {
7803 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007804 .name = "IS25WP128",
7805 .bustype = BUS_SPI,
7806 .manufacture_id = ISSI_ID_SPI,
7807 .model_id = ISSI_IS25WP128,
7808 .total_size = 16384,
7809 .page_size = 256,
7810 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huberb27b8d12018-10-02 20:46:21 +02007811 /* QPI enable 0x35, disable 0xF5 */
7812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks3083ed92017-05-02 13:25:56 -07007813 .tested = TEST_OK_PREW,
7814 .probe = probe_spi_rdid,
7815 .probe_timing = TIMING_ZERO,
7816 .block_erasers =
7817 {
7818 {
7819 .eraseblocks = { {4 * 1024, 4096} },
7820 .block_erase = spi_block_erase_20,
7821 }, {
7822 .eraseblocks = { {4 * 1024, 4096} },
7823 .block_erase = spi_block_erase_d7,
7824 }, {
7825 .eraseblocks = { {32 * 1024, 512} },
7826 .block_erase = spi_block_erase_52,
7827 }, {
7828 .eraseblocks = { {64 * 1024, 256} },
7829 .block_erase = spi_block_erase_d8,
7830 }, {
7831 .eraseblocks = { {16 * 1024 * 1024, 1} },
7832 .block_erase = spi_block_erase_60,
7833 }, {
7834 .eraseblocks = { {16 * 1024 * 1024, 1} },
7835 .block_erase = spi_block_erase_c7,
7836 }
7837 },
7838 .unlock = spi_disable_blockprotect,
7839 .write = spi_chip_write_256,
7840 .read = spi_chip_read,
7841 .voltage = {1650, 1950},
7842 },
7843
7844 {
7845 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007846 .name = "IS25WP256",
7847 .bustype = BUS_SPI,
7848 .manufacture_id = ISSI_ID_SPI,
7849 .model_id = ISSI_IS25WP256,
7850 .total_size = 32768,
7851 .page_size = 256,
7852 /* supports SFDP */
7853 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02007854 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
7855 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00007856 .tested = TEST_OK_PREW,
7857 .probe = probe_spi_rdid,
7858 .probe_timing = TIMING_ZERO,
7859 .block_erasers =
7860 {
7861 {
7862 .eraseblocks = { {4 * 1024, 8192} },
7863 .block_erase = spi_block_erase_21,
7864 }, {
7865 .eraseblocks = { {4 * 1024, 8192} },
7866 .block_erase = spi_block_erase_20,
7867 /* could also use spi_block_erase_d7 */
7868 }, {
7869 .eraseblocks = { {32 * 1024, 1024} },
7870 .block_erase = spi_block_erase_5c,
7871 }, {
7872 .eraseblocks = { {32 * 1024, 1024} },
7873 .block_erase = spi_block_erase_52,
7874 }, {
7875 .eraseblocks = { {64 * 1024, 512} },
7876 .block_erase = spi_block_erase_dc,
7877 }, {
7878 .eraseblocks = { {64 * 1024, 512} },
7879 .block_erase = spi_block_erase_d8,
7880 }, {
7881 .eraseblocks = { {32 * 1024 * 1024, 1} },
7882 .block_erase = spi_block_erase_60,
7883 }, {
7884 .eraseblocks = { {32 * 1024 * 1024, 1} },
7885 .block_erase = spi_block_erase_c7,
7886 }
7887 },
7888 .unlock = spi_disable_blockprotect,
7889 .write = spi_chip_write_256,
7890 .read = spi_chip_read,
7891 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +01007892 .prepare_access = spi_prepare_4ba,
David Hendricks61818dc2018-10-28 01:02:21 +00007893 },
7894
7895 {
7896 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007897 .name = "IS29GL064B",
7898 .bustype = BUS_PARALLEL,
7899 .manufacture_id = ISSI_ID,
7900 .model_id = ISSI_PMC_IS29GL064B,
7901 .total_size = 8192,
7902 .page_size = 128 * 1024, /* actual page size is 16 */
7903 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7904 .tested = TEST_UNTESTED,
7905 .probe = probe_jedec_29gl,
7906 .probe_timing = TIMING_ZERO,
7907 .block_erasers =
7908 {
7909 {
7910 .eraseblocks = {
7911 {8 * 1024, 8},
7912 {64 * 1024, 127},
7913 },
7914 .block_erase = erase_sector_jedec,
7915 }, {
7916 .eraseblocks = { {8 * 1024 * 1024, 1} },
7917 .block_erase = erase_chip_block_jedec,
7918 },
7919 },
7920 .write = write_jedec_1,
7921 .read = read_memmapped,
7922 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01007923 .prepare_access = prepare_memory_access,
7924 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007925 },
7926
7927 {
7928 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007929 .name = "IS29GL064H/L",
7930 .bustype = BUS_PARALLEL,
7931 .manufacture_id = ISSI_ID,
7932 .model_id = ISSI_PMC_IS29GL064HL,
7933 .total_size = 8192,
7934 .page_size = 128 * 1024, /* actual page size is 16 */
7935 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7936 .tested = TEST_UNTESTED,
7937 .probe = probe_jedec_29gl,
7938 .probe_timing = TIMING_ZERO,
7939 .block_erasers =
7940 {
7941 {
7942 .eraseblocks = { {64 * 1024, 128} },
7943 .block_erase = erase_sector_jedec,
7944 }, {
7945 .eraseblocks = { {8 * 1024 * 1024, 1} },
7946 .block_erase = erase_chip_block_jedec,
7947 },
7948 },
7949 .write = write_jedec_1,
7950 .read = read_memmapped,
7951 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01007952 .prepare_access = prepare_memory_access,
7953 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007954 },
7955
7956 {
7957 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007958 .name = "IS29GL064T",
7959 .bustype = BUS_PARALLEL,
7960 .manufacture_id = ISSI_ID,
7961 .model_id = ISSI_PMC_IS29GL064T,
7962 .total_size = 8192,
7963 .page_size = 128 * 1024, /* actual page size is 16 */
7964 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7965 .tested = TEST_UNTESTED,
7966 .probe = probe_jedec_29gl,
7967 .probe_timing = TIMING_ZERO,
7968 .block_erasers =
7969 {
7970 {
7971 .eraseblocks = {
7972 {64 * 1024, 127},
7973 {8 * 1024, 8},
7974 },
7975 .block_erase = erase_sector_jedec,
7976 }, {
7977 .eraseblocks = { {8 * 1024 * 1024, 1} },
7978 .block_erase = erase_chip_block_jedec,
7979 },
7980 },
7981 .write = write_jedec_1,
7982 .read = read_memmapped,
7983 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01007984 .prepare_access = prepare_memory_access,
7985 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007986 },
7987
7988 {
7989 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007990 .name = "IS29GL128H/L",
7991 .bustype = BUS_PARALLEL,
7992 .manufacture_id = ISSI_ID,
7993 .model_id = ISSI_PMC_IS29GL128HL,
7994 .total_size = 16384,
7995 .page_size = 128 * 1024, /* actual page size is 16 */
7996 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7997 .tested = TEST_UNTESTED,
7998 .probe = probe_jedec_29gl,
7999 .probe_timing = TIMING_ZERO,
8000 .block_erasers =
8001 {
8002 {
8003 .eraseblocks = { {128 * 1024, 128} },
8004 .block_erase = erase_sector_jedec,
8005 }, {
8006 .eraseblocks = { {16 * 1024 * 1024, 1} },
8007 .block_erase = erase_chip_block_jedec,
8008 },
8009 },
8010 .write = write_jedec_1,
8011 .read = read_memmapped,
8012 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008013 .prepare_access = prepare_memory_access,
8014 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008015 },
8016
8017 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008018 .vendor = "Intel",
8019 .name = "25F160S33B8",
8020 .bustype = BUS_SPI,
8021 .manufacture_id = INTEL_ID,
8022 .model_id = INTEL_25F160S33B8,
8023 .total_size = 2048,
8024 .page_size = 256,
8025 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8026 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8027 .tested = TEST_UNTESTED,
8028 .probe = probe_spi_rdid,
8029 .probe_timing = TIMING_ZERO,
8030 .block_erasers =
8031 {
8032 {
8033 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8034 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8035 * have no effect on the memory contents, but sets a flag in the SR.
8036 .eraseblocks = {
8037 {8 * 1024, 8},
8038 {64 * 1024, 31} // inaccessible
8039 },
8040 .block_erase = spi_block_erase_40,
8041 }, { */
8042 .eraseblocks = { {64 * 1024, 32} },
8043 .block_erase = spi_block_erase_d8,
8044 }, {
8045 .eraseblocks = { {2 * 1024 * 1024, 1} },
8046 .block_erase = spi_block_erase_c7,
8047 }
8048 },
8049 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8050 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8051 .write = spi_chip_write_256,
8052 .read = spi_chip_read, /* also fast read 0x0B */
8053 .voltage = {2700, 3600},
8054 },
8055
8056 {
8057 .vendor = "Intel",
8058 .name = "25F160S33T8",
8059 .bustype = BUS_SPI,
8060 .manufacture_id = INTEL_ID,
8061 .model_id = INTEL_25F160S33T8,
8062 .total_size = 2048,
8063 .page_size = 256,
8064 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8065 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8066 .tested = TEST_UNTESTED,
8067 .probe = probe_spi_rdid,
8068 .probe_timing = TIMING_ZERO,
8069 .block_erasers =
8070 {
8071 {
8072 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8073 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8074 * have no effect on the memory contents, but sets a flag in the SR.
8075 .eraseblocks = {
8076 {64 * 1024, 31}, // inaccessible
8077 {8 * 1024, 8}
8078 },
8079 .block_erase = spi_block_erase_40,
8080 }, { */
8081 .eraseblocks = { {64 * 1024, 32} },
8082 .block_erase = spi_block_erase_d8,
8083 }, {
8084 .eraseblocks = { {2 * 1024 * 1024, 1} },
8085 .block_erase = spi_block_erase_c7,
8086 }
8087 },
8088 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8089 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8090 .write = spi_chip_write_256,
8091 .read = spi_chip_read, /* also fast read 0x0B */
8092 .voltage = {2700, 3600},
8093 },
8094
8095 {
8096 .vendor = "Intel",
8097 .name = "25F320S33B8",
8098 .bustype = BUS_SPI,
8099 .manufacture_id = INTEL_ID,
8100 .model_id = INTEL_25F320S33B8,
8101 .total_size = 4096,
8102 .page_size = 256,
8103 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8105 .tested = TEST_UNTESTED,
8106 .probe = probe_spi_rdid,
8107 .probe_timing = TIMING_ZERO,
8108 .block_erasers =
8109 {
8110 {
8111 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8112 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8113 * have no effect on the memory contents, but sets a flag in the SR.
8114 .eraseblocks = {
8115 {8 * 1024, 8},
8116 {64 * 1024, 63} // inaccessible
8117 },
8118 .block_erase = spi_block_erase_40,
8119 }, { */
8120 .eraseblocks = { {64 * 1024, 64} },
8121 .block_erase = spi_block_erase_d8,
8122 }, {
8123 .eraseblocks = { {4 * 1024 * 1024, 1} },
8124 .block_erase = spi_block_erase_c7,
8125 }
8126 },
8127 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8128 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8129 .write = spi_chip_write_256,
8130 .read = spi_chip_read, /* also fast read 0x0B */
8131 .voltage = {2700, 3600},
8132 },
8133
8134 {
8135 .vendor = "Intel",
8136 .name = "25F320S33T8",
8137 .bustype = BUS_SPI,
8138 .manufacture_id = INTEL_ID,
8139 .model_id = INTEL_25F320S33T8,
8140 .total_size = 4096,
8141 .page_size = 256,
8142 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8143 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8144 .tested = TEST_UNTESTED,
8145 .probe = probe_spi_rdid,
8146 .probe_timing = TIMING_ZERO,
8147 .block_erasers =
8148 {
8149 {
8150 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8151 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8152 * have no effect on the memory contents, but sets a flag in the SR.
8153 .eraseblocks = {
8154 {64 * 1024, 63}, // inaccessible
8155 {8 * 1024, 8}
8156 },
8157 .block_erase = spi_block_erase_40,
8158 }, { */
8159 .eraseblocks = { {64 * 1024, 64} },
8160 .block_erase = spi_block_erase_d8,
8161 }, {
8162 .eraseblocks = { {4 * 1024 * 1024, 1} },
8163 .block_erase = spi_block_erase_c7,
8164 }
8165 },
8166 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8167 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8168 .write = spi_chip_write_256,
8169 .read = spi_chip_read, /* also fast read 0x0B */
8170 .voltage = {2700, 3600},
8171 },
8172
8173 {
8174 .vendor = "Intel",
8175 .name = "25F640S33B8",
8176 .bustype = BUS_SPI,
8177 .manufacture_id = INTEL_ID,
8178 .model_id = INTEL_25F640S33B8,
8179 .total_size = 8192,
8180 .page_size = 256,
8181 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8182 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02008183 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008184 .probe = probe_spi_rdid,
8185 .probe_timing = TIMING_ZERO,
8186 .block_erasers =
8187 {
8188 {
8189 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8190 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8191 * have no effect on the memory contents, but sets a flag in the SR.
8192 .eraseblocks = {
8193 {8 * 1024, 8},
8194 {64 * 1024, 127} // inaccessible
8195 },
8196 .block_erase = spi_block_erase_40,
8197 }, { */
8198 .eraseblocks = { {64 * 1024, 128} },
8199 .block_erase = spi_block_erase_d8,
8200 }, {
8201 .eraseblocks = { {8 * 1024 * 1024, 1} },
8202 .block_erase = spi_block_erase_c7,
8203 }
8204 },
8205 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8206 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8207 .write = spi_chip_write_256,
8208 .read = spi_chip_read, /* also fast read 0x0B */
8209 .voltage = {2700, 3600},
8210 },
8211
8212 {
8213 .vendor = "Intel",
8214 .name = "25F640S33T8",
8215 .bustype = BUS_SPI,
8216 .manufacture_id = INTEL_ID,
8217 .model_id = INTEL_25F640S33T8,
8218 .total_size = 8192,
8219 .page_size = 256,
8220 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8221 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8222 .tested = TEST_UNTESTED,
8223 .probe = probe_spi_rdid,
8224 .probe_timing = TIMING_ZERO,
8225 .block_erasers =
8226 {
8227 {
8228 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8229 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8230 * have no effect on the memory contents, but sets a flag in the SR.
8231 .eraseblocks = {
8232 {64 * 1024, 127}, // inaccessible
8233 {8 * 1024, 8}
8234 },
8235 .block_erase = spi_block_erase_40,
8236 }, { */
8237 .eraseblocks = { {64 * 1024, 128} },
8238 .block_erase = spi_block_erase_d8,
8239 }, {
8240 .eraseblocks = { {8 * 1024 * 1024, 1} },
8241 .block_erase = spi_block_erase_c7,
8242 }
8243 },
8244 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8245 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8246 .write = spi_chip_write_256,
8247 .read = spi_chip_read, /* also fast read 0x0B */
8248 .voltage = {2700, 3600},
8249 },
8250
8251 {
8252 .vendor = "Intel",
8253 .name = "28F001BN/BX-B",
8254 .bustype = BUS_PARALLEL,
8255 .manufacture_id = INTEL_ID,
8256 .model_id = INTEL_28F001B,
8257 .total_size = 128,
8258 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8259 .tested = TEST_UNTESTED,
8260 .probe = probe_jedec,
8261 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8262 .block_erasers =
8263 {
8264 {
8265 .eraseblocks = {
8266 {8 * 1024, 1},
8267 {4 * 1024, 2},
8268 {112 * 1024, 1},
8269 },
8270 .block_erase = erase_block_82802ab,
8271 },
8272 },
8273 .write = write_82802ab,
8274 .read = read_memmapped,
8275 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008276 .prepare_access = prepare_memory_access,
8277 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008278 },
8279
8280 {
8281 .vendor = "Intel",
8282 .name = "28F001BN/BX-T",
8283 .bustype = BUS_PARALLEL,
8284 .manufacture_id = INTEL_ID,
8285 .model_id = INTEL_28F001T,
8286 .total_size = 128,
8287 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
8288 .tested = TEST_OK_PREW,
8289 .probe = probe_jedec,
8290 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8291 .block_erasers =
8292 {
8293 {
8294 .eraseblocks = {
8295 {112 * 1024, 1},
8296 {4 * 1024, 2},
8297 {8 * 1024, 1},
8298 },
8299 .block_erase = erase_block_82802ab,
8300 },
8301 },
8302 .write = write_82802ab,
8303 .read = read_memmapped,
8304 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008305 .prepare_access = prepare_memory_access,
8306 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008307 },
8308
8309 {
8310 .vendor = "Intel",
8311 .name = "28F002BC/BL/BV/BX-T",
8312 .bustype = BUS_PARALLEL,
8313 .manufacture_id = INTEL_ID,
8314 .model_id = INTEL_28F002T,
8315 .total_size = 256,
8316 .page_size = 256 * 1024,
8317 .tested = TEST_OK_PRE,
8318 .probe = probe_82802ab,
8319 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8320 .block_erasers =
8321 {
8322 {
8323 .eraseblocks = {
8324 {128 * 1024, 1},
8325 {96 * 1024, 1},
8326 {8 * 1024, 2},
8327 {16 * 1024, 1},
8328 },
8329 .block_erase = erase_block_82802ab,
8330 },
8331 },
8332 .write = write_82802ab,
8333 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008334 .prepare_access = prepare_memory_access,
8335 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008336 },
8337
8338 {
8339 .vendor = "Intel",
8340 .name = "28F004B5/BE/BV/BX-B",
8341 .bustype = BUS_PARALLEL,
8342 .manufacture_id = INTEL_ID,
8343 .model_id = INTEL_28F004B,
8344 .total_size = 512,
8345 .page_size = 128 * 1024, /* maximal block size */
8346 .tested = TEST_UNTESTED,
8347 .probe = probe_82802ab,
8348 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8349 .block_erasers =
8350 {
8351 {
8352 .eraseblocks = {
8353 {16 * 1024, 1},
8354 {8 * 1024, 2},
8355 {96 * 1024, 1},
8356 {128 * 1024, 3},
8357 },
8358 .block_erase = erase_block_82802ab,
8359 },
8360 },
8361 .write = write_82802ab,
8362 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008363 .prepare_access = prepare_memory_access,
8364 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008365 },
8366
8367 {
8368 .vendor = "Intel",
8369 .name = "28F004B5/BE/BV/BX-T",
8370 .bustype = BUS_PARALLEL,
8371 .manufacture_id = INTEL_ID,
8372 .model_id = INTEL_28F004T,
8373 .total_size = 512,
8374 .page_size = 128 * 1024, /* maximal block size */
8375 .tested = TEST_UNTESTED,
8376 .probe = probe_82802ab,
8377 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8378 .block_erasers =
8379 {
8380 {
8381 .eraseblocks = {
8382 {128 * 1024, 3},
8383 {96 * 1024, 1},
8384 {8 * 1024, 2},
8385 {16 * 1024, 1},
8386 },
8387 .block_erase = erase_block_82802ab,
8388 },
8389 },
8390 .write = write_82802ab,
8391 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008392 .prepare_access = prepare_memory_access,
8393 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008394 },
8395
8396 {
8397 .vendor = "Intel",
8398 .name = "28F008S3/S5/SC",
8399 .bustype = BUS_PARALLEL,
8400 .manufacture_id = INTEL_ID,
8401 .model_id = INTEL_28F004S3,
8402 .total_size = 512,
8403 .page_size = 256,
8404 .tested = TEST_UNTESTED,
8405 .probe = probe_82802ab,
8406 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8407 .block_erasers =
8408 {
8409 {
8410 .eraseblocks = { {64 * 1024, 8} },
8411 .block_erase = erase_block_82802ab,
8412 },
8413 },
8414 .unlock = unlock_28f004s5,
8415 .write = write_82802ab,
8416 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008417 .prepare_access = prepare_memory_access,
8418 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008419 },
8420
8421 {
8422 .vendor = "Intel",
8423 .name = "28F400BV/BX/CE/CV-B",
8424 .bustype = BUS_PARALLEL,
8425 .manufacture_id = INTEL_ID,
8426 .model_id = INTEL_28F400B,
8427 .total_size = 512,
8428 .page_size = 128 * 1024, /* maximal block size */
8429 .feature_bits = FEATURE_ADDR_SHIFTED,
8430 .tested = TEST_UNTESTED,
8431 .probe = probe_82802ab,
8432 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8433 .block_erasers =
8434 {
8435 {
8436 .eraseblocks = {
8437 {16 * 1024, 1},
8438 {8 * 1024, 2},
8439 {96 * 1024, 1},
8440 {128 * 1024, 3},
8441 },
8442 .block_erase = erase_block_82802ab,
8443 },
8444 },
8445 .write = write_82802ab,
8446 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008447 .prepare_access = prepare_memory_access,
8448 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008449 },
8450
8451 {
8452 .vendor = "Intel",
8453 .name = "28F400BV/BX/CE/CV-T",
8454 .bustype = BUS_PARALLEL,
8455 .manufacture_id = INTEL_ID,
8456 .model_id = INTEL_28F400T,
8457 .total_size = 512,
8458 .page_size = 128 * 1024, /* maximal block size */
8459 .feature_bits = FEATURE_ADDR_SHIFTED,
8460 .tested = TEST_UNTESTED,
8461 .probe = probe_82802ab,
8462 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8463 .block_erasers =
8464 {
8465 {
8466 .eraseblocks = {
8467 {128 * 1024, 3},
8468 {96 * 1024, 1},
8469 {8 * 1024, 2},
8470 {16 * 1024, 1},
8471 },
8472 .block_erase = erase_block_82802ab,
8473 },
8474 },
8475 .write = write_82802ab,
8476 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008477 .prepare_access = prepare_memory_access,
8478 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008479 },
8480
8481 {
8482 .vendor = "Intel",
8483 .name = "82802AB",
8484 .bustype = BUS_FWH,
8485 .manufacture_id = INTEL_ID,
8486 .model_id = INTEL_82802AB,
8487 .total_size = 512,
8488 .page_size = 64 * 1024,
Alan Green88552572019-07-24 13:56:06 +10008489 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008490 .probe = probe_82802ab,
8491 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8492 .block_erasers =
8493 {
8494 {
8495 .eraseblocks = { {64 * 1024, 8} },
8496 .block_erase = erase_block_82802ab,
8497 },
8498 },
8499 .unlock = unlock_regspace2_uniform_64k,
8500 .write = write_82802ab,
8501 .read = read_memmapped,
8502 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008503 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008504 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008505 },
8506
8507 {
8508 .vendor = "Intel",
8509 .name = "82802AC",
8510 .bustype = BUS_FWH,
8511 .manufacture_id = INTEL_ID,
8512 .model_id = INTEL_82802AC,
8513 .total_size = 1024,
8514 .page_size = 64 * 1024,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008515 .tested = TEST_OK_PR,
8516 .probe = probe_82802ab,
8517 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8518 .block_erasers =
8519 {
8520 {
8521 .eraseblocks = { {64 * 1024, 16} },
8522 .block_erase = erase_block_82802ab,
8523 },
8524 },
8525 .unlock = unlock_regspace2_uniform_64k,
8526 .write = write_82802ab,
8527 .read = read_memmapped,
8528 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008529 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008530 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008531 },
8532
8533 {
8534 .vendor = "Macronix",
8535 .name = "MX23L12854",
8536 .bustype = BUS_SPI,
8537 .manufacture_id = MACRONIX_ID,
8538 .model_id = MACRONIX_MX23L12854,
8539 .total_size = 16384,
8540 .page_size = 256,
8541 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8542 .probe = probe_spi_rdid,
8543 .probe_timing = TIMING_ZERO,
8544 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8545 .read = spi_chip_read, /* Fast read (0x0B) supported */
8546 .voltage = {3000, 3600},
8547 },
8548
8549 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008550 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008551 .name = "MX23L1654",
8552 .bustype = BUS_SPI,
8553 .manufacture_id = MACRONIX_ID,
8554 .model_id = MACRONIX_MX23L1654,
8555 .total_size = 2048,
8556 .page_size = 256,
8557 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8558 .probe = probe_spi_rdid,
8559 .probe_timing = TIMING_ZERO,
8560 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8561 .read = spi_chip_read, /* Fast read (0x0B) supported */
8562 .voltage = {3000, 3600},
8563 },
8564
8565 {
8566 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008567 .name = "MX23L3254",
8568 .bustype = BUS_SPI,
8569 .manufacture_id = MACRONIX_ID,
8570 .model_id = MACRONIX_MX23L3254,
8571 .total_size = 4096,
8572 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00008573 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008574 .probe = probe_spi_rdid,
8575 .probe_timing = TIMING_ZERO,
8576 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8577 .read = spi_chip_read, /* Fast read (0x0B) supported */
8578 .voltage = {3000, 3600},
8579 },
8580
8581 {
8582 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008583 .name = "MX23L6454",
8584 .bustype = BUS_SPI,
8585 .manufacture_id = MACRONIX_ID,
8586 .model_id = MACRONIX_MX23L6454,
8587 .total_size = 8192,
8588 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008589 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00008590 .probe = probe_spi_rdid,
8591 .probe_timing = TIMING_ZERO,
8592 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8593 .read = spi_chip_read, /* Fast read (0x0B) supported */
8594 .voltage = {3000, 3600},
8595 },
8596
8597 {
8598 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00008599 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008600 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008601 .manufacture_id = MACRONIX_ID,
8602 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008603 .total_size = 128,
8604 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008605 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00008606 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00008607 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008608 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008609 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008610 .block_erasers =
8611 {
8612 {
8613 .eraseblocks = { {4 * 1024, 32} },
8614 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008615 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008616 .eraseblocks = { {64 * 1024, 2} },
8617 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008618 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008619 .eraseblocks = { {128 * 1024, 1} },
8620 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008621 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008622 .eraseblocks = { {128 * 1024, 1} },
8623 .block_erase = spi_block_erase_c7,
8624 },
8625 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008626 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008627 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008628 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008629 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008631 },
8632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008633 {
8634 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008635 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008636 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008637 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008638 .model_id = MACRONIX_MX25L12805D,
8639 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008640 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008641 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008644 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008645 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008646 .block_erasers =
8647 {
8648 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008649 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008650 .block_erase = spi_block_erase_20,
8651 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008652 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008653 .block_erase = spi_block_erase_d8,
8654 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008655 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008656 .block_erase = spi_block_erase_60,
8657 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008658 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008659 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008660 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008661 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008662 .printlock = spi_prettyprint_status_register_bp3_srwd,
8663 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008664 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008665 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008666 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008667 },
8668
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008669 {
8670 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08008671 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008672 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008673 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008674 .model_id = MACRONIX_MX25L12805D,
8675 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008676 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08008677 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10008678 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner8179be52011-06-04 13:13:34 +00008679 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008680 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008681 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008682 .block_erasers =
8683 {
8684 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008685 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008686 .block_erase = spi_block_erase_20,
8687 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008688 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008689 .block_erase = spi_block_erase_52,
8690 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008691 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008692 .block_erase = spi_block_erase_d8,
8693 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008694 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008695 .block_erase = spi_block_erase_60,
8696 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008697 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008698 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008699 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008700 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008701 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8702 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8703 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008704 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008705 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008706 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008707 },
8708
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008709 {
8710 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008711 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008712 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008713 .manufacture_id = MACRONIX_ID,
8714 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008715 .total_size = 2048,
8716 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008717 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00008718 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008719 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008720 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008721 .block_erasers =
8722 {
8723 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008724 .eraseblocks = { {64 * 1024, 32} },
8725 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008726 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008727 .eraseblocks = { {64 * 1024, 32} },
8728 .block_erase = spi_block_erase_d8,
8729 }, {
8730 .eraseblocks = { {2 * 1024 * 1024, 1} },
8731 .block_erase = spi_block_erase_60,
8732 }, {
8733 .eraseblocks = { {2 * 1024 * 1024, 1} },
8734 .block_erase = spi_block_erase_c7,
8735 },
8736 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008737 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00008738 .unlock = spi_disable_blockprotect,
8739 .write = spi_chip_write_256,
8740 .read = spi_chip_read, /* Fast read (0x0B) supported */
8741 .voltage = {2700, 3600},
8742 },
8743
8744 {
8745 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008746 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008747 .bustype = BUS_SPI,
8748 .manufacture_id = MACRONIX_ID,
8749 .model_id = MACRONIX_MX25L1605,
8750 .total_size = 2048,
8751 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008752 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008753 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8754 .tested = TEST_OK_PREW,
8755 .probe = probe_spi_rdid,
8756 .probe_timing = TIMING_ZERO,
8757 .block_erasers =
8758 {
8759 {
8760 .eraseblocks = { {4 * 1024, 512} },
8761 .block_erase = spi_block_erase_20,
8762 }, {
8763 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008764 .block_erase = spi_block_erase_52,
8765 }, {
8766 .eraseblocks = { {64 * 1024, 32} },
8767 .block_erase = spi_block_erase_d8,
8768 }, {
8769 .eraseblocks = { {2 * 1024 * 1024, 1} },
8770 .block_erase = spi_block_erase_60,
8771 }, {
8772 .eraseblocks = { {2 * 1024 * 1024, 1} },
8773 .block_erase = spi_block_erase_c7,
8774 },
8775 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008776 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008777 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008778 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008779 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008780 .voltage = {2700, 3600},
8781 },
8782
8783 {
8784 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008785 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008786 .bustype = BUS_SPI,
8787 .manufacture_id = MACRONIX_ID,
8788 .model_id = MACRONIX_MX25L1605,
8789 .total_size = 2048,
8790 .page_size = 256,
8791 .feature_bits = FEATURE_WRSR_WREN,
8792 .tested = TEST_OK_PREW,
8793 .probe = probe_spi_rdid,
8794 .probe_timing = TIMING_ZERO,
8795 .block_erasers =
8796 {
8797 {
8798 .eraseblocks = { {4 * 1024, 512} },
8799 .block_erase = spi_block_erase_20,
8800 }, {
8801 .eraseblocks = { {64 * 1024, 32} },
8802 .block_erase = spi_block_erase_d8,
8803 }, {
8804 .eraseblocks = { {2 * 1024 * 1024, 1} },
8805 .block_erase = spi_block_erase_60,
8806 }, {
8807 .eraseblocks = { {2 * 1024 * 1024, 1} },
8808 .block_erase = spi_block_erase_c7,
8809 },
8810 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008811 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008812 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008813 .write = spi_chip_write_256,
8814 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008815 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008816 },
8817
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008818 {
8819 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008820 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008821 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008822 .manufacture_id = MACRONIX_ID,
8823 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008824 .total_size = 2048,
8825 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008826 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8827 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Ponsc2054872021-01-15 18:57:32 +01008828 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008829 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008830 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008831 .block_erasers =
8832 {
8833 {
8834 .eraseblocks = { {4 * 1024, 512} },
8835 .block_erase = spi_block_erase_20,
8836 }, {
8837 .eraseblocks = { {64 * 1024, 32} },
8838 .block_erase = spi_block_erase_d8,
8839 }, {
8840 .eraseblocks = { {2 * 1024 * 1024, 1} },
8841 .block_erase = spi_block_erase_60,
8842 }, {
8843 .eraseblocks = { {2 * 1024 * 1024, 1} },
8844 .block_erase = spi_block_erase_c7,
8845 }
8846 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008847 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008848 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008849 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008850 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008851 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008852 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00008853
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008854 {
8855 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00008856 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008857 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008858 .manufacture_id = MACRONIX_ID,
8859 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008860 .total_size = 2048,
8861 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008862 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8863 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008864 .tested = TEST_UNTESTED,
8865 .probe = probe_spi_rdid,
8866 .probe_timing = TIMING_ZERO,
8867 .block_erasers =
8868 {
8869 {
8870 .eraseblocks = { {4 * 1024, 512} },
8871 .block_erase = spi_block_erase_20,
8872 }, {
8873 .eraseblocks = { {64 * 1024, 32} },
8874 .block_erase = spi_block_erase_d8,
8875 }, {
8876 .eraseblocks = { {2 * 1024 * 1024, 1} },
8877 .block_erase = spi_block_erase_60,
8878 }, {
8879 .eraseblocks = { {2 * 1024 * 1024, 1} },
8880 .block_erase = spi_block_erase_c7,
8881 }
8882 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008883 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008884 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008885 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008886 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008887 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00008888 },
8889
8890 {
8891 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008892 .name = "MX25L2005(C)/MX25L2006E",
8893 .bustype = BUS_SPI,
8894 .manufacture_id = MACRONIX_ID,
8895 .model_id = MACRONIX_MX25L2005,
8896 .total_size = 256,
8897 .page_size = 256,
8898 .feature_bits = FEATURE_WRSR_WREN,
8899 .tested = TEST_OK_PREW,
8900 .probe = probe_spi_rdid,
8901 .probe_timing = TIMING_ZERO,
8902 .block_erasers =
8903 {
8904 {
8905 .eraseblocks = { {4 * 1024, 64} },
8906 .block_erase = spi_block_erase_20,
8907 }, {
8908 .eraseblocks = { {64 * 1024, 4} },
8909 .block_erase = spi_block_erase_52,
8910 }, {
8911 .eraseblocks = { {64 * 1024, 4} },
8912 .block_erase = spi_block_erase_d8,
8913 }, {
8914 .eraseblocks = { {256 * 1024, 1} },
8915 .block_erase = spi_block_erase_60,
8916 }, {
8917 .eraseblocks = { {256 * 1024, 1} },
8918 .block_erase = spi_block_erase_c7,
8919 },
8920 },
8921 .printlock = spi_prettyprint_status_register_bp1_srwd,
8922 .unlock = spi_disable_blockprotect,
8923 .write = spi_chip_write_256,
8924 .read = spi_chip_read, /* Fast read (0x0B) supported */
8925 .voltage = {2700, 3600},
8926 },
8927
8928 {
8929 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10008930 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008931 .bustype = BUS_SPI,
8932 .manufacture_id = MACRONIX_ID,
8933 .model_id = MACRONIX_MX25L25635F,
8934 .total_size = 32768,
8935 .page_size = 256,
8936 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8937 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8938 .tested = TEST_OK_PREW,
8939 .probe = probe_spi_rdid,
8940 .probe_timing = TIMING_ZERO,
8941 .block_erasers =
8942 {
8943 {
8944 .eraseblocks = { {4 * 1024, 8192} },
8945 .block_erase = spi_block_erase_21,
8946 }, {
8947 .eraseblocks = { {4 * 1024, 8192} },
8948 .block_erase = spi_block_erase_20,
8949 }, {
8950 .eraseblocks = { {32 * 1024, 1024} },
8951 .block_erase = spi_block_erase_5c,
8952 }, {
8953 .eraseblocks = { {32 * 1024, 1024} },
8954 .block_erase = spi_block_erase_52,
8955 }, {
8956 .eraseblocks = { {64 * 1024, 512} },
8957 .block_erase = spi_block_erase_dc,
8958 }, {
8959 .eraseblocks = { {64 * 1024, 512} },
8960 .block_erase = spi_block_erase_d8,
8961 }, {
8962 .eraseblocks = { {32 * 1024 * 1024, 1} },
8963 .block_erase = spi_block_erase_60,
8964 }, {
8965 .eraseblocks = { {32 * 1024 * 1024, 1} },
8966 .block_erase = spi_block_erase_c7,
8967 }
8968 },
8969 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8970 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8971 .unlock = spi_disable_blockprotect_bp3_srwd,
8972 .write = spi_chip_write_256,
8973 .read = spi_chip_read, /* Fast read (0x0B) supported */
8974 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +01008975 .prepare_access = spi_prepare_4ba,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008976 },
8977
8978 {
8979 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00008980 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008981 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008982 .manufacture_id = MACRONIX_ID,
8983 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008984 .total_size = 4096,
8985 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008986 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00008987 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008988 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008989 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008990 .block_erasers =
8991 {
8992 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008993 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008994 .block_erase = spi_block_erase_20,
8995 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008996 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008997 .block_erase = spi_block_erase_d8,
8998 }, {
8999 .eraseblocks = { {4 * 1024 * 1024, 1} },
9000 .block_erase = spi_block_erase_60,
9001 }, {
9002 .eraseblocks = { {4 * 1024 * 1024, 1} },
9003 .block_erase = spi_block_erase_c7,
9004 },
9005 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009006 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009007 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009008 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009009 .read = spi_chip_read, /* Fast read (0x0B) supported */
9010 .voltage = {2700, 3600},
9011 },
9012
9013 {
9014 .vendor = "Macronix",
9015 .name = "MX25L3205D/MX25L3208D",
9016 .bustype = BUS_SPI,
9017 .manufacture_id = MACRONIX_ID,
9018 .model_id = MACRONIX_MX25L3205,
9019 .total_size = 4096,
9020 .page_size = 256,
9021 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
9022 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9023 .tested = TEST_OK_PREW,
9024 .probe = probe_spi_rdid,
9025 .probe_timing = TIMING_ZERO,
9026 .block_erasers =
9027 {
9028 {
9029 .eraseblocks = { {4 * 1024, 1024} },
9030 .block_erase = spi_block_erase_20,
9031 }, {
9032 .eraseblocks = { {64 * 1024, 64} },
9033 .block_erase = spi_block_erase_d8,
9034 }, {
9035 .eraseblocks = { {4 * 1024 * 1024, 1} },
9036 .block_erase = spi_block_erase_60,
9037 }, {
9038 .eraseblocks = { {4 * 1024 * 1024, 1} },
9039 .block_erase = spi_block_erase_c7,
9040 },
9041 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009042 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009043 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009044 .write = spi_chip_write_256,
9045 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
9046 .voltage = {2700, 3600},
9047 },
9048
9049 {
9050 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009051 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009052 .bustype = BUS_SPI,
9053 .manufacture_id = MACRONIX_ID,
9054 .model_id = MACRONIX_MX25L3205,
9055 .total_size = 4096,
9056 .page_size = 256,
9057 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
9058 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9059 .tested = TEST_OK_PREW,
9060 .probe = probe_spi_rdid,
9061 .probe_timing = TIMING_ZERO,
9062 .block_erasers =
9063 {
9064 {
9065 .eraseblocks = { {4 * 1024, 1024} },
9066 .block_erase = spi_block_erase_20,
9067 }, {
9068 .eraseblocks = { {64 * 1024, 64} },
9069 .block_erase = spi_block_erase_d8,
9070 }, {
9071 .eraseblocks = { {64 * 1024, 64} },
9072 .block_erase = spi_block_erase_52,
9073 }, {
9074 .eraseblocks = { {4 * 1024 * 1024, 1} },
9075 .block_erase = spi_block_erase_60,
9076 }, {
9077 .eraseblocks = { {4 * 1024 * 1024, 1} },
9078 .block_erase = spi_block_erase_c7,
9079 },
9080 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009081 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009082 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009083 .write = spi_chip_write_256,
9084 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009085 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009086 },
9087
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009088 {
9089 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009090 .name = "MX25L3235D",
9091 .bustype = BUS_SPI,
9092 .manufacture_id = MACRONIX_ID,
9093 .model_id = MACRONIX_MX25L3235D,
9094 .total_size = 4096,
9095 .page_size = 256,
9096 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
9097 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9098 .tested = TEST_UNTESTED,
9099 .probe = probe_spi_rdid,
9100 .probe_timing = TIMING_ZERO,
9101 .block_erasers =
9102 {
9103 {
9104 .eraseblocks = { {4 * 1024, 1024} },
9105 .block_erase = spi_block_erase_20,
9106 }, {
9107 .eraseblocks = { {64 * 1024, 64} },
9108 .block_erase = spi_block_erase_d8,
9109 }, {
9110 .eraseblocks = { {4 * 1024 * 1024, 1} },
9111 .block_erase = spi_block_erase_60,
9112 }, {
9113 .eraseblocks = { {4 * 1024 * 1024, 1} },
9114 .block_erase = spi_block_erase_c7,
9115 }
9116 },
9117 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9118 .unlock = spi_disable_blockprotect_bp3_srwd,
9119 .write = spi_chip_write_256,
9120 .read = spi_chip_read,
9121 .voltage = {2700, 3600},
9122 },
9123
9124 {
9125 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02009126 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009127 .bustype = BUS_SPI,
9128 .manufacture_id = MACRONIX_ID,
9129 .model_id = MACRONIX_MX25L3205,
9130 .total_size = 4096,
9131 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02009132 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009133 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009134 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009135 .probe = probe_spi_rdid,
9136 .probe_timing = TIMING_ZERO,
9137 .block_erasers =
9138 {
9139 {
9140 .eraseblocks = { {4 * 1024, 1024} },
9141 .block_erase = spi_block_erase_20,
9142 }, {
9143 .eraseblocks = { {32 * 1024, 128} },
9144 .block_erase = spi_block_erase_52,
9145 }, {
9146 .eraseblocks = { {64 * 1024, 64} },
9147 .block_erase = spi_block_erase_d8,
9148 }, {
9149 .eraseblocks = { {4 * 1024 * 1024, 1} },
9150 .block_erase = spi_block_erase_60,
9151 }, {
9152 .eraseblocks = { {4 * 1024 * 1024, 1} },
9153 .block_erase = spi_block_erase_c7,
9154 },
9155 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009156 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009157 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009158 .write = spi_chip_write_256,
9159 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Nico Huberb6683e02021-04-21 13:04:29 +02009160 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009161 },
9162
9163 {
9164 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009165 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009166 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009167 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009168 .model_id = MACRONIX_MX25L4005,
9169 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009170 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009171 .feature_bits = FEATURE_WRSR_WREN,
9172 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009173 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009174 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009175 .block_erasers =
9176 {
9177 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009178 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00009179 .block_erase = spi_block_erase_20,
9180 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009181 .eraseblocks = { {64 * 1024, 8} },
9182 .block_erase = spi_block_erase_52,
9183 }, {
9184 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00009185 .block_erase = spi_block_erase_d8,
9186 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009187 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009188 .block_erase = spi_block_erase_60,
9189 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009190 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009191 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009192 },
Sean Nelson54596372010-01-09 05:30:14 +00009193 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009194 .printlock = spi_prettyprint_status_register_bp2_srwd,
9195 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009196 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009197 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009198 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009199 },
9200
9201 {
9202 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009203 .name = "MX25L512(E)/MX25V512(C)",
9204 .bustype = BUS_SPI,
9205 .manufacture_id = MACRONIX_ID,
9206 .model_id = MACRONIX_MX25L512,
9207 .total_size = 64,
9208 .page_size = 256,
9209 /* MX25L512E supports SFDP */
9210 .feature_bits = FEATURE_WRSR_WREN,
9211 .tested = TEST_OK_PREW,
9212 .probe = probe_spi_rdid,
9213 .probe_timing = TIMING_ZERO,
9214 .block_erasers =
9215 {
9216 {
9217 .eraseblocks = { {4 * 1024, 16} },
9218 .block_erase = spi_block_erase_20,
9219 }, {
9220 .eraseblocks = { {64 * 1024, 1} },
9221 .block_erase = spi_block_erase_52,
9222 }, {
9223 .eraseblocks = { {64 * 1024, 1} },
9224 .block_erase = spi_block_erase_d8,
9225 }, {
9226 .eraseblocks = { {64 * 1024, 1} },
9227 .block_erase = spi_block_erase_60,
9228 }, {
9229 .eraseblocks = { {64 * 1024, 1} },
9230 .block_erase = spi_block_erase_c7,
9231 },
9232 },
9233 .printlock = spi_prettyprint_status_register_bp1_srwd,
9234 .unlock = spi_disable_blockprotect,
9235 .write = spi_chip_write_256,
9236 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
9237 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
9238 },
9239
9240 {
9241 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009242 .name = "MX25L5121E",
9243 .bustype = BUS_SPI,
9244 .manufacture_id = MACRONIX_ID,
9245 .model_id = MACRONIX_MX25L5121E,
9246 .total_size = 64,
9247 .page_size = 32,
9248 .feature_bits = FEATURE_WRSR_WREN,
9249 .tested = TEST_OK_PREW,
9250 .probe = probe_spi_rdid,
9251 .probe_timing = TIMING_ZERO,
9252 .block_erasers =
9253 {
9254 {
9255 .eraseblocks = { {4 * 1024, 16} },
9256 .block_erase = spi_block_erase_20,
9257 }, {
9258 .eraseblocks = { {64 * 1024, 1} },
9259 .block_erase = spi_block_erase_52,
9260 }, {
9261 .eraseblocks = { {64 * 1024, 1} },
9262 .block_erase = spi_block_erase_d8,
9263 }, {
9264 .eraseblocks = { {64 * 1024, 1} },
9265 .block_erase = spi_block_erase_60,
9266 }, {
9267 .eraseblocks = { {64 * 1024, 1} },
9268 .block_erase = spi_block_erase_c7,
9269 },
9270 },
9271 .printlock = spi_prettyprint_status_register_bp1_srwd,
9272 .unlock = spi_disable_blockprotect,
9273 .write = spi_chip_write_256,
9274 .read = spi_chip_read, /* Fast read (0x0B) supported */
9275 .voltage = {2700, 3600},
9276 },
9277
9278 {
9279 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009280 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009281 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009282 .manufacture_id = MACRONIX_ID,
9283 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009284 .total_size = 8192,
9285 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009286 /* Has an additional 512B EEPROM sector */
9287 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00009288 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009289 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009290 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009291 .block_erasers =
9292 {
9293 {
9294 .eraseblocks = { {64 * 1024, 128} },
9295 .block_erase = spi_block_erase_20,
9296 }, {
9297 .eraseblocks = { {64 * 1024, 128} },
9298 .block_erase = spi_block_erase_d8,
9299 }, {
9300 .eraseblocks = { {8 * 1024 * 1024, 1} },
9301 .block_erase = spi_block_erase_60,
9302 }, {
9303 .eraseblocks = { {8 * 1024 * 1024, 1} },
9304 .block_erase = spi_block_erase_c7,
9305 }
9306 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009307 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009308 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009309 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009310 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009311 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009312 },
9313
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009314 {
9315 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009316 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00009317 .bustype = BUS_SPI,
9318 .manufacture_id = MACRONIX_ID,
9319 .model_id = MACRONIX_MX25L6405,
9320 .total_size = 8192,
9321 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009322 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009323 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9324 .tested = TEST_OK_PREW,
9325 .probe = probe_spi_rdid,
9326 .probe_timing = TIMING_ZERO,
9327 .block_erasers =
9328 {
9329 {
9330 .eraseblocks = { {4 * 1024, 2048} },
9331 .block_erase = spi_block_erase_20,
9332 }, {
9333 .eraseblocks = { {64 * 1024, 128} },
9334 .block_erase = spi_block_erase_d8,
9335 }, {
9336 .eraseblocks = { {8 * 1024 * 1024, 1} },
9337 .block_erase = spi_block_erase_60,
9338 }, {
9339 .eraseblocks = { {8 * 1024 * 1024, 1} },
9340 .block_erase = spi_block_erase_c7,
9341 }
9342 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009343 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009344 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009345 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009346 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00009347 .voltage = {2700, 3600},
9348 },
9349
9350 {
9351 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009352 .name = "MX25L6406E/MX25L6408E",
9353 .bustype = BUS_SPI,
9354 .manufacture_id = MACRONIX_ID,
9355 .model_id = MACRONIX_MX25L6405,
9356 .total_size = 8192,
9357 .page_size = 256,
9358 /* MX25L6406E supports SFDP */
9359 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
9360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9361 .tested = TEST_OK_PREW,
9362 .probe = probe_spi_rdid,
9363 .probe_timing = TIMING_ZERO,
9364 .block_erasers =
9365 {
9366 {
9367 .eraseblocks = { {4 * 1024, 2048} },
9368 .block_erase = spi_block_erase_20,
9369 }, {
9370 .eraseblocks = { {64 * 1024, 128} },
9371 .block_erase = spi_block_erase_52,
9372 }, {
9373 .eraseblocks = { {64 * 1024, 128} },
9374 .block_erase = spi_block_erase_d8,
9375 }, {
9376 .eraseblocks = { {8 * 1024 * 1024, 1} },
9377 .block_erase = spi_block_erase_60,
9378 }, {
9379 .eraseblocks = { {8 * 1024 * 1024, 1} },
9380 .block_erase = spi_block_erase_c7,
9381 }
9382 },
9383 .printlock = spi_prettyprint_status_register_bp3_srwd,
9384 .unlock = spi_disable_blockprotect_bp3_srwd,
9385 .write = spi_chip_write_256,
9386 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
9387 .voltage = {2700, 3600},
9388 },
9389
9390 {
9391 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01009392 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00009393 .bustype = BUS_SPI,
9394 .manufacture_id = MACRONIX_ID,
9395 .model_id = MACRONIX_MX25L6405,
9396 .total_size = 8192,
9397 .page_size = 256,
9398 /* supports SFDP */
9399 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9400 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9401 .tested = TEST_OK_PREW,
9402 .probe = probe_spi_rdid,
9403 .probe_timing = TIMING_ZERO,
9404 .block_erasers =
9405 {
9406 {
9407 .eraseblocks = { {4 * 1024, 2048} },
9408 .block_erase = spi_block_erase_20,
9409 }, {
9410 .eraseblocks = { {32 * 1024, 256} },
9411 .block_erase = spi_block_erase_52,
9412 }, {
9413 .eraseblocks = { {64 * 1024, 128} },
9414 .block_erase = spi_block_erase_d8,
9415 }, {
9416 .eraseblocks = { {8 * 1024 * 1024, 1} },
9417 .block_erase = spi_block_erase_60,
9418 }, {
9419 .eraseblocks = { {8 * 1024 * 1024, 1} },
9420 .block_erase = spi_block_erase_c7,
9421 }
9422 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009423 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009424 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009425 .write = spi_chip_write_256,
9426 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9427 .voltage = {2700, 3600},
9428 },
9429
9430 {
9431 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009432 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009433 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009434 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009435 .model_id = MACRONIX_MX25L6495F,
9436 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009437 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009438 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009439 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009440 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009441 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009442 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009443 .block_erasers =
9444 {
9445 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009446 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +00009447 .block_erase = spi_block_erase_20,
9448 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009449 .eraseblocks = { {32 * 1024, 256} },
9450 .block_erase = spi_block_erase_52,
9451 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309452 .eraseblocks = { {64 * 1024, 128} },
9453 .block_erase = spi_block_erase_d8,
9454 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009455 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009456 .block_erase = spi_block_erase_60,
9457 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009458 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009459 .block_erase = spi_block_erase_c7,
9460 }
9461 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009462 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009463 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009464 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009465 .voltage = {2700, 3600},
9466 },
9467
9468 {
9469 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009470 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +00009471 .bustype = BUS_SPI,
9472 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009473 .model_id = MACRONIX_MX25L8005,
9474 .total_size = 1024,
9475 .page_size = 256,
9476 /* MX25L8006E, MX25L8008E support SFDP */
9477 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
9478 .feature_bits = FEATURE_WRSR_WREN,
9479 .tested = TEST_OK_PREW,
9480 .probe = probe_spi_rdid,
9481 .probe_timing = TIMING_ZERO,
9482 .block_erasers =
9483 {
9484 {
9485 .eraseblocks = { {4 * 1024, 256} },
9486 .block_erase = spi_block_erase_20,
9487 }, {
9488 .eraseblocks = { {64 * 1024, 16} },
9489 .block_erase = spi_block_erase_52,
9490 }, {
9491 .eraseblocks = { {64 * 1024, 16} },
9492 .block_erase = spi_block_erase_d8,
9493 }, {
9494 .eraseblocks = { {1024 * 1024, 1} },
9495 .block_erase = spi_block_erase_60,
9496 }, {
9497 .eraseblocks = { {1024 * 1024, 1} },
9498 .block_erase = spi_block_erase_c7,
9499 },
9500 },
9501 .printlock = spi_prettyprint_status_register_bp2_srwd,
9502 .unlock = spi_disable_blockprotect,
9503 .write = spi_chip_write_256,
9504 .read = spi_chip_read, /* Fast read (0x0B) supported */
9505 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9506 },
9507
9508 {
9509 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +09009510 .name = "MX25R3235F",
9511 .bustype = BUS_SPI,
9512 .manufacture_id = MACRONIX_ID,
9513 .model_id = MACRONIX_MX25R3235F,
9514 .total_size = 4096,
9515 .page_size = 256,
9516 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9518 .tested = TEST_OK_PREW,
9519 .probe = probe_spi_rdid,
9520 .probe_timing = TIMING_ZERO,
9521 .block_erasers =
9522 {
9523 {
9524 .eraseblocks = { {4 * 1024, 1024} },
9525 .block_erase = spi_block_erase_20,
9526 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009527 .eraseblocks = { {32 * 1024, 128} },
9528 .block_erase = spi_block_erase_52,
9529 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309530 .eraseblocks = { {64 * 1024, 64} },
9531 .block_erase = spi_block_erase_d8,
9532 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009533 .eraseblocks = { {4 * 1024 * 1024, 1} },
9534 .block_erase = spi_block_erase_60,
9535 }, {
9536 .eraseblocks = { {4 * 1024 * 1024, 1} },
9537 .block_erase = spi_block_erase_c7,
9538 }
9539 },
9540 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit 6 is quad enable */
9541 .unlock = spi_disable_blockprotect_bp3_srwd,
9542 .write = spi_chip_write_256,
9543 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9544 .voltage = {1650, 3600},
9545 },
9546
9547 {
9548 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009549 .name = "MX25R6435F",
9550 .bustype = BUS_SPI,
9551 .manufacture_id = MACRONIX_ID,
9552 .model_id = MACRONIX_MX25R6435F,
9553 .total_size = 8192,
9554 .page_size = 256,
9555 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9556 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9557 .tested = TEST_OK_PREW,
9558 .probe = probe_spi_rdid,
9559 .probe_timing = TIMING_ZERO,
9560 .block_erasers =
9561 {
9562 {
9563 .eraseblocks = { {4 * 1024, 2048} },
9564 .block_erase = spi_block_erase_20,
9565 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009566 .eraseblocks = { {32 * 1024, 256} },
9567 .block_erase = spi_block_erase_52,
9568 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309569 .eraseblocks = { {64 * 1024, 128} },
9570 .block_erase = spi_block_erase_d8,
9571 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009572 .eraseblocks = { {8 * 1024 * 1024, 1} },
9573 .block_erase = spi_block_erase_60,
9574 }, {
9575 .eraseblocks = { {8 * 1024 * 1024, 1} },
9576 .block_erase = spi_block_erase_c7,
9577 }
9578 },
9579 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9580 .unlock = spi_disable_blockprotect_bp3_srwd,
9581 .write = spi_chip_write_256,
9582 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9583 .voltage = {1650, 3600},
9584 },
9585
9586 {
9587 .vendor = "Macronix",
9588 .name = "MX25U12835F",
9589 .bustype = BUS_SPI,
9590 .manufacture_id = MACRONIX_ID,
9591 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009592 .total_size = 16384,
9593 .page_size = 256,
9594 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009595 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009596 .tested = TEST_OK_PREW,
9597 .probe = probe_spi_rdid,
9598 .probe_timing = TIMING_ZERO,
9599 .block_erasers =
9600 {
9601 {
9602 .eraseblocks = { {4 * 1024, 4096} },
9603 .block_erase = spi_block_erase_20,
9604 }, {
9605 .eraseblocks = { {32 * 1024, 512} },
9606 .block_erase = spi_block_erase_52,
9607 }, {
9608 .eraseblocks = { {64 * 1024, 256} },
9609 .block_erase = spi_block_erase_d8,
9610 }, {
9611 .eraseblocks = { {16 * 1024 * 1024, 1} },
9612 .block_erase = spi_block_erase_60,
9613 }, {
9614 .eraseblocks = { {16 * 1024 * 1024, 1} },
9615 .block_erase = spi_block_erase_c7,
9616 }
9617 },
Angel Ponsf112e242018-09-30 20:14:17 +02009618 /* TODO: security register */
9619 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9620 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009621 .write = spi_chip_write_256, /* Multi I/O supported */
Angel Ponsf112e242018-09-30 20:14:17 +02009622 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9623 .voltage = {1650, 2000},
9624 },
9625
9626 {
9627 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00009628 .name = "MX25U1635E",
9629 .bustype = BUS_SPI,
9630 .manufacture_id = MACRONIX_ID,
9631 .model_id = MACRONIX_MX25U1635E,
9632 .total_size = 2048,
9633 .page_size = 256,
9634 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9635 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9636 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009637 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00009638 .probe = probe_spi_rdid,
9639 .probe_timing = TIMING_ZERO,
9640 .block_erasers =
9641 {
9642 {
9643 .eraseblocks = { {4 * 1024, 512} },
9644 .block_erase = spi_block_erase_20,
9645 }, {
9646 .eraseblocks = { {32 * 1024, 64} },
9647 .block_erase = spi_block_erase_52,
9648 }, {
9649 .eraseblocks = { {64 * 1024, 32} },
9650 .block_erase = spi_block_erase_d8,
9651 }, {
9652 .eraseblocks = { {2 * 1024 * 1024, 1} },
9653 .block_erase = spi_block_erase_60,
9654 }, {
9655 .eraseblocks = { {2 * 1024 * 1024, 1} },
9656 .block_erase = spi_block_erase_c7,
9657 }
9658 },
9659 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00009660 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009661 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00009662 .write = spi_chip_write_256,
9663 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9664 .voltage = {1650, 2000},
9665 },
9666
9667 {
9668 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07009669 .name = "MX25U25635F",
9670 .bustype = BUS_SPI,
9671 .manufacture_id = MACRONIX_ID,
9672 .model_id = MACRONIX_MX25U25635F,
9673 .total_size = 32768,
9674 .page_size = 256,
9675 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9676 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
Nikolai Artemiev148254b2021-03-23 17:21:10 +11009677 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009678 .probe = probe_spi_rdid,
9679 .probe_timing = TIMING_ZERO,
9680 .block_erasers =
9681 {
9682 {
9683 .eraseblocks = { {4 * 1024, 8192} },
9684 .block_erase = spi_block_erase_21,
9685 }, {
9686 .eraseblocks = { {4 * 1024, 8192} },
9687 .block_erase = spi_block_erase_20,
9688 }, {
9689 .eraseblocks = { {32 * 1024, 1024} },
9690 .block_erase = spi_block_erase_5c,
9691 }, {
9692 .eraseblocks = { {32 * 1024, 1024} },
9693 .block_erase = spi_block_erase_52,
9694 }, {
9695 .eraseblocks = { {64 * 1024, 512} },
9696 .block_erase = spi_block_erase_dc,
9697 }, {
9698 .eraseblocks = { {64 * 1024, 512} },
9699 .block_erase = spi_block_erase_d8,
9700 }, {
9701 .eraseblocks = { {32 * 1024 * 1024, 1} },
9702 .block_erase = spi_block_erase_60,
9703 }, {
9704 .eraseblocks = { {32 * 1024 * 1024, 1} },
9705 .block_erase = spi_block_erase_c7,
9706 }
9707 },
9708 /* TODO: security register */
9709 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9710 .unlock = spi_disable_blockprotect_bp3_srwd,
9711 .write = spi_chip_write_256, /* Multi I/O supported */
9712 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9713 .voltage = {1650, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +01009714 .prepare_access = spi_prepare_4ba,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009715 },
9716
9717 {
9718 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009719 .name = "MX25U3235E/F",
9720 .bustype = BUS_SPI,
9721 .manufacture_id = MACRONIX_ID,
9722 .model_id = MACRONIX_MX25U3235E,
9723 .total_size = 4096,
9724 .page_size = 256,
9725 /* F model supports SFDP */
9726 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9727 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9729 .tested = TEST_OK_PREW,
9730 .probe = probe_spi_rdid,
9731 .probe_timing = TIMING_ZERO,
9732 .block_erasers =
9733 {
9734 {
9735 .eraseblocks = { {4 * 1024, 1024} },
9736 .block_erase = spi_block_erase_20,
9737 }, {
9738 .eraseblocks = { {32 * 1024, 128} },
9739 .block_erase = spi_block_erase_52,
9740 }, {
9741 .eraseblocks = { {64 * 1024, 64} },
9742 .block_erase = spi_block_erase_d8,
9743 }, {
9744 .eraseblocks = { {4 * 1024 * 1024, 1} },
9745 .block_erase = spi_block_erase_60,
9746 }, {
9747 .eraseblocks = { {4 * 1024 * 1024, 1} },
9748 .block_erase = spi_block_erase_c7,
9749 }
9750 },
9751 /* TODO: security register */
9752 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9753 .unlock = spi_disable_blockprotect_bp3_srwd,
9754 .write = spi_chip_write_256,
9755 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9756 .voltage = {1650, 2000},
9757 },
9758
9759 {
9760 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +01009761 .name = "MX25U51245G",
9762 .bustype = BUS_SPI,
9763 .manufacture_id = MACRONIX_ID,
9764 .model_id = MACRONIX_MX25U51245G,
9765 .total_size = 65536,
9766 .page_size = 256,
9767 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
9768 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
9769 .tested = TEST_OK_PREW,
9770 .probe = probe_spi_rdid,
9771 .probe_timing = TIMING_ZERO,
9772 .block_erasers =
9773 {
9774 {
9775 .eraseblocks = { {4 * 1024, 16384} },
9776 .block_erase = spi_block_erase_21,
9777 }, {
9778 .eraseblocks = { {4 * 1024, 16384} },
9779 .block_erase = spi_block_erase_20,
9780 }, {
9781 .eraseblocks = { {32 * 1024, 2048} },
9782 .block_erase = spi_block_erase_5c,
9783 }, {
9784 .eraseblocks = { {32 * 1024, 2048} },
9785 .block_erase = spi_block_erase_52,
9786 }, {
9787 .eraseblocks = { {64 * 1024, 1024} },
9788 .block_erase = spi_block_erase_dc,
9789 }, {
9790 .eraseblocks = { {64 * 1024, 1024} },
9791 .block_erase = spi_block_erase_d8,
9792 }, {
9793 .eraseblocks = { {64 * 1024 * 1024, 1} },
9794 .block_erase = spi_block_erase_60,
9795 }, {
9796 .eraseblocks = { {64 * 1024 * 1024, 1} },
9797 .block_erase = spi_block_erase_c7,
9798 }
9799 },
9800 /* TODO: security register */
9801 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9802 .unlock = spi_disable_blockprotect_bp3_srwd,
9803 .write = spi_chip_write_256, /* Multi I/O supported */
9804 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9805 .voltage = {1650, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +01009806 .prepare_access = spi_prepare_4ba,
Daniel Thompsoncadd4202018-06-04 13:52:22 +01009807 },
9808
9809 {
9810 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009811 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009812 .bustype = BUS_SPI,
9813 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009814 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009815 .total_size = 8192,
9816 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009817 /* F model supports SFDP */
9818 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9819 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9820 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009821 .tested = TEST_OK_PREW,
9822 .probe = probe_spi_rdid,
9823 .probe_timing = TIMING_ZERO,
9824 .block_erasers =
9825 {
9826 {
9827 .eraseblocks = { {4 * 1024, 2048} },
9828 .block_erase = spi_block_erase_20,
9829 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009830 .eraseblocks = { {32 * 1024, 256} },
9831 .block_erase = spi_block_erase_52,
9832 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009833 .eraseblocks = { {64 * 1024, 128} },
9834 .block_erase = spi_block_erase_d8,
9835 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009836 .eraseblocks = { {8 * 1024 * 1024, 1} },
9837 .block_erase = spi_block_erase_60,
9838 }, {
9839 .eraseblocks = { {8 * 1024 * 1024, 1} },
9840 .block_erase = spi_block_erase_c7,
9841 }
9842 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009843 /* TODO: security register */
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009844 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9845 .unlock = spi_disable_blockprotect_bp3_srwd,
9846 .write = spi_chip_write_256,
9847 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009848 .voltage = {1650, 2000},
9849 },
9850
9851 {
9852 .vendor = "Macronix",
9853 .name = "MX25U8032E",
9854 .bustype = BUS_SPI,
9855 .manufacture_id = MACRONIX_ID,
9856 .model_id = MACRONIX_MX25U8032E,
9857 .total_size = 1024,
9858 .page_size = 256,
9859 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9861 .tested = TEST_OK_PREW,
9862 .probe = probe_spi_rdid,
9863 .probe_timing = TIMING_ZERO,
9864 .block_erasers =
9865 {
9866 {
9867 .eraseblocks = { {4 * 1024, 256} },
9868 .block_erase = spi_block_erase_20,
9869 }, {
9870 .eraseblocks = { {32 * 1024, 32} },
9871 .block_erase = spi_block_erase_52,
9872 }, {
9873 .eraseblocks = { {64 * 1024, 16} },
9874 .block_erase = spi_block_erase_d8,
9875 }, {
9876 .eraseblocks = { {1024 * 1024, 1} },
9877 .block_erase = spi_block_erase_60,
9878 }, {
9879 .eraseblocks = { {1024 * 1024, 1} },
9880 .block_erase = spi_block_erase_c7,
9881 }
9882 },
9883 /* TODO: security register */
9884 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9885 .unlock = spi_disable_blockprotect_bp3_srwd,
9886 .write = spi_chip_write_256,
9887 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9888 .voltage = {1650, 2000},
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009889 },
9890
9891 {
9892 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00009893 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009894 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009895 .manufacture_id = MACRONIX_ID,
9896 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009897 .total_size = 128,
9898 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009899 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9900 .tested = TEST_UNTESTED,
9901 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009902 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009903 .block_erasers =
9904 {
9905 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009906 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009907 {8 * 1024, 1},
9908 {4 * 1024, 2},
9909 {8 * 1024, 2},
9910 {32 * 1024, 1},
9911 {64 * 1024, 1},
9912 },
Sean Nelson35727f72010-01-28 23:55:12 +00009913 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009914 }, {
9915 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009916 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009917 }
9918 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009919 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009920 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009921 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01009922 .prepare_access = prepare_memory_access,
9923 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009924 },
9925
9926 {
9927 .vendor = "Macronix",
9928 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009929 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009930 .manufacture_id = MACRONIX_ID,
9931 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009932 .total_size = 128,
9933 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009934 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00009935 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009936 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009937 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009938 .block_erasers =
9939 {
9940 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009941 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009942 {64 * 1024, 1},
9943 {32 * 1024, 1},
9944 {8 * 1024, 2},
9945 {4 * 1024, 2},
9946 {8 * 1024, 1},
9947 },
Sean Nelson35727f72010-01-28 23:55:12 +00009948 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009949 }, {
9950 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009951 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009952 }
9953 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009954 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009955 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009956 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01009957 .prepare_access = prepare_memory_access,
9958 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009959 },
9960
9961 {
9962 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009963 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009964 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009965 .manufacture_id = MACRONIX_ID,
9966 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009967 .total_size = 256,
9968 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009969 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009970 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009971 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009972 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009973 .block_erasers =
9974 {
9975 {
9976 .eraseblocks = {
9977 {16 * 1024, 1},
9978 {8 * 1024, 2},
9979 {32 * 1024, 1},
9980 {64 * 1024, 3},
9981 },
Sean Nelson35727f72010-01-28 23:55:12 +00009982 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009983 }, {
9984 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009985 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009986 },
9987 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009988 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009989 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009990 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01009991 .prepare_access = prepare_memory_access,
9992 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00009993 },
9994
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009995 {
9996 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009997 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009998 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009999 .manufacture_id = MACRONIX_ID,
10000 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010001 .total_size = 256,
10002 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010003 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010004 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010005 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010006 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010007 .block_erasers =
10008 {
10009 {
10010 .eraseblocks = {
10011 {64 * 1024, 3},
10012 {32 * 1024, 1},
10013 {8 * 1024, 2},
10014 {16 * 1024, 1},
10015 },
Sean Nelson35727f72010-01-28 23:55:12 +000010016 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010017 }, {
10018 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010019 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010020 },
10021 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010022 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010023 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010024 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010025 .prepare_access = prepare_memory_access,
10026 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010027 },
10028
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010029 {
10030 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +000010031 .name = "MX29F022(N)B",
10032 .bustype = BUS_PARALLEL,
10033 .manufacture_id = MACRONIX_ID,
10034 .model_id = MACRONIX_MX29F022B,
10035 .total_size = 256,
10036 .page_size = 0, /* unused */
10037 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10038 .tested = TEST_UNTESTED,
10039 .probe = probe_jedec,
10040 .probe_timing = TIMING_ZERO,
10041 .block_erasers =
10042 {
10043 {
10044 .eraseblocks = {
10045 {16 * 1024, 1},
10046 {8 * 1024, 2},
10047 {32 * 1024, 1},
10048 {64 * 1024, 3},
10049 },
10050 .block_erase = erase_sector_jedec,
10051 }, {
10052 .eraseblocks = { {256 * 1024, 1} },
10053 .block_erase = erase_chip_block_jedec,
10054 }
10055 },
10056 .write = write_jedec_1,
10057 .read = read_memmapped,
10058 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010059 .prepare_access = prepare_memory_access,
10060 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010061 },
10062
10063 {
10064 .vendor = "Macronix",
10065 .name = "MX29F022(N)T",
10066 .bustype = BUS_PARALLEL,
10067 .manufacture_id = MACRONIX_ID,
10068 .model_id = MACRONIX_MX29F022T,
10069 .total_size = 256,
10070 .page_size = 0, /* unused */
10071 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10072 .tested = TEST_OK_PREW,
10073 .probe = probe_jedec,
10074 .probe_timing = TIMING_ZERO,
10075 .block_erasers =
10076 {
10077 {
10078 .eraseblocks = {
10079 {64 * 1024, 3},
10080 {32 * 1024, 1},
10081 {8 * 1024, 2},
10082 {16 * 1024, 1},
10083 },
10084 .block_erase = erase_sector_jedec,
10085 }, {
10086 .eraseblocks = { {256 * 1024, 1} },
10087 .block_erase = erase_chip_block_jedec,
10088 }
10089 },
10090 .write = write_jedec_1,
10091 .read = read_memmapped,
10092 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010093 .prepare_access = prepare_memory_access,
10094 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010095 },
10096
10097 {
10098 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +000010099 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010100 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +000010101 .manufacture_id = MACRONIX_ID,
10102 .model_id = MACRONIX_MX29F040,
10103 .total_size = 512,
10104 .page_size = 64 * 1024,
10105 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10106 .tested = TEST_UNTESTED,
10107 .probe = probe_jedec,
10108 .probe_timing = TIMING_ZERO,
10109 .block_erasers =
10110 {
10111 {
10112 .eraseblocks = { {64 * 1024, 8} },
10113 .block_erase = erase_sector_jedec,
10114 }, {
10115 .eraseblocks = { {512 * 1024, 1} },
10116 .block_erase = erase_chip_block_jedec,
10117 },
10118 },
10119 .write = write_jedec_1,
10120 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010121 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010122 .prepare_access = prepare_memory_access,
10123 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +000010124 },
10125
10126 {
10127 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010128 .name = "MX29GL128F",
10129 .bustype = BUS_PARALLEL,
10130 .manufacture_id = MACRONIX_ID,
10131 .model_id = MACRONIX_MX29GL128F,
10132 .total_size = 16384,
10133 .page_size = 128 * 1024, /* actual page size is 16 */
10134 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10135 .tested = TEST_UNTESTED,
10136 .probe = probe_jedec_29gl,
10137 .probe_timing = TIMING_ZERO,
10138 .block_erasers =
10139 {
10140 {
10141 .eraseblocks = { {128 * 1024, 128} },
10142 .block_erase = erase_sector_jedec,
10143 }, {
10144 .eraseblocks = { {16 * 1024 * 1024, 1} },
10145 .block_erase = erase_chip_block_jedec,
10146 },
10147 },
10148 .write = write_jedec_1,
10149 .read = read_memmapped,
10150 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010151 .prepare_access = prepare_memory_access,
10152 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010153 },
10154
10155 {
10156 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010157 .name = "MX29GL320EB",
10158 .bustype = BUS_PARALLEL,
10159 .manufacture_id = MACRONIX_ID,
10160 .model_id = MACRONIX_MX29GL320EB,
10161 .total_size = 4096,
10162 .page_size = 128 * 1024, /* actual page size is 16 */
10163 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10164 .tested = TEST_UNTESTED,
10165 .probe = probe_jedec_29gl,
10166 .probe_timing = TIMING_ZERO,
10167 .block_erasers =
10168 {
10169 {
10170 .eraseblocks = {
10171 {8 * 1024, 8},
10172 {64 * 1024, 63},
10173 },
10174 .block_erase = erase_sector_jedec,
10175 }, {
10176 .eraseblocks = { {4 * 1024 * 1024, 1} },
10177 .block_erase = erase_chip_block_jedec,
10178 },
10179 },
10180 .write = write_jedec_1,
10181 .read = read_memmapped,
10182 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010183 .prepare_access = prepare_memory_access,
10184 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010185 },
10186
10187 {
10188 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010189 .name = "MX29GL320EH/L",
10190 .bustype = BUS_PARALLEL,
10191 .manufacture_id = MACRONIX_ID,
10192 .model_id = MACRONIX_MX29GL320EHL,
10193 .total_size = 4096,
10194 .page_size = 128 * 1024, /* actual page size is 16 */
10195 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10196 .tested = TEST_UNTESTED,
10197 .probe = probe_jedec_29gl,
10198 .probe_timing = TIMING_ZERO,
10199 .block_erasers =
10200 {
10201 {
10202 .eraseblocks = { {64 * 1024, 64} },
10203 .block_erase = erase_sector_jedec,
10204 }, {
10205 .eraseblocks = { {4 * 1024 * 1024, 1} },
10206 .block_erase = erase_chip_block_jedec,
10207 },
10208 },
10209 .write = write_jedec_1,
10210 .read = read_memmapped,
10211 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010212 .prepare_access = prepare_memory_access,
10213 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010214 },
10215
10216 {
10217 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010218 .name = "MX29GL320ET",
10219 .bustype = BUS_PARALLEL,
10220 .manufacture_id = MACRONIX_ID,
10221 .model_id = MACRONIX_MX29GL320ET,
10222 .total_size = 4096,
10223 .page_size = 128 * 1024, /* actual page size is 16 */
10224 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10225 .tested = TEST_UNTESTED,
10226 .probe = probe_jedec_29gl,
10227 .probe_timing = TIMING_ZERO,
10228 .block_erasers =
10229 {
10230 {
10231 .eraseblocks = {
10232 {64 * 1024, 63},
10233 {8 * 1024, 8},
10234 },
10235 .block_erase = erase_sector_jedec,
10236 }, {
10237 .eraseblocks = { {4 * 1024 * 1024, 1} },
10238 .block_erase = erase_chip_block_jedec,
10239 },
10240 },
10241 .write = write_jedec_1,
10242 .read = read_memmapped,
10243 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010244 .prepare_access = prepare_memory_access,
10245 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010246 },
10247
10248 {
10249 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010250 .name = "MX29GL640EB",
10251 .bustype = BUS_PARALLEL,
10252 .manufacture_id = MACRONIX_ID,
10253 .model_id = MACRONIX_MX29GL640EB,
10254 .total_size = 8192,
10255 .page_size = 128 * 1024, /* actual page size is 16 */
10256 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10257 .tested = TEST_UNTESTED,
10258 .probe = probe_jedec_29gl,
10259 .probe_timing = TIMING_ZERO,
10260 .block_erasers =
10261 {
10262 {
10263 .eraseblocks = {
10264 {8 * 1024, 8},
10265 {64 * 1024, 127},
10266 },
10267 .block_erase = erase_sector_jedec,
10268 }, {
10269 .eraseblocks = { {8 * 1024 * 1024, 1} },
10270 .block_erase = erase_chip_block_jedec,
10271 },
10272 },
10273 .write = write_jedec_1,
10274 .read = read_memmapped,
10275 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010276 .prepare_access = prepare_memory_access,
10277 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010278 },
10279
10280 {
10281 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010282 .name = "MX29GL640EH/L",
10283 .bustype = BUS_PARALLEL,
10284 .manufacture_id = MACRONIX_ID,
10285 .model_id = MACRONIX_MX29GL640EHL,
10286 .total_size = 8192,
10287 .page_size = 128 * 1024, /* actual page size is 16 */
10288 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10289 .tested = TEST_UNTESTED,
10290 .probe = probe_jedec_29gl,
10291 .probe_timing = TIMING_ZERO,
10292 .block_erasers =
10293 {
10294 {
10295 .eraseblocks = { {64 * 1024, 128} },
10296 .block_erase = erase_sector_jedec,
10297 }, {
10298 .eraseblocks = { {8 * 1024 * 1024, 1} },
10299 .block_erase = erase_chip_block_jedec,
10300 },
10301 },
10302 .write = write_jedec_1,
10303 .read = read_memmapped,
10304 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010305 .prepare_access = prepare_memory_access,
10306 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010307 },
10308
10309 {
10310 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010311 .name = "MX29GL640ET",
10312 .bustype = BUS_PARALLEL,
10313 .manufacture_id = MACRONIX_ID,
10314 .model_id = MACRONIX_MX29GL640ET,
10315 .total_size = 8192,
10316 .page_size = 128 * 1024, /* actual page size is 16 */
10317 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10318 .tested = TEST_UNTESTED,
10319 .probe = probe_jedec_29gl,
10320 .probe_timing = TIMING_ZERO,
10321 .block_erasers =
10322 {
10323 {
10324 .eraseblocks = {
10325 {64 * 1024, 127},
10326 {8 * 1024, 8},
10327 },
10328 .block_erase = erase_sector_jedec,
10329 }, {
10330 .eraseblocks = { {8 * 1024 * 1024, 1} },
10331 .block_erase = erase_chip_block_jedec,
10332 },
10333 },
10334 .write = write_jedec_1,
10335 .read = read_memmapped,
10336 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010337 .prepare_access = prepare_memory_access,
10338 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010339 },
10340
10341 {
10342 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000010343 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010344 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010345 .manufacture_id = MACRONIX_ID,
10346 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010347 .total_size = 512,
10348 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010349 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10350 .tested = TEST_UNTESTED,
10351 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010352 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010353 .block_erasers =
10354 {
10355 {
Stefan Tauner6697f712014-08-06 15:09:15 +000010356 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000010357 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010358 }, {
10359 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010360 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010361 },
10362 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010363 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010364 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010365 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010366 .prepare_access = prepare_memory_access,
10367 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000010368 },
10369
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010370 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010371 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020010372 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010373 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010374 .manufacture_id = MACRONIX_ID,
10375 .model_id = MACRONIX_MX66L51235F,
10376 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010377 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010378 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010380 .tested = TEST_OK_PREW,
10381 .probe = probe_spi_rdid,
10382 .probe_timing = TIMING_ZERO,
10383 .block_erasers =
10384 {
10385 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010386 .eraseblocks = { {4 * 1024, 16384} },
10387 .block_erase = spi_block_erase_21,
10388 }, {
10389 .eraseblocks = { {4 * 1024, 16384} },
10390 .block_erase = spi_block_erase_20,
10391 }, {
10392 .eraseblocks = { {32 * 1024, 2048} },
10393 .block_erase = spi_block_erase_5c,
10394 }, {
10395 .eraseblocks = { {32 * 1024, 2048} },
10396 .block_erase = spi_block_erase_52,
10397 }, {
10398 .eraseblocks = { {64 * 1024, 1024} },
10399 .block_erase = spi_block_erase_dc,
10400 }, {
10401 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010402 .block_erase = spi_block_erase_d8,
10403 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010404 .eraseblocks = { {64 * 1024 * 1024, 1} },
10405 .block_erase = spi_block_erase_60,
10406 }, {
10407 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010408 .block_erase = spi_block_erase_c7,
10409 }
10410 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010411 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10412 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010413 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010414 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010415 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010416 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010010417 .prepare_access = spi_prepare_4ba,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010418 },
10419
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010420 {
10421 .vendor = "Macronix",
10422 .name = "MX66L1G45G",
10423 .bustype = BUS_SPI,
10424 .manufacture_id = MACRONIX_ID,
10425 .model_id = MACRONIX_MX66L1G45G,
10426 .total_size = 131072,
10427 .page_size = 256,
10428 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10429 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
10430 .tested = TEST_OK_PREW,
10431 .probe = probe_spi_rdid,
10432 .probe_timing = TIMING_ZERO,
10433 .block_erasers =
10434 {
10435 {
10436 .eraseblocks = { {4 * 1024, 32768} },
10437 .block_erase = spi_block_erase_21,
10438 }, {
10439 .eraseblocks = { {4 * 1024, 32768} },
10440 .block_erase = spi_block_erase_20,
10441 }, {
10442 .eraseblocks = { {32 * 1024, 4096} },
10443 .block_erase = spi_block_erase_5c,
10444 }, {
10445 .eraseblocks = { {32 * 1024, 4096} },
10446 .block_erase = spi_block_erase_52,
10447 }, {
10448 .eraseblocks = { {64 * 1024, 2048} },
10449 .block_erase = spi_block_erase_dc,
10450 }, {
10451 .eraseblocks = { {64 * 1024, 2048} },
10452 .block_erase = spi_block_erase_d8,
10453 }, {
10454 .eraseblocks = { {128 * 1024 * 1024, 1} },
10455 .block_erase = spi_block_erase_60,
10456 }, {
10457 .eraseblocks = { {128 * 1024 * 1024, 1} },
10458 .block_erase = spi_block_erase_c7,
10459 }
10460 },
10461 /* TODO: security register and SBLK/SBULK, configuration register */
10462 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10463 .unlock = spi_disable_blockprotect_bp3_srwd,
10464 .write = spi_chip_write_256,
10465 .read = spi_chip_read, /* Fast read (0x0B) supported */
10466 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010010467 .prepare_access = spi_prepare_4ba,
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010468 },
10469
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010470 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10471 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10472 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10473 * only is successful if RDID does not work.
10474 */
10475 {
10476 .vendor = "Micron/Numonyx/ST",
10477 .name = "M25P05",
10478 .bustype = BUS_SPI,
10479 .manufacture_id = 0, /* Not used. */
10480 .model_id = ST_M25P05_RES,
10481 .total_size = 64,
10482 .page_size = 256,
10483 .feature_bits = FEATURE_WRSR_WREN,
10484 .tested = TEST_UNTESTED,
10485 .probe = probe_spi_res1,
10486 .probe_timing = TIMING_ZERO,
10487 .block_erasers =
10488 {
10489 {
10490 .eraseblocks = { {32 * 1024, 2} },
10491 .block_erase = spi_block_erase_d8,
10492 }, {
10493 .eraseblocks = { {64 * 1024, 1} },
10494 .block_erase = spi_block_erase_c7,
10495 }
10496 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010497 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010498 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010499 .write = spi_chip_write_1, /* 128 */
10500 .read = spi_chip_read,
10501 .voltage = {2700, 3600},
10502 },
10503
10504 {
10505 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010506 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010507 .bustype = BUS_SPI,
10508 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010509 .model_id = ST_M25P05A,
10510 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010511 .page_size = 256,
10512 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010513 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010514 .probe = probe_spi_rdid,
10515 .probe_timing = TIMING_ZERO,
10516 .block_erasers =
10517 {
10518 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010519 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010520 .block_erase = spi_block_erase_d8,
10521 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010522 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010523 .block_erase = spi_block_erase_c7,
10524 }
10525 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010526 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010527 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010528 .write = spi_chip_write_256,
10529 .read = spi_chip_read,
10530 .voltage = {2700, 3600},
10531 },
10532
10533 /* The ST M25P10 has the same problem as the M25P05. */
10534 {
10535 .vendor = "Micron/Numonyx/ST",
10536 .name = "M25P10",
10537 .bustype = BUS_SPI,
10538 .manufacture_id = 0, /* Not used. */
10539 .model_id = ST_M25P10_RES,
10540 .total_size = 128,
10541 .page_size = 256,
10542 .feature_bits = FEATURE_WRSR_WREN,
10543 .tested = TEST_UNTESTED,
10544 .probe = probe_spi_res1,
10545 .probe_timing = TIMING_ZERO,
10546 .block_erasers =
10547 {
10548 {
10549 .eraseblocks = { {32 * 1024, 4} },
10550 .block_erase = spi_block_erase_d8,
10551 }, {
10552 .eraseblocks = { {128 * 1024, 1} },
10553 .block_erase = spi_block_erase_c7,
10554 }
10555 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010556 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010557 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010558 .write = spi_chip_write_1, /* 128 */
10559 .read = spi_chip_read,
10560 .voltage = {2700, 3600},
10561 },
10562
10563 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010564 .vendor = "Micron/Numonyx/ST",
10565 .name = "M25P10-A",
10566 .bustype = BUS_SPI,
10567 .manufacture_id = ST_ID,
10568 .model_id = ST_M25P10A,
10569 .total_size = 128,
10570 .page_size = 256,
10571 .feature_bits = FEATURE_WRSR_WREN,
10572 .tested = TEST_OK_PREW,
10573 .probe = probe_spi_rdid,
10574 .probe_timing = TIMING_ZERO,
10575 .block_erasers =
10576 {
10577 {
10578 .eraseblocks = { {32 * 1024, 4} },
10579 .block_erase = spi_block_erase_d8,
10580 }, {
10581 .eraseblocks = { {128 * 1024, 1} },
10582 .block_erase = spi_block_erase_c7,
10583 }
10584 },
10585 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10586 .unlock = spi_disable_blockprotect_bp3_srwd,
10587 .write = spi_chip_write_256,
10588 .read = spi_chip_read,
10589 .voltage = {2700, 3600},
10590 },
10591
10592 {
10593 .vendor = "Micron/Numonyx/ST",
10594 .name = "M25P128",
10595 .bustype = BUS_SPI,
10596 .manufacture_id = ST_ID,
10597 .model_id = ST_M25P128,
10598 .total_size = 16384,
10599 .page_size = 256,
10600 .feature_bits = FEATURE_WRSR_WREN,
10601 .tested = TEST_OK_PREW,
10602 .probe = probe_spi_rdid,
10603 .probe_timing = TIMING_ZERO,
10604 .block_erasers =
10605 {
10606 {
10607 .eraseblocks = { {256 * 1024, 64} },
10608 .block_erase = spi_block_erase_d8,
10609 }, {
10610 .eraseblocks = { {16 * 1024 * 1024, 1} },
10611 .block_erase = spi_block_erase_c7,
10612 }
10613 },
10614 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10615 .unlock = spi_disable_blockprotect_bp3_srwd,
10616 .write = spi_chip_write_256,
10617 .read = spi_chip_read,
10618 .voltage = {2700, 3600},
10619 },
10620
10621 {
10622 .vendor = "Micron/Numonyx/ST",
10623 .name = "M25P16",
10624 .bustype = BUS_SPI,
10625 .manufacture_id = ST_ID,
10626 .model_id = ST_M25P16,
10627 .total_size = 2048,
10628 .page_size = 256,
10629 .feature_bits = FEATURE_WRSR_WREN,
10630 .tested = TEST_OK_PREW,
10631 .probe = probe_spi_rdid,
10632 .probe_timing = TIMING_ZERO,
10633 .block_erasers =
10634 {
10635 {
10636 .eraseblocks = { {64 * 1024, 32} },
10637 .block_erase = spi_block_erase_d8,
10638 }, {
10639 .eraseblocks = { {2 * 1024 * 1024, 1} },
10640 .block_erase = spi_block_erase_c7,
10641 }
10642 },
10643 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10644 .unlock = spi_disable_blockprotect_bp3_srwd,
10645 .write = spi_chip_write_256,
10646 .read = spi_chip_read,
10647 .voltage = {2700, 3600},
10648 },
10649
10650 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010651 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10652 .name = "M25P20",
10653 .bustype = BUS_SPI,
10654 .manufacture_id = ST_ID,
10655 .model_id = ST_M25P20,
10656 .total_size = 256,
10657 .page_size = 256,
10658 .feature_bits = FEATURE_WRSR_WREN,
10659 .tested = TEST_UNTESTED,
10660 .probe = probe_spi_rdid,
10661 .probe_timing = TIMING_ZERO,
10662 .block_erasers =
10663 {
10664 {
10665 .eraseblocks = { {64 * 1024, 4} },
10666 .block_erase = spi_block_erase_d8,
10667 }, {
10668 .eraseblocks = { {256 * 1024, 1} },
10669 .block_erase = spi_block_erase_c7,
10670 }
10671 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010672 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010673 .unlock = spi_disable_blockprotect,
10674 .write = spi_chip_write_256,
10675 .read = spi_chip_read, /* Fast read (0x0B) supported */
10676 .voltage = {2700, 3600},
10677 },
10678
10679 {
10680 .vendor = "Micron/Numonyx/ST",
10681 .name = "M25P20-old",
10682 .bustype = BUS_SPI,
10683 .manufacture_id = 0, /* Not used. */
10684 .model_id = ST_M25P20_RES,
10685 .total_size = 256,
10686 .page_size = 256,
10687 .feature_bits = FEATURE_WRSR_WREN,
10688 .tested = TEST_OK_PREW,
10689 .probe = probe_spi_res1,
10690 .probe_timing = TIMING_ZERO,
10691 .block_erasers =
10692 {
10693 {
10694 .eraseblocks = { {64 * 1024, 4} },
10695 .block_erase = spi_block_erase_d8,
10696 }, {
10697 .eraseblocks = { {256 * 1024, 1} },
10698 .block_erase = spi_block_erase_c7,
10699 }
10700 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010701 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010702 .unlock = spi_disable_blockprotect,
10703 .write = spi_chip_write_256,
10704 .read = spi_chip_read, /* Fast read (0x0B) supported */
10705 .voltage = {2700, 3600},
10706 },
10707
10708 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010709 .vendor = "Micron/Numonyx/ST",
10710 .name = "M25P32",
10711 .bustype = BUS_SPI,
10712 .manufacture_id = ST_ID,
10713 .model_id = ST_M25P32,
10714 .total_size = 4096,
10715 .page_size = 256,
10716 .feature_bits = FEATURE_WRSR_WREN,
10717 .tested = TEST_OK_PREW,
10718 .probe = probe_spi_rdid,
10719 .probe_timing = TIMING_ZERO,
10720 .block_erasers =
10721 {
10722 {
10723 .eraseblocks = { {64 * 1024, 64} },
10724 .block_erase = spi_block_erase_d8,
10725 }, {
10726 .eraseblocks = { {4 * 1024 * 1024, 1} },
10727 .block_erase = spi_block_erase_c7,
10728 }
10729 },
10730 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10731 .unlock = spi_disable_blockprotect_bp3_srwd,
10732 .write = spi_chip_write_256,
10733 .read = spi_chip_read,
10734 .voltage = {2700, 3600},
10735 },
10736
10737 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010738 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10739 .name = "M25P40",
10740 .bustype = BUS_SPI,
10741 .manufacture_id = ST_ID,
10742 .model_id = ST_M25P40,
10743 .total_size = 512,
10744 .page_size = 256,
10745 .feature_bits = FEATURE_WRSR_WREN,
10746 .tested = TEST_OK_PREW,
10747 .probe = probe_spi_rdid,
10748 .probe_timing = TIMING_ZERO,
10749 .block_erasers =
10750 {
10751 {
10752 .eraseblocks = { {64 * 1024, 8} },
10753 .block_erase = spi_block_erase_d8,
10754 }, {
10755 .eraseblocks = { {512 * 1024, 1} },
10756 .block_erase = spi_block_erase_c7,
10757 }
10758 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010759 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010760 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010761 .write = spi_chip_write_256,
10762 .read = spi_chip_read,
10763 .voltage = {2700, 3600},
10764 },
10765
10766 {
10767 .vendor = "Micron/Numonyx/ST",
10768 .name = "M25P40-old",
10769 .bustype = BUS_SPI,
10770 .manufacture_id = 0, /* Not used. */
10771 .model_id = ST_M25P40_RES,
10772 .total_size = 512,
10773 .page_size = 256,
10774 .feature_bits = FEATURE_WRSR_WREN,
10775 .tested = TEST_UNTESTED,
10776 .probe = probe_spi_res1,
10777 .probe_timing = TIMING_ZERO,
10778 .block_erasers =
10779 {
10780 {
10781 .eraseblocks = { {64 * 1024, 8} },
10782 .block_erase = spi_block_erase_d8,
10783 }, {
10784 .eraseblocks = { {512 * 1024, 1} },
10785 .block_erase = spi_block_erase_c7,
10786 }
10787 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010788 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010789 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010790 .write = spi_chip_write_256,
10791 .read = spi_chip_read,
10792 },
10793
10794 {
10795 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010796 .name = "M25P64",
10797 .bustype = BUS_SPI,
10798 .manufacture_id = ST_ID,
10799 .model_id = ST_M25P64,
10800 .total_size = 8192,
10801 .page_size = 256,
10802 .feature_bits = FEATURE_WRSR_WREN,
10803 .tested = TEST_OK_PREW,
10804 .probe = probe_spi_rdid,
10805 .probe_timing = TIMING_ZERO,
10806 .block_erasers =
10807 {
10808 {
10809 .eraseblocks = { {64 * 1024, 128} },
10810 .block_erase = spi_block_erase_d8,
10811 }, {
10812 .eraseblocks = { {8 * 1024 * 1024, 1} },
10813 .block_erase = spi_block_erase_c7,
10814 }
10815 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010816 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010817 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010818 .write = spi_chip_write_256,
10819 .read = spi_chip_read,
10820 .voltage = {2700, 3600},
10821 },
10822
10823 {
10824 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010825 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010826 .bustype = BUS_SPI,
10827 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010828 .model_id = ST_M25P80,
10829 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010830 .page_size = 256,
10831 .feature_bits = FEATURE_WRSR_WREN,
10832 .tested = TEST_OK_PREW,
10833 .probe = probe_spi_rdid,
10834 .probe_timing = TIMING_ZERO,
10835 .block_erasers =
10836 {
10837 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010838 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010839 .block_erase = spi_block_erase_d8,
10840 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010841 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010842 .block_erase = spi_block_erase_c7,
10843 }
10844 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010845 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010846 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010847 .write = spi_chip_write_256,
10848 .read = spi_chip_read,
10849 .voltage = {2700, 3600},
10850 },
10851
10852 {
10853 .vendor = "Micron/Numonyx/ST",
10854 .name = "M25PE10",
10855 .bustype = BUS_SPI,
10856 .manufacture_id = ST_ID,
10857 .model_id = ST_M25PE10,
10858 .total_size = 128,
10859 .page_size = 256,
10860 .feature_bits = FEATURE_WRSR_WREN,
10861 .tested = TEST_UNTESTED,
10862 .probe = probe_spi_rdid,
10863 .probe_timing = TIMING_ZERO,
10864 .block_erasers =
10865 {
10866 {
10867 .eraseblocks = { {4 * 1024, 32} },
10868 .block_erase = spi_block_erase_20,
10869 }, {
10870 .eraseblocks = { {64 * 1024, 2} },
10871 .block_erase = spi_block_erase_d8,
10872 }, {
10873 .eraseblocks = { {128 * 1024, 1} },
10874 .block_erase = spi_block_erase_c7,
10875 }
10876 },
10877 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10878 .unlock = spi_disable_blockprotect,
10879 .write = spi_chip_write_256,
10880 .read = spi_chip_read,
10881 .voltage = {2700, 3600},
10882 },
10883
10884 {
10885 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010886 .name = "M25PE16",
10887 .bustype = BUS_SPI,
10888 .manufacture_id = ST_ID,
10889 .model_id = ST_M25PE16,
10890 .total_size = 2048,
10891 .page_size = 256,
10892 .feature_bits = FEATURE_WRSR_WREN,
10893 .tested = TEST_UNTESTED,
10894 .probe = probe_spi_rdid,
10895 .probe_timing = TIMING_ZERO,
10896 .block_erasers =
10897 {
10898 {
10899 .eraseblocks = { {4 * 1024, 512} },
10900 .block_erase = spi_block_erase_20,
10901 }, {
10902 .eraseblocks = { {64 * 1024, 32} },
10903 .block_erase = spi_block_erase_d8,
10904 }, {
10905 .eraseblocks = { {2 * 1024 * 1024, 1} },
10906 .block_erase = spi_block_erase_c7,
10907 }
10908 },
10909 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10910 .unlock = spi_disable_blockprotect,
10911 .write = spi_chip_write_256,
10912 .read = spi_chip_read,
10913 .voltage = {2700, 3600},
10914 },
10915
10916 {
10917 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010918 .name = "M25PE20",
10919 .bustype = BUS_SPI,
10920 .manufacture_id = ST_ID,
10921 .model_id = ST_M25PE20,
10922 .total_size = 256,
10923 .page_size = 256,
10924 .feature_bits = FEATURE_WRSR_WREN,
10925 .tested = TEST_UNTESTED,
10926 .probe = probe_spi_rdid,
10927 .probe_timing = TIMING_ZERO,
10928 .block_erasers =
10929 {
10930 {
10931 .eraseblocks = { {4 * 1024, 64} },
10932 .block_erase = spi_block_erase_20,
10933 }, {
10934 .eraseblocks = { {64 * 1024, 4} },
10935 .block_erase = spi_block_erase_d8,
10936 }, {
10937 .eraseblocks = { {256 * 1024, 1} },
10938 .block_erase = spi_block_erase_c7,
10939 }
10940 },
10941 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10942 .unlock = spi_disable_blockprotect,
10943 .write = spi_chip_write_256,
10944 .read = spi_chip_read,
10945 .voltage = {2700, 3600},
10946 },
10947
10948 {
10949 .vendor = "Micron/Numonyx/ST",
10950 .name = "M25PE40",
10951 .bustype = BUS_SPI,
10952 .manufacture_id = ST_ID,
10953 .model_id = ST_M25PE40,
10954 .total_size = 512,
10955 .page_size = 256,
10956 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010957 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010958 .probe = probe_spi_rdid,
10959 .probe_timing = TIMING_ZERO,
10960 .block_erasers =
10961 {
10962 {
10963 .eraseblocks = { {4 * 1024, 128} },
10964 .block_erase = spi_block_erase_20,
10965 }, {
10966 .eraseblocks = { {64 * 1024, 8} },
10967 .block_erase = spi_block_erase_d8,
10968 }, {
10969 .eraseblocks = { {512 * 1024, 1} },
10970 .block_erase = spi_block_erase_c7,
10971 }
10972 },
10973 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10974 .unlock = spi_disable_blockprotect,
10975 .write = spi_chip_write_256,
10976 .read = spi_chip_read,
10977 .voltage = {2700, 3600},
10978 },
10979
10980 {
10981 .vendor = "Micron/Numonyx/ST",
10982 .name = "M25PE80",
10983 .bustype = BUS_SPI,
10984 .manufacture_id = ST_ID,
10985 .model_id = ST_M25PE80,
10986 .total_size = 1024,
10987 .page_size = 256,
10988 .feature_bits = FEATURE_WRSR_WREN,
10989 .tested = TEST_OK_PREW,
10990 .probe = probe_spi_rdid,
10991 .probe_timing = TIMING_ZERO,
10992 .block_erasers =
10993 {
10994 {
10995 .eraseblocks = { {4 * 1024, 256} },
10996 .block_erase = spi_block_erase_20,
10997 }, {
10998 .eraseblocks = { {64 * 1024, 16} },
10999 .block_erase = spi_block_erase_d8,
11000 }, {
11001 .eraseblocks = { {1024 * 1024, 1} },
11002 .block_erase = spi_block_erase_c7,
11003 }
11004 },
11005 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11006 .unlock = spi_disable_blockprotect,
11007 .write = spi_chip_write_256,
11008 .read = spi_chip_read,
11009 .voltage = {2700, 3600},
11010 },
11011
11012 {
11013 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011014 .name = "M25PX16",
11015 .bustype = BUS_SPI,
11016 .manufacture_id = ST_ID,
11017 .model_id = ST_M25PX16,
11018 .total_size = 2048,
11019 .page_size = 256,
11020 /* OTP: 64B total; read 0x4B; write 0x42 */
11021 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11022 .tested = TEST_OK_PREW,
11023 .probe = probe_spi_rdid,
11024 .probe_timing = TIMING_ZERO,
11025 .block_erasers =
11026 {
11027 {
11028 .eraseblocks = { { 4 * 1024, 512 } },
11029 .block_erase = spi_block_erase_20,
11030 }, {
11031 .eraseblocks = { {64 * 1024, 32} },
11032 .block_erase = spi_block_erase_d8,
11033 }, {
11034 .eraseblocks = { {2 * 1024 * 1024, 1} },
11035 .block_erase = spi_block_erase_c7,
11036 }
11037 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011038 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011039 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11040 .write = spi_chip_write_256,
11041 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011042 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011043 },
11044
11045 {
11046 .vendor = "Micron/Numonyx/ST",
11047 .name = "M25PX32",
11048 .bustype = BUS_SPI,
11049 .manufacture_id = ST_ID,
11050 .model_id = ST_M25PX32,
11051 .total_size = 4096,
11052 .page_size = 256,
11053 /* OTP: 64B total; read 0x4B; write 0x42 */
11054 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11055 .tested = TEST_OK_PRE,
11056 .probe = probe_spi_rdid,
11057 .probe_timing = TIMING_ZERO,
11058 .block_erasers =
11059 {
11060 {
11061 .eraseblocks = { { 4 * 1024, 1024 } },
11062 .block_erase = spi_block_erase_20,
11063 }, {
11064 .eraseblocks = { {64 * 1024, 64} },
11065 .block_erase = spi_block_erase_d8,
11066 }, {
11067 .eraseblocks = { {4 * 1024 * 1024, 1} },
11068 .block_erase = spi_block_erase_c7,
11069 }
11070 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011071 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011072 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11073 .write = spi_chip_write_256,
11074 .read = spi_chip_read,
11075 .voltage = {2700, 3600},
11076 },
11077
11078 {
11079 .vendor = "Micron/Numonyx/ST",
11080 .name = "M25PX64",
11081 .bustype = BUS_SPI,
11082 .manufacture_id = ST_ID,
11083 .model_id = ST_M25PX64,
11084 .total_size = 8192,
11085 .page_size = 256,
11086 /* OTP: 64B total; read 0x4B; write 0x42 */
11087 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011088 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011089 .probe = probe_spi_rdid,
11090 .probe_timing = TIMING_ZERO,
11091 .block_erasers =
11092 {
11093 {
11094 .eraseblocks = { { 4 * 1024, 2048 } },
11095 .block_erase = spi_block_erase_20,
11096 }, {
11097 .eraseblocks = { {64 * 1024, 128} },
11098 .block_erase = spi_block_erase_d8,
11099 }, {
11100 .eraseblocks = { {8 * 1024 * 1024, 1} },
11101 .block_erase = spi_block_erase_c7,
11102 }
11103 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011104 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011105 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11106 .write = spi_chip_write_256,
11107 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011108 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011109 },
11110
11111 {
11112 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011113 .name = "M25PX80",
11114 .bustype = BUS_SPI,
11115 .manufacture_id = ST_ID,
11116 .model_id = ST_M25PX80,
11117 .total_size = 1024,
11118 .page_size = 256,
11119 /* OTP: 64B total; read 0x4B, write 0x42 */
11120 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11121 .tested = TEST_OK_PREW,
11122 .probe = probe_spi_rdid,
11123 .probe_timing = TIMING_ZERO,
11124 .block_erasers =
11125 {
11126 {
11127 .eraseblocks = { { 4 * 1024, 256 } },
11128 .block_erase = spi_block_erase_20,
11129 }, {
11130 .eraseblocks = { {64 * 1024, 16} },
11131 .block_erase = spi_block_erase_d8,
11132 }, {
11133 .eraseblocks = { {1024 * 1024, 1} },
11134 .block_erase = spi_block_erase_c7,
11135 }
11136 },
11137 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
11138 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11139 .write = spi_chip_write_256,
11140 .read = spi_chip_read,
11141 .voltage = {2700, 3600},
11142 },
11143
11144 {
11145 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011146 .name = "M45PE10",
11147 .bustype = BUS_SPI,
11148 .manufacture_id = ST_ID,
11149 .model_id = ST_M45PE10,
11150 .total_size = 128,
11151 .page_size = 256,
11152 .tested = TEST_UNTESTED,
11153 .probe = probe_spi_rdid,
11154 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011155 .block_erasers =
11156 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011157 {
11158 .eraseblocks = { {256, 512} },
11159 .block_erase = spi_block_erase_db,
11160 }, {
11161 .eraseblocks = { {64 * 1024, 2} },
11162 .block_erase = spi_block_erase_d8,
11163 }
11164 },
11165 .printlock = spi_prettyprint_status_register_default_welwip,
11166 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11167 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11168 .read = spi_chip_read, /* Fast read (0x0B) supported */
11169 .voltage = {2700, 3600},
11170 },
11171
11172 {
11173 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011174 .name = "M45PE16",
11175 .bustype = BUS_SPI,
11176 .manufacture_id = ST_ID,
11177 .model_id = ST_M45PE16,
11178 .total_size = 2048,
11179 .page_size = 256,
11180 .tested = TEST_UNTESTED,
11181 .probe = probe_spi_rdid,
11182 .probe_timing = TIMING_ZERO,
11183 .block_erasers =
11184 {
11185 {
11186 .eraseblocks = { {256, 8192} },
11187 .block_erase = spi_block_erase_db,
11188 }, {
11189 .eraseblocks = { {64 * 1024, 32} },
11190 .block_erase = spi_block_erase_d8,
11191 }
11192 },
11193 .printlock = spi_prettyprint_status_register_default_welwip,
11194 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11195 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11196 .read = spi_chip_read, /* Fast read (0x0B) supported */
11197 .voltage = {2700, 3600},
11198 },
11199
11200 {
11201 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011202 .name = "M45PE20",
11203 .bustype = BUS_SPI,
11204 .manufacture_id = ST_ID,
11205 .model_id = ST_M45PE20,
11206 .total_size = 256,
11207 .page_size = 256,
11208 .tested = TEST_UNTESTED,
11209 .probe = probe_spi_rdid,
11210 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011211 .block_erasers =
11212 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011213 {
11214 .eraseblocks = { {256, 1024} },
11215 .block_erase = spi_block_erase_db,
11216 }, {
11217 .eraseblocks = { {64 * 1024, 4} },
11218 .block_erase = spi_block_erase_d8,
11219 }
11220 },
11221 .printlock = spi_prettyprint_status_register_default_welwip,
11222 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11223 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11224 .read = spi_chip_read, /* Fast read (0x0B) supported */
11225 .voltage = {2700, 3600},
11226 },
11227
11228 {
11229 .vendor = "Micron/Numonyx/ST",
11230 .name = "M45PE40",
11231 .bustype = BUS_SPI,
11232 .manufacture_id = ST_ID,
11233 .model_id = ST_M45PE40,
11234 .total_size = 512,
11235 .page_size = 256,
11236 .tested = TEST_UNTESTED,
11237 .probe = probe_spi_rdid,
11238 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011239 .block_erasers =
11240 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011241 {
11242 .eraseblocks = { {256, 2048} },
11243 .block_erase = spi_block_erase_db,
11244 }, {
11245 .eraseblocks = { {64 * 1024, 8} },
11246 .block_erase = spi_block_erase_d8,
11247 }
11248 },
11249 .printlock = spi_prettyprint_status_register_default_welwip,
11250 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000011251 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011252 .read = spi_chip_read, /* Fast read (0x0B) supported */
11253 .voltage = {2700, 3600},
11254 },
11255
11256 {
11257 .vendor = "Micron/Numonyx/ST",
11258 .name = "M45PE80",
11259 .bustype = BUS_SPI,
11260 .manufacture_id = ST_ID,
11261 .model_id = ST_M45PE80,
11262 .total_size = 1024,
11263 .page_size = 256,
11264 .tested = TEST_UNTESTED,
11265 .probe = probe_spi_rdid,
11266 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011267 .block_erasers =
11268 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011269 {
11270 .eraseblocks = { {256, 4096} },
11271 .block_erase = spi_block_erase_db,
11272 }, {
11273 .eraseblocks = { {64 * 1024, 16} },
11274 .block_erase = spi_block_erase_d8,
11275 }
11276 },
11277 .printlock = spi_prettyprint_status_register_default_welwip,
11278 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11279 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11280 .read = spi_chip_read, /* Fast read (0x0B) supported */
11281 .voltage = {2700, 3600},
11282 },
11283
11284 {
11285 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011286 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
11287 .bustype = BUS_SPI,
11288 .manufacture_id = ST_ID,
11289 .model_id = ST_N25Q00A__1G,
11290 .total_size = 131072,
11291 .page_size = 256,
11292 /* supports SFDP */
11293 /* OTP: 64B total; read 0x4B, write 0x42 */
11294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11295 .tested = TEST_UNTESTED,
11296 .probe = probe_spi_rdid,
11297 .probe_timing = TIMING_ZERO,
11298 .block_erasers =
11299 {
11300 {
11301 .eraseblocks = { {4 * 1024, 32768} },
11302 .block_erase = spi_block_erase_21,
11303 }, {
11304 .eraseblocks = { {4 * 1024, 32768} },
11305 .block_erase = spi_block_erase_20,
11306 }, {
11307 .eraseblocks = { {64 * 1024, 2048} },
11308 .block_erase = spi_block_erase_dc,
11309 }, {
11310 .eraseblocks = { {64 * 1024, 2048} },
11311 .block_erase = spi_block_erase_d8,
11312 }, {
11313 .eraseblocks = { {32768 * 1024, 4} },
11314 .block_erase = spi_block_erase_c4,
11315 }
11316 },
11317 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11318 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11319 .write = spi_chip_write_256, /* Multi I/O supported */
11320 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11321 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010011322 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011323 },
11324
11325 {
11326 .vendor = "Micron/Numonyx/ST",
11327 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11328 .bustype = BUS_SPI,
11329 .manufacture_id = ST_ID,
11330 .model_id = ST_N25Q00A__3G,
11331 .total_size = 131072,
11332 .page_size = 256,
11333 /* supports SFDP */
11334 /* OTP: 64B total; read 0x4B, write 0x42 */
11335 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11336 .tested = TEST_UNTESTED,
11337 .probe = probe_spi_rdid,
11338 .probe_timing = TIMING_ZERO,
11339 .block_erasers =
11340 {
11341 {
11342 .eraseblocks = { {4 * 1024, 32768} },
11343 .block_erase = spi_block_erase_21,
11344 }, {
11345 .eraseblocks = { {4 * 1024, 32768} },
11346 .block_erase = spi_block_erase_20,
11347 }, {
11348 .eraseblocks = { {64 * 1024, 2048} },
11349 .block_erase = spi_block_erase_dc,
11350 }, {
11351 .eraseblocks = { {64 * 1024, 2048} },
11352 .block_erase = spi_block_erase_d8,
11353 }, {
11354 .eraseblocks = { {32768 * 1024, 4} },
11355 .block_erase = spi_block_erase_c4,
11356 }
11357 },
11358 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11359 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11360 .write = spi_chip_write_256, /* Multi I/O supported */
11361 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11362 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011363 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011364 },
11365
11366 {
11367 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011368 .name = "N25Q016",
11369 .bustype = BUS_SPI,
11370 .manufacture_id = ST_ID,
11371 .model_id = ST_N25Q016__1E,
11372 .total_size = 2048,
11373 .page_size = 256,
11374 /* supports SFDP */
11375 /* OTP: 64B total; read 0x4B, write 0x42 */
11376 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11377 .tested = TEST_UNTESTED,
11378 .probe = probe_spi_rdid,
11379 .probe_timing = TIMING_ZERO,
11380 .block_erasers =
11381 {
11382 {
11383 .eraseblocks = { {4 * 1024, 512} },
11384 .block_erase = spi_block_erase_20,
11385 }, {
11386 .eraseblocks = { {32 * 1024, 64} },
11387 .block_erase = spi_block_erase_52,
11388 }, {
11389 .eraseblocks = { {64 * 1024, 32} },
11390 .block_erase = spi_block_erase_d8,
11391 }, {
11392 .eraseblocks = { {2 * 1024 * 1024, 1} },
11393 .block_erase = spi_block_erase_c7,
11394 }
11395 },
11396 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11397 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11398 .write = spi_chip_write_256, /* Multi I/O supported */
11399 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11400 .voltage = {1700, 2000},
11401 },
11402
11403 {
11404 .vendor = "Micron/Numonyx/ST",
11405 .name = "N25Q032..1E",
11406 .bustype = BUS_SPI,
11407 .manufacture_id = ST_ID,
11408 .model_id = ST_N25Q032__1E,
11409 .total_size = 4096,
11410 .page_size = 256,
11411 /* supports SFDP */
11412 /* OTP: 64B total; read 0x4B, write 0x42 */
11413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11414 .tested = TEST_UNTESTED,
11415 .probe = probe_spi_rdid,
11416 .probe_timing = TIMING_ZERO,
11417 .block_erasers =
11418 {
11419 {
11420 .eraseblocks = { {4 * 1024, 1024} },
11421 .block_erase = spi_block_erase_20,
11422 }, {
11423 .eraseblocks = { {64 * 1024, 64} },
11424 .block_erase = spi_block_erase_d8,
11425 }, {
11426 .eraseblocks = { {4 * 1024 * 1024, 1} },
11427 .block_erase = spi_block_erase_c7,
11428 }
11429 },
11430 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11431 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11432 .write = spi_chip_write_256, /* Multi I/O supported */
11433 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11434 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011435 .reg_bits =
11436 {
11437 /*
11438 * There is also a volatile lock register per 64KiB sector, which is not
11439 * mutually exclusive with BP-based protection.
11440 */
11441 .srp = {STATUS1, 7, RW},
11442 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11443 .tb = {STATUS1, 5, RW},
11444 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011445 .wp_write_cfg = spi_wp_write_cfg,
11446 .wp_read_cfg = spi_wp_read_cfg,
11447 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011448 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011449 },
11450
11451 {
11452 .vendor = "Micron/Numonyx/ST",
11453 .name = "N25Q032..3E",
11454 .bustype = BUS_SPI,
11455 .manufacture_id = ST_ID,
11456 .model_id = ST_N25Q032__3E,
11457 .total_size = 4096,
11458 .page_size = 256,
11459 /* supports SFDP */
11460 /* OTP: 64B total; read 0x4B, write 0x42 */
11461 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11462 .tested = TEST_OK_PREW,
11463 .probe = probe_spi_rdid,
11464 .probe_timing = TIMING_ZERO,
11465 .block_erasers =
11466 {
11467 {
11468 .eraseblocks = { {4 * 1024, 1024} },
11469 .block_erase = spi_block_erase_20,
11470 }, {
11471 .eraseblocks = { {64 * 1024, 64} },
11472 .block_erase = spi_block_erase_d8,
11473 }, {
11474 .eraseblocks = { {4 * 1024 * 1024, 1} },
11475 .block_erase = spi_block_erase_c7,
11476 }
11477 },
11478 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11479 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11480 .write = spi_chip_write_256, /* Multi I/O supported */
11481 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11482 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011483 .reg_bits =
11484 {
11485 /*
11486 * There is also a volatile lock register per 64KiB sector, which is not
11487 * mutually exclusive with BP-based protection.
11488 */
11489 .srp = {STATUS1, 7, RW},
11490 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11491 .tb = {STATUS1, 5, RW},
11492 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011493 .wp_write_cfg = spi_wp_write_cfg,
11494 .wp_read_cfg = spi_wp_read_cfg,
11495 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011496 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011497 },
11498
11499 {
11500 .vendor = "Micron/Numonyx/ST",
11501 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11502 .bustype = BUS_SPI,
11503 .manufacture_id = ST_ID,
11504 .model_id = ST_N25Q064__1E,
11505 .total_size = 8192,
11506 .page_size = 256,
11507 /* supports SFDP */
11508 /* OTP: 64B total; read 0x4B, write 0x42 */
11509 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011510 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011511 .probe = probe_spi_rdid,
11512 .probe_timing = TIMING_ZERO,
11513 .block_erasers =
11514 {
11515 {
11516 .eraseblocks = { {4 * 1024, 2048 } },
11517 .block_erase = spi_block_erase_20,
11518 }, {
11519 .eraseblocks = { {64 * 1024, 128} },
11520 .block_erase = spi_block_erase_d8,
11521 }, {
11522 .eraseblocks = { {8 * 1024 * 1024, 1} },
11523 .block_erase = spi_block_erase_c7,
11524 }
11525 },
11526 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11527 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11528 .write = spi_chip_write_256, /* Multi I/O supported */
11529 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11530 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011531 .reg_bits =
11532 {
11533 /*
11534 * There is also a volatile lock register per 64KiB sector, which is not
11535 * mutually exclusive with BP-based protection.
11536 */
11537 .srp = {STATUS1, 7, RW},
11538 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
11539 .tb = {STATUS1, 5, RW},
11540 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011541 .wp_write_cfg = spi_wp_write_cfg,
11542 .wp_read_cfg = spi_wp_read_cfg,
11543 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011544 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011545 },
11546
11547 {
11548 .vendor = "Micron/Numonyx/ST",
11549 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11550 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011551 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011552 .model_id = ST_N25Q064__3E,
11553 .total_size = 8192,
11554 .page_size = 256,
11555 /* supports SFDP */
11556 /* OTP: 64B total; read 0x4B, write 0x42 */
11557 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11558 .tested = TEST_OK_PREW,
11559 .probe = probe_spi_rdid,
11560 .probe_timing = TIMING_ZERO,
11561 .block_erasers =
11562 {
11563 {
11564 .eraseblocks = { {4 * 1024, 2048 } },
11565 .block_erase = spi_block_erase_20,
11566 }, {
11567 .eraseblocks = { {64 * 1024, 128} },
11568 .block_erase = spi_block_erase_d8,
11569 }, {
11570 .eraseblocks = { {8 * 1024 * 1024, 1} },
11571 .block_erase = spi_block_erase_c7,
11572 }
11573 },
11574 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11575 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11576 .write = spi_chip_write_256, /* Multi I/O supported */
11577 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11578 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011579 .reg_bits =
11580 {
11581 /*
11582 * There is also a volatile lock register per 64KiB sector, which is not
11583 * mutually exclusive with BP-based protection.
11584 */
11585 .srp = {STATUS1, 7, RW},
11586 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
11587 .tb = {STATUS1, 5, RW},
11588 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011589 .wp_write_cfg = spi_wp_write_cfg,
11590 .wp_read_cfg = spi_wp_read_cfg,
11591 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011592 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011593 },
11594
11595 {
11596 .vendor = "Micron/Numonyx/ST",
11597 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11598 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011599 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011600 .model_id = ST_N25Q128__1E,
11601 .total_size = 16384,
11602 .page_size = 256,
11603 /* supports SFDP */
11604 /* OTP: 64B total; read 0x4B, write 0x42 */
11605 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011606 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011607 .probe = probe_spi_rdid,
11608 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011609 .block_erasers =
11610 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011611 {
11612 .eraseblocks = { {4 * 1024, 4096 } },
11613 .block_erase = spi_block_erase_20,
11614 }, {
11615 .eraseblocks = { {64 * 1024, 256} },
11616 .block_erase = spi_block_erase_d8,
11617 }, {
11618 .eraseblocks = { {16384 * 1024, 1} },
11619 .block_erase = spi_block_erase_c7,
11620 }
11621 },
11622 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11623 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11624 .write = spi_chip_write_256, /* Multi I/O supported */
11625 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11626 .voltage = {1700, 2000},
11627 },
11628
11629 {
11630 .vendor = "Micron/Numonyx/ST",
11631 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11632 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011633 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011634 .model_id = ST_N25Q128__3E,
11635 .total_size = 16384,
11636 .page_size = 256,
11637 /* supports SFDP */
11638 /* OTP: 64B total; read 0x4B, write 0x42 */
11639 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11640 .tested = TEST_OK_PREW,
11641 .probe = probe_spi_rdid,
11642 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011643 .block_erasers =
11644 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011645 {
11646 .eraseblocks = { {4 * 1024, 4096 } },
11647 .block_erase = spi_block_erase_20,
11648 }, {
11649 .eraseblocks = { {64 * 1024, 256} },
11650 .block_erase = spi_block_erase_d8,
11651 }, {
11652 .eraseblocks = { {16384 * 1024, 1} },
11653 .block_erase = spi_block_erase_c7,
11654 }
11655 },
11656 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11657 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11658 .write = spi_chip_write_256, /* Multi I/O supported */
11659 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11660 .voltage = {2700, 3600},
11661 },
11662
11663 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011664 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011665 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11666 .bustype = BUS_SPI,
11667 .manufacture_id = ST_ID,
11668 .model_id = ST_N25Q256__1E,
11669 .total_size = 32768,
11670 .page_size = 256,
11671 /* supports SFDP */
11672 /* OTP: 64B total; read 0x4B, write 0x42 */
11673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11674 .tested = TEST_UNTESTED,
11675 .probe = probe_spi_rdid,
11676 .probe_timing = TIMING_ZERO,
11677 .block_erasers =
11678 {
11679 {
11680 .eraseblocks = { {4 * 1024, 8192} },
11681 .block_erase = spi_block_erase_21,
11682 }, {
11683 .eraseblocks = { {4 * 1024, 8192} },
11684 .block_erase = spi_block_erase_20,
11685 }, {
11686 .eraseblocks = { {64 * 1024, 512} },
11687 .block_erase = spi_block_erase_dc,
11688 }, {
11689 .eraseblocks = { {64 * 1024, 512} },
11690 .block_erase = spi_block_erase_d8,
11691 }, {
11692 .eraseblocks = { {32768 * 1024, 1} },
11693 .block_erase = spi_block_erase_c7,
11694 }
11695 },
11696 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11697 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11698 .write = spi_chip_write_256, /* Multi I/O supported */
11699 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11700 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010011701 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011702 },
11703
11704 {
11705 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011706 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11707 .bustype = BUS_SPI,
11708 .manufacture_id = ST_ID,
11709 .model_id = ST_N25Q256__3E,
11710 .total_size = 32768,
11711 .page_size = 256,
11712 /* supports SFDP */
11713 /* OTP: 64B total; read 0x4B, write 0x42 */
11714 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11715 .tested = TEST_UNTESTED,
11716 .probe = probe_spi_rdid,
11717 .probe_timing = TIMING_ZERO,
11718 .block_erasers =
11719 {
11720 {
11721 .eraseblocks = { {4 * 1024, 8192} },
11722 .block_erase = spi_block_erase_21,
11723 }, {
11724 .eraseblocks = { {4 * 1024, 8192} },
11725 .block_erase = spi_block_erase_20,
11726 }, {
11727 .eraseblocks = { {64 * 1024, 512} },
11728 .block_erase = spi_block_erase_dc,
11729 }, {
11730 .eraseblocks = { {64 * 1024, 512} },
11731 .block_erase = spi_block_erase_d8,
11732 }, {
11733 .eraseblocks = { {32768 * 1024, 1} },
11734 .block_erase = spi_block_erase_c7,
11735 }
11736 },
11737 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11738 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11739 .write = spi_chip_write_256, /* Multi I/O supported */
11740 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11741 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011742 .prepare_access = spi_prepare_4ba,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011743 },
11744
11745 {
11746 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011747 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011748 .bustype = BUS_SPI,
11749 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011750 .model_id = ST_N25Q512__1G,
11751 .total_size = 65536,
11752 .page_size = 256,
11753 /* supports SFDP */
11754 /* OTP: 64B total; read 0x4B, write 0x42 */
11755 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11756 .tested = TEST_UNTESTED,
11757 .probe = probe_spi_rdid,
11758 .probe_timing = TIMING_ZERO,
11759 .block_erasers =
11760 {
11761 {
11762 .eraseblocks = { {4 * 1024, 16384} },
11763 .block_erase = spi_block_erase_21,
11764 }, {
11765 .eraseblocks = { {4 * 1024, 16384} },
11766 .block_erase = spi_block_erase_20,
11767 }, {
11768 .eraseblocks = { {64 * 1024, 1024} },
11769 .block_erase = spi_block_erase_dc,
11770 }, {
11771 .eraseblocks = { {64 * 1024, 1024} },
11772 .block_erase = spi_block_erase_d8,
11773 }, {
11774 .eraseblocks = { {32768 * 1024, 2} },
11775 .block_erase = spi_block_erase_c4,
11776 }
11777 },
11778 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11779 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11780 .write = spi_chip_write_256, /* Multi I/O supported */
11781 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11782 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010011783 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011784 },
11785
11786 {
11787 .vendor = "Micron/Numonyx/ST",
11788 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11789 .bustype = BUS_SPI,
11790 .manufacture_id = ST_ID,
11791 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011792 .total_size = 65536,
11793 .page_size = 256,
11794 /* supports SFDP */
11795 /* OTP: 64B total; read 0x4B, write 0x42 */
11796 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11797 .tested = TEST_OK_PREW,
11798 .probe = probe_spi_rdid,
11799 .probe_timing = TIMING_ZERO,
11800 .block_erasers =
11801 {
11802 {
11803 .eraseblocks = { {4 * 1024, 16384} },
11804 .block_erase = spi_block_erase_21,
11805 }, {
11806 .eraseblocks = { {4 * 1024, 16384} },
11807 .block_erase = spi_block_erase_20,
11808 }, {
11809 .eraseblocks = { {64 * 1024, 1024} },
11810 .block_erase = spi_block_erase_dc,
11811 }, {
11812 .eraseblocks = { {64 * 1024, 1024} },
11813 .block_erase = spi_block_erase_d8,
11814 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070011815 .eraseblocks = { {32768 * 1024, 2} },
11816 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011817 }
11818 },
11819 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11820 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11821 .write = spi_chip_write_256, /* Multi I/O supported */
11822 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11823 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011824 .prepare_access = spi_prepare_4ba,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011825 },
11826
11827 {
Ed Swierk199ab392017-07-03 13:33:44 -070011828 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011829 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11830 .bustype = BUS_SPI,
11831 .manufacture_id = ST_ID,
11832 .model_id = ST_N25Q00A__3G,
11833 .total_size = 131072,
11834 .page_size = 256,
11835 /* supports SFDP */
11836 /* OTP: 64B total; read 0x4B, write 0x42 */
11837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11838 .tested = TEST_OK_PREW,
11839 .probe = probe_spi_rdid,
11840 .probe_timing = TIMING_ZERO,
11841 .block_erasers =
11842 {
11843 {
11844 .eraseblocks = { {4 * 1024, 32768} },
11845 .block_erase = spi_block_erase_21,
11846 }, {
11847 .eraseblocks = { {4 * 1024, 32768} },
11848 .block_erase = spi_block_erase_20,
11849 }, {
11850 .eraseblocks = { {32 * 1024, 4096} },
11851 .block_erase = spi_block_erase_5c,
11852 }, {
11853 .eraseblocks = { {32 * 1024, 4096} },
11854 .block_erase = spi_block_erase_52,
11855 }, {
11856 .eraseblocks = { {64 * 1024, 2048} },
11857 .block_erase = spi_block_erase_dc,
11858 }, {
11859 .eraseblocks = { {64 * 1024, 2048} },
11860 .block_erase = spi_block_erase_d8,
11861 }, {
11862 .eraseblocks = { {65536 * 1024, 2} },
11863 .block_erase = spi_block_erase_c4,
11864 }
11865 },
11866 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11867 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11868 .write = spi_chip_write_256, /* Multi I/O supported */
11869 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11870 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011871 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011872 },
11873
11874 {
11875 .vendor = "Micron",
11876 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11877 .bustype = BUS_SPI,
11878 .manufacture_id = ST_ID,
11879 .model_id = ST_N25Q00A__1G,
11880 .total_size = 131072,
11881 .page_size = 256,
11882 /* supports SFDP */
11883 /* OTP: 64B total; read 0x4B, write 0x42 */
11884 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11885 .tested = TEST_UNTESTED,
11886 .probe = probe_spi_rdid,
11887 .probe_timing = TIMING_ZERO,
11888 .block_erasers =
11889 {
11890 {
11891 .eraseblocks = { {4 * 1024, 32768} },
11892 .block_erase = spi_block_erase_21,
11893 }, {
11894 .eraseblocks = { {4 * 1024, 32768} },
11895 .block_erase = spi_block_erase_20,
11896 }, {
11897 .eraseblocks = { {32 * 1024, 4096} },
11898 .block_erase = spi_block_erase_5c,
11899 }, {
11900 .eraseblocks = { {32 * 1024, 4096} },
11901 .block_erase = spi_block_erase_52,
11902 }, {
11903 .eraseblocks = { {64 * 1024, 2048} },
11904 .block_erase = spi_block_erase_dc,
11905 }, {
11906 .eraseblocks = { {64 * 1024, 2048} },
11907 .block_erase = spi_block_erase_d8,
11908 }, {
11909 .eraseblocks = { {65536 * 1024, 2} },
11910 .block_erase = spi_block_erase_c4,
11911 }
11912 },
11913 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11914 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11915 .write = spi_chip_write_256, /* Multi I/O supported */
11916 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11917 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010011918 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011919 },
11920
11921 {
11922 .vendor = "Micron",
11923 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11924 .bustype = BUS_SPI,
11925 .manufacture_id = ST_ID,
11926 .model_id = ST_MT25QL02G,
11927 .total_size = 262144,
11928 .page_size = 256,
11929 /* supports SFDP */
11930 /* OTP: 64B total; read 0x4B, write 0x42 */
11931 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11932 .tested = TEST_UNTESTED,
11933 .probe = probe_spi_rdid,
11934 .probe_timing = TIMING_ZERO,
11935 .block_erasers =
11936 {
11937 {
11938 .eraseblocks = { {4 * 1024, 65536} },
11939 .block_erase = spi_block_erase_21,
11940 }, {
11941 .eraseblocks = { {4 * 1024, 65536} },
11942 .block_erase = spi_block_erase_20,
11943 }, {
11944 .eraseblocks = { {32 * 1024, 8192} },
11945 .block_erase = spi_block_erase_5c,
11946 }, {
11947 .eraseblocks = { {32 * 1024, 8192} },
11948 .block_erase = spi_block_erase_52,
11949 }, {
11950 .eraseblocks = { {64 * 1024, 4096} },
11951 .block_erase = spi_block_erase_dc,
11952 }, {
11953 .eraseblocks = { {64 * 1024, 4096} },
11954 .block_erase = spi_block_erase_d8,
11955 }, {
11956 .eraseblocks = { {65536 * 1024, 4} },
11957 .block_erase = spi_block_erase_c4,
11958 }
11959 },
11960 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11961 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11962 .write = spi_chip_write_256, /* Multi I/O supported */
11963 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11964 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011965 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011966 },
11967
11968 {
11969 .vendor = "Micron",
11970 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11971 .bustype = BUS_SPI,
11972 .manufacture_id = ST_ID,
11973 .model_id = ST_MT25QU02G,
11974 .total_size = 262144,
11975 .page_size = 256,
11976 /* supports SFDP */
11977 /* OTP: 64B total; read 0x4B, write 0x42 */
11978 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11979 .tested = TEST_UNTESTED,
11980 .probe = probe_spi_rdid,
11981 .probe_timing = TIMING_ZERO,
11982 .block_erasers =
11983 {
11984 {
11985 .eraseblocks = { {4 * 1024, 65536} },
11986 .block_erase = spi_block_erase_21,
11987 }, {
11988 .eraseblocks = { {4 * 1024, 65536} },
11989 .block_erase = spi_block_erase_20,
11990 }, {
11991 .eraseblocks = { {32 * 1024, 8192} },
11992 .block_erase = spi_block_erase_5c,
11993 }, {
11994 .eraseblocks = { {32 * 1024, 8192} },
11995 .block_erase = spi_block_erase_52,
11996 }, {
11997 .eraseblocks = { {64 * 1024, 4096} },
11998 .block_erase = spi_block_erase_dc,
11999 }, {
12000 .eraseblocks = { {64 * 1024, 4096} },
12001 .block_erase = spi_block_erase_d8,
12002 }, {
12003 .eraseblocks = { {65536 * 1024, 4} },
12004 .block_erase = spi_block_erase_c4,
12005 }
12006 },
12007 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12008 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12009 .write = spi_chip_write_256, /* Multi I/O supported */
12010 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12011 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012012 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012013 },
12014
12015 {
12016 .vendor = "Micron",
12017 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12018 .bustype = BUS_SPI,
12019 .manufacture_id = ST_ID,
12020 .model_id = ST_N25Q128__1E,
12021 .total_size = 16384,
12022 .page_size = 256,
12023 /* supports SFDP */
12024 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huber48dc0902023-03-05 17:20:55 +010012025 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012026 .tested = TEST_UNTESTED,
12027 .probe = probe_spi_rdid,
12028 .probe_timing = TIMING_ZERO,
12029 .block_erasers =
12030 {
12031 {
12032 .eraseblocks = { {4 * 1024, 4096} },
12033 .block_erase = spi_block_erase_20,
12034 }, {
12035 .eraseblocks = { {32 * 1024, 512} },
12036 .block_erase = spi_block_erase_52,
12037 }, {
12038 .eraseblocks = { {64 * 1024, 256} },
12039 .block_erase = spi_block_erase_d8,
12040 }, {
12041 .eraseblocks = { {16384 * 1024, 1} },
12042 .block_erase = spi_block_erase_c7,
12043 }, {
12044 .eraseblocks = { {16384 * 1024, 1} },
12045 .block_erase = spi_block_erase_60,
12046 }
12047 },
12048 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12049 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12050 .write = spi_chip_write_256, /* Multi I/O supported */
12051 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12052 .voltage = {1700, 2000},
12053 },
12054
12055 {
12056 .vendor = "Micron",
12057 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12058 .bustype = BUS_SPI,
12059 .manufacture_id = ST_ID,
12060 .model_id = ST_N25Q128__3E,
12061 .total_size = 16384,
12062 .page_size = 256,
12063 /* supports SFDP */
12064 /* OTP: 64B total; read 0x4B, write 0x42 */
Rick Altherr1e563602022-12-22 10:25:34 -080012065 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12066 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012067 .probe = probe_spi_rdid,
12068 .probe_timing = TIMING_ZERO,
12069 .block_erasers =
12070 {
12071 {
12072 .eraseblocks = { {4 * 1024, 4096} },
12073 .block_erase = spi_block_erase_20,
12074 }, {
12075 .eraseblocks = { {32 * 1024, 512} },
12076 .block_erase = spi_block_erase_52,
12077 }, {
12078 .eraseblocks = { {64 * 1024, 256} },
12079 .block_erase = spi_block_erase_d8,
12080 }, {
12081 .eraseblocks = { {16384 * 1024, 1} },
12082 .block_erase = spi_block_erase_c7,
12083 }, {
12084 .eraseblocks = { {16384 * 1024, 1} },
12085 .block_erase = spi_block_erase_60,
12086 }
12087 },
12088 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12089 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12090 .write = spi_chip_write_256, /* Multi I/O supported */
12091 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12092 .voltage = {2700, 3600},
12093 },
12094
12095 {
12096 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012097 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012098 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012099 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070012100 .model_id = ST_N25Q256__3E,
12101 .total_size = 32768,
12102 .page_size = 256,
12103 /* supports SFDP */
12104 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010012106 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012107 .probe = probe_spi_rdid,
12108 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012109 .block_erasers =
12110 {
Ed Swierk199ab392017-07-03 13:33:44 -070012111 {
12112 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012113 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012114 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012115 .eraseblocks = { {4 * 1024, 8192} },
12116 .block_erase = spi_block_erase_20,
12117 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012118 .eraseblocks = { {32 * 1024, 1024} },
12119 .block_erase = spi_block_erase_5c,
12120 }, {
12121 .eraseblocks = { {32 * 1024, 1024} },
12122 .block_erase = spi_block_erase_52,
12123 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012124 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012125 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012126 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012127 .eraseblocks = { {64 * 1024, 512} },
12128 .block_erase = spi_block_erase_d8,
12129 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012130 .eraseblocks = { {32768 * 1024, 1} },
12131 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012132 }, {
12133 .eraseblocks = { {32768 * 1024, 1} },
12134 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012135 }
12136 },
12137 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12138 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12139 .write = spi_chip_write_256, /* Multi I/O supported */
12140 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12141 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012142 .prepare_access = spi_prepare_4ba,
Ed Swierk199ab392017-07-03 13:33:44 -070012143 },
12144
12145 {
12146 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012147 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12148 .bustype = BUS_SPI,
12149 .manufacture_id = ST_ID,
12150 .model_id = ST_N25Q256__1E,
12151 .total_size = 32768,
12152 .page_size = 256,
12153 /* supports SFDP */
12154 /* OTP: 64B total; read 0x4B, write 0x42 */
12155 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons59052582022-03-08 15:23:58 +010012156 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012157 .probe = probe_spi_rdid,
12158 .probe_timing = TIMING_ZERO,
12159 .block_erasers =
12160 {
12161 {
12162 .eraseblocks = { {4 * 1024, 8192} },
12163 .block_erase = spi_block_erase_21,
12164 }, {
12165 .eraseblocks = { {4 * 1024, 8192} },
12166 .block_erase = spi_block_erase_20,
12167 }, {
12168 .eraseblocks = { {32 * 1024, 1024} },
12169 .block_erase = spi_block_erase_5c,
12170 }, {
12171 .eraseblocks = { {32 * 1024, 1024} },
12172 .block_erase = spi_block_erase_52,
12173 }, {
12174 .eraseblocks = { {64 * 1024, 512} },
12175 .block_erase = spi_block_erase_dc,
12176 }, {
12177 .eraseblocks = { {64 * 1024, 512} },
12178 .block_erase = spi_block_erase_d8,
12179 }, {
12180 .eraseblocks = { {32768 * 1024, 1} },
12181 .block_erase = spi_block_erase_c7,
12182 }, {
12183 .eraseblocks = { {32768 * 1024, 1} },
12184 .block_erase = spi_block_erase_60,
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 = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012192 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012193 },
12194
12195 {
12196 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012197 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012198 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012199 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012200 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070012201 .total_size = 65536,
12202 .page_size = 256,
12203 /* supports SFDP */
12204 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012205 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020012206 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012207 .probe = probe_spi_rdid,
12208 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012209 .block_erasers =
12210 {
Ed Swierk199ab392017-07-03 13:33:44 -070012211 {
12212 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012213 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012214 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012215 .eraseblocks = { {4 * 1024, 16384} },
12216 .block_erase = spi_block_erase_20,
12217 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012218 .eraseblocks = { {32 * 1024, 2048} },
12219 .block_erase = spi_block_erase_5c,
12220 }, {
12221 .eraseblocks = { {32 * 1024, 2048} },
12222 .block_erase = spi_block_erase_52,
12223 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012224 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012225 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012226 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012227 .eraseblocks = { {64 * 1024, 1024} },
12228 .block_erase = spi_block_erase_d8,
12229 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012230 .eraseblocks = { {65536 * 1024, 1} },
12231 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012232 }, {
12233 .eraseblocks = { {65536 * 1024, 1} },
12234 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012235 }
12236 },
12237 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12238 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12239 .write = spi_chip_write_256, /* Multi I/O supported */
12240 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12241 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012242 .reg_bits =
12243 {
12244 .srp = {STATUS1, 7, RW},
12245 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12246 .tb = {STATUS1, 5, RW},
12247 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012248 .wp_write_cfg = spi_wp_write_cfg,
12249 .wp_read_cfg = spi_wp_read_cfg,
12250 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012251 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010012252 .prepare_access = spi_prepare_4ba,
Ed Swierk199ab392017-07-03 13:33:44 -070012253 },
12254
12255 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012256 .vendor = "Micron",
12257 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12258 .bustype = BUS_SPI,
12259 .manufacture_id = ST_ID,
12260 .model_id = ST_N25Q512__1G,
12261 .total_size = 65536,
12262 .page_size = 256,
12263 /* supports SFDP */
12264 /* OTP: 64B total; read 0x4B, write 0x42 */
12265 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12266 .tested = TEST_OK_PREW,
12267 .probe = probe_spi_rdid,
12268 .probe_timing = TIMING_ZERO,
12269 .block_erasers =
12270 {
12271 {
12272 .eraseblocks = { {4 * 1024, 16384} },
12273 .block_erase = spi_block_erase_21,
12274 }, {
12275 .eraseblocks = { {4 * 1024, 16384} },
12276 .block_erase = spi_block_erase_20,
12277 }, {
12278 .eraseblocks = { {32 * 1024, 2048} },
12279 .block_erase = spi_block_erase_5c,
12280 }, {
12281 .eraseblocks = { {32 * 1024, 2048} },
12282 .block_erase = spi_block_erase_52,
12283 }, {
12284 .eraseblocks = { {64 * 1024, 1024} },
12285 .block_erase = spi_block_erase_dc,
12286 }, {
12287 .eraseblocks = { {64 * 1024, 1024} },
12288 .block_erase = spi_block_erase_d8,
12289 }, {
12290 .eraseblocks = { {65536 * 1024, 1} },
12291 .block_erase = spi_block_erase_c7,
12292 }, {
12293 .eraseblocks = { {65536 * 1024, 1} },
12294 .block_erase = spi_block_erase_60,
12295 }
12296 },
12297 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12298 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12299 .write = spi_chip_write_256, /* Multi I/O supported */
12300 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12301 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012302 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012303 },
12304
12305 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012306 .vendor = "MoselVitelic",
12307 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012308 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012309 .manufacture_id = SYNCMOS_MVC_ID,
12310 .model_id = MVC_V29C51000B,
12311 .total_size = 64,
12312 .page_size = 512,
12313 .feature_bits = FEATURE_EITHER_RESET,
12314 .tested = TEST_UNTESTED,
12315 .probe = probe_jedec,
12316 .probe_timing = TIMING_ZERO,
12317 .block_erasers =
12318 {
12319 {
12320 .eraseblocks = { {512, 128} },
12321 .block_erase = erase_sector_jedec,
12322 }, {
12323 .eraseblocks = { {64 * 1024, 1} },
12324 .block_erase = erase_chip_block_jedec,
12325 },
12326 },
12327 .write = write_jedec_1,
12328 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012329 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012330 .prepare_access = prepare_memory_access,
12331 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012332 },
12333
12334 {
12335 .vendor = "MoselVitelic",
12336 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012337 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012338 .manufacture_id = SYNCMOS_MVC_ID,
12339 .model_id = MVC_V29C51000T,
12340 .total_size = 64,
12341 .page_size = 512,
12342 .feature_bits = FEATURE_EITHER_RESET,
12343 .tested = TEST_UNTESTED,
12344 .probe = probe_jedec,
12345 .probe_timing = TIMING_ZERO,
12346 .block_erasers =
12347 {
12348 {
12349 .eraseblocks = { {512, 128} },
12350 .block_erase = erase_sector_jedec,
12351 }, {
12352 .eraseblocks = { {64 * 1024, 1} },
12353 .block_erase = erase_chip_block_jedec,
12354 },
12355 },
12356 .write = write_jedec_1,
12357 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012358 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012359 .prepare_access = prepare_memory_access,
12360 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012361 },
12362
12363 {
12364 .vendor = "MoselVitelic",
12365 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012366 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012367 .manufacture_id = SYNCMOS_MVC_ID,
12368 .model_id = MVC_V29C51400B,
12369 .total_size = 512,
12370 .page_size = 1024,
12371 .feature_bits = FEATURE_EITHER_RESET,
12372 .tested = TEST_UNTESTED,
12373 .probe = probe_jedec,
12374 .probe_timing = TIMING_ZERO,
12375 .block_erasers =
12376 {
12377 {
12378 .eraseblocks = { {1024, 512} },
12379 .block_erase = erase_sector_jedec,
12380 }, {
12381 .eraseblocks = { {512 * 1024, 1} },
12382 .block_erase = erase_chip_block_jedec,
12383 },
12384 },
12385 .write = write_jedec_1,
12386 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012387 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012388 .prepare_access = prepare_memory_access,
12389 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012390 },
12391
12392 {
12393 .vendor = "MoselVitelic",
12394 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012395 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012396 .manufacture_id = SYNCMOS_MVC_ID,
12397 .model_id = MVC_V29C51400T,
12398 .total_size = 512,
12399 .page_size = 1024,
12400 .feature_bits = FEATURE_EITHER_RESET,
12401 .tested = TEST_UNTESTED,
12402 .probe = probe_jedec,
12403 .probe_timing = TIMING_ZERO,
12404 .block_erasers =
12405 {
12406 {
12407 .eraseblocks = { {1024, 512} },
12408 .block_erase = erase_sector_jedec,
12409 }, {
12410 .eraseblocks = { {512 * 1024, 1} },
12411 .block_erase = erase_chip_block_jedec,
12412 },
12413 },
12414 .write = write_jedec_1,
12415 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012416 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012417 .prepare_access = prepare_memory_access,
12418 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012419 },
12420
12421 {
12422 .vendor = "MoselVitelic",
12423 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012424 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012425 .manufacture_id = SYNCMOS_MVC_ID,
12426 .model_id = MVC_V29LC51000,
12427 .total_size = 64,
12428 .page_size = 512,
12429 .feature_bits = FEATURE_EITHER_RESET,
12430 .tested = TEST_UNTESTED,
12431 .probe = probe_jedec,
12432 .probe_timing = TIMING_ZERO,
12433 .block_erasers =
12434 {
12435 {
12436 .eraseblocks = { {512, 128} },
12437 .block_erase = erase_sector_jedec,
12438 }, {
12439 .eraseblocks = { {64 * 1024, 1} },
12440 .block_erase = erase_chip_block_jedec,
12441 },
12442 },
12443 .write = write_jedec_1,
12444 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012445 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012446 .prepare_access = prepare_memory_access,
12447 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012448 },
12449
12450 {
12451 .vendor = "MoselVitelic",
12452 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012453 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012454 .manufacture_id = SYNCMOS_MVC_ID,
12455 .model_id = MVC_V29LC51001,
12456 .total_size = 128,
12457 .page_size = 512,
12458 .feature_bits = FEATURE_EITHER_RESET,
12459 .tested = TEST_UNTESTED,
12460 .probe = probe_jedec,
12461 .probe_timing = TIMING_ZERO,
12462 .block_erasers =
12463 {
12464 {
12465 .eraseblocks = { {512, 256} },
12466 .block_erase = erase_sector_jedec,
12467 }, {
12468 .eraseblocks = { {128 * 1024, 1} },
12469 .block_erase = erase_chip_block_jedec,
12470 },
12471 },
12472 .write = write_jedec_1,
12473 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012474 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012475 .prepare_access = prepare_memory_access,
12476 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012477 },
12478
12479 {
12480 .vendor = "MoselVitelic",
12481 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012482 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012483 .manufacture_id = SYNCMOS_MVC_ID,
12484 .model_id = MVC_V29LC51002,
12485 .total_size = 256,
12486 .page_size = 512,
12487 .feature_bits = FEATURE_EITHER_RESET,
12488 .tested = TEST_UNTESTED,
12489 .probe = probe_jedec,
12490 .probe_timing = TIMING_ZERO,
12491 .block_erasers =
12492 {
12493 {
12494 .eraseblocks = { {512, 512} },
12495 .block_erase = erase_sector_jedec,
12496 }, {
12497 .eraseblocks = { {256 * 1024, 1} },
12498 .block_erase = erase_chip_block_jedec,
12499 },
12500 },
12501 .write = write_jedec_1,
12502 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012503 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012504 .prepare_access = prepare_memory_access,
12505 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012506 },
12507
12508 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012509 .vendor = "Nantronics",
12510 .name = "N25S10",
12511 .bustype = BUS_SPI,
12512 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12513 .model_id = NANTRONICS_N25S10,
12514 .total_size = 128,
12515 .page_size = 256,
12516 .feature_bits = FEATURE_WRSR_WREN,
12517 .tested = TEST_UNTESTED,
12518 .probe = probe_spi_rdid,
12519 .probe_timing = TIMING_ZERO,
12520 .block_erasers =
12521 {
12522 {
12523 .eraseblocks = { {4 * 1024, 32} },
12524 .block_erase = spi_block_erase_20,
12525 }, {
12526 .eraseblocks = { {4 * 1024, 32} },
12527 .block_erase = spi_block_erase_d7,
12528 }, {
12529 .eraseblocks = { {32 * 1024, 4} },
12530 .block_erase = spi_block_erase_52,
12531 }, {
12532 .eraseblocks = { {64 * 1024, 2} },
12533 .block_erase = spi_block_erase_d8,
12534 }, {
12535 .eraseblocks = { {128 * 1024, 1} },
12536 .block_erase = spi_block_erase_60,
12537 }, {
12538 .eraseblocks = { {128 * 1024, 1} },
12539 .block_erase = spi_block_erase_c7,
12540 }
12541 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012542 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012543 .unlock = spi_disable_blockprotect_bp3_srwd,
12544 .write = spi_chip_write_256,
12545 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12546 .voltage = {2700, 3600},
12547 },
12548
12549 {
12550 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012551 .name = "N25S16",
12552 .bustype = BUS_SPI,
12553 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12554 .model_id = NANTRONICS_N25S16,
12555 .total_size = 2048,
12556 .page_size = 256,
12557 .feature_bits = FEATURE_WRSR_WREN,
12558 .tested = TEST_UNTESTED,
12559 .probe = probe_spi_rdid,
12560 .probe_timing = TIMING_ZERO,
12561 .block_erasers =
12562 {
12563 {
12564 .eraseblocks = { {4 * 1024, 512} },
12565 .block_erase = spi_block_erase_20,
12566 }, {
12567 .eraseblocks = { {64 * 1024, 32} },
12568 .block_erase = spi_block_erase_d8,
12569 }, {
12570 .eraseblocks = { {2048 * 1024, 1} },
12571 .block_erase = spi_block_erase_60,
12572 }, {
12573 .eraseblocks = { {2048 * 1024, 1} },
12574 .block_erase = spi_block_erase_c7,
12575 }
12576 },
12577 .printlock = spi_prettyprint_status_register_bp3_srwd,
12578 .unlock = spi_disable_blockprotect_bp3_srwd,
12579 .write = spi_chip_write_256,
12580 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12581 .voltage = {2700, 3600},
12582 },
12583
12584 {
12585 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012586 .name = "N25S20",
12587 .bustype = BUS_SPI,
12588 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12589 .model_id = NANTRONICS_N25S20,
12590 .total_size = 256,
12591 .page_size = 256,
12592 .feature_bits = FEATURE_WRSR_WREN,
12593 .tested = TEST_UNTESTED,
12594 .probe = probe_spi_rdid,
12595 .probe_timing = TIMING_ZERO,
12596 .block_erasers =
12597 {
12598 {
12599 .eraseblocks = { {4 * 1024, 64} },
12600 .block_erase = spi_block_erase_20,
12601 }, {
12602 .eraseblocks = { {4 * 1024, 64} },
12603 .block_erase = spi_block_erase_d7,
12604 }, {
12605 .eraseblocks = { {32 * 1024, 8} },
12606 .block_erase = spi_block_erase_52,
12607 }, {
12608 .eraseblocks = { {64 * 1024, 4} },
12609 .block_erase = spi_block_erase_d8,
12610 }, {
12611 .eraseblocks = { {256 * 1024, 1} },
12612 .block_erase = spi_block_erase_60,
12613 }, {
12614 .eraseblocks = { {256 * 1024, 1} },
12615 .block_erase = spi_block_erase_c7,
12616 }
12617 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012618 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012619 .unlock = spi_disable_blockprotect_bp3_srwd,
12620 .write = spi_chip_write_256,
12621 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12622 .voltage = {2700, 3600},
12623 },
12624
12625 {
12626 .vendor = "Nantronics",
12627 .name = "N25S40",
12628 .bustype = BUS_SPI,
12629 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12630 .model_id = NANTRONICS_N25S40,
12631 .total_size = 512,
12632 .page_size = 256,
12633 .feature_bits = FEATURE_WRSR_WREN,
12634 .tested = TEST_UNTESTED,
12635 .probe = probe_spi_rdid,
12636 .probe_timing = TIMING_ZERO,
12637 .block_erasers =
12638 {
12639 {
12640 .eraseblocks = { {4 * 1024, 128} },
12641 .block_erase = spi_block_erase_20,
12642 }, {
12643 .eraseblocks = { {4 * 1024, 128} },
12644 .block_erase = spi_block_erase_d7,
12645 }, {
12646 .eraseblocks = { {32 * 1024, 16} },
12647 .block_erase = spi_block_erase_52,
12648 }, {
12649 .eraseblocks = { {64 * 1024, 8} },
12650 .block_erase = spi_block_erase_d8,
12651 }, {
12652 .eraseblocks = { {512 * 1024, 1} },
12653 .block_erase = spi_block_erase_60,
12654 }, {
12655 .eraseblocks = { {512 * 1024, 1} },
12656 .block_erase = spi_block_erase_c7,
12657 }
12658 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012659 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012660 .unlock = spi_disable_blockprotect_bp3_srwd,
12661 .write = spi_chip_write_256,
12662 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12663 .voltage = {2700, 3600},
12664 },
12665
12666 {
12667 .vendor = "Nantronics",
12668 .name = "N25S80",
12669 .bustype = BUS_SPI,
12670 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12671 .model_id = NANTRONICS_N25S80,
12672 .total_size = 1024,
12673 .page_size = 256,
12674 .feature_bits = FEATURE_WRSR_WREN,
12675 .tested = TEST_UNTESTED,
12676 .probe = probe_spi_rdid,
12677 .probe_timing = TIMING_ZERO,
12678 .block_erasers =
12679 {
12680 {
12681 .eraseblocks = { {4 * 1024, 256} },
12682 .block_erase = spi_block_erase_20,
12683 }, {
12684 .eraseblocks = { {32 * 1024, 32} },
12685 .block_erase = spi_block_erase_52,
12686 }, {
12687 .eraseblocks = { {64 * 1024, 16} },
12688 .block_erase = spi_block_erase_d8,
12689 }, {
12690 .eraseblocks = { {1024 * 1024, 1} },
12691 .block_erase = spi_block_erase_60,
12692 }, {
12693 .eraseblocks = { {1024 * 1024, 1} },
12694 .block_erase = spi_block_erase_c7,
12695 }
12696 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012697 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012698 .unlock = spi_disable_blockprotect_bp3_srwd,
12699 .write = spi_chip_write_256,
12700 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12701 .voltage = {2700, 3600},
12702 },
12703
12704 {
Stefan Taunerf4451612013-04-19 01:59:15 +000012705 .vendor = "PMC",
12706 .name = "Pm25LD010(C)",
12707 .bustype = BUS_SPI,
12708 .manufacture_id = PMC_ID,
12709 .model_id = PMC_PM25LD010,
12710 .total_size = 128,
12711 .page_size = 256,
12712 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012713 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012714 .probe = probe_spi_rdid,
12715 .probe_timing = TIMING_ZERO,
12716 .block_erasers =
12717 {
12718 {
12719 .eraseblocks = { {4 * 1024, 32} },
12720 .block_erase = spi_block_erase_20,
12721 }, {
12722 .eraseblocks = { {4 * 1024, 32} },
12723 .block_erase = spi_block_erase_d7,
12724 }, {
12725 .eraseblocks = { {32 * 1024, 4} },
12726 .block_erase = spi_block_erase_d8,
12727 }, {
12728 .eraseblocks = { {128 * 1024, 1} },
12729 .block_erase = spi_block_erase_60,
12730 }, {
12731 .eraseblocks = { {128 * 1024, 1} },
12732 .block_erase = spi_block_erase_c7,
12733 }
12734 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012735 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012736 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12737 .write = spi_chip_write_256,
12738 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12739 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
12740 },
12741
12742 {
12743 .vendor = "PMC",
12744 .name = "Pm25LD020(C)",
12745 .bustype = BUS_SPI,
12746 .manufacture_id = PMC_ID,
12747 .model_id = PMC_PM25LD020,
12748 .total_size = 256,
12749 .page_size = 256,
12750 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020012751 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012752 .probe = probe_spi_rdid,
12753 .probe_timing = TIMING_ZERO,
12754 .block_erasers =
12755 {
12756 {
12757 .eraseblocks = { {4 * 1024, 64} },
12758 .block_erase = spi_block_erase_20,
12759 }, {
12760 .eraseblocks = { {4 * 1024, 64} },
12761 .block_erase = spi_block_erase_d7,
12762 }, {
12763 .eraseblocks = { {64 * 1024, 4} },
12764 .block_erase = spi_block_erase_d8,
12765 }, {
12766 .eraseblocks = { {256 * 1024, 1} },
12767 .block_erase = spi_block_erase_60,
12768 }, {
12769 .eraseblocks = { {256 * 1024, 1} },
12770 .block_erase = spi_block_erase_c7,
12771 }
12772 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012773 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012774 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12775 .write = spi_chip_write_256,
12776 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12777 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
12778 },
12779
12780 {
12781 .vendor = "PMC",
12782 .name = "Pm25LD040(C)",
12783 .bustype = BUS_SPI,
12784 .manufacture_id = PMC_ID,
12785 .model_id = PMC_PM25LV040,
12786 .total_size = 512,
12787 .page_size = 256,
12788 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020012789 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012790 .probe = probe_spi_rdid,
12791 .probe_timing = TIMING_ZERO,
12792 .block_erasers =
12793 {
12794 {
12795 .eraseblocks = { {4 * 1024, 128} },
12796 .block_erase = spi_block_erase_20,
12797 }, {
12798 .eraseblocks = { {4 * 1024, 128} },
12799 .block_erase = spi_block_erase_d7,
12800 }, {
12801 .eraseblocks = { {64 * 1024, 8} },
12802 .block_erase = spi_block_erase_d8,
12803 }, {
12804 .eraseblocks = { {512 * 1024, 1} },
12805 .block_erase = spi_block_erase_60,
12806 }, {
12807 .eraseblocks = { {512 * 1024, 1} },
12808 .block_erase = spi_block_erase_c7,
12809 }
12810 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012811 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012812 .unlock = spi_disable_blockprotect,
12813 .write = spi_chip_write_256,
12814 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12815 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
12816 },
12817
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012818 {
12819 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012820 .name = "Pm25LD256C",
12821 .bustype = BUS_SPI,
12822 .manufacture_id = PMC_ID,
12823 .model_id = PMC_PM25LD256C,
12824 .total_size = 32,
12825 .page_size = 256,
12826 .feature_bits = FEATURE_WRSR_WREN,
12827 .tested = TEST_UNTESTED,
12828 .probe = probe_spi_rdid,
12829 .probe_timing = TIMING_ZERO,
12830 .block_erasers =
12831 {
12832 {
12833 .eraseblocks = { {4 * 1024, 8} },
12834 .block_erase = spi_block_erase_20,
12835 }, {
12836 .eraseblocks = { {4 * 1024, 8} },
12837 .block_erase = spi_block_erase_d7,
12838 }, {
12839 .eraseblocks = { {32 * 1024, 1} },
12840 .block_erase = spi_block_erase_d8,
12841 }, {
12842 .eraseblocks = { {32 * 1024, 1} },
12843 .block_erase = spi_block_erase_60,
12844 }, {
12845 .eraseblocks = { {32 * 1024, 1} },
12846 .block_erase = spi_block_erase_c7,
12847 }
12848 },
12849 .printlock = spi_prettyprint_status_register_bp2_srwd,
12850 .unlock = spi_disable_blockprotect,
12851 .write = spi_chip_write_256,
12852 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12853 .voltage = {2700, 3600},
12854 },
12855
12856 {
12857 .vendor = "PMC",
12858 .name = "Pm25LD512(C)",
12859 .bustype = BUS_SPI,
12860 .manufacture_id = PMC_ID,
12861 .model_id = PMC_PM25LD512,
12862 .total_size = 64,
12863 .page_size = 256,
12864 .feature_bits = FEATURE_WRSR_WREN,
12865 .tested = TEST_OK_PREW,
12866 .probe = probe_spi_rdid,
12867 .probe_timing = TIMING_ZERO,
12868 .block_erasers =
12869 {
12870 {
12871 .eraseblocks = { {4 * 1024, 16} },
12872 .block_erase = spi_block_erase_20,
12873 }, {
12874 .eraseblocks = { {4 * 1024, 16} },
12875 .block_erase = spi_block_erase_d7,
12876 }, {
12877 .eraseblocks = { {32 * 1024, 2} },
12878 .block_erase = spi_block_erase_d8,
12879 }, {
12880 .eraseblocks = { {64 * 1024, 1} },
12881 .block_erase = spi_block_erase_60,
12882 }, {
12883 .eraseblocks = { {64 * 1024, 1} },
12884 .block_erase = spi_block_erase_c7,
12885 }
12886 },
12887 .printlock = spi_prettyprint_status_register_bp2_srwd,
12888 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12889 .write = spi_chip_write_256,
12890 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12891 .voltage = {2300, 3600},
12892 },
12893
12894 {
12895 .vendor = "PMC",
12896 .name = "Pm25LQ016",
12897 .bustype = BUS_SPI,
12898 .manufacture_id = PMC_ID,
12899 .model_id = PMC_PM25LQ016,
12900 .total_size = 2048,
12901 .page_size = 256,
12902 /* OTP: 256B total; read 0x4B, write 0xB1 */
12903 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12904 .tested = TEST_UNTESTED,
12905 .probe = probe_spi_rdid,
12906 .probe_timing = TIMING_ZERO,
12907 .block_erasers =
12908 {
12909 {
12910 .eraseblocks = { {4 * 1024, 512} },
12911 .block_erase = spi_block_erase_20,
12912 }, {
12913 .eraseblocks = { {4 * 1024, 512} },
12914 .block_erase = spi_block_erase_d7,
12915 }, {
12916 .eraseblocks = { {64 * 1024, 32} },
12917 .block_erase = spi_block_erase_d8,
12918 }, {
12919 .eraseblocks = { {2048 * 1024, 1} },
12920 .block_erase = spi_block_erase_60,
12921 }, {
12922 .eraseblocks = { {2048 * 1024, 1} },
12923 .block_erase = spi_block_erase_c7,
12924 }
12925 },
12926 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12927 .unlock = spi_disable_blockprotect_bp3_srwd,
12928 .write = spi_chip_write_256,
12929 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12930 .voltage = {2300, 3600},
12931 },
12932
12933 {
12934 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012935 .name = "Pm25LQ020",
12936 .bustype = BUS_SPI,
12937 .manufacture_id = PMC_ID,
12938 .model_id = PMC_PM25LQ020,
12939 .total_size = 256,
12940 .page_size = 256,
12941 /* OTP: 256B total; read 0x4B, write 0xB1 */
12942 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12943 .tested = TEST_UNTESTED,
12944 .probe = probe_spi_rdid,
12945 .probe_timing = TIMING_ZERO,
12946 .block_erasers =
12947 {
12948 {
12949 .eraseblocks = { {4 * 1024, 64} },
12950 .block_erase = spi_block_erase_20,
12951 }, {
12952 .eraseblocks = { {4 * 1024, 64} },
12953 .block_erase = spi_block_erase_d7,
12954 }, {
12955 .eraseblocks = { {64 * 1024, 4} },
12956 .block_erase = spi_block_erase_d8,
12957 }, {
12958 .eraseblocks = { {256 * 1024, 1} },
12959 .block_erase = spi_block_erase_60,
12960 }, {
12961 .eraseblocks = { {256 * 1024, 1} },
12962 .block_erase = spi_block_erase_c7,
12963 }
12964 },
12965 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12966 .unlock = spi_disable_blockprotect_bp3_srwd,
12967 .write = spi_chip_write_256,
12968 .read = spi_chip_read,
12969 .voltage = {2300, 3600},
12970 },
12971
12972 {
12973 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012974 .name = "Pm25LQ032C",
12975 .bustype = BUS_SPI,
12976 .manufacture_id = PMC_ID,
12977 .model_id = PMC_PM25LQ032C,
12978 .total_size = 4096,
12979 .page_size = 256,
12980 /* OTP: 64B total; read 0x4B, write 0xB1 */
12981 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12982 .tested = TEST_OK_PREW,
12983 .probe = probe_spi_rdid,
12984 .probe_timing = TIMING_ZERO,
12985 .block_erasers =
12986 {
12987 {
12988 .eraseblocks = { {4 * 1024, 1024} },
12989 .block_erase = spi_block_erase_20,
12990 }, {
12991 .eraseblocks = { {4 * 1024, 1024} },
12992 .block_erase = spi_block_erase_d7,
12993 }, {
12994 .eraseblocks = { {64 * 1024, 64} },
12995 .block_erase = spi_block_erase_d8,
12996 }, {
12997 .eraseblocks = { {4096 * 1024, 1} },
12998 .block_erase = spi_block_erase_60,
12999 }, {
13000 .eraseblocks = { {4096 * 1024, 1} },
13001 .block_erase = spi_block_erase_c7,
13002 }
13003 },
13004 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13005 .unlock = spi_disable_blockprotect_bp3_srwd,
13006 .write = spi_chip_write_256,
13007 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13008 .voltage = {2700, 3600},
13009 },
13010
13011 {
13012 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013013 .name = "Pm25LQ040",
13014 .bustype = BUS_SPI,
13015 .manufacture_id = PMC_ID,
13016 .model_id = PMC_PM25LQ040,
13017 .total_size = 512,
13018 .page_size = 256,
13019 /* OTP: 256B total; read 0x4B, write 0xB1 */
13020 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13021 .tested = TEST_UNTESTED,
13022 .probe = probe_spi_rdid,
13023 .probe_timing = TIMING_ZERO,
13024 .block_erasers =
13025 {
13026 {
13027 .eraseblocks = { {4 * 1024, 128} },
13028 .block_erase = spi_block_erase_20,
13029 }, {
13030 .eraseblocks = { {4 * 1024, 128} },
13031 .block_erase = spi_block_erase_d7,
13032 }, {
13033 .eraseblocks = { {64 * 1024, 8} },
13034 .block_erase = spi_block_erase_d8,
13035 }, {
13036 .eraseblocks = { {512 * 1024, 1} },
13037 .block_erase = spi_block_erase_60,
13038 }, {
13039 .eraseblocks = { {512 * 1024, 1} },
13040 .block_erase = spi_block_erase_c7,
13041 }
13042 },
13043 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13044 .unlock = spi_disable_blockprotect_bp3_srwd,
13045 .write = spi_chip_write_256,
13046 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13047 .voltage = {2300, 3600},
13048 },
13049
13050 {
13051 .vendor = "PMC",
13052 .name = "Pm25LQ080",
13053 .bustype = BUS_SPI,
13054 .manufacture_id = PMC_ID,
13055 .model_id = PMC_PM25LQ080,
13056 .total_size = 1024,
13057 .page_size = 256,
13058 /* OTP: 64B total; read 0x4B, write 0xB1 */
13059 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13060 .tested = TEST_UNTESTED,
13061 .probe = probe_spi_rdid,
13062 .probe_timing = TIMING_ZERO,
13063 .block_erasers =
13064 {
13065 {
13066 .eraseblocks = { {4 * 1024, 256} },
13067 .block_erase = spi_block_erase_20,
13068 }, {
13069 .eraseblocks = { {4 * 1024, 256} },
13070 .block_erase = spi_block_erase_d7,
13071 }, {
13072 .eraseblocks = { {64 * 1024, 16} },
13073 .block_erase = spi_block_erase_d8,
13074 }, {
13075 .eraseblocks = { {1024 * 1024, 1} },
13076 .block_erase = spi_block_erase_60,
13077 }, {
13078 .eraseblocks = { {1024 * 1024, 1} },
13079 .block_erase = spi_block_erase_c7,
13080 }
13081 },
13082 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13083 .unlock = spi_disable_blockprotect_bp3_srwd,
13084 .write = spi_chip_write_256,
13085 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13086 .voltage = {2300, 3600},
13087 },
13088
13089 {
13090 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013091 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013092 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000013093 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013094 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013095 .total_size = 128,
13096 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013097 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000013098 .tested = TEST_OK_PREW,
13099 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013100 .probe_timing = TIMING_ZERO,
13101 .block_erasers =
13102 {
13103 {
13104 .eraseblocks = { {4 * 1024, 32} },
13105 .block_erase = spi_block_erase_d7,
13106 }, {
13107 .eraseblocks = { {32 * 1024, 4} },
13108 .block_erase = spi_block_erase_d8,
13109 }, {
13110 .eraseblocks = { {128 * 1024, 1} },
13111 .block_erase = spi_block_erase_c7,
13112 }
13113 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013114 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013115 .unlock = spi_disable_blockprotect,
13116 .write = spi_chip_write_256,
13117 .read = spi_chip_read, /* Fast read (0x0B) supported */
13118 .voltage = {2700, 3600},
13119 },
13120
13121 {
13122 .vendor = "PMC",
13123 .name = "Pm25LV010A",
13124 .bustype = BUS_SPI,
13125 .manufacture_id = PMC_ID,
13126 .model_id = PMC_PM25LV010,
13127 .total_size = 128,
13128 .page_size = 256,
13129 .feature_bits = FEATURE_WRSR_WREN,
13130 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013131 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013132 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013133 .block_erasers =
13134 {
13135 {
13136 .eraseblocks = { {4 * 1024, 32} },
13137 .block_erase = spi_block_erase_d7,
13138 }, {
13139 .eraseblocks = { {32 * 1024, 4} },
13140 .block_erase = spi_block_erase_d8,
13141 }, {
13142 .eraseblocks = { {128 * 1024, 1} },
13143 .block_erase = spi_block_erase_c7,
13144 }
13145 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013146 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013147 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013148 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013149 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013150 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013151 },
13152
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013153 {
13154 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013155 .name = "Pm25LV016B",
13156 .bustype = BUS_SPI,
13157 .manufacture_id = PMC_ID,
13158 .model_id = PMC_PM25LV016B,
13159 .total_size = 2048,
13160 .page_size = 256,
13161 .feature_bits = FEATURE_WRSR_WREN,
13162 .tested = TEST_UNTESTED,
13163 .probe = probe_spi_rdid,
13164 .probe_timing = TIMING_ZERO,
13165 .block_erasers =
13166 {
13167 {
13168 .eraseblocks = { {4 * 1024, 512} },
13169 .block_erase = spi_block_erase_d7,
13170 }, {
13171 .eraseblocks = { {4 * 1024, 512} },
13172 .block_erase = spi_block_erase_20,
13173 }, {
13174 .eraseblocks = { {64 * 1024, 32} },
13175 .block_erase = spi_block_erase_d8,
13176 }, {
13177 .eraseblocks = { {2 * 1024 * 1024, 1} },
13178 .block_erase = spi_block_erase_60,
13179 }, {
13180 .eraseblocks = { {2 * 1024 * 1024, 1} },
13181 .block_erase = spi_block_erase_c7,
13182 }
13183 },
13184 .printlock = spi_prettyprint_status_register_bp2_srwd,
13185 .unlock = spi_disable_blockprotect,
13186 .write = spi_chip_write_256,
13187 .read = spi_chip_read, /* Fast read (0x0B) supported */
13188 .voltage = {2700, 3600},
13189 },
13190
13191 {
13192 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013193 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013194 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013195 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013196 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013197 .total_size = 256,
13198 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013199 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013200 .tested = TEST_UNTESTED,
13201 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013202 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013203 .block_erasers =
13204 {
13205 {
13206 .eraseblocks = { {4 * 1024, 64} },
13207 .block_erase = spi_block_erase_d7,
13208 }, {
13209 .eraseblocks = { {64 * 1024, 4} },
13210 .block_erase = spi_block_erase_d8,
13211 }, {
13212 .eraseblocks = { {256 * 1024, 1} },
13213 .block_erase = spi_block_erase_c7,
13214 }
13215 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013216 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013217 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013218 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013219 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013220 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013221 },
13222
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013223 {
13224 .vendor = "PMC",
13225 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013226 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013227 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013228 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013229 .total_size = 512,
13230 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013231 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000013232 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013233 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013234 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013235 .block_erasers =
13236 {
13237 {
13238 .eraseblocks = { {4 * 1024, 128} },
13239 .block_erase = spi_block_erase_d7,
13240 }, {
13241 .eraseblocks = { {64 * 1024, 8} },
13242 .block_erase = spi_block_erase_d8,
13243 }, {
13244 .eraseblocks = { {512 * 1024, 1} },
13245 .block_erase = spi_block_erase_c7,
13246 }
13247 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013248 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013249 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013250 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013251 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013252 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013253 },
13254
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013255 {
13256 .vendor = "PMC",
13257 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013258 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013259 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013260 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013261 .total_size = 1024,
13262 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013263 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013264 .tested = TEST_UNTESTED,
13265 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013266 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013267 .block_erasers =
13268 {
13269 {
13270 .eraseblocks = { {4 * 1024, 256} },
13271 .block_erase = spi_block_erase_d7,
13272 }, {
13273 .eraseblocks = { {4 * 1024, 256} },
13274 .block_erase = spi_block_erase_20,
13275 }, {
13276 .eraseblocks = { {64 * 1024, 16} },
13277 .block_erase = spi_block_erase_d8,
13278 }, {
13279 .eraseblocks = { {1024 * 1024, 1} },
13280 .block_erase = spi_block_erase_60,
13281 }, {
13282 .eraseblocks = { {1024 * 1024, 1} },
13283 .block_erase = spi_block_erase_c7,
13284 }
13285 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013286 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013287 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013288 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013289 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013290 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013291 },
13292
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013293 {
13294 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013295 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013296 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013297 .manufacture_id = PMC_ID_NOPREFIX,
13298 .model_id = PMC_PM25LV512,
13299 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013300 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013301 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013302 .tested = TEST_OK_PREW,
13303 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013304 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013305 .block_erasers =
13306 {
13307 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013308 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000013309 .block_erase = spi_block_erase_d7,
13310 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013311 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000013312 .block_erase = spi_block_erase_d8,
13313 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013314 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000013315 .block_erase = spi_block_erase_c7,
13316 }
13317 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013318 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013319 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013320 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013321 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013322 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013323 },
13324
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013325 {
13326 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000013327 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013328 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013329 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013330 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013331 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000013332 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013333 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013334 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000013335 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000013336 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000013337 .block_erasers =
13338 {
13339 {
13340 .eraseblocks = {
13341 {16 * 1024, 1},
13342 {8 * 1024, 2},
13343 {96 * 1024, 1},
13344 {128 * 1024, 1},
13345 },
Sean Nelson35727f72010-01-28 23:55:12 +000013346 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013347 }, {
13348 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000013349 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013350 },
13351 },
Sean Nelson35727f72010-01-28 23:55:12 +000013352 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013353 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013354 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013355 .prepare_access = prepare_memory_access,
13356 .finish_access = finish_memory_access,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013357 },
13358
13359 {
13360 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013361 .name = "Pm29F002T",
13362 .bustype = BUS_PARALLEL,
13363 .manufacture_id = PMC_ID_NOPREFIX,
13364 .model_id = PMC_PM29F002T,
13365 .total_size = 256,
13366 .page_size = 8 * 1024,
13367 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13368 .tested = TEST_OK_PREW,
13369 .probe = probe_jedec,
13370 .probe_timing = TIMING_FIXME,
13371 .block_erasers =
13372 {
13373 {
13374 .eraseblocks = {
13375 {128 * 1024, 1},
13376 {96 * 1024, 1},
13377 {8 * 1024, 2},
13378 {16 * 1024, 1},
13379 },
13380 .block_erase = erase_sector_jedec,
13381 }, {
13382 .eraseblocks = { {256 * 1024, 1} },
13383 .block_erase = erase_chip_block_jedec,
13384 },
13385 },
13386 .write = write_jedec_1,
13387 .read = read_memmapped,
13388 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013389 .prepare_access = prepare_memory_access,
13390 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013391 },
13392
13393 {
13394 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013395 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013396 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013397 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013398 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013399 .total_size = 128,
13400 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013401 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013402 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013403 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013404 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000013405 .block_erasers =
13406 {
13407 {
13408 .eraseblocks = { {4 * 1024, 32} },
13409 .block_erase = erase_sector_jedec,
13410 }, {
13411 .eraseblocks = { {64 * 1024, 2} },
13412 .block_erase = erase_block_jedec,
13413 }, {
13414 .eraseblocks = { {128 * 1024, 1} },
13415 .block_erase = erase_chip_block_jedec,
13416 }
13417 },
Sean Nelson35727f72010-01-28 23:55:12 +000013418 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013419 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013420 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013421 .prepare_access = prepare_memory_access,
13422 .finish_access = finish_memory_access,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013423 },
13424
13425 {
13426 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013427 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013428 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013429 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013430 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013431 .total_size = 256,
13432 .page_size = 4096,
13433 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13434 .tested = TEST_UNTESTED,
13435 .probe = probe_jedec,
13436 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013437 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013438 {
13439 {
13440 .eraseblocks = { {4 * 1024, 64} },
13441 .block_erase = erase_sector_jedec,
13442 }, {
13443 .eraseblocks = { {64 * 1024, 4} },
13444 .block_erase = erase_block_jedec,
13445 }, {
13446 .eraseblocks = { {256 * 1024, 1} },
13447 .block_erase = erase_chip_block_jedec,
13448 }
13449 },
13450 .write = write_jedec_1,
13451 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013452 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013453 .prepare_access = prepare_memory_access,
13454 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013455 },
13456
13457 {
13458 .vendor = "PMC",
13459 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013460 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013461 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013462 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013463 .total_size = 512,
13464 .page_size = 4096,
13465 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013466 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013467 .probe = probe_jedec,
13468 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013469 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013470 {
13471 {
13472 .eraseblocks = { {4 * 1024, 128} },
13473 .block_erase = erase_sector_jedec,
13474 }, {
13475 .eraseblocks = { {64 * 1024, 8} },
13476 .block_erase = erase_block_jedec,
13477 }, {
13478 .eraseblocks = { {512 * 1024, 1} },
13479 .block_erase = erase_chip_block_jedec,
13480 }
13481 },
13482 .write = write_jedec_1,
13483 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013484 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013485 .prepare_access = prepare_memory_access,
13486 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013487 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013488
13489 {
13490 .vendor = "PMC",
13491 .name = "Pm39LV512",
13492 .bustype = BUS_PARALLEL,
13493 .manufacture_id = PMC_ID_NOPREFIX,
13494 .model_id = PMC_PM39LV512,
13495 .total_size = 64,
13496 .page_size = 4096,
13497 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13498 .tested = TEST_OK_PREW,
13499 .probe = probe_jedec,
13500 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13501 .block_erasers =
13502 {
13503 {
13504 .eraseblocks = { {4 * 1024, 16} },
13505 .block_erase = erase_sector_jedec,
13506 }, {
13507 .eraseblocks = { {64 * 1024, 1} },
13508 .block_erase = erase_block_jedec,
13509 }, {
13510 .eraseblocks = { {64 * 1024, 1} },
13511 .block_erase = erase_chip_block_jedec,
13512 }
13513 },
13514 .write = write_jedec_1,
13515 .read = read_memmapped,
13516 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013517 .prepare_access = prepare_memory_access,
13518 .finish_access = finish_memory_access,
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013519 },
13520
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013521 {
13522 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013523 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013524 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013525 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013526 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013527 .total_size = 256,
13528 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010013529 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013530 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013531 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013532 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000013533 .block_erasers =
13534 {
13535 {
13536 .eraseblocks = { {4 * 1024, 64} },
13537 .block_erase = erase_sector_jedec,
13538 }, {
13539 .eraseblocks = { {16 * 1024, 16} },
13540 .block_erase = erase_block_jedec,
13541 }, {
13542 .eraseblocks = { {256 * 1024, 1} },
13543 .block_erase = erase_chip_block_jedec,
13544 }
13545 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013546 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000013547 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013548 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013549 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010013550 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010013551 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000013552 },
13553
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013554 {
13555 .vendor = "PMC",
13556 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013557 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013558 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013559 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013560 .total_size = 512,
13561 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010013562 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013563 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013564 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013565 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013566 .block_erasers =
13567 {
13568 {
13569 .eraseblocks = { {4 * 1024, 128} },
13570 .block_erase = erase_sector_jedec,
13571 }, {
13572 .eraseblocks = { {64 * 1024, 8} },
13573 .block_erase = erase_block_jedec,
13574 }, {
13575 .eraseblocks = { {512 * 1024, 1} },
13576 .block_erase = erase_chip_block_jedec,
13577 }
13578 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013579 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000013580 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013581 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013582 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010013583 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010013584 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000013585 },
13586
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013587 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013588 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013589 .name = "SST25LF020A",
13590 .bustype = BUS_SPI,
13591 .manufacture_id = SST_ID,
13592 .model_id = SST_SST25VF020_REMS,
13593 .total_size = 256,
13594 .page_size = 256,
13595 .feature_bits = FEATURE_WRSR_EWSR,
13596 .tested = TEST_OK_PREW,
13597 .probe = probe_spi_rems,
13598 .probe_timing = TIMING_ZERO,
13599 .block_erasers =
13600 {
13601 {
13602 .eraseblocks = { {4 * 1024, 64} },
13603 .block_erase = spi_block_erase_20,
13604 }, {
13605 .eraseblocks = { {32 * 1024, 8} },
13606 .block_erase = spi_block_erase_52,
13607 }, {
13608 .eraseblocks = { {256 * 1024, 1} },
13609 .block_erase = spi_block_erase_60,
13610 },
13611 },
13612 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13613 .unlock = spi_disable_blockprotect,
13614 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13615 .read = spi_chip_read, /* Fast read (0x0B) supported */
13616 .voltage = {2700, 3600},
13617 },
13618
13619 {
13620 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013621 .name = "SST25LF040A",
13622 .bustype = BUS_SPI,
13623 .manufacture_id = SST_ID,
13624 .model_id = SST_SST25VF040_REMS,
13625 .total_size = 512,
13626 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013627 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013628 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013629 .probe = probe_spi_res2,
13630 .probe_timing = TIMING_ZERO,
13631 .block_erasers =
13632 {
13633 {
13634 .eraseblocks = { {4 * 1024, 128} },
13635 .block_erase = spi_block_erase_20,
13636 }, {
13637 .eraseblocks = { {32 * 1024, 16} },
13638 .block_erase = spi_block_erase_52,
13639 }, {
13640 .eraseblocks = { {512 * 1024, 1} },
13641 .block_erase = spi_block_erase_60,
13642 },
13643 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013644 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013645 .unlock = spi_disable_blockprotect,
13646 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13647 .read = spi_chip_read,
13648 .voltage = {3000, 3600},
13649 },
13650
13651 {
13652 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013653 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013654 .bustype = BUS_SPI,
13655 .manufacture_id = SST_ID,
13656 .model_id = SST_SST25VF080_REMS,
13657 .total_size = 1024,
13658 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013659 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013660 .tested = TEST_UNTESTED,
13661 .probe = probe_spi_res2,
13662 .probe_timing = TIMING_ZERO,
13663 .block_erasers =
13664 {
13665 {
13666 .eraseblocks = { {4 * 1024, 256} },
13667 .block_erase = spi_block_erase_20,
13668 }, {
13669 .eraseblocks = { {32 * 1024, 32} },
13670 .block_erase = spi_block_erase_52,
13671 }, {
13672 .eraseblocks = { {1024 * 1024, 1} },
13673 .block_erase = spi_block_erase_60,
13674 },
13675 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013676 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013677 .unlock = spi_disable_blockprotect,
13678 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13679 .read = spi_chip_read,
13680 .voltage = {3000, 3600},
13681 },
13682
13683 {
13684 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013685 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013686 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013687 .manufacture_id = SST_ID,
13688 .model_id = SST_SST25VF010_REMS,
13689 .total_size = 128,
13690 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013691 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000013692 .tested = TEST_OK_PREW,
13693 .probe = probe_spi_rems,
13694 .probe_timing = TIMING_ZERO,
13695 .block_erasers =
13696 {
13697 {
13698 .eraseblocks = { {4 * 1024, 32} },
13699 .block_erase = spi_block_erase_20,
13700 }, {
13701 .eraseblocks = { {32 * 1024, 4} },
13702 .block_erase = spi_block_erase_52,
13703 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000013704 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013705 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013706 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000013707 .eraseblocks = { {128 * 1024, 1} },
13708 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000013709 }, {
13710 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013711 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013712 },
13713 },
13714 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13715 .unlock = spi_disable_blockprotect,
13716 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013717 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013718 .voltage = {2700, 3600},
13719 },
13720
13721 {
13722 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013723 .name = "SST25VF016B",
13724 .bustype = BUS_SPI,
13725 .manufacture_id = SST_ID,
13726 .model_id = SST_SST25VF016B,
13727 .total_size = 2048,
13728 .page_size = 256,
13729 .feature_bits = FEATURE_WRSR_EITHER,
13730 .tested = TEST_OK_PREW,
13731 .probe = probe_spi_rdid,
13732 .probe_timing = TIMING_ZERO,
13733 .block_erasers =
13734 {
13735 {
13736 .eraseblocks = { {4 * 1024, 512} },
13737 .block_erase = spi_block_erase_20,
13738 }, {
13739 .eraseblocks = { {32 * 1024, 64} },
13740 .block_erase = spi_block_erase_52,
13741 }, {
13742 .eraseblocks = { {64 * 1024, 32} },
13743 .block_erase = spi_block_erase_d8,
13744 }, {
13745 .eraseblocks = { {2 * 1024 * 1024, 1} },
13746 .block_erase = spi_block_erase_60,
13747 }, {
13748 .eraseblocks = { {2 * 1024 * 1024, 1} },
13749 .block_erase = spi_block_erase_c7,
13750 },
13751 },
13752 .printlock = spi_prettyprint_status_register_sst25vf016,
13753 .unlock = spi_disable_blockprotect,
13754 .write = spi_aai_write,
13755 .read = spi_chip_read,
13756 .voltage = {2700, 3600},
13757 },
13758
13759 {
13760 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013761 .name = "SST25VF020",
13762 .bustype = BUS_SPI,
13763 .manufacture_id = SST_ID,
13764 .model_id = SST_SST25VF020_REMS,
13765 .total_size = 256,
13766 .page_size = 256,
13767 .feature_bits = FEATURE_WRSR_EWSR,
13768 .tested = TEST_UNTESTED,
13769 .probe = probe_spi_rems,
13770 .probe_timing = TIMING_ZERO,
13771 .block_erasers =
13772 {
13773 {
13774 .eraseblocks = { {4 * 1024, 64} },
13775 .block_erase = spi_block_erase_20,
13776 }, {
13777 .eraseblocks = { {32 * 1024, 8} },
13778 .block_erase = spi_block_erase_52,
13779 }, {
13780 .eraseblocks = { {256 * 1024, 1} },
13781 .block_erase = spi_block_erase_60,
13782 },
13783 },
13784 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13785 .unlock = spi_disable_blockprotect,
13786 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13787 .read = spi_chip_read, /* only */
13788 .voltage = {2700, 3600},
13789 },
13790
13791 {
13792 .vendor = "SST",
13793 .name = "SST25VF020B",
13794 .bustype = BUS_SPI,
13795 .manufacture_id = SST_ID,
13796 .model_id = SST_SST25VF020B,
13797 .total_size = 256,
13798 .page_size = 256,
13799 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013800 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000013801 .probe = probe_spi_rdid,
13802 .probe_timing = TIMING_ZERO,
13803 .block_erasers =
13804 {
13805 {
13806 .eraseblocks = { {4 * 1024, 64} },
13807 .block_erase = spi_block_erase_20,
13808 }, {
13809 .eraseblocks = { {32 * 1024, 8} },
13810 .block_erase = spi_block_erase_52,
13811 }, {
13812 .eraseblocks = { {64 * 1024, 4} },
13813 .block_erase = spi_block_erase_d8,
13814 }, {
13815 .eraseblocks = { {256 * 1024, 1} },
13816 .block_erase = spi_block_erase_60,
13817 }, {
13818 .eraseblocks = { {256 * 1024, 1} },
13819 .block_erase = spi_block_erase_c7,
13820 },
13821 },
13822 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13823 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13824 .write = spi_aai_write, /* AAI supported (0xAD) */
13825 .read = spi_chip_read, /* Fast read (0x0B) supported */
13826 .voltage = {2700, 3600},
13827 },
13828
13829 {
13830 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013831 .name = "SST25VF032B",
13832 .bustype = BUS_SPI,
13833 .manufacture_id = SST_ID,
13834 .model_id = SST_SST25VF032B,
13835 .total_size = 4096,
13836 .page_size = 256,
13837 .feature_bits = FEATURE_WRSR_EWSR,
13838 .tested = TEST_OK_PREW,
13839 .probe = probe_spi_rdid,
13840 .probe_timing = TIMING_ZERO,
13841 .block_erasers =
13842 {
13843 {
13844 .eraseblocks = { {4 * 1024, 1024} },
13845 .block_erase = spi_block_erase_20,
13846 }, {
13847 .eraseblocks = { {32 * 1024, 128} },
13848 .block_erase = spi_block_erase_52,
13849 }, {
13850 .eraseblocks = { {64 * 1024, 64} },
13851 .block_erase = spi_block_erase_d8,
13852 }, {
13853 .eraseblocks = { {4 * 1024 * 1024, 1} },
13854 .block_erase = spi_block_erase_60,
13855 }, {
13856 .eraseblocks = { {4 * 1024 * 1024, 1} },
13857 .block_erase = spi_block_erase_c7,
13858 },
13859 },
13860 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13861 .unlock = spi_disable_blockprotect,
13862 .write = spi_aai_write,
13863 .read = spi_chip_read,
13864 .voltage = {2700, 3600},
13865 },
13866
13867 {
13868 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013869 .name = "SST25VF040",
13870 .bustype = BUS_SPI,
13871 .manufacture_id = SST_ID,
13872 .model_id = SST_SST25VF040_REMS,
13873 .total_size = 512,
13874 .page_size = 256,
13875 .feature_bits = FEATURE_WRSR_EWSR,
13876 .tested = TEST_OK_PR,
13877 .probe = probe_spi_rems,
13878 .probe_timing = TIMING_ZERO,
13879 .block_erasers =
13880 {
13881 {
13882 .eraseblocks = { {4 * 1024, 128} },
13883 .block_erase = spi_block_erase_20,
13884 }, {
13885 .eraseblocks = { {32 * 1024, 16} },
13886 .block_erase = spi_block_erase_52,
13887 }, {
13888 .eraseblocks = { {512 * 1024, 1} },
13889 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000013890 },
13891 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013892 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000013893 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000013894 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13895 .read = spi_chip_read,
13896 .voltage = {2700, 3600},
13897 },
13898
13899 {
13900 .vendor = "SST",
13901 .name = "SST25VF040B",
13902 .bustype = BUS_SPI,
13903 .manufacture_id = SST_ID,
13904 .model_id = SST_SST25VF040B,
13905 .total_size = 512,
13906 .page_size = 256,
13907 .feature_bits = FEATURE_WRSR_EWSR,
13908 .tested = TEST_OK_PREW,
13909 .probe = probe_spi_rdid,
13910 .probe_timing = TIMING_ZERO,
13911 .block_erasers =
13912 {
13913 {
13914 .eraseblocks = { {4 * 1024, 128} },
13915 .block_erase = spi_block_erase_20,
13916 }, {
13917 .eraseblocks = { {32 * 1024, 16} },
13918 .block_erase = spi_block_erase_52,
13919 }, {
13920 .eraseblocks = { {64 * 1024, 8} },
13921 .block_erase = spi_block_erase_d8,
13922 }, {
13923 .eraseblocks = { {512 * 1024, 1} },
13924 .block_erase = spi_block_erase_60,
13925 }, {
13926 .eraseblocks = { {512 * 1024, 1} },
13927 .block_erase = spi_block_erase_c7,
13928 },
13929 },
13930 .printlock = spi_prettyprint_status_register_sst25vf040b,
13931 .unlock = spi_disable_blockprotect,
13932 .write = spi_aai_write, /* AAI supported (0xAD) */
13933 .read = spi_chip_read, /* Fast read (0x0B) supported */
13934 .voltage = {2700, 3600},
13935 },
13936
13937 {
13938 .vendor = "SST",
13939 .name = "SST25VF040B.REMS",
13940 .bustype = BUS_SPI,
13941 .manufacture_id = SST_ID,
13942 .model_id = SST_SST25VF040B_REMS,
13943 .total_size = 512,
13944 .page_size = 256,
13945 .feature_bits = FEATURE_WRSR_EWSR,
13946 .tested = TEST_OK_PREW,
13947 .probe = probe_spi_rems,
13948 .probe_timing = TIMING_ZERO,
13949 .block_erasers =
13950 {
13951 {
13952 .eraseblocks = { {4 * 1024, 128} },
13953 .block_erase = spi_block_erase_20,
13954 }, {
13955 .eraseblocks = { {32 * 1024, 16} },
13956 .block_erase = spi_block_erase_52,
13957 }, {
13958 .eraseblocks = { {64 * 1024, 8} },
13959 .block_erase = spi_block_erase_d8,
13960 }, {
13961 .eraseblocks = { {512 * 1024, 1} },
13962 .block_erase = spi_block_erase_60,
13963 }, {
13964 .eraseblocks = { {512 * 1024, 1} },
13965 .block_erase = spi_block_erase_c7,
13966 },
13967 },
13968 .printlock = spi_prettyprint_status_register_sst25vf040b,
13969 .unlock = spi_disable_blockprotect,
13970 .write = spi_aai_write,
13971 .read = spi_chip_read,
13972 .voltage = {2700, 3600},
13973 },
13974
13975 {
13976 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013977 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000013978 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013979 .manufacture_id = SST_ID,
13980 .model_id = SST_SST25VF064C,
13981 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013982 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013983 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013984 .tested = TEST_OK_PREW,
13985 .probe = probe_spi_rdid,
13986 .probe_timing = TIMING_ZERO,
13987 .block_erasers =
13988 {
13989 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013990 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013991 .block_erase = spi_block_erase_20,
13992 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013993 .eraseblocks = { {32 * 1024, 256} },
13994 .block_erase = spi_block_erase_52,
13995 }, {
13996 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013997 .block_erase = spi_block_erase_d8,
13998 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013999 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014000 .block_erase = spi_block_erase_60,
14001 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014002 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014003 .block_erase = spi_block_erase_c7,
14004 },
14005 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014006 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14007 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014008 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014009 .read = spi_chip_read,
14010 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000014011 },
14012
14013 {
14014 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014015 .name = "SST25VF080B",
14016 .bustype = BUS_SPI,
14017 .manufacture_id = SST_ID,
14018 .model_id = SST_SST25VF080B,
14019 .total_size = 1024,
14020 .page_size = 256,
14021 .feature_bits = FEATURE_WRSR_EWSR,
14022 .tested = TEST_OK_PREW,
14023 .probe = probe_spi_rdid,
14024 .probe_timing = TIMING_ZERO,
14025 .block_erasers =
14026 {
14027 {
14028 .eraseblocks = { {4 * 1024, 256} },
14029 .block_erase = spi_block_erase_20,
14030 }, {
14031 .eraseblocks = { {32 * 1024, 32} },
14032 .block_erase = spi_block_erase_52,
14033 }, {
14034 .eraseblocks = { {64 * 1024, 16} },
14035 .block_erase = spi_block_erase_d8,
14036 }, {
14037 .eraseblocks = { {1024 * 1024, 1} },
14038 .block_erase = spi_block_erase_60,
14039 }, {
14040 .eraseblocks = { {1024 * 1024, 1} },
14041 .block_erase = spi_block_erase_c7,
14042 },
14043 },
14044 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14045 .unlock = spi_disable_blockprotect,
14046 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000014047 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014048 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000014049 },
14050
14051 {
14052 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014053 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014054 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014055 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014056 .model_id = SST_SST25VF512_REMS,
14057 .total_size = 64,
14058 .page_size = 256,
14059 .feature_bits = FEATURE_WRSR_EWSR,
14060 .tested = TEST_OK_PREW,
14061 .probe = probe_spi_rems,
14062 .probe_timing = TIMING_ZERO,
14063 .block_erasers =
14064 {
14065 {
14066 .eraseblocks = { {4 * 1024, 16} },
14067 .block_erase = spi_block_erase_20,
14068 }, {
14069 .eraseblocks = { {32 * 1024, 2} },
14070 .block_erase = spi_block_erase_52,
14071 }, {
14072 .eraseblocks = { {32 * 1024, 2} },
14073 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
14074 }, {
14075 .eraseblocks = { {64 * 1024, 1} },
14076 .block_erase = spi_block_erase_60,
14077 }, {
14078 .eraseblocks = { {64 * 1024, 1} },
14079 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
14080 },
14081 },
14082 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14083 .unlock = spi_disable_blockprotect,
14084 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14085 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
14086 .voltage = {2700, 3600},
14087 },
14088
14089 {
14090 .vendor = "SST",
14091 .name = "SST25WF010",
14092 .bustype = BUS_SPI,
14093 .manufacture_id = SST_ID,
14094 .model_id = SST_SST25WF010,
14095 .total_size = 128,
14096 .page_size = 256,
14097 .feature_bits = FEATURE_WRSR_EITHER,
14098 .tested = TEST_UNTESTED,
14099 .probe = probe_spi_rdid,
14100 .probe_timing = TIMING_ZERO,
14101 .block_erasers =
14102 {
14103 {
14104 .eraseblocks = { {4 * 1024, 32} },
14105 .block_erase = spi_block_erase_20,
14106 }, {
14107 .eraseblocks = { {32 * 1024, 4} },
14108 .block_erase = spi_block_erase_52,
14109 }, {
14110 .eraseblocks = { {1024 * 128, 1} },
14111 .block_erase = spi_block_erase_60,
14112 }, {
14113 .eraseblocks = { {1024 * 128, 1} },
14114 .block_erase = spi_block_erase_c7,
14115 },
14116 },
14117 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14118 .unlock = spi_disable_blockprotect_bp2_srwd,
14119 .write = spi_aai_write,
14120 .read = spi_chip_read, /* Fast read (0x0B) supported */
14121 .voltage = {1650, 1950},
14122 },
14123
14124 {
14125 .vendor = "SST",
14126 .name = "SST25WF020",
14127 .bustype = BUS_SPI,
14128 .manufacture_id = SST_ID,
14129 .model_id = SST_SST25WF020,
14130 .total_size = 256,
14131 .page_size = 256,
14132 .feature_bits = FEATURE_WRSR_EITHER,
14133 .tested = TEST_UNTESTED,
14134 .probe = probe_spi_rdid,
14135 .probe_timing = TIMING_ZERO,
14136 .block_erasers =
14137 {
14138 {
14139 .eraseblocks = { {4 * 1024, 64} },
14140 .block_erase = spi_block_erase_20,
14141 }, {
14142 .eraseblocks = { {32 * 1024, 8} },
14143 .block_erase = spi_block_erase_52,
14144 }, {
14145 .eraseblocks = { {64 * 1024, 4} },
14146 .block_erase = spi_block_erase_d8,
14147 }, {
14148 .eraseblocks = { {1024 * 256, 1} },
14149 .block_erase = spi_block_erase_60,
14150 }, {
14151 .eraseblocks = { {1024 * 256, 1} },
14152 .block_erase = spi_block_erase_c7,
14153 },
14154 },
14155 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14156 .unlock = spi_disable_blockprotect_bp2_srwd,
14157 .write = spi_aai_write,
14158 .read = spi_chip_read, /* Fast read (0x0B) supported */
14159 .voltage = {1650, 1950},
14160 },
14161
14162 {
14163 .vendor = "SST",
14164 .name = "SST25WF020A",
14165 .bustype = BUS_SPI,
14166 .manufacture_id = SANYO_ID, /* See flashchips.h */
14167 .model_id = SST_SST25WF020A,
14168 .total_size = 256,
14169 .page_size = 256,
14170 .feature_bits = FEATURE_WRSR_WREN,
14171 .tested = TEST_UNTESTED,
14172 .probe = probe_spi_rdid,
14173 .probe_timing = TIMING_ZERO,
14174 .block_erasers =
14175 {
14176 {
14177 .eraseblocks = { {4 * 1024, 64} },
14178 .block_erase = spi_block_erase_20,
14179 }, {
14180 .eraseblocks = { {64 * 1024, 4} },
14181 .block_erase = spi_block_erase_d8,
14182 }, {
14183 .eraseblocks = { {256 * 1024, 1} },
14184 .block_erase = spi_block_erase_60,
14185 }, {
14186 .eraseblocks = { {256 * 1024, 1} },
14187 .block_erase = spi_block_erase_c7,
14188 },
14189 },
14190 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14191 .unlock = spi_disable_blockprotect_bp2_srwd,
14192 .write = spi_chip_write_256,
14193 .read = spi_chip_read, /* Fast read (0x0B) supported */
14194 .voltage = {1650, 1950},
14195 },
14196
14197 {
14198 .vendor = "SST",
14199 .name = "SST25WF040",
14200 .bustype = BUS_SPI,
14201 .manufacture_id = SST_ID,
14202 .model_id = SST_SST25WF040,
14203 .total_size = 512,
14204 .page_size = 256,
14205 .feature_bits = FEATURE_WRSR_EITHER,
14206 .tested = TEST_UNTESTED,
14207 .probe = probe_spi_rdid,
14208 .probe_timing = TIMING_ZERO,
14209 .block_erasers =
14210 {
14211 {
14212 .eraseblocks = { {4 * 1024, 128} },
14213 .block_erase = spi_block_erase_20,
14214 }, {
14215 .eraseblocks = { {32 * 1024, 16} },
14216 .block_erase = spi_block_erase_52,
14217 }, {
14218 .eraseblocks = { {64 * 1024, 8} },
14219 .block_erase = spi_block_erase_d8,
14220 }, {
14221 .eraseblocks = { {1024 * 512, 1} },
14222 .block_erase = spi_block_erase_60,
14223 }, {
14224 .eraseblocks = { {1024 * 512, 1} },
14225 .block_erase = spi_block_erase_c7,
14226 },
14227 },
14228 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14229 .unlock = spi_disable_blockprotect_bp2_srwd,
14230 .write = spi_aai_write,
14231 .read = spi_chip_read, /* Fast read (0x0B) supported */
14232 .voltage = {1650, 1950},
14233 },
14234
14235 {
14236 .vendor = "SST",
14237 .name = "SST25WF040B",
14238 .bustype = BUS_SPI,
14239 .manufacture_id = SANYO_ID, /* See flashchips.h */
14240 .model_id = SST_SST25WF040B,
14241 .total_size = 512,
14242 .page_size = 256,
14243 .feature_bits = FEATURE_WRSR_WREN,
14244 .tested = TEST_UNTESTED,
14245 .probe = probe_spi_rdid,
14246 .probe_timing = TIMING_ZERO,
14247 .block_erasers =
14248 {
14249 {
14250 .eraseblocks = { {4 * 1024, 128} },
14251 .block_erase = spi_block_erase_20,
14252 }, {
14253 .eraseblocks = { {64 * 1024, 8} },
14254 .block_erase = spi_block_erase_d8,
14255 }, {
14256 .eraseblocks = { {512 * 1024, 1} },
14257 .block_erase = spi_block_erase_60,
14258 }, {
14259 .eraseblocks = { {512 * 1024, 1} },
14260 .block_erase = spi_block_erase_c7,
14261 },
14262 },
14263 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14264 .unlock = spi_disable_blockprotect_bp2_srwd,
14265 .write = spi_chip_write_256,
14266 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14267 .voltage = {1650, 1950},
14268 },
14269
14270 {
14271 .vendor = "SST",
14272 .name = "SST25WF080",
14273 .bustype = BUS_SPI,
14274 .manufacture_id = SST_ID,
14275 .model_id = SST_SST25WF080,
14276 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014277 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014278 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000014279 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014280 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014281 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014282 .block_erasers =
14283 {
14284 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014285 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014286 .block_erase = spi_block_erase_20,
14287 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014288 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014289 .block_erase = spi_block_erase_52,
14290 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014291 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014292 .block_erase = spi_block_erase_d8,
14293 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014294 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014295 .block_erase = spi_block_erase_60,
14296 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014297 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014298 .block_erase = spi_block_erase_c7,
14299 },
14300 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014301 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
14302 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000014303 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014304 .read = spi_chip_read, /* Fast read (0x0B) supported */
14305 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000014306 },
14307
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014308 {
14309 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014310 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014311 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014312 .manufacture_id = SANYO_ID, /* See flashchips.h */
14313 .model_id = SST_SST25WF080B,
14314 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014315 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014316 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000014317 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014318 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014319 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014320 .block_erasers =
14321 {
14322 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014323 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014324 .block_erase = spi_block_erase_20,
14325 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014326 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014327 .block_erase = spi_block_erase_d8,
14328 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014329 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014330 .block_erase = spi_block_erase_60,
14331 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014332 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014333 .block_erase = spi_block_erase_c7,
14334 },
14335 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014336 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14337 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000014338 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014339 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14340 .voltage = {1650, 1950},
14341 },
14342
14343 {
14344 .vendor = "SST",
14345 .name = "SST25WF512",
14346 .bustype = BUS_SPI,
14347 .manufacture_id = SST_ID,
14348 .model_id = SST_SST25WF512,
14349 .total_size = 64,
14350 .page_size = 256,
14351 .feature_bits = FEATURE_WRSR_EITHER,
14352 .tested = TEST_UNTESTED,
14353 .probe = probe_spi_rdid,
14354 .probe_timing = TIMING_ZERO,
14355 .block_erasers =
14356 {
14357 {
14358 .eraseblocks = { {4 * 1024, 16} },
14359 .block_erase = spi_block_erase_20,
14360 }, {
14361 .eraseblocks = { {32 * 1024, 2} },
14362 .block_erase = spi_block_erase_52,
14363 }, {
14364 .eraseblocks = { {1024 * 64, 1} },
14365 .block_erase = spi_block_erase_60,
14366 }, {
14367 .eraseblocks = { {1024 * 64, 1} },
14368 .block_erase = spi_block_erase_c7,
14369 },
14370 },
14371 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14372 .unlock = spi_disable_blockprotect_bp2_srwd,
14373 .write = spi_aai_write,
14374 .read = spi_chip_read, /* Fast read (0x0B) supported */
14375 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000014376 },
14377
14378 {
14379 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014380 .name = "SST26VF016",
14381 .bustype = BUS_SPI,
14382 .manufacture_id = SST_ID,
14383 .model_id = SST_SST26VF016,
14384 .total_size = 2048,
14385 .page_size = 256,
14386 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14387 .tested = TEST_UNTESTED,
14388 .probe = probe_spi_rdid,
14389 .probe_timing = TIMING_ZERO,
14390 .block_erasers =
14391 {
14392 {
14393 .eraseblocks = { {4 * 1024, 512} },
14394 .block_erase = spi_block_erase_20,
14395 }, {
14396 .eraseblocks = {
14397 {8 * 1024, 4},
14398 {32 * 1024, 1},
14399 {64 * 1024, 30},
14400 {32 * 1024, 1},
14401 {8 * 1024, 4},
14402 },
14403 .block_erase = spi_block_erase_d8,
14404 }, {
14405 .eraseblocks = { {2 * 1024 * 1024, 1} },
14406 .block_erase = spi_block_erase_c7,
14407 },
14408 },
14409 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14410 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14411 .write = spi_chip_write_256, /* Multi I/O supported */
14412 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14413 .voltage = {2700, 3600},
14414 },
14415
14416 {
14417 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014418 .name = "SST26VF016B(A)",
14419 .bustype = BUS_SPI,
14420 .manufacture_id = SST_ID,
14421 .model_id = SST_SST26VF016B,
14422 .total_size = 2048,
14423 .page_size = 256,
14424 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14425 .tested = TEST_OK_PREW,
14426 .probe = probe_spi_rdid,
14427 .probe_timing = TIMING_ZERO,
14428 .block_erasers =
14429 {
14430 {
14431 .eraseblocks = { {4 * 1024, 512} },
14432 .block_erase = spi_block_erase_20,
14433 }, {
14434 .eraseblocks = {
14435 {8 * 1024, 4},
14436 {32 * 1024, 1},
14437 {64 * 1024, 30},
14438 {32 * 1024, 1},
14439 {8 * 1024, 4},
14440 },
14441 .block_erase = spi_block_erase_d8,
14442 }, {
14443 .eraseblocks = { {2 * 1024 * 1024, 1} },
14444 .block_erase = spi_block_erase_c7,
14445 },
14446 },
14447 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14448 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14449 .write = spi_chip_write_256, /* Multi I/O supported */
14450 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14451 .voltage = {2700, 3600},
14452 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014453
Wei Hu25584de2018-04-30 14:02:08 -070014454 {
14455 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014456 .name = "SST26VF032",
14457 .bustype = BUS_SPI,
14458 .manufacture_id = SST_ID,
14459 .model_id = SST_SST26VF032,
14460 .total_size = 4096,
14461 .page_size = 256,
14462 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14463 .tested = TEST_UNTESTED,
14464 .probe = probe_spi_rdid,
14465 .probe_timing = TIMING_ZERO,
14466 .block_erasers =
14467 {
14468 {
14469 .eraseblocks = { {4 * 1024, 1024} },
14470 .block_erase = spi_block_erase_20,
14471 }, {
14472 .eraseblocks = {
14473 {8 * 1024, 4},
14474 {32 * 1024, 1},
14475 {64 * 1024, 62},
14476 {32 * 1024, 1},
14477 {8 * 1024, 4},
14478 },
14479 .block_erase = spi_block_erase_d8,
14480 }, {
14481 .eraseblocks = { {4 * 1024 * 1024, 1} },
14482 .block_erase = spi_block_erase_c7,
14483 },
14484 },
14485 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14486 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14487 .write = spi_chip_write_256, /* Multi I/O supported */
14488 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14489 .voltage = {2700, 3600},
14490 },
14491
14492 {
14493 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014494 .name = "SST26VF032B(A)",
14495 .bustype = BUS_SPI,
14496 .manufacture_id = SST_ID,
14497 .model_id = SST_SST26VF032B,
14498 .total_size = 4096,
14499 .page_size = 256,
14500 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14501 .tested = TEST_UNTESTED,
14502 .probe = probe_spi_rdid,
14503 .probe_timing = TIMING_ZERO,
14504 .block_erasers =
14505 {
14506 {
14507 .eraseblocks = { {4 * 1024, 1024} },
14508 .block_erase = spi_block_erase_20,
14509 }, {
14510 .eraseblocks = {
14511 {8 * 1024, 4},
14512 {32 * 1024, 1},
14513 {64 * 1024, 62},
14514 {32 * 1024, 1},
14515 {8 * 1024, 4},
14516 },
14517 .block_erase = spi_block_erase_d8,
14518 }, {
14519 .eraseblocks = { {4 * 1024 * 1024, 1} },
14520 .block_erase = spi_block_erase_c7,
14521 },
14522 },
14523 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14524 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14525 .write = spi_chip_write_256, /* Multi I/O supported */
14526 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14527 .voltage = {2700, 3600},
14528 },
14529
Wei Hu25584de2018-04-30 14:02:08 -070014530 {
14531 .vendor = "SST",
14532 .name = "SST26VF064B(A)",
14533 .bustype = BUS_SPI,
14534 .manufacture_id = SST_ID,
14535 .model_id = SST_SST26VF064B,
14536 .total_size = 8192,
14537 .page_size = 256,
14538 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14539 .tested = TEST_OK_PREW,
14540 .probe = probe_spi_rdid,
14541 .probe_timing = TIMING_ZERO,
14542 .block_erasers =
14543 {
14544 {
14545 .eraseblocks = { {4 * 1024, 2048} },
14546 .block_erase = spi_block_erase_20,
14547 }, {
14548 .eraseblocks = {
14549 {8 * 1024, 4},
14550 {32 * 1024, 1},
14551 {64 * 1024, 126},
14552 {32 * 1024, 1},
14553 {8 * 1024, 4},
14554 },
14555 .block_erase = spi_block_erase_d8,
14556 }, {
14557 .eraseblocks = { {8 * 1024 * 1024, 1} },
14558 .block_erase = spi_block_erase_c7,
14559 },
14560 },
14561 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14562 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14563 .write = spi_chip_write_256, /* Multi I/O supported */
14564 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14565 .voltage = {2700, 3600},
14566 },
14567
14568 {
14569 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014570 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014571 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014572 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014573 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014574 .total_size = 512,
14575 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000014576 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014577 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014578 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014579 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014580 .block_erasers =
14581 {
14582 {
14583 .eraseblocks = { {128, 4096} },
14584 .block_erase = erase_sector_28sf040,
14585 }, {
14586 .eraseblocks = { {512 * 1024, 1} },
14587 .block_erase = erase_chip_28sf040,
14588 }
14589 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014590 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014591 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014592 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014593 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014594 .prepare_access = prepare_memory_access,
14595 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014596 },
14597
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014598 {
14599 .vendor = "SST",
14600 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014601 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014602 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014603 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014604 .total_size = 128,
14605 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014606 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014607 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014608 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014609 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014610 .block_erasers =
14611 {
14612 {
14613 .eraseblocks = { {128 * 1024, 1} },
14614 .block_erase = erase_chip_block_jedec,
14615 }
14616 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014617 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014618 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014619 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014620 .prepare_access = prepare_memory_access,
14621 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014622 },
14623
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014624 {
14625 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014626 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014627 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014628 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014629 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014630 .total_size = 256,
14631 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014632 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014633 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014634 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014635 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014636 .block_erasers =
14637 {
14638 {
14639 .eraseblocks = { {256 * 1024, 1} },
14640 .block_erase = erase_chip_block_jedec,
14641 }
14642 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014643 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014644 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014645 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014646 .prepare_access = prepare_memory_access,
14647 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014648 },
14649
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014650 {
14651 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014652 .name = "SST29LE010",
14653 .bustype = BUS_PARALLEL,
14654 .manufacture_id = SST_ID,
14655 .model_id = SST_SST29LE010,
14656 .total_size = 128,
14657 .page_size = 128,
14658 .feature_bits = FEATURE_LONG_RESET,
14659 .tested = TEST_UNTESTED,
14660 .probe = probe_jedec,
14661 .probe_timing = 10,
14662 .block_erasers =
14663 {
14664 {
14665 .eraseblocks = { {128 * 1024, 1} },
14666 .block_erase = erase_chip_block_jedec,
14667 }
14668 },
14669 .write = write_jedec,
14670 .read = read_memmapped,
14671 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014672 .prepare_access = prepare_memory_access,
14673 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014674 },
14675
14676 {
14677 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014678 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014679 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014680 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014681 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014682 .total_size = 256,
14683 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014684 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014685 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014686 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014687 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014688 .block_erasers =
14689 {
14690 {
14691 .eraseblocks = { {256 * 1024, 1} },
14692 .block_erase = erase_chip_block_jedec,
14693 }
14694 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014695 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014696 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014697 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014698 .prepare_access = prepare_memory_access,
14699 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014700 },
14701
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014702 {
14703 .vendor = "SST",
14704 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014705 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014706 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014707 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014708 .total_size = 128,
14709 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014710 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014711 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014712 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014713 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014714 .block_erasers =
14715 {
14716 {
14717 .eraseblocks = { {4 * 1024, 32} },
14718 .block_erase = erase_sector_jedec,
14719 }, {
14720 .eraseblocks = { {128 * 1024, 1} },
14721 .block_erase = erase_chip_block_jedec,
14722 }
14723 },
Sean Nelson35727f72010-01-28 23:55:12 +000014724 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014725 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014726 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014727 .prepare_access = prepare_memory_access,
14728 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014729 },
14730
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014731 {
14732 .vendor = "SST",
14733 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014734 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014735 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014736 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014737 .total_size = 256,
14738 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014739 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000014740 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014741 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014742 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014743 .block_erasers =
14744 {
14745 {
14746 .eraseblocks = { {4 * 1024, 64} },
14747 .block_erase = erase_sector_jedec,
14748 }, {
14749 .eraseblocks = { {256 * 1024, 1} },
14750 .block_erase = erase_chip_block_jedec,
14751 }
14752 },
Sean Nelson35727f72010-01-28 23:55:12 +000014753 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014754 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014755 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014756 .prepare_access = prepare_memory_access,
14757 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014758 },
14759
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014760 {
14761 .vendor = "SST",
14762 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014763 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014764 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014765 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014766 .total_size = 512,
14767 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014768 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000014769 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014770 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014771 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014772 .block_erasers =
14773 {
14774 {
14775 .eraseblocks = { {4 * 1024, 128} },
14776 .block_erase = erase_sector_jedec,
14777 }, {
14778 .eraseblocks = { {512 * 1024, 1} },
14779 .block_erase = erase_chip_block_jedec,
14780 }
14781 },
Sean Nelson35727f72010-01-28 23:55:12 +000014782 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014783 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014784 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014785 .prepare_access = prepare_memory_access,
14786 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014787 },
14788
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014789 {
14790 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014791 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014792 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014793 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014794 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014795 .total_size = 64,
14796 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014797 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000014798 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014799 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014800 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014801 .block_erasers =
14802 {
14803 {
14804 .eraseblocks = { {4 * 1024, 16} },
14805 .block_erase = erase_sector_jedec,
14806 }, {
14807 .eraseblocks = { {64 * 1024, 1} },
14808 .block_erase = erase_chip_block_jedec,
14809 }
14810 },
Sean Nelson35727f72010-01-28 23:55:12 +000014811 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014812 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014813 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014814 .prepare_access = prepare_memory_access,
14815 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014816 },
14817
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014818 {
14819 .vendor = "SST",
14820 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014821 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014822 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014823 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014824 .total_size = 128,
14825 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014826 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000014827 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014828 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014829 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014830 .block_erasers =
14831 {
14832 {
14833 .eraseblocks = { {4 * 1024, 32} },
14834 .block_erase = erase_sector_jedec,
14835 }, {
14836 .eraseblocks = { {128 * 1024, 1} },
14837 .block_erase = erase_chip_block_jedec,
14838 }
14839 },
Sean Nelson35727f72010-01-28 23:55:12 +000014840 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014841 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014842 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014843 .prepare_access = prepare_memory_access,
14844 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014845 },
14846
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014847 {
14848 .vendor = "SST",
14849 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014850 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014851 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014852 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014853 .total_size = 256,
14854 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014855 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014856 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014857 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014858 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014859 .block_erasers =
14860 {
14861 {
14862 .eraseblocks = { {4 * 1024, 64} },
14863 .block_erase = erase_sector_jedec,
14864 }, {
14865 .eraseblocks = { {256 * 1024, 1} },
14866 .block_erase = erase_chip_block_jedec,
14867 }
14868 },
Sean Nelson35727f72010-01-28 23:55:12 +000014869 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014870 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014871 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014872 .prepare_access = prepare_memory_access,
14873 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014874 },
14875
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014876 {
14877 .vendor = "SST",
14878 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014879 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014880 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014881 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014882 .total_size = 512,
14883 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014884 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014885 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014886 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014887 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014888 .block_erasers =
14889 {
14890 {
14891 .eraseblocks = { {4 * 1024, 128} },
14892 .block_erase = erase_sector_jedec,
14893 }, {
14894 .eraseblocks = { {512 * 1024, 1} },
14895 .block_erase = erase_chip_block_jedec,
14896 }
14897 },
Sean Nelson35727f72010-01-28 23:55:12 +000014898 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014899 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014900 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014901 .prepare_access = prepare_memory_access,
14902 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000014903 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014904
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014905 {
14906 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000014907 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014908 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014909 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014910 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000014911 .total_size = 1024,
14912 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014913 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000014914 .tested = TEST_UNTESTED,
14915 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014916 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014917 .block_erasers =
14918 {
14919 {
14920 .eraseblocks = { {4 * 1024, 256} },
14921 .block_erase = erase_sector_jedec,
14922 }, {
14923 .eraseblocks = { {64 * 1024, 16} },
14924 .block_erase = erase_block_jedec,
14925 }, {
14926 .eraseblocks = { {1024 * 1024, 1} },
14927 .block_erase = erase_chip_block_jedec,
14928 }
14929 },
Sean Nelson35727f72010-01-28 23:55:12 +000014930 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014931 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014932 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014933 .prepare_access = prepare_memory_access,
14934 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +000014935 },
14936
14937 {
14938 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014939 .name = "SST39VF512",
14940 .bustype = BUS_PARALLEL,
14941 .manufacture_id = SST_ID,
14942 .model_id = SST_SST39VF512,
14943 .total_size = 64,
14944 .page_size = 4096,
14945 .feature_bits = FEATURE_EITHER_RESET,
14946 .tested = TEST_OK_PREW,
14947 .probe = probe_jedec,
14948 .probe_timing = 1, /* 150 ns */
14949 .block_erasers =
14950 {
14951 {
14952 .eraseblocks = { {4 * 1024, 16} },
14953 .block_erase = erase_sector_jedec,
14954 }, {
14955 .eraseblocks = { {64 * 1024, 1} },
14956 .block_erase = erase_chip_block_jedec,
14957 }
14958 },
14959 .write = write_jedec_1,
14960 .read = read_memmapped,
14961 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014962 .prepare_access = prepare_memory_access,
14963 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014964 },
14965
14966 {
14967 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014968 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014969 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014970 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014971 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014972 .total_size = 256,
14973 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010014974 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014975 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014976 .probe = probe_jedec,
14977 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014978 .block_erasers =
14979 {
14980 {
14981 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014982 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014983 }, {
14984 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014985 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014986 }, {
14987 .eraseblocks = { {256 * 1024, 1} },
14988 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14989 }
14990 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014991 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014992 .unlock = unlock_sst_fwhub,
14993 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014994 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014995 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010014996 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010014997 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014998 },
14999
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015000 {
15001 .vendor = "SST",
15002 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015003 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015004 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015005 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015006 .total_size = 384,
15007 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015008 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000015009 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015010 .probe = probe_jedec,
15011 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015012 .block_erasers =
15013 {
15014 {
15015 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015016 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015017 }, {
15018 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015019 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015020 }, {
15021 .eraseblocks = { {384 * 1024, 1} },
15022 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15023 }
15024 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015025 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015026 .unlock = unlock_sst_fwhub,
15027 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015028 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015029 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015030 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015031 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015032 },
15033
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015034 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015035 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
15036 * and is only honored for 64k block erase, but not 4k sector erase.
15037 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015038 .vendor = "SST",
15039 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015040 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015041 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015042 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015043 .total_size = 512,
15044 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015045 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015046 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015047 .probe = probe_jedec,
15048 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015049 .block_erasers =
15050 {
15051 {
15052 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015053 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015054 }, {
15055 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015056 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015057 }, {
15058 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000015059 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015060 },
15061 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015062 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015063 .unlock = unlock_sst_fwhub,
15064 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015065 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015066 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015067 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015068 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015069 },
15070
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015071 {
15072 .vendor = "SST",
15073 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015074 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015075 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015076 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015077 .total_size = 512,
15078 .page_size = 4 * 1024,
15079 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015080 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015081 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015082 .block_erasers =
15083 {
15084 {
15085 .eraseblocks = { {4 * 1024, 128} },
15086 .block_erase = erase_sector_49lfxxxc,
15087 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015088 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015089 {64 * 1024, 7},
15090 {32 * 1024, 1},
15091 {8 * 1024, 2},
15092 {16 * 1024, 1},
15093 },
Sean Nelson69e58112010-03-23 17:10:28 +000015094 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015095 }
15096 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015097 .printlock = printlock_regspace2_block_eraser_1,
15098 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015099 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015100 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015101 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015102 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015103 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015104 },
15105
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015106 {
15107 .vendor = "SST",
15108 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015109 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015110 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015111 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015112 .total_size = 1024,
15113 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015114 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015115 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015116 .probe = probe_jedec,
15117 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015118 .block_erasers =
15119 {
15120 {
15121 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015122 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015123 }, {
15124 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015125 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015126 }, {
15127 .eraseblocks = { {1024 * 1024, 1} },
15128 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15129 }
15130 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015131 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015132 .unlock = unlock_sst_fwhub,
15133 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015134 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015135 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015136 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015137 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015138 },
15139
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015140 {
15141 .vendor = "SST",
15142 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015143 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015144 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015145 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015146 .total_size = 1024,
15147 .page_size = 4 * 1024,
15148 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015149 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015150 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015151 .block_erasers =
15152 {
15153 {
15154 .eraseblocks = { {4 * 1024, 256} },
15155 .block_erase = erase_sector_49lfxxxc,
15156 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015157 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015158 {64 * 1024, 15},
15159 {32 * 1024, 1},
15160 {8 * 1024, 2},
15161 {16 * 1024, 1},
15162 },
Sean Nelson69e58112010-03-23 17:10:28 +000015163 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015164 }
15165 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015166 .printlock = printlock_regspace2_block_eraser_1,
15167 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015168 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015169 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015170 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015171 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015172 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015173 },
15174
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015175 {
15176 .vendor = "SST",
15177 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015178 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015179 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015180 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015181 .total_size = 2048,
15182 .page_size = 4 * 1024,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015183 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015184 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015185 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015186 .block_erasers =
15187 {
15188 {
15189 .eraseblocks = { {4 * 1024, 512} },
15190 .block_erase = erase_sector_49lfxxxc,
15191 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015192 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015193 {64 * 1024, 31},
15194 {32 * 1024, 1},
15195 {8 * 1024, 2},
15196 {16 * 1024, 1},
15197 },
Sean Nelson69e58112010-03-23 17:10:28 +000015198 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015199 }
15200 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015201 .printlock = printlock_regspace2_block_eraser_1,
15202 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015203 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015204 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015205 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015206 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015207 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015208 },
15209
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015210 {
15211 .vendor = "SST",
15212 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015213 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015214 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015215 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015216 .total_size = 256,
15217 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015218 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000015219 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015220 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015221 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015222 .block_erasers =
15223 {
15224 {
15225 .eraseblocks = { {4 * 1024, 64} },
15226 .block_erase = erase_sector_jedec,
15227 }, {
15228 .eraseblocks = { {16 * 1024, 16} },
15229 .block_erase = erase_block_jedec,
15230 }, {
15231 .eraseblocks = { {256 * 1024, 1} },
15232 .block_erase = NULL,
15233 }
15234 },
Sean Nelson35727f72010-01-28 23:55:12 +000015235 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015236 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015237 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015238 .prepare_access = prepare_memory_access,
15239 .finish_access = finish_memory_access,
Sven Schnellec208dfb2009-01-07 12:35:09 +000015240 },
15241
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015242 {
15243 .vendor = "SST",
15244 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015245 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015246 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015247 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015248 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000015249 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015250 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015251 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015252 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015253 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015254 .block_erasers =
15255 {
15256 {
15257 .eraseblocks = { {4 * 1024, 64} },
15258 .block_erase = erase_sector_jedec,
15259 }, {
15260 .eraseblocks = { {16 * 1024, 16} },
15261 .block_erase = erase_block_jedec,
15262 }, {
15263 .eraseblocks = { {256 * 1024, 1} },
15264 .block_erase = NULL,
15265 }
15266 },
Sean Nelson35727f72010-01-28 23:55:12 +000015267 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015268 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015269 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015270 .prepare_access = prepare_memory_access,
15271 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015272 },
15273
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015274 {
15275 .vendor = "SST",
15276 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015277 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015278 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015279 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015280 .total_size = 512,
15281 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015282 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015283 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015284 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015285 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015286 .block_erasers =
15287 {
15288 {
15289 .eraseblocks = { {4 * 1024, 128} },
15290 .block_erase = erase_sector_jedec,
15291 }, {
15292 .eraseblocks = { {64 * 1024, 8} },
15293 .block_erase = erase_block_jedec,
15294 }, {
15295 .eraseblocks = { {512 * 1024, 1} },
15296 .block_erase = NULL,
15297 }
15298 },
Sean Nelson35727f72010-01-28 23:55:12 +000015299 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015300 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015301 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015302 .prepare_access = prepare_memory_access,
15303 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015304 },
15305
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015306 {
15307 .vendor = "SST",
15308 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015309 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015310 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015311 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015312 .total_size = 512,
15313 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015314 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015315 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015316 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015317 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015318 .block_erasers =
15319 {
15320 {
15321 .eraseblocks = { {4 * 1024, 128} },
15322 .block_erase = erase_sector_jedec,
15323 }, {
15324 .eraseblocks = { {64 * 1024, 8} },
15325 .block_erase = erase_block_jedec,
15326 }, {
15327 .eraseblocks = { {512 * 1024, 1} },
15328 .block_erase = NULL,
15329 }
15330 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015331 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000015332 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015333 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015334 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015335 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015336 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015337 },
15338
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015339 {
15340 .vendor = "SST",
15341 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015342 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015343 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020015344 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015345 .total_size = 1024,
15346 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015347 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000015348 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015349 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015350 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015351 .block_erasers =
15352 {
15353 {
15354 .eraseblocks = { {4 * 1024, 256} },
15355 .block_erase = erase_sector_jedec,
15356 }, {
15357 .eraseblocks = { {64 * 1024, 16} },
15358 .block_erase = erase_block_jedec,
15359 }, {
15360 .eraseblocks = { {1024 * 1024, 1} },
15361 .block_erase = NULL,
15362 }
15363 },
Sean Nelson35727f72010-01-28 23:55:12 +000015364 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015365 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015366 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015367 .prepare_access = prepare_memory_access,
15368 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015369 },
15370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015371 {
15372 .vendor = "SST",
15373 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015374 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015375 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015376 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015377 .total_size = 2048,
15378 .page_size = 4 * 1024,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015379 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015380 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015381 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015382 .block_erasers =
15383 {
15384 {
15385 .eraseblocks = { {4 * 1024, 512} },
15386 .block_erase = erase_sector_49lfxxxc,
15387 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015388 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015389 {64 * 1024, 31},
15390 {32 * 1024, 1},
15391 {8 * 1024, 2},
15392 {16 * 1024, 1},
15393 },
Sean Nelson69e58112010-03-23 17:10:28 +000015394 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015395 }
15396 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015397 .printlock = printlock_regspace2_block_eraser_1,
15398 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015399 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015401 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015402 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015403 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015404 },
15405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015406 {
15407 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015408 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015409 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015410 .manufacture_id = ST_ID,
15411 .model_id = ST_M29F002B,
15412 .total_size = 256,
15413 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015414 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015415 .tested = TEST_UNTESTED,
15416 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015417 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015418 .block_erasers =
15419 {
15420 {
15421 .eraseblocks = {
15422 {16 * 1024, 1},
15423 {8 * 1024, 2},
15424 {32 * 1024, 1},
15425 {64 * 1024, 3},
15426 },
15427 .block_erase = erase_sector_jedec,
15428 }, {
15429 .eraseblocks = { {256 * 1024, 1} },
15430 .block_erase = erase_chip_block_jedec,
15431 }
15432 },
Sean Nelson35727f72010-01-28 23:55:12 +000015433 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015434 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015435 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015436 .prepare_access = prepare_memory_access,
15437 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015438 },
15439
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015440 {
15441 .vendor = "ST",
15442 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015443 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015444 .manufacture_id = ST_ID,
15445 .model_id = ST_M29F002T,
15446 .total_size = 256,
15447 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015448 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015449 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015450 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015451 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015452 .block_erasers =
15453 {
15454 {
15455 .eraseblocks = {
15456 {64 * 1024, 3},
15457 {32 * 1024, 1},
15458 {8 * 1024, 2},
15459 {16 * 1024, 1},
15460 },
15461 .block_erase = erase_sector_jedec,
15462 }, {
15463 .eraseblocks = { {256 * 1024, 1} },
15464 .block_erase = erase_chip_block_jedec,
15465 }
15466 },
Sean Nelson35727f72010-01-28 23:55:12 +000015467 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015468 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015469 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015470 .prepare_access = prepare_memory_access,
15471 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015472 },
15473
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015474 {
15475 .vendor = "ST",
15476 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015477 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015478 .manufacture_id = ST_ID,
15479 .model_id = ST_M29F040B,
15480 .total_size = 512,
15481 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015482 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
15483 .tested = TEST_UNTESTED,
15484 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000015485 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000015486 .block_erasers =
15487 {
15488 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015489 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000015490 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015491 }, {
15492 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000015493 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015494 }
15495 },
Sean Nelson35727f72010-01-28 23:55:12 +000015496 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015497 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015498 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015499 .prepare_access = prepare_memory_access,
15500 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015501 },
15502
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015503 {
Sean Nelson35727f72010-01-28 23:55:12 +000015504 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015505 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015506 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015507 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015508 .manufacture_id = ST_ID,
15509 .model_id = ST_M29F400BB,
15510 .total_size = 512,
15511 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015512 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015513 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015514 .probe = probe_jedec,
15515 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015516 .block_erasers =
15517 {
15518 {
15519 .eraseblocks = {
15520 {16 * 1024, 1},
15521 {8 * 1024, 2},
15522 {32 * 1024, 1},
15523 {64 * 1024, 7},
15524 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015525 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015526 }, {
15527 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015528 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015529 }
15530 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015531 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015532 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015533 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015534 .prepare_access = prepare_memory_access,
15535 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015536 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100015537
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015538 {
15539 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
15540 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015541 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015542 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015543 .manufacture_id = ST_ID,
15544 .model_id = ST_M29F400BT,
15545 .total_size = 512,
15546 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015547 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015548 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015549 .probe = probe_jedec,
15550 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000015551 .block_erasers =
15552 {
15553 {
15554 .eraseblocks = {
15555 {64 * 1024, 7},
15556 {32 * 1024, 1},
15557 {8 * 1024, 2},
15558 {16 * 1024, 1},
15559 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015560 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015561 }, {
15562 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015563 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015564 }
15565 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015566 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015567 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015568 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015569 .prepare_access = prepare_memory_access,
15570 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015571 },
15572
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015573 {
15574 .vendor = "ST",
15575 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015576 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015577 .manufacture_id = ST_ID,
15578 .model_id = ST_M29W010B,
15579 .total_size = 128,
15580 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015581 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015582 .tested = TEST_UNTESTED,
15583 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015584 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015585 .block_erasers =
15586 {
15587 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015588 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015589 .block_erase = erase_sector_jedec,
15590 }, {
15591 .eraseblocks = { {128 * 1024, 1} },
15592 .block_erase = erase_chip_block_jedec,
15593 }
15594 },
Sean Nelson35727f72010-01-28 23:55:12 +000015595 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015596 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015597 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015598 .prepare_access = prepare_memory_access,
15599 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015600 },
15601
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015602 {
15603 .vendor = "ST",
15604 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015605 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015606 .manufacture_id = ST_ID,
15607 .model_id = ST_M29W040B,
15608 .total_size = 512,
15609 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015610 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015611 .tested = TEST_UNTESTED,
15612 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015613 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015614 .block_erasers =
15615 {
15616 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015617 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015618 .block_erase = erase_sector_jedec,
15619 }, {
15620 .eraseblocks = { {512 * 1024, 1} },
15621 .block_erase = erase_chip_block_jedec,
15622 }
15623 },
Sean Nelson35727f72010-01-28 23:55:12 +000015624 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015625 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015626 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015627 .prepare_access = prepare_memory_access,
15628 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015629 },
15630
Stefan Taunereb582572012-09-21 12:52:50 +000015631 {
15632 .vendor = "ST",
15633 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015634 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100015635 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000015636 .model_id = ST_M29W512B,
15637 .total_size = 64,
15638 .page_size = 64 * 1024,
15639 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015640 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000015641 .probe = probe_jedec,
15642 .probe_timing = TIMING_ZERO,
15643 .block_erasers =
15644 {
15645 {
15646 .eraseblocks = { {64 * 1024, 1} },
15647 .block_erase = erase_chip_block_jedec,
15648 }
15649 },
15650 .write = write_jedec_1,
15651 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015652 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015653 .prepare_access = prepare_memory_access,
15654 .finish_access = finish_memory_access,
Stefan Taunereb582572012-09-21 12:52:50 +000015655 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000015656
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015657 {
15658 .vendor = "ST",
15659 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015660 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015661 .manufacture_id = ST_ID,
15662 .model_id = ST_M50FLW040A,
15663 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015664 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015665 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015666 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015667 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015668 .block_erasers =
15669 {
15670 {
Sean Nelson329bde72010-01-19 16:39:19 +000015671 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015672 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015673 {64 * 1024, 5}, /* block */
15674 {4 * 1024, 16}, /* sector */
15675 {4 * 1024, 16}, /* sector */
15676 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015677 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015678 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015679 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015680 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015681 }
15682 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015683 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015684 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015685 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015686 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015687 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015688 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015689 },
15690
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015691 {
15692 .vendor = "ST",
15693 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015694 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015695 .manufacture_id = ST_ID,
15696 .model_id = ST_M50FLW040B,
15697 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015698 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015699 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015700 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015701 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015702 .block_erasers =
15703 {
15704 {
Sean Nelson329bde72010-01-19 16:39:19 +000015705 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015706 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015707 {4 * 1024, 16}, /* sector */
15708 {64 * 1024, 5}, /* block */
15709 {4 * 1024, 16}, /* sector */
15710 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015711 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015712 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015713 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015714 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015715 }
15716 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015717 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015718 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015719 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015720 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015721 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015722 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015723 },
15724
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015725 {
15726 .vendor = "ST",
15727 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015728 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015729 .manufacture_id = ST_ID,
15730 .model_id = ST_M50FLW080A,
15731 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015732 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015733 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015734 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015735 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015736 .block_erasers =
15737 {
15738 {
Sean Nelson329bde72010-01-19 16:39:19 +000015739 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015740 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015741 {64 * 1024, 13}, /* block */
15742 {4 * 1024, 16}, /* sector */
15743 {4 * 1024, 16}, /* sector */
15744 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015745 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015746 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015747 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015748 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015749 }
15750 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015751 .printlock = printlock_regspace2_block_eraser_0,
15752 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015753 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015754 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015755 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015756 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015757 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015758 },
15759
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015760 {
15761 .vendor = "ST",
15762 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015763 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015764 .manufacture_id = ST_ID,
15765 .model_id = ST_M50FLW080B,
15766 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015767 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015768 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015769 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015770 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015771 .block_erasers =
15772 {
15773 {
Sean Nelson329bde72010-01-19 16:39:19 +000015774 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015775 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015776 {4 * 1024, 16}, /* sector */
15777 {64 * 1024, 13}, /* block */
15778 {4 * 1024, 16}, /* sector */
15779 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015780 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015781 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015782 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015783 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015784 }
15785 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015786 .printlock = printlock_regspace2_block_eraser_0,
15787 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015788 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015789 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015790 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015791 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015792 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015793 },
15794
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015795 {
15796 .vendor = "ST",
15797 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015798 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015799 .manufacture_id = ST_ID,
15800 .model_id = ST_M50FW002,
15801 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000015802 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015803 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015804 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015805 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015806 .block_erasers =
15807 {
15808 {
15809 .eraseblocks = {
15810 {64 * 1024, 3},
15811 {32 * 1024, 1},
15812 {8 * 1024, 2},
15813 {16 * 1024, 1},
15814 },
Sean Nelson28accc22010-03-19 18:47:06 +000015815 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015816 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000015817 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015818 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000015819 }
15820 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015821 .printlock = printlock_regspace2_block_eraser_0,
15822 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015823 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015824 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015825 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015826 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015827 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015828 },
15829
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015830 {
15831 .vendor = "ST",
15832 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015833 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015834 .manufacture_id = ST_ID,
15835 .model_id = ST_M50FW016,
15836 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015837 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015838 .tested = TEST_UNTESTED,
15839 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015840 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015841 .block_erasers =
15842 {
15843 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015844 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000015845 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015846 }
15847 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015848 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015849 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015850 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015851 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015852 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015853 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015854 },
15855
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015856 {
15857 .vendor = "ST",
15858 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015859 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015860 .manufacture_id = ST_ID,
15861 .model_id = ST_M50FW040,
15862 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015863 .page_size = 0,
Sean Nelson28accc22010-03-19 18:47:06 +000015864 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015865 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015866 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015867 .block_erasers =
15868 {
15869 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015870 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015871 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015872 }
15873 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015874 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015875 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015876 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015877 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015878 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015879 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015880 },
15881
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015882 {
15883 .vendor = "ST",
15884 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015885 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015886 .manufacture_id = ST_ID,
15887 .model_id = ST_M50FW080,
15888 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015889 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015890 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015891 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015892 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015893 .block_erasers =
15894 {
15895 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015896 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015897 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015898 }
15899 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015900 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015901 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015902 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015903 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015904 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015905 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015906 },
15907
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015908 {
15909 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015910 .name = "M50LPW080",
15911 .bustype = BUS_LPC, /* A/A Mux */
15912 .manufacture_id = ST_ID,
15913 .model_id = ST_M50LPW080,
15914 .total_size = 1024,
15915 .page_size = 0,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015916 .tested = TEST_UNTESTED,
15917 .probe = probe_82802ab,
15918 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15919 .block_erasers =
15920 {
15921 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015922 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015923 .block_erase = erase_block_82802ab,
15924 }
15925 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015926 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015927 .write = write_82802ab,
15928 .read = read_memmapped,
15929 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015930 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015931 .finish_access = finish_memory_access,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015932 },
15933
15934 {
15935 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015936 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015937 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015938 .manufacture_id = ST_ID,
15939 .model_id = ST_M50LPW116,
15940 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015941 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015942 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015943 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000015944 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015945 .block_erasers =
15946 {
15947 {
15948 .eraseblocks = {
15949 {4 * 1024, 16},
15950 {64 * 1024, 30},
15951 {32 * 1024, 1},
15952 {8 * 1024, 2},
15953 {16 * 1024, 1},
15954 },
Sean Nelson28accc22010-03-19 18:47:06 +000015955 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015956 }
15957 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015958 .printlock = printlock_regspace2_block_eraser_0,
15959 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015960 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015961 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015962 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015963 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015964 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015965 },
15966
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015967 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030015968 .vendor = "ST",
15969 .name = "M95M02",
15970 .bustype = BUS_SPI,
15971 .manufacture_id = ST_ID,
15972 .model_id = ST_M95M02,
15973 .total_size = 256,
15974 .page_size = 256,
15975 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
15976 .tested = TEST_OK_PREW,
Nico Huber54557862023-05-15 12:01:04 +020015977 .spi_cmd_set = SPI95,
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030015978 .probe = probe_spi_st95,
15979 .probe_timing = TIMING_ZERO,
15980 .block_erasers =
15981 {
15982 {
15983 .eraseblocks = { {256 * 1024, 1} },
15984 .block_erase = spi_block_erase_emulation,
15985 }
15986 },
15987
15988 .printlock = spi_prettyprint_status_register_bp1_srwd,
15989 .unlock = spi_disable_blockprotect_bp1_srwd,
15990 .write = spi_chip_write_256,
15991 .read = spi_chip_read,
15992 .voltage = {2500, 5500},
15993 },
15994
15995 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015996 .vendor = "Sanyo",
15997 .name = "LE25FU106B",
15998 .bustype = BUS_SPI,
15999 .manufacture_id = SANYO_ID,
16000 .model_id = SANYO_LE25FU106B,
16001 .total_size = 128,
16002 .page_size = 256,
16003 .feature_bits = FEATURE_WRSR_WREN,
16004 .tested = TEST_UNTESTED,
16005 .probe = probe_spi_res2,
16006 .probe_timing = TIMING_ZERO,
16007 .block_erasers =
16008 {
16009 /* FIXME: Is this correct?
16010 {
16011 .eraseblocks = { {2 * 1024, 64} },
16012 .block_erase = spi_block_erase_d7,
16013 },*/
16014 {
16015 .eraseblocks = { {32 * 1024, 4} },
16016 .block_erase = spi_block_erase_d8,
16017 }, {
16018 .eraseblocks = { {128 * 1024, 1} },
16019 .block_erase = spi_block_erase_c7,
16020 }
16021 },
16022 .printlock = spi_prettyprint_status_register_bp1_srwd,
16023 .unlock = spi_disable_blockprotect_bp1_srwd,
16024 .write = spi_chip_write_256,
16025 .read = spi_chip_read,
16026 .voltage = {2300, 3600},
16027 },
16028
16029 {
16030 .vendor = "Sanyo",
16031 .name = "LE25FU206",
16032 .bustype = BUS_SPI,
16033 .manufacture_id = SANYO_ID,
16034 .model_id = SANYO_LE25FU206,
16035 .total_size = 256,
16036 .page_size = 256,
16037 .feature_bits = FEATURE_WRSR_WREN,
16038 .tested = TEST_UNTESTED,
16039 .probe = probe_spi_res2,
16040 .probe_timing = TIMING_ZERO,
16041 .block_erasers =
16042 {
16043 {
16044 .eraseblocks = { {4 * 1024, 64} },
16045 .block_erase = spi_block_erase_d7,
16046 }, {
16047 .eraseblocks = { {64 * 1024, 4} },
16048 .block_erase = spi_block_erase_d8,
16049 }, {
16050 .eraseblocks = { {256 * 1024, 1} },
16051 .block_erase = spi_block_erase_c7,
16052 }
16053 },
16054 .printlock = spi_prettyprint_status_register_bp1_srwd,
16055 .unlock = spi_disable_blockprotect_bp1_srwd,
16056 .write = spi_chip_write_256,
16057 .read = spi_chip_read,
16058 .voltage = {2300, 3600},
16059 },
16060
16061 {
16062 .vendor = "Sanyo",
16063 .name = "LE25FU206A",
16064 .bustype = BUS_SPI,
16065 .manufacture_id = SANYO_ID,
16066 .model_id = SANYO_LE25FU206A,
16067 .total_size = 256,
16068 .page_size = 256,
16069 .tested = TEST_UNTESTED,
16070 .probe = probe_spi_rdid,
16071 .probe_timing = TIMING_ZERO,
16072 .block_erasers =
16073 {
16074 {
16075 .eraseblocks = { {4 * 1024, 64} },
16076 .block_erase = spi_block_erase_20,
16077 }, {
16078 .eraseblocks = { {4 * 1024, 64} },
16079 .block_erase = spi_block_erase_d7,
16080 }, {
16081 .eraseblocks = { {64 * 1024, 4} },
16082 .block_erase = spi_block_erase_d8,
16083 }, {
16084 .eraseblocks = { {256 * 1024, 1} },
16085 .block_erase = spi_block_erase_60,
16086 }, {
16087 .eraseblocks = { {256 * 1024, 1} },
16088 .block_erase = spi_block_erase_c7,
16089 }
16090 },
16091 .printlock = spi_prettyprint_status_register_bp2_srwd,
16092 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16093 .write = spi_chip_write_256,
16094 .read = spi_chip_read,
16095 .voltage = {2300, 3600},
16096 },
16097
16098 {
16099 .vendor = "Sanyo",
16100 .name = "LE25FU406B",
16101 .bustype = BUS_SPI,
16102 .manufacture_id = SANYO_ID,
16103 .model_id = SANYO_LE25FU406B,
16104 .total_size = 512,
16105 .page_size = 256,
16106 .feature_bits = FEATURE_WRSR_WREN,
16107 .tested = TEST_OK_PREW,
16108 .probe = probe_spi_res2,
16109 .probe_timing = TIMING_ZERO,
16110 .block_erasers =
16111 {
16112 {
16113 .eraseblocks = { {4 * 1024, 128} },
16114 .block_erase = spi_block_erase_d7,
16115 }, {
16116 .eraseblocks = { {64 * 1024, 8} },
16117 .block_erase = spi_block_erase_d8,
16118 }, {
16119 .eraseblocks = { {512 * 1024, 1} },
16120 .block_erase = spi_block_erase_c7,
16121 }
16122 },
16123 .printlock = spi_prettyprint_status_register_bp2_srwd,
16124 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16125 .write = spi_chip_write_256,
16126 .read = spi_chip_read,
16127 .voltage = {2300, 3600},
16128 },
16129
16130 {
16131 .vendor = "Sanyo",
16132 .name = "LE25FU406C/LE25U40CMC",
16133 .bustype = BUS_SPI,
16134 .manufacture_id = SANYO_ID,
16135 .model_id = SANYO_LE25FU406C,
16136 .total_size = 512,
16137 .page_size = 256,
16138 .feature_bits = FEATURE_WRSR_WREN,
16139 .tested = TEST_OK_PREW,
16140 .probe = probe_spi_rdid,
16141 .probe_timing = TIMING_ZERO,
16142 .block_erasers =
16143 {
16144 {
16145 .eraseblocks = { {4 * 1024, 128} },
16146 .block_erase = spi_block_erase_20,
16147 }, {
16148 .eraseblocks = { {4 * 1024, 128} },
16149 .block_erase = spi_block_erase_d7,
16150 }, {
16151 .eraseblocks = { {64 * 1024, 8} },
16152 .block_erase = spi_block_erase_d8,
16153 }, {
16154 .eraseblocks = { {512 * 1024, 1} },
16155 .block_erase = spi_block_erase_60,
16156 }, {
16157 .eraseblocks = { {512 * 1024, 1} },
16158 .block_erase = spi_block_erase_c7,
16159 }
16160 },
16161 .printlock = spi_prettyprint_status_register_bp2_srwd,
16162 .unlock = spi_disable_blockprotect_bp2_srwd,
16163 .write = spi_chip_write_256,
16164 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
16165 .voltage = {2300, 3600},
16166 },
16167
16168 {
16169 .vendor = "Sanyo",
16170 .name = "LE25FW106",
16171 .bustype = BUS_SPI,
16172 .manufacture_id = SANYO_ID,
16173 .model_id = SANYO_LE25FW106,
16174 .total_size = 128,
16175 .page_size = 256,
16176 .feature_bits = FEATURE_WRSR_WREN,
16177 .tested = TEST_OK_PREW,
16178 .probe = probe_spi_res2,
16179 .probe_timing = TIMING_ZERO,
16180 .block_erasers =
16181 {
16182 {
16183 .eraseblocks = { {2 * 1024, 64} },
16184 .block_erase = spi_block_erase_d7,
16185 }, {
16186 .eraseblocks = { {32 * 1024, 4} },
16187 .block_erase = spi_block_erase_d8,
16188 }, {
16189 .eraseblocks = { {128 * 1024, 1} },
16190 .block_erase = spi_block_erase_c7,
16191 }
16192 },
16193 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
16194 .unlock = spi_disable_blockprotect_bp1_srwd,
16195 .write = spi_chip_write_256,
16196 .read = spi_chip_read,
16197 .voltage = {2700, 3600},
16198 },
16199
16200 {
16201 .vendor = "Sanyo",
16202 .name = "LE25FW203A",
16203 .bustype = BUS_SPI,
16204 .manufacture_id = SANYO_ID,
16205 .model_id = SANYO_LE25FW203A,
16206 .total_size = 256,
16207 .page_size = 256,
16208 .tested = TEST_UNTESTED,
16209 .probe = probe_spi_rdid,
16210 .probe_timing = TIMING_ZERO,
16211 .block_erasers =
16212 {
16213 {
16214 .eraseblocks = { {256, 1024} },
16215 .block_erase = spi_block_erase_db,
16216 }, {
16217 .eraseblocks = { {64 * 1024, 4} },
16218 .block_erase = spi_block_erase_d8,
16219 }, {
16220 .eraseblocks = { {256 * 1024, 1} },
16221 .block_erase = spi_block_erase_c7,
16222 }
16223 },
16224 .printlock = spi_prettyprint_status_register_default_welwip,
16225 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16226 .write = spi_chip_write_256,
16227 .read = spi_chip_read,
16228 .voltage = {2700, 3600},
16229 },
16230
16231 {
16232 .vendor = "Sanyo",
16233 .name = "LE25FW403A",
16234 .bustype = BUS_SPI,
16235 .manufacture_id = SANYO_ID,
16236 .model_id = SANYO_LE25FW403A,
16237 .total_size = 512,
16238 .page_size = 256,
16239 .tested = TEST_UNTESTED,
16240 .probe = probe_spi_rdid,
16241 .probe_timing = TIMING_ZERO,
16242 .block_erasers =
16243 {
16244 {
16245 .eraseblocks = { {256, 2 * 1024} },
16246 .block_erase = spi_block_erase_db,
16247 }, {
16248 .eraseblocks = { {64 * 1024, 8} },
16249 .block_erase = spi_block_erase_d8,
16250 }, {
16251 .eraseblocks = { {512 * 1024, 1} },
16252 .block_erase = spi_block_erase_c7,
16253 }
16254 },
16255 .printlock = spi_prettyprint_status_register_default_welwip,
16256 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16257 .write = spi_chip_write_256,
16258 .read = spi_chip_read,
16259 .voltage = {2700, 3600},
16260 },
16261
16262 {
16263 .vendor = "Sanyo",
16264 .name = "LE25FW406A",
16265 .bustype = BUS_SPI,
16266 .manufacture_id = SANYO_ID,
16267 .model_id = SANYO_LE25FW406A,
16268 .total_size = 512,
16269 .page_size = 256,
16270 .feature_bits = FEATURE_WRSR_WREN,
16271 .tested = TEST_OK_PREW,
16272 .probe = probe_spi_res2,
16273 .probe_timing = TIMING_ZERO,
16274 .block_erasers =
16275 {
16276 {
16277 .eraseblocks = { {4 * 1024, 128} },
16278 .block_erase = spi_block_erase_d7,
16279 }, {
16280 .eraseblocks = { {64 * 1024, 8} },
16281 .block_erase = spi_block_erase_d8,
16282 }, {
16283 .eraseblocks = { {512 * 1024, 1} },
16284 .block_erase = spi_block_erase_c7,
16285 }
16286 },
16287 .printlock = spi_prettyprint_status_register_plain,
16288 .unlock = spi_disable_blockprotect,
16289 .write = spi_chip_write_256,
16290 .read = spi_chip_read,
16291 .voltage = {2700, 3600},
16292 },
16293
16294 {
16295 .vendor = "Sanyo",
16296 .name = "LE25FW418A",
16297 .bustype = BUS_SPI,
16298 .manufacture_id = SANYO_ID,
16299 .model_id = SANYO_LE25FW418A,
16300 .total_size = 512,
16301 .page_size = 256,
16302 .feature_bits = FEATURE_WRSR_WREN,
16303 .tested = TEST_UNTESTED,
16304 .probe = probe_spi_res2,
16305 .probe_timing = TIMING_ZERO,
16306 .block_erasers =
16307 {
16308 {
16309 .eraseblocks = { {4 * 1024, 128} },
16310 .block_erase = spi_block_erase_d7,
16311 }, {
16312 .eraseblocks = { {64 * 1024, 8} },
16313 .block_erase = spi_block_erase_d8,
16314 }, {
16315 .eraseblocks = { {512 * 1024, 1} },
16316 .block_erase = spi_block_erase_c7,
16317 }
16318 },
16319 .printlock = spi_prettyprint_status_register_bp2_srwd,
16320 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16321 .write = spi_chip_write_256,
16322 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16323 .voltage = {2700, 3600},
16324 },
16325
16326 {
16327 .vendor = "Sanyo",
16328 .name = "LE25FW806",
16329 .bustype = BUS_SPI,
16330 .manufacture_id = SANYO_ID,
16331 .model_id = SANYO_LE25FW806,
16332 .total_size = 1024,
16333 .page_size = 256,
16334 .feature_bits = FEATURE_WRSR_WREN,
16335 .tested = TEST_UNTESTED,
16336 .probe = probe_spi_res2,
16337 .probe_timing = TIMING_ZERO,
16338 .block_erasers =
16339 {
16340 {
16341 .eraseblocks = { {4 * 1024, 256} },
16342 .block_erase = spi_block_erase_20,
16343 }, {
16344 .eraseblocks = { {4 * 1024, 256} },
16345 .block_erase = spi_block_erase_d7,
16346 }, {
16347 .eraseblocks = { {64 * 1024, 16} },
16348 .block_erase = spi_block_erase_d8,
16349 }, {
16350 .eraseblocks = { {1024 * 1024, 1} },
16351 .block_erase = spi_block_erase_c7,
16352 }
16353 },
16354 .printlock = spi_prettyprint_status_register_bp2_srwd,
16355 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16356 .write = spi_chip_write_256,
16357 .read = spi_chip_read,
16358 .voltage = {2700, 3600},
16359 },
16360
16361 {
16362 .vendor = "Sanyo",
16363 .name = "LE25FW808",
16364 .bustype = BUS_SPI,
16365 .manufacture_id = SANYO_ID,
16366 .model_id = SANYO_LE25FW808,
16367 .total_size = 1024,
16368 .page_size = 256,
16369 .feature_bits = FEATURE_WRSR_WREN,
16370 .tested = TEST_UNTESTED,
16371 .probe = probe_spi_res2,
16372 .probe_timing = TIMING_ZERO,
16373 .block_erasers =
16374 {
16375 {
16376 .eraseblocks = { {8 * 1024, 128} },
16377 .block_erase = spi_block_erase_d7,
16378 }, {
16379 .eraseblocks = { {64 * 1024, 16} },
16380 .block_erase = spi_block_erase_d8,
16381 }, {
16382 .eraseblocks = { {1024 * 1024, 1} },
16383 .block_erase = spi_block_erase_c7,
16384 }
16385 },
16386 .printlock = spi_prettyprint_status_register_bp2_srwd,
16387 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16388 .write = spi_chip_write_256,
16389 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16390 .voltage = {2700, 3600},
16391 },
16392
16393 {
16394 .vendor = "Sharp",
16395 .name = "LH28F008BJT-BTLZ1",
16396 .bustype = BUS_PARALLEL,
16397 .manufacture_id = SHARP_ID,
16398 .model_id = SHARP_LH28F008BJ__PB,
16399 .total_size = 1024,
16400 .page_size = 64 * 1024,
16401 .tested = TEST_OK_PREW,
16402 .probe = probe_82802ab,
16403 .probe_timing = TIMING_ZERO,
16404 .block_erasers =
16405 {
16406 {
16407 .eraseblocks = {
16408 {8 * 1024, 8},
16409 {64 * 1024, 15}
16410 },
16411 .block_erase = erase_block_82802ab,
16412 }, {
16413 .eraseblocks = { {1024 * 1024, 1} },
16414 .block_erase = erase_sector_49lfxxxc,
16415 }
16416 },
16417 .unlock = unlock_lh28f008bjt,
16418 .write = write_82802ab,
16419 .read = read_memmapped,
16420 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016421 .prepare_access = prepare_memory_access,
16422 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016423 },
16424
16425 {
16426 .vendor = "Sharp",
16427 .name = "LHF00L04",
16428 .bustype = BUS_FWH, /* A/A Mux */
16429 .manufacture_id = SHARP_ID,
16430 .model_id = SHARP_LHF00L04,
16431 .total_size = 1024,
16432 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010016433 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016434 .tested = TEST_UNTESTED,
16435 .probe = probe_82802ab,
16436 .probe_timing = TIMING_ZERO,
16437 .block_erasers =
16438 {
16439 {
16440 .eraseblocks = {
16441 {64 * 1024, 15},
16442 {8 * 1024, 8}
16443 },
16444 .block_erase = erase_block_82802ab,
16445 }, {
16446 .eraseblocks = {
16447 {1024 * 1024, 1}
16448 },
16449 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
16450 },
16451 },
16452 .unlock = unlock_regspace2_uniform_64k,
16453 .write = write_82802ab,
16454 .read = read_memmapped,
16455 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016456 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016457 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016458 },
16459
16460 {
16461 .vendor = "Spansion",
16462 .name = "S25FL004A",
16463 .bustype = BUS_SPI,
16464 .manufacture_id = SPANSION_ID,
16465 .model_id = SPANSION_S25FL004A,
16466 .total_size = 512,
16467 .page_size = 256,
16468 .feature_bits = FEATURE_WRSR_WREN,
16469 .tested = TEST_UNTESTED,
16470 .probe = probe_spi_rdid,
16471 .probe_timing = TIMING_ZERO,
16472 .block_erasers =
16473 {
16474 {
16475 .eraseblocks = { {64 * 1024, 8} },
16476 .block_erase = spi_block_erase_d8,
16477 }, {
16478 .eraseblocks = { {512 * 1024, 1} },
16479 .block_erase = spi_block_erase_c7,
16480 }
16481 },
16482 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16483 .unlock = spi_disable_blockprotect,
16484 .write = spi_chip_write_256,
16485 .read = spi_chip_read,
16486 .voltage = {2700, 3600},
16487 },
16488
16489 {
16490 .vendor = "Spansion",
16491 .name = "S25FL008A",
16492 .bustype = BUS_SPI,
16493 .manufacture_id = SPANSION_ID,
16494 .model_id = SPANSION_S25FL008A,
16495 .total_size = 1024,
16496 .page_size = 256,
16497 .feature_bits = FEATURE_WRSR_WREN,
16498 .tested = TEST_OK_PRE,
16499 .probe = probe_spi_rdid,
16500 .probe_timing = TIMING_ZERO,
16501 .block_erasers =
16502 {
16503 {
16504 .eraseblocks = { {64 * 1024, 16} },
16505 .block_erase = spi_block_erase_d8,
16506 }, {
16507 .eraseblocks = { {1024 * 1024, 1} },
16508 .block_erase = spi_block_erase_c7,
16509 }
16510 },
16511 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16512 .unlock = spi_disable_blockprotect,
16513 .write = spi_chip_write_256,
16514 .read = spi_chip_read,
16515 .voltage = {2700, 3600},
16516 },
16517
16518 {
16519 .vendor = "Spansion",
16520 .name = "S25FL016A",
16521 .bustype = BUS_SPI,
16522 .manufacture_id = SPANSION_ID,
16523 .model_id = SPANSION_S25FL016A,
16524 .total_size = 2048,
16525 .page_size = 256,
16526 .feature_bits = FEATURE_WRSR_WREN,
16527 .tested = TEST_OK_PREW,
16528 .probe = probe_spi_rdid,
16529 .probe_timing = TIMING_ZERO,
16530 .block_erasers =
16531 {
16532 {
16533 .eraseblocks = { {64 * 1024, 32} },
16534 .block_erase = spi_block_erase_d8,
16535 }, {
16536 .eraseblocks = { {2 * 1024 * 1024, 1} },
16537 .block_erase = spi_block_erase_c7,
16538 }
16539 },
16540 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16541 .unlock = spi_disable_blockprotect,
16542 .write = spi_chip_write_256,
16543 .read = spi_chip_read,
16544 .voltage = {2700, 3600},
16545 },
16546
16547 {
16548 .vendor = "Spansion",
16549 .name = "S25FL032A/P",
16550 .bustype = BUS_SPI,
16551 .manufacture_id = SPANSION_ID,
16552 .model_id = SPANSION_S25FL032A,
16553 .total_size = 4096,
16554 .page_size = 256,
16555 .feature_bits = FEATURE_WRSR_WREN,
16556 .tested = TEST_OK_PREW,
16557 .probe = probe_spi_rdid,
16558 .probe_timing = TIMING_ZERO,
16559 .block_erasers =
16560 {
16561 {
16562 .eraseblocks = { {64 * 1024, 64} },
16563 .block_erase = spi_block_erase_d8,
16564 }, {
16565 .eraseblocks = { {4 * 1024 * 1024, 1} },
16566 .block_erase = spi_block_erase_c7,
16567 }
16568 },
16569 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16570 .unlock = spi_disable_blockprotect,
16571 .write = spi_chip_write_256,
16572 .read = spi_chip_read,
16573 .voltage = {2700, 3600},
16574 },
16575
16576 {
16577 .vendor = "Spansion",
16578 .name = "S25FL064A/P",
16579 .bustype = BUS_SPI,
16580 .manufacture_id = SPANSION_ID,
16581 .model_id = SPANSION_S25FL064A,
16582 .total_size = 8192,
16583 .page_size = 256,
16584 .feature_bits = FEATURE_WRSR_WREN,
16585 .tested = TEST_OK_PREW,
16586 .probe = probe_spi_rdid,
16587 .probe_timing = TIMING_ZERO,
16588 .block_erasers =
16589 {
16590 {
16591 .eraseblocks = { {64 * 1024, 128} },
16592 .block_erase = spi_block_erase_d8,
16593 }, {
16594 .eraseblocks = { {8 * 1024 * 1024, 1} },
16595 .block_erase = spi_block_erase_c7,
16596 }
16597 },
16598 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16599 .unlock = spi_disable_blockprotect,
16600 .write = spi_chip_write_256,
16601 .read = spi_chip_read,
16602 .voltage = {2700, 3600},
16603 },
16604
16605 {
16606 .vendor = "Spansion",
16607 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
16608 .bustype = BUS_SPI,
16609 .manufacture_id = SPANSION_ID,
16610 .model_id = SPANSION_S25FL216,
16611 .total_size = 2048,
16612 .page_size = 256,
16613 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
16614 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16615 .tested = TEST_UNTESTED,
16616 .probe = probe_spi_rdid,
16617 .probe_timing = TIMING_ZERO,
16618 .block_erasers =
16619 {
16620 {
16621 .eraseblocks = { {4 * 1024, 512} },
16622 .block_erase = spi_block_erase_20,
16623 }, {
16624 .eraseblocks = { {64 * 1024, 32} },
16625 .block_erase = spi_block_erase_d8,
16626 }, {
16627 .eraseblocks = { { 2048 * 1024, 1} },
16628 .block_erase = spi_block_erase_60,
16629 }, {
16630 .eraseblocks = { { 2048 * 1024, 1} },
16631 .block_erase = spi_block_erase_c7,
16632 }
16633 },
16634 .printlock = spi_prettyprint_status_register_bp3_srwd,
16635 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16636 .write = spi_chip_write_256,
16637 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16638 .voltage = {2700, 3600},
16639 },
16640
16641 {
16642 .vendor = "Spansion",
16643 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
16644 .bustype = BUS_SPI,
16645 .manufacture_id = SPANSION_ID,
16646 .model_id = SPANSION_S25FL128,
16647 .total_size = 16384,
16648 .page_size = 512,
16649 /* supports 4B addressing */
16650 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16651 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16652 .tested = TEST_UNTESTED,
16653 .probe = probe_spi_rdid,
16654 .probe_timing = TIMING_ZERO,
16655 .block_erasers =
16656 {
16657 {
16658 .eraseblocks = { {256 * 1024, 64} },
16659 .block_erase = spi_block_erase_d8,
16660 }, {
16661 .eraseblocks = { { 16384 * 1024, 1} },
16662 .block_erase = spi_block_erase_60,
16663 }, {
16664 .eraseblocks = { { 16384 * 1024, 1} },
16665 .block_erase = spi_block_erase_c7,
16666 }
16667 },
16668 .printlock = spi_prettyprint_status_register_bp2_srwd,
16669 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16670 .write = spi_chip_write_256, /* Multi I/O supported */
16671 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16672 .voltage = {2700, 3600},
16673 },
16674
16675 {
16676 .vendor = "Spansion",
16677 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16678 .bustype = BUS_SPI,
16679 .manufacture_id = SPANSION_ID,
16680 .model_id = SPANSION_S25FL128,
16681 .total_size = 16384,
16682 .page_size = 256,
16683 /* supports 4B addressing */
16684 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16686 .tested = TEST_OK_PREW,
16687 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
16688 .probe = probe_spi_rdid,
16689 .probe_timing = TIMING_ZERO,
16690 .block_erasers =
16691 {
16692 {
16693 /* This chip supports erasing of 32 so-called "parameter sectors" with
16694 * opcode 0x20 which may be configured to be on top or bottom of the address
16695 * space. Trying to access an address outside these 4kB blocks does have no
16696 * effect on the memory contents, e.g.
16697 .eraseblocks = {
16698 {4 * 1024, 32},
16699 {64 * 1024, 254} // inaccessible
16700 },
16701 .block_erase = spi_block_erase_20,
16702 }, { */
16703 .eraseblocks = { { 64 * 1024, 256} },
16704 .block_erase = spi_block_erase_d8,
16705 }, {
16706 .eraseblocks = { { 16384 * 1024, 1} },
16707 .block_erase = spi_block_erase_60,
16708 }, {
16709 .eraseblocks = { { 16384 * 1024, 1} },
16710 .block_erase = spi_block_erase_c7,
16711 }
16712 },
16713 .printlock = spi_prettyprint_status_register_bp2_srwd,
16714 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16715 .write = spi_chip_write_256, /* Multi I/O supported */
16716 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16717 .voltage = {2700, 3600},
16718 },
16719
16720 {
16721 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020016722 .name = "S25FL128L",
16723 .bustype = BUS_SPI,
16724 .manufacture_id = SPANSION_ID,
16725 .model_id = SPANSION_S25FL128L,
16726 .total_size = 16384,
16727 .page_size = 256,
16728 /* 4 x 256B Security Region (OTP) */
16729 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP,
16730 .tested = TEST_UNTESTED,
16731 .probe = probe_spi_rdid,
16732 .probe_timing = TIMING_ZERO,
16733 .block_erasers =
16734 {
16735 {
16736 .eraseblocks = { {4 * 1024, 4096} },
16737 .block_erase = spi_block_erase_20,
16738 }, {
16739 .eraseblocks = { {32 * 1024, 512} },
16740 .block_erase = spi_block_erase_52,
16741 }, {
16742 .eraseblocks = { {64 * 1024, 256} },
16743 .block_erase = spi_block_erase_d8,
16744 }, {
16745 .eraseblocks = { {16384 * 1024, 1} },
16746 .block_erase = spi_block_erase_60,
16747 }, {
16748 .eraseblocks = { {16384 * 1024, 1} },
16749 .block_erase = spi_block_erase_c7,
16750 }
16751 },
16752 .printlock = spi_prettyprint_status_register_bp2_srwd,
16753 .unlock = spi_disable_blockprotect_bp2_srwd,
16754 .write = spi_chip_write_256,
16755 .read = spi_chip_read, /* Fast read (0x0B) supported */
16756 .voltage = {2700, 3600},
16757 .reg_bits =
16758 {
16759 /*
16760 * Note: This chip has a read-only Status Register 2 that is not
16761 * counted here. Registers are mapped as follows:
16762 * STATUS1 ... Status Register 1
16763 * STATUS2 ... Configuration Register 1
16764 * STATUS3 ... Configuration Register 2
16765 */
16766 .srp = {STATUS1, 7, RW},
16767 .srl = {STATUS2, 0, RW},
16768 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
16769 .tb = {STATUS1, 5, RW},
16770 .sec = {STATUS1, 6, RW},
16771 .cmp = {STATUS2, 6, RW},
16772 .wps = {STATUS3, 2, RW},
16773 },
Nico Huberaabb3e02023-01-13 00:22:30 +010016774 .wp_write_cfg = spi_wp_write_cfg,
16775 .wp_read_cfg = spi_wp_read_cfg,
16776 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020016777 .decode_range = decode_range_spi25,
16778 },
16779
16780 {
16781 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016782 .name = "S25FL128P......0", /* uniform 64 kB sectors */
16783 .bustype = BUS_SPI,
16784 .manufacture_id = SPANSION_ID,
16785 .model_id = SPANSION_S25FL128,
16786 .total_size = 16384,
16787 .page_size = 256,
16788 .feature_bits = FEATURE_WRSR_WREN,
16789 .tested = TEST_OK_PREW,
16790 .probe = probe_spi_rdid,
16791 .probe_timing = TIMING_ZERO,
16792 .block_erasers =
16793 {
16794 {
16795 .eraseblocks = { {64 * 1024, 256} },
16796 .block_erase = spi_block_erase_20,
16797 }, {
16798 .eraseblocks = { {64 * 1024, 256} },
16799 .block_erase = spi_block_erase_d8,
16800 }, {
16801 .eraseblocks = { { 16384 * 1024, 1} },
16802 .block_erase = spi_block_erase_60,
16803 }, {
16804 .eraseblocks = { { 16384 * 1024, 1} },
16805 .block_erase = spi_block_erase_c7,
16806 }
16807 },
16808 .printlock = spi_prettyprint_status_register_bp3_srwd,
16809 .unlock = spi_disable_blockprotect_bp3_srwd,
16810 .write = spi_chip_write_256,
16811 .read = spi_chip_read, /* Fast read (0x0B) supported */
16812 .voltage = {2700, 3600},
16813 },
16814
16815 {
16816 .vendor = "Spansion",
16817 .name = "S25FL128P......1", /* uniform 256kB sectors */
16818 .bustype = BUS_SPI,
16819 .manufacture_id = SPANSION_ID,
16820 .model_id = SPANSION_S25FL128,
16821 .total_size = 16384,
16822 .page_size = 256,
16823 .feature_bits = FEATURE_WRSR_WREN,
16824 .tested = TEST_UNTESTED,
16825 .probe = probe_spi_rdid,
16826 .probe_timing = TIMING_ZERO,
16827 .block_erasers =
16828 {
16829 {
16830 .eraseblocks = { {256 * 1024, 64} },
16831 .block_erase = spi_block_erase_d8,
16832 }, {
16833 .eraseblocks = { { 16384 * 1024, 1} },
16834 .block_erase = spi_block_erase_c7,
16835 }
16836 },
16837 .printlock = spi_prettyprint_status_register_bp2_srwd,
16838 .unlock = spi_disable_blockprotect_bp2_srwd,
16839 .write = spi_chip_write_256,
16840 .read = spi_chip_read, /* Fast read (0x0B) supported */
16841 .voltage = {2700, 3600},
16842 },
16843
16844 {
16845 .vendor = "Spansion",
16846 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16847 .bustype = BUS_SPI,
16848 .manufacture_id = SPANSION_ID,
16849 .model_id = SPANSION_S25FL128,
16850 .total_size = 16384,
16851 .page_size = 256,
16852 /* supports 4B addressing */
16853 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16854 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16855 .tested = TEST_OK_PREW,
16856 .probe = probe_spi_rdid,
16857 .probe_timing = TIMING_ZERO,
16858 .block_erasers =
16859 {
16860 {
16861 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16862 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16863 * have no effect on the memory contents, but sets a flag in the SR.
16864 .eraseblocks = {
16865 {4 * 1024, 32},
16866 {64 * 1024, 254} // inaccessible
16867 },
16868 .block_erase = spi_block_erase_20,
16869 }, { */
16870 .eraseblocks = { { 64 * 1024, 256} },
16871 .block_erase = spi_block_erase_d8,
16872 }, {
16873 .eraseblocks = { { 16384 * 1024, 1} },
16874 .block_erase = spi_block_erase_60,
16875 }, {
16876 .eraseblocks = { { 16384 * 1024, 1} },
16877 .block_erase = spi_block_erase_c7,
16878 }
16879 },
16880 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16881 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16882 .write = spi_chip_write_256, /* Multi I/O supported */
16883 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16884 .voltage = {2700, 3600},
16885 },
16886
16887 {
16888 .vendor = "Spansion",
16889 .name = "S25FL128S......1", /* uniform 256 kB sectors */
16890 .bustype = BUS_SPI,
16891 .manufacture_id = SPANSION_ID,
16892 .model_id = SPANSION_S25FL128,
16893 .total_size = 16384,
16894 .page_size = 512,
16895 /* supports 4B addressing */
16896 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16898 .tested = TEST_UNTESTED,
16899 .probe = probe_spi_rdid,
16900 .probe_timing = TIMING_ZERO,
16901 .block_erasers =
16902 {
16903 {
16904 .eraseblocks = { {256 * 1024, 64} },
16905 .block_erase = spi_block_erase_d8,
16906 }, {
16907 .eraseblocks = { { 16384 * 1024, 1} },
16908 .block_erase = spi_block_erase_60,
16909 }, {
16910 .eraseblocks = { { 16384 * 1024, 1} },
16911 .block_erase = spi_block_erase_c7,
16912 }
16913 },
16914 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16915 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16916 .write = spi_chip_write_256, /* Multi I/O supported */
16917 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16918 .voltage = {2700, 3600},
16919 },
16920
16921 {
16922 .vendor = "Spansion",
16923 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16924 .bustype = BUS_SPI,
16925 .manufacture_id = SPANSION_ID,
16926 .model_id = SPANSION_S25FL128,
16927 .total_size = 16384,
16928 .page_size = 256,
16929 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16930 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16931 .tested = TEST_OK_PREW,
16932 .probe = probe_spi_rdid,
16933 .probe_timing = TIMING_ZERO,
16934 .block_erasers =
16935 {
16936 {
16937 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
16938 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
16939 * effect on the memory contents, but sets a flag in the SR.
16940 .eraseblocks = {
16941 {4 * 1024, 32},
16942 {64 * 1024, 254} // inaccessible
16943 },
16944 .block_erase = spi_block_erase_20,
16945 }, { */
16946 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
16947 .eraseblocks = {
16948 {8 * 1024, 16},
16949 {64 * 1024, 254} // inaccessible
16950 },
16951 .block_erase = spi_block_erase_40,
16952 }, { */
16953 .eraseblocks = { { 64 * 1024, 256} },
16954 .block_erase = spi_block_erase_d8,
16955 }, {
16956 .eraseblocks = { { 16384 * 1024, 1} },
16957 .block_erase = spi_block_erase_60,
16958 }, {
16959 .eraseblocks = { { 16384 * 1024, 1} },
16960 .block_erase = spi_block_erase_c7,
16961 }
16962 },
16963 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16964 .unlock = spi_disable_blockprotect_bp2_srwd,
16965 .write = spi_chip_write_256, /* Multi I/O supported */
16966 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16967 .voltage = {2700, 3600},
16968 },
16969
16970 {
16971 .vendor = "Spansion",
16972 .name = "S25FL129P......1", /* uniform 256 kB sectors */
16973 .bustype = BUS_SPI,
16974 .manufacture_id = SPANSION_ID,
16975 .model_id = SPANSION_S25FL128,
16976 .total_size = 16384,
16977 .page_size = 256,
16978 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16980 .tested = TEST_UNTESTED,
16981 .probe = probe_spi_rdid,
16982 .probe_timing = TIMING_ZERO,
16983 .block_erasers =
16984 {
16985 {
16986 .eraseblocks = { {256 * 1024, 64} },
16987 .block_erase = spi_block_erase_d8,
16988 }, {
16989 .eraseblocks = { { 16384 * 1024, 1} },
16990 .block_erase = spi_block_erase_60,
16991 }, {
16992 .eraseblocks = { { 16384 * 1024, 1} },
16993 .block_erase = spi_block_erase_c7,
16994 }
16995 },
16996 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16997 .unlock = spi_disable_blockprotect_bp2_srwd,
16998 .write = spi_chip_write_256, /* Multi I/O supported */
16999 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17000 .voltage = {2700, 3600},
17001 },
17002
17003 {
17004 .vendor = "Spansion",
17005 .name = "S25FL132K",
17006 .bustype = BUS_SPI,
17007 .manufacture_id = SPANSION_ID,
17008 .model_id = SPANSION_S25FL132K,
17009 .total_size = 4096,
17010 .page_size = 256,
17011 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17012 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17013 .tested = TEST_UNTESTED,
17014 .probe = probe_spi_rdid,
17015 .probe_timing = TIMING_ZERO,
17016 .block_erasers =
17017 {
17018 {
17019 .eraseblocks = { {4 * 1024, 1024} },
17020 .block_erase = spi_block_erase_20,
17021 }, {
17022 .eraseblocks = { {64 * 1024, 64} },
17023 .block_erase = spi_block_erase_d8,
17024 }, {
17025 .eraseblocks = { { 4096 * 1024, 1} },
17026 .block_erase = spi_block_erase_60,
17027 }, {
17028 .eraseblocks = { { 4096 * 1024, 1} },
17029 .block_erase = spi_block_erase_c7,
17030 }
17031 },
17032 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17033 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17034 .write = spi_chip_write_256,
17035 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17036 .voltage = {2700, 3600},
17037 },
17038
17039 {
17040 .vendor = "Spansion",
17041 .name = "S25FL164K",
17042 .bustype = BUS_SPI,
17043 .manufacture_id = SPANSION_ID,
17044 .model_id = SPANSION_S25FL164K,
17045 .total_size = 8192,
17046 .page_size = 256,
17047 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17048 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17049 .tested = TEST_OK_PREW,
17050 .probe = probe_spi_rdid,
17051 .probe_timing = TIMING_ZERO,
17052 .block_erasers =
17053 {
17054 {
17055 .eraseblocks = { {4 * 1024, 2048} },
17056 .block_erase = spi_block_erase_20,
17057 }, {
17058 .eraseblocks = { {64 * 1024, 128} },
17059 .block_erase = spi_block_erase_d8,
17060 }, {
17061 .eraseblocks = { { 8192 * 1024, 1} },
17062 .block_erase = spi_block_erase_60,
17063 }, {
17064 .eraseblocks = { { 8192 * 1024, 1} },
17065 .block_erase = spi_block_erase_c7,
17066 }
17067 },
17068 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17069 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17070 .write = spi_chip_write_256,
17071 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17072 .voltage = {2700, 3600},
17073 },
17074
17075 {
17076 .vendor = "Spansion",
17077 .name = "S25FL204K",
17078 .bustype = BUS_SPI,
17079 .manufacture_id = SPANSION_ID,
17080 .model_id = SPANSION_S25FL204,
17081 .total_size = 512,
17082 .page_size = 256,
17083 .feature_bits = FEATURE_WRSR_WREN,
17084 .tested = TEST_OK_PR,
17085 .probe = probe_spi_rdid,
17086 .probe_timing = TIMING_ZERO,
17087 .block_erasers =
17088 {
17089 {
17090 .eraseblocks = { {4 * 1024, 128} },
17091 .block_erase = spi_block_erase_20,
17092 }, {
17093 .eraseblocks = { {64 * 1024, 8} },
17094 .block_erase = spi_block_erase_d8,
17095 }, {
17096 .eraseblocks = { { 512 * 1024, 1} },
17097 .block_erase = spi_block_erase_60,
17098 }, {
17099 .eraseblocks = { { 512 * 1024, 1} },
17100 .block_erase = spi_block_erase_c7,
17101 }
17102 },
17103 .printlock = spi_prettyprint_status_register_bp3_srwd,
17104 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17105 .write = spi_chip_write_256,
17106 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17107 .voltage = {2700, 3600},
17108 },
17109
17110 {
17111 .vendor = "Spansion",
17112 .name = "S25FL208K",
17113 .bustype = BUS_SPI,
17114 .manufacture_id = SPANSION_ID,
17115 .model_id = SPANSION_S25FL208,
17116 .total_size = 1024,
17117 .page_size = 256,
17118 .feature_bits = FEATURE_WRSR_WREN,
17119 .tested = TEST_OK_PREW,
17120 .probe = probe_spi_rdid,
17121 .probe_timing = TIMING_ZERO,
17122 .block_erasers =
17123 {
17124 {
17125 .eraseblocks = { {4 * 1024, 256} },
17126 .block_erase = spi_block_erase_20,
17127 }, {
17128 .eraseblocks = { {64 * 1024, 16} },
17129 .block_erase = spi_block_erase_d8,
17130 }, {
17131 .eraseblocks = { { 1024 * 1024, 1} },
17132 .block_erase = spi_block_erase_60,
17133 }, {
17134 .eraseblocks = { { 1024 * 1024, 1} },
17135 .block_erase = spi_block_erase_c7,
17136 }
17137 },
17138 .printlock = spi_prettyprint_status_register_bp3_srwd,
17139 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17140 .write = spi_chip_write_256,
17141 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17142 .voltage = {2700, 3600},
17143 },
17144
17145 {
17146 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017147 .name = "S25FL256L",
17148 .bustype = BUS_SPI,
17149 .manufacture_id = SPANSION_ID,
17150 .model_id = SPANSION_S25FL256L,
17151 .total_size = 32768,
17152 .page_size = 256,
17153 /* 4 x 256B Security Region (OTP) */
17154 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP |
17155 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE,
17156 .tested = TEST_UNTESTED,
17157 .probe = probe_spi_rdid,
17158 .probe_timing = TIMING_ZERO,
17159 .block_erasers =
17160 {
17161 {
17162 .eraseblocks = { {4 * 1024, 8192} },
17163 .block_erase = spi_block_erase_21,
17164 }, {
17165 .eraseblocks = { {4 * 1024, 8192} },
17166 .block_erase = spi_block_erase_20,
17167 }, {
17168 .eraseblocks = { {32 * 1024, 1024} },
17169 .block_erase = spi_block_erase_53,
17170 }, {
17171 .eraseblocks = { {32 * 1024, 1024} },
17172 .block_erase = spi_block_erase_52,
17173 }, {
17174 .eraseblocks = { {64 * 1024, 512} },
17175 .block_erase = spi_block_erase_dc,
17176 }, {
17177 .eraseblocks = { {64 * 1024, 512} },
17178 .block_erase = spi_block_erase_d8,
17179 }, {
17180 .eraseblocks = { {32768 * 1024, 1} },
17181 .block_erase = spi_block_erase_60,
17182 }, {
17183 .eraseblocks = { {32768 * 1024, 1} },
17184 .block_erase = spi_block_erase_c7,
17185 }
17186 },
17187 .printlock = spi_prettyprint_status_register_bp3_srwd,
17188 .unlock = spi_disable_blockprotect_bp3_srwd,
17189 .write = spi_chip_write_256,
17190 .read = spi_chip_read, /* Fast read (0x0B) supported */
17191 .voltage = {2700, 3600},
17192 .reg_bits =
17193 {
17194 /*
17195 * Note: This chip has a read-only Status Register 2 that is not
17196 * counted here. Registers are mapped as follows:
17197 * STATUS1 ... Status Register 1
17198 * STATUS2 ... Configuration Register 1
17199 * STATUS3 ... Configuration Register 2
17200 */
17201 .srp = {STATUS1, 7, RW},
17202 .srl = {STATUS2, 0, RW},
17203 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17204 .tb = {STATUS1, 6, RW},
17205 .cmp = {STATUS2, 6, RW},
17206 .wps = {STATUS3, 2, RW},
17207 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017208 .wp_write_cfg = spi_wp_write_cfg,
17209 .wp_read_cfg = spi_wp_read_cfg,
17210 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017211 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010017212 .prepare_access = spi_prepare_4ba,
Nico Huberfffc48d2022-05-28 14:26:06 +020017213 },
17214
17215 {
17216 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017217 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17218 .bustype = BUS_SPI,
17219 .manufacture_id = SPANSION_ID,
17220 .model_id = SPANSION_S25FL256,
17221 .total_size = 32768,
17222 .page_size = 256,
17223 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber9bb8a322022-05-24 15:07:34 +020017224 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17225 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017226 .tested = TEST_OK_PREW,
17227 .probe = probe_spi_rdid,
17228 .probe_timing = TIMING_ZERO,
17229 .block_erasers =
17230 {
17231 {
17232 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17233 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17234 * have no effect on the memory contents, but sets a flag in the SR.
17235 .eraseblocks = {
17236 {4 * 1024, 32},
17237 {64 * 1024, 254} // inaccessible
17238 },
17239 .block_erase = spi_block_erase_20,
17240 }, { */
17241 .eraseblocks = { { 64 * 1024, 512} },
17242 .block_erase = spi_block_erase_dc,
17243 }, {
17244 .eraseblocks = { { 64 * 1024, 512} },
17245 .block_erase = spi_block_erase_d8,
17246 }, {
17247 .eraseblocks = { { 32768 * 1024, 1} },
17248 .block_erase = spi_block_erase_60,
17249 }, {
17250 .eraseblocks = { { 32768 * 1024, 1} },
17251 .block_erase = spi_block_erase_c7,
17252 }
17253 },
17254 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17255 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17256 .write = spi_chip_write_256, /* Multi I/O supported */
17257 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17258 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010017259 .prepare_access = spi_prepare_4ba,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017260 },
17261
17262 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017263 .vendor = "Spansion",
17264 .name = "S25FL512S",
17265 .bustype = BUS_SPI,
17266 .manufacture_id = SPANSION_ID,
17267 .model_id = SPANSION_S25FL512,
17268 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
17269 .page_size = 256,
17270 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber26237922022-06-20 19:37:37 +020017271 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17272 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
17273 .tested = TEST_UNTESTED,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017274 .probe = probe_spi_rdid,
17275 .probe_timing = TIMING_ZERO,
17276 .block_erasers =
17277 {
17278 {
17279 .eraseblocks = { { 256 * 1024, 256} },
17280 .block_erase = spi_block_erase_dc,
17281 }, {
Nico Huberbb608ff2022-05-24 15:33:26 +020017282 .eraseblocks = { { 256 * 1024, 256} },
17283 .block_erase = spi_block_erase_d8,
17284 }, {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017285 .eraseblocks = { { 65536 * 1024, 1} },
17286 .block_erase = spi_block_erase_60,
17287 }, {
17288 .eraseblocks = { { 65536 * 1024, 1} },
17289 .block_erase = spi_block_erase_c7,
17290 }
17291 },
17292 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17293 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17294 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
17295 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17296 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010017297 .prepare_access = spi_prepare_4ba,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017298 },
17299
17300 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017301 .vendor = "SyncMOS/MoselVitelic",
17302 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017303 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017304 .manufacture_id = SYNCMOS_MVC_ID,
17305 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017306 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017307 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017308 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017309 .tested = TEST_UNTESTED,
17310 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017311 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017312 .block_erasers =
17313 {
17314 {
17315 .eraseblocks = { {512, 256} },
17316 .block_erase = erase_sector_jedec,
17317 }, {
17318 .eraseblocks = { {128 * 1024, 1} },
17319 .block_erase = erase_chip_block_jedec,
17320 },
17321 },
Sean Nelson35727f72010-01-28 23:55:12 +000017322 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017323 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017324 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017325 .prepare_access = prepare_memory_access,
17326 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017327 },
17328
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017329 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017330 .vendor = "SyncMOS/MoselVitelic",
17331 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017332 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017333 .manufacture_id = SYNCMOS_MVC_ID,
17334 .model_id = SM_MVC_29C51001T,
17335 .total_size = 128,
17336 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017337 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017338 .tested = TEST_UNTESTED,
17339 .probe = probe_jedec,
17340 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17341 .block_erasers =
17342 {
17343 {
17344 .eraseblocks = { {512, 256} },
17345 .block_erase = erase_sector_jedec,
17346 }, {
17347 .eraseblocks = { {128 * 1024, 1} },
17348 .block_erase = erase_chip_block_jedec,
17349 },
17350 },
17351 .write = write_jedec_1,
17352 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017353 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017354 .prepare_access = prepare_memory_access,
17355 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017356 },
17357
17358 {
17359 .vendor = "SyncMOS/MoselVitelic",
17360 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017361 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017362 .manufacture_id = SYNCMOS_MVC_ID,
17363 .model_id = SM_MVC_29C51002B,
17364 .total_size = 256,
17365 .page_size = 512,
17366 .feature_bits = FEATURE_EITHER_RESET,
17367 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017368 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017369 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017370 .block_erasers =
17371 {
17372 {
17373 .eraseblocks = { {512, 512} },
17374 .block_erase = erase_sector_jedec,
17375 }, {
17376 .eraseblocks = { {256 * 1024, 1} },
17377 .block_erase = erase_chip_block_jedec,
17378 },
17379 },
Sean Nelson35727f72010-01-28 23:55:12 +000017380 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017381 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017382 .prepare_access = prepare_memory_access,
17383 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017384 },
17385
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017386 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017387 .vendor = "SyncMOS/MoselVitelic",
17388 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017389 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017390 .manufacture_id = SYNCMOS_MVC_ID,
17391 .model_id = SM_MVC_29C51002T,
17392 .total_size = 256,
17393 .page_size = 512,
17394 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017395 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017396 .probe = probe_jedec,
17397 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17398 .block_erasers =
17399 {
17400 {
17401 .eraseblocks = { {512, 512} },
17402 .block_erase = erase_sector_jedec,
17403 }, {
17404 .eraseblocks = { {256 * 1024, 1} },
17405 .block_erase = erase_chip_block_jedec,
17406 },
17407 },
17408 .write = write_jedec_1,
17409 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017410 .prepare_access = prepare_memory_access,
17411 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017412 },
17413
17414 {
17415 .vendor = "SyncMOS/MoselVitelic",
17416 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017417 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017418 .manufacture_id = SYNCMOS_MVC_ID,
17419 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017420 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017421 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017422 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017423 .tested = TEST_UNTESTED,
17424 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017425 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000017426 .block_erasers =
17427 {
17428 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017429 .eraseblocks = { {1024, 512} },
17430 .block_erase = erase_sector_jedec,
17431 }, {
17432 .eraseblocks = { {512 * 1024, 1} },
17433 .block_erase = erase_chip_block_jedec,
17434 },
17435 },
17436 .write = write_jedec_1,
17437 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017438 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017439 .prepare_access = prepare_memory_access,
17440 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017441 },
17442
17443 {
17444 .vendor = "SyncMOS/MoselVitelic",
17445 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017446 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017447 .manufacture_id = SYNCMOS_MVC_ID,
17448 .model_id = SM_MVC_29C51004T,
17449 .total_size = 512,
17450 .page_size = 1024,
17451 .feature_bits = FEATURE_EITHER_RESET,
17452 .tested = TEST_UNTESTED,
17453 .probe = probe_jedec,
17454 .probe_timing = TIMING_ZERO,
17455 .block_erasers =
17456 {
17457 {
17458 .eraseblocks = { {1024, 512} },
17459 .block_erase = erase_sector_jedec,
17460 }, {
17461 .eraseblocks = { {512 * 1024, 1} },
17462 .block_erase = erase_chip_block_jedec,
17463 },
17464 },
17465 .write = write_jedec_1,
17466 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017467 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017468 .prepare_access = prepare_memory_access,
17469 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017470 },
17471
17472 {
17473 .vendor = "SyncMOS/MoselVitelic",
17474 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017475 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017476 .manufacture_id = SYNCMOS_MVC_ID,
17477 .model_id = SM_MVC_29C31004B,
17478 .total_size = 512,
17479 .page_size = 1024,
17480 .feature_bits = FEATURE_EITHER_RESET,
17481 .tested = TEST_UNTESTED,
17482 .probe = probe_jedec,
17483 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17484 .block_erasers =
17485 {
17486 {
17487 .eraseblocks = { {1024, 512} },
17488 .block_erase = erase_sector_jedec,
17489 }, {
17490 .eraseblocks = { {512 * 1024, 1} },
17491 .block_erase = erase_chip_block_jedec,
17492 },
17493 },
17494 .write = write_jedec_1,
17495 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017496 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017497 .prepare_access = prepare_memory_access,
17498 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017499 },
17500
17501 {
17502 .vendor = "SyncMOS/MoselVitelic",
17503 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017504 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017505 .manufacture_id = SYNCMOS_MVC_ID,
17506 .model_id = SM_MVC_29C31004T,
17507 .total_size = 512,
17508 .page_size = 1024,
17509 .feature_bits = FEATURE_EITHER_RESET,
17510 .tested = TEST_UNTESTED,
17511 .probe = probe_jedec,
17512 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17513 .block_erasers =
17514 {
17515 {
17516 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000017517 .block_erase = erase_sector_jedec,
17518 }, {
17519 .eraseblocks = { {512 * 1024, 1} },
17520 .block_erase = erase_chip_block_jedec,
17521 },
17522 },
Sean Nelson35727f72010-01-28 23:55:12 +000017523 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017524 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017525 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017526 .prepare_access = prepare_memory_access,
17527 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017528 },
17529
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017530 {
Uwe Hermanna106d152009-05-27 23:17:40 +000017531 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017532 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017533 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017534 .manufacture_id = TI_OLD_ID,
17535 .model_id = TI_TMS29F002RB,
17536 .total_size = 256,
17537 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000017538 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017539 .tested = TEST_UNTESTED,
17540 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017541 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017542 .block_erasers =
17543 {
17544 {
17545 .eraseblocks = {
17546 {16 * 1024, 1},
17547 {8 * 1024, 2},
17548 {32 * 1024, 1},
17549 {64 * 1024, 3},
17550 },
17551 .block_erase = erase_sector_jedec,
17552 }, {
17553 .eraseblocks = { {256 * 1024, 1} },
17554 .block_erase = erase_chip_block_jedec,
17555 },
17556 },
Sean Nelson35727f72010-01-28 23:55:12 +000017557 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017558 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017559 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017560 .prepare_access = prepare_memory_access,
17561 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017562 },
17563
17564 {
Uwe Hermanna106d152009-05-27 23:17:40 +000017565 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017566 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017567 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017568 .manufacture_id = TI_OLD_ID,
17569 .model_id = TI_TMS29F002RT,
17570 .total_size = 256,
17571 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000017572 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017573 .tested = TEST_UNTESTED,
17574 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017575 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017576 .block_erasers =
17577 {
17578 {
17579 .eraseblocks = {
17580 {64 * 1024, 3},
17581 {32 * 1024, 1},
17582 {8 * 1024, 2},
17583 {16 * 1024, 1},
17584 },
17585 .block_erase = erase_sector_jedec,
17586 }, {
17587 .eraseblocks = { {256 * 1024, 1} },
17588 .block_erase = erase_chip_block_jedec,
17589 },
17590 },
Sean Nelson35727f72010-01-28 23:55:12 +000017591 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017592 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017593 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017594 .prepare_access = prepare_memory_access,
17595 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017596 },
17597
17598 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017599 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017600 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017601 .bustype = BUS_SPI,
17602 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017603 .model_id = WINBOND_NEX_W25P16,
17604 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017605 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017606 .feature_bits = FEATURE_WRSR_WREN,
17607 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017608 .probe = probe_spi_rdid,
17609 .probe_timing = TIMING_ZERO,
17610 .block_erasers =
17611 {
17612 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017613 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017614 .block_erase = spi_block_erase_d8,
17615 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017616 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017617 .block_erase = spi_block_erase_c7,
17618 }
17619 },
17620 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17621 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017622 .write = spi_chip_write_256,
17623 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017624 .voltage = {2700, 3600},
17625 },
17626
17627 {
17628 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017629 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017630 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017631 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017632 .model_id = WINBOND_NEX_W25P32,
17633 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017634 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017635 .feature_bits = FEATURE_WRSR_WREN,
17636 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017637 .probe = probe_spi_rdid,
17638 .probe_timing = TIMING_ZERO,
17639 .block_erasers =
17640 {
17641 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017642 .eraseblocks = { {64 * 1024, 64} },
17643 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017644 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017645 .eraseblocks = { {4096 * 1024, 1} },
17646 .block_erase = spi_block_erase_c7,
17647 }
17648 },
17649 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17650 .unlock = spi_disable_blockprotect,
17651 .write = spi_chip_write_256,
17652 .read = spi_chip_read, /* Fast read (0x0B) supported */
17653 .voltage = {2700, 3600},
17654 },
17655
17656 {
17657 .vendor = "Winbond",
17658 .name = "W25P80",
17659 .bustype = BUS_SPI,
17660 .manufacture_id = WINBOND_NEX_ID,
17661 .model_id = WINBOND_NEX_W25P80,
17662 .total_size = 1024,
17663 .page_size = 256,
17664 .feature_bits = FEATURE_WRSR_WREN,
17665 .tested = TEST_UNTESTED,
17666 .probe = probe_spi_rdid,
17667 .probe_timing = TIMING_ZERO,
17668 .block_erasers =
17669 {
17670 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000017671 .eraseblocks = { {64 * 1024, 16} },
17672 .block_erase = spi_block_erase_d8,
17673 }, {
17674 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000017675 .block_erase = spi_block_erase_c7,
17676 }
17677 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000017678 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000017679 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017680 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017681 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017682 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000017683 },
17684
17685 {
17686 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017687 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017688 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017689 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017690 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017691 .total_size = 16384,
17692 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017693 /* supports SFDP */
17694 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber3f3c1f32022-05-28 16:48:26 +020017695 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17696 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Edward O'Callaghana97e3532022-12-16 15:41:05 +110017697 .tested = TEST_OK_PREWB,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017698 .probe = probe_spi_rdid,
17699 .probe_timing = TIMING_ZERO,
17700 .block_erasers =
17701 {
17702 {
17703 .eraseblocks = { {4 * 1024, 4096} },
17704 .block_erase = spi_block_erase_20,
17705 }, {
17706 .eraseblocks = { {32 * 1024, 512} },
17707 .block_erase = spi_block_erase_52,
17708 }, {
17709 .eraseblocks = { {64 * 1024, 256} },
17710 .block_erase = spi_block_erase_d8,
17711 }, {
17712 .eraseblocks = { {16 * 1024 * 1024, 1} },
17713 .block_erase = spi_block_erase_60,
17714 }, {
17715 .eraseblocks = { {16 * 1024 * 1024, 1} },
17716 .block_erase = spi_block_erase_c7,
17717 }
17718 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000017719 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000017720 .unlock = spi_disable_blockprotect,
17721 .write = spi_chip_write_256,
17722 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017723 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017724 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
17725 .reg_bits =
17726 {
17727 .srp = {STATUS1, 7, RW},
17728 .srl = {STATUS2, 0, RW},
17729 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17730 .tb = {STATUS1, 5, RW},
17731 .sec = {STATUS1, 6, RW},
17732 .cmp = {STATUS2, 6, RW},
17733 .wps = {STATUS3, 2, RW},
17734 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017735 .wp_write_cfg = spi_wp_write_cfg,
17736 .wp_read_cfg = spi_wp_read_cfg,
17737 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017738 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017739 },
17740
17741 {
17742 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020017743 .name = "W25Q128.V..M",
17744 .bustype = BUS_SPI,
17745 .manufacture_id = WINBOND_NEX_ID,
17746 .model_id = WINBOND_NEX_W25Q128_V_M,
17747 .total_size = 16384,
17748 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017749 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030017750 .tested = TEST_OK_PREWB,
Patrick Rudolph34323492018-10-04 14:59:40 +020017751 .probe = probe_spi_rdid,
17752 .probe_timing = TIMING_ZERO,
17753 .block_erasers =
17754 {
17755 {
17756 .eraseblocks = { {4 * 1024, 4096} },
17757 .block_erase = spi_block_erase_20,
17758 }, {
17759 .eraseblocks = { {32 * 1024, 512} },
17760 .block_erase = spi_block_erase_52,
17761 }, {
17762 .eraseblocks = { {64 * 1024, 256} },
17763 .block_erase = spi_block_erase_d8,
17764 }, {
17765 .eraseblocks = { {16 * 1024 * 1024, 1} },
17766 .block_erase = spi_block_erase_60,
17767 }, {
17768 .eraseblocks = { {16 * 1024 * 1024, 1} },
17769 .block_erase = spi_block_erase_c7,
17770 }
17771 },
Alan Greena1fc01d2019-09-23 17:12:44 +100017772 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020017773 .unlock = spi_disable_blockprotect,
17774 .write = spi_chip_write_256,
17775 .read = spi_chip_read,
17776 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017777 .reg_bits =
17778 {
17779 .srp = {STATUS1, 7, RW},
17780 .srl = {STATUS2, 0, RW},
17781 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17782 .tb = {STATUS1, 5, RW},
17783 .sec = {STATUS1, 6, RW},
17784 .cmp = {STATUS2, 6, RW},
17785 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017786 .wp_write_cfg = spi_wp_write_cfg,
17787 .wp_read_cfg = spi_wp_read_cfg,
17788 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017789 .decode_range = decode_range_spi25,
Patrick Rudolph34323492018-10-04 14:59:40 +020017790 },
17791
17792 {
17793 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017794 .name = "W25Q128.W",
17795 .bustype = BUS_SPI,
17796 .manufacture_id = WINBOND_NEX_ID,
17797 .model_id = WINBOND_NEX_W25Q128_W,
17798 .total_size = 16384,
17799 .page_size = 256,
17800 /* supports SFDP */
17801 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017802 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017803 .tested = TEST_OK_PREW,
17804 .probe = probe_spi_rdid,
17805 .probe_timing = TIMING_ZERO,
17806 .block_erasers =
17807 {
17808 {
17809 .eraseblocks = { {4 * 1024, 4096} },
17810 .block_erase = spi_block_erase_20,
17811 }, {
17812 .eraseblocks = { {32 * 1024, 512} },
17813 .block_erase = spi_block_erase_52,
17814 }, {
17815 .eraseblocks = { {64 * 1024, 256} },
17816 .block_erase = spi_block_erase_d8,
17817 }, {
17818 .eraseblocks = { {16 * 1024 * 1024, 1} },
17819 .block_erase = spi_block_erase_60,
17820 }, {
17821 .eraseblocks = { {16 * 1024 * 1024, 1} },
17822 .block_erase = spi_block_erase_c7,
17823 }
17824 },
17825 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17826 .unlock = spi_disable_blockprotect,
17827 .write = spi_chip_write_256,
17828 .read = spi_chip_read,
17829 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017830 .reg_bits =
17831 {
17832 .srp = {STATUS1, 7, RW},
17833 .srl = {STATUS2, 0, RW},
17834 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17835 .tb = {STATUS1, 5, RW},
17836 .sec = {STATUS1, 6, RW},
17837 .cmp = {STATUS2, 6, RW},
17838 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017839 .wp_write_cfg = spi_wp_write_cfg,
17840 .wp_read_cfg = spi_wp_read_cfg,
17841 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017842 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017843 },
17844
17845 {
17846 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080017847 .name = "W25Q128.JW.DTR",
17848 .bustype = BUS_SPI,
17849 .manufacture_id = WINBOND_NEX_ID,
17850 .model_id = WINBOND_NEX_W25Q128_DTR,
17851 .total_size = 16384,
17852 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017853 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Peichao Wang1a119492019-11-11 15:26:41 +080017854 .tested = TEST_OK_PREW,
17855 .probe = probe_spi_rdid,
17856 .probe_timing = TIMING_ZERO,
17857 .block_erasers =
17858 {
17859 {
17860 .eraseblocks = { {4 * 1024, 4096} },
17861 .block_erase = spi_block_erase_20,
17862 }, {
17863 .eraseblocks = { {32 * 1024, 512} },
17864 .block_erase = spi_block_erase_52,
17865 }, {
17866 .eraseblocks = { {64 * 1024, 256} },
17867 .block_erase = spi_block_erase_d8,
17868 }, {
17869 .eraseblocks = { {16 * 1024 * 1024, 1} },
17870 .block_erase = spi_block_erase_60,
17871 }, {
17872 .eraseblocks = { {16 * 1024 * 1024, 1} },
17873 .block_erase = spi_block_erase_c7,
17874 }
17875 },
17876 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17877 .unlock = spi_disable_blockprotect,
17878 .write = spi_chip_write_256,
17879 .read = spi_chip_read,
17880 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017881 .reg_bits =
17882 {
17883 .srp = {STATUS1, 7, RW},
17884 .srl = {STATUS2, 0, RW},
17885 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17886 .tb = {STATUS1, 5, RW},
17887 .sec = {STATUS1, 6, RW},
17888 .cmp = {STATUS2, 6, RW},
17889 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017890 .wp_write_cfg = spi_wp_write_cfg,
17891 .wp_read_cfg = spi_wp_read_cfg,
17892 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017893 .decode_range = decode_range_spi25,
Peichao Wang1a119492019-11-11 15:26:41 +080017894 },
17895
17896 {
17897 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017898 .name = "W25Q16.V",
17899 .bustype = BUS_SPI,
17900 .manufacture_id = WINBOND_NEX_ID,
17901 .model_id = WINBOND_NEX_W25Q16_V,
17902 .total_size = 2048,
17903 .page_size = 256,
17904 /* supports SFDP */
17905 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17906 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17907 .tested = TEST_OK_PREW,
17908 .probe = probe_spi_rdid,
17909 .probe_timing = TIMING_ZERO,
17910 .block_erasers =
17911 {
17912 {
17913 .eraseblocks = { {4 * 1024, 512} },
17914 .block_erase = spi_block_erase_20,
17915 }, {
17916 .eraseblocks = { {32 * 1024, 64} },
17917 .block_erase = spi_block_erase_52,
17918 }, {
17919 .eraseblocks = { {64 * 1024, 32} },
17920 .block_erase = spi_block_erase_d8,
17921 }, {
17922 .eraseblocks = { {2 * 1024 * 1024, 1} },
17923 .block_erase = spi_block_erase_60,
17924 }, {
17925 .eraseblocks = { {2 * 1024 * 1024, 1} },
17926 .block_erase = spi_block_erase_c7,
17927 }
17928 },
17929 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17930 .unlock = spi_disable_blockprotect,
17931 .write = spi_chip_write_256,
17932 .read = spi_chip_read,
17933 .voltage = {2700, 3600},
17934 },
17935
17936 {
17937 .vendor = "Winbond",
17938 .name = "W25Q16.W",
17939 .bustype = BUS_SPI,
17940 .manufacture_id = WINBOND_NEX_ID,
17941 .model_id = WINBOND_NEX_W25Q16_W,
17942 .total_size = 2048,
17943 .page_size = 256,
17944 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17945 /* QPI enable 0x38, disable 0xFF */
17946 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17947 .tested = TEST_UNTESTED,
17948 .probe = probe_spi_rdid,
17949 .probe_timing = TIMING_ZERO,
17950 .block_erasers =
17951 {
17952 {
17953 .eraseblocks = { {4 * 1024, 512} },
17954 .block_erase = spi_block_erase_20,
17955 }, {
17956 .eraseblocks = { {32 * 1024, 64} },
17957 .block_erase = spi_block_erase_52,
17958 }, {
17959 .eraseblocks = { {64 * 1024, 32} },
17960 .block_erase = spi_block_erase_d8,
17961 }, {
17962 .eraseblocks = { {2 * 1024 * 1024, 1} },
17963 .block_erase = spi_block_erase_60,
17964 }, {
17965 .eraseblocks = { {2 * 1024 * 1024, 1} },
17966 .block_erase = spi_block_erase_c7,
17967 }
17968 },
17969 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17970 .unlock = spi_disable_blockprotect,
17971 .write = spi_chip_write_256,
17972 .read = spi_chip_read,
17973 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17974 },
17975
17976 {
17977 .vendor = "Winbond",
17978 .name = "W25Q20.W",
17979 .bustype = BUS_SPI,
17980 .manufacture_id = WINBOND_NEX_ID,
17981 .model_id = WINBOND_NEX_W25Q20_W,
17982 .total_size = 256,
17983 .page_size = 256,
17984 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17985 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17986 .tested = TEST_UNTESTED,
17987 .probe = probe_spi_rdid,
17988 .probe_timing = TIMING_ZERO,
17989 .block_erasers =
17990 {
17991 {
17992 .eraseblocks = { {4 * 1024, 64} },
17993 .block_erase = spi_block_erase_20,
17994 }, {
17995 .eraseblocks = { {32 * 1024, 8} },
17996 .block_erase = spi_block_erase_52,
17997 }, {
17998 .eraseblocks = { {64 * 1024, 4} },
17999 .block_erase = spi_block_erase_d8,
18000 }, {
18001 .eraseblocks = { {256 * 1024, 1} },
18002 .block_erase = spi_block_erase_60,
18003 }, {
18004 .eraseblocks = { {256 * 1024, 1} },
18005 .block_erase = spi_block_erase_c7,
18006 }
18007 },
18008 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18009 .unlock = spi_disable_blockprotect,
18010 .write = spi_chip_write_256,
18011 .read = spi_chip_read,
18012 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18013 },
18014
18015 {
18016 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018017 .name = "W25Q256FV",
Boris Baykovaa6c3742016-06-11 18:29:01 +020018018 .bustype = BUS_SPI,
18019 .manufacture_id = WINBOND_NEX_ID,
18020 .model_id = WINBOND_NEX_W25Q256_V,
18021 .total_size = 32768,
18022 .page_size = 256,
18023 /* supports SFDP */
18024 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018025 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN |
Nico Huber542b1f02022-05-24 14:30:12 +020018026 FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018027 FEATURE_WRSR2,
Angel Pons3130cbd2018-09-30 19:32:30 +020018028 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018029 .probe = probe_spi_rdid,
18030 .probe_timing = TIMING_ZERO,
18031 .block_erasers =
18032 {
18033 {
18034 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020018035 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018036 }, {
18037 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020018038 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018039 }, {
18040 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020018041 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018042 }, {
18043 .eraseblocks = { {32 * 1024 * 1024, 1} },
18044 .block_erase = spi_block_erase_60,
18045 }, {
18046 .eraseblocks = { {32 * 1024 * 1024, 1} },
18047 .block_erase = spi_block_erase_c7,
18048 }
18049 },
18050 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18051 .unlock = spi_disable_blockprotect,
18052 .write = spi_chip_write_256,
18053 .read = spi_chip_read,
18054 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018055 .reg_bits =
18056 {
18057 .srp = {STATUS1, 7, RW},
18058 .srl = {STATUS2, 0, RW},
18059 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18060 .tb = {STATUS1, 6, RW},
18061 .cmp = {STATUS2, 6, RW},
18062 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018063 .wp_write_cfg = spi_wp_write_cfg,
18064 .wp_read_cfg = spi_wp_read_cfg,
18065 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018066 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018067 .prepare_access = spi_prepare_4ba,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018068 },
18069
18070 {
18071 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018072 .name = "W25Q256JV_Q",
18073 .bustype = BUS_SPI,
18074 .manufacture_id = WINBOND_NEX_ID,
18075 .model_id = WINBOND_NEX_W25Q256_V,
18076 .total_size = 32768,
18077 .page_size = 256,
18078 /* supports SFDP */
18079 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18080 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2,
Nico Huberddfbbe82023-12-21 16:31:27 +010018081 .tested = TEST_OK_PREW,
Nico Huber5215eab2022-05-23 15:13:07 +020018082 .probe = probe_spi_rdid,
18083 .probe_timing = TIMING_ZERO,
18084 .block_erasers =
18085 {
18086 {
18087 .eraseblocks = { {4 * 1024, 8192} },
18088 .block_erase = spi_block_erase_21,
18089 }, {
18090 .eraseblocks = { {4 * 1024, 8192} },
18091 .block_erase = spi_block_erase_20,
18092 }, {
18093 .eraseblocks = { {32 * 1024, 1024} },
18094 .block_erase = spi_block_erase_52,
18095 }, {
18096 .eraseblocks = { {64 * 1024, 512} },
18097 .block_erase = spi_block_erase_dc,
18098 }, {
18099 .eraseblocks = { {64 * 1024, 512} },
18100 .block_erase = spi_block_erase_d8,
18101 }, {
18102 .eraseblocks = { {32 * 1024 * 1024, 1} },
18103 .block_erase = spi_block_erase_60,
18104 }, {
18105 .eraseblocks = { {32 * 1024 * 1024, 1} },
18106 .block_erase = spi_block_erase_c7,
18107 }
18108 },
18109 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18110 .unlock = spi_disable_blockprotect,
18111 .write = spi_chip_write_256,
18112 .read = spi_chip_read,
18113 .voltage = {2700, 3600},
18114 .reg_bits =
18115 {
18116 .srp = {STATUS1, 7, RW},
18117 .srl = {STATUS2, 0, RW},
18118 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18119 .tb = {STATUS1, 6, RW},
18120 .cmp = {STATUS2, 6, RW},
18121 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018122 .wp_write_cfg = spi_wp_write_cfg,
18123 .wp_read_cfg = spi_wp_read_cfg,
18124 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huber5215eab2022-05-23 15:13:07 +020018125 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018126 .prepare_access = spi_prepare_4ba,
Nico Huber5215eab2022-05-23 15:13:07 +020018127 },
18128
18129 {
18130 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000018131 .name = "W25Q256JV_M",
18132 .bustype = BUS_SPI,
18133 .manufacture_id = WINBOND_NEX_ID,
18134 .model_id = WINBOND_NEX_W25Q256JV_M,
18135 .total_size = 32768,
18136 .page_size = 256,
18137 /* supports SFDP */
18138 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018139 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2,
David Hendricks49876792018-10-27 20:19:42 +000018140 .tested = TEST_OK_PREW,
18141 .probe = probe_spi_rdid,
18142 .probe_timing = TIMING_ZERO,
18143 .block_erasers =
18144 {
18145 {
18146 .eraseblocks = { {4 * 1024, 8192} },
18147 .block_erase = spi_block_erase_21,
18148 }, {
18149 .eraseblocks = { {4 * 1024, 8192} },
18150 .block_erase = spi_block_erase_20,
18151 }, {
18152 .eraseblocks = { {32 * 1024, 1024} },
18153 .block_erase = spi_block_erase_52,
18154 }, {
18155 .eraseblocks = { {64 * 1024, 512} },
18156 .block_erase = spi_block_erase_dc,
18157 }, {
18158 .eraseblocks = { {64 * 1024, 512} },
18159 .block_erase = spi_block_erase_d8,
18160 }, {
18161 .eraseblocks = { {32 * 1024 * 1024, 1} },
18162 .block_erase = spi_block_erase_60,
18163 }, {
18164 .eraseblocks = { {32 * 1024 * 1024, 1} },
18165 .block_erase = spi_block_erase_c7,
18166 }
18167 },
18168 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18169 .unlock = spi_disable_blockprotect,
18170 .write = spi_chip_write_256,
18171 .read = spi_chip_read,
18172 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018173 .reg_bits =
18174 {
18175 .srp = {STATUS1, 7, RW},
18176 .srl = {STATUS2, 0, RW},
18177 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18178 .tb = {STATUS1, 6, RW},
18179 .cmp = {STATUS2, 6, RW},
18180 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018181 .wp_write_cfg = spi_wp_write_cfg,
18182 .wp_read_cfg = spi_wp_read_cfg,
18183 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018184 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018185 .prepare_access = spi_prepare_4ba,
David Hendricks49876792018-10-27 20:19:42 +000018186 },
18187
18188 {
18189 .vendor = "Winbond",
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018190 .name = "W25Q256JW",
el-coderon01209852020-04-29 12:12:53 +020018191 .bustype = BUS_SPI,
18192 .manufacture_id = WINBOND_NEX_ID,
18193 .model_id = WINBOND_NEX_W25Q256_W,
18194 .total_size = 32768,
18195 .page_size = 256,
18196 /* supports SFDP */
18197 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018198 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
el-coderon01209852020-04-29 12:12:53 +020018199 .tested = TEST_OK_PREW,
18200 .probe = probe_spi_rdid,
18201 .probe_timing = TIMING_ZERO,
18202 .block_erasers =
18203 {
18204 {
18205 .eraseblocks = { {4 * 1024, 8192} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018206 .block_erase = spi_block_erase_21,
18207 }, {
18208 .eraseblocks = { {4 * 1024, 8192} },
el-coderon01209852020-04-29 12:12:53 +020018209 .block_erase = spi_block_erase_20,
18210 }, {
18211 .eraseblocks = { {32 * 1024, 1024} },
18212 .block_erase = spi_block_erase_52,
18213 }, {
18214 .eraseblocks = { {64 * 1024, 512} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018215 .block_erase = spi_block_erase_dc,
18216 }, {
18217 .eraseblocks = { {64 * 1024, 512} },
el-coderon01209852020-04-29 12:12:53 +020018218 .block_erase = spi_block_erase_d8,
18219 }, {
18220 .eraseblocks = { {32 * 1024 * 1024, 1} },
18221 .block_erase = spi_block_erase_60,
18222 }, {
18223 .eraseblocks = { {32 * 1024 * 1024, 1} },
18224 .block_erase = spi_block_erase_c7,
18225 }
18226 },
18227 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18228 .unlock = spi_disable_blockprotect,
18229 .write = spi_chip_write_256,
18230 .read = spi_chip_read,
18231 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +010018232 .prepare_access = spi_prepare_4ba,
el-coderon01209852020-04-29 12:12:53 +020018233 },
18234
18235 {
18236 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070018237 .name = "W25Q256JW_DTR",
18238 .bustype = BUS_SPI,
18239 .manufacture_id = WINBOND_NEX_ID,
18240 .model_id = WINBOND_NEX_W25Q256_DTR,
18241 .total_size = 32768,
18242 .page_size = 256,
18243 /* supports SFDP */
18244 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Kapil Porwal111c3802022-12-09 19:41:27 +053018245 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2
18246 | FEATURE_WRSR3,
18247 .tested = TEST_OK_PREWB,
David Hendricks31532602020-08-16 17:14:56 -070018248 .probe = probe_spi_rdid,
18249 .probe_timing = TIMING_ZERO,
18250 .block_erasers =
18251 {
18252 {
18253 .eraseblocks = { {4 * 1024, 8192} },
18254 .block_erase = spi_block_erase_21,
18255 }, {
18256 .eraseblocks = { {4 * 1024, 8192} },
18257 .block_erase = spi_block_erase_20,
18258 }, {
18259 .eraseblocks = { {32 * 1024, 1024} },
18260 .block_erase = spi_block_erase_52,
18261 }, {
18262 .eraseblocks = { {64 * 1024, 512} },
18263 .block_erase = spi_block_erase_dc,
18264 }, {
18265 .eraseblocks = { {64 * 1024, 512} },
18266 .block_erase = spi_block_erase_d8,
18267 }, {
18268 .eraseblocks = { {32 * 1024 * 1024, 1} },
18269 .block_erase = spi_block_erase_60,
18270 }, {
18271 .eraseblocks = { {32 * 1024 * 1024, 1} },
18272 .block_erase = spi_block_erase_c7,
18273 }
18274 },
18275 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18276 .unlock = spi_disable_blockprotect,
18277 .write = spi_chip_write_256,
18278 .read = spi_chip_read,
18279 .voltage = {1700, 1950},
Kapil Porwal111c3802022-12-09 19:41:27 +053018280 .reg_bits =
18281 {
18282 .srp = {STATUS1, 7, RW},
18283 .srl = {STATUS2, 0, RW},
18284 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18285 .tb = {STATUS1, 6, RW},
18286 .cmp = {STATUS2, 6, RW},
18287 .wps = {STATUS3, 2, RW},
18288 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018289 .wp_write_cfg = spi_wp_write_cfg,
18290 .wp_read_cfg = spi_wp_read_cfg,
18291 .wp_get_ranges = spi_wp_get_available_ranges,
Kapil Porwal111c3802022-12-09 19:41:27 +053018292 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018293 .prepare_access = spi_prepare_4ba,
David Hendricks31532602020-08-16 17:14:56 -070018294 },
18295
18296 {
18297 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018298 .name = "W25Q32BV/W25Q32CV/W25Q32DV",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018299 .bustype = BUS_SPI,
18300 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018301 .model_id = WINBOND_NEX_W25Q32_V,
18302 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018303 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018304 /* supports SFDP */
18305 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018306 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018307 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018308 .probe = probe_spi_rdid,
18309 .probe_timing = TIMING_ZERO,
18310 .block_erasers =
18311 {
18312 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018313 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018314 .block_erase = spi_block_erase_20,
18315 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018316 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018317 .block_erase = spi_block_erase_52,
18318 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018319 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018320 .block_erase = spi_block_erase_d8,
18321 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018322 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018323 .block_erase = spi_block_erase_60,
18324 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018325 .eraseblocks = { {4 * 1024 * 1024, 1} },
18326 .block_erase = spi_block_erase_c7,
18327 }
18328 },
18329 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18330 .unlock = spi_disable_blockprotect,
18331 .write = spi_chip_write_256,
18332 .read = spi_chip_read,
18333 .voltage = {2700, 3600},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018334 .reg_bits =
18335 {
18336 .srp = {STATUS1, 7, RW},
18337 .srl = {STATUS2, 0, RW},
18338 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18339 .tb = {STATUS1, 5, RW},
18340 .sec = {STATUS1, 6, RW},
18341 .cmp = {STATUS2, 6, RW},
18342 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018343 .wp_write_cfg = spi_wp_write_cfg,
18344 .wp_read_cfg = spi_wp_read_cfg,
18345 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018346 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018347 },
18348
18349 {
18350 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018351 .name = "W25Q32FV",
18352 .bustype = BUS_SPI,
18353 .manufacture_id = WINBOND_NEX_ID,
18354 .model_id = WINBOND_NEX_W25Q32_V,
18355 .total_size = 4096,
18356 .page_size = 256,
18357 /* supports SFDP */
18358 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18359 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI |
18360 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18361 .tested = TEST_OK_PREW,
18362 .probe = probe_spi_rdid,
18363 .probe_timing = TIMING_ZERO,
18364 .block_erasers =
18365 {
18366 {
18367 .eraseblocks = { {4 * 1024, 1024} },
18368 .block_erase = spi_block_erase_20,
18369 }, {
18370 .eraseblocks = { {32 * 1024, 128} },
18371 .block_erase = spi_block_erase_52,
18372 }, {
18373 .eraseblocks = { {64 * 1024, 64} },
18374 .block_erase = spi_block_erase_d8,
18375 }, {
18376 .eraseblocks = { {4 * 1024 * 1024, 1} },
18377 .block_erase = spi_block_erase_60,
18378 }, {
18379 .eraseblocks = { {4 * 1024 * 1024, 1} },
18380 .block_erase = spi_block_erase_c7,
18381 }
18382 },
18383 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18384 .unlock = spi_disable_blockprotect,
18385 .write = spi_chip_write_256,
18386 .read = spi_chip_read,
18387 .voltage = {2700, 3600},
18388 .reg_bits =
18389 {
18390 .srp = {STATUS1, 7, RW},
18391 .srl = {STATUS2, 0, RW},
18392 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18393 .tb = {STATUS1, 5, RW},
18394 .sec = {STATUS1, 6, RW},
18395 .cmp = {STATUS2, 6, RW},
18396 .wps = {STATUS3, 2, RW},
18397 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018398 .wp_write_cfg = spi_wp_write_cfg,
18399 .wp_read_cfg = spi_wp_read_cfg,
18400 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018401 .decode_range = decode_range_spi25,
18402 },
18403
18404 {
18405 .vendor = "Winbond",
18406 .name = "W25Q32JV",
18407 .bustype = BUS_SPI,
18408 .manufacture_id = WINBOND_NEX_ID,
18409 .model_id = WINBOND_NEX_W25Q32_V,
18410 .total_size = 4096,
18411 .page_size = 256,
18412 /* supports SFDP */
18413 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18414 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18415 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18416 .tested = TEST_OK_PREW,
18417 .probe = probe_spi_rdid,
18418 .probe_timing = TIMING_ZERO,
18419 .block_erasers =
18420 {
18421 {
18422 .eraseblocks = { {4 * 1024, 1024} },
18423 .block_erase = spi_block_erase_20,
18424 }, {
18425 .eraseblocks = { {32 * 1024, 128} },
18426 .block_erase = spi_block_erase_52,
18427 }, {
18428 .eraseblocks = { {64 * 1024, 64} },
18429 .block_erase = spi_block_erase_d8,
18430 }, {
18431 .eraseblocks = { {4 * 1024 * 1024, 1} },
18432 .block_erase = spi_block_erase_60,
18433 }, {
18434 .eraseblocks = { {4 * 1024 * 1024, 1} },
18435 .block_erase = spi_block_erase_c7,
18436 }
18437 },
18438 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18439 .unlock = spi_disable_blockprotect,
18440 .write = spi_chip_write_256,
18441 .read = spi_chip_read,
18442 .voltage = {2700, 3600},
18443 .reg_bits =
18444 {
18445 .srp = {STATUS1, 7, RW},
18446 .srl = {STATUS2, 0, RW},
18447 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18448 .tb = {STATUS1, 5, RW},
18449 .sec = {STATUS1, 6, RW},
18450 .cmp = {STATUS2, 6, RW},
18451 .wps = {STATUS3, 2, RW},
18452 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018453 .wp_write_cfg = spi_wp_write_cfg,
18454 .wp_read_cfg = spi_wp_read_cfg,
18455 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018456 .decode_range = decode_range_spi25,
18457 },
18458
18459 {
18460 .vendor = "Winbond",
Angel Pons0d4354e2024-05-26 16:33:51 +020018461 .name = "W25Q32JV-.M",
18462 .bustype = BUS_SPI,
18463 .manufacture_id = WINBOND_NEX_ID,
18464 .model_id = WINBOND_NEX_W25Q32JV,
18465 .total_size = 4096,
18466 .page_size = 256,
18467 /* supports SFDP */
18468 /* QPI enable 0x38 */
18469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI |
18470 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18471 .tested = TEST_OK_PREW,
18472 .probe = probe_spi_rdid,
18473 .probe_timing = TIMING_ZERO,
18474 .block_erasers =
18475 {
18476 {
18477 .eraseblocks = { {4 * 1024, 1024} },
18478 .block_erase = spi_block_erase_20,
18479 }, {
18480 .eraseblocks = { {32 * 1024, 128} },
18481 .block_erase = spi_block_erase_52,
18482 }, {
18483 .eraseblocks = { {64 * 1024, 64} },
18484 .block_erase = spi_block_erase_d8,
18485 }, {
18486 .eraseblocks = { {4 * 1024 * 1024, 1} },
18487 .block_erase = spi_block_erase_60,
18488 }, {
18489 .eraseblocks = { {4 * 1024 * 1024, 1} },
18490 .block_erase = spi_block_erase_c7,
18491 }
18492 },
18493 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
18494 .unlock = spi_disable_blockprotect_bp2_srwd,
18495 .write = spi_chip_write_256,
18496 .read = spi_chip_read,
18497 .voltage = {2700, 3600},
18498 .reg_bits =
18499 {
18500 .srp = {STATUS1, 7, RW},
18501 .srl = {STATUS2, 0, RW},
18502 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18503 .tb = {STATUS1, 5, RW},
18504 .sec = {STATUS1, 6, RW},
18505 .cmp = {STATUS2, 6, RW},
18506 .wps = {STATUS3, 2, RW},
18507 },
18508 .wp_write_cfg = spi_wp_write_cfg,
18509 .wp_read_cfg = spi_wp_read_cfg,
18510 .wp_get_ranges = spi_wp_get_available_ranges,
18511 .decode_range = decode_range_spi25,
18512 },
18513
18514 {
18515 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018516 .name = "W25Q32BW/W25Q32CW/W25Q32DW",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018517 .bustype = BUS_SPI,
18518 .manufacture_id = WINBOND_NEX_ID,
18519 .model_id = WINBOND_NEX_W25Q32_W,
18520 .total_size = 4096,
18521 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018522 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green1f9cc7d2019-07-01 11:10:45 +100018523 /* QPI enable 0x38, disable 0xFF */
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR_EXT2,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018525 .tested = TEST_OK_PREW,
18526 .probe = probe_spi_rdid,
18527 .probe_timing = TIMING_ZERO,
18528 .block_erasers =
18529 {
18530 {
18531 .eraseblocks = { {4 * 1024, 1024} },
18532 .block_erase = spi_block_erase_20,
18533 }, {
18534 .eraseblocks = { {32 * 1024, 128} },
18535 .block_erase = spi_block_erase_52,
18536 }, {
18537 .eraseblocks = { {64 * 1024, 64} },
18538 .block_erase = spi_block_erase_d8,
18539 }, {
18540 .eraseblocks = { {4 * 1024 * 1024, 1} },
18541 .block_erase = spi_block_erase_60,
18542 }, {
18543 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018544 .block_erase = spi_block_erase_c7,
18545 }
18546 },
18547 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18548 .unlock = spi_disable_blockprotect,
18549 .write = spi_chip_write_256,
18550 .read = spi_chip_read,
18551 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018552 .reg_bits =
18553 {
18554 .srp = {STATUS1, 7, RW},
18555 .srl = {STATUS2, 0, RW},
18556 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18557 .tb = {STATUS1, 5, RW},
18558 .sec = {STATUS1, 6, RW},
18559 .cmp = {STATUS2, 6, RW},
18560 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018561 .wp_write_cfg = spi_wp_write_cfg,
18562 .wp_read_cfg = spi_wp_read_cfg,
18563 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018564 .decode_range = decode_range_spi25,
18565 },
18566
18567 {
18568 .vendor = "Winbond",
18569 .name = "W25Q32FW",
18570 .bustype = BUS_SPI,
18571 .manufacture_id = WINBOND_NEX_ID,
18572 .model_id = WINBOND_NEX_W25Q32_W,
18573 .total_size = 4096,
18574 .page_size = 256,
18575 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18576 /* QPI enable 0x38, disable 0xFF */
18577 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI |
18578 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18579 .tested = TEST_OK_PREW,
18580 .probe = probe_spi_rdid,
18581 .probe_timing = TIMING_ZERO,
18582 .block_erasers =
18583 {
18584 {
18585 .eraseblocks = { {4 * 1024, 1024} },
18586 .block_erase = spi_block_erase_20,
18587 }, {
18588 .eraseblocks = { {32 * 1024, 128} },
18589 .block_erase = spi_block_erase_52,
18590 }, {
18591 .eraseblocks = { {64 * 1024, 64} },
18592 .block_erase = spi_block_erase_d8,
18593 }, {
18594 .eraseblocks = { {4 * 1024 * 1024, 1} },
18595 .block_erase = spi_block_erase_60,
18596 }, {
18597 .eraseblocks = { {4 * 1024 * 1024, 1} },
18598 .block_erase = spi_block_erase_c7,
18599 }
18600 },
18601 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18602 .unlock = spi_disable_blockprotect,
18603 .write = spi_chip_write_256,
18604 .read = spi_chip_read,
18605 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18606 .reg_bits =
18607 {
18608 .srp = {STATUS1, 7, RW},
18609 .srl = {STATUS2, 0, RW},
18610 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18611 .tb = {STATUS1, 5, RW},
18612 .sec = {STATUS1, 6, RW},
18613 .cmp = {STATUS2, 6, RW},
18614 .wps = {STATUS3, 2, RW},
18615 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018616 .wp_write_cfg = spi_wp_write_cfg,
18617 .wp_read_cfg = spi_wp_read_cfg,
18618 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018619 .decode_range = decode_range_spi25,
18620 },
18621
18622 {
18623 .vendor = "Winbond",
18624 .name = "W25Q32JW...Q",
18625 .bustype = BUS_SPI,
18626 .manufacture_id = WINBOND_NEX_ID,
18627 .model_id = WINBOND_NEX_W25Q32_W,
18628 .total_size = 4096,
18629 .page_size = 256,
18630 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18631 /* QPI enable 0x38, disable 0xFF */
18632 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18633 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18634 .tested = TEST_OK_PREW,
18635 .probe = probe_spi_rdid,
18636 .probe_timing = TIMING_ZERO,
18637 .block_erasers =
18638 {
18639 {
18640 .eraseblocks = { {4 * 1024, 1024} },
18641 .block_erase = spi_block_erase_20,
18642 }, {
18643 .eraseblocks = { {32 * 1024, 128} },
18644 .block_erase = spi_block_erase_52,
18645 }, {
18646 .eraseblocks = { {64 * 1024, 64} },
18647 .block_erase = spi_block_erase_d8,
18648 }, {
18649 .eraseblocks = { {4 * 1024 * 1024, 1} },
18650 .block_erase = spi_block_erase_60,
18651 }, {
18652 .eraseblocks = { {4 * 1024 * 1024, 1} },
18653 .block_erase = spi_block_erase_c7,
18654 }
18655 },
18656 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18657 .unlock = spi_disable_blockprotect,
18658 .write = spi_chip_write_256,
18659 .read = spi_chip_read,
18660 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18661 .reg_bits =
18662 {
18663 .srp = {STATUS1, 7, RW},
18664 .srl = {STATUS2, 0, RW},
18665 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18666 .tb = {STATUS1, 5, RW},
18667 .sec = {STATUS1, 6, RW},
18668 .cmp = {STATUS2, 6, RW},
18669 .wps = {STATUS3, 2, RW},
18670 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018671 .wp_write_cfg = spi_wp_write_cfg,
18672 .wp_read_cfg = spi_wp_read_cfg,
18673 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018674 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018675 },
18676
18677 {
18678 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100018679 .name = "W25Q32JW...M",
18680 .bustype = BUS_SPI,
18681 .manufacture_id = WINBOND_NEX_ID,
18682 .model_id = WINBOND_NEX_W25Q32JW_M,
18683 .total_size = 4096,
18684 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018685 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18686 /* QPI enable 0x38, disable 0xFF */
18687 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18688 FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2,
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100018689 .tested = TEST_OK_PREW,
18690 .probe = probe_spi_rdid,
18691 .probe_timing = TIMING_ZERO,
18692 .block_erasers =
18693 {
18694 {
18695 .eraseblocks = { {4 * 1024, 1024} },
18696 .block_erase = spi_block_erase_20,
18697 }, {
18698 .eraseblocks = { {32 * 1024, 128} },
18699 .block_erase = spi_block_erase_52,
18700 }, {
18701 .eraseblocks = { {64 * 1024, 64} },
18702 .block_erase = spi_block_erase_d8,
18703 }, {
18704 .eraseblocks = { {4 * 1024 * 1024, 1} },
18705 .block_erase = spi_block_erase_60,
18706 }, {
18707 .eraseblocks = { {4 * 1024 * 1024, 1} },
18708 .block_erase = spi_block_erase_c7,
18709 }
18710 },
18711 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
18712 .unlock = spi_disable_blockprotect_bp2_srwd,
18713 .write = spi_chip_write_256,
18714 .read = spi_chip_read,
18715 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018716 .reg_bits =
18717 {
18718 .srp = {STATUS1, 7, RW},
18719 .srl = {STATUS2, 0, RW},
18720 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18721 .tb = {STATUS1, 5, RW},
18722 .sec = {STATUS1, 6, RW},
18723 .cmp = {STATUS2, 6, RW},
18724 .wps = {STATUS3, 2, RW},
18725 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018726 .wp_write_cfg = spi_wp_write_cfg,
18727 .wp_read_cfg = spi_wp_read_cfg,
18728 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018729 .decode_range = decode_range_spi25,
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100018730 },
18731
18732 {
18733 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018734 .name = "W25Q40.V",
18735 .bustype = BUS_SPI,
18736 .manufacture_id = WINBOND_NEX_ID,
18737 .model_id = WINBOND_NEX_W25Q40_V,
18738 .total_size = 512,
18739 .page_size = 256,
18740 /* supports SFDP */
18741 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18742 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
18743 .tested = TEST_OK_PREW,
18744 .probe = probe_spi_rdid,
18745 .probe_timing = TIMING_ZERO,
18746 .block_erasers =
18747 {
18748 {
18749 .eraseblocks = { {4 * 1024, 128} },
18750 .block_erase = spi_block_erase_20,
18751 }, {
18752 .eraseblocks = { {32 * 1024, 16} },
18753 .block_erase = spi_block_erase_52,
18754 }, {
18755 .eraseblocks = { {64 * 1024, 8} },
18756 .block_erase = spi_block_erase_d8,
18757 }, {
18758 .eraseblocks = { {512 * 1024, 1} },
18759 .block_erase = spi_block_erase_60,
18760 }, {
18761 .eraseblocks = { {512 * 1024, 1} },
18762 .block_erase = spi_block_erase_c7,
18763 }
18764 },
18765 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18766 .unlock = spi_disable_blockprotect,
18767 .write = spi_chip_write_256, /* Multi I/O supported */
18768 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
18769 .voltage = {2700, 3600},
18770 },
18771
18772 {
18773 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020018774 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018775 .bustype = BUS_SPI,
18776 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020018777 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018778 .total_size = 512,
18779 .page_size = 256,
18780 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18781 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons3164a0c2018-09-30 20:26:06 +020018782 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018783 .probe = probe_spi_rdid,
18784 .probe_timing = TIMING_ZERO,
18785 .block_erasers =
18786 {
18787 {
18788 .eraseblocks = { {4 * 1024, 128} },
18789 .block_erase = spi_block_erase_20,
18790 }, {
18791 .eraseblocks = { {32 * 1024, 16} },
18792 .block_erase = spi_block_erase_52,
18793 }, {
18794 .eraseblocks = { {64 * 1024, 8} },
18795 .block_erase = spi_block_erase_d8,
18796 }, {
18797 .eraseblocks = { {512 * 1024, 1} },
18798 .block_erase = spi_block_erase_60,
18799 }, {
18800 .eraseblocks = { {512 * 1024, 1} },
18801 .block_erase = spi_block_erase_c7,
18802 }
18803 },
18804 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18805 .unlock = spi_disable_blockprotect,
18806 .write = spi_chip_write_256,
18807 .read = spi_chip_read,
18808 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18809 },
18810
18811 {
18812 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020018813 .name = "W25Q40EW",
18814 .bustype = BUS_SPI,
18815 .manufacture_id = WINBOND_NEX_ID,
18816 .model_id = WINBOND_NEX_W25Q40EW,
18817 .total_size = 512,
18818 .page_size = 256,
18819 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18820 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green07b8a172019-09-23 16:47:05 +100018821 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020018822 .probe = probe_spi_rdid,
18823 .probe_timing = TIMING_ZERO,
18824 .block_erasers =
18825 {
18826 {
18827 .eraseblocks = { {4 * 1024, 128} },
18828 .block_erase = spi_block_erase_20,
18829 }, {
18830 .eraseblocks = { {32 * 1024, 16} },
18831 .block_erase = spi_block_erase_52,
18832 }, {
18833 .eraseblocks = { {64 * 1024, 8} },
18834 .block_erase = spi_block_erase_d8,
18835 }, {
18836 .eraseblocks = { {512 * 1024, 1} },
18837 .block_erase = spi_block_erase_60,
18838 }, {
18839 .eraseblocks = { {512 * 1024, 1} },
18840 .block_erase = spi_block_erase_c7,
18841 }
18842 },
18843 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18844 .unlock = spi_disable_blockprotect,
18845 .write = spi_chip_write_256,
18846 .read = spi_chip_read,
18847 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
18848 },
18849
Stanislav Sedovf5775442018-03-07 14:16:51 -080018850 {
18851 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093018852 .name = "W25Q512JV",
18853 .bustype = BUS_SPI,
18854 .manufacture_id = WINBOND_NEX_ID,
18855 .model_id = WINBOND_NEX_W25Q512JV,
18856 .total_size = 64 * 1024,
18857 .page_size = 256,
18858 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
18859 .tested = TEST_OK_PREW,
18860 .probe = probe_spi_rdid,
18861 .probe_timing = TIMING_ZERO,
18862 .block_erasers =
18863 {
18864 {
18865 .eraseblocks = { {4 * 1024, 16384} },
18866 .block_erase = spi_block_erase_21,
18867 }, {
18868 .eraseblocks = { {4 * 1024, 16384} },
18869 .block_erase = spi_block_erase_20,
18870 }, {
18871 .eraseblocks = { {32 * 1024, 2048} },
18872 .block_erase = spi_block_erase_52,
18873 }, {
18874 .eraseblocks = { {64 * 1024, 1024} },
18875 .block_erase = spi_block_erase_dc,
18876 }, {
18877 .eraseblocks = { {64 * 1024, 1024} },
18878 .block_erase = spi_block_erase_d8,
18879 }, {
18880 .eraseblocks = { {64 * 1024 * 1024, 1} },
18881 .block_erase = spi_block_erase_60,
18882 }, {
18883 .eraseblocks = { {64 * 1024 * 1024, 1} },
18884 .block_erase = spi_block_erase_c7,
18885 }
18886 },
18887 .printlock = spi_prettyprint_status_register_plain,
18888 .unlock = spi_disable_blockprotect,
18889 .write = spi_chip_write_256,
18890 .read = spi_chip_read,
18891 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010018892 .prepare_access = spi_prepare_4ba,
Joel Stanley55439612019-07-27 19:25:35 +093018893 },
18894
18895 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010018896 .vendor = "Winbond",
18897 .name = "W25Q512NW-IM",
18898 .bustype = BUS_SPI,
18899 .manufacture_id = WINBOND_NEX_ID,
18900 .model_id = WINBOND_NEX_W25Q512NW_IM,
18901 .total_size = 64 * 1024,
18902 .page_size = 256,
Subrata Banikf5bffd92022-12-14 12:30:43 +053018903 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2
18904 | FEATURE_WRSR3,
18905 .tested = TEST_OK_PREWB,
Felix Singer3c9bdb92022-12-15 23:30:16 +010018906 .probe = probe_spi_rdid,
18907 .probe_timing = TIMING_ZERO,
18908 .block_erasers =
Atul Dhudase2502dbd2021-09-21 10:02:20 +053018909 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010018910 {
18911 .eraseblocks = { {4 * 1024, 16384} },
18912 .block_erase = spi_block_erase_21,
18913 }, {
18914 .eraseblocks = { {4 * 1024, 16384} },
18915 .block_erase = spi_block_erase_20,
18916 }, {
18917 .eraseblocks = { {32 * 1024, 2048} },
18918 .block_erase = spi_block_erase_52,
18919 }, {
18920 .eraseblocks = { {64 * 1024, 1024} },
18921 .block_erase = spi_block_erase_dc,
18922 }, {
18923 .eraseblocks = { {64 * 1024, 1024} },
18924 .block_erase = spi_block_erase_d8,
18925 }, {
18926 .eraseblocks = { {64 * 1024 * 1024, 1} },
18927 .block_erase = spi_block_erase_60,
18928 }, {
18929 .eraseblocks = { {64 * 1024 * 1024, 1} },
18930 .block_erase = spi_block_erase_c7,
18931 }
18932 },
18933 .unlock = spi_disable_blockprotect,
18934 .write = spi_chip_write_256,
18935 .read = spi_chip_read,
18936 .voltage = {1650, 1950},
Subrata Banikf5bffd92022-12-14 12:30:43 +053018937 .reg_bits =
18938 {
18939 .srp = {STATUS1, 7, RW},
18940 .srl = {STATUS2, 0, RW},
18941 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18942 .tb = {STATUS1, 6, RW},
18943 .cmp = {STATUS2, 6, RW},
18944 .wps = {STATUS3, 2, RW},
18945 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018946 .wp_write_cfg = spi_wp_write_cfg,
18947 .wp_read_cfg = spi_wp_read_cfg,
18948 .wp_get_ranges = spi_wp_get_available_ranges,
Subrata Banikf5bffd92022-12-14 12:30:43 +053018949 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018950 .prepare_access = spi_prepare_4ba,
Atul Dhudase2502dbd2021-09-21 10:02:20 +053018951 },
18952
18953 {
Joel Stanley55439612019-07-27 19:25:35 +093018954 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018955 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080018956 .bustype = BUS_SPI,
18957 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018958 .model_id = WINBOND_NEX_W25Q64_V,
18959 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080018960 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018961 /* supports SFDP */
18962 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018963 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030018964 .tested = TEST_OK_PREWB,
Stanislav Sedovf5775442018-03-07 14:16:51 -080018965 .probe = probe_spi_rdid,
18966 .probe_timing = TIMING_ZERO,
18967 .block_erasers =
18968 {
18969 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018970 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018971 .block_erase = spi_block_erase_20,
18972 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018973 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018974 .block_erase = spi_block_erase_52,
18975 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018976 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018977 .block_erase = spi_block_erase_d8,
18978 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018979 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018980 .block_erase = spi_block_erase_60,
18981 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018982 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018983 .block_erase = spi_block_erase_c7,
18984 }
18985 },
18986 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18987 .unlock = spi_disable_blockprotect,
18988 .write = spi_chip_write_256,
18989 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018990 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018991 .reg_bits =
18992 {
18993 .srp = {STATUS1, 7, RW},
18994 .srl = {STATUS2, 0, RW},
18995 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18996 .tb = {STATUS1, 5, RW},
18997 .sec = {STATUS1, 6, RW},
18998 .cmp = {STATUS2, 6, RW},
18999 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019000 .wp_write_cfg = spi_wp_write_cfg,
19001 .wp_read_cfg = spi_wp_read_cfg,
19002 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019003 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019004 },
19005
19006 {
19007 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019008 .name = "W25Q64JV-.Q",
19009 .bustype = BUS_SPI,
19010 .manufacture_id = WINBOND_NEX_ID,
19011 .model_id = WINBOND_NEX_W25Q64_V,
19012 .total_size = 8192,
19013 .page_size = 256,
19014 /* supports SFDP */
19015 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber3f3c1f32022-05-28 16:48:26 +020019016 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
19017 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019018 .tested = TEST_OK_PREW,
19019 .probe = probe_spi_rdid,
19020 .probe_timing = TIMING_ZERO,
19021 .block_erasers =
19022 {
19023 {
19024 .eraseblocks = { {4 * 1024, 2048} },
19025 .block_erase = spi_block_erase_20,
19026 }, {
19027 .eraseblocks = { {32 * 1024, 256} },
19028 .block_erase = spi_block_erase_52,
19029 }, {
19030 .eraseblocks = { {64 * 1024, 128} },
19031 .block_erase = spi_block_erase_d8,
19032 }, {
19033 .eraseblocks = { {8 * 1024 * 1024, 1} },
19034 .block_erase = spi_block_erase_60,
19035 }, {
19036 .eraseblocks = { {8 * 1024 * 1024, 1} },
19037 .block_erase = spi_block_erase_c7,
19038 }
19039 },
19040 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19041 .unlock = spi_disable_blockprotect,
19042 .write = spi_chip_write_256,
19043 .read = spi_chip_read,
19044 .voltage = {2700, 3600},
19045 .reg_bits =
19046 {
19047 .srp = {STATUS1, 7, RW},
19048 .srl = {STATUS2, 0, RW},
19049 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19050 .tb = {STATUS1, 5, RW},
19051 .sec = {STATUS1, 6, RW},
19052 .cmp = {STATUS2, 6, RW},
19053 .wps = {STATUS3, 2, RW},
19054 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019055 .wp_write_cfg = spi_wp_write_cfg,
19056 .wp_read_cfg = spi_wp_read_cfg,
19057 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019058 .decode_range = decode_range_spi25,
19059 },
19060
19061 {
19062 .vendor = "Winbond",
19063 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010019064 .bustype = BUS_SPI,
19065 .manufacture_id = WINBOND_NEX_ID,
19066 .model_id = WINBOND_NEX_W25Q64JV,
19067 .total_size = 8192,
19068 .page_size = 256,
19069 /* supports SFDP */
19070 /* QPI enable 0x38 */
19071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19072 .tested = TEST_OK_PREW,
19073 .probe = probe_spi_rdid,
19074 .probe_timing = TIMING_ZERO,
19075 .block_erasers =
19076 {
19077 {
19078 .eraseblocks = { {4 * 1024, 2048} },
19079 .block_erase = spi_block_erase_20,
19080 }, {
19081 .eraseblocks = { {32 * 1024, 256} },
19082 .block_erase = spi_block_erase_52,
19083 }, {
19084 .eraseblocks = { {64 * 1024, 128} },
19085 .block_erase = spi_block_erase_d8,
19086 }, {
19087 .eraseblocks = { {8 * 1024 * 1024, 1} },
19088 .block_erase = spi_block_erase_60,
19089 }, {
19090 .eraseblocks = { {8 * 1024 * 1024, 1} },
19091 .block_erase = spi_block_erase_c7,
19092 }
19093 },
19094 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19095 .unlock = spi_disable_blockprotect_bp2_srwd,
19096 .write = spi_chip_write_256,
19097 .read = spi_chip_read,
19098 .voltage = {2700, 3600},
19099 },
19100
19101 {
19102 .vendor = "Winbond",
Nico Hubera358b142024-04-14 18:29:06 +020019103 .name = "W25Q64DW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019104 .bustype = BUS_SPI,
19105 .manufacture_id = WINBOND_NEX_ID,
19106 .model_id = WINBOND_NEX_W25Q64_W,
19107 .total_size = 8192,
19108 .page_size = 256,
19109 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19110 /* QPI enable 0x38, disable 0xFF */
Nico Hubera358b142024-04-14 18:29:06 +020019111 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI,
19112 .tested = TEST_OK_PREW,
19113 .probe = probe_spi_rdid,
19114 .probe_timing = TIMING_ZERO,
19115 .block_erasers =
19116 {
19117 {
19118 .eraseblocks = { {4 * 1024, 2048} },
19119 .block_erase = spi_block_erase_20,
19120 }, {
19121 .eraseblocks = { {32 * 1024, 256} },
19122 .block_erase = spi_block_erase_52,
19123 }, {
19124 .eraseblocks = { {64 * 1024, 128} },
19125 .block_erase = spi_block_erase_d8,
19126 }, {
19127 .eraseblocks = { {8 * 1024 * 1024, 1} },
19128 .block_erase = spi_block_erase_60,
19129 }, {
19130 .eraseblocks = { {8 * 1024 * 1024, 1} },
19131 .block_erase = spi_block_erase_c7,
19132 }
19133 },
19134 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19135 .unlock = spi_disable_blockprotect,
19136 .write = spi_chip_write_256,
19137 .read = spi_chip_read,
19138 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
19139 .reg_bits =
19140 {
19141 .srp = {STATUS1, 7, RW},
19142 .srl = {STATUS2, 0, RW},
19143 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19144 .tb = {STATUS1, 5, RW},
19145 .sec = {STATUS1, 6, RW},
19146 .cmp = {STATUS2, 6, RW},
19147 },
19148 .wp_write_cfg = spi_wp_write_cfg,
19149 .wp_read_cfg = spi_wp_read_cfg,
19150 .wp_get_ranges = spi_wp_get_available_ranges,
19151 .decode_range = decode_range_spi25,
19152 },
19153
19154 {
19155 .vendor = "Winbond",
19156 .name = "W25Q64FW/W25Q64JW...Q",
19157 .bustype = BUS_SPI,
19158 .manufacture_id = WINBOND_NEX_ID,
19159 .model_id = WINBOND_NEX_W25Q64_W,
19160 .total_size = 8192,
19161 .page_size = 256,
19162 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19163 /* QPI enable 0x38, disable 0xFF */
19164 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19165 FEATURE_OTP | FEATURE_QPI,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030019166 .tested = TEST_OK_PREWB,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019167 .probe = probe_spi_rdid,
19168 .probe_timing = TIMING_ZERO,
19169 .block_erasers =
19170 {
19171 {
19172 .eraseblocks = { {4 * 1024, 2048} },
19173 .block_erase = spi_block_erase_20,
19174 }, {
19175 .eraseblocks = { {32 * 1024, 256} },
19176 .block_erase = spi_block_erase_52,
19177 }, {
19178 .eraseblocks = { {64 * 1024, 128} },
19179 .block_erase = spi_block_erase_d8,
19180 }, {
19181 .eraseblocks = { {8 * 1024 * 1024, 1} },
19182 .block_erase = spi_block_erase_60,
19183 }, {
19184 .eraseblocks = { {8 * 1024 * 1024, 1} },
19185 .block_erase = spi_block_erase_c7,
19186 }
19187 },
19188 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19189 .unlock = spi_disable_blockprotect,
19190 .write = spi_chip_write_256,
19191 .read = spi_chip_read,
19192 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019193 .reg_bits =
19194 {
19195 .srp = {STATUS1, 7, RW},
19196 .srl = {STATUS2, 0, RW},
19197 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19198 .tb = {STATUS1, 5, RW},
19199 .sec = {STATUS1, 6, RW},
19200 .cmp = {STATUS2, 6, RW},
19201 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019202 .wp_write_cfg = spi_wp_write_cfg,
19203 .wp_read_cfg = spi_wp_read_cfg,
19204 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019205 .decode_range = decode_range_spi25,
Antony Rheneus0fbba982011-05-26 14:28:51 +000019206 },
19207
19208 {
19209 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019210 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080019211 .bustype = BUS_SPI,
19212 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019213 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080019214 .total_size = 8192,
19215 .page_size = 256,
19216 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19217 /* QPI enable 0x38, disable 0xFF */
Evan Benn29c8b5d2022-09-13 16:01:10 +100019218 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3,
Scott Chao1bbc5012020-04-08 22:10:50 +080019219 .tested = TEST_OK_PREW,
19220 .probe = probe_spi_rdid,
19221 .probe_timing = TIMING_ZERO,
19222 .block_erasers =
19223 {
19224 {
19225 .eraseblocks = { {4 * 1024, 2048} },
19226 .block_erase = spi_block_erase_20,
19227 }, {
19228 .eraseblocks = { {32 * 1024, 256} },
19229 .block_erase = spi_block_erase_52,
19230 }, {
19231 .eraseblocks = { {64 * 1024, 128} },
19232 .block_erase = spi_block_erase_d8,
19233 }, {
19234 .eraseblocks = { {8 * 1024 * 1024, 1} },
19235 .block_erase = spi_block_erase_60,
19236 }, {
19237 .eraseblocks = { {8 * 1024 * 1024, 1} },
19238 .block_erase = spi_block_erase_c7,
19239 }
19240 },
19241 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19242 .unlock = spi_disable_blockprotect,
19243 .write = spi_chip_write_256,
19244 .read = spi_chip_read,
19245 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Evan Benn29c8b5d2022-09-13 16:01:10 +100019246 .reg_bits =
19247 {
19248 .srp = {STATUS1, 7, RW},
19249 .srl = {STATUS2, 0, RW},
19250 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19251 .tb = {STATUS1, 5, RW},
19252 .sec = {STATUS1, 6, RW},
19253 .cmp = {STATUS2, 6, RW},
19254 .wps = {STATUS3, 2, RW},
19255 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019256 .wp_write_cfg = spi_wp_write_cfg,
19257 .wp_read_cfg = spi_wp_read_cfg,
19258 .wp_get_ranges = spi_wp_get_available_ranges,
Evan Benn29c8b5d2022-09-13 16:01:10 +100019259 .decode_range = decode_range_spi25,
Scott Chao1bbc5012020-04-08 22:10:50 +080019260 },
19261
19262 {
19263 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019264 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020019265 .bustype = BUS_SPI,
19266 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019267 .model_id = WINBOND_NEX_W25Q80_V,
19268 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020019269 .page_size = 256,
19270 /* supports SFDP */
19271 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green1f9cc7d2019-07-01 11:10:45 +100019272 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks48729d32017-12-08 14:44:07 -080019273 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020019274 .probe = probe_spi_rdid,
19275 .probe_timing = TIMING_ZERO,
19276 .block_erasers =
19277 {
19278 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019279 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019280 .block_erase = spi_block_erase_20,
19281 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019282 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019283 .block_erase = spi_block_erase_52,
19284 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019285 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019286 .block_erase = spi_block_erase_d8,
19287 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019288 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019289 .block_erase = spi_block_erase_60,
19290 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019291 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019292 .block_erase = spi_block_erase_c7,
19293 }
19294 },
19295 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19296 .unlock = spi_disable_blockprotect,
19297 .write = spi_chip_write_256,
19298 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019299 .voltage = {2700, 3600},
19300 },
19301
19302 {
19303 .vendor = "Winbond",
19304 .name = "W25Q80BW",
19305 .bustype = BUS_SPI,
19306 .manufacture_id = WINBOND_NEX_ID,
19307 .model_id = WINBOND_NEX_W25Q80BW,
19308 .total_size = 1024,
19309 .page_size = 256,
19310 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19311 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
19312 .tested = TEST_OK_PREW,
19313 .probe = probe_spi_rdid,
19314 .probe_timing = TIMING_ZERO,
19315 .block_erasers =
19316 {
19317 {
19318 .eraseblocks = { {4 * 1024, 256} },
19319 .block_erase = spi_block_erase_20,
19320 }, {
19321 .eraseblocks = { {32 * 1024, 32} },
19322 .block_erase = spi_block_erase_52,
19323 }, {
19324 .eraseblocks = { {64 * 1024, 16} },
19325 .block_erase = spi_block_erase_d8,
19326 }, {
19327 .eraseblocks = { {1 * 1024 * 1024, 1} },
19328 .block_erase = spi_block_erase_60,
19329 }, {
19330 .eraseblocks = { {1 * 1024 * 1024, 1} },
19331 .block_erase = spi_block_erase_c7,
19332 }
19333 },
19334 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19335 .unlock = spi_disable_blockprotect,
19336 .write = spi_chip_write_256,
19337 .read = spi_chip_read,
19338 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
19339 },
19340
19341 {
19342 .vendor = "Winbond",
19343 .name = "W25Q80EW",
19344 .bustype = BUS_SPI,
19345 .manufacture_id = WINBOND_NEX_ID,
19346 .model_id = WINBOND_NEX_W25Q80EW,
19347 .total_size = 1024,
19348 .page_size = 256,
19349 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19350 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
19351 .tested = TEST_OK_PREW,
19352 .probe = probe_spi_rdid,
19353 .probe_timing = TIMING_ZERO,
19354 .block_erasers =
19355 {
19356 {
19357 .eraseblocks = { {4 * 1024, 256} },
19358 .block_erase = spi_block_erase_20,
19359 }, {
19360 .eraseblocks = { {32 * 1024, 32} },
19361 .block_erase = spi_block_erase_52,
19362 }, {
19363 .eraseblocks = { {64 * 1024, 16} },
19364 .block_erase = spi_block_erase_d8,
19365 }, {
19366 .eraseblocks = { {1 * 1024 * 1024, 1} },
19367 .block_erase = spi_block_erase_60,
19368 }, {
19369 .eraseblocks = { {1 * 1024 * 1024, 1} },
19370 .block_erase = spi_block_erase_c7,
19371 }
19372 },
19373 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19374 .unlock = spi_disable_blockprotect,
19375 .write = spi_chip_write_256,
19376 .read = spi_chip_read,
19377 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nico Huber70eed9f2017-04-24 22:19:27 +020019378 },
19379
19380 {
19381 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040019382 .name = "W25X05",
19383 .bustype = BUS_SPI,
19384 .manufacture_id = WINBOND_NEX_ID,
19385 .model_id = WINBOND_NEX_W25X05,
19386 .total_size = 64,
19387 .page_size = 256,
19388 .feature_bits = FEATURE_WRSR_WREN,
19389 .tested = TEST_OK_PREW,
19390 .probe = probe_spi_rdid,
19391 .probe_timing = TIMING_ZERO,
19392 .block_erasers =
19393 {
19394 {
19395 .eraseblocks = { {4 * 1024, 16} },
19396 .block_erase = spi_block_erase_20,
19397 }, {
19398 .eraseblocks = { {32 * 1024, 2} },
19399 .block_erase = spi_block_erase_52,
19400 }, {
19401 .eraseblocks = { {64 * 1024, 1} },
19402 .block_erase = spi_block_erase_d8,
19403 }
19404 },
19405 .printlock = spi_prettyprint_status_register_plain,
19406 .unlock = spi_disable_blockprotect,
19407 .write = spi_chip_write_256,
19408 .read = spi_chip_read,
19409 .voltage = {2300, 3600},
19410 },
19411
19412 {
19413 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019414 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019415 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019416 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019417 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019418 .total_size = 128,
19419 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000019420 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000019421 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019422 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019423 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019424 .block_erasers =
19425 {
19426 {
19427 .eraseblocks = { {4 * 1024, 32} },
19428 .block_erase = spi_block_erase_20,
19429 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019430 .eraseblocks = { {64 * 1024, 2} },
19431 .block_erase = spi_block_erase_d8,
19432 }, {
19433 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019434 .block_erase = spi_block_erase_c7,
19435 }
19436 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019438 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000019439 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019440 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019441 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019442 },
19443
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019444 {
19445 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019446 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019447 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000019448 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019449 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000019450 .total_size = 2048,
19451 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000019452 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000019453 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000019454 .probe = probe_spi_rdid,
19455 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019456 .block_erasers =
19457 {
19458 {
19459 .eraseblocks = { {4 * 1024, 512} },
19460 .block_erase = spi_block_erase_20,
19461 }, {
19462 .eraseblocks = { {32 * 1024, 64} },
19463 .block_erase = spi_block_erase_52,
19464 }, {
19465 .eraseblocks = { {64 * 1024, 32} },
19466 .block_erase = spi_block_erase_d8,
19467 }, {
19468 .eraseblocks = { {2 * 1024 * 1024, 1} },
19469 .block_erase = spi_block_erase_60,
19470 }, {
19471 .eraseblocks = { {2 * 1024 * 1024, 1} },
19472 .block_erase = spi_block_erase_c7,
19473 }
19474 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019475 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019476 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000019477 .write = spi_chip_write_256,
19478 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019479 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000019480 },
19481
19482 {
19483 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019484 .name = "W25X20",
19485 .bustype = BUS_SPI,
19486 .manufacture_id = WINBOND_NEX_ID,
19487 .model_id = WINBOND_NEX_W25X20,
19488 .total_size = 256,
19489 .page_size = 256,
19490 .feature_bits = FEATURE_WRSR_WREN,
19491 .tested = TEST_OK_PREW,
19492 .probe = probe_spi_rdid,
19493 .probe_timing = TIMING_ZERO,
19494 .block_erasers =
19495 {
19496 {
19497 .eraseblocks = { {4 * 1024, 64} },
19498 .block_erase = spi_block_erase_20,
19499 }, {
19500 .eraseblocks = { {64 * 1024, 4} },
19501 .block_erase = spi_block_erase_d8,
19502 }, {
19503 .eraseblocks = { {256 * 1024, 1} },
19504 .block_erase = spi_block_erase_c7,
19505 }
19506 },
19507 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19508 .unlock = spi_disable_blockprotect,
19509 .write = spi_chip_write_256,
19510 .read = spi_chip_read,
19511 .voltage = {2700, 3600},
19512 },
19513
19514 {
19515 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019516 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019517 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000019518 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019519 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000019520 .total_size = 4096,
19521 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000019522 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000019523 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000019524 .probe = probe_spi_rdid,
19525 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019526 .block_erasers =
19527 {
19528 {
19529 .eraseblocks = { {4 * 1024, 1024} },
19530 .block_erase = spi_block_erase_20,
19531 }, {
19532 .eraseblocks = { {32 * 1024, 128} },
19533 .block_erase = spi_block_erase_52,
19534 }, {
19535 .eraseblocks = { {64 * 1024, 64} },
19536 .block_erase = spi_block_erase_d8,
19537 }, {
19538 .eraseblocks = { {4 * 1024 * 1024, 1} },
19539 .block_erase = spi_block_erase_60,
19540 }, {
19541 .eraseblocks = { {4 * 1024 * 1024, 1} },
19542 .block_erase = spi_block_erase_c7,
19543 }
19544 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019545 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019546 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000019547 .write = spi_chip_write_256,
19548 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019549 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000019550 },
19551
19552 {
19553 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019554 .name = "W25X40",
19555 .bustype = BUS_SPI,
19556 .manufacture_id = WINBOND_NEX_ID,
19557 .model_id = WINBOND_NEX_W25X40,
19558 .total_size = 512,
19559 .page_size = 256,
19560 .feature_bits = FEATURE_WRSR_WREN,
19561 .tested = TEST_OK_PREW,
19562 .probe = probe_spi_rdid,
19563 .probe_timing = TIMING_ZERO,
19564 .block_erasers =
19565 {
19566 {
19567 .eraseblocks = { {4 * 1024, 128} },
19568 .block_erase = spi_block_erase_20,
19569 }, {
19570 .eraseblocks = { {64 * 1024, 8} },
19571 .block_erase = spi_block_erase_d8,
19572 }, {
19573 .eraseblocks = { {512 * 1024, 1} },
19574 .block_erase = spi_block_erase_c7,
19575 }
19576 },
19577 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19578 .unlock = spi_disable_blockprotect,
19579 .write = spi_chip_write_256,
19580 .read = spi_chip_read,
19581 .voltage = {2700, 3600},
19582 },
19583
19584 {
19585 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019586 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019587 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000019588 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019589 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000019590 .total_size = 8192,
19591 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000019592 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000019593 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000019594 .probe = probe_spi_rdid,
19595 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019596 .block_erasers =
19597 {
19598 {
19599 .eraseblocks = { {4 * 1024, 2048} },
19600 .block_erase = spi_block_erase_20,
19601 }, {
19602 .eraseblocks = { {32 * 1024, 256} },
19603 .block_erase = spi_block_erase_52,
19604 }, {
19605 .eraseblocks = { {64 * 1024, 128} },
19606 .block_erase = spi_block_erase_d8,
19607 }, {
19608 .eraseblocks = { {8 * 1024 * 1024, 1} },
19609 .block_erase = spi_block_erase_60,
19610 }, {
19611 .eraseblocks = { {8 * 1024 * 1024, 1} },
19612 .block_erase = spi_block_erase_c7,
19613 }
19614 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019615 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019616 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000019617 .write = spi_chip_write_256,
19618 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019619 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000019620 },
19621
19622 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100019623 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019624 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100019625 .bustype = BUS_SPI,
19626 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019627 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100019628 .total_size = 1024,
19629 .page_size = 256,
19630 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019631 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100019632 .probe = probe_spi_rdid,
19633 .probe_timing = TIMING_ZERO,
19634 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080019635 {
19636 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019637 .eraseblocks = { {4 * 1024, 256} },
19638 .block_erase = spi_block_erase_20,
19639 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080019640 .eraseblocks = { {64 * 1024, 16} },
19641 .block_erase = spi_block_erase_d8,
19642 }, {
19643 .eraseblocks = { {1024 * 1024, 1} },
19644 .block_erase = spi_block_erase_c7,
19645 }
19646 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100019647 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19648 .unlock = spi_disable_blockprotect,
19649 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019650 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100019651 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080019652 },
19653
Alan Greenf29ea362019-06-27 17:14:02 +100019654 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
19655 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000019656 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000019657 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019658 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019659 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019660 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019661 .total_size = 128,
19662 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019663 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000019664 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019665 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000019666 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019667 .block_erasers =
19668 {
19669 {
19670 .eraseblocks = { {128 * 1024, 1} },
19671 .block_erase = erase_chip_block_jedec,
19672 }
19673 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019674 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019675 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010019676 .prepare_access = prepare_memory_access,
19677 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000019678 },
19679
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019680 {
19681 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019682 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
19683 .bustype = BUS_PARALLEL,
19684 .manufacture_id = WINBOND_ID,
19685 .model_id = WINBOND_W29C010,
19686 .total_size = 128,
19687 .page_size = 128,
19688 .feature_bits = FEATURE_LONG_RESET,
19689 .tested = TEST_OK_PREW,
19690 .probe = probe_w29ee011,
19691 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
19692 .block_erasers =
19693 {
19694 {
19695 .eraseblocks = { {128 * 1024, 1} },
19696 .block_erase = erase_chip_block_jedec,
19697 }
19698 },
19699 .write = write_jedec,
19700 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010019701 .prepare_access = prepare_memory_access,
19702 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019703 },
19704
19705 {
19706 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000019707 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019708 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019709 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019710 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019711 .total_size = 256,
19712 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019713 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019714 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019715 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019716 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019717 .block_erasers =
19718 {
19719 {
19720 .eraseblocks = { {256 * 1024, 1} },
19721 .block_erase = erase_chip_block_jedec,
19722 }
19723 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019724 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019725 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019726 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010019727 .prepare_access = prepare_memory_access,
19728 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000019729 },
19730
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019731 {
19732 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000019733 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019734 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019735 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019736 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019737 .total_size = 512,
19738 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000019739 .feature_bits = FEATURE_LONG_RESET,
19740 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019741 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000019742 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019743 .block_erasers =
19744 {
19745 {
19746 .eraseblocks = { {512 * 1024, 1} },
19747 .block_erase = erase_chip_block_jedec,
19748 }
19749 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019750 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019751 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019752 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010019753 .prepare_access = prepare_memory_access,
19754 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000019755 },
19756
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019757 {
19758 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019759 .name = "W29C512A/W29EE512",
19760 .bustype = BUS_PARALLEL,
19761 .manufacture_id = WINBOND_ID,
19762 .model_id = WINBOND_W29C512A,
19763 .total_size = 64,
19764 .page_size = 128,
19765 .feature_bits = FEATURE_LONG_RESET,
19766 .tested = TEST_OK_PREW,
19767 .probe = probe_jedec,
19768 .probe_timing = 10,
19769 .block_erasers =
19770 {
19771 {
19772 .eraseblocks = { {64 * 1024, 1} },
19773 .block_erase = erase_chip_block_jedec,
19774 }
19775 },
19776 .write = write_jedec,
19777 .read = read_memmapped,
19778 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010019779 .prepare_access = prepare_memory_access,
19780 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019781 },
19782
19783 {
19784 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019785 .name = "W29GL032CB",
19786 .bustype = BUS_PARALLEL,
19787 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19788 .model_id = WINBOND_W29GL032CB,
19789 .total_size = 4096,
19790 .page_size = 128 * 1024, /* actual page size is 16 */
19791 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19792 .tested = TEST_UNTESTED,
19793 .probe = probe_jedec_29gl,
19794 .probe_timing = TIMING_ZERO,
19795 .block_erasers =
19796 {
19797 {
19798 .eraseblocks = {
19799 {8 * 1024, 8},
19800 {64 * 1024, 63},
19801 },
19802 .block_erase = erase_sector_jedec,
19803 }, {
19804 .eraseblocks = { {4 * 1024 * 1024, 1} },
19805 .block_erase = erase_chip_block_jedec,
19806 },
19807 },
19808 .write = write_jedec_1,
19809 .read = read_memmapped,
19810 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019811 .prepare_access = prepare_memory_access,
19812 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019813 },
19814
19815 {
19816 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019817 .name = "W29GL032CH/L",
19818 .bustype = BUS_PARALLEL,
19819 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19820 .model_id = WINBOND_W29GL032CHL,
19821 .total_size = 4096,
19822 .page_size = 128 * 1024, /* actual page size is 16 */
19823 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19824 .tested = TEST_UNTESTED,
19825 .probe = probe_jedec_29gl,
19826 .probe_timing = TIMING_ZERO,
19827 .block_erasers =
19828 {
19829 {
19830 .eraseblocks = { {64 * 1024, 64} },
19831 .block_erase = erase_sector_jedec,
19832 }, {
19833 .eraseblocks = { {4 * 1024 * 1024, 1} },
19834 .block_erase = erase_chip_block_jedec,
19835 },
19836 },
19837 .write = write_jedec_1,
19838 .read = read_memmapped,
19839 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019840 .prepare_access = prepare_memory_access,
19841 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019842 },
19843
19844 {
19845 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019846 .name = "W29GL032CT",
19847 .bustype = BUS_PARALLEL,
19848 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19849 .model_id = WINBOND_W29GL032CT,
19850 .total_size = 4096,
19851 .page_size = 128 * 1024, /* actual page size is 16 */
19852 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19853 .tested = TEST_UNTESTED,
19854 .probe = probe_jedec_29gl,
19855 .probe_timing = TIMING_ZERO,
19856 .block_erasers =
19857 {
19858 {
19859 .eraseblocks = {
19860 {64 * 1024, 63},
19861 {8 * 1024, 8},
19862 },
19863 .block_erase = erase_sector_jedec,
19864 }, {
19865 .eraseblocks = { {4 * 1024 * 1024, 1} },
19866 .block_erase = erase_chip_block_jedec,
19867 },
19868 },
19869 .write = write_jedec_1,
19870 .read = read_memmapped,
19871 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019872 .prepare_access = prepare_memory_access,
19873 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019874 },
19875
19876 {
19877 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019878 .name = "W29GL064CB",
19879 .bustype = BUS_PARALLEL,
19880 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19881 .model_id = WINBOND_W29GL064CB,
19882 .total_size = 8192,
19883 .page_size = 128 * 1024, /* actual page size is 16 */
19884 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19885 .tested = TEST_UNTESTED,
19886 .probe = probe_jedec_29gl,
19887 .probe_timing = TIMING_ZERO,
19888 .block_erasers =
19889 {
19890 {
19891 .eraseblocks = {
19892 {8 * 1024, 8},
19893 {64 * 1024, 127},
19894 },
19895 .block_erase = erase_sector_jedec,
19896 }, {
19897 .eraseblocks = { {8 * 1024 * 1024, 1} },
19898 .block_erase = erase_chip_block_jedec,
19899 },
19900 },
19901 .write = write_jedec_1,
19902 .read = read_memmapped,
19903 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019904 .prepare_access = prepare_memory_access,
19905 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019906 },
19907
19908 {
19909 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019910 .name = "W29GL064CH/L",
19911 .bustype = BUS_PARALLEL,
19912 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19913 .model_id = WINBOND_W29GL064CHL,
19914 .total_size = 8192,
19915 .page_size = 128 * 1024, /* actual page size is 16 */
19916 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19917 .tested = TEST_UNTESTED,
19918 .probe = probe_jedec_29gl,
19919 .probe_timing = TIMING_ZERO,
19920 .block_erasers =
19921 {
19922 {
19923 .eraseblocks = { {64 * 1024, 128} },
19924 .block_erase = erase_sector_jedec,
19925 }, {
19926 .eraseblocks = { {8 * 1024 * 1024, 1} },
19927 .block_erase = erase_chip_block_jedec,
19928 },
19929 },
19930 .write = write_jedec_1,
19931 .read = read_memmapped,
19932 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019933 .prepare_access = prepare_memory_access,
19934 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019935 },
19936
19937 {
19938 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019939 .name = "W29GL064CT",
19940 .bustype = BUS_PARALLEL,
19941 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19942 .model_id = WINBOND_W29GL064CT,
19943 .total_size = 8192,
19944 .page_size = 128 * 1024, /* actual page size is 16 */
19945 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19946 .tested = TEST_UNTESTED,
19947 .probe = probe_jedec_29gl,
19948 .probe_timing = TIMING_ZERO,
19949 .block_erasers =
19950 {
19951 {
19952 .eraseblocks = {
19953 {64 * 1024, 127},
19954 {8 * 1024, 8},
19955 },
19956 .block_erase = erase_sector_jedec,
19957 }, {
19958 .eraseblocks = { {8 * 1024 * 1024, 1} },
19959 .block_erase = erase_chip_block_jedec,
19960 },
19961 },
19962 .write = write_jedec_1,
19963 .read = read_memmapped,
19964 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019965 .prepare_access = prepare_memory_access,
19966 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019967 },
19968
19969 {
19970 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019971 .name = "W29GL128C",
19972 .bustype = BUS_PARALLEL,
19973 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
19974 .model_id = WINBOND_W29GL128CHL,
19975 .total_size = 16384,
19976 .page_size = 128 * 1024, /* actual page size is 16 */
19977 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
19978 .tested = TEST_UNTESTED,
19979 .probe = probe_jedec_29gl,
19980 .probe_timing = TIMING_ZERO,
19981 .block_erasers =
19982 {
19983 {
19984 .eraseblocks = { {128 * 1024, 128} },
19985 .block_erase = erase_sector_jedec,
19986 }, {
19987 .eraseblocks = { {16 * 1024 * 1024, 1} },
19988 .block_erase = erase_chip_block_jedec,
19989 },
19990 },
19991 .write = write_jedec_1,
19992 .read = read_memmapped,
19993 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010019994 .prepare_access = prepare_memory_access,
19995 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000019996 },
19997
19998 {
19999 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020000 .name = "W39F010",
20001 .bustype = BUS_PARALLEL,
20002 .manufacture_id = WINBOND_ID,
20003 .model_id = WINBOND_W39F010,
20004 .total_size = 128,
20005 .page_size = 4 * 1024,
20006 .feature_bits = FEATURE_EITHER_RESET,
20007 .tested = TEST_OK_PREW,
20008 .probe = probe_jedec,
20009 .probe_timing = 10,
20010 .block_erasers =
20011 {
20012 {
20013 .eraseblocks = { {4 * 1024, 32} },
20014 .block_erase = erase_block_jedec,
20015 }, {
20016 .eraseblocks = { {128 * 1024, 1} },
20017 .block_erase = erase_chip_block_jedec,
20018 }
20019 },
20020 .printlock = printlock_w39f010,
20021 .write = write_jedec_1,
20022 .read = read_memmapped,
20023 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020024 .prepare_access = prepare_memory_access,
20025 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020026 },
20027
20028 {
20029 .vendor = "Winbond",
20030 .name = "W39L010",
20031 .bustype = BUS_PARALLEL,
20032 .manufacture_id = WINBOND_ID,
20033 .model_id = WINBOND_W39L010,
20034 .total_size = 128,
20035 .page_size = 4 * 1024,
20036 .feature_bits = FEATURE_EITHER_RESET,
20037 .tested = TEST_UNTESTED,
20038 .probe = probe_jedec,
20039 .probe_timing = 10,
20040 .block_erasers =
20041 {
20042 {
20043 .eraseblocks = { {4 * 1024, 32} },
20044 .block_erase = erase_block_jedec,
20045 }, {
20046 .eraseblocks = { {128 * 1024, 1} },
20047 .block_erase = erase_chip_block_jedec,
20048 }
20049 },
20050 .printlock = printlock_w39l010,
20051 .write = write_jedec_1,
20052 .read = read_memmapped,
20053 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020054 .prepare_access = prepare_memory_access,
20055 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020056 },
20057
20058 {
20059 .vendor = "Winbond",
20060 .name = "W39L020",
20061 .bustype = BUS_PARALLEL,
20062 .manufacture_id = WINBOND_ID,
20063 .model_id = WINBOND_W39L020,
20064 .total_size = 256,
20065 .page_size = 4 * 1024,
20066 .feature_bits = FEATURE_EITHER_RESET,
20067 .tested = TEST_UNTESTED,
20068 .probe = probe_jedec,
20069 .probe_timing = 10,
20070 .block_erasers =
20071 {
20072 {
20073 .eraseblocks = { {4 * 1024, 64} },
20074 .block_erase = erase_block_jedec,
20075 }, {
20076 .eraseblocks = { {64 * 1024, 4} },
20077 .block_erase = erase_sector_jedec,
20078 }, {
20079 .eraseblocks = { {256 * 1024, 1} },
20080 .block_erase = erase_chip_block_jedec,
20081 }
20082 },
20083 .printlock = printlock_w39l020,
20084 .write = write_jedec_1,
20085 .read = read_memmapped,
20086 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020087 .prepare_access = prepare_memory_access,
20088 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020089 },
20090
20091 {
20092 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000020093 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020094 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020095 .manufacture_id = WINBOND_ID,
20096 .model_id = WINBOND_W39L040,
20097 .total_size = 512,
20098 .page_size = 64 * 1024,
20099 .feature_bits = FEATURE_EITHER_RESET,
20100 .tested = TEST_OK_PR,
20101 .probe = probe_jedec,
20102 .probe_timing = 10,
20103 .block_erasers =
20104 {
20105 {
20106 .eraseblocks = { {4 * 1024, 128} },
20107 .block_erase = erase_block_jedec,
20108 }, {
20109 .eraseblocks = { {64 * 1024, 8} },
20110 .block_erase = erase_sector_jedec,
20111 }, {
20112 .eraseblocks = { {512 * 1024, 1} },
20113 .block_erase = erase_chip_block_jedec,
20114 }
20115 },
20116 .printlock = printlock_w39l040,
20117 .write = write_jedec_1,
20118 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020119 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020120 .prepare_access = prepare_memory_access,
20121 .finish_access = finish_memory_access,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020122 },
20123
20124 {
20125 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020126 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020127 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020128 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020129 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020130 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020131 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020132 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000020133 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020134 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000020135 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020136 .block_erasers =
20137 {
20138 {
20139 .eraseblocks = { {64 * 1024, 8} },
20140 .block_erase = erase_sector_jedec,
20141 }, {
20142 .eraseblocks = { {512 * 1024, 1} },
20143 .block_erase = erase_chip_block_jedec,
20144 }
20145 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020146 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000020147 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020148 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020149 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020150 .prepare_access = prepare_memory_access,
20151 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020152 },
20153
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020154 {
20155 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020156 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020157 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020158 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020159 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020160 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020161 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020162 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020163 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020164 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000020165 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020166 .block_erasers =
20167 {
20168 {
20169 .eraseblocks = { {64 * 1024, 8} },
20170 .block_erase = erase_sector_jedec,
20171 }, {
20172 .eraseblocks = { {512 * 1024, 1} },
20173 .block_erase = erase_chip_block_jedec,
20174 }
20175 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020176 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000020177 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020178 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020179 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020180 .prepare_access = prepare_memory_access,
20181 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020182 },
20183
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020184 {
20185 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020186 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020187 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020188 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020189 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020190 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020191 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020192 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020193 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000020194 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020195 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020196 .block_erasers =
20197 {
20198 {
20199 .eraseblocks = { {64 * 1024, 8} },
20200 .block_erase = erase_sector_jedec,
20201 }, {
20202 .eraseblocks = { {512 * 1024, 1} },
20203 .block_erase = erase_chip_block_jedec,
20204 }
20205 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000020206 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000020207 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020208 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020209 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020210 .prepare_access = prepare_memory_access,
20211 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020212 },
20213
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020214 {
20215 .vendor = "Winbond",
20216 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020217 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020218 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020219 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020220 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020221 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020222 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020223 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020224 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000020225 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020226 .block_erasers =
20227 {
20228 {
20229 .eraseblocks = { {4 * 1024, 128} },
20230 .block_erase = erase_block_jedec,
20231 }, {
20232 .eraseblocks = { {64 * 1024, 8} },
20233 .block_erase = erase_sector_jedec,
20234 }, {
20235 .eraseblocks = { {512 * 1024, 1} },
20236 .block_erase = erase_chip_block_jedec,
20237 }
20238 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020239 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020240 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000020241 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020242 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020243 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010020244 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020245 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020246 },
20247
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020248 {
20249 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020250 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020251 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020252 .manufacture_id = WINBOND_ID,
20253 .model_id = WINBOND_W39V040B,
20254 .total_size = 512,
20255 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020256 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000020257 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020258 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020259 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020260 .block_erasers =
20261 {
20262 {
20263 .eraseblocks = { {64 * 1024, 8} },
20264 .block_erase = erase_sector_jedec,
20265 }, {
20266 .eraseblocks = { {512 * 1024, 1} },
20267 .block_erase = erase_chip_block_jedec,
20268 }
20269 },
20270 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020271 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020272 .write = write_jedec_1,
20273 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020274 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020275 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020276 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020277 },
20278
20279 {
20280 .vendor = "Winbond",
20281 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020282 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020283 .manufacture_id = WINBOND_ID,
20284 .model_id = WINBOND_W39V040C,
20285 .total_size = 512,
20286 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020287 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000020288 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020289 .probe = probe_jedec,
20290 .probe_timing = 10,
20291 .block_erasers =
20292 {
20293 {
20294 .eraseblocks = { {64 * 1024, 8} },
20295 .block_erase = erase_sector_jedec,
20296 }, {
20297 .eraseblocks = { {512 * 1024, 1} },
20298 .block_erase = erase_chip_block_jedec,
20299 }
20300 },
20301 .printlock = printlock_w39v040fc,
20302 .write = write_jedec_1,
20303 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020304 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020305 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020306 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020307 },
20308
20309 {
20310 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020311 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020312 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020313 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020314 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020315 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000020316 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020317 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000020318 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020319 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000020320 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020321 .block_erasers =
20322 {
20323 {
20324 .eraseblocks = { {64 * 1024, 16} },
20325 .block_erase = erase_sector_jedec,
20326 }, {
20327 .eraseblocks = { {1024 * 1024, 1} },
20328 .block_erase = erase_chip_block_jedec,
20329 }
20330 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020331 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000020332 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020333 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020334 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020335 .prepare_access = prepare_memory_access,
20336 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020337 },
20338
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020339 {
20340 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020341 .name = "W39V080FA",
20342 .bustype = BUS_FWH,
20343 .manufacture_id = WINBOND_ID,
20344 .model_id = WINBOND_W39V080FA,
20345 .total_size = 1024,
20346 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020347 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020348 .tested = TEST_OK_PREW,
20349 .probe = probe_jedec,
20350 .probe_timing = 10,
20351 .block_erasers =
20352 {
20353 {
20354 .eraseblocks = { {64 * 1024, 16} },
20355 .block_erase = erase_sector_jedec,
20356 }, {
20357 .eraseblocks = { {1024 * 1024, 1} },
20358 .block_erase = erase_chip_block_jedec,
20359 }
20360 },
20361 .printlock = printlock_w39v080fa,
20362 .unlock = unlock_regspace2_uniform_64k,
20363 .write = write_jedec_1,
20364 .read = read_memmapped,
20365 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020366 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020367 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020368 },
20369
20370 {
20371 .vendor = "Winbond",
20372 .name = "W39V080FA (dual mode)",
20373 .bustype = BUS_FWH,
20374 .manufacture_id = WINBOND_ID,
20375 .model_id = WINBOND_W39V080FA_DM,
20376 .total_size = 512,
20377 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020378 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020379 .tested = TEST_UNTESTED,
20380 .probe = probe_jedec,
20381 .probe_timing = 10,
20382 .block_erasers =
20383 {
20384 {
20385 .eraseblocks = { {64 * 1024, 8} },
20386 .block_erase = erase_sector_jedec,
20387 }, {
20388 .eraseblocks = { {512 * 1024, 1} },
20389 .block_erase = erase_chip_block_jedec,
20390 }
20391 },
20392 .printlock = printlock_w39v080fa_dual,
20393 .write = write_jedec_1,
20394 .read = read_memmapped,
20395 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020396 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020397 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020398 },
20399
20400 {
20401 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020402 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020403 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020404 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020405 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020406 .total_size = 256,
20407 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020408 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000020409 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020410 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020411 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020412 .block_erasers =
20413 {
20414 {
20415 .eraseblocks = {
20416 {128 * 1024, 1},
20417 {96 * 1024, 1},
20418 {8 * 1024, 2},
20419 {16 * 1024, 1},
20420 },
20421 .block_erase = erase_sector_jedec,
20422 }, {
20423 .eraseblocks = { {256 * 1024, 1} },
20424 .block_erase = erase_chip_block_jedec,
20425 }
20426 },
Sean Nelson35727f72010-01-28 23:55:12 +000020427 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020428 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020429 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020430 .prepare_access = prepare_memory_access,
20431 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020432 },
20433
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020434 {
20435 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020436 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020437 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020438 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020439 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020440 .total_size = 256,
20441 .page_size = 128,
20442 .feature_bits = FEATURE_EITHER_RESET,
20443 .tested = TEST_OK_PROBE,
20444 .probe = probe_jedec,
20445 .probe_timing = 10,
20446 .block_erasers =
20447 {
20448 {
20449 .eraseblocks = { {256 * 1024, 1} },
20450 .block_erase = erase_chip_block_jedec,
20451 }
20452 },
20453 .write = write_jedec_1,
20454 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020455 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020456 .prepare_access = prepare_memory_access,
20457 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020458 },
20459
20460 {
20461 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020462 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020463 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020464 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020465 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020466 .total_size = 256,
20467 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020468 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020469 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020470 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020471 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020472 .block_erasers =
20473 {
20474 {
20475 .eraseblocks = {
20476 {64 * 1024, 3},
20477 {32 * 1024, 1},
20478 {8 * 1024, 2},
20479 {16 * 1024, 1},
20480 },
20481 .block_erase = erase_sector_jedec,
20482 }, {
20483 .eraseblocks = { {256 * 1024, 1} },
20484 .block_erase = erase_chip_block_jedec,
20485 }
20486 },
Sean Nelson35727f72010-01-28 23:55:12 +000020487 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020488 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020489 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020490 .prepare_access = prepare_memory_access,
20491 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020492 },
20493
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020494 {
20495 .vendor = "Winbond",
20496 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020497 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020498 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020499 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020500 .total_size = 256,
20501 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020502 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000020503 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020504 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020505 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020506 .block_erasers =
20507 {
20508 {
20509 .eraseblocks = {
20510 {64 * 1024, 3},
20511 {32 * 1024, 1},
20512 {8 * 1024, 2},
20513 {16 * 1024, 1},
20514 },
20515 .block_erase = erase_sector_jedec,
20516 }, {
20517 .eraseblocks = { {256 * 1024, 1} },
20518 .block_erase = erase_chip_block_jedec,
20519 }
20520 },
Sean Nelson35727f72010-01-28 23:55:12 +000020521 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020522 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020523 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020524 .prepare_access = prepare_memory_access,
20525 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020526 },
20527
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020528 {
luke heef884232020-12-28 18:22:21 +080020529 .vendor = "XMC",
20530 .name = "XM25QH128C",
20531 .bustype = BUS_SPI,
20532 .manufacture_id = ST_ID,
20533 .model_id = XMC_XM25QH128C,
20534 .total_size = 16384,
20535 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020536 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080020537 .tested = TEST_UNTESTED,
20538 .probe = probe_spi_rdid,
20539 .probe_timing = TIMING_ZERO,
20540 .block_erasers =
20541 {
20542 {
20543 .eraseblocks = { {4 * 1024, 4096} },
20544 .block_erase = spi_block_erase_20,
20545 }, {
20546 .eraseblocks = { {32 * 1024, 512} },
20547 .block_erase = spi_block_erase_52,
20548 }, {
20549 .eraseblocks = { {64 * 1024, 256} },
20550 .block_erase = spi_block_erase_d8,
20551 }, {
20552 .eraseblocks = { {16 * 1024 * 1024, 1} },
20553 .block_erase = spi_block_erase_60,
20554 }, {
20555 .eraseblocks = { {16 * 1024 * 1024, 1} },
20556 .block_erase = spi_block_erase_c7,
20557 }
20558 },
20559 .printlock = spi_prettyprint_status_register_plain,
20560 .unlock = spi_disable_blockprotect,
20561 .write = spi_chip_write_256,
20562 .read = spi_chip_read,
20563 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020564 .reg_bits =
20565 {
20566 .srp = {STATUS1, 7, RW},
20567 .srl = {STATUS2, 0, RW},
20568 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20569 .tb = {STATUS1, 5, RW},
20570 .sec = {STATUS1, 6, RW},
20571 .cmp = {STATUS2, 6, RW},
20572 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020573 .wp_write_cfg = spi_wp_write_cfg,
20574 .wp_read_cfg = spi_wp_read_cfg,
20575 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020576 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080020577 },
20578
20579 {
20580 .vendor = "XMC",
20581 .name = "XM25QH256C",
20582 .bustype = BUS_SPI,
20583 .manufacture_id = ST_ID,
20584 .model_id = XMC_XM25QH256C,
20585 .total_size = 32768,
20586 .page_size = 256,
20587 /* supports SFDP */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080020589 .tested = TEST_UNTESTED,
20590 .probe = probe_spi_rdid,
20591 .probe_timing = TIMING_ZERO,
20592 .block_erasers =
20593 {
20594 {
20595 .eraseblocks = { {4 * 1024, 8192} },
20596 .block_erase = spi_block_erase_21,
20597 }, {
20598 .eraseblocks = { {4 * 1024, 8192} },
20599 .block_erase = spi_block_erase_20,
20600 }, {
20601 .eraseblocks = { {32 * 1024, 1024} },
20602 .block_erase = spi_block_erase_52,
20603 }, {
20604 .eraseblocks = { {64 * 1024, 512} },
20605 .block_erase = spi_block_erase_dc,
20606 }, {
20607 .eraseblocks = { {64 * 1024, 512} },
20608 .block_erase = spi_block_erase_d8,
20609 }, {
20610 .eraseblocks = { {32 * 1024 * 1024, 1} },
20611 .block_erase = spi_block_erase_60,
20612 }, {
20613 .eraseblocks = { {32 * 1024 * 1024, 1} },
20614 .block_erase = spi_block_erase_c7,
20615 }
20616 },
20617 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20618 .unlock = spi_disable_blockprotect,
20619 .write = spi_chip_write_256,
20620 .read = spi_chip_read,
20621 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020622 .reg_bits =
20623 {
20624 .srp = {STATUS1, 7, RW},
20625 .srl = {STATUS2, 0, RW},
20626 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
20627 .tb = {STATUS1, 6, RW},
20628 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020629 .wp_write_cfg = spi_wp_write_cfg,
20630 .wp_read_cfg = spi_wp_read_cfg,
20631 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020632 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010020633 .prepare_access = spi_prepare_4ba,
luke heef884232020-12-28 18:22:21 +080020634 },
20635
20636 {
20637 .vendor = "XMC",
20638 .name = "XM25QH64C",
20639 .bustype = BUS_SPI,
20640 .manufacture_id = ST_ID,
20641 .model_id = XMC_XM25QH64C,
20642 .total_size = 8192,
20643 .page_size = 256,
20644 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
20645 .tested = TEST_UNTESTED,
20646 .probe = probe_spi_rdid,
20647 .probe_timing = TIMING_ZERO,
20648 .block_erasers =
20649 {
20650 {
20651 .eraseblocks = { {4 * 1024, 2048} },
20652 .block_erase = spi_block_erase_20,
20653 }, {
20654 .eraseblocks = { {32 * 1024, 256} },
20655 .block_erase = spi_block_erase_52,
20656 }, {
20657 .eraseblocks = { {64 * 1024, 128} },
20658 .block_erase = spi_block_erase_d8,
20659 }, {
20660 .eraseblocks = { {8 * 1024 * 1024, 1} },
20661 .block_erase = spi_block_erase_60,
20662 }, {
20663 .eraseblocks = { {8 * 1024 * 1024, 1} },
20664 .block_erase = spi_block_erase_c7,
20665 }
20666 },
20667 .printlock = spi_prettyprint_status_register_plain,
20668 .unlock = spi_disable_blockprotect,
20669 .write = spi_chip_write_256,
20670 .read = spi_chip_read,
20671 .voltage = {2700, 3600},
20672 },
20673
20674 {
20675 .vendor = "XMC",
20676 .name = "XM25QU128C",
20677 .bustype = BUS_SPI,
20678 .manufacture_id = ST_ID,
20679 .model_id = XMC_XM25QU128C,
20680 .total_size = 16384,
20681 .page_size = 256,
20682 /* supports SFDP */
20683 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
20684 .tested = TEST_UNTESTED,
20685 .probe = probe_spi_rdid,
20686 .probe_timing = TIMING_ZERO,
20687 .block_erasers =
20688 {
20689 {
20690 .eraseblocks = { {4 * 1024, 4096} },
20691 .block_erase = spi_block_erase_20,
20692 }, {
20693 .eraseblocks = { {32 * 1024, 512} },
20694 .block_erase = spi_block_erase_52,
20695 }, {
20696 .eraseblocks = { {64 * 1024, 256} },
20697 .block_erase = spi_block_erase_d8,
20698 }, {
20699 .eraseblocks = { {16 * 1024 * 1024, 1} },
20700 .block_erase = spi_block_erase_60,
20701 }, {
20702 .eraseblocks = { {16 * 1024 * 1024, 1} },
20703 .block_erase = spi_block_erase_c7,
20704 }
20705 },
20706 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20707 .unlock = spi_disable_blockprotect,
20708 .write = spi_chip_write_256,
20709 .read = spi_chip_read,
20710 .voltage = {1650, 1950},
20711 },
20712
20713 {
20714 .vendor = "XMC",
20715 .name = "XM25QU256C",
20716 .bustype = BUS_SPI,
20717 .manufacture_id = ST_ID,
20718 .model_id = XMC_XM25QU256C,
20719 .total_size = 32768,
20720 .page_size = 256,
20721 /* supports SFDP */
20722 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
20723 .tested = TEST_UNTESTED,
20724 .probe = probe_spi_rdid,
20725 .probe_timing = TIMING_ZERO,
20726 .block_erasers =
20727 {
20728 {
20729 .eraseblocks = { {4 * 1024, 8192} },
20730 .block_erase = spi_block_erase_21,
20731 }, {
20732 .eraseblocks = { {4 * 1024, 8192} },
20733 .block_erase = spi_block_erase_20,
20734 }, {
20735 .eraseblocks = { {32 * 1024, 1024} },
20736 .block_erase = spi_block_erase_52,
20737 }, {
20738 .eraseblocks = { {64 * 1024, 512} },
20739 .block_erase = spi_block_erase_dc,
20740 }, {
20741 .eraseblocks = { {64 * 1024, 512} },
20742 .block_erase = spi_block_erase_d8,
20743 }, {
20744 .eraseblocks = { {32 * 1024 * 1024, 1} },
20745 .block_erase = spi_block_erase_60,
20746 }, {
20747 .eraseblocks = { {32 * 1024 * 1024, 1} },
20748 .block_erase = spi_block_erase_c7,
20749 }
20750 },
20751 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20752 .unlock = spi_disable_blockprotect,
20753 .write = spi_chip_write_256,
20754 .read = spi_chip_read,
20755 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +010020756 .prepare_access = spi_prepare_4ba,
luke heef884232020-12-28 18:22:21 +080020757 },
20758
20759 {
20760 .vendor = "XMC",
20761 .name = "XM25QU64C",
20762 .bustype = BUS_SPI,
20763 .manufacture_id = ST_ID,
20764 .model_id = XMC_XM25QU64C,
20765 .total_size = 8192,
20766 .page_size = 256,
20767 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
20768 .tested = TEST_UNTESTED,
20769 .probe = probe_spi_rdid,
20770 .probe_timing = TIMING_ZERO,
20771 .block_erasers =
20772 {
20773 {
20774 .eraseblocks = { {4 * 1024, 2048} },
20775 .block_erase = spi_block_erase_20,
20776 }, {
20777 .eraseblocks = { {32 * 1024, 256} },
20778 .block_erase = spi_block_erase_52,
20779 }, {
20780 .eraseblocks = { {64 * 1024, 128} },
20781 .block_erase = spi_block_erase_d8,
20782 }, {
20783 .eraseblocks = { {8 * 1024 * 1024, 1} },
20784 .block_erase = spi_block_erase_60,
20785 }, {
20786 .eraseblocks = { {8 * 1024 * 1024, 1} },
20787 .block_erase = spi_block_erase_c7,
20788 }
20789 },
20790 .printlock = spi_prettyprint_status_register_plain,
20791 .unlock = spi_disable_blockprotect,
20792 .write = spi_chip_write_256,
20793 .read = spi_chip_read,
20794 .voltage = {1650, 1950},
20795 },
20796
20797 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100020798 .vendor = "Zetta Device",
20799 .name = "ZD25D20",
20800 .bustype = BUS_SPI,
20801 .manufacture_id = ZETTADEVICE_ID,
20802 .model_id = ZETTADEVICE_ZD25D20,
20803 .total_size = 256,
20804 .page_size = 256,
20805 .feature_bits = FEATURE_WRSR_WREN,
20806 .tested = TEST_UNTESTED,
20807 .probe = probe_spi_rdid,
20808 .probe_timing = TIMING_ZERO,
20809 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080020810 {
20811 {
20812 .eraseblocks = { {4 * 1024, 64} },
20813 .block_erase = spi_block_erase_20,
20814 }, {
20815 .eraseblocks = { {32 * 1024, 8} },
20816 .block_erase = spi_block_erase_52,
20817 }, {
20818 .eraseblocks = { {64 * 1024, 4} },
20819 .block_erase = spi_block_erase_d8,
20820 }, {
20821 .eraseblocks = { {256 * 1024, 1} },
20822 .block_erase = spi_block_erase_60,
20823 }, {
20824 .eraseblocks = { {256 * 1024, 1} },
20825 .block_erase = spi_block_erase_c7,
20826 }
20827 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100020828 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20829 .unlock = spi_disable_blockprotect,
20830 .write = spi_chip_write_256,
20831 .read = spi_chip_read,
20832 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080020833 },
20834
20835 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100020836 .vendor = "Zetta Device",
20837 .name = "ZD25D40",
20838 .bustype = BUS_SPI,
20839 .manufacture_id = ZETTADEVICE_ID,
20840 .model_id = ZETTADEVICE_ZD25D40,
20841 .total_size = 512,
20842 .page_size = 256,
20843 .feature_bits = FEATURE_WRSR_WREN,
20844 .tested = TEST_UNTESTED,
20845 .probe = probe_spi_rdid,
20846 .probe_timing = TIMING_ZERO,
20847 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080020848 {
20849 {
20850 .eraseblocks = { {4 * 1024, 128} },
20851 .block_erase = spi_block_erase_20,
20852 }, {
20853 .eraseblocks = { {32 * 1024, 16} },
20854 .block_erase = spi_block_erase_52,
20855 }, {
20856 .eraseblocks = { {64 * 1024, 8} },
20857 .block_erase = spi_block_erase_d8,
20858 }, {
20859 .eraseblocks = { {512 * 1024, 1} },
20860 .block_erase = spi_block_erase_60,
20861 }, {
20862 .eraseblocks = { {512 * 1024, 1} },
20863 .block_erase = spi_block_erase_c7,
20864 }
20865 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100020866 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20867 .unlock = spi_disable_blockprotect,
20868 .write = spi_chip_write_256,
20869 .read = spi_chip_read,
20870 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080020871 },
20872
Stefan Taunerac1b4c82012-02-17 14:51:04 +000020873 {
Alan Greendd592202019-08-23 10:11:37 +100020874 .vendor = "Unknown",
20875 .name = "SFDP-capable chip",
20876 .bustype = BUS_SPI,
20877 .manufacture_id = GENERIC_MANUF_ID,
20878 .model_id = SFDP_DEVICE_ID,
20879 .total_size = 0, /* set by probing function */
20880 .page_size = 0, /* set by probing function */
20881 .feature_bits = 0, /* set by probing function */
20882 /* We present our own "report this" text hence we do not */
20883 /* want the default "This flash part has status UNTESTED..." */
20884 /* text to be printed. */
20885 .tested = TEST_OK_PREW,
20886 .probe = probe_spi_sfdp,
20887 .block_erasers = {}, /* set by probing function */
20888 .unlock = spi_disable_blockprotect, /* is this safe? */
20889 .write = NULL, /* set by probing function */
20890 .read = spi_chip_read,
20891 /* FIXME: some vendor extensions define this */
20892 .voltage = {0},
20893 },
20894
20895 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000020896 .vendor = "Programmer",
20897 .name = "Opaque flash chip",
20898 .bustype = BUS_PROG,
20899 .manufacture_id = PROGMANUF_ID,
20900 .model_id = PROGDEV_ID,
20901 .total_size = 0,
20902 .page_size = 256,
20903 /* probe is assumed to work, rest will be filled in by probe */
20904 .tested = TEST_OK_PROBE,
20905 .probe = probe_opaque,
20906 /* eraseblock sizes will be set by the probing function */
20907 .block_erasers =
20908 {
20909 {
20910 .block_erase = erase_opaque,
20911 }
20912 },
20913 .write = write_opaque,
20914 .read = read_opaque,
20915 },
20916
20917 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000020918 .vendor = "AMIC",
20919 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020920 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000020921 .manufacture_id = AMIC_ID,
20922 .model_id = GENERIC_DEVICE_ID,
20923 .total_size = 0,
20924 .page_size = 256,
20925 .tested = TEST_BAD_PREW,
20926 .probe = probe_spi_rdid4,
20927 .probe_timing = TIMING_ZERO,
20928 .write = NULL,
20929 .read = NULL,
20930 },
20931
20932 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020933 .vendor = "Atmel",
20934 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020935 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020936 .manufacture_id = ATMEL_ID,
20937 .model_id = GENERIC_DEVICE_ID,
20938 .total_size = 0,
20939 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000020940 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020941 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020942 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020943 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020944 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000020945 },
20946
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020947 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000020948 .vendor = "Eon",
20949 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020950 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020951 .manufacture_id = EON_ID_NOPREFIX,
20952 .model_id = GENERIC_DEVICE_ID,
20953 .total_size = 0,
20954 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000020955 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020956 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020957 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020958 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020959 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000020960 },
20961
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020962 {
20963 .vendor = "Macronix",
20964 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020965 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000020966 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020967 .model_id = GENERIC_DEVICE_ID,
20968 .total_size = 0,
20969 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000020970 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020971 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020972 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020973 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020974 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000020975 },
20976
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020977 {
20978 .vendor = "PMC",
20979 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020980 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020981 .manufacture_id = PMC_ID,
20982 .model_id = GENERIC_DEVICE_ID,
20983 .total_size = 0,
20984 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000020985 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020986 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000020987 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020988 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020989 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000020990 },
20991
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020992 {
20993 .vendor = "SST",
20994 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020995 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020996 .manufacture_id = SST_ID,
20997 .model_id = GENERIC_DEVICE_ID,
20998 .total_size = 0,
20999 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021000 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021001 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021002 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021003 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021004 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021005 },
21006
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021007 {
21008 .vendor = "ST",
21009 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021010 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021011 .manufacture_id = ST_ID,
21012 .model_id = GENERIC_DEVICE_ID,
21013 .total_size = 0,
21014 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021015 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021016 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021017 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021018 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021019 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021020 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000021021
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021022 {
Sean Nelson118e1d62009-11-24 02:08:11 +000021023 .vendor = "Sanyo",
21024 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021025 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000021026 .manufacture_id = SANYO_ID,
21027 .model_id = GENERIC_DEVICE_ID,
21028 .total_size = 0,
21029 .page_size = 256,
21030 .tested = TEST_BAD_PREW,
21031 .probe = probe_spi_rdid,
21032 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000021033 .write = NULL,
21034 .read = NULL,
21035 },
21036
21037 {
Stefan Taunereb582572012-09-21 12:52:50 +000021038 .vendor = "Winbond",
21039 .name = "unknown Winbond (ex Nexcom) SPI chip",
21040 .bustype = BUS_SPI,
21041 .manufacture_id = WINBOND_NEX_ID,
21042 .model_id = GENERIC_DEVICE_ID,
21043 .total_size = 0,
21044 .page_size = 256,
21045 .tested = TEST_BAD_PREW,
21046 .probe = probe_spi_rdid,
21047 .probe_timing = TIMING_ZERO,
21048 .write = NULL,
21049 .read = NULL,
21050 },
21051
21052 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021053 .vendor = "Generic",
21054 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021055 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021056 .manufacture_id = GENERIC_MANUF_ID,
21057 .model_id = GENERIC_DEVICE_ID,
21058 .total_size = 0,
21059 .page_size = 256,
21060 .tested = TEST_BAD_PREW,
21061 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021062 .write = NULL,
21063 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000021064
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021065 {
21066 .vendor = "Generic",
21067 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021068 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021069 .manufacture_id = GENERIC_MANUF_ID,
21070 .model_id = GENERIC_DEVICE_ID,
21071 .total_size = 0,
21072 .page_size = 256,
21073 .tested = TEST_BAD_PREW,
21074 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021075 .write = NULL,
21076 },
21077
Stefan Tauner96658be2014-05-26 22:05:31 +000021078 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000021079};
Stefan Tauner96658be2014-05-26 22:05:31 +000021080
21081const unsigned int flashchips_size = ARRAY_SIZE(flashchips);