blob: eaf04a87ebd69cc7ffbbd2ba4308974c9346bce7 [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"
Ollie Lho184a4042005-11-26 21:55:36 +000024
Uwe Hermannfc425e82008-03-16 02:06:25 +000025/**
Uwe Hermanna9720402009-05-21 15:55:46 +000026 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000027 *
Stefan Tauner0554ca52013-07-25 22:54:25 +000028 * Please keep the list sorted by vendor name and chip family, so that the output of 'flashrom -L' is roughly
29 * alphabetically sorted. Within families keep them in order of density.
Uwe Hermannfc425e82008-03-16 02:06:25 +000030 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000031const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000032
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000033 /*
34 * .vendor = Vendor name
35 * .name = Chip name
36 * .bustype = Supported flash bus types (Parallel, LPC...)
37 * .manufacture_id = Manufacturer chip ID
38 * .model_id = Model chip ID
39 * .total_size = Total size in (binary) kbytes
40 * .page_size = Page or eraseblock(?) size in bytes
41 * .tested = Test status
42 * .probe = Probe function
43 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000044 * .block_erasers[] = Array of erase layouts and erase functions
45 * {
46 * .eraseblocks[] = Array of { blocksize, blockcount }
47 * .block_erase = Block erase function
48 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000049 * .printlock = Chip lock status function
50 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000051 * .write = Chip write function
52 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000053 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000054 */
55
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000056 {
57 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000058 .name = "Am29F010",
59 .bustype = BUS_PARALLEL,
60 .manufacture_id = AMD_ID,
61 .model_id = AMD_AM29F010,
62 .total_size = 128,
63 .page_size = 16 * 1024,
64 .feature_bits = FEATURE_SHORT_RESET,
65 .tested = TEST_UNTESTED,
66 .probe = probe_jedec,
67 .probe_timing = TIMING_ZERO,
68 .block_erasers =
69 {
70 {
71 .eraseblocks = { {16 * 1024, 8} },
72 .block_erase = erase_sector_jedec,
73 }, {
74 .eraseblocks = { {128 * 1024, 1} },
75 .block_erase = erase_chip_block_jedec,
76 },
77 },
78 .write = write_jedec_1,
79 .read = read_memmapped,
80 .voltage = {4500, 5500},
81 },
82
83 {
84 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000085 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000086 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000087 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000088 .model_id = AMD_AM29F010,
Uwe Hermanna8b37272009-06-19 15:54:39 +000089 .total_size = 128,
90 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000091 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000092 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000093 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000094 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000095 .block_erasers =
96 {
97 {
98 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000099 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000100 }, {
101 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000102 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000103 },
104 },
Sean Nelson35727f72010-01-28 23:55:12 +0000105 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +0000106 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000107 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +0000108 },
109
110 {
111 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000112 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000113 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000114 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000115 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000116 .total_size = 256,
117 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000118 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000119 .tested = TEST_UNTESTED,
120 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000121 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000122 .block_erasers =
123 {
124 {
125 .eraseblocks = {
126 {16 * 1024, 1},
127 {8 * 1024, 2},
128 {32 * 1024, 1},
129 {64 * 1024, 3},
130 },
131 .block_erase = erase_sector_jedec,
132 }, {
133 .eraseblocks = { {256 * 1024, 1} },
134 .block_erase = erase_chip_block_jedec,
135 },
136 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000137 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000138 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000139 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000140 },
141
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000142 {
143 .vendor = "AMD",
144 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000145 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000146 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000147 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000148 .total_size = 256,
149 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000150 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
151 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000152 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000153 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000154 .block_erasers =
155 {
156 {
157 .eraseblocks = {
158 {64 * 1024, 3},
159 {32 * 1024, 1},
160 {8 * 1024, 2},
161 {16 * 1024, 1},
162 },
163 .block_erase = erase_sector_jedec,
164 }, {
165 .eraseblocks = { {256 * 1024, 1} },
166 .block_erase = erase_chip_block_jedec,
167 },
168 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000169 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000170 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000171 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000172 },
173
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000174 {
175 .vendor = "AMD",
176 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000177 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000179 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000180 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000181 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000182 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000183 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000184 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000185 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000186 .block_erasers =
187 {
188 {
189 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000190 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000191 }, {
192 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000193 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000194 },
195 },
Sean Nelson35727f72010-01-28 23:55:12 +0000196 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000197 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000198 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000199 },
200
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000201 {
202 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000203 .name = "Am29F040",
204 .bustype = BUS_PARALLEL,
205 .manufacture_id = AMD_ID,
206 .model_id = AMD_AM29F040,
207 .total_size = 512,
208 .page_size = 64 * 1024,
209 .feature_bits = FEATURE_EITHER_RESET,
210 .tested = TEST_UNTESTED,
211 .probe = probe_jedec,
212 .probe_timing = TIMING_ZERO,
213 .block_erasers =
214 {
215 {
216 .eraseblocks = { {64 * 1024, 8} },
217 .block_erase = erase_sector_jedec,
218 }, {
219 .eraseblocks = { {512 * 1024, 1} },
220 .block_erase = erase_chip_block_jedec,
221 },
222 },
223 .write = write_jedec_1,
224 .read = read_memmapped,
225 .voltage = {4500, 5500},
226 },
227
228 {
229 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000230 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000231 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000232 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000233 .model_id = AMD_AM29F040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000234 .total_size = 512,
235 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000236 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
237 .tested = TEST_UNTESTED,
238 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000239 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000240 .block_erasers =
241 {
242 {
243 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000244 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000245 }, {
246 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000247 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000248 },
249 },
Sean Nelson35727f72010-01-28 23:55:12 +0000250 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000251 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000252 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000253 },
254
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000255 {
256 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000257 .name = "Am29F080",
258 .bustype = BUS_PARALLEL,
259 .manufacture_id = AMD_ID,
260 .model_id = AMD_AM29F080,
261 .total_size = 1024,
262 .page_size = 64 * 1024,
263 .feature_bits = FEATURE_EITHER_RESET,
264 .tested = TEST_UNTESTED,
265 .probe = probe_jedec,
266 .probe_timing = TIMING_ZERO,
267 .block_erasers =
268 {
269 {
270 .eraseblocks = { {64 * 1024, 16} },
271 .block_erase = erase_sector_jedec,
272 }, {
273 .eraseblocks = { {1024 * 1024, 1} },
274 .block_erase = erase_chip_block_jedec,
275 },
276 },
277 .write = write_jedec_1,
278 .read = read_memmapped,
279 .voltage = {4500, 5500},
280 },
281
282 {
283 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000284 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000285 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000286 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000287 .model_id = AMD_AM29F080,
Peter Stuge8440cc02009-01-25 23:55:12 +0000288 .total_size = 1024,
289 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000290 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000291 .tested = TEST_UNTESTED,
292 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000293 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000294 .block_erasers =
295 {
296 {
297 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000298 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000299 }, {
300 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000301 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000302 },
303 },
Sean Nelson35727f72010-01-28 23:55:12 +0000304 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000305 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000306 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000307 },
308
309 {
310 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000311 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000312 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000313 .manufacture_id = AMD_ID,
314 .model_id = AMD_AM29LV001BB,
315 .total_size = 128,
316 .page_size = 64 * 1024, /* unused */
317 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
318 .tested = TEST_OK_PREW,
319 .probe = probe_jedec,
320 .probe_timing = TIMING_ZERO,
321 .block_erasers =
322 {
323 {
324 .eraseblocks = {
325 {8 * 1024, 1},
326 {4 * 1024, 2},
327 {16 * 1024, 7},
328 },
329 .block_erase = erase_sector_jedec,
330 }, {
331 .eraseblocks = { {128 * 1024, 1} },
332 .block_erase = erase_chip_block_jedec,
333 },
334 },
335 .write = write_jedec_1,
336 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000337 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000338 },
339
340 {
341 .vendor = "AMD",
342 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000343 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000344 .manufacture_id = AMD_ID,
345 .model_id = AMD_AM29LV001BT,
346 .total_size = 128,
347 .page_size = 64 * 1024, /* unused */
348 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
349 .tested = TEST_UNTESTED,
350 .probe = probe_jedec,
351 .probe_timing = TIMING_ZERO,
352 .block_erasers =
353 {
354 {
355 .eraseblocks = {
356 {16 * 1024, 7},
357 {4 * 1024, 2},
358 {8 * 1024, 1},
359 },
360 .block_erase = erase_sector_jedec,
361 }, {
362 .eraseblocks = { {128 * 1024, 1} },
363 .block_erase = erase_chip_block_jedec,
364 },
365 },
366 .write = write_jedec_1,
367 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000368 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000369 },
370
371 {
372 .vendor = "AMD",
373 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000374 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000375 .manufacture_id = AMD_ID,
376 .model_id = AMD_AM29LV002BB,
377 .total_size = 256,
378 .page_size = 64 * 1024, /* unused */
379 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
380 .tested = TEST_UNTESTED,
381 .probe = probe_jedec,
382 .probe_timing = TIMING_ZERO,
383 .block_erasers =
384 {
385 {
386 .eraseblocks = {
387 {16 * 1024, 1},
388 {8 * 1024, 2},
389 {32 * 1024, 1},
390 {64 * 1024, 3},
391 },
392 .block_erase = erase_sector_jedec,
393 }, {
394 .eraseblocks = { {256 * 1024, 1} },
395 .block_erase = erase_chip_block_jedec,
396 },
397 },
398 .write = write_jedec_1,
399 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000400 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000401 },
402
403 {
404 .vendor = "AMD",
405 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000406 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000407 .manufacture_id = AMD_ID,
408 .model_id = AMD_AM29LV002BT,
409 .total_size = 256,
410 .page_size = 64 * 1024, /* unused */
411 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
412 .tested = TEST_UNTESTED,
413 .probe = probe_jedec,
414 .probe_timing = TIMING_ZERO,
415 .block_erasers =
416 {
417 {
418 .eraseblocks = {
419 {64 * 1024, 3},
420 {32 * 1024, 1},
421 {8 * 1024, 2},
422 {16 * 1024, 1},
423 },
424 .block_erase = erase_sector_jedec,
425 }, {
426 .eraseblocks = { {256 * 1024, 1} },
427 .block_erase = erase_chip_block_jedec,
428 },
429 },
430 .write = write_jedec_1,
431 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000432 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000433 },
434
435 {
436 .vendor = "AMD",
437 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000438 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000439 .manufacture_id = AMD_ID,
440 .model_id = AMD_AM29LV004BB,
441 .total_size = 512,
442 .page_size = 64 * 1024, /* unused */
443 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
444 .tested = TEST_UNTESTED,
445 .probe = probe_jedec,
446 .probe_timing = TIMING_ZERO,
447 .block_erasers =
448 {
449 {
450 .eraseblocks = {
451 {16 * 1024, 1},
452 {8 * 1024, 2},
453 {32 * 1024, 1},
454 {64 * 1024, 7},
455 },
456 .block_erase = erase_sector_jedec,
457 }, {
458 .eraseblocks = { {512 * 1024, 1} },
459 .block_erase = erase_chip_block_jedec,
460 },
461 },
462 .write = write_jedec_1,
463 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000464 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000465 },
466
467 {
468 .vendor = "AMD",
469 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000470 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000471 .manufacture_id = AMD_ID,
472 .model_id = AMD_AM29LV004BT,
473 .total_size = 512,
474 .page_size = 64 * 1024, /* unused */
475 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
476 .tested = TEST_UNTESTED,
477 .probe = probe_jedec,
478 .probe_timing = TIMING_ZERO,
479 .block_erasers =
480 {
481 {
482 .eraseblocks = {
483 {64 * 1024, 7},
484 {32 * 1024, 1},
485 {8 * 1024, 2},
486 {16 * 1024, 1},
487 },
488 .block_erase = erase_sector_jedec,
489 }, {
490 .eraseblocks = { {512 * 1024, 1} },
491 .block_erase = erase_chip_block_jedec,
492 },
493 },
494 .write = write_jedec_1,
495 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000496 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000497 },
498
499 {
500 .vendor = "AMD",
501 .name = "Am29LV008BB",
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_AM29LV008BB,
505 .total_size = 1024,
506 .page_size = 64 * 1024, /* unused */
507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000508 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000509 .probe = probe_jedec,
510 .probe_timing = TIMING_ZERO,
511 .block_erasers =
512 {
513 {
514 .eraseblocks = {
515 {16 * 1024, 1},
516 {8 * 1024, 2},
517 {32 * 1024, 1},
518 {64 * 1024, 15},
519 },
520 .block_erase = erase_sector_jedec,
521 }, {
522 .eraseblocks = { {1024 * 1024, 1} },
523 .block_erase = erase_chip_block_jedec,
524 },
525 },
526 .write = write_jedec_1,
527 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000528 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000529 },
530
531 {
532 .vendor = "AMD",
533 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000534 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000535 .manufacture_id = AMD_ID,
536 .model_id = AMD_AM29LV008BT,
537 .total_size = 1024,
538 .page_size = 64 * 1024, /* unused */
539 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
540 .tested = TEST_UNTESTED,
541 .probe = probe_jedec,
542 .probe_timing = TIMING_ZERO,
543 .block_erasers =
544 {
545 {
546 .eraseblocks = {
547 {64 * 1024, 15},
548 {32 * 1024, 1},
549 {8 * 1024, 2},
550 {16 * 1024, 1},
551 },
552 .block_erase = erase_sector_jedec,
553 }, {
554 .eraseblocks = { {1024 * 1024, 1} },
555 .block_erase = erase_chip_block_jedec,
556 },
557 },
558 .write = write_jedec_1,
559 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000560 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000561 },
562
563 {
564 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000565 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000566 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000567 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000568 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000569 .total_size = 512,
570 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000571 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000572 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000573 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000574 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000575 .block_erasers =
576 {
577 {
578 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000579 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000580 }, {
581 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000582 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000583 },
584 },
Sean Nelson35727f72010-01-28 23:55:12 +0000585 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000586 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000587 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000588 },
589
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000590 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000591 .vendor = "AMD",
592 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000593 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000594 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000595 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000596 .total_size = 1024,
597 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000598 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000599 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000600 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000601 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000602 .block_erasers =
603 {
604 {
605 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000606 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000607 }, {
608 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000609 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000610 },
611 },
Sean Nelson35727f72010-01-28 23:55:12 +0000612 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000613 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000614 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000615 },
616
617 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000618 .vendor = "AMIC",
619 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000620 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000621 .manufacture_id = AMIC_ID,
622 .model_id = AMIC_A25L05PT,
623 .total_size = 64,
624 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000625 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000626 .tested = TEST_UNTESTED,
627 .probe = probe_spi_rdid4,
628 .probe_timing = TIMING_ZERO,
629 .block_erasers =
630 {
631 {
632 .eraseblocks = {
633 {32 * 1024, 1},
634 {16 * 1024, 1},
635 {8 * 1024, 1},
636 {4 * 1024, 2},
637 },
638 .block_erase = spi_block_erase_d8,
639 }, {
640 .eraseblocks = { {64 * 1024, 1} },
641 .block_erase = spi_block_erase_c7,
642 }
643 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000644 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000645 .unlock = spi_disable_blockprotect,
646 .write = spi_chip_write_256,
647 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000648 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000649 },
650
651 {
652 .vendor = "AMIC",
653 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000654 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000655 .manufacture_id = AMIC_ID,
656 .model_id = AMIC_A25L05PU,
657 .total_size = 64,
658 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000659 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000660 .tested = TEST_UNTESTED,
661 .probe = probe_spi_rdid4,
662 .probe_timing = TIMING_ZERO,
663 .block_erasers =
664 {
665 {
666 .eraseblocks = {
667 {4 * 1024, 2},
668 {8 * 1024, 1},
669 {16 * 1024, 1},
670 {32 * 1024, 1},
671 },
672 .block_erase = spi_block_erase_d8,
673 }, {
674 .eraseblocks = { {64 * 1024, 1} },
675 .block_erase = spi_block_erase_c7,
676 }
677 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000678 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000679 .unlock = spi_disable_blockprotect,
680 .write = spi_chip_write_256,
681 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000682 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000683 },
684
685 {
686 .vendor = "AMIC",
687 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000688 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000689 .manufacture_id = AMIC_ID,
690 .model_id = AMIC_A25L10PT,
691 .total_size = 128,
692 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000693 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000694 .tested = TEST_UNTESTED,
695 .probe = probe_spi_rdid4,
696 .probe_timing = TIMING_ZERO,
697 .block_erasers =
698 {
699 {
700 .eraseblocks = {
701 {64 * 1024, 1},
702 {32 * 1024, 1},
703 {16 * 1024, 1},
704 {8 * 1024, 1},
705 {4 * 1024, 2},
706 },
707 .block_erase = spi_block_erase_d8,
708 }, {
709 .eraseblocks = { {128 * 1024, 1} },
710 .block_erase = spi_block_erase_c7,
711 }
712 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000713 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000714 .unlock = spi_disable_blockprotect,
715 .write = spi_chip_write_256,
716 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000717 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000718 },
719
720 {
721 .vendor = "AMIC",
722 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000723 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000724 .manufacture_id = AMIC_ID,
725 .model_id = AMIC_A25L10PU,
726 .total_size = 128,
727 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000728 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000729 .tested = TEST_UNTESTED,
730 .probe = probe_spi_rdid4,
731 .probe_timing = TIMING_ZERO,
732 .block_erasers =
733 {
734 {
735 .eraseblocks = {
736 {4 * 1024, 2},
737 {8 * 1024, 1},
738 {16 * 1024, 1},
739 {32 * 1024, 1},
740 {64 * 1024, 1},
741 },
742 .block_erase = spi_block_erase_d8,
743 }, {
744 .eraseblocks = { {128 * 1024, 1} },
745 .block_erase = spi_block_erase_c7,
746 }
747 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000748 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000749 .unlock = spi_disable_blockprotect,
750 .write = spi_chip_write_256,
751 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000752 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000753 },
754
755 {
756 .vendor = "AMIC",
757 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000758 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000759 .manufacture_id = AMIC_ID,
760 .model_id = AMIC_A25L20PT,
761 .total_size = 256,
762 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000763 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000764 .tested = TEST_UNTESTED,
765 .probe = probe_spi_rdid4,
766 .probe_timing = TIMING_ZERO,
767 .block_erasers =
768 {
769 {
770 .eraseblocks = {
771 {64 * 1024, 3},
772 {32 * 1024, 1},
773 {16 * 1024, 1},
774 {8 * 1024, 1},
775 {4 * 1024, 2},
776 },
777 .block_erase = spi_block_erase_d8,
778 }, {
779 .eraseblocks = { {256 * 1024, 1} },
780 .block_erase = spi_block_erase_c7,
781 }
782 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000783 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000784 .unlock = spi_disable_blockprotect,
785 .write = spi_chip_write_256,
786 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000787 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000788 },
789
790 {
791 .vendor = "AMIC",
792 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000793 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000794 .manufacture_id = AMIC_ID,
795 .model_id = AMIC_A25L20PU,
796 .total_size = 256,
797 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000798 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000799 .tested = TEST_UNTESTED,
800 .probe = probe_spi_rdid4,
801 .probe_timing = TIMING_ZERO,
802 .block_erasers =
803 {
804 {
805 .eraseblocks = {
806 {4 * 1024, 2},
807 {8 * 1024, 1},
808 {16 * 1024, 1},
809 {32 * 1024, 1},
810 {64 * 1024, 3},
811 },
812 .block_erase = spi_block_erase_d8,
813 }, {
814 .eraseblocks = { {256 * 1024, 1} },
815 .block_erase = spi_block_erase_c7,
816 }
817 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000818 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000819 .unlock = spi_disable_blockprotect,
820 .write = spi_chip_write_256,
821 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000822 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000823 },
824
825 /* The A25L40P{T,U} chips are distinguished by their
826 * erase block layouts, but without any distinction in RDID.
827 * This inexplicable quirk was verified by Rudolf Marek
828 * and discussed on the flashrom mailing list on 2010-07-12.
829 */
830 {
831 .vendor = "AMIC",
832 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000833 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000834 .manufacture_id = AMIC_ID,
835 .model_id = AMIC_A25L40PT,
836 .total_size = 512,
837 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000838 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000839 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000840 .probe = probe_spi_rdid4,
841 .probe_timing = TIMING_ZERO,
842 .block_erasers =
843 {
844 {
845 .eraseblocks = {
846 {64 * 1024, 7},
847 {32 * 1024, 1},
848 {16 * 1024, 1},
849 {8 * 1024, 1},
850 {4 * 1024, 2},
851 },
852 .block_erase = spi_block_erase_d8,
853 }, {
854 .eraseblocks = { {512 * 1024, 1} },
855 .block_erase = spi_block_erase_c7,
856 }
857 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000858 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000859 .unlock = spi_disable_blockprotect,
860 .write = spi_chip_write_256,
861 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000862 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000863 },
864
865 {
866 .vendor = "AMIC",
867 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000868 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000869 .manufacture_id = AMIC_ID,
870 .model_id = AMIC_A25L40PU,
871 .total_size = 512,
872 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000873 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons6f088352018-09-30 19:59:42 +0200874 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000875 .probe = probe_spi_rdid4,
876 .probe_timing = TIMING_ZERO,
877 .block_erasers =
878 {
879 {
880 .eraseblocks = {
881 {4 * 1024, 2},
882 {8 * 1024, 1},
883 {16 * 1024, 1},
884 {32 * 1024, 1},
885 {64 * 1024, 7},
886 },
887 .block_erase = spi_block_erase_d8,
888 }, {
889 .eraseblocks = { {512 * 1024, 1} },
890 .block_erase = spi_block_erase_c7,
891 }
892 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000893 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000894 .unlock = spi_disable_blockprotect,
895 .write = spi_chip_write_256,
896 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000897 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000898 },
899
900 {
901 .vendor = "AMIC",
902 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000903 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000904 .manufacture_id = AMIC_ID,
905 .model_id = AMIC_A25L80P,
906 .total_size = 1024,
907 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000908 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000909 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000910 .probe = probe_spi_rdid4,
911 .probe_timing = TIMING_ZERO,
912 .block_erasers =
913 {
914 {
915 .eraseblocks = {
916 {4 * 1024, 2},
917 {8 * 1024, 1},
918 {16 * 1024, 1},
919 {32 * 1024, 1},
920 {64 * 1024, 15},
921 },
922 .block_erase = spi_block_erase_d8,
923 }, {
924 .eraseblocks = { {1024 * 1024, 1} },
925 .block_erase = spi_block_erase_c7,
926 }
927 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000928 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000929 .unlock = spi_disable_blockprotect,
930 .write = spi_chip_write_256,
931 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000932 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000933 },
934
935 {
936 .vendor = "AMIC",
937 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000938 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000939 .manufacture_id = AMIC_ID,
940 .model_id = AMIC_A25L16PT,
941 .total_size = 2048,
942 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000943 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000944 .tested = TEST_UNTESTED,
945 .probe = probe_spi_rdid4,
946 .probe_timing = TIMING_ZERO,
947 .block_erasers =
948 {
949 {
950 .eraseblocks = {
951 {64 * 1024, 31},
952 {32 * 1024, 1},
953 {16 * 1024, 1},
954 {8 * 1024, 1},
955 {4 * 1024, 2},
956 },
957 .block_erase = spi_block_erase_d8,
958 }, {
959 .eraseblocks = { {2048 * 1024, 1} },
960 .block_erase = spi_block_erase_60,
961 }, {
962 .eraseblocks = { {2048 * 1024, 1} },
963 .block_erase = spi_block_erase_c7,
964 }
965 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000966 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000967 .unlock = spi_disable_blockprotect,
968 .write = spi_chip_write_256,
969 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000970 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000971 },
972
973 {
974 .vendor = "AMIC",
975 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000976 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000977 .manufacture_id = AMIC_ID,
978 .model_id = AMIC_A25L16PU,
979 .total_size = 2048,
980 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000981 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000982 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000983 .probe = probe_spi_rdid4,
984 .probe_timing = TIMING_ZERO,
985 .block_erasers =
986 {
987 {
988 .eraseblocks = {
989 {4 * 1024, 2},
990 {8 * 1024, 1},
991 {16 * 1024, 1},
992 {32 * 1024, 1},
993 {64 * 1024, 31},
994 },
995 .block_erase = spi_block_erase_d8,
996 }, {
997 .eraseblocks = { {2048 * 1024, 1} },
998 .block_erase = spi_block_erase_60,
999 }, {
1000 .eraseblocks = { {2048 * 1024, 1} },
1001 .block_erase = spi_block_erase_c7,
1002 }
1003 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001004 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001005 .unlock = spi_disable_blockprotect,
1006 .write = spi_chip_write_256,
1007 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001008 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001009 },
1010
1011 {
1012 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +00001013 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001014 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001015 .manufacture_id = AMIC_ID_NOPREFIX,
1016 .model_id = AMIC_A25L512,
1017 .total_size = 64,
1018 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001019 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001020 .tested = TEST_UNTESTED,
1021 .probe = probe_spi_rdid,
1022 .probe_timing = TIMING_ZERO,
1023 .block_erasers =
1024 {
1025 {
1026 .eraseblocks = { { 4 * 1024, 16 } },
1027 .block_erase = spi_block_erase_20,
1028 }, {
1029 .eraseblocks = { { 64 * 1024, 1 } },
1030 .block_erase = spi_block_erase_d8,
1031 }, {
1032 .eraseblocks = { { 64 * 1024, 1 } },
1033 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001034 }
Dan Lenski11617122010-07-29 15:00:40 +00001035 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001036 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001037 .unlock = spi_disable_blockprotect,
1038 .write = spi_chip_write_256,
1039 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001040 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001041 },
1042
1043 {
1044 .vendor = "AMIC",
1045 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001046 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001047 .manufacture_id = AMIC_ID_NOPREFIX,
1048 .model_id = AMIC_A25L010,
1049 .total_size = 128,
1050 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001051 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001052 .tested = TEST_UNTESTED,
1053 .probe = probe_spi_rdid,
1054 .probe_timing = TIMING_ZERO,
1055 .block_erasers =
1056 {
1057 {
1058 .eraseblocks = { { 4 * 1024, 32 } },
1059 .block_erase = spi_block_erase_20,
1060 }, {
1061 .eraseblocks = { { 64 * 1024, 2 } },
1062 .block_erase = spi_block_erase_d8,
1063 }, {
1064 .eraseblocks = { { 128 * 1024, 1 } },
1065 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001066 }
Dan Lenski11617122010-07-29 15:00:40 +00001067 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001068 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001069 .unlock = spi_disable_blockprotect,
1070 .write = spi_chip_write_256,
1071 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001072 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001073 },
1074
1075 {
1076 .vendor = "AMIC",
1077 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001078 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001079 .manufacture_id = AMIC_ID_NOPREFIX,
1080 .model_id = AMIC_A25L020,
1081 .total_size = 256,
1082 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001083 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001084 .tested = TEST_UNTESTED,
1085 .probe = probe_spi_rdid,
1086 .probe_timing = TIMING_ZERO,
1087 .block_erasers =
1088 {
1089 {
1090 .eraseblocks = { { 4 * 1024, 64 } },
1091 .block_erase = spi_block_erase_20,
1092 }, {
1093 .eraseblocks = { { 64 * 1024, 4 } },
1094 .block_erase = spi_block_erase_d8,
1095 }, {
1096 .eraseblocks = { { 256 * 1024, 1 } },
1097 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001098 }
Dan Lenski11617122010-07-29 15:00:40 +00001099 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001100 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +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},
Dan Lenski11617122010-07-29 15:00:40 +00001105 },
1106
1107 {
1108 .vendor = "AMIC",
1109 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001110 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001111 .manufacture_id = AMIC_ID_NOPREFIX,
1112 .model_id = AMIC_A25L040,
1113 .total_size = 512,
1114 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001115 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001116 .tested = TEST_UNTESTED,
1117 .probe = probe_spi_rdid,
1118 .probe_timing = TIMING_ZERO,
1119 .block_erasers =
1120 {
1121 {
1122 .eraseblocks = { { 4 * 1024, 128 } },
1123 .block_erase = spi_block_erase_20,
1124 }, {
1125 .eraseblocks = { { 64 * 1024, 8 } },
1126 .block_erase = spi_block_erase_d8,
1127 }, {
1128 .eraseblocks = { { 512 * 1024, 1 } },
1129 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001130 }
Dan Lenski11617122010-07-29 15:00:40 +00001131 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001132 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001133 .unlock = spi_disable_blockprotect,
1134 .write = spi_chip_write_256,
1135 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001136 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001137 },
1138
1139 {
1140 .vendor = "AMIC",
1141 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001142 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001143 .manufacture_id = AMIC_ID_NOPREFIX,
1144 .model_id = AMIC_A25L080,
1145 .total_size = 1024,
1146 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001147 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001148 .tested = TEST_UNTESTED,
1149 .probe = probe_spi_rdid,
1150 .probe_timing = TIMING_ZERO,
1151 .block_erasers =
1152 {
1153 {
1154 .eraseblocks = { { 4 * 1024, 256 } },
1155 .block_erase = spi_block_erase_20,
1156 }, {
1157 .eraseblocks = { { 64 * 1024, 16 } },
1158 .block_erase = spi_block_erase_d8,
1159 }, {
1160 .eraseblocks = { { 1024 * 1024, 1 } },
1161 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001162 }
Dan Lenski11617122010-07-29 15:00:40 +00001163 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001164 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001165 .unlock = spi_disable_blockprotect,
1166 .write = spi_chip_write_256,
1167 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001168 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001169 },
1170
1171 {
1172 .vendor = "AMIC",
1173 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001174 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001175 .manufacture_id = AMIC_ID_NOPREFIX,
1176 .model_id = AMIC_A25L016,
1177 .total_size = 2048,
1178 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001179 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001180 .tested = TEST_UNTESTED,
1181 .probe = probe_spi_rdid,
1182 .probe_timing = TIMING_ZERO,
1183 .block_erasers =
1184 {
1185 {
1186 .eraseblocks = { { 4 * 1024, 512 } },
1187 .block_erase = spi_block_erase_20,
1188 }, {
1189 .eraseblocks = { { 64 * 1024, 32 } },
1190 .block_erase = spi_block_erase_d8,
1191 }, {
1192 .eraseblocks = { { 2048 * 1024, 1 } },
1193 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001194 }
Dan Lenski11617122010-07-29 15:00:40 +00001195 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001196 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001197 .unlock = spi_disable_blockprotect,
1198 .write = spi_chip_write_256,
1199 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001200 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001201 },
1202
1203 {
1204 .vendor = "AMIC",
1205 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001206 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001207 .manufacture_id = AMIC_ID_NOPREFIX,
1208 .model_id = AMIC_A25L032,
1209 .total_size = 4096,
1210 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001211 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1212 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001213 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001214 .probe = probe_spi_rdid,
1215 .probe_timing = TIMING_ZERO,
1216 .block_erasers =
1217 {
1218 {
1219 .eraseblocks = { { 4 * 1024, 1024 } },
1220 .block_erase = spi_block_erase_20,
1221 }, {
1222 .eraseblocks = { { 64 * 1024, 64 } },
1223 .block_erase = spi_block_erase_52,
1224 }, {
1225 .eraseblocks = { { 64 * 1024, 64 } },
1226 .block_erase = spi_block_erase_d8,
1227 }, {
1228 .eraseblocks = { { 4096 * 1024, 1 } },
1229 .block_erase = spi_block_erase_60,
1230 }, {
1231 .eraseblocks = { { 4096 * 1024, 1 } },
1232 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001233 }
Dan Lenski11617122010-07-29 15:00:40 +00001234 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001235 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1236 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001237 .write = spi_chip_write_256,
1238 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001239 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001240 },
1241
1242 {
1243 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001244 .name = "A25LQ16",
1245 .bustype = BUS_SPI,
1246 .manufacture_id = AMIC_ID_NOPREFIX,
1247 .model_id = AMIC_A25LQ16,
1248 .total_size = 2048,
1249 .page_size = 256,
1250 /* supports SFDP */
1251 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1253 .tested = TEST_UNTESTED,
1254 .probe = probe_spi_rdid,
1255 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10001256 .block_erasers =
1257 {
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001258 {
1259 .eraseblocks = { { 4 * 1024, 512 } },
1260 .block_erase = spi_block_erase_20,
1261 }, {
1262 .eraseblocks = { { 64 * 1024, 32 } },
1263 .block_erase = spi_block_erase_52,
1264 }, {
1265 .eraseblocks = { { 64 * 1024, 32 } },
1266 .block_erase = spi_block_erase_d8,
1267 }, {
1268 .eraseblocks = { { 2048 * 1024, 1 } },
1269 .block_erase = spi_block_erase_60,
1270 }, {
1271 .eraseblocks = { { 2048 * 1024, 1 } },
1272 .block_erase = spi_block_erase_c7,
1273 }
1274 },
1275 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1276 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1277 .write = spi_chip_write_256,
1278 .read = spi_chip_read,
1279 .voltage = {2700, 3600},
1280 },
1281
1282 {
1283 .vendor = "AMIC",
1284 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001285 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001286 .manufacture_id = AMIC_ID_NOPREFIX,
1287 .model_id = AMIC_A25LQ032,
1288 .total_size = 4096,
1289 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001290 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001291 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001293 .tested = TEST_UNTESTED,
1294 .probe = probe_spi_rdid,
1295 .probe_timing = TIMING_ZERO,
1296 .block_erasers =
1297 {
1298 {
1299 .eraseblocks = { { 4 * 1024, 1024 } },
1300 .block_erase = spi_block_erase_20,
1301 }, {
1302 .eraseblocks = { { 64 * 1024, 64 } },
1303 .block_erase = spi_block_erase_52,
1304 }, {
1305 .eraseblocks = { { 64 * 1024, 64 } },
1306 .block_erase = spi_block_erase_d8,
1307 }, {
1308 .eraseblocks = { { 4096 * 1024, 1 } },
1309 .block_erase = spi_block_erase_60,
1310 }, {
1311 .eraseblocks = { { 4096 * 1024, 1 } },
1312 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001313 }
Dan Lenski11617122010-07-29 15:00:40 +00001314 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001315 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1316 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1317 .write = spi_chip_write_256,
1318 .read = spi_chip_read,
1319 .voltage = {2700, 3600},
1320 },
1321
1322 {
1323 .vendor = "AMIC",
1324 .name = "A25LQ64",
1325 .bustype = BUS_SPI,
1326 .manufacture_id = AMIC_ID_NOPREFIX,
Stefan Tauner23e10b82016-01-23 16:16:49 +00001327 .model_id = AMIC_A25LQ64,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001328 .total_size = 8192,
1329 .page_size = 256,
1330 /* supports SFDP */
1331 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1332 /* QPI enable 0x35, disable 0xF5 */
1333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1334 .tested = TEST_UNTESTED,
1335 .probe = probe_spi_rdid,
1336 .probe_timing = TIMING_ZERO,
1337 .block_erasers =
1338 {
1339 {
1340 .eraseblocks = { { 4 * 1024, 2048 } },
1341 .block_erase = spi_block_erase_20,
1342 }, {
1343 .eraseblocks = { { 32 * 1024, 256 } },
1344 .block_erase = spi_block_erase_52,
1345 }, {
1346 .eraseblocks = { { 64 * 1024, 128 } },
1347 .block_erase = spi_block_erase_d8,
1348 }, {
1349 .eraseblocks = { { 8192 * 1024, 1 } },
1350 .block_erase = spi_block_erase_60,
1351 }, {
1352 .eraseblocks = { { 8192 * 1024, 1 } },
1353 .block_erase = spi_block_erase_c7,
1354 }
1355 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001356 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001357 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001358 .write = spi_chip_write_256,
1359 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001360 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001361 },
1362
1363 {
1364 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001365 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001366 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001367 .manufacture_id = AMIC_ID_NOPREFIX,
1368 .model_id = AMIC_A29002B,
1369 .total_size = 256,
1370 .page_size = 64 * 1024,
1371 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1372 .tested = TEST_UNTESTED,
1373 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001374 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001375 .block_erasers =
1376 {
1377 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001378 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001379 {16 * 1024, 1},
1380 {8 * 1024, 2},
1381 {32 * 1024, 1},
1382 {64 * 1024, 3},
1383 },
1384 .block_erase = erase_sector_jedec,
1385 }, {
1386 .eraseblocks = { {256 * 1024, 1} },
1387 .block_erase = erase_chip_block_jedec,
1388 },
1389 },
1390 .write = write_jedec_1,
1391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001392 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001393 },
1394
1395 {
1396 .vendor = "AMIC",
1397 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001398 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001399 .manufacture_id = AMIC_ID_NOPREFIX,
1400 .model_id = AMIC_A29002T,
1401 .total_size = 256,
1402 .page_size = 64 * 1024,
1403 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001404 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001405 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001406 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001407 .block_erasers =
1408 {
1409 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001410 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001411 {64 * 1024, 3},
1412 {32 * 1024, 1},
1413 {8 * 1024, 2},
1414 {16 * 1024, 1},
1415 },
1416 .block_erase = erase_sector_jedec,
1417 }, {
1418 .eraseblocks = { {256 * 1024, 1} },
1419 .block_erase = erase_chip_block_jedec,
1420 },
1421 },
1422 .write = write_jedec_1,
1423 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001424 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001425 },
1426
1427 {
1428 .vendor = "AMIC",
1429 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001430 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001431 .manufacture_id = AMIC_ID_NOPREFIX,
1432 .model_id = AMIC_A29040B,
1433 .total_size = 512,
1434 .page_size = 64 * 1024,
1435 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001436 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001437 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001438 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001439 .block_erasers =
1440 {
1441 {
1442 .eraseblocks = { {64 * 1024, 8} },
1443 .block_erase = erase_sector_jedec,
1444 }, {
1445 .eraseblocks = { {512 * 1024, 1} },
1446 .block_erase = erase_chip_block_jedec,
1447 },
1448 },
1449 .write = write_jedec_1,
1450 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001451 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001452 },
1453
1454 {
1455 .vendor = "AMIC",
1456 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001457 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001458 .manufacture_id = AMIC_ID_NOPREFIX,
1459 .model_id = AMIC_A49LF040A,
1460 .total_size = 512,
1461 .page_size = 64 * 1024,
1462 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001463 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001464 .probe = probe_jedec,
1465 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1466 .block_erasers =
1467 {
1468 {
1469 .eraseblocks = { {64 * 1024, 8} },
1470 .block_erase = erase_block_jedec,
1471 }, {
1472 .eraseblocks = { {512 * 1024, 1} },
1473 .block_erase = erase_chip_block_jedec,
1474 }
1475 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001476 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001477 .write = write_jedec_1,
1478 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001479 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001480 },
1481
1482 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001483 .vendor = "Atmel",
1484 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001485 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001486 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001487 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001488 .total_size = 256,
1489 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001490 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1491 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001492 .tested = TEST_UNTESTED,
1493 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001494 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001495 .block_erasers =
1496 {
1497 {
1498 .eraseblocks = { {4 * 1024, 64} },
1499 .block_erase = spi_block_erase_20,
1500 }, {
1501 .eraseblocks = { {32 * 1024, 8} },
1502 .block_erase = spi_block_erase_52,
1503 }, {
1504 .eraseblocks = { {64 * 1024, 4} },
1505 .block_erase = spi_block_erase_d8,
1506 }, {
1507 .eraseblocks = { {256 * 1024, 1} },
1508 .block_erase = spi_block_erase_60,
1509 }, {
1510 .eraseblocks = { {256 * 1024, 1} },
1511 .block_erase = spi_block_erase_c7,
1512 }
1513 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001514 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001515 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001516 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001517 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001518 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001519 },
1520
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001521 {
1522 .vendor = "Atmel",
Steffen Mauch0b59b0d2018-06-02 23:46:03 +02001523 .name = "AT25DF021A",
1524 .bustype = BUS_SPI,
1525 .manufacture_id = ATMEL_ID,
1526 .model_id = ATMEL_AT25DF021A,
1527 .total_size = 256,
1528 .page_size = 256,
1529 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1531 .tested = TEST_OK_PREW,
1532 .probe = probe_spi_rdid,
1533 .probe_timing = TIMING_ZERO,
1534 .block_erasers =
1535 {
1536 {
1537 .eraseblocks = { {4 * 1024, 64} },
1538 .block_erase = spi_block_erase_20,
1539 }, {
1540 .eraseblocks = { {32 * 1024, 8} },
1541 .block_erase = spi_block_erase_52,
1542 }, {
1543 .eraseblocks = { {64 * 1024, 4} },
1544 .block_erase = spi_block_erase_d8,
1545 }, {
1546 .eraseblocks = { {256 * 1024, 1} },
1547 .block_erase = spi_block_erase_60,
1548 }, {
1549 .eraseblocks = { {256 * 1024, 1} },
1550 .block_erase = spi_block_erase_c7,
1551 }
1552 },
1553 .printlock = spi_prettyprint_status_register_at25df,
1554 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1555 .write = spi_chip_write_256,
1556 .read = spi_chip_read,
1557 .voltage = {1650, 3600},
1558 },
1559
1560 {
1561 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001562 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001563 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001564 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001565 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001566 .total_size = 512,
1567 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001568 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001569 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001570 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001571 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001572 .block_erasers =
1573 {
1574 {
1575 .eraseblocks = { {4 * 1024, 128} },
1576 .block_erase = spi_block_erase_20,
1577 }, {
1578 .eraseblocks = { {32 * 1024, 16} },
1579 .block_erase = spi_block_erase_52,
1580 }, {
1581 .eraseblocks = { {64 * 1024, 8} },
1582 .block_erase = spi_block_erase_d8,
1583 }, {
1584 .eraseblocks = { {512 * 1024, 1} },
1585 .block_erase = spi_block_erase_60,
1586 }, {
1587 .eraseblocks = { {512 * 1024, 1} },
1588 .block_erase = spi_block_erase_c7,
1589 }
1590 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001591 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001592 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001593 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001594 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001595 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001596 },
1597
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001598 {
1599 .vendor = "Atmel",
1600 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001601 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001602 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001603 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001604 .total_size = 1024,
1605 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001606 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001607 .tested = TEST_UNTESTED,
1608 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001609 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001610 .block_erasers =
1611 {
1612 {
1613 .eraseblocks = { {4 * 1024, 256} },
1614 .block_erase = spi_block_erase_20,
1615 }, {
1616 .eraseblocks = { {32 * 1024, 32} },
1617 .block_erase = spi_block_erase_52,
1618 }, {
1619 .eraseblocks = { {64 * 1024, 16} },
1620 .block_erase = spi_block_erase_d8,
1621 }, {
1622 .eraseblocks = { {1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_60,
1624 }, {
1625 .eraseblocks = { {1024 * 1024, 1} },
1626 .block_erase = spi_block_erase_c7,
1627 }
1628 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001629 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001630 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001631 .write = spi_chip_write_256,
1632 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001633 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001634 },
1635
1636 {
1637 .vendor = "Atmel",
1638 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001639 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001640 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001641 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001642 .total_size = 1024,
1643 .page_size = 256,
1644 .feature_bits = FEATURE_WRSR_WREN,
1645 .tested = TEST_UNTESTED,
1646 .probe = probe_spi_rdid,
1647 .probe_timing = TIMING_ZERO,
1648 .block_erasers =
1649 {
1650 {
1651 .eraseblocks = { {4 * 1024, 256} },
1652 .block_erase = spi_block_erase_20,
1653 }, {
1654 .eraseblocks = { {32 * 1024, 32} },
1655 .block_erase = spi_block_erase_52,
1656 }, {
1657 .eraseblocks = { {64 * 1024, 16} },
1658 .block_erase = spi_block_erase_d8,
1659 }, {
1660 .eraseblocks = { {1024 * 1024, 1} },
1661 .block_erase = spi_block_erase_60,
1662 }, {
1663 .eraseblocks = { {1024 * 1024, 1} },
1664 .block_erase = spi_block_erase_c7,
1665 }
1666 },
1667 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001668 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001669 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001670 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001671 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001672 },
1673
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001674 {
1675 .vendor = "Atmel",
1676 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001677 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001678 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001679 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001680 .total_size = 2048,
1681 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001682 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons8b5b9622018-09-30 19:13:15 +02001683 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001684 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001685 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001686 .block_erasers =
1687 {
1688 {
1689 .eraseblocks = { {4 * 1024, 512} },
1690 .block_erase = spi_block_erase_20,
1691 }, {
1692 .eraseblocks = { {32 * 1024, 64} },
1693 .block_erase = spi_block_erase_52,
1694 }, {
1695 .eraseblocks = { {64 * 1024, 32} },
1696 .block_erase = spi_block_erase_d8,
1697 }, {
1698 .eraseblocks = { {2 * 1024 * 1024, 1} },
1699 .block_erase = spi_block_erase_60,
1700 }, {
1701 .eraseblocks = { {2 * 1024 * 1024, 1} },
1702 .block_erase = spi_block_erase_c7,
1703 }
1704 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001705 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001706 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001707 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001708 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001709 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001710 },
1711
Alan Green86bf6ab2019-06-27 16:58:20 +10001712 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001713 {
1714 .vendor = "Atmel",
1715 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001716 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001717 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001718 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001719 .total_size = 4096,
1720 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001721 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001722 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001723 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001724 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001725 .block_erasers =
1726 {
1727 {
1728 .eraseblocks = { {4 * 1024, 1024} },
1729 .block_erase = spi_block_erase_20,
1730 }, {
1731 .eraseblocks = { {32 * 1024, 128} },
1732 .block_erase = spi_block_erase_52,
1733 }, {
1734 .eraseblocks = { {64 * 1024, 64} },
1735 .block_erase = spi_block_erase_d8,
1736 }, {
1737 .eraseblocks = { {4 * 1024 * 1024, 1} },
1738 .block_erase = spi_block_erase_60,
1739 }, {
1740 .eraseblocks = { {4 * 1024 * 1024, 1} },
1741 .block_erase = spi_block_erase_c7,
1742 }
1743 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001744 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001745 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001746 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001747 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001748 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001749 },
1750
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001751 {
1752 .vendor = "Atmel",
1753 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001754 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001755 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001756 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001757 .total_size = 4096,
1758 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001759 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1760 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001761 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001762 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001763 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001764 .block_erasers =
1765 {
1766 {
1767 .eraseblocks = { {4 * 1024, 1024} },
1768 .block_erase = spi_block_erase_20,
1769 }, {
1770 .eraseblocks = { {32 * 1024, 128} },
1771 .block_erase = spi_block_erase_52,
1772 }, {
1773 .eraseblocks = { {64 * 1024, 64} },
1774 .block_erase = spi_block_erase_d8,
1775 }, {
1776 .eraseblocks = { {4 * 1024 * 1024, 1} },
1777 .block_erase = spi_block_erase_60,
1778 }, {
1779 .eraseblocks = { {4 * 1024 * 1024, 1} },
1780 .block_erase = spi_block_erase_c7,
1781 }
1782 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001783 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001784 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001785 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001786 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001787 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001788 },
1789
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001790 {
1791 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001792 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001793 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001794 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001795 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001796 .total_size = 8192,
1797 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001798 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001799 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001800 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001801 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001802 .block_erasers =
1803 {
1804 {
1805 .eraseblocks = { {4 * 1024, 2048} },
1806 .block_erase = spi_block_erase_20,
1807 }, {
1808 .eraseblocks = { {32 * 1024, 256} },
1809 .block_erase = spi_block_erase_52,
1810 }, {
1811 .eraseblocks = { {64 * 1024, 128} },
1812 .block_erase = spi_block_erase_d8,
1813 }, {
1814 .eraseblocks = { {8 * 1024 * 1024, 1} },
1815 .block_erase = spi_block_erase_60,
1816 }, {
1817 .eraseblocks = { {8 * 1024 * 1024, 1} },
1818 .block_erase = spi_block_erase_c7,
1819 }
1820 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001821 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001822 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001823 .write = spi_chip_write_256,
1824 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001825 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001826 },
1827
1828 {
1829 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001830 .name = "AT25DL081",
1831 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001832 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001833 .model_id = ATMEL_AT25DF081,
1834 .total_size = 1024,
1835 .page_size = 256,
1836 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1838 .tested = TEST_UNTESTED,
1839 .probe = probe_spi_rdid,
1840 .probe_timing = TIMING_ZERO,
1841 .block_erasers =
1842 {
1843 {
1844 .eraseblocks = { {4 * 1024, 256} },
1845 .block_erase = spi_block_erase_20,
1846 }, {
1847 .eraseblocks = { {32 * 1024, 32} },
1848 .block_erase = spi_block_erase_52,
1849 }, {
1850 .eraseblocks = { {64 * 1024, 16} },
1851 .block_erase = spi_block_erase_d8,
1852 }, {
1853 .eraseblocks = { {1 * 1024 * 1024, 1} },
1854 .block_erase = spi_block_erase_60,
1855 }, {
1856 .eraseblocks = { {1 * 1024 * 1024, 1} },
1857 .block_erase = spi_block_erase_c7,
1858 }
1859 },
1860 .printlock = spi_prettyprint_status_register_at25df_sec,
1861 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1862 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1863 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1864 .voltage = {1650, 1950},
1865 },
1866
1867 {
1868 .vendor = "Atmel",
1869 .name = "AT25DL161",
1870 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001871 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001872 .model_id = ATMEL_AT25DL161,
1873 .total_size = 2048,
1874 .page_size = 256,
1875 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1877 .tested = TEST_UNTESTED,
1878 .probe = probe_spi_rdid,
1879 .probe_timing = TIMING_ZERO,
1880 .block_erasers =
1881 {
1882 {
1883 .eraseblocks = { {4 * 1024, 512} },
1884 .block_erase = spi_block_erase_20,
1885 }, {
1886 .eraseblocks = { {32 * 1024, 64} },
1887 .block_erase = spi_block_erase_52,
1888 }, {
1889 .eraseblocks = { {64 * 1024, 32} },
1890 .block_erase = spi_block_erase_d8,
1891 }, {
1892 .eraseblocks = { {2 * 1024 * 1024, 1} },
1893 .block_erase = spi_block_erase_60,
1894 }, {
1895 .eraseblocks = { {2 * 1024 * 1024, 1} },
1896 .block_erase = spi_block_erase_c7,
1897 }
1898 },
1899 .printlock = spi_prettyprint_status_register_at25df_sec,
1900 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1901 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1902 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1903 .voltage = {1650, 1950},
1904 },
1905
1906 {
1907 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001908 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001909 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001910 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001911 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001912 .total_size = 2048,
1913 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001914 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001916 .tested = TEST_UNTESTED,
1917 .probe = probe_spi_rdid,
1918 .probe_timing = TIMING_ZERO,
1919 .block_erasers =
1920 {
1921 {
1922 .eraseblocks = { {4 * 1024, 512} },
1923 .block_erase = spi_block_erase_20,
1924 }, {
1925 .eraseblocks = { {32 * 1024, 64} },
1926 .block_erase = spi_block_erase_52,
1927 }, {
1928 .eraseblocks = { {64 * 1024, 32} },
1929 .block_erase = spi_block_erase_d8,
1930 }, {
1931 .eraseblocks = { {2 * 1024 * 1024, 1} },
1932 .block_erase = spi_block_erase_60,
1933 }, {
1934 .eraseblocks = { {2 * 1024 * 1024, 1} },
1935 .block_erase = spi_block_erase_c7,
1936 }
1937 },
1938 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001939 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001940 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001941 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001942 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001943 },
1944
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001945 {
1946 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001947 .name = "AT25F512",
1948 .bustype = BUS_SPI,
1949 .manufacture_id = ATMEL_ID,
1950 .model_id = ATMEL_AT25F512,
1951 .total_size = 64,
1952 .page_size = 256,
1953 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001954 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001955 .probe = probe_spi_at25f,
1956 .probe_timing = TIMING_ZERO,
1957 .block_erasers =
1958 {
1959 {
1960 .eraseblocks = { {32 * 1024, 2} },
1961 .block_erase = spi_block_erase_52,
1962 }, {
1963 .eraseblocks = { {64 * 1024, 1} },
1964 .block_erase = spi_block_erase_62,
1965 }
1966 },
1967 .printlock = spi_prettyprint_status_register_at25f,
1968 .unlock = spi_disable_blockprotect_at25f,
1969 .write = spi_chip_write_256,
1970 .read = spi_chip_read,
1971 .voltage = {2700, 3600},
1972 },
1973
1974 {
1975 .vendor = "Atmel",
1976 .name = "AT25F512A",
1977 .bustype = BUS_SPI,
1978 .manufacture_id = ATMEL_ID,
1979 .model_id = ATMEL_AT25F512A,
1980 .total_size = 64,
1981 .page_size = 128,
1982 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001983 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001984 .probe = probe_spi_at25f,
1985 .probe_timing = TIMING_ZERO,
1986 .block_erasers =
1987 {
1988 {
1989 .eraseblocks = { {32 * 1024, 2} },
1990 .block_erase = spi_block_erase_52,
1991 }, {
1992 .eraseblocks = { {64 * 1024, 1} },
1993 .block_erase = spi_block_erase_62,
1994 }
1995 },
1996 .printlock = spi_prettyprint_status_register_at25f512a,
1997 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1998 .unlock = spi_disable_blockprotect_at25f512a,
1999 .write = spi_chip_write_256,
2000 .read = spi_chip_read,
2001 .voltage = {2700, 3600},
2002 },
2003
2004 {
2005 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002006 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002007 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002008 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002009 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002010 .total_size = 64,
2011 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002012 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2013 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002014 .tested = TEST_UNTESTED,
2015 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002016 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002017 .block_erasers =
2018 {
2019 {
2020 .eraseblocks = { {4 * 1024, 16} },
2021 .block_erase = spi_block_erase_20,
2022 }, {
2023 .eraseblocks = { {32 * 1024, 2} },
2024 .block_erase = spi_block_erase_52,
2025 }, {
2026 .eraseblocks = { {32 * 1024, 2} },
2027 .block_erase = spi_block_erase_d8,
2028 }, {
2029 .eraseblocks = { {64 * 1024, 1} },
2030 .block_erase = spi_block_erase_60,
2031 }, {
2032 .eraseblocks = { {64 * 1024, 1} },
2033 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002034 }, {
2035 .eraseblocks = { {64 * 1024, 1} },
2036 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002037 }
2038 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002039 .printlock = spi_prettyprint_status_register_at25f512b,
2040 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002041 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002042 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002043 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002044 },
2045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002046 {
2047 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002048 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
2049 * All other properties seem to be the same.*/
2050 .name = "AT25F1024(A)",
2051 .bustype = BUS_SPI,
2052 .manufacture_id = ATMEL_ID,
2053 .model_id = ATMEL_AT25F1024,
2054 .total_size = 128,
2055 .page_size = 256,
2056 .feature_bits = FEATURE_WRSR_WREN,
2057 .tested = TEST_OK_PREW,
2058 .probe = probe_spi_at25f,
2059 .probe_timing = TIMING_ZERO,
2060 .block_erasers =
2061 {
2062 {
2063 .eraseblocks = { {32 * 1024, 4} },
2064 .block_erase = spi_block_erase_52,
2065 }, {
2066 .eraseblocks = { {128 * 1024, 1} },
2067 .block_erase = spi_block_erase_62,
2068 }
2069 },
2070 .printlock = spi_prettyprint_status_register_at25f,
2071 .unlock = spi_disable_blockprotect_at25f,
2072 .write = spi_chip_write_256,
2073 .read = spi_chip_read,
2074 .voltage = {2700, 3600},
2075 },
2076
2077 {
2078 .vendor = "Atmel",
2079 .name = "AT25F2048",
2080 .bustype = BUS_SPI,
2081 .manufacture_id = ATMEL_ID,
2082 .model_id = ATMEL_AT25F2048,
2083 .total_size = 256,
2084 .page_size = 256,
2085 .feature_bits = FEATURE_WRSR_WREN,
2086 .tested = TEST_UNTESTED,
2087 .probe = probe_spi_at25f,
2088 .probe_timing = TIMING_ZERO,
2089 .block_erasers =
2090 {
2091 {
2092 .eraseblocks = { {64 * 1024, 4} },
2093 .block_erase = spi_block_erase_52,
2094 }, {
2095 .eraseblocks = { {256 * 1024, 1} },
2096 .block_erase = spi_block_erase_62,
2097 }
2098 },
2099 .printlock = spi_prettyprint_status_register_at25f,
2100 .unlock = spi_disable_blockprotect_at25f,
2101 .write = spi_chip_write_256,
2102 .read = spi_chip_read,
2103 .voltage = {2700, 3600},
2104 },
2105
2106 {
2107 .vendor = "Atmel",
2108 .name = "AT25F4096",
2109 .bustype = BUS_SPI,
2110 .manufacture_id = ATMEL_ID,
2111 .model_id = ATMEL_AT25F4096,
2112 .total_size = 512,
2113 .page_size = 256,
2114 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner6697f712014-08-06 15:09:15 +00002115 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002116 .probe = probe_spi_at25f,
2117 .probe_timing = TIMING_ZERO,
2118 .block_erasers =
2119 {
2120 {
2121 .eraseblocks = { {64 * 1024, 8} },
2122 .block_erase = spi_block_erase_52,
2123 }, {
2124 .eraseblocks = { {512 * 1024, 1} },
2125 .block_erase = spi_block_erase_62,
2126 }
2127 },
2128 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002129 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2130 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002131 .write = spi_chip_write_256,
2132 .read = spi_chip_read,
2133 .voltage = {2700, 3600},
2134 },
2135
2136 {
2137 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002138 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002139 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002140 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002141 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002142 .total_size = 128,
2143 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002144 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002145 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002146 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002147 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002148 .block_erasers =
2149 {
2150 {
2151 .eraseblocks = { {4 * 1024, 32} },
2152 .block_erase = spi_block_erase_20,
2153 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002154 .eraseblocks = { {4 * 1024, 32} },
2155 .block_erase = spi_block_erase_d7,
2156 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002157 .eraseblocks = { {32 * 1024, 4} },
2158 .block_erase = spi_block_erase_52,
2159 }, {
2160 .eraseblocks = { {32 * 1024, 4} },
2161 .block_erase = spi_block_erase_d8,
2162 }, {
2163 .eraseblocks = { {128 * 1024, 1} },
2164 .block_erase = spi_block_erase_60,
2165 }, {
2166 .eraseblocks = { {128 * 1024, 1} },
2167 .block_erase = spi_block_erase_c7,
2168 }
2169 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002170 .printlock = spi_prettyprint_status_register_at25fs010,
2171 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002172 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002173 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002174 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002175 },
2176
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002177 {
2178 .vendor = "Atmel",
2179 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002180 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002181 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002182 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002183 .total_size = 512,
2184 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002185 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002186 .tested = TEST_UNTESTED,
2187 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002188 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002189 .block_erasers =
2190 {
2191 {
2192 .eraseblocks = { {4 * 1024, 128} },
2193 .block_erase = spi_block_erase_20,
2194 }, {
2195 .eraseblocks = { {64 * 1024, 8} },
2196 .block_erase = spi_block_erase_52,
2197 }, {
2198 .eraseblocks = { {64 * 1024, 8} },
2199 .block_erase = spi_block_erase_d8,
2200 }, {
2201 .eraseblocks = { {512 * 1024, 1} },
2202 .block_erase = spi_block_erase_60,
2203 }, {
2204 .eraseblocks = { {512 * 1024, 1} },
2205 .block_erase = spi_block_erase_c7,
2206 }
2207 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002208 .printlock = spi_prettyprint_status_register_at25fs040,
2209 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002210 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002211 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002212 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002213 },
2214
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002215 {
2216 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002217 .name = "AT25SF041",
2218 .bustype = BUS_SPI,
2219 .manufacture_id = ATMEL_ID,
2220 .model_id = ATMEL_AT25SF041,
2221 .total_size = 512,
2222 .page_size = 256,
2223 .feature_bits = FEATURE_WRSR_WREN,
2224 .tested = TEST_OK_PREW,
2225 .probe = probe_spi_rdid,
2226 .probe_timing = TIMING_ZERO,
2227 .block_erasers =
2228 {
2229 {
2230 .eraseblocks = { {4 * 1024, 128} },
2231 .block_erase = spi_block_erase_20,
2232 }, {
2233 .eraseblocks = { {32 * 1024, 16} },
2234 .block_erase = spi_block_erase_52,
2235 }, {
2236 .eraseblocks = { {64 * 1024, 8} },
2237 .block_erase = spi_block_erase_d8,
2238 }, {
2239 .eraseblocks = { {512 * 1024, 1} },
2240 .block_erase = spi_block_erase_60,
2241 }, {
2242 .eraseblocks = { {512 * 1024, 1} },
2243 .block_erase = spi_block_erase_c7,
2244 }
2245 },
2246 .printlock = spi_prettyprint_status_register_plain,
2247 .unlock = spi_disable_blockprotect,
2248 .write = spi_chip_write_256,
2249 .read = spi_chip_read,
2250 .voltage = {2500, 3600},
2251 },
2252
2253 {
2254 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002255 .name = "AT25SF081",
2256 .bustype = BUS_SPI,
2257 .manufacture_id = ATMEL_ID,
2258 .model_id = ATMEL_AT25SF081,
2259 .total_size = 1024,
2260 .page_size = 256,
2261 .feature_bits = FEATURE_WRSR_WREN,
2262 .tested = TEST_OK_PREW,
2263 .probe = probe_spi_rdid,
2264 .probe_timing = TIMING_ZERO,
2265 .block_erasers =
2266 {
2267 {
2268 .eraseblocks = { {4 * 1024, 256} },
2269 .block_erase = spi_block_erase_20,
2270 }, {
2271 .eraseblocks = { {32 * 1024, 32} },
2272 .block_erase = spi_block_erase_52,
2273 }, {
2274 .eraseblocks = { {64 * 1024, 16} },
2275 .block_erase = spi_block_erase_d8,
2276 }, {
2277 .eraseblocks = { {1024 * 1024, 1} },
2278 .block_erase = spi_block_erase_60,
2279 }, {
2280 .eraseblocks = { {1024 * 1024, 1} },
2281 .block_erase = spi_block_erase_c7,
2282 }
2283 },
2284 .printlock = spi_prettyprint_status_register_plain,
2285 .unlock = spi_disable_blockprotect,
2286 .write = spi_chip_write_256,
2287 .read = spi_chip_read,
2288 .voltage = {2300, 3600},
2289 },
2290
2291 {
2292 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002293 .name = "AT25SF161",
2294 .bustype = BUS_SPI,
2295 .manufacture_id = ATMEL_ID,
2296 .model_id = ATMEL_AT25SF161,
2297 .total_size = 2048,
2298 .page_size = 256,
2299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2300 .tested = TEST_OK_PREW,
2301 .probe = probe_spi_rdid,
2302 .probe_timing = TIMING_ZERO,
2303 .block_erasers =
2304 {
2305 {
2306 .eraseblocks = { {4 * 1024, 512} },
2307 .block_erase = spi_block_erase_20,
2308 }, {
2309 .eraseblocks = { {32 * 1024, 64} },
2310 .block_erase = spi_block_erase_52,
2311 }, {
2312 .eraseblocks = { {64 * 1024, 32} },
2313 .block_erase = spi_block_erase_d8,
2314 }, {
2315 .eraseblocks = { {2048 * 1024, 1} },
2316 .block_erase = spi_block_erase_60,
2317 }, {
2318 .eraseblocks = { {2048 * 1024, 1} },
2319 .block_erase = spi_block_erase_c7,
2320 }
2321 },
2322 .printlock = spi_prettyprint_status_register_plain,
2323 .unlock = spi_disable_blockprotect,
2324 .write = spi_chip_write_256,
2325 .read = spi_chip_read,
2326 .voltage = {2500, 3600},
2327 },
2328
2329 {
Alan Green57938f82019-06-27 15:06:43 +10002330 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002331 .name = "AT25SL128A",
2332 .bustype = BUS_SPI,
2333 .manufacture_id = ATMEL_ID,
2334 .model_id = ATMEL_AT25SL128A,
2335 .total_size = 16384,
2336 .page_size = 256,
2337 /* supports SFDP */
2338 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
2339 .tested = TEST_OK_PREW,
2340 .probe = probe_spi_rdid,
2341 .probe_timing = TIMING_ZERO,
2342 .block_erasers =
2343 {
2344 {
2345 .eraseblocks = { {4 * 1024, 4096} },
2346 .block_erase = spi_block_erase_20,
2347 }, {
2348 .eraseblocks = { {32 * 1024, 512} },
2349 .block_erase = spi_block_erase_52,
2350 }, {
2351 .eraseblocks = { {64 * 1024, 256} },
2352 .block_erase = spi_block_erase_d8,
2353 }, {
2354 .eraseblocks = { {16 * 1024 * 1024, 1} },
2355 .block_erase = spi_block_erase_60,
2356 }, {
2357 .eraseblocks = { {16 * 1024 * 1024, 1} },
2358 .block_erase = spi_block_erase_c7,
2359 }
2360 },
2361 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2362 .unlock = spi_disable_blockprotect,
2363 .write = spi_chip_write_256,
2364 .read = spi_chip_read,
2365 .voltage = {1700, 2000},
2366 },
2367
2368 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002369 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002370 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002371 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002372 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002373 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002374 .total_size = 512,
2375 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002376 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002377 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002378 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002379 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002380 .block_erasers =
2381 {
2382 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002383 .eraseblocks = { {256, 2048} },
2384 .block_erase = spi_block_erase_81,
2385 }, {
2386 .eraseblocks = { {2 * 1024, 256} },
2387 .block_erase = spi_block_erase_50,
2388 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002389 .eraseblocks = { {4 * 1024, 128} },
2390 .block_erase = spi_block_erase_20,
2391 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002392 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002393 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002394 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002395 .write = spi_chip_write_1,
2396 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002397 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002398 },
2399
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002400 {
2401 .vendor = "Atmel",
2402 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002403 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002404 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002405 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002406 .total_size = 1024,
2407 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002408 .feature_bits = FEATURE_WRSR_WREN,
2409 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002410 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002411 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002412 .block_erasers =
2413 {
2414 {
2415 .eraseblocks = { {4 * 1024, 256} },
2416 .block_erase = spi_block_erase_20,
2417 }, {
2418 .eraseblocks = { {32 * 1024, 32} },
2419 .block_erase = spi_block_erase_52,
2420 }, {
2421 .eraseblocks = { {64 * 1024, 16} },
2422 .block_erase = spi_block_erase_d8,
2423 }, {
2424 .eraseblocks = { {1024 * 1024, 1} },
2425 .block_erase = spi_block_erase_60,
2426 }, {
2427 .eraseblocks = { {1024 * 1024, 1} },
2428 .block_erase = spi_block_erase_c7,
2429 }
2430 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002431 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002432 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002433 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002434 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002435 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002436 },
2437
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002438 {
2439 .vendor = "Atmel",
2440 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002441 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002442 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002443 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002444 .total_size = 2048,
2445 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002446 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002447 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002448 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002449 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002450 .block_erasers =
2451 {
2452 {
2453 .eraseblocks = { {4 * 1024, 512} },
2454 .block_erase = spi_block_erase_20,
2455 }, {
2456 .eraseblocks = { {32 * 1024, 64} },
2457 .block_erase = spi_block_erase_52,
2458 }, {
2459 .eraseblocks = { {64 * 1024, 32} },
2460 .block_erase = spi_block_erase_d8,
2461 }, {
2462 .eraseblocks = { {2 * 1024 * 1024, 1} },
2463 .block_erase = spi_block_erase_60,
2464 }, {
2465 .eraseblocks = { {2 * 1024 * 1024, 1} },
2466 .block_erase = spi_block_erase_c7,
2467 }
2468 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002469 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002470 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002471 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002472 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002473 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002474 },
2475
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002476 {
2477 .vendor = "Atmel",
2478 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002479 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002480 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002481 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002482 .total_size = 2048,
2483 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002484 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002485 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002486 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002487 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002488 .block_erasers =
2489 {
2490 {
2491 .eraseblocks = { {4 * 1024, 512} },
2492 .block_erase = spi_block_erase_20,
2493 }, {
2494 .eraseblocks = { {32 * 1024, 64} },
2495 .block_erase = spi_block_erase_52,
2496 }, {
2497 .eraseblocks = { {64 * 1024, 32} },
2498 .block_erase = spi_block_erase_d8,
2499 }, {
2500 .eraseblocks = { {2 * 1024 * 1024, 1} },
2501 .block_erase = spi_block_erase_60,
2502 }, {
2503 .eraseblocks = { {2 * 1024 * 1024, 1} },
2504 .block_erase = spi_block_erase_c7,
2505 }
2506 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002507 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002508 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002509 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002510 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002511 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002512 },
2513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002514 {
2515 .vendor = "Atmel",
2516 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002517 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002518 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002519 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002520 .total_size = 512,
2521 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002522 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc1863ca2019-06-27 15:08:03 +10002523 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002524 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002525 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002526 .block_erasers =
2527 {
2528 {
2529 .eraseblocks = { {4 * 1024, 128} },
2530 .block_erase = spi_block_erase_20,
2531 }, {
2532 .eraseblocks = { {32 * 1024, 16} },
2533 .block_erase = spi_block_erase_52,
2534 }, {
2535 .eraseblocks = { {64 * 1024, 8} },
2536 .block_erase = spi_block_erase_d8,
2537 }, {
2538 .eraseblocks = { {512 * 1024, 1} },
2539 .block_erase = spi_block_erase_60,
2540 }, {
2541 .eraseblocks = { {512 * 1024, 1} },
2542 .block_erase = spi_block_erase_c7,
2543 }
2544 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002545 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002546 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002547 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002548 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002549 },
2550
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002551 {
2552 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002553 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002554 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002555 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002556 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002557 .total_size = 64,
2558 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002559 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002560 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002561 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002562 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002563 .block_erasers =
2564 {
2565 {
2566 .eraseblocks = { {64 * 1024, 1} },
2567 .block_erase = erase_chip_block_jedec,
2568 }
2569 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002570 .write = write_jedec,
2571 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002572 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002573 },
2574
2575 {
2576 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002577 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002578 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002579 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002580 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002581 .total_size = 128,
2582 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002583 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002584 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002585 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002586 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002587 .block_erasers =
2588 {
2589 {
2590 .eraseblocks = { {128 * 1024, 1} },
2591 .block_erase = erase_chip_block_jedec,
2592 }
2593 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002594 .write = write_jedec, /* FIXME */
2595 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002596 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002597 },
2598
2599 {
2600 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002601 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002602 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002603 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002604 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002605 .total_size = 256,
2606 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002607 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002608 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002609 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002610 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002611 .block_erasers =
2612 {
2613 {
2614 .eraseblocks = { {256 * 1024, 1} },
2615 .block_erase = erase_chip_block_jedec,
2616 }
2617 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002618 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002619 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002620 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002621 },
2622
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002623 {
2624 .vendor = "Atmel",
2625 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002626 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002627 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002628 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002629 .total_size = 512,
2630 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002631 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002632 .tested = TEST_UNTESTED,
2633 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002634 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002635 .block_erasers =
2636 {
2637 {
2638 .eraseblocks = { {512 * 1024, 1} },
2639 .block_erase = erase_chip_block_jedec,
2640 }
2641 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002642 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002643 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002644 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002645 },
2646
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002647 {
2648 .vendor = "Atmel",
2649 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002650 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002651 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002652 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002653 .total_size = 16896, /* No power of two sizes */
2654 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002655 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002656 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2657 .feature_bits = FEATURE_OTP,
2658 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002659 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002660 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002661 .block_erasers =
2662 {
2663 {
2664 .eraseblocks = {
2665 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2666 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2667 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2668 },
2669 .block_erase = spi_erase_at45cs_sector,
2670 }
2671 },
2672 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002673 .write = spi_write_at45db,
2674 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002675 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002676 .gran = write_gran_1056bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002677 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002678
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002679 {
2680 .vendor = "Atmel",
2681 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002682 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002683 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002684 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002685 .total_size = 128, /* or 132, determined from status register */
2686 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002687 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002688 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2689 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002690 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002691 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002692 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002693 .block_erasers =
2694 {
2695 {
2696 .eraseblocks = { {256, 512} },
2697 .block_erase = spi_erase_at45db_page,
2698 }, {
2699 .eraseblocks = { {8 * 256, 512/8} },
2700 .block_erase = spi_erase_at45db_block,
2701 }, {
2702 .eraseblocks = {
2703 {8 * 256, 1},
2704 {120 * 256, 1},
2705 {128 * 256, 3},
2706 },
2707 .block_erase = spi_erase_at45db_sector
2708 }, {
2709 .eraseblocks = { {128 * 1024, 1} },
2710 .block_erase = spi_erase_at45db_chip,
2711 }
2712 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002713 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002714 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002715 /* granularity will be set by the probing function. */
2716 .write = spi_write_at45db,
2717 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002718 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002719 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002720
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002721 {
2722 .vendor = "Atmel",
2723 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002724 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002725 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002726 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002727 .total_size = 256, /* or 264, determined from status register */
2728 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002729 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002730 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2731 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002732 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002733 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002734 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002735 .block_erasers =
2736 {
2737 {
2738 .eraseblocks = { {256, 1024} },
2739 .block_erase = spi_erase_at45db_page,
2740 }, {
2741 .eraseblocks = { {8 * 256, 1024/8} },
2742 .block_erase = spi_erase_at45db_block,
2743 }, {
2744 .eraseblocks = {
2745 {8 * 256, 1},
2746 {120 * 256, 1},
2747 {128 * 256, 7},
2748 },
2749 .block_erase = spi_erase_at45db_sector
2750 }, {
2751 .eraseblocks = { {256 * 1024, 1} },
2752 .block_erase = spi_erase_at45db_chip,
2753 }
2754 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002755 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002756 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002757 /* granularity will be set by the probing function. */
2758 .write = spi_write_at45db,
2759 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002760 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002761 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002762
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002763 {
2764 .vendor = "Atmel",
2765 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002766 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002767 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002768 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002769 .total_size = 512, /* or 528, determined from status register */
2770 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002771 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002772 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2773 .feature_bits = FEATURE_OTP,
2774 .tested = TEST_OK_PREW,
2775 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002776 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002777 .block_erasers =
2778 {
2779 {
2780 .eraseblocks = { {256, 2048} },
2781 .block_erase = spi_erase_at45db_page,
2782 }, {
2783 .eraseblocks = { {8 * 256, 2048/8} },
2784 .block_erase = spi_erase_at45db_block,
2785 }, {
2786 .eraseblocks = {
2787 {8 * 256, 1},
2788 {248 * 256, 1},
2789 {256 * 256, 7},
2790 },
2791 .block_erase = spi_erase_at45db_sector
2792 }, {
2793 .eraseblocks = { {512 * 1024, 1} },
2794 .block_erase = spi_erase_at45db_chip,
2795 }
2796 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002797 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002798 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002799 /* granularity will be set by the probing function. */
2800 .write = spi_write_at45db,
2801 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2802 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002803 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002804
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002805 {
2806 .vendor = "Atmel",
2807 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002808 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002809 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002810 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002811 .total_size = 1024, /* or 1056, determined from status register */
2812 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002813 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002814 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2815 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002816 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002817 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002818 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002819 .block_erasers =
2820 {
2821 {
2822 .eraseblocks = { {256, 4096} },
2823 .block_erase = spi_erase_at45db_page,
2824 }, {
2825 .eraseblocks = { {8 * 256, 4096/8} },
2826 .block_erase = spi_erase_at45db_block,
2827 }, {
2828 .eraseblocks = {
2829 {8 * 256, 1},
2830 {248 * 256, 1},
2831 {256 * 256, 15},
2832 },
2833 .block_erase = spi_erase_at45db_sector
2834 }, {
2835 .eraseblocks = { {1024 * 1024, 1} },
2836 .block_erase = spi_erase_at45db_chip,
2837 }
2838 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002839 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002840 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002841 /* granularity will be set by the probing function. */
2842 .write = spi_write_at45db,
2843 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002844 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002845 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002846
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002847 {
2848 .vendor = "Atmel",
2849 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002850 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002851 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002852 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002853 .total_size = 2048, /* or 2112, determined from status register */
2854 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002855 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002856 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2857 .feature_bits = FEATURE_OTP,
2858 .tested = TEST_OK_PREW,
2859 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002860 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002861 .block_erasers =
2862 {
2863 {
2864 .eraseblocks = { {512, 4096} },
2865 .block_erase = spi_erase_at45db_page,
2866 }, {
2867 .eraseblocks = { {8 * 512, 4096/8} },
2868 .block_erase = spi_erase_at45db_block,
2869 }, {
2870 .eraseblocks = {
2871 {8 * 512, 1},
2872 {248 * 512, 1},
2873 {256 * 512, 15},
2874 },
2875 .block_erase = spi_erase_at45db_sector
2876 }, {
2877 .eraseblocks = { {2048 * 1024, 1} },
2878 .block_erase = spi_erase_at45db_chip,
2879 }
2880 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002881 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002882 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002883 /* granularity will be set by the probing function. */
2884 .write = spi_write_at45db,
2885 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002886 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002887 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002888
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002889 {
2890 .vendor = "Atmel",
2891 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002892 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002893 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002894 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10002895 .total_size = 4224, /* No power of two sizes */
2896 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002897 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002898 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2899 .feature_bits = FEATURE_OTP,
2900 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002901 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002902 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002903 .block_erasers =
2904 {
2905 {
2906 .eraseblocks = { {528, 8192} },
2907 .block_erase = spi_erase_at45db_page,
2908 }, {
2909 .eraseblocks = { {8 * 528, 8192/8} },
2910 .block_erase = spi_erase_at45db_block,
2911 }, /* Although the datasheets describes sectors (which can be write protected)
2912 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00002913 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002914 .eraseblocks = {
2915 {8 * 528, 1},
2916 {120 * 528, 1},
2917 {128 * 528, 63},
2918 },
2919 .block_erase = spi_erase_at45db_sector
2920 }, */ {
2921 .eraseblocks = { {4224 * 1024, 1} },
2922 .block_erase = spi_erase_at45db_chip,
2923 }
2924 },
2925 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002926 .write = spi_write_at45db,
2927 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002928 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002929 .gran = write_gran_528bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002930 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002931
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002932 {
2933 .vendor = "Atmel",
2934 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002935 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002936 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002937 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10002938 .total_size = 4096, /* or 4224, determined from status register */
2939 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002940 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002941 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002942 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00002943 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002944 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002945 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002946 .block_erasers =
2947 {
2948 {
2949 .eraseblocks = { {512, 8192} },
2950 .block_erase = spi_erase_at45db_page,
2951 }, {
2952 .eraseblocks = { {8 * 512, 8192/8} },
2953 .block_erase = spi_erase_at45db_block,
2954 }, {
2955 .eraseblocks = {
2956 {8 * 512, 1},
2957 {120 * 512, 1},
2958 {128 * 512, 63},
2959 },
2960 .block_erase = spi_erase_at45db_sector
2961 }, {
2962 .eraseblocks = { {4096 * 1024, 1} },
2963 .block_erase = spi_erase_at45db_chip,
2964 }
2965 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002966 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002967 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002968 /* granularity will be set by the probing function. */
2969 .write = spi_write_at45db,
2970 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2971 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2972 },
2973
2974 {
2975 .vendor = "Atmel",
2976 .name = "AT45DB321E",
2977 .bustype = BUS_SPI,
2978 .manufacture_id = ATMEL_ID,
2979 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10002980 .total_size = 4096, /* or 4224, determined from status register */
2981 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002982 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2983 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2984 .feature_bits = FEATURE_OTP,
2985 .tested = TEST_UNTESTED,
2986 .probe = probe_spi_at45db,
2987 .probe_timing = TIMING_ZERO,
2988 .block_erasers =
2989 {
2990 {
2991 .eraseblocks = { {512, 8192} },
2992 .block_erase = spi_erase_at45db_page,
2993 }, {
2994 .eraseblocks = { {8 * 512, 8192/8} },
2995 .block_erase = spi_erase_at45db_block,
2996 }, {
2997 .eraseblocks = {
2998 {8 * 512, 1},
2999 {120 * 512, 1},
3000 {128 * 512, 63},
3001 },
3002 .block_erase = spi_erase_at45db_sector
3003 }, {
3004 .eraseblocks = { {4096 * 1024, 1} },
3005 .block_erase = spi_erase_at45db_chip,
3006 }
3007 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003008 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
Alan Greenc1863ca2019-06-27 15:08:03 +10003009 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003010 /* granularity will be set by the probing function. */
3011 .write = spi_write_at45db,
3012 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3013 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003014 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003015
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003016 {
3017 .vendor = "Atmel",
3018 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003019 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003020 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003021 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003022 .total_size = 8192, /* or 8448, determined from status register */
3023 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003024 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003025 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3026 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003027 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003028 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003029 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003030 .block_erasers =
3031 {
3032 {
3033 .eraseblocks = { {1024, 8192} },
3034 .block_erase = spi_erase_at45db_page,
3035 }, {
3036 .eraseblocks = { {8 * 1024, 8192/8} },
3037 .block_erase = spi_erase_at45db_block,
3038 }, {
3039 .eraseblocks = {
3040 {8 * 1024, 1},
3041 {248 * 1024, 1},
3042 {256 * 1024, 31},
3043 },
3044 .block_erase = spi_erase_at45db_sector
3045 }, {
3046 .eraseblocks = { {8192 * 1024, 1} },
3047 .block_erase = spi_erase_at45db_chip,
3048 }
3049 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003050 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003051 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003052 /* granularity will be set by the probing function. */
3053 .write = spi_write_at45db,
3054 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003055 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003056 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003057
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003058 {
3059 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003060 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003061 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003062 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003063 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003064 .total_size = 64,
3065 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003066 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003067 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003068 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003069 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003070 .block_erasers =
3071 {
3072 {
3073 .eraseblocks = { {64 * 1024, 1} },
3074 .block_erase = erase_chip_block_jedec,
3075 }
3076 },
Sean Nelson35727f72010-01-28 23:55:12 +00003077 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003078 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003079 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003080 },
3081
3082 {
3083 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003084 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003085 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003086 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003087 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003088 .total_size = 256,
3089 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003090 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003091 .tested = TEST_UNTESTED,
3092 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003093 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003094 .block_erasers =
3095 {
3096 {
3097 .eraseblocks = {
3098 {16 * 1024, 1},
3099 {8 * 1024, 2},
3100 {96 * 1024, 1},
3101 {128 * 1024, 1},
3102 },
3103 .block_erase = erase_sector_jedec,
3104 }, {
3105 .eraseblocks = { {256 * 1024, 1} },
3106 .block_erase = erase_chip_block_jedec,
3107 }
3108 },
Sean Nelson35727f72010-01-28 23:55:12 +00003109 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003110 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003111 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003112 },
3113
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003114 {
3115 .vendor = "Atmel",
3116 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003117 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003118 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003119 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003120 .total_size = 256,
3121 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003122 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003123 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003124 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003125 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003126 .block_erasers =
3127 {
3128 {
3129 .eraseblocks = {
3130 {128 * 1024, 1},
3131 {96 * 1024, 1},
3132 {8 * 1024, 2},
3133 {16 * 1024, 1},
3134 },
3135 .block_erase = erase_sector_jedec,
3136 }, {
3137 .eraseblocks = { {256 * 1024, 1} },
3138 .block_erase = erase_chip_block_jedec,
3139 }
3140 },
Sean Nelson35727f72010-01-28 23:55:12 +00003141 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003142 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003143 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003144 },
3145
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003146 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003147 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003148 .name = "AT49(H)F010",
3149 .bustype = BUS_PARALLEL,
3150 .manufacture_id = ATMEL_ID,
3151 .model_id = ATMEL_AT49F010,
3152 .total_size = 128,
3153 .page_size = 0, /* unused */
3154 .feature_bits = FEATURE_EITHER_RESET,
3155 .tested = TEST_OK_PREW,
3156 .probe = probe_jedec,
3157 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3158 .block_erasers =
3159 {
3160 {
3161 .eraseblocks = { {128 * 1024, 1} },
3162 .block_erase = erase_chip_block_jedec,
3163 }
3164 },
3165 .printlock = printlock_at49f,
Elyes HAOUAS124ef382018-03-27 12:15:09 +02003166 .write = write_jedec_1,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003167 .read = read_memmapped,
3168 .voltage = {4500, 5500},
3169 },
3170
3171 {
3172 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003173 .name = "AT49F020",
3174 .bustype = BUS_PARALLEL,
3175 .manufacture_id = ATMEL_ID,
3176 .model_id = ATMEL_AT49F020,
3177 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003178 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003179 .feature_bits = FEATURE_EITHER_RESET,
3180 .tested = TEST_OK_PRE,
3181 .probe = probe_jedec,
3182 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3183 .block_erasers =
3184 {
3185 {
3186 .eraseblocks = { {256 * 1024, 1} },
3187 .block_erase = erase_chip_block_jedec,
3188 }
3189 /* Chip features an optional permanent write protection
3190 * of the first 8 kB. The erase function is the same as
3191 * above, but 00000H to 01FFFH will not be erased.
3192 * FIXME: add another eraser when partial erasers are
3193 * supported.
3194 */
3195 },
3196 .printlock = printlock_at49f,
3197 .write = write_jedec_1,
3198 .read = read_memmapped,
3199 .voltage = {4500, 5500},
3200 },
3201
3202 {
3203 .vendor = "Atmel",
3204 .name = "AT49F040",
3205 .bustype = BUS_PARALLEL,
3206 .manufacture_id = ATMEL_ID,
3207 .model_id = ATMEL_AT49F040,
3208 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003209 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003210 .feature_bits = FEATURE_EITHER_RESET,
3211 .tested = TEST_UNTESTED,
3212 .probe = probe_jedec,
3213 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3214 .block_erasers =
3215 {
3216 {
3217 .eraseblocks = { {512 * 1024, 1} },
3218 .block_erase = erase_chip_block_jedec,
3219 }
3220 /* Chip features an optional permanent write protection
3221 * of the first 16 kB. The erase function is the same as
3222 * above, but 00000H to 03FFFH will not be erased.
3223 * FIXME: add another eraser when partial erasers are
3224 * supported.
3225 */
3226 },
3227 .printlock = printlock_at49f,
3228 .write = write_jedec_1,
3229 .read = read_memmapped,
3230 .voltage = {4500, 5500},
3231 },
3232
3233 {
3234 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003235 .name = "AT49F080",
3236 .bustype = BUS_PARALLEL,
3237 .manufacture_id = ATMEL_ID,
3238 .model_id = ATMEL_AT49F080,
3239 .total_size = 1024,
3240 .page_size = 0, /* unused */
3241 .feature_bits = FEATURE_EITHER_RESET,
3242 .tested = TEST_UNTESTED,
3243 .probe = probe_jedec,
3244 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3245 .block_erasers =
3246 {
3247 {
3248 .eraseblocks = { {1024 * 1024, 1} },
3249 .block_erase = erase_chip_block_jedec,
3250 }
3251 /* Chip features an optional permanent write protection
3252 * of the first 16 kB. The erase function is the same as
3253 * above, but 00000H to 03FFFH will not be erased.
3254 * FIXME: add another eraser when partial erasers are
3255 * supported.
3256 */
3257 },
3258 .printlock = printlock_at49f,
3259 .write = write_jedec_1,
3260 .read = read_memmapped,
3261 .voltage = {4500, 5500},
3262 },
3263
3264 {
3265 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3266 .vendor = "Atmel",
3267 .name = "AT49F080T",
3268 .bustype = BUS_PARALLEL,
3269 .manufacture_id = ATMEL_ID,
3270 .model_id = ATMEL_AT49F080T,
3271 .total_size = 1024,
3272 .page_size = 0, /* unused */
3273 .feature_bits = FEATURE_EITHER_RESET,
3274 .tested = TEST_UNTESTED,
3275 .probe = probe_jedec,
3276 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3277 .block_erasers =
3278 {
3279 {
3280 .eraseblocks = { {1024 * 1024, 1} },
3281 .block_erase = erase_chip_block_jedec,
3282 }
3283 /* Chip features an optional permanent write protection
3284 * of the first 16 kB. The erase function is the same as
3285 * above, but FC000H to FFFFFH will not be erased.
3286 * FIXME: add another eraser when partial erasers are
3287 * supported.
3288 */
3289 },
3290 .printlock = printlock_at49f,
3291 .write = write_jedec_1,
3292 .read = read_memmapped,
3293 .voltage = {4500, 5500},
3294 },
3295
3296 {
3297 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003298 .name = "AT49LH002",
3299 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3300 .manufacture_id = ATMEL_ID,
3301 .model_id = ATMEL_AT49LH002,
3302 .total_size = 256,
3303 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003304 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003305 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003306 .probe = probe_82802ab,
3307 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003308 .block_erasers =
3309 {
3310 {
3311 .eraseblocks = {
3312 {64 * 1024, 3},
3313 {32 * 1024, 1},
3314 {8 * 1024, 2},
3315 {16 * 1024, 1},
3316 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003317 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003318 }, {
3319 .eraseblocks = {
3320 {64 * 1024, 4},
3321 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003322 .block_erase = erase_block_82802ab,
3323 },
3324 },
3325 .printlock = printlock_regspace2_block_eraser_0,
3326 .unlock = unlock_regspace2_block_eraser_0,
3327 .write = write_82802ab,
3328 .read = read_memmapped,
3329 .voltage = {3000, 3600},
3330 },
3331
3332 {
3333 .vendor = "Atmel",
3334 .name = "AT49LH00B4",
3335 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3336 .manufacture_id = ATMEL_ID,
3337 .model_id = ATMEL_AT49LH00B4,
3338 .total_size = 512,
3339 .page_size = 0, /* unused */
3340 .feature_bits = FEATURE_REGISTERMAP,
3341 .tested = TEST_UNTESTED,
3342 .probe = probe_82802ab,
3343 .probe_timing = TIMING_ZERO,
3344 .block_erasers =
3345 {
3346 {
3347 .eraseblocks = {
3348 {8 * 1024, 2},
3349 {16 * 1024, 1},
3350 {32 * 1024, 1},
3351 {64 * 1024, 7},
3352 },
3353 .block_erase = NULL, /* TODO: Implement. */
3354 }, {
3355 .eraseblocks = {
3356 {64 * 1024, 8},
3357 },
3358 .block_erase = erase_block_82802ab,
3359 },
3360 },
3361 .printlock = printlock_regspace2_block_eraser_0,
3362 .unlock = unlock_regspace2_block_eraser_0,
3363 .write = write_82802ab,
3364 .read = read_memmapped,
3365 .voltage = {3000, 3600},
3366 },
3367
3368 {
3369 .vendor = "Atmel",
3370 .name = "AT49LH004",
3371 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3372 .manufacture_id = ATMEL_ID,
3373 .model_id = ATMEL_AT49LH004,
3374 .total_size = 512,
3375 .page_size = 0, /* unused */
3376 .feature_bits = FEATURE_REGISTERMAP,
3377 .tested = TEST_UNTESTED,
3378 .probe = probe_82802ab,
3379 .probe_timing = TIMING_ZERO,
3380 .block_erasers =
3381 {
3382 {
3383 .eraseblocks = {
3384 {64 * 1024, 7},
3385 {32 * 1024, 1},
3386 {8 * 1024, 2},
3387 {16 * 1024, 1},
3388 },
3389 .block_erase = erase_block_82802ab,
3390 }, {
3391 .eraseblocks = {
3392 {64 * 1024, 8},
3393 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003394 .block_erase = NULL, /* TODO: Implement. */
3395 },
3396 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003397 .printlock = printlock_regspace2_block_eraser_0,
3398 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003399 .write = write_82802ab,
3400 .read = read_memmapped,
3401 .voltage = {3000, 3600},
3402 },
3403
3404 {
Andrew Morganca081462011-09-13 22:05:44 +00003405 .vendor = "Catalyst",
3406 .name = "CAT28F512",
3407 .bustype = BUS_PARALLEL,
3408 .manufacture_id = CATALYST_ID,
3409 .model_id = CATALYST_CAT28F512,
3410 .total_size = 64,
3411 .page_size = 0, /* unused */
3412 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003413 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003414 .probe = probe_jedec, /* FIXME! */
3415 .probe_timing = TIMING_ZERO,
3416 .block_erasers =
3417 {
3418 {
3419 .eraseblocks = { {64 * 1024, 1} },
3420 .block_erase = NULL, /* TODO */
3421 },
3422 },
3423 .write = NULL, /* TODO */
3424 .read = read_memmapped,
3425 .voltage = {4500, 5500},
3426 },
3427
3428 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003429 .vendor = "Bright",
3430 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003431 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003432 .manufacture_id = BRIGHT_ID,
3433 .model_id = BRIGHT_BM29F040,
3434 .total_size = 512,
3435 .page_size = 64 * 1024,
3436 .feature_bits = FEATURE_EITHER_RESET,
3437 .tested = TEST_OK_PR,
3438 .probe = probe_jedec,
3439 .probe_timing = TIMING_ZERO,
3440 .block_erasers =
3441 {
3442 {
3443 .eraseblocks = { {64 * 1024, 8} },
3444 .block_erase = erase_sector_jedec,
3445 }, {
3446 .eraseblocks = { {512 * 1024, 1} },
3447 .block_erase = erase_chip_block_jedec,
3448 },
3449 },
3450 .write = write_jedec_1,
3451 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003452 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003453 },
3454
3455 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003456 .vendor = "ENE",
3457 .name = "KB9012 (EDI)",
3458 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003459 .total_size = 128,
3460 .page_size = 128,
3461 .feature_bits = FEATURE_ERASED_ZERO,
3462 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10003463 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003464 .probe = edi_probe_kb9012,
3465 .probe_timing = TIMING_ZERO,
3466 .block_erasers =
3467 {
3468 {
3469 .eraseblocks = { {128, 1024} },
3470 .block_erase = edi_chip_block_erase,
3471 },
3472 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003473 .write = edi_chip_write,
3474 .read = edi_chip_read,
3475 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003476 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003477 },
3478
3479 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003480 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003481 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003482 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003483 .manufacture_id = ESMT_ID,
3484 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003485 .total_size = 256,
3486 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003487 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003488 .tested = TEST_UNTESTED,
3489 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003490 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003491 .block_erasers =
3492 {
3493 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003494 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003495 {128 * 1024, 1},
3496 {96 * 1024, 1},
3497 {8 * 1024, 2},
3498 {16 * 1024, 1},
3499 },
3500 .block_erase = erase_sector_jedec,
3501 }, {
3502 .eraseblocks = { {256 * 1024, 1} },
3503 .block_erase = erase_chip_block_jedec,
3504 }
3505 },
Sean Nelson35727f72010-01-28 23:55:12 +00003506 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003507 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003508 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003509 },
3510
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003511 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003512 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003513 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003514 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003515 .manufacture_id = ESMT_ID,
3516 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003517 .total_size = 1024,
3518 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003519 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003520 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003521 .probe = probe_spi_rdid,
3522 .probe_timing = TIMING_ZERO,
3523 .block_erasers =
3524 {
3525 {
3526 .eraseblocks = { {4 * 1024, 256} },
3527 .block_erase = spi_block_erase_20,
3528 }, {
3529 .eraseblocks = { {64 * 1024, 16} },
3530 .block_erase = spi_block_erase_d8,
3531 }, {
3532 .eraseblocks = { {1024 * 1024, 1} },
3533 .block_erase = spi_block_erase_60,
3534 }, {
3535 .eraseblocks = { {1024 * 1024, 1} },
3536 .block_erase = spi_block_erase_c7,
3537 }
3538 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003539 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003540 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003541 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003542 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003543 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003544 },
3545
3546 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003547 .vendor = "ESMT",
3548 .name = "F25L32PA",
3549 .bustype = BUS_SPI,
3550 .manufacture_id = ESMT_ID,
3551 .model_id = ESMT_F25L32PA,
3552 .total_size = 4096,
3553 .page_size = 256,
3554 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3555 .tested = TEST_UNTESTED,
3556 .probe = probe_spi_rdid,
3557 .probe_timing = TIMING_ZERO,
3558 .block_erasers =
3559 {
3560 {
3561 .eraseblocks = { {4 * 1024, 1024} },
3562 .block_erase = spi_block_erase_20,
3563 }, {
3564 .eraseblocks = { {64 * 1024, 64} },
3565 .block_erase = spi_block_erase_d8,
3566 }, {
3567 .eraseblocks = { {4 * 1024 * 1024, 1} },
3568 .block_erase = spi_block_erase_60,
3569 }, {
3570 .eraseblocks = { {4 * 1024 * 1024, 1} },
3571 .block_erase = spi_block_erase_c7,
3572 }
3573 },
3574 .printlock = spi_prettyprint_status_register_bp2_bpl,
3575 .unlock = spi_disable_blockprotect,
3576 .write = spi_chip_write_256,
3577 .read = spi_chip_read,
3578 .voltage = {2700, 3600},
3579 },
3580
3581 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003582 .vendor = "Eon",
3583 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003584 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003585 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003586 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003587 .total_size = 64,
3588 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003589 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003590 .tested = TEST_UNTESTED,
3591 .probe = probe_spi_rdid,
3592 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003593 .block_erasers =
3594 {
3595 {
3596 .eraseblocks = {
3597 {4 * 1024, 2},
3598 {8 * 1024, 1},
3599 {16 * 1024, 1},
3600 {32 * 1024, 1},
3601 },
3602 .block_erase = spi_block_erase_d8,
3603 }, {
3604 .eraseblocks = { {64 * 1024, 1} },
3605 .block_erase = spi_block_erase_c7,
3606 }
3607 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003608 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003609 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003610 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003611 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003612 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003613 },
3614
3615 {
3616 .vendor = "Eon",
3617 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003618 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003619 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003620 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003621 .total_size = 64,
3622 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003623 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003624 .tested = TEST_UNTESTED,
3625 .probe = probe_spi_rdid,
3626 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003627 .block_erasers =
3628 {
3629 {
3630 .eraseblocks = {
3631 {32 * 1024, 1},
3632 {16 * 1024, 1},
3633 {8 * 1024, 1},
3634 {4 * 1024, 2},
3635 },
3636 .block_erase = spi_block_erase_d8,
3637 }, {
3638 .eraseblocks = { {64 * 1024, 1} },
3639 .block_erase = spi_block_erase_c7,
3640 }
3641 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003642 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003643 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003644 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003645 .read = spi_chip_read, /* Fast read (0x0B) supported */
3646 .voltage = {2700, 3600},
3647 },
3648
3649 {
3650 .vendor = "Eon",
3651 .name = "EN25P05",
3652 .bustype = BUS_SPI,
3653 .manufacture_id = EON_ID_NOPREFIX,
3654 .model_id = EON_EN25B05,
3655 .total_size = 64,
3656 .page_size = 256,
3657 .feature_bits = FEATURE_WRSR_WREN,
3658 .tested = TEST_UNTESTED,
3659 .probe = probe_spi_rdid,
3660 .probe_timing = TIMING_ZERO,
3661 .block_erasers =
3662 {
3663 {
3664 .eraseblocks = {
3665 {32 * 1024, 2} },
3666 .block_erase = spi_block_erase_d8,
3667 }, {
3668 .eraseblocks = { {64 * 1024, 1} },
3669 .block_erase = spi_block_erase_c7,
3670 }
3671 },
3672 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3673 .unlock = spi_disable_blockprotect,
3674 .write = spi_chip_write_256,
3675 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003676 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003677 },
3678
3679 {
3680 .vendor = "Eon",
3681 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003682 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003683 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003684 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003685 .total_size = 128,
3686 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003687 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003688 .tested = TEST_UNTESTED,
3689 .probe = probe_spi_rdid,
3690 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003691 .block_erasers =
3692 {
3693 {
3694 .eraseblocks = {
3695 {4 * 1024, 2},
3696 {8 * 1024, 1},
3697 {16 * 1024, 1},
3698 {32 * 1024, 3},
3699 },
3700 .block_erase = spi_block_erase_d8,
3701 }, {
3702 .eraseblocks = { {128 * 1024, 1} },
3703 .block_erase = spi_block_erase_c7,
3704 }
3705 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003706 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003707 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003708 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003709 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003710 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003711 },
3712
3713 {
3714 .vendor = "Eon",
3715 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003716 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003717 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003718 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003719 .total_size = 128,
3720 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003721 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003722 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003723 .probe = probe_spi_rdid,
3724 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003725 .block_erasers =
3726 {
3727 {
3728 .eraseblocks = {
3729 {32 * 1024, 3},
3730 {16 * 1024, 1},
3731 {8 * 1024, 1},
3732 {4 * 1024, 2},
3733 },
3734 .block_erase = spi_block_erase_d8,
3735 }, {
3736 .eraseblocks = { {128 * 1024, 1} },
3737 .block_erase = spi_block_erase_c7,
3738 }
3739 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003740 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003741 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003742 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003743 .read = spi_chip_read, /* Fast read (0x0B) supported */
3744 .voltage = {2700, 3600},
3745 },
3746
3747 {
3748 .vendor = "Eon",
3749 .name = "EN25P10",
3750 .bustype = BUS_SPI,
3751 .manufacture_id = EON_ID_NOPREFIX,
3752 .model_id = EON_EN25B10,
3753 .total_size = 128,
3754 .page_size = 256,
3755 .feature_bits = FEATURE_WRSR_WREN,
3756 .tested = TEST_UNTESTED,
3757 .probe = probe_spi_rdid,
3758 .probe_timing = TIMING_ZERO,
3759 .block_erasers =
3760 {
3761 {
3762 .eraseblocks = { {32 * 1024, 4} },
3763 .block_erase = spi_block_erase_d8,
3764 }, {
3765 .eraseblocks = { {128 * 1024, 1} },
3766 .block_erase = spi_block_erase_c7,
3767 }
3768 },
3769 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3770 .unlock = spi_disable_blockprotect,
3771 .write = spi_chip_write_256,
3772 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003773 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003774 },
3775
3776 {
3777 .vendor = "Eon",
3778 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003779 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003780 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003781 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003782 .total_size = 256,
3783 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003784 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003785 .tested = TEST_UNTESTED,
3786 .probe = probe_spi_rdid,
3787 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003788 .block_erasers =
3789 {
3790 {
3791 .eraseblocks = {
3792 {4 * 1024, 2},
3793 {8 * 1024, 1},
3794 {16 * 1024, 1},
3795 {32 * 1024, 1},
3796 {64 * 1024, 3}
3797 },
3798 .block_erase = spi_block_erase_d8,
3799 }, {
3800 .eraseblocks = { {256 * 1024, 1} },
3801 .block_erase = spi_block_erase_c7,
3802 }
3803 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003804 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003805 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003806 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003807 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003808 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003809 },
3810
3811 {
3812 .vendor = "Eon",
3813 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003814 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003815 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003816 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003817 .total_size = 256,
3818 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003819 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003820 .tested = TEST_UNTESTED,
3821 .probe = probe_spi_rdid,
3822 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003823 .block_erasers =
3824 {
3825 {
3826 .eraseblocks = {
3827 {64 * 1024, 3},
3828 {32 * 1024, 1},
3829 {16 * 1024, 1},
3830 {8 * 1024, 1},
3831 {4 * 1024, 2},
3832 },
3833 .block_erase = spi_block_erase_d8,
3834 }, {
3835 .eraseblocks = { {256 * 1024, 1} },
3836 .block_erase = spi_block_erase_c7,
3837 }
3838 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003839 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003840 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003841 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003842 .read = spi_chip_read, /* Fast read (0x0B) supported */
3843 .voltage = {2700, 3600},
3844 },
3845
3846 {
3847 .vendor = "Eon",
3848 .name = "EN25P20",
3849 .bustype = BUS_SPI,
3850 .manufacture_id = EON_ID_NOPREFIX,
3851 .model_id = EON_EN25B20,
3852 .total_size = 256,
3853 .page_size = 256,
3854 .feature_bits = FEATURE_WRSR_WREN,
3855 .tested = TEST_UNTESTED,
3856 .probe = probe_spi_rdid,
3857 .probe_timing = TIMING_ZERO,
3858 .block_erasers =
3859 {
3860 {
3861 .eraseblocks = { {64 * 1024, 4} },
3862 .block_erase = spi_block_erase_d8,
3863 }, {
3864 .eraseblocks = { {256 * 1024, 1} },
3865 .block_erase = spi_block_erase_c7,
3866 }
3867 },
3868 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3869 .unlock = spi_disable_blockprotect,
3870 .write = spi_chip_write_256,
3871 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003872 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003873 },
3874
3875 {
3876 .vendor = "Eon",
3877 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003878 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003879 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003880 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003881 .total_size = 512,
3882 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003883 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003884 .tested = TEST_UNTESTED,
3885 .probe = probe_spi_rdid,
3886 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003887 .block_erasers =
3888 {
3889 {
3890 .eraseblocks = {
3891 {4 * 1024, 2},
3892 {8 * 1024, 1},
3893 {16 * 1024, 1},
3894 {32 * 1024, 1},
3895 {64 * 1024, 7}
3896 },
3897 .block_erase = spi_block_erase_d8,
3898 }, {
3899 .eraseblocks = { {512 * 1024, 1} },
3900 .block_erase = spi_block_erase_c7,
3901 }
3902 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003903 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003904 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003905 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003906 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003907 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003908 },
3909
3910 {
3911 .vendor = "Eon",
3912 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003913 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003914 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003915 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003916 .total_size = 512,
3917 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003918 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003919 .tested = TEST_UNTESTED,
3920 .probe = probe_spi_rdid,
3921 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003922 .block_erasers =
3923 {
3924 {
3925 .eraseblocks = {
3926 {64 * 1024, 7},
3927 {32 * 1024, 1},
3928 {16 * 1024, 1},
3929 {8 * 1024, 1},
3930 {4 * 1024, 2},
3931 },
3932 .block_erase = spi_block_erase_d8,
3933 }, {
3934 .eraseblocks = { {512 * 1024, 1} },
3935 .block_erase = spi_block_erase_c7,
3936 }
3937 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003938 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003939 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003940 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003941 .read = spi_chip_read, /* Fast read (0x0B) supported */
3942 .voltage = {2700, 3600},
3943 },
3944
3945 {
3946 .vendor = "Eon",
3947 .name = "EN25P40",
3948 .bustype = BUS_SPI,
3949 .manufacture_id = EON_ID_NOPREFIX,
3950 .model_id = EON_EN25B40,
3951 .total_size = 512,
3952 .page_size = 256,
3953 .feature_bits = FEATURE_WRSR_WREN,
3954 .tested = TEST_UNTESTED,
3955 .probe = probe_spi_rdid,
3956 .probe_timing = TIMING_ZERO,
3957 .block_erasers =
3958 {
3959 {
3960 .eraseblocks = { {64 * 1024, 8} },
3961 .block_erase = spi_block_erase_d8,
3962 }, {
3963 .eraseblocks = { {512 * 1024, 1} },
3964 .block_erase = spi_block_erase_c7,
3965 }
3966 },
3967 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3968 .unlock = spi_disable_blockprotect,
3969 .write = spi_chip_write_256,
3970 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003971 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003972 },
3973
3974 {
3975 .vendor = "Eon",
3976 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003977 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003978 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003979 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003980 .total_size = 1024,
3981 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003982 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003983 .tested = TEST_UNTESTED,
3984 .probe = probe_spi_rdid,
3985 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003986 .block_erasers =
3987 {
3988 {
3989 .eraseblocks = {
3990 {4 * 1024, 2},
3991 {8 * 1024, 1},
3992 {16 * 1024, 1},
3993 {32 * 1024, 1},
3994 {64 * 1024, 15}
3995 },
3996 .block_erase = spi_block_erase_d8,
3997 }, {
3998 .eraseblocks = { {1024 * 1024, 1} },
3999 .block_erase = spi_block_erase_c7,
4000 }
4001 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004002 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004003 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004004 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004005 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004006 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004007 },
4008
4009 {
4010 .vendor = "Eon",
4011 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004012 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004013 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004014 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00004015 .total_size = 1024,
4016 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004017 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004018 .tested = TEST_UNTESTED,
4019 .probe = probe_spi_rdid,
4020 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004021 .block_erasers =
4022 {
4023 {
4024 .eraseblocks = {
4025 {64 * 1024, 15},
4026 {32 * 1024, 1},
4027 {16 * 1024, 1},
4028 {8 * 1024, 1},
4029 {4 * 1024, 2},
4030 },
4031 .block_erase = spi_block_erase_d8,
4032 }, {
4033 .eraseblocks = { {1024 * 1024, 1} },
4034 .block_erase = spi_block_erase_c7,
4035 }
4036 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004037 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004038 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004039 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004040 .read = spi_chip_read, /* Fast read (0x0B) supported */
4041 .voltage = {2700, 3600},
4042 },
4043
4044 {
4045 .vendor = "Eon",
4046 .name = "EN25P80",
4047 .bustype = BUS_SPI,
4048 .manufacture_id = EON_ID_NOPREFIX,
4049 .model_id = EON_EN25B80,
4050 .total_size = 1024,
4051 .page_size = 256,
4052 .feature_bits = FEATURE_WRSR_WREN,
4053 .tested = TEST_UNTESTED,
4054 .probe = probe_spi_rdid,
4055 .probe_timing = TIMING_ZERO,
4056 .block_erasers =
4057 {
4058 {
4059 .eraseblocks = { {64 * 1024, 16} },
4060 .block_erase = spi_block_erase_d8,
4061 }, {
4062 .eraseblocks = { {1024 * 1024, 1} },
4063 .block_erase = spi_block_erase_c7,
4064 }
4065 },
4066 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4067 .unlock = spi_disable_blockprotect,
4068 .write = spi_chip_write_256,
4069 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004070 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004071 },
4072
4073 {
4074 .vendor = "Eon",
4075 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004076 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004077 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004078 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004079 .total_size = 2048,
4080 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004081 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004082 .tested = TEST_UNTESTED,
4083 .probe = probe_spi_rdid,
4084 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004085 .block_erasers =
4086 {
4087 {
4088 .eraseblocks = {
4089 {4 * 1024, 2},
4090 {8 * 1024, 1},
4091 {16 * 1024, 1},
4092 {32 * 1024, 1},
4093 {64 * 1024, 31},
4094 },
4095 .block_erase = spi_block_erase_d8,
4096 }, {
4097 .eraseblocks = { {2 * 1024 * 1024, 1} },
4098 .block_erase = spi_block_erase_c7,
4099 }
4100 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004101 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004102 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004103 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004104 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004105 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004106 },
4107
4108 {
4109 .vendor = "Eon",
4110 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004111 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004112 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004113 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004114 .total_size = 2048,
4115 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004116 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004117 .tested = TEST_UNTESTED,
4118 .probe = probe_spi_rdid,
4119 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004120 .block_erasers =
4121 {
4122 {
4123 .eraseblocks = {
4124 {64 * 1024, 31},
4125 {32 * 1024, 1},
4126 {16 * 1024, 1},
4127 {8 * 1024, 1},
4128 {4 * 1024, 2},
4129 },
4130 .block_erase = spi_block_erase_d8,
4131 }, {
4132 .eraseblocks = { {2 * 1024 * 1024, 1} },
4133 .block_erase = spi_block_erase_c7,
4134 }
4135 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004136 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004137 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004138 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004139 .read = spi_chip_read, /* Fast read (0x0B) supported */
4140 .voltage = {2700, 3600},
4141 },
4142
4143 {
4144 .vendor = "Eon",
4145 .name = "EN25P16",
4146 .bustype = BUS_SPI,
4147 .manufacture_id = EON_ID_NOPREFIX,
4148 .model_id = EON_EN25B16,
4149 .total_size = 2048,
4150 .page_size = 256,
4151 .feature_bits = FEATURE_WRSR_WREN,
4152 .tested = TEST_UNTESTED,
4153 .probe = probe_spi_rdid,
4154 .probe_timing = TIMING_ZERO,
4155 .block_erasers =
4156 {
4157 {
4158 .eraseblocks = { {64 * 1024, 32} },
4159 .block_erase = spi_block_erase_d8,
4160 }, {
4161 .eraseblocks = { {2 * 1024 * 1024, 1} },
4162 .block_erase = spi_block_erase_c7,
4163 }
4164 },
4165 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4166 .unlock = spi_disable_blockprotect,
4167 .write = spi_chip_write_256,
4168 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004169 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004170 },
4171
4172 {
4173 .vendor = "Eon",
4174 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004175 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004176 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004177 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004178 .total_size = 4096,
4179 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004180 /* OTP: 512B total; enter 0x3A */
4181 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004182 .tested = TEST_UNTESTED,
4183 .probe = probe_spi_rdid,
4184 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004185 .block_erasers =
4186 {
4187 {
4188 .eraseblocks = {
4189 {4 * 1024, 2},
4190 {8 * 1024, 1},
4191 {16 * 1024, 1},
4192 {32 * 1024, 1},
4193 {64 * 1024, 63},
4194 },
4195 .block_erase = spi_block_erase_d8,
4196 }, {
4197 .eraseblocks = { {4 * 1024 * 1024, 1} },
4198 .block_erase = spi_block_erase_c7,
4199 }
4200 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004201 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004202 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004203 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004204 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004205 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004206 },
4207
4208 {
4209 .vendor = "Eon",
4210 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004211 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004212 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004213 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004214 .total_size = 4096,
4215 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004216 /* OTP: 512B total; enter 0x3A */
4217 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004218 .tested = TEST_UNTESTED,
4219 .probe = probe_spi_rdid,
4220 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004221 .block_erasers =
4222 {
4223 {
4224 .eraseblocks = {
4225 {64 * 1024, 63},
4226 {32 * 1024, 1},
4227 {16 * 1024, 1},
4228 {8 * 1024, 1},
4229 {4 * 1024, 2},
4230 },
4231 .block_erase = spi_block_erase_d8,
4232 }, {
4233 .eraseblocks = { {4 * 1024 * 1024, 1} },
4234 .block_erase = spi_block_erase_c7,
4235 }
4236 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004237 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004238 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004239 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004240 .read = spi_chip_read, /* Fast read (0x0B) supported */
4241 .voltage = {2700, 3600},
4242 },
4243
4244 {
4245 .vendor = "Eon",
4246 .name = "EN25P32", /* Uniform version of EN25B32 */
4247 .bustype = BUS_SPI,
4248 .manufacture_id = EON_ID_NOPREFIX,
4249 .model_id = EON_EN25B32,
4250 .total_size = 4096,
4251 .page_size = 256,
4252 /* OTP: 512B total; enter 0x3A */
4253 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4254 .tested = TEST_UNTESTED,
4255 .probe = probe_spi_rdid,
4256 .probe_timing = TIMING_ZERO,
4257 .block_erasers =
4258 {
4259 {
4260 .eraseblocks = { {64 * 1024, 64} },
4261 .block_erase = spi_block_erase_d8,
4262 }, {
4263 .eraseblocks = { {4 * 1024 * 1024, 1} },
4264 .block_erase = spi_block_erase_c7,
4265 }
4266 },
4267 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4268 .unlock = spi_disable_blockprotect,
4269 .write = spi_chip_write_256,
4270 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004271 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004272 },
4273
4274 {
4275 .vendor = "Eon",
4276 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004277 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004278 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004279 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004280 .total_size = 8192,
4281 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004282 /* OTP: 512B total; enter 0x3A */
4283 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004284 .tested = TEST_UNTESTED,
4285 .probe = probe_spi_rdid,
4286 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004287 .block_erasers =
4288 {
4289 {
4290 .eraseblocks = {
4291 {4 * 1024, 2},
4292 {8 * 1024, 1},
4293 {16 * 1024, 1},
4294 {32 * 1024, 1},
4295 {64 * 1024, 127},
4296 },
4297 .block_erase = spi_block_erase_d8,
4298 }, {
4299 .eraseblocks = { {8 * 1024 * 1024, 1} },
4300 .block_erase = spi_block_erase_c7,
4301 }
4302 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004303 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004304 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004305 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004306 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004307 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004308 },
4309
4310 {
4311 .vendor = "Eon",
4312 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004313 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004314 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004315 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004316 .total_size = 8192,
4317 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004318 /* OTP: 512B total; enter 0x3A */
4319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004320 .tested = TEST_UNTESTED,
4321 .probe = probe_spi_rdid,
4322 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004323 .block_erasers =
4324 {
4325 {
4326 .eraseblocks = {
4327 {64 * 1024, 127},
4328 {32 * 1024, 1},
4329 {16 * 1024, 1},
4330 {8 * 1024, 1},
4331 {4 * 1024, 2},
4332 },
4333 .block_erase = spi_block_erase_d8,
4334 }, {
4335 .eraseblocks = { {8 * 1024 * 1024, 1} },
4336 .block_erase = spi_block_erase_c7,
4337 }
4338 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004339 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004340 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004341 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004342 .read = spi_chip_read, /* Fast read (0x0B) supported */
4343 .voltage = {2700, 3600},
4344 },
4345
4346 {
4347 .vendor = "Eon",
4348 .name = "EN25P64",
4349 .bustype = BUS_SPI,
4350 .manufacture_id = EON_ID_NOPREFIX,
4351 .model_id = EON_EN25B64,
4352 .total_size = 8192,
4353 .page_size = 256,
4354 /* OTP: 512B total; enter 0x3A */
4355 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4356 .tested = TEST_UNTESTED,
4357 .probe = probe_spi_rdid,
4358 .probe_timing = TIMING_ZERO,
4359 .block_erasers =
4360 {
4361 {
4362 .eraseblocks = { {64 * 1024, 128} },
4363 .block_erase = spi_block_erase_d8,
4364 }, {
4365 .eraseblocks = { {8 * 1024 * 1024, 1} },
4366 .block_erase = spi_block_erase_c7,
4367 }
4368 },
4369 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4370 .unlock = spi_disable_blockprotect,
4371 .write = spi_chip_write_256,
4372 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004373 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004374 },
4375
4376 {
4377 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004378 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004379 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004380 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004381 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004382 .total_size = 64,
4383 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004384 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004385 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004386 .probe = probe_spi_rdid,
4387 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004388 .block_erasers =
4389 {
4390 {
4391 .eraseblocks = { {4 * 1024, 16} },
4392 .block_erase = spi_block_erase_20,
4393 }, {
4394 .eraseblocks = { {32 * 1024, 2} },
4395 .block_erase = spi_block_erase_d8,
4396 }, {
4397 .eraseblocks = { {32 * 1024, 2} },
4398 .block_erase = spi_block_erase_52,
4399 }, {
4400 .eraseblocks = { {64 * 1024, 1} },
4401 .block_erase = spi_block_erase_60,
4402 }, {
4403 .eraseblocks = { {64 * 1024, 1} },
4404 .block_erase = spi_block_erase_c7,
4405 }
4406 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004407 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004408 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004409 .write = spi_chip_write_256,
4410 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004411 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004412 },
4413
4414 {
4415 .vendor = "Eon",
4416 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004417 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004418 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004419 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004420 .total_size = 128,
4421 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004422 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004423 .tested = TEST_UNTESTED,
4424 .probe = probe_spi_rdid,
4425 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004426 .block_erasers =
4427 {
4428 {
4429 .eraseblocks = { {4 * 1024, 32} },
4430 .block_erase = spi_block_erase_20,
4431 }, {
4432 .eraseblocks = { {32 * 1024, 4} },
4433 .block_erase = spi_block_erase_d8,
4434 }, {
4435 .eraseblocks = { {32 * 1024, 4} },
4436 .block_erase = spi_block_erase_52,
4437 }, {
4438 .eraseblocks = { {128 * 1024, 1} },
4439 .block_erase = spi_block_erase_60,
4440 }, {
4441 .eraseblocks = { {128 * 1024, 1} },
4442 .block_erase = spi_block_erase_c7,
4443 }
4444 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004445 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004446 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004447 .write = spi_chip_write_256,
4448 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004449 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004450 },
4451
4452 {
4453 .vendor = "Eon",
4454 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004455 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004456 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004457 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004458 .total_size = 256,
4459 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004460 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004461 .tested = TEST_UNTESTED,
4462 .probe = probe_spi_rdid,
4463 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004464 .block_erasers =
4465 {
4466 {
4467 .eraseblocks = { {4 * 1024, 64} },
4468 .block_erase = spi_block_erase_20,
4469 }, {
4470 .eraseblocks = { {64 * 1024, 4} },
4471 .block_erase = spi_block_erase_d8,
4472 }, {
4473 .eraseblocks = { {64 * 1024, 4} },
4474 .block_erase = spi_block_erase_52,
4475 }, {
4476 .eraseblocks = { {256 * 1024, 1} },
4477 .block_erase = spi_block_erase_60,
4478 }, {
4479 .eraseblocks = { {256 * 1024, 1} },
4480 .block_erase = spi_block_erase_c7,
4481 }
4482 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004483 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004484 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004485 .write = spi_chip_write_256,
4486 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004487 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004488 },
4489
4490 {
4491 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004492 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004493 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004494 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004495 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004496 .total_size = 512,
4497 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004498 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004499 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004500 .probe = probe_spi_rdid,
4501 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004502 .block_erasers =
4503 {
4504 {
Sean Nelson54596372010-01-09 05:30:14 +00004505 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004506 .block_erase = spi_block_erase_20,
4507 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004508 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004509 .block_erase = spi_block_erase_d8,
4510 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004511 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004512 .block_erase = spi_block_erase_60,
4513 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004514 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004515 .block_erase = spi_block_erase_c7,
4516 },
4517 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004518 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004519 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004520 .write = spi_chip_write_256,
4521 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004522 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004523 },
4524
4525 {
4526 .vendor = "Eon",
4527 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004528 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004529 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004530 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004531 .total_size = 1024,
4532 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004533 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004534 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004535 .probe = probe_spi_rdid,
4536 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004537 .block_erasers =
4538 {
4539 {
4540 .eraseblocks = { {4 * 1024, 256} },
4541 .block_erase = spi_block_erase_20,
4542 }, {
4543 .eraseblocks = { {64 * 1024, 16} },
4544 .block_erase = spi_block_erase_d8,
4545 }, {
4546 .eraseblocks = { {1024 * 1024, 1} },
4547 .block_erase = spi_block_erase_60,
4548 }, {
4549 .eraseblocks = { {1024 * 1024, 1} },
4550 .block_erase = spi_block_erase_c7,
4551 }
4552 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004553 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004554 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004555 .write = spi_chip_write_256,
4556 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004557 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004558 },
4559
4560 {
4561 .vendor = "Eon",
4562 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004563 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004564 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004565 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004566 .total_size = 2048,
4567 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004568 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004569 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004570 .probe = probe_spi_rdid,
4571 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004572 .block_erasers =
4573 {
4574 {
4575 .eraseblocks = { {4 * 1024, 512} },
4576 .block_erase = spi_block_erase_20,
4577 }, {
4578 .eraseblocks = { {64 * 1024, 32} },
4579 .block_erase = spi_block_erase_d8,
4580 }, {
4581 .eraseblocks = { {2 * 1024 * 1024, 1} },
4582 .block_erase = spi_block_erase_60,
4583 }, {
4584 .eraseblocks = { {2 * 1024 * 1024, 1} },
4585 .block_erase = spi_block_erase_c7,
4586 }
4587 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004588 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004589 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004590 .write = spi_chip_write_256,
4591 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004592 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004593 },
4594
4595 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004596 .vendor = "Eon",
4597 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004598 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004599 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004600 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004601 .total_size = 4096,
4602 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004603 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004604 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004605 .probe = probe_spi_rdid,
4606 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004607 .block_erasers =
4608 {
4609 {
4610 .eraseblocks = { {4 * 1024, 1024} },
4611 .block_erase = spi_block_erase_20,
4612 }, {
4613 .eraseblocks = { {64 * 1024, 64} },
4614 .block_erase = spi_block_erase_d8,
4615 }, {
4616 .eraseblocks = { {4 * 1024 * 1024, 1} },
4617 .block_erase = spi_block_erase_60,
4618 }, {
4619 .eraseblocks = { {4 * 1024 * 1024, 1} },
4620 .block_erase = spi_block_erase_c7,
4621 }
4622 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004623 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004624 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004625 .write = spi_chip_write_256,
4626 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004627 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004628 },
4629
4630 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004631 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004632 .name = "EN25F64",
4633 .bustype = BUS_SPI,
4634 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004635 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004636 .total_size = 8192,
4637 .page_size = 256,
4638 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004639 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004640 .probe = probe_spi_rdid,
4641 .probe_timing = TIMING_ZERO,
4642 .block_erasers =
4643 {
4644 {
4645 .eraseblocks = { {4 * 1024, 2048} },
4646 .block_erase = spi_block_erase_20,
4647 }, {
4648 .eraseblocks = { {64 * 1024, 128} },
4649 .block_erase = spi_block_erase_d8,
4650 }, {
4651 .eraseblocks = { {8 * 1024 * 1024, 1} },
4652 .block_erase = spi_block_erase_60,
4653 }, {
4654 .eraseblocks = { {8 * 1024 * 1024, 1} },
4655 .block_erase = spi_block_erase_c7,
4656 }
4657 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004658 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004659 .unlock = spi_disable_blockprotect,
4660 .write = spi_chip_write_256,
4661 .read = spi_chip_read,
4662 .voltage = {2700, 3600},
4663 },
4664
4665 {
4666 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004667 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004668 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004669 .manufacture_id = EON_ID_NOPREFIX,
4670 .model_id = EON_EN25Q40,
4671 .total_size = 512,
4672 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004673 /* OTP: 256B total; enter 0x3A */
4674 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004675 .tested = TEST_UNTESTED,
4676 .probe = probe_spi_rdid,
4677 .probe_timing = TIMING_ZERO,
4678 .block_erasers =
4679 {
4680 {
4681 .eraseblocks = { {4 * 1024, 128} },
4682 .block_erase = spi_block_erase_20,
4683 }, {
4684 .eraseblocks = { {64 * 1024, 8} },
4685 .block_erase = spi_block_erase_d8,
4686 }, {
4687 .eraseblocks = { {512 * 1024, 1} },
4688 .block_erase = spi_block_erase_60,
4689 }, {
4690 .eraseblocks = { {512 * 1024, 1} },
4691 .block_erase = spi_block_erase_c7,
4692 }
4693 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004694 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004695 .unlock = spi_disable_blockprotect,
4696 .write = spi_chip_write_256,
4697 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004698 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004699 },
4700
4701 {
4702 .vendor = "Eon",
4703 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004704 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004705 .manufacture_id = EON_ID_NOPREFIX,
4706 .model_id = EON_EN25Q80,
4707 .total_size = 1024,
4708 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004709 /* OTP: 256B total; enter 0x3A */
4710 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004711 .tested = TEST_UNTESTED,
4712 .probe = probe_spi_rdid,
4713 .probe_timing = TIMING_ZERO,
4714 .block_erasers =
4715 {
4716 {
4717 .eraseblocks = { {4 * 1024, 256} },
4718 .block_erase = spi_block_erase_20,
4719 }, {
4720 .eraseblocks = { {64 * 1024, 16} },
4721 .block_erase = spi_block_erase_d8,
4722 }, {
4723 .eraseblocks = { {1024 * 1024, 1} },
4724 .block_erase = spi_block_erase_60,
4725 }, {
4726 .eraseblocks = { {1024 * 1024, 1} },
4727 .block_erase = spi_block_erase_c7,
4728 }
4729 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004730 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004731 .unlock = spi_disable_blockprotect,
4732 .write = spi_chip_write_256,
4733 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004734 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004735 },
4736
4737 {
4738 /* Note: EN25D16 is an evil twin which shares the model ID
4739 but has different write protection capabilities */
4740 .vendor = "Eon",
4741 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004742 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004743 .manufacture_id = EON_ID_NOPREFIX,
4744 .model_id = EON_EN25Q16,
4745 .total_size = 2048,
4746 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004747 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004749 .tested = TEST_UNTESTED,
4750 .probe = probe_spi_rdid,
4751 .probe_timing = TIMING_ZERO,
4752 .block_erasers =
4753 {
4754 {
4755 .eraseblocks = { {4 * 1024, 512} },
4756 .block_erase = spi_block_erase_20,
4757 }, {
4758 .eraseblocks = { {64 * 1024, 32} },
4759 .block_erase = spi_block_erase_d8,
4760 }, {
4761 /* not supported by Q16 version */
4762 .eraseblocks = { {64 * 1024, 32} },
4763 .block_erase = spi_block_erase_52,
4764 }, {
4765 .eraseblocks = { {2 * 1024 * 1024, 1} },
4766 .block_erase = spi_block_erase_60,
4767 }, {
4768 .eraseblocks = { {2 * 1024 * 1024, 1} },
4769 .block_erase = spi_block_erase_c7,
4770 }
4771 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004772 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004773 .unlock = spi_disable_blockprotect,
4774 .write = spi_chip_write_256,
4775 .read = spi_chip_read,
4776 .voltage = {2700, 3600},
4777 },
4778
4779 {
4780 .vendor = "Eon",
4781 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004782 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004783 .manufacture_id = EON_ID_NOPREFIX,
4784 .model_id = EON_EN25Q32,
4785 .total_size = 4096,
4786 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004787 /* OTP: 512B total; enter 0x3A */
4788 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004789 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004790 .probe = probe_spi_rdid,
4791 .probe_timing = TIMING_ZERO,
4792 .block_erasers =
4793 {
4794 {
4795 .eraseblocks = { {4 * 1024, 1024} },
4796 .block_erase = spi_block_erase_20,
4797 }, {
4798 .eraseblocks = { {64 * 1024, 64} },
4799 .block_erase = spi_block_erase_d8,
4800 }, {
4801 .eraseblocks = { {4 * 1024 * 1024, 1} },
4802 .block_erase = spi_block_erase_60,
4803 }, {
4804 .eraseblocks = { {4 * 1024 * 1024, 1} },
4805 .block_erase = spi_block_erase_c7,
4806 }
4807 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004808 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004809 .unlock = spi_disable_blockprotect,
4810 .write = spi_chip_write_256,
4811 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004812 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004813 },
4814
4815 {
4816 .vendor = "Eon",
4817 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004818 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004819 .manufacture_id = EON_ID_NOPREFIX,
4820 .model_id = EON_EN25Q64,
4821 .total_size = 8192,
4822 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004823 /* OTP: 512B total; enter 0x3A */
4824 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004825 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004826 .probe = probe_spi_rdid,
4827 .probe_timing = TIMING_ZERO,
4828 .block_erasers =
4829 {
4830 {
4831 .eraseblocks = { {4 * 1024, 2048} },
4832 .block_erase = spi_block_erase_20,
4833 }, {
4834 .eraseblocks = { {64 * 1024, 128} },
4835 .block_erase = spi_block_erase_d8,
4836 }, {
4837 .eraseblocks = { {8 * 1024 * 1024, 1} },
4838 .block_erase = spi_block_erase_60,
4839 }, {
4840 .eraseblocks = { {8 * 1024 * 1024, 1} },
4841 .block_erase = spi_block_erase_c7,
4842 }
4843 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004844 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004845 .unlock = spi_disable_blockprotect,
4846 .write = spi_chip_write_256,
4847 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004848 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004849 },
4850
4851 {
4852 .vendor = "Eon",
4853 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004854 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004855 .manufacture_id = EON_ID_NOPREFIX,
4856 .model_id = EON_EN25Q128,
4857 .total_size = 16384,
4858 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004859 /* OTP: 512B total; enter 0x3A */
4860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0be072c2016-03-13 15:16:30 +00004861 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004862 .probe = probe_spi_rdid,
4863 .probe_timing = TIMING_ZERO,
4864 .block_erasers =
4865 {
4866 {
4867 .eraseblocks = { {4 * 1024, 4096} },
4868 .block_erase = spi_block_erase_20,
4869 }, {
4870 .eraseblocks = { {64 * 1024, 256} },
4871 .block_erase = spi_block_erase_d8,
4872 }, {
4873 .eraseblocks = { {16 * 1024 * 1024, 1} },
4874 .block_erase = spi_block_erase_60,
4875 }, {
4876 .eraseblocks = { {16 * 1024 * 1024, 1} },
4877 .block_erase = spi_block_erase_c7,
4878 }
4879 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004880 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004881 .unlock = spi_disable_blockprotect,
4882 .write = spi_chip_write_256,
4883 .read = spi_chip_read,
4884 },
4885
4886 {
4887 .vendor = "Eon",
4888 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004889 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004890 .manufacture_id = EON_ID_NOPREFIX,
4891 .model_id = EON_EN25QH16,
4892 .total_size = 2048,
4893 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004894 /* supports SFDP */
4895 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004896 /* QPI enable 0x38, disable 0xFF */
4897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004898 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004899 .probe = probe_spi_rdid,
4900 .probe_timing = TIMING_ZERO,
4901 .block_erasers =
4902 {
4903 {
4904 .eraseblocks = { {4 * 1024, 512} },
4905 .block_erase = spi_block_erase_20,
4906 }, {
4907 .eraseblocks = { {64 * 1024, 32} },
4908 .block_erase = spi_block_erase_d8,
4909 }, {
4910 .eraseblocks = { {1024 * 2048, 1} },
4911 .block_erase = spi_block_erase_60,
4912 }, {
4913 .eraseblocks = { {1024 * 2048, 1} },
4914 .block_erase = spi_block_erase_c7,
4915 }
4916 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004917 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004918 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004919 .write = spi_chip_write_256,
4920 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004921 .voltage = {2700, 3600},
4922 },
4923
4924 {
4925 .vendor = "Eon",
4926 .name = "EN25QH32",
4927 .bustype = BUS_SPI,
4928 .manufacture_id = EON_ID_NOPREFIX,
4929 .model_id = EON_EN25QH32,
4930 .total_size = 4096,
4931 .page_size = 256,
4932 /* supports SFDP */
4933 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004934 /* QPI enable 0x38, disable 0xFF */
4935 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004936 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004937 .probe = probe_spi_rdid,
4938 .probe_timing = TIMING_ZERO,
4939 .block_erasers =
4940 {
4941 {
4942 .eraseblocks = { {4 * 1024, 1024} },
4943 .block_erase = spi_block_erase_20,
4944 }, {
4945 .eraseblocks = { {64 * 1024, 64} },
4946 .block_erase = spi_block_erase_d8,
4947 }, {
4948 .eraseblocks = { {1024 * 4096, 1} },
4949 .block_erase = spi_block_erase_60,
4950 }, {
4951 .eraseblocks = { {1024 * 4096, 1} },
4952 .block_erase = spi_block_erase_c7,
4953 }
4954 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004955 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004956 .unlock = spi_disable_blockprotect_bp3_srwd,
4957 .write = spi_chip_write_256,
4958 .read = spi_chip_read,
4959 .voltage = {2700, 3600},
4960 },
4961
4962 {
4963 .vendor = "Eon",
4964 .name = "EN25QH64",
4965 .bustype = BUS_SPI,
4966 .manufacture_id = EON_ID_NOPREFIX,
4967 .model_id = EON_EN25QH64,
4968 .total_size = 8192,
4969 .page_size = 256,
4970 /* supports SFDP */
4971 /* OTP: 512B total; enter 0x3A */
4972 /* QPI enable 0x38, disable 0xFF */
4973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004974 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004975 .probe = probe_spi_rdid,
4976 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10004977 .block_erasers =
4978 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004979 {
4980 .eraseblocks = { {4 * 1024, 2048} },
4981 .block_erase = spi_block_erase_20,
4982 }, {
4983 .eraseblocks = { {64 * 1024, 128} },
4984 .block_erase = spi_block_erase_d8,
4985 }, {
4986 .eraseblocks = { { 8192 * 1024, 1} },
4987 .block_erase = spi_block_erase_60,
4988 }, {
4989 .eraseblocks = { { 8192 * 1024, 1} },
4990 .block_erase = spi_block_erase_c7,
4991 }
4992 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004993 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004994 .unlock = spi_disable_blockprotect_bp3_srwd,
4995 .write = spi_chip_write_256,
4996 .read = spi_chip_read,
4997 .voltage = {2700, 3600},
4998 },
4999
5000 {
5001 .vendor = "Eon",
5002 .name = "EN25QH128",
5003 .bustype = BUS_SPI,
5004 .manufacture_id = EON_ID_NOPREFIX,
5005 .model_id = EON_EN25QH128,
5006 .total_size = 16384,
5007 .page_size = 256,
5008 /* supports SFDP */
5009 /* OTP: 512B total; enter 0x3A */
5010 /* QPI enable 0x38, disable 0xFF */
5011 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5012 .tested = TEST_UNTESTED,
5013 .probe = probe_spi_rdid,
5014 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005015 .block_erasers =
5016 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005017 {
5018 .eraseblocks = { {4 * 1024, 4096} },
5019 .block_erase = spi_block_erase_20,
5020 }, {
5021 .eraseblocks = { {64 * 1024, 256} },
5022 .block_erase = spi_block_erase_d8,
5023 }, {
5024 .eraseblocks = { { 16384 * 1024, 1} },
5025 .block_erase = spi_block_erase_60,
5026 }, {
5027 .eraseblocks = { { 16384 * 1024, 1} },
5028 .block_erase = spi_block_erase_c7,
5029 }
5030 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005031 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005032 .unlock = spi_disable_blockprotect_bp3_srwd,
5033 .write = spi_chip_write_256,
5034 .read = spi_chip_read,
5035 .voltage = {2700, 3600},
5036 },
5037
5038 {
5039 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005040 .name = "EN25S10",
5041 .bustype = BUS_SPI,
5042 .manufacture_id = EON_ID_NOPREFIX,
5043 .model_id = EON_EN25S10,
5044 .total_size = 128,
5045 .page_size = 256,
5046 /* OTP: 256B total; enter 0x3A */
5047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5048 .tested = TEST_UNTESTED,
5049 .probe = probe_spi_rdid,
5050 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005051 .block_erasers =
5052 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005053 {
5054 .eraseblocks = { {4 * 1024, 32} },
5055 .block_erase = spi_block_erase_20,
5056 }, {
5057 .eraseblocks = { {32 * 1024, 4} },
5058 .block_erase = spi_block_erase_52,
5059 }, {
5060 .eraseblocks = { {128 * 1024, 1} },
5061 .block_erase = spi_block_erase_60,
5062 }, {
5063 .eraseblocks = { {128 * 1024, 1} },
5064 .block_erase = spi_block_erase_c7,
5065 }
5066 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005067 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005068 .unlock = spi_disable_blockprotect,
5069 .write = spi_chip_write_256,
5070 .read = spi_chip_read,
5071 .voltage = {1650, 1950},
5072 },
5073
5074 {
5075 .vendor = "Eon",
5076 .name = "EN25S20",
5077 .bustype = BUS_SPI,
5078 .manufacture_id = EON_ID_NOPREFIX,
5079 .model_id = EON_EN25S20,
5080 .total_size = 256,
5081 .page_size = 256,
5082 /* OTP: 256B total; enter 0x3A */
5083 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5084 .tested = TEST_UNTESTED,
5085 .probe = probe_spi_rdid,
5086 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005087 .block_erasers =
5088 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005089 {
5090 .eraseblocks = { {4 * 1024, 64} },
5091 .block_erase = spi_block_erase_20,
5092 }, {
5093 .eraseblocks = { {64 * 1024, 4} },
5094 .block_erase = spi_block_erase_d8,
5095 }, {
5096 .eraseblocks = { {256 * 1024, 1} },
5097 .block_erase = spi_block_erase_60,
5098 }, {
5099 .eraseblocks = { {256 * 1024, 1} },
5100 .block_erase = spi_block_erase_c7,
5101 }
5102 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005103 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005104 .unlock = spi_disable_blockprotect,
5105 .write = spi_chip_write_256,
5106 .read = spi_chip_read,
5107 .voltage = {1650, 1950},
5108 },
5109
5110 {
5111 .vendor = "Eon",
5112 .name = "EN25S40",
5113 .bustype = BUS_SPI,
5114 .manufacture_id = EON_ID_NOPREFIX,
5115 .model_id = EON_EN25S40,
5116 .total_size = 512,
5117 .page_size = 256,
5118 /* OTP: 256B total; enter 0x3A */
5119 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Ponsc748be52018-09-30 17:23:03 +02005120 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005121 .probe = probe_spi_rdid,
5122 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005123 .block_erasers =
5124 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005125 {
5126 .eraseblocks = { {4 * 1024, 128} },
5127 .block_erase = spi_block_erase_20,
5128 }, {
5129 .eraseblocks = { {64 * 1024, 8} },
5130 .block_erase = spi_block_erase_d8,
5131 }, {
5132 .eraseblocks = { {512 * 1024, 1} },
5133 .block_erase = spi_block_erase_60,
5134 }, {
5135 .eraseblocks = { {512 * 1024, 1} },
5136 .block_erase = spi_block_erase_c7,
5137 }
5138 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005139 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005140 .unlock = spi_disable_blockprotect,
5141 .write = spi_chip_write_256,
5142 .read = spi_chip_read,
5143 .voltage = {1650, 1950},
5144 },
5145
5146 {
5147 .vendor = "Eon",
5148 .name = "EN25S80",
5149 .bustype = BUS_SPI,
5150 .manufacture_id = EON_ID_NOPREFIX,
5151 .model_id = EON_EN25S80,
5152 .total_size = 1024,
5153 .page_size = 256,
5154 /* OTP: 256B total; enter 0x3A */
5155 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5156 .tested = TEST_UNTESTED,
5157 .probe = probe_spi_rdid,
5158 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005159 .block_erasers =
5160 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005161 {
5162 .eraseblocks = { {4 * 1024, 256} },
5163 .block_erase = spi_block_erase_20,
5164 }, {
5165 .eraseblocks = { {64 * 1024, 16} },
5166 .block_erase = spi_block_erase_d8,
5167 }, {
5168 .eraseblocks = { {1024 * 1024, 1} },
5169 .block_erase = spi_block_erase_60,
5170 }, {
5171 .eraseblocks = { {1024 * 1024, 1} },
5172 .block_erase = spi_block_erase_c7,
5173 }
5174 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005175 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005176 .unlock = spi_disable_blockprotect,
5177 .write = spi_chip_write_256,
5178 .read = spi_chip_read,
5179 .voltage = {1650, 1950},
5180 },
5181
5182 {
5183 .vendor = "Eon",
5184 .name = "EN25S16",
5185 .bustype = BUS_SPI,
5186 .manufacture_id = EON_ID_NOPREFIX,
5187 .model_id = EON_EN25S16,
5188 .total_size = 2048,
5189 .page_size = 256,
5190 /* OTP: 512B total; enter 0x3A */
5191 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5192 .tested = TEST_UNTESTED,
5193 .probe = probe_spi_rdid,
5194 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005195 .block_erasers =
5196 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005197 {
5198 .eraseblocks = { {4 * 1024, 512} },
5199 .block_erase = spi_block_erase_20,
5200 }, {
5201 .eraseblocks = { {64 * 1024, 32} },
5202 .block_erase = spi_block_erase_52,
5203 }, {
5204 .eraseblocks = { {32 * 1024, 64} },
5205 .block_erase = spi_block_erase_d8,
5206 }, {
5207 .eraseblocks = { {2048 * 1024, 1} },
5208 .block_erase = spi_block_erase_60,
5209 }, {
5210 .eraseblocks = { {2048 * 1024, 1} },
5211 .block_erase = spi_block_erase_c7,
5212 }
5213 },
5214 .printlock = spi_prettyprint_status_register_en25s_wp,
5215 .unlock = spi_disable_blockprotect_bp3_srwd,
5216 .write = spi_chip_write_256,
5217 .read = spi_chip_read,
5218 .voltage = {1650, 1950},
5219 },
5220
5221 {
5222 .vendor = "Eon",
5223 .name = "EN25S32",
5224 .bustype = BUS_SPI,
5225 .manufacture_id = EON_ID_NOPREFIX,
5226 .model_id = EON_EN25S32,
5227 .total_size = 4096,
5228 .page_size = 256,
5229 /* OTP: 512B total; enter 0x3A */
5230 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5231 .tested = TEST_UNTESTED,
5232 .probe = probe_spi_rdid,
5233 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005234 .block_erasers =
5235 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005236 {
5237 .eraseblocks = { {4 * 1024, 1024} },
5238 .block_erase = spi_block_erase_20,
5239 }, {
5240 .eraseblocks = { {32 * 1024, 128} },
5241 .block_erase = spi_block_erase_52,
5242 }, {
5243 .eraseblocks = { {64 * 1024, 64} },
5244 .block_erase = spi_block_erase_d8,
5245 }, {
5246 .eraseblocks = { {4096 * 1024, 1} },
5247 .block_erase = spi_block_erase_60,
5248 }, {
5249 .eraseblocks = { {4096 * 1024, 1} },
5250 .block_erase = spi_block_erase_c7,
5251 }
5252 },
5253 .printlock = spi_prettyprint_status_register_en25s_wp,
5254 .unlock = spi_disable_blockprotect_bp3_srwd,
5255 .write = spi_chip_write_256,
5256 .read = spi_chip_read,
5257 .voltage = {1650, 1950},
5258 },
5259
5260 {
5261 .vendor = "Eon",
5262 .name = "EN25S64",
5263 .bustype = BUS_SPI,
5264 .manufacture_id = EON_ID_NOPREFIX,
5265 .model_id = EON_EN25S64,
5266 .total_size = 8192,
5267 .page_size = 256,
5268 /* OTP: 512B total; enter 0x3A */
5269 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5270 .tested = TEST_UNTESTED,
5271 .probe = probe_spi_rdid,
5272 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005273 .block_erasers =
5274 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005275 {
5276 .eraseblocks = { {4 * 1024, 2048} },
5277 .block_erase = spi_block_erase_20,
5278 }, {
5279 .eraseblocks = { {64 * 1024, 128} },
5280 .block_erase = spi_block_erase_d8,
5281 }, {
5282 .eraseblocks = { {8192 * 1024, 1} },
5283 .block_erase = spi_block_erase_60,
5284 }, {
5285 .eraseblocks = { {8192 * 1024, 1} },
5286 .block_erase = spi_block_erase_c7,
5287 }
5288 },
5289 .printlock = spi_prettyprint_status_register_en25s_wp,
5290 .unlock = spi_disable_blockprotect_bp3_srwd,
5291 .write = spi_chip_write_256,
5292 .read = spi_chip_read,
5293 .voltage = {1650, 1950},
5294 },
5295
5296 {
5297 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00005298 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005299 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00005300 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005301 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00005302 .total_size = 128,
5303 .page_size = 128,
5304 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005305 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00005306 .probe = probe_jedec,
5307 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5308 .block_erasers =
5309 {
5310 {
5311 .eraseblocks = { {16 * 1024, 8} },
5312 .block_erase = erase_sector_jedec,
5313 },
5314 {
5315 .eraseblocks = { {128 * 1024, 1} },
5316 .block_erase = erase_chip_block_jedec,
5317 },
5318 },
5319 .write = write_jedec_1,
5320 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005321 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00005322 },
5323
5324 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005325 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005326 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005327 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005328 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005329 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005330 .total_size = 256,
5331 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005332 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005333 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005334 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005335 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005336 .block_erasers =
5337 {
5338 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005339 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005340 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005341 {8 * 1024, 2},
5342 {32 * 1024, 1},
5343 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005344 },
5345 .block_erase = erase_sector_jedec,
5346 }, {
5347 .eraseblocks = { {256 * 1024, 1} },
5348 .block_erase = erase_chip_block_jedec,
5349 },
5350 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005351 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005352 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005353 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005354 },
5355
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005356 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005357 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005358 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005359 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005360 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005361 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005362 .total_size = 256,
5363 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005364 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005365 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005366 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005367 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005368 .block_erasers =
5369 {
5370 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005371 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005372 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005373 {32 * 1024, 1},
5374 {8 * 1024, 2},
5375 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005376 },
5377 .block_erase = erase_sector_jedec,
5378 }, {
5379 .eraseblocks = { {256 * 1024, 1} },
5380 .block_erase = erase_chip_block_jedec,
5381 },
5382 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005383 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005384 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005385 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005386 },
5387
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005388 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005389 .vendor = "Eon",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005390 .name = "EN29LV040(A)",
5391 .bustype = BUS_PARALLEL,
5392 .manufacture_id = EON_ID,
5393 .model_id = EON_EN29LV040,
5394 .total_size = 512,
5395 .page_size = 4 * 1024,
5396 .tested = TEST_OK_PREW,
5397 .probe = probe_jedec,
5398 .probe_timing = TIMING_ZERO,
5399 .block_erasers =
5400 {
5401 {
5402 .eraseblocks = { {64 * 1024, 8} },
5403 .block_erase = erase_sector_jedec,
5404 },
5405 {
5406 .eraseblocks = { {512 * 1024, 1} },
5407 .block_erase = erase_chip_block_jedec,
5408 },
5409 },
5410 .write = write_jedec_1,
5411 .read = read_memmapped,
5412 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5413 },
5414
5415 {
5416 .vendor = "Eon",
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005417 .name = "EN29LV640B",
5418 .bustype = BUS_PARALLEL,
5419 .manufacture_id = EON_ID,
5420 .model_id = EON_EN29LV640B,
5421 .total_size = 8192,
5422 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005423 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005424 .tested = TEST_OK_PREW,
5425 .probe = probe_en29lv640b,
5426 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5427 .block_erasers =
5428 {
5429 {
5430 .eraseblocks = {
5431 {8 * 1024, 8},
5432 {64 * 1024, 127},
5433 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005434 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005435 }, {
5436 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005437 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005438 },
5439 },
5440 .write = write_en29lv640b,
5441 .read = read_memmapped,
5442 .voltage = {2700, 3600},
5443 },
5444
5445 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005446 .vendor = "Eon",
5447 .name = "EN29GL064(A)B",
5448 .bustype = BUS_PARALLEL,
5449 .manufacture_id = EON_ID,
5450 .model_id = EON_EN29GL064B,
5451 .total_size = 8192,
5452 .page_size = 128 * 1024, /* actual page size is 16 */
5453 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5454 .tested = TEST_UNTESTED,
5455 .probe = probe_jedec_29gl,
5456 .probe_timing = TIMING_ZERO,
5457 .block_erasers =
5458 {
5459 {
5460 .eraseblocks = {
5461 {8 * 1024, 8},
5462 {64 * 1024, 127},
5463 },
5464 .block_erase = erase_sector_jedec,
5465 }, {
5466 .eraseblocks = { {8 * 1024 * 1024, 1} },
5467 .block_erase = erase_chip_block_jedec,
5468 },
5469 },
5470 .write = write_jedec_1,
5471 .read = read_memmapped,
5472 .voltage = {2700, 3600},
5473 },
5474
5475 {
5476 .vendor = "Eon",
5477 .name = "EN29GL064(A)T",
5478 .bustype = BUS_PARALLEL,
5479 .manufacture_id = EON_ID,
5480 .model_id = EON_EN29GL064T,
5481 .total_size = 8192,
5482 .page_size = 128 * 1024, /* actual page size is 16 */
5483 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5484 .tested = TEST_UNTESTED,
5485 .probe = probe_jedec_29gl,
5486 .probe_timing = TIMING_ZERO,
5487 .block_erasers =
5488 {
5489 {
5490 .eraseblocks = {
5491 {64 * 1024, 127},
5492 {8 * 1024, 8},
5493 },
5494 .block_erase = erase_sector_jedec,
5495 }, {
5496 .eraseblocks = { {8 * 1024 * 1024, 1} },
5497 .block_erase = erase_chip_block_jedec,
5498 },
5499 },
5500 .write = write_jedec_1,
5501 .read = read_memmapped,
5502 .voltage = {2700, 3600},
5503 },
5504
5505 {
5506 .vendor = "Eon",
5507 .name = "EN29GL064H/L",
5508 .bustype = BUS_PARALLEL,
5509 .manufacture_id = EON_ID,
5510 .model_id = EON_EN29GL064HL,
5511 .total_size = 8192,
5512 .page_size = 128 * 1024, /* actual page size is 16 */
5513 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5514 .tested = TEST_UNTESTED,
5515 .probe = probe_jedec_29gl,
5516 .probe_timing = TIMING_ZERO,
5517 .block_erasers =
5518 {
5519 {
5520 .eraseblocks = { {64 * 1024, 128} },
5521 .block_erase = erase_sector_jedec,
5522 }, {
5523 .eraseblocks = { {8 * 1024 * 1024, 1} },
5524 .block_erase = erase_chip_block_jedec,
5525 },
5526 },
5527 .write = write_jedec_1,
5528 .read = read_memmapped,
5529 .voltage = {2700, 3600},
5530 },
5531
5532 {
5533 .vendor = "Eon",
5534 .name = "EN29GL128",
5535 .bustype = BUS_PARALLEL,
5536 .manufacture_id = EON_ID,
5537 .model_id = EON_EN29GL128HL,
5538 .total_size = 16384,
5539 .page_size = 128 * 1024, /* actual page size is 16 */
5540 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5541 .tested = TEST_UNTESTED,
5542 .probe = probe_jedec_29gl,
5543 .probe_timing = TIMING_ZERO,
5544 .block_erasers =
5545 {
5546 {
5547 .eraseblocks = { {128 * 1024, 128} },
5548 .block_erase = erase_sector_jedec,
5549 }, {
5550 .eraseblocks = { {16 * 1024 * 1024, 1} },
5551 .block_erase = erase_chip_block_jedec,
5552 },
5553 },
5554 .write = write_jedec_1,
5555 .read = read_memmapped,
5556 .voltage = {2700, 3600},
5557 },
5558
5559 {
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005560 .vendor = "ESI",
5561 .name = "ES25P40",
5562 .bustype = BUS_SPI,
5563 .manufacture_id = EXCEL_ID_NOPREFIX,
5564 .model_id = EXCEL_ES25P40,
5565 .total_size = 512,
5566 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005567 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005568 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5569 .feature_bits = FEATURE_WRSR_WREN,
5570 .tested = TEST_UNTESTED,
5571 .probe = probe_spi_rdid,
5572 .probe_timing = TIMING_ZERO,
5573 .block_erasers =
5574 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005575 {
5576 .eraseblocks = { {64 * 1024, 8} },
5577 .block_erase = spi_block_erase_d8,
5578 }, {
5579 .eraseblocks = { {512 * 1024, 1} },
5580 .block_erase = spi_block_erase_c7,
5581 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005582 },
5583 .printlock = spi_prettyprint_status_register_bp2_srwd,
5584 .unlock = spi_disable_blockprotect_bp2_srwd,
5585 .write = spi_chip_write_256,
5586 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5587 .voltage = {2700, 3600},
5588 },
5589
5590 {
5591 .vendor = "ESI",
5592 .name = "ES25P80",
5593 .bustype = BUS_SPI,
5594 .manufacture_id = EXCEL_ID_NOPREFIX,
5595 .model_id = EXCEL_ES25P80,
5596 .total_size = 1024,
5597 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005598 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005599 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5600 .feature_bits = FEATURE_WRSR_WREN,
5601 .tested = TEST_UNTESTED,
5602 .probe = probe_spi_rdid,
5603 .probe_timing = TIMING_ZERO,
5604 .block_erasers =
5605 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005606 {
5607 .eraseblocks = { {64 * 1024, 16} },
5608 .block_erase = spi_block_erase_d8,
5609 }, {
5610 .eraseblocks = { {1024 * 1024, 1} },
5611 .block_erase = spi_block_erase_c7,
5612 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005613 },
5614 .printlock = spi_prettyprint_status_register_bp2_srwd,
5615 .unlock = spi_disable_blockprotect_bp2_srwd,
5616 .write = spi_chip_write_256,
5617 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5618 .voltage = {2700, 3600},
5619 },
5620
5621 {
5622 .vendor = "ESI",
5623 .name = "ES25P16",
5624 .bustype = BUS_SPI,
5625 .manufacture_id = EXCEL_ID_NOPREFIX,
5626 .model_id = EXCEL_ES25P16,
5627 .total_size = 2 * 1024,
5628 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005629 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005630 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5631 .feature_bits = FEATURE_WRSR_WREN,
5632 .tested = TEST_UNTESTED,
5633 .probe = probe_spi_rdid,
5634 .probe_timing = TIMING_ZERO,
5635 .block_erasers =
5636 {
5637 {
5638 .eraseblocks = { {64 * 1024, 32} },
5639 .block_erase = spi_block_erase_d8,
5640 }, {
5641 .eraseblocks = { {2 * 1024 * 1024, 1} },
5642 .block_erase = spi_block_erase_c7,
5643 }
5644 },
5645 .printlock = spi_prettyprint_status_register_bp2_srwd,
5646 .unlock = spi_disable_blockprotect_bp2_srwd,
5647 .write = spi_chip_write_256,
5648 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5649 .voltage = {2700, 3600},
5650 },
5651
5652 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005653 .vendor = "Fujitsu",
5654 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005655 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005656 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005657 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005658 .total_size = 512,
5659 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005660 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005661 .tested = TEST_UNTESTED,
5662 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005663 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005664 .block_erasers =
5665 {
5666 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005667 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005668 {16 * 1024, 1},
5669 {8 * 1024, 2},
5670 {32 * 1024, 1},
5671 {64 * 1024, 7},
5672 },
Sean Nelson35727f72010-01-28 23:55:12 +00005673 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005674 }, {
5675 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005676 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005677 },
5678 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005679 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005680 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005681 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005682 },
5683
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005684 {
5685 .vendor = "Fujitsu",
5686 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005687 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005688 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005689 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005690 .total_size = 512,
5691 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005692 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005693 .tested = TEST_UNTESTED,
5694 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005695 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005696 .block_erasers =
5697 {
5698 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005699 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005700 {64 * 1024, 7},
5701 {32 * 1024, 1},
5702 {8 * 1024, 2},
5703 {16 * 1024, 1},
5704 },
Sean Nelson35727f72010-01-28 23:55:12 +00005705 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005706 }, {
5707 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005708 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005709 },
5710 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005711 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005712 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005713 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005714 },
5715
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005716 {
Sean Nelson35727f72010-01-28 23:55:12 +00005717 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005718 .vendor = "Fujitsu",
5719 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005720 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005721 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005722 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005723 .total_size = 512,
5724 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005725 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005726 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005727 .probe = probe_jedec,
5728 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005729 .block_erasers =
5730 {
5731 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005732 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005733 {16 * 1024, 1},
5734 {8 * 1024, 2},
5735 {32 * 1024, 1},
5736 {64 * 1024, 7},
5737 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005738 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005739 }, {
5740 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005741 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005742 },
5743 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005744 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005745 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005746 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005747 },
5748
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005749 {
5750 .vendor = "Fujitsu",
5751 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005752 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005753 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005754 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005755 .total_size = 512,
5756 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005757 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005758 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005759 .probe = probe_jedec,
5760 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005761 .block_erasers =
5762 {
5763 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005764 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005765 {64 * 1024, 7},
5766 {32 * 1024, 1},
5767 {8 * 1024, 2},
5768 {16 * 1024, 1},
5769 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005770 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005771 }, {
5772 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005773 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005774 },
5775 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005776 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005777 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005778 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005779 },
5780
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005781 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005782 .vendor = "Fujitsu",
5783 .name = "MBM29LV160BE",
5784 .bustype = BUS_PARALLEL,
5785 .manufacture_id = FUJITSU_ID,
5786 .model_id = FUJITSU_MBM29LV160BE,
5787 .total_size = 2 * 1024,
5788 .page_size = 0,
5789 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5790 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005791 .probe = probe_jedec,
5792 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005793 .block_erasers =
5794 {
5795 {
5796 .eraseblocks = {
5797 {16 * 1024, 1},
5798 {8 * 1024, 2},
5799 {32 * 1024, 1},
5800 {64 * 1024, 31},
5801 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005802 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005803 }, {
5804 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005805 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005806 },
5807 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005808 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005809 .read = read_memmapped,
5810 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5811 },
5812
5813 {
5814 .vendor = "Fujitsu",
5815 .name = "MBM29LV160TE",
5816 .bustype = BUS_PARALLEL,
5817 .manufacture_id = FUJITSU_ID,
5818 .model_id = FUJITSU_MBM29LV160TE,
5819 .total_size = 2 * 1024,
5820 .page_size = 0,
5821 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5822 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005823 .probe = probe_jedec,
5824 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005825 .block_erasers =
5826 {
5827 {
5828 .eraseblocks = {
5829 {64 * 1024, 31},
5830 {32 * 1024, 1},
5831 {8 * 1024, 2},
5832 {16 * 1024, 1},
5833 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005834 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005835 }, {
5836 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005837 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005838 },
5839 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005840 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005841 .read = read_memmapped,
5842 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5843 },
5844
5845 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005846 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00005847 .name = "GD25LQ40",
5848 .bustype = BUS_SPI,
5849 .manufacture_id = GIGADEVICE_ID,
5850 .model_id = GIGADEVICE_GD25LQ40,
5851 .total_size = 512,
5852 .page_size = 256,
5853 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5854 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5855 .tested = TEST_UNTESTED,
5856 .probe = probe_spi_rdid,
5857 .probe_timing = TIMING_ZERO,
5858 .block_erasers =
5859 {
5860 {
5861 .eraseblocks = { {4 * 1024, 128} },
5862 .block_erase = spi_block_erase_20,
5863 }, {
5864 .eraseblocks = { {32 * 1024, 16} },
5865 .block_erase = spi_block_erase_52,
5866 }, {
5867 .eraseblocks = { {64 * 1024, 8} },
5868 .block_erase = spi_block_erase_d8,
5869 }, {
5870 .eraseblocks = { {512 * 1024, 1} },
5871 .block_erase = spi_block_erase_60,
5872 }, {
5873 .eraseblocks = { {512 * 1024, 1} },
5874 .block_erase = spi_block_erase_c7,
5875 }
5876 },
5877 .printlock = spi_prettyprint_status_register_bp4_srwd,
5878 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5879 .write = spi_chip_write_256,
5880 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5881 .voltage = {1695, 1950},
5882 },
5883
5884 {
5885 .vendor = "GigaDevice",
5886 .name = "GD25LQ80",
5887 .bustype = BUS_SPI,
5888 .manufacture_id = GIGADEVICE_ID,
5889 .model_id = GIGADEVICE_GD25LQ80,
5890 .total_size = 1024,
5891 .page_size = 256,
5892 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5893 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5894 .tested = TEST_UNTESTED,
5895 .probe = probe_spi_rdid,
5896 .probe_timing = TIMING_ZERO,
5897 .block_erasers =
5898 {
5899 {
5900 .eraseblocks = { {4 * 1024, 256} },
5901 .block_erase = spi_block_erase_20,
5902 }, {
5903 .eraseblocks = { {32 * 1024, 32} },
5904 .block_erase = spi_block_erase_52,
5905 }, {
5906 .eraseblocks = { {64 * 1024, 16} },
5907 .block_erase = spi_block_erase_d8,
5908 }, {
5909 .eraseblocks = { {1 * 1024 * 1024, 1} },
5910 .block_erase = spi_block_erase_60,
5911 }, {
5912 .eraseblocks = { {1 * 1024 * 1024, 1} },
5913 .block_erase = spi_block_erase_c7,
5914 }
5915 },
5916 .printlock = spi_prettyprint_status_register_bp4_srwd,
5917 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5918 .write = spi_chip_write_256,
5919 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5920 .voltage = {1695, 1950},
5921 },
5922
5923 {
5924 .vendor = "GigaDevice",
5925 .name = "GD25LQ16",
5926 .bustype = BUS_SPI,
5927 .manufacture_id = GIGADEVICE_ID,
5928 .model_id = GIGADEVICE_GD25LQ16,
5929 .total_size = 2048,
5930 .page_size = 256,
5931 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5932 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5933 .tested = TEST_UNTESTED,
5934 .probe = probe_spi_rdid,
5935 .probe_timing = TIMING_ZERO,
5936 .block_erasers =
5937 {
5938 {
5939 .eraseblocks = { {4 * 1024, 512} },
5940 .block_erase = spi_block_erase_20,
5941 }, {
5942 .eraseblocks = { {32 * 1024, 64} },
5943 .block_erase = spi_block_erase_52,
5944 }, {
5945 .eraseblocks = { {64 * 1024, 32} },
5946 .block_erase = spi_block_erase_d8,
5947 }, {
5948 .eraseblocks = { {2 * 1024 * 1024, 1} },
5949 .block_erase = spi_block_erase_60,
5950 }, {
5951 .eraseblocks = { {2 * 1024 * 1024, 1} },
5952 .block_erase = spi_block_erase_c7,
5953 }
5954 },
5955 .printlock = spi_prettyprint_status_register_bp4_srwd,
5956 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5957 .write = spi_chip_write_256,
5958 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5959 .voltage = {1695, 1950},
5960 },
5961
5962 {
5963 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005964 .name = "GD25LQ32",
5965 .bustype = BUS_SPI,
5966 .manufacture_id = GIGADEVICE_ID,
5967 .model_id = GIGADEVICE_GD25LQ32,
5968 .total_size = 4096,
5969 .page_size = 256,
5970 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5972 .tested = TEST_OK_PREW,
5973 .probe = probe_spi_rdid,
5974 .probe_timing = TIMING_ZERO,
5975 .block_erasers =
5976 {
5977 {
5978 .eraseblocks = { {4 * 1024, 1024} },
5979 .block_erase = spi_block_erase_20,
5980 }, {
5981 .eraseblocks = { {32 * 1024, 128} },
5982 .block_erase = spi_block_erase_52,
5983 }, {
5984 .eraseblocks = { {64 * 1024, 64} },
5985 .block_erase = spi_block_erase_d8,
5986 }, {
5987 .eraseblocks = { {4 * 1024 * 1024, 1} },
5988 .block_erase = spi_block_erase_60,
5989 }, {
5990 .eraseblocks = { {4 * 1024 * 1024, 1} },
5991 .block_erase = spi_block_erase_c7,
5992 }
5993 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005994 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005995 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5996 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00005997 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5998 .voltage = {1695, 1950},
5999 },
6000
6001 {
6002 .vendor = "GigaDevice",
6003 .name = "GD25LQ64(B)",
6004 .bustype = BUS_SPI,
6005 .manufacture_id = GIGADEVICE_ID,
6006 .model_id = GIGADEVICE_GD25LQ64,
6007 .total_size = 8192,
6008 .page_size = 256,
6009 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6010 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00006011 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006012 .probe = probe_spi_rdid,
6013 .probe_timing = TIMING_ZERO,
6014 .block_erasers =
6015 {
6016 {
6017 .eraseblocks = { {4 * 1024, 2048} },
6018 .block_erase = spi_block_erase_20,
6019 }, {
6020 .eraseblocks = { {32 * 1024, 256} },
6021 .block_erase = spi_block_erase_52,
6022 }, {
6023 .eraseblocks = { {64 * 1024, 128} },
6024 .block_erase = spi_block_erase_d8,
6025 }, {
6026 .eraseblocks = { {8 * 1024 * 1024, 1} },
6027 .block_erase = spi_block_erase_60,
6028 }, {
6029 .eraseblocks = { {8 * 1024 * 1024, 1} },
6030 .block_erase = spi_block_erase_c7,
6031 }
6032 },
6033 .printlock = spi_prettyprint_status_register_bp4_srwd,
6034 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6035 .write = spi_chip_write_256,
6036 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6037 .voltage = {1695, 1950},
6038 },
6039
6040 {
6041 .vendor = "GigaDevice",
6042 .name = "GD25LQ128",
6043 .bustype = BUS_SPI,
6044 .manufacture_id = GIGADEVICE_ID,
6045 .model_id = GIGADEVICE_GD25LQ128,
6046 .total_size = 16384,
6047 .page_size = 256,
6048 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6049 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6050 .tested = TEST_UNTESTED,
6051 .probe = probe_spi_rdid,
6052 .probe_timing = TIMING_ZERO,
6053 .block_erasers =
6054 {
6055 {
6056 .eraseblocks = { {4 * 1024, 4096} },
6057 .block_erase = spi_block_erase_20,
6058 }, {
6059 .eraseblocks = { {32 * 1024, 512} },
6060 .block_erase = spi_block_erase_52,
6061 }, {
6062 .eraseblocks = { {64 * 1024, 256} },
6063 .block_erase = spi_block_erase_d8,
6064 }, {
6065 .eraseblocks = { {16 * 1024 * 1024, 1} },
6066 .block_erase = spi_block_erase_60,
6067 }, {
6068 .eraseblocks = { {16 * 1024 * 1024, 1} },
6069 .block_erase = spi_block_erase_c7,
6070 }
6071 },
6072 .printlock = spi_prettyprint_status_register_bp4_srwd,
6073 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6074 .write = spi_chip_write_256,
6075 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6076 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006077 },
6078
6079 {
6080 .vendor = "GigaDevice",
6081 .name = "GD25Q512",
6082 .bustype = BUS_SPI,
6083 .manufacture_id = GIGADEVICE_ID,
6084 .model_id = GIGADEVICE_GD25Q512,
6085 .total_size = 64,
6086 .page_size = 256,
6087 .feature_bits = FEATURE_WRSR_WREN,
Nico Huberc6fe5d82018-08-18 12:45:58 +02006088 .tested = TEST_OK_PREW,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006089 .probe = probe_spi_rdid,
6090 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006091 .block_erasers =
6092 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006093 {
6094 .eraseblocks = { {4 * 1024, 16} },
6095 .block_erase = spi_block_erase_20,
6096 }, {
6097 .eraseblocks = { {32 * 1024, 2} },
6098 .block_erase = spi_block_erase_52,
6099 }, {
6100 .eraseblocks = { {64 * 1024, 1} },
6101 .block_erase = spi_block_erase_60,
6102 }, {
6103 .eraseblocks = { {64 * 1024, 1} },
6104 .block_erase = spi_block_erase_c7,
6105 }
6106 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006107 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006108 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6109 .write = spi_chip_write_256,
6110 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6111 .voltage = {2700, 3600},
6112 },
6113
6114 {
6115 .vendor = "GigaDevice",
6116 .name = "GD25Q10",
6117 .bustype = BUS_SPI,
6118 .manufacture_id = GIGADEVICE_ID,
6119 .model_id = GIGADEVICE_GD25Q10,
6120 .total_size = 128,
6121 .page_size = 256,
6122 .feature_bits = FEATURE_WRSR_WREN,
6123 .tested = TEST_UNTESTED,
6124 .probe = probe_spi_rdid,
6125 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006126 .block_erasers =
6127 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006128 {
6129 .eraseblocks = { {4 * 1024, 32} },
6130 .block_erase = spi_block_erase_20,
6131 }, {
6132 .eraseblocks = { {32 * 1024, 4} },
6133 .block_erase = spi_block_erase_52,
6134 }, {
6135 .eraseblocks = { {64 * 1024, 2} },
6136 .block_erase = spi_block_erase_d8,
6137 }, {
6138 .eraseblocks = { {128 * 1024, 1} },
6139 .block_erase = spi_block_erase_60,
6140 }, {
6141 .eraseblocks = { {128 * 1024, 1} },
6142 .block_erase = spi_block_erase_c7,
6143 }
6144 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006145 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006146 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6147 .write = spi_chip_write_256,
6148 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6149 .voltage = {2700, 3600},
6150 },
6151
6152 {
6153 .vendor = "GigaDevice",
6154 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006155 .bustype = BUS_SPI,
6156 .manufacture_id = GIGADEVICE_ID,
6157 .model_id = GIGADEVICE_GD25Q20,
6158 .total_size = 256,
6159 .page_size = 256,
6160 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00006161 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006162 .probe = probe_spi_rdid,
6163 .probe_timing = TIMING_ZERO,
6164 .block_erasers =
6165 {
6166 {
6167 .eraseblocks = { {4 * 1024, 64} },
6168 .block_erase = spi_block_erase_20,
6169 }, {
6170 .eraseblocks = { {32 * 1024, 8} },
6171 .block_erase = spi_block_erase_52,
6172 }, {
6173 .eraseblocks = { {64 * 1024, 4} },
6174 .block_erase = spi_block_erase_d8,
6175 }, {
6176 .eraseblocks = { {256 * 1024, 1} },
6177 .block_erase = spi_block_erase_60,
6178 }, {
6179 .eraseblocks = { {256 * 1024, 1} },
6180 .block_erase = spi_block_erase_c7,
6181 }
6182 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006183 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006184 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006185 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006186 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006187 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006188 },
6189
6190 {
6191 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006192 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006193 .bustype = BUS_SPI,
6194 .manufacture_id = GIGADEVICE_ID,
6195 .model_id = GIGADEVICE_GD25Q40,
6196 .total_size = 512,
6197 .page_size = 256,
6198 .feature_bits = FEATURE_WRSR_WREN,
6199 .tested = TEST_UNTESTED,
6200 .probe = probe_spi_rdid,
6201 .probe_timing = TIMING_ZERO,
6202 .block_erasers =
6203 {
6204 {
6205 .eraseblocks = { {4 * 1024, 128} },
6206 .block_erase = spi_block_erase_20,
6207 }, {
6208 .eraseblocks = { {32 * 1024, 16} },
6209 .block_erase = spi_block_erase_52,
6210 }, {
6211 .eraseblocks = { {64 * 1024, 8} },
6212 .block_erase = spi_block_erase_d8,
6213 }, {
6214 .eraseblocks = { {512 * 1024, 1} },
6215 .block_erase = spi_block_erase_60,
6216 }, {
6217 .eraseblocks = { {512 * 1024, 1} },
6218 .block_erase = spi_block_erase_c7,
6219 }
6220 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006221 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006222 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006223 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006224 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006225 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006226 },
6227
6228 {
6229 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006230 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006231 .bustype = BUS_SPI,
6232 .manufacture_id = GIGADEVICE_ID,
6233 .model_id = GIGADEVICE_GD25Q80,
6234 .total_size = 1024,
6235 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006236 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006237 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6238 .tested = TEST_OK_PREW,
6239 .probe = probe_spi_rdid,
6240 .probe_timing = TIMING_ZERO,
6241 .block_erasers =
6242 {
6243 {
6244 .eraseblocks = { {4 * 1024, 256} },
6245 .block_erase = spi_block_erase_20,
6246 }, {
6247 .eraseblocks = { {32 * 1024, 32} },
6248 .block_erase = spi_block_erase_52,
6249 }, {
6250 .eraseblocks = { {64 * 1024, 16} },
6251 .block_erase = spi_block_erase_d8,
6252 }, {
6253 .eraseblocks = { {1024 * 1024, 1} },
6254 .block_erase = spi_block_erase_60,
6255 }, {
6256 .eraseblocks = { {1024 * 1024, 1} },
6257 .block_erase = spi_block_erase_c7,
6258 }
6259 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006260 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006261 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006262 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006263 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006264 .voltage = {2700, 3600},
6265 },
6266
6267 {
6268 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006269 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006270 .bustype = BUS_SPI,
6271 .manufacture_id = GIGADEVICE_ID,
6272 .model_id = GIGADEVICE_GD25Q16,
6273 .total_size = 2048,
6274 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006275 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006276 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00006277 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006278 .probe = probe_spi_rdid,
6279 .probe_timing = TIMING_ZERO,
6280 .block_erasers =
6281 {
6282 {
6283 .eraseblocks = { {4 * 1024, 512} },
6284 .block_erase = spi_block_erase_20,
6285 }, {
6286 .eraseblocks = { {32 * 1024, 64} },
6287 .block_erase = spi_block_erase_52,
6288 }, {
6289 .eraseblocks = { {64 * 1024, 32} },
6290 .block_erase = spi_block_erase_d8,
6291 }, {
6292 .eraseblocks = { {2 * 1024 * 1024, 1} },
6293 .block_erase = spi_block_erase_60,
6294 }, {
6295 .eraseblocks = { {2 * 1024 * 1024, 1} },
6296 .block_erase = spi_block_erase_c7,
6297 }
6298 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006299 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006300 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006301 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006302 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006303 .voltage = {2700, 3600},
6304 },
6305
6306 {
6307 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006308 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006309 .bustype = BUS_SPI,
6310 .manufacture_id = GIGADEVICE_ID,
6311 .model_id = GIGADEVICE_GD25Q32,
6312 .total_size = 4096,
6313 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006314 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006315 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006316 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006317 .probe = probe_spi_rdid,
6318 .probe_timing = TIMING_ZERO,
6319 .block_erasers =
6320 {
6321 {
6322 .eraseblocks = { {4 * 1024, 1024} },
6323 .block_erase = spi_block_erase_20,
6324 }, {
6325 .eraseblocks = { {32 * 1024, 128} },
6326 .block_erase = spi_block_erase_52,
6327 }, {
6328 .eraseblocks = { {64 * 1024, 64} },
6329 .block_erase = spi_block_erase_d8,
6330 }, {
6331 .eraseblocks = { {4 * 1024 * 1024, 1} },
6332 .block_erase = spi_block_erase_60,
6333 }, {
6334 .eraseblocks = { {4 * 1024 * 1024, 1} },
6335 .block_erase = spi_block_erase_c7,
6336 }
6337 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006338 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006339 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006340 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006341 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006342 .voltage = {2700, 3600},
6343 },
6344
6345 {
6346 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006347 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006348 .bustype = BUS_SPI,
6349 .manufacture_id = GIGADEVICE_ID,
6350 .model_id = GIGADEVICE_GD25Q64,
6351 .total_size = 8192,
6352 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006353 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006354 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00006355 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006356 .probe = probe_spi_rdid,
6357 .probe_timing = TIMING_ZERO,
6358 .block_erasers =
6359 {
6360 {
6361 .eraseblocks = { {4 * 1024, 2048} },
6362 .block_erase = spi_block_erase_20,
6363 }, {
6364 .eraseblocks = { {32 * 1024, 256} },
6365 .block_erase = spi_block_erase_52,
6366 }, {
6367 .eraseblocks = { {64 * 1024, 128} },
6368 .block_erase = spi_block_erase_d8,
6369 }, {
6370 .eraseblocks = { {8 * 1024 * 1024, 1} },
6371 .block_erase = spi_block_erase_60,
6372 }, {
6373 .eraseblocks = { {8 * 1024 * 1024, 1} },
6374 .block_erase = spi_block_erase_c7,
6375 }
6376 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006377 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006378 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006379 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006380 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00006381 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006382 },
6383
6384 {
6385 .vendor = "GigaDevice",
Angel Pons20657ce2018-09-30 17:05:18 +02006386 .name = "GD25B128B/GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006387 .bustype = BUS_SPI,
6388 .manufacture_id = GIGADEVICE_ID,
6389 .model_id = GIGADEVICE_GD25Q128,
6390 .total_size = 16384,
6391 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006392 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006393 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons20657ce2018-09-30 17:05:18 +02006394 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006395 .probe = probe_spi_rdid,
6396 .probe_timing = TIMING_ZERO,
6397 .block_erasers =
6398 {
6399 {
6400 .eraseblocks = { {4 * 1024, 4096} },
6401 .block_erase = spi_block_erase_20,
6402 }, {
6403 .eraseblocks = { {32 * 1024, 512} },
6404 .block_erase = spi_block_erase_52,
6405 }, {
6406 .eraseblocks = { {64 * 1024, 256} },
6407 .block_erase = spi_block_erase_d8,
6408 }, {
6409 .eraseblocks = { {16 * 1024 * 1024, 1} },
6410 .block_erase = spi_block_erase_60,
6411 }, {
6412 .eraseblocks = { {16 * 1024 * 1024, 1} },
6413 .block_erase = spi_block_erase_c7,
6414 }
6415 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006416 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006417 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6418 .write = spi_chip_write_256,
6419 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6420 .voltage = {2700, 3600},
6421 },
6422
6423 {
6424 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006425 .name = "GD25Q128C",
6426 .bustype = BUS_SPI,
6427 .manufacture_id = GIGADEVICE_ID,
6428 .model_id = GIGADEVICE_GD25Q128,
6429 .total_size = 16384,
6430 .page_size = 256,
6431 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6432 /* QPI: enable 0x38, disable 0xFF */
6433 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Angel Ponsbce364c2018-09-30 20:04:14 +02006434 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006435 .probe = probe_spi_rdid,
6436 .probe_timing = TIMING_ZERO,
6437 .block_erasers =
6438 {
6439 {
6440 .eraseblocks = { {4 * 1024, 4096} },
6441 .block_erase = spi_block_erase_20,
6442 }, {
6443 .eraseblocks = { {32 * 1024, 512} },
6444 .block_erase = spi_block_erase_52,
6445 }, {
6446 .eraseblocks = { {64 * 1024, 256} },
6447 .block_erase = spi_block_erase_d8,
6448 }, {
6449 .eraseblocks = { {16 * 1024 * 1024, 1} },
6450 .block_erase = spi_block_erase_60,
6451 }, {
6452 .eraseblocks = { {16 * 1024 * 1024, 1} },
6453 .block_erase = spi_block_erase_c7,
6454 }
6455 },
6456 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6457 .printlock = spi_prettyprint_status_register_bp4_srwd,
6458 .unlock = spi_disable_blockprotect_bp4_srwd,
6459 .write = spi_chip_write_256,
6460 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6461 .voltage = {2700, 3600},
6462 },
6463
6464 {
6465 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006466 .name = "GD25T80",
6467 .bustype = BUS_SPI,
6468 .manufacture_id = GIGADEVICE_ID,
6469 .model_id = GIGADEVICE_GD25T80,
6470 .total_size = 1024,
6471 .page_size = 256,
6472 /* OTP: 256B total; enter 0x3A */
6473 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6474 .tested = TEST_UNTESTED,
6475 .probe = probe_spi_rdid,
6476 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006477 .block_erasers =
6478 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006479 {
6480 .eraseblocks = { {4 * 1024, 256} },
6481 .block_erase = spi_block_erase_20,
6482 }, {
6483 .eraseblocks = { {64 * 1024, 16} },
6484 .block_erase = spi_block_erase_52,
6485 }, {
6486 .eraseblocks = { {64 * 1024, 16} },
6487 .block_erase = spi_block_erase_d8,
6488 }, {
6489 .eraseblocks = { {1024 * 1024, 1} },
6490 .block_erase = spi_block_erase_60,
6491 }, {
6492 .eraseblocks = { {1024 * 1024, 1} },
6493 .block_erase = spi_block_erase_c7,
6494 }
6495 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00006496 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006497 .unlock = spi_disable_blockprotect,
6498 .write = spi_chip_write_256,
6499 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006500 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006501 },
6502
6503 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006504 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006505 .name = "GD25VQ21B",
6506 .bustype = BUS_SPI,
6507 .manufacture_id = GIGADEVICE_ID,
6508 .model_id = GIGADEVICE_GD25VQ21B,
6509 .total_size = 256,
6510 .page_size = 256,
6511 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6512 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6513 .tested = TEST_UNTESTED,
6514 .probe = probe_spi_rdid,
6515 .probe_timing = TIMING_ZERO,
6516 .block_erasers =
6517 {
6518 {
6519 .eraseblocks = { { 4 * 1024, 64} },
6520 .block_erase = spi_block_erase_20,
6521 }, {
6522 .eraseblocks = { { 32 * 1024, 8} },
6523 .block_erase = spi_block_erase_52,
6524 }, {
6525 .eraseblocks = { { 64 * 1024, 4} },
6526 .block_erase = spi_block_erase_d8,
6527 }, {
6528 .eraseblocks = { {256 * 1024, 1} },
6529 .block_erase = spi_block_erase_60,
6530 }, {
6531 .eraseblocks = { {256 * 1024, 1} },
6532 .block_erase = spi_block_erase_c7,
6533 }
6534 },
6535 .printlock = spi_prettyprint_status_register_bp4_srwd,
6536 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6537 .write = spi_chip_write_256,
6538 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6539 .voltage = {2300, 3600},
6540 },
6541
6542 {
6543 .vendor = "GigaDevice",
6544 .name = "GD25VQ40C",
6545 .bustype = BUS_SPI,
6546 .manufacture_id = GIGADEVICE_ID,
6547 .model_id = GIGADEVICE_GD25VQ41B,
6548 .total_size = 512,
6549 .page_size = 256,
6550 /* Supports SFDP */
6551 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6553 .tested = TEST_UNTESTED,
6554 .probe = probe_spi_rdid,
6555 .probe_timing = TIMING_ZERO,
6556 .block_erasers =
6557 {
6558 {
6559 .eraseblocks = { { 4 * 1024, 128} },
6560 .block_erase = spi_block_erase_20,
6561 }, {
6562 .eraseblocks = { { 32 * 1024, 16} },
6563 .block_erase = spi_block_erase_52,
6564 }, {
6565 .eraseblocks = { { 64 * 1024, 8} },
6566 .block_erase = spi_block_erase_d8,
6567 }, {
6568 .eraseblocks = { {512 * 1024, 1} },
6569 .block_erase = spi_block_erase_60,
6570 }, {
6571 .eraseblocks = { {512 * 1024, 1} },
6572 .block_erase = spi_block_erase_c7,
6573 }
6574 },
6575 .printlock = spi_prettyprint_status_register_bp4_srwd,
6576 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6577 .write = spi_chip_write_256,
6578 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6579 .voltage = {2300, 3600},
6580 },
6581
6582 {
6583 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006584 .name = "GD25VQ41B",
6585 .bustype = BUS_SPI,
6586 .manufacture_id = GIGADEVICE_ID,
6587 .model_id = GIGADEVICE_GD25VQ41B,
6588 .total_size = 512,
6589 .page_size = 256,
6590 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6591 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006592 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006593 .probe = probe_spi_rdid,
6594 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006595 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006596 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006597 {
6598 .eraseblocks = { { 4 * 1024, 128} },
6599 .block_erase = spi_block_erase_20,
6600 }, {
6601 .eraseblocks = { { 32 * 1024, 16} },
6602 .block_erase = spi_block_erase_52,
6603 }, {
6604 .eraseblocks = { { 64 * 1024, 8} },
6605 .block_erase = spi_block_erase_d8,
6606 }, {
6607 .eraseblocks = { {512 * 1024, 1} },
6608 .block_erase = spi_block_erase_60,
6609 }, {
6610 .eraseblocks = { {512 * 1024, 1} },
6611 .block_erase = spi_block_erase_c7,
6612 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006613 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006614 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006615 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6616 .write = spi_chip_write_256,
6617 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6618 .voltage = {2300, 3600},
6619 },
6620
6621 {
6622 .vendor = "GigaDevice",
6623 .name = "GD25VQ80C",
6624 .bustype = BUS_SPI,
6625 .manufacture_id = GIGADEVICE_ID,
6626 .model_id = GIGADEVICE_GD25VQ80C,
6627 .total_size = 1024,
6628 .page_size = 256,
6629 /* Supports SFDP */
6630 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6631 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6632 .tested = TEST_UNTESTED,
6633 .probe = probe_spi_rdid,
6634 .probe_timing = TIMING_ZERO,
6635 .block_erasers =
6636 {
6637 {
6638 .eraseblocks = { { 4 * 1024, 256} },
6639 .block_erase = spi_block_erase_20,
6640 }, {
6641 .eraseblocks = { { 32 * 1024, 32} },
6642 .block_erase = spi_block_erase_52,
6643 }, {
6644 .eraseblocks = { { 64 * 1024, 16} },
6645 .block_erase = spi_block_erase_d8,
6646 }, {
6647 .eraseblocks = { {1024 * 1024, 1} },
6648 .block_erase = spi_block_erase_60,
6649 }, {
6650 .eraseblocks = { {1024 * 1024, 1} },
6651 .block_erase = spi_block_erase_c7,
6652 }
6653 },
6654 .printlock = spi_prettyprint_status_register_bp4_srwd,
6655 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6656 .write = spi_chip_write_256,
6657 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6658 .voltage = {2300, 3600},
6659 },
6660
6661 {
6662 .vendor = "GigaDevice",
6663 .name = "GD25VQ16C",
6664 .bustype = BUS_SPI,
6665 .manufacture_id = GIGADEVICE_ID,
6666 .model_id = GIGADEVICE_GD25VQ16C,
6667 .total_size = 2 * 1024,
6668 .page_size = 256,
6669 /* Supports SFDP */
6670 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6671 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6672 .tested = TEST_UNTESTED,
6673 .probe = probe_spi_rdid,
6674 .probe_timing = TIMING_ZERO,
6675 .block_erasers =
6676 {
6677 {
6678 .eraseblocks = { { 4 * 1024, 512} },
6679 .block_erase = spi_block_erase_20,
6680 }, {
6681 .eraseblocks = { { 32 * 1024, 64} },
6682 .block_erase = spi_block_erase_52,
6683 }, {
6684 .eraseblocks = { { 64 * 1024, 32} },
6685 .block_erase = spi_block_erase_d8,
6686 }, {
6687 .eraseblocks = { {2 * 1024 * 1024, 1} },
6688 .block_erase = spi_block_erase_60,
6689 }, {
6690 .eraseblocks = { {2 * 1024 * 1024, 1} },
6691 .block_erase = spi_block_erase_c7,
6692 }
6693 },
6694 .printlock = spi_prettyprint_status_register_bp4_srwd,
6695 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006696 .write = spi_chip_write_256,
6697 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6698 .voltage = {2300, 3600},
6699 },
6700
6701 {
David Borgc96a8bd2010-06-21 16:12:22 +00006702 .vendor = "Hyundai",
6703 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006704 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006705 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006706 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00006707 .total_size = 256,
6708 .page_size = 256 * 1024,
6709 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006710 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00006711 .probe = probe_jedec,
6712 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6713 .block_erasers =
6714 {
6715 {
6716 .eraseblocks = {
6717 {64 * 1024, 3},
6718 {32 * 1024, 1},
6719 {8 * 1024, 2},
6720 {16 * 1024, 1},
6721 },
6722 .block_erase = erase_sector_jedec,
6723 }, {
6724 .eraseblocks = { {256 * 1024, 1} },
6725 .block_erase = erase_chip_block_jedec,
6726 },
6727 },
6728 .write = write_jedec_1,
6729 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006730 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006731 },
6732
6733 {
6734 .vendor = "Hyundai",
6735 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006736 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006737 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006738 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00006739 .total_size = 256,
6740 .page_size = 256 * 1024,
6741 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6742 .tested = TEST_UNTESTED,
6743 .probe = probe_jedec,
6744 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6745 .block_erasers =
6746 {
6747 {
6748 .eraseblocks = {
6749 {16 * 1024, 1},
6750 {8 * 1024, 2},
6751 {32 * 1024, 1},
6752 {64 * 1024, 3},
6753 },
6754 .block_erase = erase_sector_jedec,
6755 }, {
6756 .eraseblocks = { {256 * 1024, 1} },
6757 .block_erase = erase_chip_block_jedec,
6758 },
6759 },
6760 .write = write_jedec_1,
6761 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006762 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006763 },
6764
6765 {
Joshua Roysf1324e02010-09-16 00:51:51 +00006766 .vendor = "Hyundai",
6767 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006768 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006769 .manufacture_id = HYUNDAI_ID,
6770 .model_id = HYUNDAI_HY29F040A,
6771 .total_size = 512,
6772 .page_size = 64 * 1024,
6773 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6774 .tested = TEST_UNTESTED,
6775 .probe = probe_jedec,
6776 .probe_timing = TIMING_ZERO,
6777 .block_erasers =
6778 {
6779 {
6780 .eraseblocks = { {64 * 1024, 8} },
6781 .block_erase = erase_sector_jedec,
6782 }, {
6783 .eraseblocks = { {512 * 1024, 1} },
6784 .block_erase = erase_chip_block_jedec,
6785 },
6786 },
6787 .write = write_jedec_1,
6788 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006789 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006790 },
6791
6792 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006793 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006794 .name = "25F160S33B8",
6795 .bustype = BUS_SPI,
6796 .manufacture_id = INTEL_ID,
6797 .model_id = INTEL_25F160S33B8,
6798 .total_size = 2048,
6799 .page_size = 256,
6800 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6802 .tested = TEST_UNTESTED,
6803 .probe = probe_spi_rdid,
6804 .probe_timing = TIMING_ZERO,
6805 .block_erasers =
6806 {
6807 {
6808 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6809 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6810 * have no effect on the memory contents, but sets a flag in the SR.
6811 .eraseblocks = {
6812 {8 * 1024, 8},
6813 {64 * 1024, 31} // inaccessible
6814 },
6815 .block_erase = spi_block_erase_40,
6816 }, { */
6817 .eraseblocks = { {64 * 1024, 32} },
6818 .block_erase = spi_block_erase_d8,
6819 }, {
6820 .eraseblocks = { {2 * 1024 * 1024, 1} },
6821 .block_erase = spi_block_erase_c7,
6822 }
6823 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006824 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6825 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006826 .write = spi_chip_write_256,
6827 .read = spi_chip_read, /* also fast read 0x0B */
6828 .voltage = {2700, 3600},
6829 },
6830
6831 {
6832 .vendor = "Intel",
6833 .name = "25F160S33T8",
6834 .bustype = BUS_SPI,
6835 .manufacture_id = INTEL_ID,
6836 .model_id = INTEL_25F160S33T8,
6837 .total_size = 2048,
6838 .page_size = 256,
6839 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6840 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6841 .tested = TEST_UNTESTED,
6842 .probe = probe_spi_rdid,
6843 .probe_timing = TIMING_ZERO,
6844 .block_erasers =
6845 {
6846 {
6847 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6848 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6849 * have no effect on the memory contents, but sets a flag in the SR.
6850 .eraseblocks = {
6851 {64 * 1024, 31}, // inaccessible
6852 {8 * 1024, 8}
6853 },
6854 .block_erase = spi_block_erase_40,
6855 }, { */
6856 .eraseblocks = { {64 * 1024, 32} },
6857 .block_erase = spi_block_erase_d8,
6858 }, {
6859 .eraseblocks = { {2 * 1024 * 1024, 1} },
6860 .block_erase = spi_block_erase_c7,
6861 }
6862 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006863 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6864 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006865 .write = spi_chip_write_256,
6866 .read = spi_chip_read, /* also fast read 0x0B */
6867 .voltage = {2700, 3600},
6868 },
6869
6870 {
6871 .vendor = "Intel",
6872 .name = "25F320S33B8",
6873 .bustype = BUS_SPI,
6874 .manufacture_id = INTEL_ID,
6875 .model_id = INTEL_25F320S33B8,
6876 .total_size = 4096,
6877 .page_size = 256,
6878 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6880 .tested = TEST_UNTESTED,
6881 .probe = probe_spi_rdid,
6882 .probe_timing = TIMING_ZERO,
6883 .block_erasers =
6884 {
6885 {
6886 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6887 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6888 * have no effect on the memory contents, but sets a flag in the SR.
6889 .eraseblocks = {
6890 {8 * 1024, 8},
6891 {64 * 1024, 63} // inaccessible
6892 },
6893 .block_erase = spi_block_erase_40,
6894 }, { */
6895 .eraseblocks = { {64 * 1024, 64} },
6896 .block_erase = spi_block_erase_d8,
6897 }, {
6898 .eraseblocks = { {4 * 1024 * 1024, 1} },
6899 .block_erase = spi_block_erase_c7,
6900 }
6901 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006902 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6903 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006904 .write = spi_chip_write_256,
6905 .read = spi_chip_read, /* also fast read 0x0B */
6906 .voltage = {2700, 3600},
6907 },
6908
6909 {
6910 .vendor = "Intel",
6911 .name = "25F320S33T8",
6912 .bustype = BUS_SPI,
6913 .manufacture_id = INTEL_ID,
6914 .model_id = INTEL_25F320S33T8,
6915 .total_size = 4096,
6916 .page_size = 256,
6917 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6918 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6919 .tested = TEST_UNTESTED,
6920 .probe = probe_spi_rdid,
6921 .probe_timing = TIMING_ZERO,
6922 .block_erasers =
6923 {
6924 {
6925 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6926 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6927 * have no effect on the memory contents, but sets a flag in the SR.
6928 .eraseblocks = {
6929 {64 * 1024, 63}, // inaccessible
6930 {8 * 1024, 8}
6931 },
6932 .block_erase = spi_block_erase_40,
6933 }, { */
6934 .eraseblocks = { {64 * 1024, 64} },
6935 .block_erase = spi_block_erase_d8,
6936 }, {
6937 .eraseblocks = { {4 * 1024 * 1024, 1} },
6938 .block_erase = spi_block_erase_c7,
6939 }
6940 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006941 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6942 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006943 .write = spi_chip_write_256,
6944 .read = spi_chip_read, /* also fast read 0x0B */
6945 .voltage = {2700, 3600},
6946 },
6947
6948 {
6949 .vendor = "Intel",
6950 .name = "25F640S33B8",
6951 .bustype = BUS_SPI,
6952 .manufacture_id = INTEL_ID,
6953 .model_id = INTEL_25F640S33B8,
6954 .total_size = 8192,
6955 .page_size = 256,
6956 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6957 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6958 .tested = TEST_UNTESTED,
6959 .probe = probe_spi_rdid,
6960 .probe_timing = TIMING_ZERO,
6961 .block_erasers =
6962 {
6963 {
6964 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6965 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6966 * have no effect on the memory contents, but sets a flag in the SR.
6967 .eraseblocks = {
6968 {8 * 1024, 8},
6969 {64 * 1024, 127} // inaccessible
6970 },
6971 .block_erase = spi_block_erase_40,
6972 }, { */
6973 .eraseblocks = { {64 * 1024, 128} },
6974 .block_erase = spi_block_erase_d8,
6975 }, {
6976 .eraseblocks = { {8 * 1024 * 1024, 1} },
6977 .block_erase = spi_block_erase_c7,
6978 }
6979 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006980 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6981 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006982 .write = spi_chip_write_256,
6983 .read = spi_chip_read, /* also fast read 0x0B */
6984 .voltage = {2700, 3600},
6985 },
6986
6987 {
6988 .vendor = "Intel",
6989 .name = "25F640S33T8",
6990 .bustype = BUS_SPI,
6991 .manufacture_id = INTEL_ID,
6992 .model_id = INTEL_25F640S33T8,
6993 .total_size = 8192,
6994 .page_size = 256,
6995 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6996 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6997 .tested = TEST_UNTESTED,
6998 .probe = probe_spi_rdid,
6999 .probe_timing = TIMING_ZERO,
7000 .block_erasers =
7001 {
7002 {
7003 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7004 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7005 * have no effect on the memory contents, but sets a flag in the SR.
7006 .eraseblocks = {
7007 {64 * 1024, 127}, // inaccessible
7008 {8 * 1024, 8}
7009 },
7010 .block_erase = spi_block_erase_40,
7011 }, { */
7012 .eraseblocks = { {64 * 1024, 128} },
7013 .block_erase = spi_block_erase_d8,
7014 }, {
7015 .eraseblocks = { {8 * 1024 * 1024, 1} },
7016 .block_erase = spi_block_erase_c7,
7017 }
7018 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00007019 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7020 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00007021 .write = spi_chip_write_256,
7022 .read = spi_chip_read, /* also fast read 0x0B */
7023 .voltage = {2700, 3600},
7024 },
7025
7026 {
7027 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007028 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007029 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007030 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007031 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007032 .total_size = 128,
7033 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00007034 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007035 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007036 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00007037 .block_erasers =
7038 {
7039 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007040 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007041 {8 * 1024, 1},
7042 {4 * 1024, 2},
7043 {112 * 1024, 1},
7044 },
Sean Nelson28accc22010-03-19 18:47:06 +00007045 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007046 },
7047 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007048 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007049 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007050 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007051 },
7052
7053 {
7054 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007055 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007056 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007057 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007058 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007059 .total_size = 128,
7060 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Stefan Tauner23e10b82016-01-23 16:16:49 +00007061 .tested = TEST_OK_PREW,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007062 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007063 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00007064 .block_erasers =
7065 {
7066 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007067 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007068 {112 * 1024, 1},
7069 {4 * 1024, 2},
7070 {8 * 1024, 1},
7071 },
Sean Nelson28accc22010-03-19 18:47:06 +00007072 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007073 },
7074 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007075 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007076 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007077 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007078 },
7079
7080 {
7081 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007082 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007083 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007084 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007085 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007086 .total_size = 256,
7087 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007088 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007089 .probe = probe_82802ab,
7090 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7091 .block_erasers =
7092 {
7093 {
7094 .eraseblocks = {
7095 {128 * 1024, 1},
7096 {96 * 1024, 1},
7097 {8 * 1024, 2},
7098 {16 * 1024, 1},
7099 },
7100 .block_erase = erase_block_82802ab,
7101 },
7102 },
7103 .write = write_82802ab,
7104 .read = read_memmapped,
7105 },
7106
7107 {
7108 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007109 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007110 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007111 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007112 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007113 .total_size = 512,
7114 .page_size = 256,
7115 .tested = TEST_UNTESTED,
7116 .probe = probe_82802ab,
7117 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007118 .block_erasers =
7119 {
7120 {
7121 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007122 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007123 },
7124 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007125 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007126 .write = write_82802ab,
7127 .read = read_memmapped,
7128 },
7129
7130 {
7131 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007132 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007133 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007134 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007135 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007136 .total_size = 512,
7137 .page_size = 128 * 1024, /* maximal block size */
7138 .tested = TEST_UNTESTED,
7139 .probe = probe_82802ab,
7140 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7141 .block_erasers =
7142 {
7143 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007144 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007145 {16 * 1024, 1},
7146 {8 * 1024, 2},
7147 {96 * 1024, 1},
7148 {128 * 1024, 3},
7149 },
7150 .block_erase = erase_block_82802ab,
7151 },
7152 },
7153 .write = write_82802ab,
7154 .read = read_memmapped,
7155 },
7156
7157 {
7158 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007159 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007160 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007161 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007162 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007163 .total_size = 512,
7164 .page_size = 128 * 1024, /* maximal block size */
7165 .tested = TEST_UNTESTED,
7166 .probe = probe_82802ab,
7167 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7168 .block_erasers =
7169 {
7170 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007171 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007172 {128 * 1024, 3},
7173 {96 * 1024, 1},
7174 {8 * 1024, 2},
7175 {16 * 1024, 1},
7176 },
7177 .block_erase = erase_block_82802ab,
7178 },
7179 },
7180 .write = write_82802ab,
7181 .read = read_memmapped,
7182 },
7183
7184 {
7185 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007186 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007187 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007188 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007189 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007190 .total_size = 512,
7191 .page_size = 128 * 1024, /* maximal block size */
7192 .feature_bits = FEATURE_ADDR_SHIFTED,
7193 .tested = TEST_UNTESTED,
7194 .probe = probe_82802ab,
7195 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7196 .block_erasers =
7197 {
7198 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007199 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007200 {16 * 1024, 1},
7201 {8 * 1024, 2},
7202 {96 * 1024, 1},
7203 {128 * 1024, 3},
7204 },
7205 .block_erase = erase_block_82802ab,
7206 },
7207 },
7208 .write = write_82802ab,
7209 .read = read_memmapped,
7210 },
7211
7212 {
7213 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007214 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007215 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007216 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007217 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007218 .total_size = 512,
7219 .page_size = 128 * 1024, /* maximal block size */
7220 .feature_bits = FEATURE_ADDR_SHIFTED,
7221 .tested = TEST_UNTESTED,
7222 .probe = probe_82802ab,
7223 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7224 .block_erasers =
7225 {
7226 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007227 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007228 {128 * 1024, 3},
7229 {96 * 1024, 1},
7230 {8 * 1024, 2},
7231 {16 * 1024, 1},
7232 },
7233 .block_erase = erase_block_82802ab,
7234 },
7235 },
7236 .write = write_82802ab,
7237 .read = read_memmapped,
7238 },
7239
7240 {
7241 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007242 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007243 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007244 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007245 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007246 .total_size = 512,
7247 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007248 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007249 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007250 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007251 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007252 .block_erasers =
7253 {
7254 {
7255 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007256 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007257 },
7258 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007259 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007260 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007261 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007262 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007263 },
7264
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007265 {
7266 .vendor = "Intel",
7267 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007268 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007269 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007270 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007271 .total_size = 1024,
7272 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007273 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00007274 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007275 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007276 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007277 .block_erasers =
7278 {
7279 {
7280 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00007281 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007282 },
7283 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007284 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007285 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007286 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007287 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007288 },
7289
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007290 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007291 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007292 .name = "IS25LP064",
7293 .bustype = BUS_SPI,
7294 .manufacture_id = ISSI_ID_SPI,
7295 .model_id = ISSI_IS25LP064,
7296 .total_size = 8192,
7297 .page_size = 256,
7298 /* OTP: 1024B total; read 0x48; write 0x42 */
7299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7300 .tested = TEST_UNTESTED,
7301 .probe = probe_spi_rdid,
7302 .probe_timing = TIMING_ZERO,
7303 .block_erasers =
7304 {
7305 {
7306 .eraseblocks = { {4 * 1024, 2048} },
7307 .block_erase = spi_block_erase_20,
7308 }, {
7309 .eraseblocks = { {4 * 1024, 2048} },
7310 .block_erase = spi_block_erase_d7,
7311 }, {
7312 .eraseblocks = { {32 * 1024, 256} },
7313 .block_erase = spi_block_erase_52,
7314 }, {
7315 .eraseblocks = { {64 * 1024, 128} },
7316 .block_erase = spi_block_erase_d8,
7317 }, {
7318 .eraseblocks = { {8 * 1024 * 1024, 1} },
7319 .block_erase = spi_block_erase_60,
7320 }, {
7321 .eraseblocks = { {8 * 1024 * 1024, 1} },
7322 .block_erase = spi_block_erase_c7,
7323 }
7324 },
7325 .unlock = spi_disable_blockprotect,
7326 .write = spi_chip_write_256,
7327 .read = spi_chip_read,
7328 .voltage = {2300, 3600},
7329 },
7330
7331 {
7332 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007333 .name = "IS25LP128",
7334 .bustype = BUS_SPI,
7335 .manufacture_id = ISSI_ID_SPI,
7336 .model_id = ISSI_IS25LP128,
7337 .total_size = 16384,
7338 .page_size = 256,
7339 /* OTP: 1024B total; read 0x48; write 0x42 */
7340 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7341 .tested = TEST_OK_PREW,
7342 .probe = probe_spi_rdid,
7343 .probe_timing = TIMING_ZERO,
7344 .block_erasers =
7345 {
7346 {
7347 .eraseblocks = { {4 * 1024, 4096} },
7348 .block_erase = spi_block_erase_20,
7349 }, {
7350 .eraseblocks = { {4 * 1024, 4096} },
7351 .block_erase = spi_block_erase_d7,
7352 }, {
7353 .eraseblocks = { {32 * 1024, 512} },
7354 .block_erase = spi_block_erase_52,
7355 }, {
7356 .eraseblocks = { {64 * 1024, 256} },
7357 .block_erase = spi_block_erase_d8,
7358 }, {
7359 .eraseblocks = { {16 * 1024 * 1024, 1} },
7360 .block_erase = spi_block_erase_60,
7361 }, {
7362 .eraseblocks = { {16 * 1024 * 1024, 1} },
7363 .block_erase = spi_block_erase_c7,
7364 }
7365 },
7366 .unlock = spi_disable_blockprotect,
7367 .write = spi_chip_write_256,
7368 .read = spi_chip_read,
7369 .voltage = {2300, 3600},
7370 },
7371
7372 {
7373 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007374 .name = "IS25LP256",
7375 .bustype = BUS_SPI,
7376 .manufacture_id = ISSI_ID_SPI,
7377 .model_id = ISSI_IS25LP256,
7378 .total_size = 32768,
7379 .page_size = 256,
7380 /* supports SFDP */
7381 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7382 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7383 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7384 .tested = TEST_OK_PREW,
7385 .probe = probe_spi_rdid,
7386 .probe_timing = TIMING_ZERO,
7387 .block_erasers =
7388 {
7389 {
7390 .eraseblocks = { {4 * 1024, 8192} },
7391 .block_erase = spi_block_erase_21,
7392 }, {
7393 .eraseblocks = { {4 * 1024, 8192} },
7394 .block_erase = spi_block_erase_20,
7395 /* could also use spi_block_erase_d7 */
7396 }, {
7397 .eraseblocks = { {32 * 1024, 1024} },
7398 .block_erase = spi_block_erase_5c,
7399 }, {
7400 .eraseblocks = { {32 * 1024, 1024} },
7401 .block_erase = spi_block_erase_52,
7402 }, {
7403 .eraseblocks = { {64 * 1024, 512} },
7404 .block_erase = spi_block_erase_dc,
7405 }, {
7406 .eraseblocks = { {64 * 1024, 512} },
7407 .block_erase = spi_block_erase_d8,
7408 }, {
7409 .eraseblocks = { {32 * 1024 * 1024, 1} },
7410 .block_erase = spi_block_erase_60,
7411 }, {
7412 .eraseblocks = { {32 * 1024 * 1024, 1} },
7413 .block_erase = spi_block_erase_c7,
7414 }
7415 },
7416 .unlock = spi_disable_blockprotect,
7417 .write = spi_chip_write_256,
7418 .read = spi_chip_read,
7419 .voltage = {2300, 3600},
7420 },
7421
7422 {
7423 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007424 .name = "IS25WP032",
7425 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007426 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007427 .model_id = ISSI_IS25WP032,
7428 .total_size = 4096,
7429 .page_size = 256,
7430 /* OTP: 1024B total; read 0x48; write 0x42 */
7431 /* QPI enable 0x35, disable 0xF5 */
7432 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7433 .tested = TEST_UNTESTED,
7434 .probe = probe_spi_rdid,
7435 .probe_timing = TIMING_ZERO,
7436 .block_erasers =
7437 {
7438 {
7439 .eraseblocks = { {4 * 1024, 1024} },
7440 .block_erase = spi_block_erase_20,
7441 }, {
7442 .eraseblocks = { {4 * 1024, 1024} },
7443 .block_erase = spi_block_erase_d7,
7444 }, {
7445 .eraseblocks = { {32 * 1024, 128} },
7446 .block_erase = spi_block_erase_52,
7447 }, {
7448 .eraseblocks = { {64 * 1024, 64} },
7449 .block_erase = spi_block_erase_d8,
7450 }, {
7451 .eraseblocks = { {4 * 1024 * 1024, 1} },
7452 .block_erase = spi_block_erase_60,
7453 }, {
7454 .eraseblocks = { {4 * 1024 * 1024, 1} },
7455 .block_erase = spi_block_erase_c7,
7456 }
7457 },
7458 .unlock = spi_disable_blockprotect,
7459 .write = spi_chip_write_256,
7460 .read = spi_chip_read,
7461 .voltage = {1650, 1950},
7462 },
7463
7464 {
7465 .vendor = "ISSI",
7466 .name = "IS25WP064",
7467 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007468 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007469 .model_id = ISSI_IS25WP064,
7470 .total_size = 8192,
7471 .page_size = 256,
7472 /* OTP: 1024B total; read 0x48; write 0x42 */
7473 /* QPI enable 0x35, disable 0xF5 */
7474 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7475 .tested = TEST_OK_PREW,
7476 .probe = probe_spi_rdid,
7477 .probe_timing = TIMING_ZERO,
7478 .block_erasers =
7479 {
7480 {
7481 .eraseblocks = { {4 * 1024, 2048} },
7482 .block_erase = spi_block_erase_20,
7483 }, {
7484 .eraseblocks = { {4 * 1024, 2048} },
7485 .block_erase = spi_block_erase_d7,
7486 }, {
7487 .eraseblocks = { {32 * 1024, 256} },
7488 .block_erase = spi_block_erase_52,
7489 }, {
7490 .eraseblocks = { {64 * 1024, 128} },
7491 .block_erase = spi_block_erase_d8,
7492 }, {
7493 .eraseblocks = { {8 * 1024 * 1024, 1} },
7494 .block_erase = spi_block_erase_60,
7495 }, {
7496 .eraseblocks = { {8 * 1024 * 1024, 1} },
7497 .block_erase = spi_block_erase_c7,
7498 }
7499 },
7500 .unlock = spi_disable_blockprotect,
7501 .write = spi_chip_write_256,
7502 .read = spi_chip_read,
7503 .voltage = {1650, 1950},
7504 },
7505
7506 {
7507 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007508 .name = "IS25WP128",
7509 .bustype = BUS_SPI,
7510 .manufacture_id = ISSI_ID_SPI,
7511 .model_id = ISSI_IS25WP128,
7512 .total_size = 16384,
7513 .page_size = 256,
7514 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huberb27b8d12018-10-02 20:46:21 +02007515 /* QPI enable 0x35, disable 0xF5 */
7516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks3083ed92017-05-02 13:25:56 -07007517 .tested = TEST_OK_PREW,
7518 .probe = probe_spi_rdid,
7519 .probe_timing = TIMING_ZERO,
7520 .block_erasers =
7521 {
7522 {
7523 .eraseblocks = { {4 * 1024, 4096} },
7524 .block_erase = spi_block_erase_20,
7525 }, {
7526 .eraseblocks = { {4 * 1024, 4096} },
7527 .block_erase = spi_block_erase_d7,
7528 }, {
7529 .eraseblocks = { {32 * 1024, 512} },
7530 .block_erase = spi_block_erase_52,
7531 }, {
7532 .eraseblocks = { {64 * 1024, 256} },
7533 .block_erase = spi_block_erase_d8,
7534 }, {
7535 .eraseblocks = { {16 * 1024 * 1024, 1} },
7536 .block_erase = spi_block_erase_60,
7537 }, {
7538 .eraseblocks = { {16 * 1024 * 1024, 1} },
7539 .block_erase = spi_block_erase_c7,
7540 }
7541 },
7542 .unlock = spi_disable_blockprotect,
7543 .write = spi_chip_write_256,
7544 .read = spi_chip_read,
7545 .voltage = {1650, 1950},
7546 },
7547
7548 {
7549 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007550 .name = "IS25WP256",
7551 .bustype = BUS_SPI,
7552 .manufacture_id = ISSI_ID_SPI,
7553 .model_id = ISSI_IS25WP256,
7554 .total_size = 32768,
7555 .page_size = 256,
7556 /* supports SFDP */
7557 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7558 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7560 .tested = TEST_OK_PREW,
7561 .probe = probe_spi_rdid,
7562 .probe_timing = TIMING_ZERO,
7563 .block_erasers =
7564 {
7565 {
7566 .eraseblocks = { {4 * 1024, 8192} },
7567 .block_erase = spi_block_erase_21,
7568 }, {
7569 .eraseblocks = { {4 * 1024, 8192} },
7570 .block_erase = spi_block_erase_20,
7571 /* could also use spi_block_erase_d7 */
7572 }, {
7573 .eraseblocks = { {32 * 1024, 1024} },
7574 .block_erase = spi_block_erase_5c,
7575 }, {
7576 .eraseblocks = { {32 * 1024, 1024} },
7577 .block_erase = spi_block_erase_52,
7578 }, {
7579 .eraseblocks = { {64 * 1024, 512} },
7580 .block_erase = spi_block_erase_dc,
7581 }, {
7582 .eraseblocks = { {64 * 1024, 512} },
7583 .block_erase = spi_block_erase_d8,
7584 }, {
7585 .eraseblocks = { {32 * 1024 * 1024, 1} },
7586 .block_erase = spi_block_erase_60,
7587 }, {
7588 .eraseblocks = { {32 * 1024 * 1024, 1} },
7589 .block_erase = spi_block_erase_c7,
7590 }
7591 },
7592 .unlock = spi_disable_blockprotect,
7593 .write = spi_chip_write_256,
7594 .read = spi_chip_read,
7595 .voltage = {1650, 1950},
7596 },
7597
7598 {
7599 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007600 .name = "IS29GL064B",
7601 .bustype = BUS_PARALLEL,
7602 .manufacture_id = ISSI_ID,
7603 .model_id = ISSI_PMC_IS29GL064B,
7604 .total_size = 8192,
7605 .page_size = 128 * 1024, /* actual page size is 16 */
7606 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7607 .tested = TEST_UNTESTED,
7608 .probe = probe_jedec_29gl,
7609 .probe_timing = TIMING_ZERO,
7610 .block_erasers =
7611 {
7612 {
7613 .eraseblocks = {
7614 {8 * 1024, 8},
7615 {64 * 1024, 127},
7616 },
7617 .block_erase = erase_sector_jedec,
7618 }, {
7619 .eraseblocks = { {8 * 1024 * 1024, 1} },
7620 .block_erase = erase_chip_block_jedec,
7621 },
7622 },
7623 .write = write_jedec_1,
7624 .read = read_memmapped,
7625 .voltage = {2700, 3600},
7626 },
7627
7628 {
7629 .vendor = "ISSI",
7630 .name = "IS29GL064T",
7631 .bustype = BUS_PARALLEL,
7632 .manufacture_id = ISSI_ID,
7633 .model_id = ISSI_PMC_IS29GL064T,
7634 .total_size = 8192,
7635 .page_size = 128 * 1024, /* actual page size is 16 */
7636 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7637 .tested = TEST_UNTESTED,
7638 .probe = probe_jedec_29gl,
7639 .probe_timing = TIMING_ZERO,
7640 .block_erasers =
7641 {
7642 {
7643 .eraseblocks = {
7644 {64 * 1024, 127},
7645 {8 * 1024, 8},
7646 },
7647 .block_erase = erase_sector_jedec,
7648 }, {
7649 .eraseblocks = { {8 * 1024 * 1024, 1} },
7650 .block_erase = erase_chip_block_jedec,
7651 },
7652 },
7653 .write = write_jedec_1,
7654 .read = read_memmapped,
7655 .voltage = {2700, 3600},
7656 },
7657
7658 {
7659 .vendor = "ISSI",
7660 .name = "IS29GL064H/L",
7661 .bustype = BUS_PARALLEL,
7662 .manufacture_id = ISSI_ID,
7663 .model_id = ISSI_PMC_IS29GL064HL,
7664 .total_size = 8192,
7665 .page_size = 128 * 1024, /* actual page size is 16 */
7666 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7667 .tested = TEST_UNTESTED,
7668 .probe = probe_jedec_29gl,
7669 .probe_timing = TIMING_ZERO,
7670 .block_erasers =
7671 {
7672 {
7673 .eraseblocks = { {64 * 1024, 128} },
7674 .block_erase = erase_sector_jedec,
7675 }, {
7676 .eraseblocks = { {8 * 1024 * 1024, 1} },
7677 .block_erase = erase_chip_block_jedec,
7678 },
7679 },
7680 .write = write_jedec_1,
7681 .read = read_memmapped,
7682 .voltage = {2700, 3600},
7683 },
7684
7685 {
7686 .vendor = "ISSI",
7687 .name = "IS29GL128H/L",
7688 .bustype = BUS_PARALLEL,
7689 .manufacture_id = ISSI_ID,
7690 .model_id = ISSI_PMC_IS29GL128HL,
7691 .total_size = 16384,
7692 .page_size = 128 * 1024, /* actual page size is 16 */
7693 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7694 .tested = TEST_UNTESTED,
7695 .probe = probe_jedec_29gl,
7696 .probe_timing = TIMING_ZERO,
7697 .block_erasers =
7698 {
7699 {
7700 .eraseblocks = { {128 * 1024, 128} },
7701 .block_erase = erase_sector_jedec,
7702 }, {
7703 .eraseblocks = { {16 * 1024 * 1024, 1} },
7704 .block_erase = erase_chip_block_jedec,
7705 },
7706 },
7707 .write = write_jedec_1,
7708 .read = read_memmapped,
7709 .voltage = {2700, 3600},
7710 },
7711
7712 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007713 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007714 .name = "MX23L1654",
7715 .bustype = BUS_SPI,
7716 .manufacture_id = MACRONIX_ID,
7717 .model_id = MACRONIX_MX23L1654,
7718 .total_size = 2048,
7719 .page_size = 256,
7720 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7721 .probe = probe_spi_rdid,
7722 .probe_timing = TIMING_ZERO,
7723 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7724 .read = spi_chip_read, /* Fast read (0x0B) supported */
7725 .voltage = {3000, 3600},
7726 },
7727
7728 {
7729 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007730 .name = "MX23L3254",
7731 .bustype = BUS_SPI,
7732 .manufacture_id = MACRONIX_ID,
7733 .model_id = MACRONIX_MX23L3254,
7734 .total_size = 4096,
7735 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00007736 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007737 .probe = probe_spi_rdid,
7738 .probe_timing = TIMING_ZERO,
7739 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7740 .read = spi_chip_read, /* Fast read (0x0B) supported */
7741 .voltage = {3000, 3600},
7742 },
7743
7744 {
7745 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007746 .name = "MX23L6454",
7747 .bustype = BUS_SPI,
7748 .manufacture_id = MACRONIX_ID,
7749 .model_id = MACRONIX_MX23L6454,
7750 .total_size = 8192,
7751 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007752 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00007753 .probe = probe_spi_rdid,
7754 .probe_timing = TIMING_ZERO,
7755 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7756 .read = spi_chip_read, /* Fast read (0x0B) supported */
7757 .voltage = {3000, 3600},
7758 },
7759
7760 {
7761 .vendor = "Macronix",
7762 .name = "MX23L12854",
7763 .bustype = BUS_SPI,
7764 .manufacture_id = MACRONIX_ID,
7765 .model_id = MACRONIX_MX23L12854,
7766 .total_size = 16384,
7767 .page_size = 256,
7768 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7769 .probe = probe_spi_rdid,
7770 .probe_timing = TIMING_ZERO,
7771 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7772 .read = spi_chip_read, /* Fast read (0x0B) supported */
7773 .voltage = {3000, 3600},
7774 },
7775
7776 {
7777 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007778 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007779 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007780 .manufacture_id = MACRONIX_ID,
7781 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007782 .total_size = 64,
7783 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007784 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007785 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007786 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007787 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007788 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007789 .block_erasers =
7790 {
7791 {
7792 .eraseblocks = { {4 * 1024, 16} },
7793 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007794 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007795 .eraseblocks = { {64 * 1024, 1} },
7796 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007797 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007798 .eraseblocks = { {64 * 1024, 1} },
7799 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007800 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007801 .eraseblocks = { {64 * 1024, 1} },
7802 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007803 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007804 .eraseblocks = { {64 * 1024, 1} },
7805 .block_erase = spi_block_erase_c7,
7806 },
7807 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007808 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007809 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007810 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007811 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
7812 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00007813 },
7814
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007815 {
7816 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007817 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007818 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007819 .manufacture_id = MACRONIX_ID,
7820 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007821 .total_size = 128,
7822 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007823 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007824 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00007825 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007826 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007827 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007828 .block_erasers =
7829 {
7830 {
7831 .eraseblocks = { {4 * 1024, 32} },
7832 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007833 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007834 .eraseblocks = { {64 * 1024, 2} },
7835 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007836 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007837 .eraseblocks = { {128 * 1024, 1} },
7838 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007839 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007840 .eraseblocks = { {128 * 1024, 1} },
7841 .block_erase = spi_block_erase_c7,
7842 },
7843 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007844 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007845 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007846 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007847 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007848 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007849 },
7850
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007851 {
7852 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007853 .name = "MX25L2005(C)/MX25L2006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007854 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007855 .manufacture_id = MACRONIX_ID,
7856 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007857 .total_size = 256,
7858 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007859 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007860 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007861 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007862 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007863 .block_erasers =
7864 {
7865 {
7866 .eraseblocks = { {4 * 1024, 64} },
7867 .block_erase = spi_block_erase_20,
7868 }, {
7869 .eraseblocks = { {64 * 1024, 4} },
7870 .block_erase = spi_block_erase_52,
7871 }, {
7872 .eraseblocks = { {64 * 1024, 4} },
7873 .block_erase = spi_block_erase_d8,
7874 }, {
7875 .eraseblocks = { {256 * 1024, 1} },
7876 .block_erase = spi_block_erase_60,
7877 }, {
7878 .eraseblocks = { {256 * 1024, 1} },
7879 .block_erase = spi_block_erase_c7,
7880 },
7881 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007882 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007883 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007884 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007885 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007886 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007887 },
7888
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007889 {
7890 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007891 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007892 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007893 .manufacture_id = MACRONIX_ID,
7894 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007895 .total_size = 512,
7896 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007897 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00007898 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007899 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007900 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007901 .block_erasers =
7902 {
7903 {
7904 .eraseblocks = { {4 * 1024, 128} },
7905 .block_erase = spi_block_erase_20,
7906 }, {
7907 .eraseblocks = { {64 * 1024, 8} },
7908 .block_erase = spi_block_erase_52,
7909 }, {
7910 .eraseblocks = { {64 * 1024, 8} },
7911 .block_erase = spi_block_erase_d8,
7912 }, {
7913 .eraseblocks = { {512 * 1024, 1} },
7914 .block_erase = spi_block_erase_60,
7915 }, {
7916 .eraseblocks = { {512 * 1024, 1} },
7917 .block_erase = spi_block_erase_c7,
7918 },
7919 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007920 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007921 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007922 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007923 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007924 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007925 },
7926
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007927 {
7928 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007929 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007930 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007931 .manufacture_id = MACRONIX_ID,
7932 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007933 .total_size = 1024,
7934 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007935 /* MX25L8006E, MX25L8008E support SFDP */
7936 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
David Hendricks67db2eb2010-09-03 03:35:48 +00007937 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00007938 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007939 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007940 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007941 .block_erasers =
7942 {
7943 {
7944 .eraseblocks = { {4 * 1024, 256} },
7945 .block_erase = spi_block_erase_20,
7946 }, {
7947 .eraseblocks = { {64 * 1024, 16} },
7948 .block_erase = spi_block_erase_52,
7949 }, {
7950 .eraseblocks = { {64 * 1024, 16} },
7951 .block_erase = spi_block_erase_d8,
7952 }, {
7953 .eraseblocks = { {1024 * 1024, 1} },
7954 .block_erase = spi_block_erase_60,
7955 }, {
7956 .eraseblocks = { {1024 * 1024, 1} },
7957 .block_erase = spi_block_erase_c7,
7958 },
7959 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007960 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007961 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007962 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007963 .read = spi_chip_read, /* Fast read (0x0B) supported */
7964 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00007965 },
7966
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007967 {
7968 .vendor = "Macronix",
7969 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007970 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007971 .manufacture_id = MACRONIX_ID,
7972 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007973 .total_size = 2048,
7974 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007975 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00007976 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007977 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007978 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007979 .block_erasers =
7980 {
7981 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007982 .eraseblocks = { {64 * 1024, 32} },
7983 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007984 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007985 .eraseblocks = { {64 * 1024, 32} },
7986 .block_erase = spi_block_erase_d8,
7987 }, {
7988 .eraseblocks = { {2 * 1024 * 1024, 1} },
7989 .block_erase = spi_block_erase_60,
7990 }, {
7991 .eraseblocks = { {2 * 1024 * 1024, 1} },
7992 .block_erase = spi_block_erase_c7,
7993 },
7994 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007995 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00007996 .unlock = spi_disable_blockprotect,
7997 .write = spi_chip_write_256,
7998 .read = spi_chip_read, /* Fast read (0x0B) supported */
7999 .voltage = {2700, 3600},
8000 },
8001
8002 {
8003 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008004 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008005 .bustype = BUS_SPI,
8006 .manufacture_id = MACRONIX_ID,
8007 .model_id = MACRONIX_MX25L1605,
8008 .total_size = 2048,
8009 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008010 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008011 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8012 .tested = TEST_OK_PREW,
8013 .probe = probe_spi_rdid,
8014 .probe_timing = TIMING_ZERO,
8015 .block_erasers =
8016 {
8017 {
8018 .eraseblocks = { {4 * 1024, 512} },
8019 .block_erase = spi_block_erase_20,
8020 }, {
8021 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008022 .block_erase = spi_block_erase_52,
8023 }, {
8024 .eraseblocks = { {64 * 1024, 32} },
8025 .block_erase = spi_block_erase_d8,
8026 }, {
8027 .eraseblocks = { {2 * 1024 * 1024, 1} },
8028 .block_erase = spi_block_erase_60,
8029 }, {
8030 .eraseblocks = { {2 * 1024 * 1024, 1} },
8031 .block_erase = spi_block_erase_c7,
8032 },
8033 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008034 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008035 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008036 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008037 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008038 .voltage = {2700, 3600},
8039 },
8040
8041 {
8042 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008043 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008044 .bustype = BUS_SPI,
8045 .manufacture_id = MACRONIX_ID,
8046 .model_id = MACRONIX_MX25L1605,
8047 .total_size = 2048,
8048 .page_size = 256,
8049 .feature_bits = FEATURE_WRSR_WREN,
8050 .tested = TEST_OK_PREW,
8051 .probe = probe_spi_rdid,
8052 .probe_timing = TIMING_ZERO,
8053 .block_erasers =
8054 {
8055 {
8056 .eraseblocks = { {4 * 1024, 512} },
8057 .block_erase = spi_block_erase_20,
8058 }, {
8059 .eraseblocks = { {64 * 1024, 32} },
8060 .block_erase = spi_block_erase_d8,
8061 }, {
8062 .eraseblocks = { {2 * 1024 * 1024, 1} },
8063 .block_erase = spi_block_erase_60,
8064 }, {
8065 .eraseblocks = { {2 * 1024 * 1024, 1} },
8066 .block_erase = spi_block_erase_c7,
8067 },
8068 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008069 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008070 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008071 .write = spi_chip_write_256,
8072 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008073 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008074 },
8075
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008076 {
8077 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008078 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008079 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008080 .manufacture_id = MACRONIX_ID,
8081 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008082 .total_size = 2048,
8083 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008084 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8085 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008086 .tested = TEST_UNTESTED,
8087 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008088 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008089 .block_erasers =
8090 {
8091 {
8092 .eraseblocks = { {4 * 1024, 512} },
8093 .block_erase = spi_block_erase_20,
8094 }, {
8095 .eraseblocks = { {64 * 1024, 32} },
8096 .block_erase = spi_block_erase_d8,
8097 }, {
8098 .eraseblocks = { {2 * 1024 * 1024, 1} },
8099 .block_erase = spi_block_erase_60,
8100 }, {
8101 .eraseblocks = { {2 * 1024 * 1024, 1} },
8102 .block_erase = spi_block_erase_c7,
8103 }
8104 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008105 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008106 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008107 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008108 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008109 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008110 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00008111
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008112 {
8113 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00008114 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008115 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008116 .manufacture_id = MACRONIX_ID,
8117 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008118 .total_size = 2048,
8119 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008120 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8121 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008122 .tested = TEST_UNTESTED,
8123 .probe = probe_spi_rdid,
8124 .probe_timing = TIMING_ZERO,
8125 .block_erasers =
8126 {
8127 {
8128 .eraseblocks = { {4 * 1024, 512} },
8129 .block_erase = spi_block_erase_20,
8130 }, {
8131 .eraseblocks = { {64 * 1024, 32} },
8132 .block_erase = spi_block_erase_d8,
8133 }, {
8134 .eraseblocks = { {2 * 1024 * 1024, 1} },
8135 .block_erase = spi_block_erase_60,
8136 }, {
8137 .eraseblocks = { {2 * 1024 * 1024, 1} },
8138 .block_erase = spi_block_erase_c7,
8139 }
8140 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008141 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008142 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008143 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008144 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008145 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00008146 },
8147
8148 {
8149 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00008150 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008151 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008152 .manufacture_id = MACRONIX_ID,
8153 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008154 .total_size = 4096,
8155 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008156 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00008157 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008158 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008159 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008160 .block_erasers =
8161 {
8162 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008163 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008164 .block_erase = spi_block_erase_20,
8165 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008166 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008167 .block_erase = spi_block_erase_d8,
8168 }, {
8169 .eraseblocks = { {4 * 1024 * 1024, 1} },
8170 .block_erase = spi_block_erase_60,
8171 }, {
8172 .eraseblocks = { {4 * 1024 * 1024, 1} },
8173 .block_erase = spi_block_erase_c7,
8174 },
8175 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008176 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008177 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008178 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008179 .read = spi_chip_read, /* Fast read (0x0B) supported */
8180 .voltage = {2700, 3600},
8181 },
8182
8183 {
8184 .vendor = "Macronix",
8185 .name = "MX25L3205D/MX25L3208D",
8186 .bustype = BUS_SPI,
8187 .manufacture_id = MACRONIX_ID,
8188 .model_id = MACRONIX_MX25L3205,
8189 .total_size = 4096,
8190 .page_size = 256,
8191 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8192 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8193 .tested = TEST_OK_PREW,
8194 .probe = probe_spi_rdid,
8195 .probe_timing = TIMING_ZERO,
8196 .block_erasers =
8197 {
8198 {
8199 .eraseblocks = { {4 * 1024, 1024} },
8200 .block_erase = spi_block_erase_20,
8201 }, {
8202 .eraseblocks = { {64 * 1024, 64} },
8203 .block_erase = spi_block_erase_d8,
8204 }, {
8205 .eraseblocks = { {4 * 1024 * 1024, 1} },
8206 .block_erase = spi_block_erase_60,
8207 }, {
8208 .eraseblocks = { {4 * 1024 * 1024, 1} },
8209 .block_erase = spi_block_erase_c7,
8210 },
8211 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008212 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008213 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008214 .write = spi_chip_write_256,
8215 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8216 .voltage = {2700, 3600},
8217 },
8218
8219 {
8220 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008221 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008222 .bustype = BUS_SPI,
8223 .manufacture_id = MACRONIX_ID,
8224 .model_id = MACRONIX_MX25L3205,
8225 .total_size = 4096,
8226 .page_size = 256,
8227 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8228 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8229 .tested = TEST_OK_PREW,
8230 .probe = probe_spi_rdid,
8231 .probe_timing = TIMING_ZERO,
8232 .block_erasers =
8233 {
8234 {
8235 .eraseblocks = { {4 * 1024, 1024} },
8236 .block_erase = spi_block_erase_20,
8237 }, {
8238 .eraseblocks = { {64 * 1024, 64} },
8239 .block_erase = spi_block_erase_d8,
8240 }, {
8241 .eraseblocks = { {64 * 1024, 64} },
8242 .block_erase = spi_block_erase_52,
8243 }, {
8244 .eraseblocks = { {4 * 1024 * 1024, 1} },
8245 .block_erase = spi_block_erase_60,
8246 }, {
8247 .eraseblocks = { {4 * 1024 * 1024, 1} },
8248 .block_erase = spi_block_erase_c7,
8249 },
8250 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008251 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008252 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008253 .write = spi_chip_write_256,
8254 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008255 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008256 },
8257
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008258 {
8259 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008260 .name = "MX25L3273E",
8261 .bustype = BUS_SPI,
8262 .manufacture_id = MACRONIX_ID,
8263 .model_id = MACRONIX_MX25L3205,
8264 .total_size = 4096,
8265 .page_size = 256,
8266 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8267 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008268 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008269 .probe = probe_spi_rdid,
8270 .probe_timing = TIMING_ZERO,
8271 .block_erasers =
8272 {
8273 {
8274 .eraseblocks = { {4 * 1024, 1024} },
8275 .block_erase = spi_block_erase_20,
8276 }, {
8277 .eraseblocks = { {32 * 1024, 128} },
8278 .block_erase = spi_block_erase_52,
8279 }, {
8280 .eraseblocks = { {64 * 1024, 64} },
8281 .block_erase = spi_block_erase_d8,
8282 }, {
8283 .eraseblocks = { {4 * 1024 * 1024, 1} },
8284 .block_erase = spi_block_erase_60,
8285 }, {
8286 .eraseblocks = { {4 * 1024 * 1024, 1} },
8287 .block_erase = spi_block_erase_c7,
8288 },
8289 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008290 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008291 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008292 .write = spi_chip_write_256,
8293 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8294 .voltage = {2700, 3600},
8295 },
8296
8297 {
8298 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008299 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008300 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008301 .manufacture_id = MACRONIX_ID,
8302 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008303 .total_size = 4096,
8304 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008305 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
8306 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008307 .tested = TEST_UNTESTED,
8308 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008309 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008310 .block_erasers =
8311 {
8312 {
8313 .eraseblocks = { {4 * 1024, 1024} },
8314 .block_erase = spi_block_erase_20,
8315 }, {
8316 .eraseblocks = { {64 * 1024, 64} },
8317 .block_erase = spi_block_erase_d8,
8318 }, {
8319 .eraseblocks = { {4 * 1024 * 1024, 1} },
8320 .block_erase = spi_block_erase_60,
8321 }, {
8322 .eraseblocks = { {4 * 1024 * 1024, 1} },
8323 .block_erase = spi_block_erase_c7,
8324 }
8325 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008326 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008327 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008328 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008329 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008330 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008331 },
8332
8333 {
8334 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008335 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008336 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008337 .manufacture_id = MACRONIX_ID,
8338 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008339 .total_size = 8192,
8340 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008341 /* Has an additional 512B EEPROM sector */
8342 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00008343 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008344 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008345 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008346 .block_erasers =
8347 {
8348 {
8349 .eraseblocks = { {64 * 1024, 128} },
8350 .block_erase = spi_block_erase_20,
8351 }, {
8352 .eraseblocks = { {64 * 1024, 128} },
8353 .block_erase = spi_block_erase_d8,
8354 }, {
8355 .eraseblocks = { {8 * 1024 * 1024, 1} },
8356 .block_erase = spi_block_erase_60,
8357 }, {
8358 .eraseblocks = { {8 * 1024 * 1024, 1} },
8359 .block_erase = spi_block_erase_c7,
8360 }
8361 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008362 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008363 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008364 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008365 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008366 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008367 },
8368
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008369 {
8370 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008371 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00008372 .bustype = BUS_SPI,
8373 .manufacture_id = MACRONIX_ID,
8374 .model_id = MACRONIX_MX25L6405,
8375 .total_size = 8192,
8376 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008377 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008378 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8379 .tested = TEST_OK_PREW,
8380 .probe = probe_spi_rdid,
8381 .probe_timing = TIMING_ZERO,
8382 .block_erasers =
8383 {
8384 {
8385 .eraseblocks = { {4 * 1024, 2048} },
8386 .block_erase = spi_block_erase_20,
8387 }, {
8388 .eraseblocks = { {64 * 1024, 128} },
8389 .block_erase = spi_block_erase_d8,
8390 }, {
8391 .eraseblocks = { {8 * 1024 * 1024, 1} },
8392 .block_erase = spi_block_erase_60,
8393 }, {
8394 .eraseblocks = { {8 * 1024 * 1024, 1} },
8395 .block_erase = spi_block_erase_c7,
8396 }
8397 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008398 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008399 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008400 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008401 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00008402 .voltage = {2700, 3600},
8403 },
8404
8405 {
8406 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008407 .name = "MX25L6406E/MX25L6408E",
8408 .bustype = BUS_SPI,
8409 .manufacture_id = MACRONIX_ID,
8410 .model_id = MACRONIX_MX25L6405,
8411 .total_size = 8192,
8412 .page_size = 256,
8413 /* MX25L6406E supports SFDP */
8414 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
8415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8416 .tested = TEST_OK_PREW,
8417 .probe = probe_spi_rdid,
8418 .probe_timing = TIMING_ZERO,
8419 .block_erasers =
8420 {
8421 {
8422 .eraseblocks = { {4 * 1024, 2048} },
8423 .block_erase = spi_block_erase_20,
8424 }, {
8425 .eraseblocks = { {64 * 1024, 128} },
8426 .block_erase = spi_block_erase_52,
8427 }, {
8428 .eraseblocks = { {64 * 1024, 128} },
8429 .block_erase = spi_block_erase_d8,
8430 }, {
8431 .eraseblocks = { {8 * 1024 * 1024, 1} },
8432 .block_erase = spi_block_erase_60,
8433 }, {
8434 .eraseblocks = { {8 * 1024 * 1024, 1} },
8435 .block_erase = spi_block_erase_c7,
8436 }
8437 },
8438 .printlock = spi_prettyprint_status_register_bp3_srwd,
8439 .unlock = spi_disable_blockprotect_bp3_srwd,
8440 .write = spi_chip_write_256,
8441 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
8442 .voltage = {2700, 3600},
8443 },
8444
8445 {
8446 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01008447 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00008448 .bustype = BUS_SPI,
8449 .manufacture_id = MACRONIX_ID,
8450 .model_id = MACRONIX_MX25L6405,
8451 .total_size = 8192,
8452 .page_size = 256,
8453 /* supports SFDP */
8454 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8455 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8456 .tested = TEST_OK_PREW,
8457 .probe = probe_spi_rdid,
8458 .probe_timing = TIMING_ZERO,
8459 .block_erasers =
8460 {
8461 {
8462 .eraseblocks = { {4 * 1024, 2048} },
8463 .block_erase = spi_block_erase_20,
8464 }, {
8465 .eraseblocks = { {32 * 1024, 256} },
8466 .block_erase = spi_block_erase_52,
8467 }, {
8468 .eraseblocks = { {64 * 1024, 128} },
8469 .block_erase = spi_block_erase_d8,
8470 }, {
8471 .eraseblocks = { {8 * 1024 * 1024, 1} },
8472 .block_erase = spi_block_erase_60,
8473 }, {
8474 .eraseblocks = { {8 * 1024 * 1024, 1} },
8475 .block_erase = spi_block_erase_c7,
8476 }
8477 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008478 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008479 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008480 .write = spi_chip_write_256,
8481 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8482 .voltage = {2700, 3600},
8483 },
8484
8485 {
8486 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00008487 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008488 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008489 .manufacture_id = MACRONIX_ID,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008490 .model_id = MACRONIX_MX25L12805D,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008491 .total_size = 16384,
8492 .page_size = 256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008493 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00008495 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008496 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008497 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008498 .block_erasers =
8499 {
8500 {
8501 .eraseblocks = { {4 * 1024, 4096} },
8502 .block_erase = spi_block_erase_20,
8503 }, {
8504 .eraseblocks = { {64 * 1024, 256} },
8505 .block_erase = spi_block_erase_d8,
8506 }, {
8507 .eraseblocks = { {16 * 1024 * 1024, 1} },
8508 .block_erase = spi_block_erase_60,
8509 }, {
8510 .eraseblocks = { {16 * 1024 * 1024, 1} },
8511 .block_erase = spi_block_erase_c7,
8512 }
8513 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008514 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008515 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008516 .write = spi_chip_write_256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008517 .read = spi_chip_read, /* Fast read (0x0B) supported */
8518 .voltage = {2700, 3600},
8519 },
8520
8521 {
8522 .vendor = "Macronix",
8523 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8524 .bustype = BUS_SPI,
8525 .manufacture_id = MACRONIX_ID,
8526 .model_id = MACRONIX_MX25L12805D,
8527 .total_size = 16384,
8528 .page_size = 256,
8529 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8531 .tested = TEST_OK_PREW,
8532 .probe = probe_spi_rdid,
8533 .probe_timing = TIMING_ZERO,
8534 .block_erasers =
8535 {
8536 {
8537 .eraseblocks = { {4 * 1024, 4096} },
8538 .block_erase = spi_block_erase_20,
8539 }, {
8540 .eraseblocks = { {32 * 1024, 512} },
8541 .block_erase = spi_block_erase_52,
8542 }, {
8543 .eraseblocks = { {64 * 1024, 256} },
8544 .block_erase = spi_block_erase_d8,
8545 }, {
8546 .eraseblocks = { {16 * 1024 * 1024, 1} },
8547 .block_erase = spi_block_erase_60,
8548 }, {
8549 .eraseblocks = { {16 * 1024 * 1024, 1} },
8550 .block_erase = spi_block_erase_c7,
8551 }
8552 },
8553 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8554 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8555 .unlock = spi_disable_blockprotect_bp3_srwd,
8556 .write = spi_chip_write_256,
8557 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008558 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008559 },
8560
8561 {
8562 .vendor = "Macronix",
Nico Huberaac81422017-11-10 22:54:13 +01008563 .name = "MX25L25635F",
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008564 .bustype = BUS_SPI,
8565 .manufacture_id = MACRONIX_ID,
8566 .model_id = MACRONIX_MX25L25635F,
8567 .total_size = 32768,
8568 .page_size = 256,
8569 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008570 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Kasper Revsbechf56607e2018-10-19 23:59:17 +02008571 .tested = TEST_OK_PREW,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008572 .probe = probe_spi_rdid,
8573 .probe_timing = TIMING_ZERO,
8574 .block_erasers =
8575 {
8576 {
8577 .eraseblocks = { {4 * 1024, 8192} },
Nico Huberaac81422017-11-10 22:54:13 +01008578 .block_erase = spi_block_erase_21,
8579 }, {
8580 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +02008581 .block_erase = spi_block_erase_20,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008582 }, {
8583 .eraseblocks = { {32 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008584 .block_erase = spi_block_erase_5c,
8585 }, {
8586 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008587 .block_erase = spi_block_erase_52,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008588 }, {
8589 .eraseblocks = { {64 * 1024, 512} },
Nico Huberaac81422017-11-10 22:54:13 +01008590 .block_erase = spi_block_erase_dc,
8591 }, {
8592 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +02008593 .block_erase = spi_block_erase_d8,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008594 }, {
8595 .eraseblocks = { {32 * 1024 * 1024, 1} },
8596 .block_erase = spi_block_erase_60,
8597 }, {
8598 .eraseblocks = { {32 * 1024 * 1024, 1} },
8599 .block_erase = spi_block_erase_c7,
8600 }
8601 },
8602 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8603 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8604 .unlock = spi_disable_blockprotect_bp3_srwd,
8605 .write = spi_chip_write_256,
8606 .read = spi_chip_read, /* Fast read (0x0B) supported */
8607 .voltage = {2700, 3600},
8608 },
8609
8610 {
8611 .vendor = "Macronix",
Timothy Pearsone29591d2016-08-27 15:43:00 -05008612 .name = "MX66L51235F",
8613 .bustype = BUS_SPI,
8614 .manufacture_id = MACRONIX_ID,
8615 .model_id = MACRONIX_MX66L51235F,
8616 .total_size = 65536,
8617 .page_size = 256,
8618 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008619 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Angel Pons09dddd82018-09-30 19:23:43 +02008620 .tested = TEST_OK_PREW,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008621 .probe = probe_spi_rdid,
8622 .probe_timing = TIMING_ZERO,
8623 .block_erasers =
8624 {
8625 {
8626 .eraseblocks = { {4 * 1024, 16384} },
Nico Huberaac81422017-11-10 22:54:13 +01008627 .block_erase = spi_block_erase_21,
8628 }, {
8629 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7a077222017-10-14 18:18:30 +02008630 .block_erase = spi_block_erase_20,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008631 }, {
8632 .eraseblocks = { {32 * 1024, 2048} },
Nico Huberaac81422017-11-10 22:54:13 +01008633 .block_erase = spi_block_erase_5c,
8634 }, {
8635 .eraseblocks = { {32 * 1024, 2048} },
Nico Huber7a077222017-10-14 18:18:30 +02008636 .block_erase = spi_block_erase_52,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008637 }, {
8638 .eraseblocks = { {64 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008639 .block_erase = spi_block_erase_dc,
8640 }, {
8641 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008642 .block_erase = spi_block_erase_d8,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008643 }, {
8644 .eraseblocks = { {64 * 1024 * 1024, 1} },
8645 .block_erase = spi_block_erase_60,
8646 }, {
8647 .eraseblocks = { {64 * 1024 * 1024, 1} },
8648 .block_erase = spi_block_erase_c7,
8649 }
8650 },
8651 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8652 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8653 .unlock = spi_disable_blockprotect_bp3_srwd,
8654 .write = spi_chip_write_256,
8655 .read = spi_chip_read, /* Fast read (0x0B) supported */
8656 .voltage = {2700, 3600},
8657 },
8658
8659 {
8660 .vendor = "Macronix",
Angel Ponsf112e242018-09-30 20:14:17 +02008661 .name = "MX25U8032E",
8662 .bustype = BUS_SPI,
8663 .manufacture_id = MACRONIX_ID,
8664 .model_id = MACRONIX_MX25U8032E,
8665 .total_size = 1024,
8666 .page_size = 256,
8667 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8668 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8669 .tested = TEST_OK_PREW,
8670 .probe = probe_spi_rdid,
8671 .probe_timing = TIMING_ZERO,
8672 .block_erasers =
8673 {
8674 {
8675 .eraseblocks = { {4 * 1024, 256} },
8676 .block_erase = spi_block_erase_20,
8677 }, {
8678 .eraseblocks = { {32 * 1024, 32} },
8679 .block_erase = spi_block_erase_52,
8680 }, {
8681 .eraseblocks = { {64 * 1024, 16} },
8682 .block_erase = spi_block_erase_d8,
8683 }, {
8684 .eraseblocks = { {1024 * 1024, 1} },
8685 .block_erase = spi_block_erase_60,
8686 }, {
8687 .eraseblocks = { {1024 * 1024, 1} },
8688 .block_erase = spi_block_erase_c7,
8689 }
8690 },
8691 /* TODO: security register */
8692 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8693 .unlock = spi_disable_blockprotect_bp3_srwd,
8694 .write = spi_chip_write_256,
8695 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8696 .voltage = {1650, 2000},
8697 },
8698
8699 {
8700 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00008701 .name = "MX25U1635E",
8702 .bustype = BUS_SPI,
8703 .manufacture_id = MACRONIX_ID,
8704 .model_id = MACRONIX_MX25U1635E,
8705 .total_size = 2048,
8706 .page_size = 256,
8707 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8708 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8709 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008710 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00008711 .probe = probe_spi_rdid,
8712 .probe_timing = TIMING_ZERO,
8713 .block_erasers =
8714 {
8715 {
8716 .eraseblocks = { {4 * 1024, 512} },
8717 .block_erase = spi_block_erase_20,
8718 }, {
8719 .eraseblocks = { {32 * 1024, 64} },
8720 .block_erase = spi_block_erase_52,
8721 }, {
8722 .eraseblocks = { {64 * 1024, 32} },
8723 .block_erase = spi_block_erase_d8,
8724 }, {
8725 .eraseblocks = { {2 * 1024 * 1024, 1} },
8726 .block_erase = spi_block_erase_60,
8727 }, {
8728 .eraseblocks = { {2 * 1024 * 1024, 1} },
8729 .block_erase = spi_block_erase_c7,
8730 }
8731 },
8732 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008733 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008734 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008735 .write = spi_chip_write_256,
8736 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8737 .voltage = {1650, 2000},
8738 },
8739
8740 {
8741 .vendor = "Macronix",
8742 .name = "MX25U3235E/F",
8743 .bustype = BUS_SPI,
8744 .manufacture_id = MACRONIX_ID,
8745 .model_id = MACRONIX_MX25U3235E,
8746 .total_size = 4096,
8747 .page_size = 256,
8748 /* F model supports SFDP */
8749 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8750 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8751 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8752 .tested = TEST_OK_PREW,
8753 .probe = probe_spi_rdid,
8754 .probe_timing = TIMING_ZERO,
8755 .block_erasers =
8756 {
8757 {
8758 .eraseblocks = { {4 * 1024, 1024} },
8759 .block_erase = spi_block_erase_20,
8760 }, {
8761 .eraseblocks = { {32 * 1024, 128} },
8762 .block_erase = spi_block_erase_52,
8763 }, {
8764 .eraseblocks = { {64 * 1024, 64} },
8765 .block_erase = spi_block_erase_d8,
8766 }, {
8767 .eraseblocks = { {4 * 1024 * 1024, 1} },
8768 .block_erase = spi_block_erase_60,
8769 }, {
8770 .eraseblocks = { {4 * 1024 * 1024, 1} },
8771 .block_erase = spi_block_erase_c7,
8772 }
8773 },
8774 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008775 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008776 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008777 .write = spi_chip_write_256,
8778 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8779 .voltage = {1650, 2000},
8780 },
8781
8782 {
8783 .vendor = "Macronix",
8784 .name = "MX25U6435E/F",
8785 .bustype = BUS_SPI,
8786 .manufacture_id = MACRONIX_ID,
8787 .model_id = MACRONIX_MX25U6435E,
8788 .total_size = 8192,
8789 .page_size = 256,
8790 /* F model supports SFDP */
8791 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8792 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8793 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008794 .tested = TEST_OK_PREW,
Vincent Palatinf800f552013-03-15 02:03:16 +00008795 .probe = probe_spi_rdid,
8796 .probe_timing = TIMING_ZERO,
8797 .block_erasers =
8798 {
8799 {
8800 .eraseblocks = { {4 * 1024, 2048} },
8801 .block_erase = spi_block_erase_20,
8802 }, {
8803 .eraseblocks = { {32 * 1024, 256} },
8804 .block_erase = spi_block_erase_52,
8805 }, {
8806 .eraseblocks = { {64 * 1024, 128} },
8807 .block_erase = spi_block_erase_d8,
8808 }, {
8809 .eraseblocks = { {8 * 1024 * 1024, 1} },
8810 .block_erase = spi_block_erase_60,
8811 }, {
8812 .eraseblocks = { {8 * 1024 * 1024, 1} },
8813 .block_erase = spi_block_erase_c7,
8814 }
8815 },
8816 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008817 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008818 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008819 .write = spi_chip_write_256,
8820 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8821 .voltage = {1650, 2000},
8822 },
8823
8824 {
8825 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00008826 .name = "MX25U12835F",
8827 .bustype = BUS_SPI,
8828 .manufacture_id = MACRONIX_ID,
8829 .model_id = MACRONIX_MX25U12835E,
8830 .total_size = 16384,
8831 .page_size = 256,
8832 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8833 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Angel Pons471da832018-09-30 17:29:48 +02008834 .tested = TEST_OK_PREW,
Martin Roth440057a2014-07-13 00:05:07 +00008835 .probe = probe_spi_rdid,
8836 .probe_timing = TIMING_ZERO,
8837 .block_erasers =
8838 {
8839 {
8840 .eraseblocks = { {4 * 1024, 4096} },
8841 .block_erase = spi_block_erase_20,
8842 }, {
8843 .eraseblocks = { {32 * 1024, 512} },
8844 .block_erase = spi_block_erase_52,
8845 }, {
8846 .eraseblocks = { {64 * 1024, 256} },
8847 .block_erase = spi_block_erase_d8,
8848 }, {
8849 .eraseblocks = { {16 * 1024 * 1024, 1} },
8850 .block_erase = spi_block_erase_60,
8851 }, {
8852 .eraseblocks = { {16 * 1024 * 1024, 1} },
8853 .block_erase = spi_block_erase_c7,
8854 }
8855 },
8856 /* TODO: security register */
8857 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8858 .unlock = spi_disable_blockprotect_bp3_srwd,
8859 .write = spi_chip_write_256, /* Multi I/O supported */
8860 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8861 .voltage = {1650, 2000},
8862 },
8863
8864 {
Stefan Taunera4617f72015-01-10 15:59:54 +00008865 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07008866 .name = "MX25U25635F",
8867 .bustype = BUS_SPI,
8868 .manufacture_id = MACRONIX_ID,
8869 .model_id = MACRONIX_MX25U25635F,
8870 .total_size = 32768,
8871 .page_size = 256,
8872 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8873 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8874 .tested = TEST_OK_PR,
8875 .probe = probe_spi_rdid,
8876 .probe_timing = TIMING_ZERO,
8877 .block_erasers =
8878 {
8879 {
8880 .eraseblocks = { {4 * 1024, 8192} },
8881 .block_erase = spi_block_erase_21,
8882 }, {
8883 .eraseblocks = { {4 * 1024, 8192} },
8884 .block_erase = spi_block_erase_20,
8885 }, {
8886 .eraseblocks = { {32 * 1024, 1024} },
8887 .block_erase = spi_block_erase_5c,
8888 }, {
8889 .eraseblocks = { {32 * 1024, 1024} },
8890 .block_erase = spi_block_erase_52,
8891 }, {
8892 .eraseblocks = { {64 * 1024, 512} },
8893 .block_erase = spi_block_erase_dc,
8894 }, {
8895 .eraseblocks = { {64 * 1024, 512} },
8896 .block_erase = spi_block_erase_d8,
8897 }, {
8898 .eraseblocks = { {32 * 1024 * 1024, 1} },
8899 .block_erase = spi_block_erase_60,
8900 }, {
8901 .eraseblocks = { {32 * 1024 * 1024, 1} },
8902 .block_erase = spi_block_erase_c7,
8903 }
8904 },
8905 /* TODO: security register */
8906 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8907 .unlock = spi_disable_blockprotect_bp3_srwd,
8908 .write = spi_chip_write_256, /* Multi I/O supported */
8909 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8910 .voltage = {1650, 2000},
8911 },
8912
8913 {
8914 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +01008915 .name = "MX25U51245G",
8916 .bustype = BUS_SPI,
8917 .manufacture_id = MACRONIX_ID,
8918 .model_id = MACRONIX_MX25U51245G,
8919 .total_size = 65536,
8920 .page_size = 256,
8921 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
8922 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8923 .tested = TEST_OK_PREW,
8924 .probe = probe_spi_rdid,
8925 .probe_timing = TIMING_ZERO,
8926 .block_erasers =
8927 {
8928 {
8929 .eraseblocks = { {4 * 1024, 16384} },
8930 .block_erase = spi_block_erase_21,
8931 }, {
8932 .eraseblocks = { {4 * 1024, 16384} },
8933 .block_erase = spi_block_erase_20,
8934 }, {
8935 .eraseblocks = { {32 * 1024, 2048} },
8936 .block_erase = spi_block_erase_5c,
8937 }, {
8938 .eraseblocks = { {32 * 1024, 2048} },
8939 .block_erase = spi_block_erase_52,
8940 }, {
8941 .eraseblocks = { {64 * 1024, 1024} },
8942 .block_erase = spi_block_erase_dc,
8943 }, {
8944 .eraseblocks = { {64 * 1024, 1024} },
8945 .block_erase = spi_block_erase_d8,
8946 }, {
8947 .eraseblocks = { {64 * 1024 * 1024, 1} },
8948 .block_erase = spi_block_erase_60,
8949 }, {
8950 .eraseblocks = { {64 * 1024 * 1024, 1} },
8951 .block_erase = spi_block_erase_c7,
8952 }
8953 },
8954 /* TODO: security register */
8955 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8956 .unlock = spi_disable_blockprotect_bp3_srwd,
8957 .write = spi_chip_write_256, /* Multi I/O supported */
8958 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8959 .voltage = {1650, 2000},
8960 },
8961
8962 {
8963 .vendor = "Macronix",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00008964 .name = "MX25L6495F",
8965 .bustype = BUS_SPI,
8966 .manufacture_id = MACRONIX_ID,
8967 .model_id = MACRONIX_MX25L6495F,
8968 .total_size = 8192,
8969 .page_size = 256,
8970 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8972 .tested = TEST_OK_PREW,
8973 .probe = probe_spi_rdid,
8974 .probe_timing = TIMING_ZERO,
8975 .block_erasers =
8976 {
8977 {
8978 .eraseblocks = { {4 * 1024, 2048} },
8979 .block_erase = spi_block_erase_20,
8980 }, {
8981 .eraseblocks = { {64 * 1024, 128} },
8982 .block_erase = spi_block_erase_d8,
8983 }, {
8984 .eraseblocks = { {32 * 1024, 256} },
8985 .block_erase = spi_block_erase_52,
8986 }, {
8987 .eraseblocks = { {8 * 1024 * 1024, 1} },
8988 .block_erase = spi_block_erase_60,
8989 }, {
8990 .eraseblocks = { {8 * 1024 * 1024, 1} },
8991 .block_erase = spi_block_erase_c7,
8992 }
8993 },
8994 .unlock = spi_disable_blockprotect,
8995 .write = spi_chip_write_256,
8996 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8997 .voltage = {2700, 3600},
8998 },
8999
9000 {
Martin Roth440057a2014-07-13 00:05:07 +00009001 .vendor = "Macronix",
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009002 .name = "MX25R6435F",
9003 .bustype = BUS_SPI,
9004 .manufacture_id = MACRONIX_ID,
9005 .model_id = MACRONIX_MX25R6435F,
9006 .total_size = 8192,
9007 .page_size = 256,
9008 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9009 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9010 .tested = TEST_OK_PREW,
9011 .probe = probe_spi_rdid,
9012 .probe_timing = TIMING_ZERO,
9013 .block_erasers =
9014 {
9015 {
9016 .eraseblocks = { {4 * 1024, 2048} },
9017 .block_erase = spi_block_erase_20,
9018 }, {
9019 .eraseblocks = { {64 * 1024, 128} },
9020 .block_erase = spi_block_erase_d8,
9021 }, {
9022 .eraseblocks = { {32 * 1024, 256} },
9023 .block_erase = spi_block_erase_52,
9024 }, {
9025 .eraseblocks = { {8 * 1024 * 1024, 1} },
9026 .block_erase = spi_block_erase_60,
9027 }, {
9028 .eraseblocks = { {8 * 1024 * 1024, 1} },
9029 .block_erase = spi_block_erase_c7,
9030 }
9031 },
9032 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9033 .unlock = spi_disable_blockprotect_bp3_srwd,
9034 .write = spi_chip_write_256,
9035 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9036 .voltage = {1650, 3600},
9037 },
9038
9039 {
9040 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00009041 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009042 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009043 .manufacture_id = MACRONIX_ID,
9044 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009045 .total_size = 128,
9046 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009047 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9048 .tested = TEST_UNTESTED,
9049 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009050 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009051 .block_erasers =
9052 {
9053 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009054 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009055 {8 * 1024, 1},
9056 {4 * 1024, 2},
9057 {8 * 1024, 2},
9058 {32 * 1024, 1},
9059 {64 * 1024, 1},
9060 },
Sean Nelson35727f72010-01-28 23:55:12 +00009061 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009062 }, {
9063 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009064 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009065 }
9066 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009067 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009068 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009069 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009070 },
9071
9072 {
9073 .vendor = "Macronix",
9074 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009075 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009076 .manufacture_id = MACRONIX_ID,
9077 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009078 .total_size = 128,
9079 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009080 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00009081 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009082 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009083 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009084 .block_erasers =
9085 {
9086 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009087 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009088 {64 * 1024, 1},
9089 {32 * 1024, 1},
9090 {8 * 1024, 2},
9091 {4 * 1024, 2},
9092 {8 * 1024, 1},
9093 },
Sean Nelson35727f72010-01-28 23:55:12 +00009094 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009095 }, {
9096 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009097 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009098 }
9099 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009100 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009101 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009102 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009103 },
9104
9105 {
9106 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009107 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009108 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009109 .manufacture_id = MACRONIX_ID,
9110 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009111 .total_size = 256,
9112 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009113 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009114 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009115 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009116 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009117 .block_erasers =
9118 {
9119 {
9120 .eraseblocks = {
9121 {16 * 1024, 1},
9122 {8 * 1024, 2},
9123 {32 * 1024, 1},
9124 {64 * 1024, 3},
9125 },
Sean Nelson35727f72010-01-28 23:55:12 +00009126 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009127 }, {
9128 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009129 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009130 },
9131 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009132 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009133 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009134 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009135 },
9136
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009137 {
9138 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009139 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009140 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009141 .manufacture_id = MACRONIX_ID,
9142 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009143 .total_size = 256,
9144 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009145 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009146 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009147 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009148 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009149 .block_erasers =
9150 {
9151 {
9152 .eraseblocks = {
9153 {64 * 1024, 3},
9154 {32 * 1024, 1},
9155 {8 * 1024, 2},
9156 {16 * 1024, 1},
9157 },
Sean Nelson35727f72010-01-28 23:55:12 +00009158 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009159 }, {
9160 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009161 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009162 },
9163 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009164 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009165 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009166 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009167 },
9168
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009169 {
9170 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00009171 .name = "MX29F022(N)B",
9172 .bustype = BUS_PARALLEL,
9173 .manufacture_id = MACRONIX_ID,
9174 .model_id = MACRONIX_MX29F022B,
9175 .total_size = 256,
9176 .page_size = 0, /* unused */
9177 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9178 .tested = TEST_UNTESTED,
9179 .probe = probe_jedec,
9180 .probe_timing = TIMING_ZERO,
9181 .block_erasers =
9182 {
9183 {
9184 .eraseblocks = {
9185 {16 * 1024, 1},
9186 {8 * 1024, 2},
9187 {32 * 1024, 1},
9188 {64 * 1024, 3},
9189 },
9190 .block_erase = erase_sector_jedec,
9191 }, {
9192 .eraseblocks = { {256 * 1024, 1} },
9193 .block_erase = erase_chip_block_jedec,
9194 }
9195 },
9196 .write = write_jedec_1,
9197 .read = read_memmapped,
9198 .voltage = {4500, 5500},
9199 },
9200
9201 {
9202 .vendor = "Macronix",
9203 .name = "MX29F022(N)T",
9204 .bustype = BUS_PARALLEL,
9205 .manufacture_id = MACRONIX_ID,
9206 .model_id = MACRONIX_MX29F022T,
9207 .total_size = 256,
9208 .page_size = 0, /* unused */
9209 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9210 .tested = TEST_OK_PREW,
9211 .probe = probe_jedec,
9212 .probe_timing = TIMING_ZERO,
9213 .block_erasers =
9214 {
9215 {
9216 .eraseblocks = {
9217 {64 * 1024, 3},
9218 {32 * 1024, 1},
9219 {8 * 1024, 2},
9220 {16 * 1024, 1},
9221 },
9222 .block_erase = erase_sector_jedec,
9223 }, {
9224 .eraseblocks = { {256 * 1024, 1} },
9225 .block_erase = erase_chip_block_jedec,
9226 }
9227 },
9228 .write = write_jedec_1,
9229 .read = read_memmapped,
9230 .voltage = {4500, 5500},
9231 },
9232
9233 {
9234 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00009235 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009236 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00009237 .manufacture_id = MACRONIX_ID,
9238 .model_id = MACRONIX_MX29F040,
9239 .total_size = 512,
9240 .page_size = 64 * 1024,
9241 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9242 .tested = TEST_UNTESTED,
9243 .probe = probe_jedec,
9244 .probe_timing = TIMING_ZERO,
9245 .block_erasers =
9246 {
9247 {
9248 .eraseblocks = { {64 * 1024, 8} },
9249 .block_erase = erase_sector_jedec,
9250 }, {
9251 .eraseblocks = { {512 * 1024, 1} },
9252 .block_erase = erase_chip_block_jedec,
9253 },
9254 },
9255 .write = write_jedec_1,
9256 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009257 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00009258 },
9259
9260 {
9261 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009262 .name = "MX29GL320EB",
9263 .bustype = BUS_PARALLEL,
9264 .manufacture_id = MACRONIX_ID,
9265 .model_id = MACRONIX_MX29GL320EB,
9266 .total_size = 4096,
9267 .page_size = 128 * 1024, /* actual page size is 16 */
9268 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9269 .tested = TEST_UNTESTED,
9270 .probe = probe_jedec_29gl,
9271 .probe_timing = TIMING_ZERO,
9272 .block_erasers =
9273 {
9274 {
9275 .eraseblocks = {
9276 {8 * 1024, 8},
9277 {64 * 1024, 63},
9278 },
9279 .block_erase = erase_sector_jedec,
9280 }, {
9281 .eraseblocks = { {4 * 1024 * 1024, 1} },
9282 .block_erase = erase_chip_block_jedec,
9283 },
9284 },
9285 .write = write_jedec_1,
9286 .read = read_memmapped,
9287 .voltage = {2700, 3600},
9288 },
9289
9290 {
9291 .vendor = "Macronix",
9292 .name = "MX29GL320ET",
9293 .bustype = BUS_PARALLEL,
9294 .manufacture_id = MACRONIX_ID,
9295 .model_id = MACRONIX_MX29GL320ET,
9296 .total_size = 4096,
9297 .page_size = 128 * 1024, /* actual page size is 16 */
9298 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9299 .tested = TEST_UNTESTED,
9300 .probe = probe_jedec_29gl,
9301 .probe_timing = TIMING_ZERO,
9302 .block_erasers =
9303 {
9304 {
9305 .eraseblocks = {
9306 {64 * 1024, 63},
9307 {8 * 1024, 8},
9308 },
9309 .block_erase = erase_sector_jedec,
9310 }, {
9311 .eraseblocks = { {4 * 1024 * 1024, 1} },
9312 .block_erase = erase_chip_block_jedec,
9313 },
9314 },
9315 .write = write_jedec_1,
9316 .read = read_memmapped,
9317 .voltage = {2700, 3600},
9318 },
9319
9320 {
9321 .vendor = "Macronix",
9322 .name = "MX29GL320EH/L",
9323 .bustype = BUS_PARALLEL,
9324 .manufacture_id = MACRONIX_ID,
9325 .model_id = MACRONIX_MX29GL320EHL,
9326 .total_size = 4096,
9327 .page_size = 128 * 1024, /* actual page size is 16 */
9328 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9329 .tested = TEST_UNTESTED,
9330 .probe = probe_jedec_29gl,
9331 .probe_timing = TIMING_ZERO,
9332 .block_erasers =
9333 {
9334 {
9335 .eraseblocks = { {64 * 1024, 64} },
9336 .block_erase = erase_sector_jedec,
9337 }, {
9338 .eraseblocks = { {4 * 1024 * 1024, 1} },
9339 .block_erase = erase_chip_block_jedec,
9340 },
9341 },
9342 .write = write_jedec_1,
9343 .read = read_memmapped,
9344 .voltage = {2700, 3600},
9345 },
9346
9347 {
9348 .vendor = "Macronix",
9349 .name = "MX29GL640EB",
9350 .bustype = BUS_PARALLEL,
9351 .manufacture_id = MACRONIX_ID,
9352 .model_id = MACRONIX_MX29GL640EB,
9353 .total_size = 8192,
9354 .page_size = 128 * 1024, /* actual page size is 16 */
9355 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9356 .tested = TEST_UNTESTED,
9357 .probe = probe_jedec_29gl,
9358 .probe_timing = TIMING_ZERO,
9359 .block_erasers =
9360 {
9361 {
9362 .eraseblocks = {
9363 {8 * 1024, 8},
9364 {64 * 1024, 127},
9365 },
9366 .block_erase = erase_sector_jedec,
9367 }, {
9368 .eraseblocks = { {8 * 1024 * 1024, 1} },
9369 .block_erase = erase_chip_block_jedec,
9370 },
9371 },
9372 .write = write_jedec_1,
9373 .read = read_memmapped,
9374 .voltage = {2700, 3600},
9375 },
9376
9377 {
9378 .vendor = "Macronix",
9379 .name = "MX29GL640ET",
9380 .bustype = BUS_PARALLEL,
9381 .manufacture_id = MACRONIX_ID,
9382 .model_id = MACRONIX_MX29GL640ET,
9383 .total_size = 8192,
9384 .page_size = 128 * 1024, /* actual page size is 16 */
9385 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9386 .tested = TEST_UNTESTED,
9387 .probe = probe_jedec_29gl,
9388 .probe_timing = TIMING_ZERO,
9389 .block_erasers =
9390 {
9391 {
9392 .eraseblocks = {
9393 {64 * 1024, 127},
9394 {8 * 1024, 8},
9395 },
9396 .block_erase = erase_sector_jedec,
9397 }, {
9398 .eraseblocks = { {8 * 1024 * 1024, 1} },
9399 .block_erase = erase_chip_block_jedec,
9400 },
9401 },
9402 .write = write_jedec_1,
9403 .read = read_memmapped,
9404 .voltage = {2700, 3600},
9405 },
9406
9407 {
9408 .vendor = "Macronix",
9409 .name = "MX29GL640EH/L",
9410 .bustype = BUS_PARALLEL,
9411 .manufacture_id = MACRONIX_ID,
9412 .model_id = MACRONIX_MX29GL640EHL,
9413 .total_size = 8192,
9414 .page_size = 128 * 1024, /* actual page size is 16 */
9415 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9416 .tested = TEST_UNTESTED,
9417 .probe = probe_jedec_29gl,
9418 .probe_timing = TIMING_ZERO,
9419 .block_erasers =
9420 {
9421 {
9422 .eraseblocks = { {64 * 1024, 128} },
9423 .block_erase = erase_sector_jedec,
9424 }, {
9425 .eraseblocks = { {8 * 1024 * 1024, 1} },
9426 .block_erase = erase_chip_block_jedec,
9427 },
9428 },
9429 .write = write_jedec_1,
9430 .read = read_memmapped,
9431 .voltage = {2700, 3600},
9432 },
9433
9434 {
9435 .vendor = "Macronix",
9436 .name = "MX29GL128F",
9437 .bustype = BUS_PARALLEL,
9438 .manufacture_id = MACRONIX_ID,
9439 .model_id = MACRONIX_MX29GL128F,
9440 .total_size = 16384,
9441 .page_size = 128 * 1024, /* actual page size is 16 */
9442 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9443 .tested = TEST_UNTESTED,
9444 .probe = probe_jedec_29gl,
9445 .probe_timing = TIMING_ZERO,
9446 .block_erasers =
9447 {
9448 {
9449 .eraseblocks = { {128 * 1024, 128} },
9450 .block_erase = erase_sector_jedec,
9451 }, {
9452 .eraseblocks = { {16 * 1024 * 1024, 1} },
9453 .block_erase = erase_chip_block_jedec,
9454 },
9455 },
9456 .write = write_jedec_1,
9457 .read = read_memmapped,
9458 .voltage = {2700, 3600},
9459 },
9460
9461 {
9462 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00009463 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009464 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009465 .manufacture_id = MACRONIX_ID,
9466 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009467 .total_size = 512,
9468 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009469 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9470 .tested = TEST_UNTESTED,
9471 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009472 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009473 .block_erasers =
9474 {
9475 {
Stefan Tauner6697f712014-08-06 15:09:15 +00009476 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00009477 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009478 }, {
9479 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009480 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009481 },
9482 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009483 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009484 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009485 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00009486 },
9487
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009488 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009489 .vendor = "Micron/Numonyx/ST",
9490 .name = "M25P05-A",
9491 .bustype = BUS_SPI,
9492 .manufacture_id = ST_ID,
9493 .model_id = ST_M25P05A,
9494 .total_size = 64,
9495 .page_size = 256,
9496 .feature_bits = FEATURE_WRSR_WREN,
9497 .tested = TEST_OK_PREW,
9498 .probe = probe_spi_rdid,
9499 .probe_timing = TIMING_ZERO,
9500 .block_erasers =
9501 {
9502 {
9503 .eraseblocks = { {32 * 1024, 2} },
9504 .block_erase = spi_block_erase_d8,
9505 }, {
9506 .eraseblocks = { {64 * 1024, 1} },
9507 .block_erase = spi_block_erase_c7,
9508 }
9509 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009510 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009511 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009512 .write = spi_chip_write_256,
9513 .read = spi_chip_read,
9514 .voltage = {2700, 3600},
9515 },
9516
9517 /* The ST M25P05 is a bit of a problem. It has the same ID as the
9518 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
9519 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
9520 * only is successful if RDID does not work.
9521 */
9522 {
9523 .vendor = "Micron/Numonyx/ST",
9524 .name = "M25P05",
9525 .bustype = BUS_SPI,
9526 .manufacture_id = 0, /* Not used. */
9527 .model_id = ST_M25P05_RES,
9528 .total_size = 64,
9529 .page_size = 256,
9530 .feature_bits = FEATURE_WRSR_WREN,
9531 .tested = TEST_UNTESTED,
9532 .probe = probe_spi_res1,
9533 .probe_timing = TIMING_ZERO,
9534 .block_erasers =
9535 {
9536 {
9537 .eraseblocks = { {32 * 1024, 2} },
9538 .block_erase = spi_block_erase_d8,
9539 }, {
9540 .eraseblocks = { {64 * 1024, 1} },
9541 .block_erase = spi_block_erase_c7,
9542 }
9543 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009544 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009545 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009546 .write = spi_chip_write_1, /* 128 */
9547 .read = spi_chip_read,
9548 .voltage = {2700, 3600},
9549 },
9550
9551 {
9552 .vendor = "Micron/Numonyx/ST",
9553 .name = "M25P10-A",
9554 .bustype = BUS_SPI,
9555 .manufacture_id = ST_ID,
9556 .model_id = ST_M25P10A,
9557 .total_size = 128,
9558 .page_size = 256,
9559 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009560 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009561 .probe = probe_spi_rdid,
9562 .probe_timing = TIMING_ZERO,
9563 .block_erasers =
9564 {
9565 {
9566 .eraseblocks = { {32 * 1024, 4} },
9567 .block_erase = spi_block_erase_d8,
9568 }, {
9569 .eraseblocks = { {128 * 1024, 1} },
9570 .block_erase = spi_block_erase_c7,
9571 }
9572 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009573 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009574 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009575 .write = spi_chip_write_256,
9576 .read = spi_chip_read,
9577 .voltage = {2700, 3600},
9578 },
9579
9580 /* The ST M25P10 has the same problem as the M25P05. */
9581 {
9582 .vendor = "Micron/Numonyx/ST",
9583 .name = "M25P10",
9584 .bustype = BUS_SPI,
9585 .manufacture_id = 0, /* Not used. */
9586 .model_id = ST_M25P10_RES,
9587 .total_size = 128,
9588 .page_size = 256,
9589 .feature_bits = FEATURE_WRSR_WREN,
9590 .tested = TEST_UNTESTED,
9591 .probe = probe_spi_res1,
9592 .probe_timing = TIMING_ZERO,
9593 .block_erasers =
9594 {
9595 {
9596 .eraseblocks = { {32 * 1024, 4} },
9597 .block_erase = spi_block_erase_d8,
9598 }, {
9599 .eraseblocks = { {128 * 1024, 1} },
9600 .block_erase = spi_block_erase_c7,
9601 }
9602 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009603 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009604 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009605 .write = spi_chip_write_1, /* 128 */
9606 .read = spi_chip_read,
9607 .voltage = {2700, 3600},
9608 },
9609
9610 {
9611 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9612 .name = "M25P20",
9613 .bustype = BUS_SPI,
9614 .manufacture_id = ST_ID,
9615 .model_id = ST_M25P20,
9616 .total_size = 256,
9617 .page_size = 256,
9618 .feature_bits = FEATURE_WRSR_WREN,
9619 .tested = TEST_UNTESTED,
9620 .probe = probe_spi_rdid,
9621 .probe_timing = TIMING_ZERO,
9622 .block_erasers =
9623 {
9624 {
9625 .eraseblocks = { {64 * 1024, 4} },
9626 .block_erase = spi_block_erase_d8,
9627 }, {
9628 .eraseblocks = { {256 * 1024, 1} },
9629 .block_erase = spi_block_erase_c7,
9630 }
9631 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009632 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009633 .unlock = spi_disable_blockprotect,
9634 .write = spi_chip_write_256,
9635 .read = spi_chip_read, /* Fast read (0x0B) supported */
9636 .voltage = {2700, 3600},
9637 },
9638
9639 {
9640 .vendor = "Micron/Numonyx/ST",
9641 .name = "M25P20-old",
9642 .bustype = BUS_SPI,
9643 .manufacture_id = 0, /* Not used. */
9644 .model_id = ST_M25P20_RES,
9645 .total_size = 256,
9646 .page_size = 256,
9647 .feature_bits = FEATURE_WRSR_WREN,
9648 .tested = TEST_OK_PREW,
9649 .probe = probe_spi_res1,
9650 .probe_timing = TIMING_ZERO,
9651 .block_erasers =
9652 {
9653 {
9654 .eraseblocks = { {64 * 1024, 4} },
9655 .block_erase = spi_block_erase_d8,
9656 }, {
9657 .eraseblocks = { {256 * 1024, 1} },
9658 .block_erase = spi_block_erase_c7,
9659 }
9660 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009661 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009662 .unlock = spi_disable_blockprotect,
9663 .write = spi_chip_write_256,
9664 .read = spi_chip_read, /* Fast read (0x0B) supported */
9665 .voltage = {2700, 3600},
9666 },
9667
9668 {
9669 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9670 .name = "M25P40",
9671 .bustype = BUS_SPI,
9672 .manufacture_id = ST_ID,
9673 .model_id = ST_M25P40,
9674 .total_size = 512,
9675 .page_size = 256,
9676 .feature_bits = FEATURE_WRSR_WREN,
9677 .tested = TEST_OK_PREW,
9678 .probe = probe_spi_rdid,
9679 .probe_timing = TIMING_ZERO,
9680 .block_erasers =
9681 {
9682 {
9683 .eraseblocks = { {64 * 1024, 8} },
9684 .block_erase = spi_block_erase_d8,
9685 }, {
9686 .eraseblocks = { {512 * 1024, 1} },
9687 .block_erase = spi_block_erase_c7,
9688 }
9689 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009690 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009691 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009692 .write = spi_chip_write_256,
9693 .read = spi_chip_read,
9694 .voltage = {2700, 3600},
9695 },
9696
9697 {
9698 .vendor = "Micron/Numonyx/ST",
9699 .name = "M25P40-old",
9700 .bustype = BUS_SPI,
9701 .manufacture_id = 0, /* Not used. */
9702 .model_id = ST_M25P40_RES,
9703 .total_size = 512,
9704 .page_size = 256,
9705 .feature_bits = FEATURE_WRSR_WREN,
9706 .tested = TEST_UNTESTED,
9707 .probe = probe_spi_res1,
9708 .probe_timing = TIMING_ZERO,
9709 .block_erasers =
9710 {
9711 {
9712 .eraseblocks = { {64 * 1024, 8} },
9713 .block_erase = spi_block_erase_d8,
9714 }, {
9715 .eraseblocks = { {512 * 1024, 1} },
9716 .block_erase = spi_block_erase_c7,
9717 }
9718 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009719 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009720 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009721 .write = spi_chip_write_256,
9722 .read = spi_chip_read,
9723 },
9724
9725 {
9726 .vendor = "Micron/Numonyx/ST",
9727 .name = "M25P80",
9728 .bustype = BUS_SPI,
9729 .manufacture_id = ST_ID,
9730 .model_id = ST_M25P80,
9731 .total_size = 1024,
9732 .page_size = 256,
9733 .feature_bits = FEATURE_WRSR_WREN,
9734 .tested = TEST_OK_PREW,
9735 .probe = probe_spi_rdid,
9736 .probe_timing = TIMING_ZERO,
9737 .block_erasers =
9738 {
9739 {
9740 .eraseblocks = { {64 * 1024, 16} },
9741 .block_erase = spi_block_erase_d8,
9742 }, {
9743 .eraseblocks = { {1024 * 1024, 1} },
9744 .block_erase = spi_block_erase_c7,
9745 }
9746 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009747 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009748 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009749 .write = spi_chip_write_256,
9750 .read = spi_chip_read,
9751 .voltage = {2700, 3600},
9752 },
9753
9754 {
9755 .vendor = "Micron/Numonyx/ST",
9756 .name = "M25P16",
9757 .bustype = BUS_SPI,
9758 .manufacture_id = ST_ID,
9759 .model_id = ST_M25P16,
9760 .total_size = 2048,
9761 .page_size = 256,
9762 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009763 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009764 .probe = probe_spi_rdid,
9765 .probe_timing = TIMING_ZERO,
9766 .block_erasers =
9767 {
9768 {
9769 .eraseblocks = { {64 * 1024, 32} },
9770 .block_erase = spi_block_erase_d8,
9771 }, {
9772 .eraseblocks = { {2 * 1024 * 1024, 1} },
9773 .block_erase = spi_block_erase_c7,
9774 }
9775 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009776 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009777 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009778 .write = spi_chip_write_256,
9779 .read = spi_chip_read,
9780 .voltage = {2700, 3600},
9781 },
9782
9783 {
9784 .vendor = "Micron/Numonyx/ST",
9785 .name = "M25P32",
9786 .bustype = BUS_SPI,
9787 .manufacture_id = ST_ID,
9788 .model_id = ST_M25P32,
9789 .total_size = 4096,
9790 .page_size = 256,
9791 .feature_bits = FEATURE_WRSR_WREN,
9792 .tested = TEST_OK_PREW,
9793 .probe = probe_spi_rdid,
9794 .probe_timing = TIMING_ZERO,
9795 .block_erasers =
9796 {
9797 {
9798 .eraseblocks = { {64 * 1024, 64} },
9799 .block_erase = spi_block_erase_d8,
9800 }, {
9801 .eraseblocks = { {4 * 1024 * 1024, 1} },
9802 .block_erase = spi_block_erase_c7,
9803 }
9804 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009805 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009806 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009807 .write = spi_chip_write_256,
9808 .read = spi_chip_read,
9809 .voltage = {2700, 3600},
9810 },
9811
9812 {
9813 .vendor = "Micron/Numonyx/ST",
9814 .name = "M25P64",
9815 .bustype = BUS_SPI,
9816 .manufacture_id = ST_ID,
9817 .model_id = ST_M25P64,
9818 .total_size = 8192,
9819 .page_size = 256,
9820 .feature_bits = FEATURE_WRSR_WREN,
9821 .tested = TEST_OK_PREW,
9822 .probe = probe_spi_rdid,
9823 .probe_timing = TIMING_ZERO,
9824 .block_erasers =
9825 {
9826 {
9827 .eraseblocks = { {64 * 1024, 128} },
9828 .block_erase = spi_block_erase_d8,
9829 }, {
9830 .eraseblocks = { {8 * 1024 * 1024, 1} },
9831 .block_erase = spi_block_erase_c7,
9832 }
9833 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009834 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009835 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009836 .write = spi_chip_write_256,
9837 .read = spi_chip_read,
9838 .voltage = {2700, 3600},
9839 },
9840
9841 {
9842 .vendor = "Micron/Numonyx/ST",
9843 .name = "M25P128",
9844 .bustype = BUS_SPI,
9845 .manufacture_id = ST_ID,
9846 .model_id = ST_M25P128,
9847 .total_size = 16384,
9848 .page_size = 256,
9849 .feature_bits = FEATURE_WRSR_WREN,
9850 .tested = TEST_OK_PREW,
9851 .probe = probe_spi_rdid,
9852 .probe_timing = TIMING_ZERO,
9853 .block_erasers =
9854 {
9855 {
9856 .eraseblocks = { {256 * 1024, 64} },
9857 .block_erase = spi_block_erase_d8,
9858 }, {
9859 .eraseblocks = { {16 * 1024 * 1024, 1} },
9860 .block_erase = spi_block_erase_c7,
9861 }
9862 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009863 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009864 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009865 .write = spi_chip_write_256,
9866 .read = spi_chip_read,
9867 .voltage = {2700, 3600},
9868 },
9869
9870 {
9871 .vendor = "Micron/Numonyx/ST",
9872 .name = "M25PE10",
9873 .bustype = BUS_SPI,
9874 .manufacture_id = ST_ID,
9875 .model_id = ST_M25PE10,
9876 .total_size = 128,
9877 .page_size = 256,
9878 .feature_bits = FEATURE_WRSR_WREN,
9879 .tested = TEST_UNTESTED,
9880 .probe = probe_spi_rdid,
9881 .probe_timing = TIMING_ZERO,
9882 .block_erasers =
9883 {
9884 {
9885 .eraseblocks = { {4 * 1024, 32} },
9886 .block_erase = spi_block_erase_20,
9887 }, {
9888 .eraseblocks = { {64 * 1024, 2} },
9889 .block_erase = spi_block_erase_d8,
9890 }, {
9891 .eraseblocks = { {128 * 1024, 1} },
9892 .block_erase = spi_block_erase_c7,
9893 }
9894 },
9895 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9896 .unlock = spi_disable_blockprotect,
9897 .write = spi_chip_write_256,
9898 .read = spi_chip_read,
9899 .voltage = {2700, 3600},
9900 },
9901
9902 {
9903 .vendor = "Micron/Numonyx/ST",
9904 .name = "M25PE20",
9905 .bustype = BUS_SPI,
9906 .manufacture_id = ST_ID,
9907 .model_id = ST_M25PE20,
9908 .total_size = 256,
9909 .page_size = 256,
9910 .feature_bits = FEATURE_WRSR_WREN,
9911 .tested = TEST_UNTESTED,
9912 .probe = probe_spi_rdid,
9913 .probe_timing = TIMING_ZERO,
9914 .block_erasers =
9915 {
9916 {
9917 .eraseblocks = { {4 * 1024, 64} },
9918 .block_erase = spi_block_erase_20,
9919 }, {
9920 .eraseblocks = { {64 * 1024, 4} },
9921 .block_erase = spi_block_erase_d8,
9922 }, {
9923 .eraseblocks = { {256 * 1024, 1} },
9924 .block_erase = spi_block_erase_c7,
9925 }
9926 },
9927 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9928 .unlock = spi_disable_blockprotect,
9929 .write = spi_chip_write_256,
9930 .read = spi_chip_read,
9931 .voltage = {2700, 3600},
9932 },
9933
9934 {
9935 .vendor = "Micron/Numonyx/ST",
9936 .name = "M25PE40",
9937 .bustype = BUS_SPI,
9938 .manufacture_id = ST_ID,
9939 .model_id = ST_M25PE40,
9940 .total_size = 512,
9941 .page_size = 256,
9942 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009943 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009944 .probe = probe_spi_rdid,
9945 .probe_timing = TIMING_ZERO,
9946 .block_erasers =
9947 {
9948 {
9949 .eraseblocks = { {4 * 1024, 128} },
9950 .block_erase = spi_block_erase_20,
9951 }, {
9952 .eraseblocks = { {64 * 1024, 8} },
9953 .block_erase = spi_block_erase_d8,
9954 }, {
9955 .eraseblocks = { {512 * 1024, 1} },
9956 .block_erase = spi_block_erase_c7,
9957 }
9958 },
9959 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9960 .unlock = spi_disable_blockprotect,
9961 .write = spi_chip_write_256,
9962 .read = spi_chip_read,
9963 .voltage = {2700, 3600},
9964 },
9965
9966 {
9967 .vendor = "Micron/Numonyx/ST",
9968 .name = "M25PE80",
9969 .bustype = BUS_SPI,
9970 .manufacture_id = ST_ID,
9971 .model_id = ST_M25PE80,
9972 .total_size = 1024,
9973 .page_size = 256,
9974 .feature_bits = FEATURE_WRSR_WREN,
9975 .tested = TEST_OK_PREW,
9976 .probe = probe_spi_rdid,
9977 .probe_timing = TIMING_ZERO,
9978 .block_erasers =
9979 {
9980 {
9981 .eraseblocks = { {4 * 1024, 256} },
9982 .block_erase = spi_block_erase_20,
9983 }, {
9984 .eraseblocks = { {64 * 1024, 16} },
9985 .block_erase = spi_block_erase_d8,
9986 }, {
9987 .eraseblocks = { {1024 * 1024, 1} },
9988 .block_erase = spi_block_erase_c7,
9989 }
9990 },
9991 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9992 .unlock = spi_disable_blockprotect,
9993 .write = spi_chip_write_256,
9994 .read = spi_chip_read,
9995 .voltage = {2700, 3600},
9996 },
9997
9998 {
9999 .vendor = "Micron/Numonyx/ST",
10000 .name = "M25PE16",
10001 .bustype = BUS_SPI,
10002 .manufacture_id = ST_ID,
10003 .model_id = ST_M25PE16,
10004 .total_size = 2048,
10005 .page_size = 256,
10006 .feature_bits = FEATURE_WRSR_WREN,
10007 .tested = TEST_UNTESTED,
10008 .probe = probe_spi_rdid,
10009 .probe_timing = TIMING_ZERO,
10010 .block_erasers =
10011 {
10012 {
10013 .eraseblocks = { {4 * 1024, 512} },
10014 .block_erase = spi_block_erase_20,
10015 }, {
10016 .eraseblocks = { {64 * 1024, 32} },
10017 .block_erase = spi_block_erase_d8,
10018 }, {
10019 .eraseblocks = { {2 * 1024 * 1024, 1} },
10020 .block_erase = spi_block_erase_c7,
10021 }
10022 },
10023 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10024 .unlock = spi_disable_blockprotect,
10025 .write = spi_chip_write_256,
10026 .read = spi_chip_read,
10027 .voltage = {2700, 3600},
10028 },
10029
10030 {
10031 .vendor = "Micron/Numonyx/ST",
10032 .name = "M25PX80",
10033 .bustype = BUS_SPI,
10034 .manufacture_id = ST_ID,
10035 .model_id = ST_M25PX80,
10036 .total_size = 1024,
10037 .page_size = 256,
10038 /* OTP: 64B total; read 0x4B, write 0x42 */
10039 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10040 .tested = TEST_OK_PREW,
10041 .probe = probe_spi_rdid,
10042 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010043 .block_erasers =
10044 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010045 {
10046 .eraseblocks = { { 4 * 1024, 256 } },
10047 .block_erase = spi_block_erase_20,
10048 }, {
10049 .eraseblocks = { {64 * 1024, 16} },
10050 .block_erase = spi_block_erase_d8,
10051 }, {
10052 .eraseblocks = { {1024 * 1024, 1} },
10053 .block_erase = spi_block_erase_c7,
10054 }
10055 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010056 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010057 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10058 .write = spi_chip_write_256,
10059 .read = spi_chip_read,
10060 .voltage = {2700, 3600},
10061 },
10062
10063 {
10064 .vendor = "Micron/Numonyx/ST",
10065 .name = "M25PX16",
10066 .bustype = BUS_SPI,
10067 .manufacture_id = ST_ID,
10068 .model_id = ST_M25PX16,
10069 .total_size = 2048,
10070 .page_size = 256,
10071 /* OTP: 64B total; read 0x4B; write 0x42 */
10072 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10073 .tested = TEST_OK_PREW,
10074 .probe = probe_spi_rdid,
10075 .probe_timing = TIMING_ZERO,
10076 .block_erasers =
10077 {
10078 {
10079 .eraseblocks = { { 4 * 1024, 512 } },
10080 .block_erase = spi_block_erase_20,
10081 }, {
10082 .eraseblocks = { {64 * 1024, 32} },
10083 .block_erase = spi_block_erase_d8,
10084 }, {
10085 .eraseblocks = { {2 * 1024 * 1024, 1} },
10086 .block_erase = spi_block_erase_c7,
10087 }
10088 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010089 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010090 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10091 .write = spi_chip_write_256,
10092 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010093 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010094 },
10095
10096 {
10097 .vendor = "Micron/Numonyx/ST",
10098 .name = "M25PX32",
10099 .bustype = BUS_SPI,
10100 .manufacture_id = ST_ID,
10101 .model_id = ST_M25PX32,
10102 .total_size = 4096,
10103 .page_size = 256,
10104 /* OTP: 64B total; read 0x4B; write 0x42 */
10105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10106 .tested = TEST_OK_PRE,
10107 .probe = probe_spi_rdid,
10108 .probe_timing = TIMING_ZERO,
10109 .block_erasers =
10110 {
10111 {
10112 .eraseblocks = { { 4 * 1024, 1024 } },
10113 .block_erase = spi_block_erase_20,
10114 }, {
10115 .eraseblocks = { {64 * 1024, 64} },
10116 .block_erase = spi_block_erase_d8,
10117 }, {
10118 .eraseblocks = { {4 * 1024 * 1024, 1} },
10119 .block_erase = spi_block_erase_c7,
10120 }
10121 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010122 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010123 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10124 .write = spi_chip_write_256,
10125 .read = spi_chip_read,
10126 .voltage = {2700, 3600},
10127 },
10128
10129 {
10130 .vendor = "Micron/Numonyx/ST",
10131 .name = "M25PX64",
10132 .bustype = BUS_SPI,
10133 .manufacture_id = ST_ID,
10134 .model_id = ST_M25PX64,
10135 .total_size = 8192,
10136 .page_size = 256,
10137 /* OTP: 64B total; read 0x4B; write 0x42 */
10138 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010139 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010140 .probe = probe_spi_rdid,
10141 .probe_timing = TIMING_ZERO,
10142 .block_erasers =
10143 {
10144 {
10145 .eraseblocks = { { 4 * 1024, 2048 } },
10146 .block_erase = spi_block_erase_20,
10147 }, {
10148 .eraseblocks = { {64 * 1024, 128} },
10149 .block_erase = spi_block_erase_d8,
10150 }, {
10151 .eraseblocks = { {8 * 1024 * 1024, 1} },
10152 .block_erase = spi_block_erase_c7,
10153 }
10154 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010155 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010156 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10157 .write = spi_chip_write_256,
10158 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010159 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010160 },
10161
10162 {
10163 .vendor = "Micron/Numonyx/ST",
10164 .name = "M45PE10",
10165 .bustype = BUS_SPI,
10166 .manufacture_id = ST_ID,
10167 .model_id = ST_M45PE10,
10168 .total_size = 128,
10169 .page_size = 256,
10170 .tested = TEST_UNTESTED,
10171 .probe = probe_spi_rdid,
10172 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010173 .block_erasers =
10174 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010175 {
10176 .eraseblocks = { {256, 512} },
10177 .block_erase = spi_block_erase_db,
10178 }, {
10179 .eraseblocks = { {64 * 1024, 2} },
10180 .block_erase = spi_block_erase_d8,
10181 }
10182 },
10183 .printlock = spi_prettyprint_status_register_default_welwip,
10184 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10185 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10186 .read = spi_chip_read, /* Fast read (0x0B) supported */
10187 .voltage = {2700, 3600},
10188 },
10189
10190 {
10191 .vendor = "Micron/Numonyx/ST",
10192 .name = "M45PE20",
10193 .bustype = BUS_SPI,
10194 .manufacture_id = ST_ID,
10195 .model_id = ST_M45PE20,
10196 .total_size = 256,
10197 .page_size = 256,
10198 .tested = TEST_UNTESTED,
10199 .probe = probe_spi_rdid,
10200 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010201 .block_erasers =
10202 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010203 {
10204 .eraseblocks = { {256, 1024} },
10205 .block_erase = spi_block_erase_db,
10206 }, {
10207 .eraseblocks = { {64 * 1024, 4} },
10208 .block_erase = spi_block_erase_d8,
10209 }
10210 },
10211 .printlock = spi_prettyprint_status_register_default_welwip,
10212 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10213 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10214 .read = spi_chip_read, /* Fast read (0x0B) supported */
10215 .voltage = {2700, 3600},
10216 },
10217
10218 {
10219 .vendor = "Micron/Numonyx/ST",
10220 .name = "M45PE40",
10221 .bustype = BUS_SPI,
10222 .manufacture_id = ST_ID,
10223 .model_id = ST_M45PE40,
10224 .total_size = 512,
10225 .page_size = 256,
10226 .tested = TEST_UNTESTED,
10227 .probe = probe_spi_rdid,
10228 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010229 .block_erasers =
10230 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010231 {
10232 .eraseblocks = { {256, 2048} },
10233 .block_erase = spi_block_erase_db,
10234 }, {
10235 .eraseblocks = { {64 * 1024, 8} },
10236 .block_erase = spi_block_erase_d8,
10237 }
10238 },
10239 .printlock = spi_prettyprint_status_register_default_welwip,
10240 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000010241 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010242 .read = spi_chip_read, /* Fast read (0x0B) supported */
10243 .voltage = {2700, 3600},
10244 },
10245
10246 {
10247 .vendor = "Micron/Numonyx/ST",
10248 .name = "M45PE80",
10249 .bustype = BUS_SPI,
10250 .manufacture_id = ST_ID,
10251 .model_id = ST_M45PE80,
10252 .total_size = 1024,
10253 .page_size = 256,
10254 .tested = TEST_UNTESTED,
10255 .probe = probe_spi_rdid,
10256 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010257 .block_erasers =
10258 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010259 {
10260 .eraseblocks = { {256, 4096} },
10261 .block_erase = spi_block_erase_db,
10262 }, {
10263 .eraseblocks = { {64 * 1024, 16} },
10264 .block_erase = spi_block_erase_d8,
10265 }
10266 },
10267 .printlock = spi_prettyprint_status_register_default_welwip,
10268 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10269 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10270 .read = spi_chip_read, /* Fast read (0x0B) supported */
10271 .voltage = {2700, 3600},
10272 },
10273
10274 {
10275 .vendor = "Micron/Numonyx/ST",
10276 .name = "M45PE16",
10277 .bustype = BUS_SPI,
10278 .manufacture_id = ST_ID,
10279 .model_id = ST_M45PE16,
10280 .total_size = 2048,
10281 .page_size = 256,
10282 .tested = TEST_UNTESTED,
10283 .probe = probe_spi_rdid,
10284 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010285 .block_erasers =
10286 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010287 {
10288 .eraseblocks = { {256, 8192} },
10289 .block_erase = spi_block_erase_db,
10290 }, {
10291 .eraseblocks = { {64 * 1024, 32} },
10292 .block_erase = spi_block_erase_d8,
10293 }
10294 },
10295 .printlock = spi_prettyprint_status_register_default_welwip,
10296 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10297 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10298 .read = spi_chip_read, /* Fast read (0x0B) supported */
10299 .voltage = {2700, 3600},
10300 },
10301
10302 {
10303 .vendor = "Micron/Numonyx/ST",
10304 .name = "N25Q016",
10305 .bustype = BUS_SPI,
10306 .manufacture_id = ST_ID,
10307 .model_id = ST_N25Q016__1E,
10308 .total_size = 2048,
10309 .page_size = 256,
10310 /* supports SFDP */
10311 /* OTP: 64B total; read 0x4B, write 0x42 */
10312 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10313 .tested = TEST_UNTESTED,
10314 .probe = probe_spi_rdid,
10315 .probe_timing = TIMING_ZERO,
10316 .block_erasers =
10317 {
10318 {
10319 .eraseblocks = { {4 * 1024, 512} },
10320 .block_erase = spi_block_erase_20,
10321 }, {
10322 .eraseblocks = { {32 * 1024, 64} },
10323 .block_erase = spi_block_erase_52,
10324 }, {
10325 .eraseblocks = { {64 * 1024, 32} },
10326 .block_erase = spi_block_erase_d8,
10327 }, {
10328 .eraseblocks = { {2 * 1024 * 1024, 1} },
10329 .block_erase = spi_block_erase_c7,
10330 }
10331 },
10332 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10333 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10334 .write = spi_chip_write_256, /* Multi I/O supported */
10335 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10336 .voltage = {1700, 2000},
10337 },
10338
10339 {
10340 .vendor = "Micron/Numonyx/ST",
10341 .name = "N25Q032..1E",
10342 .bustype = BUS_SPI,
10343 .manufacture_id = ST_ID,
10344 .model_id = ST_N25Q032__1E,
10345 .total_size = 4096,
10346 .page_size = 256,
10347 /* supports SFDP */
10348 /* OTP: 64B total; read 0x4B, write 0x42 */
10349 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10350 .tested = TEST_UNTESTED,
10351 .probe = probe_spi_rdid,
10352 .probe_timing = TIMING_ZERO,
10353 .block_erasers =
10354 {
10355 {
10356 .eraseblocks = { {4 * 1024, 1024} },
10357 .block_erase = spi_block_erase_20,
10358 }, {
10359 .eraseblocks = { {64 * 1024, 64} },
10360 .block_erase = spi_block_erase_d8,
10361 }, {
10362 .eraseblocks = { {4 * 1024 * 1024, 1} },
10363 .block_erase = spi_block_erase_c7,
10364 }
10365 },
10366 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10367 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10368 .write = spi_chip_write_256, /* Multi I/O supported */
10369 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10370 .voltage = {1700, 2000},
10371 },
10372
10373 {
10374 .vendor = "Micron/Numonyx/ST",
10375 .name = "N25Q032..3E",
10376 .bustype = BUS_SPI,
10377 .manufacture_id = ST_ID,
10378 .model_id = ST_N25Q032__3E,
10379 .total_size = 4096,
10380 .page_size = 256,
10381 /* supports SFDP */
10382 /* OTP: 64B total; read 0x4B, write 0x42 */
10383 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10384 .tested = TEST_OK_PREW,
10385 .probe = probe_spi_rdid,
10386 .probe_timing = TIMING_ZERO,
10387 .block_erasers =
10388 {
10389 {
10390 .eraseblocks = { {4 * 1024, 1024} },
10391 .block_erase = spi_block_erase_20,
10392 }, {
10393 .eraseblocks = { {64 * 1024, 64} },
10394 .block_erase = spi_block_erase_d8,
10395 }, {
10396 .eraseblocks = { {4 * 1024 * 1024, 1} },
10397 .block_erase = spi_block_erase_c7,
10398 }
10399 },
10400 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10401 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10402 .write = spi_chip_write_256, /* Multi I/O supported */
10403 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10404 .voltage = {2700, 3600},
10405 },
10406
10407 {
10408 .vendor = "Micron/Numonyx/ST",
10409 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10410 .bustype = BUS_SPI,
10411 .manufacture_id = ST_ID,
10412 .model_id = ST_N25Q064__1E,
10413 .total_size = 8192,
10414 .page_size = 256,
10415 /* supports SFDP */
10416 /* OTP: 64B total; read 0x4B, write 0x42 */
10417 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010418 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010419 .probe = probe_spi_rdid,
10420 .probe_timing = TIMING_ZERO,
10421 .block_erasers =
10422 {
10423 {
10424 .eraseblocks = { {4 * 1024, 2048 } },
10425 .block_erase = spi_block_erase_20,
10426 }, {
10427 .eraseblocks = { {64 * 1024, 128} },
10428 .block_erase = spi_block_erase_d8,
10429 }, {
10430 .eraseblocks = { {8 * 1024 * 1024, 1} },
10431 .block_erase = spi_block_erase_c7,
10432 }
10433 },
10434 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10435 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10436 .write = spi_chip_write_256, /* Multi I/O supported */
10437 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10438 .voltage = {1700, 2000},
10439 },
10440
10441 {
10442 .vendor = "Micron/Numonyx/ST",
10443 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10444 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010445 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010446 .model_id = ST_N25Q064__3E,
10447 .total_size = 8192,
10448 .page_size = 256,
10449 /* supports SFDP */
10450 /* OTP: 64B total; read 0x4B, write 0x42 */
10451 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10452 .tested = TEST_OK_PREW,
10453 .probe = probe_spi_rdid,
10454 .probe_timing = TIMING_ZERO,
10455 .block_erasers =
10456 {
10457 {
10458 .eraseblocks = { {4 * 1024, 2048 } },
10459 .block_erase = spi_block_erase_20,
10460 }, {
10461 .eraseblocks = { {64 * 1024, 128} },
10462 .block_erase = spi_block_erase_d8,
10463 }, {
10464 .eraseblocks = { {8 * 1024 * 1024, 1} },
10465 .block_erase = spi_block_erase_c7,
10466 }
10467 },
10468 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10469 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10470 .write = spi_chip_write_256, /* Multi I/O supported */
10471 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10472 .voltage = {2700, 3600},
10473 },
10474
10475 {
10476 .vendor = "Micron/Numonyx/ST",
10477 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10478 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010479 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010480 .model_id = ST_N25Q128__1E,
10481 .total_size = 16384,
10482 .page_size = 256,
10483 /* supports SFDP */
10484 /* OTP: 64B total; read 0x4B, write 0x42 */
10485 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010486 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010487 .probe = probe_spi_rdid,
10488 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010489 .block_erasers =
10490 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010491 {
10492 .eraseblocks = { {4 * 1024, 4096 } },
10493 .block_erase = spi_block_erase_20,
10494 }, {
10495 .eraseblocks = { {64 * 1024, 256} },
10496 .block_erase = spi_block_erase_d8,
10497 }, {
10498 .eraseblocks = { {16384 * 1024, 1} },
10499 .block_erase = spi_block_erase_c7,
10500 }
10501 },
10502 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10503 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10504 .write = spi_chip_write_256, /* Multi I/O supported */
10505 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10506 .voltage = {1700, 2000},
10507 },
10508
10509 {
10510 .vendor = "Micron/Numonyx/ST",
10511 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10512 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010513 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010514 .model_id = ST_N25Q128__3E,
10515 .total_size = 16384,
10516 .page_size = 256,
10517 /* supports SFDP */
10518 /* OTP: 64B total; read 0x4B, write 0x42 */
10519 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10520 .tested = TEST_OK_PREW,
10521 .probe = probe_spi_rdid,
10522 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010523 .block_erasers =
10524 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010525 {
10526 .eraseblocks = { {4 * 1024, 4096 } },
10527 .block_erase = spi_block_erase_20,
10528 }, {
10529 .eraseblocks = { {64 * 1024, 256} },
10530 .block_erase = spi_block_erase_d8,
10531 }, {
10532 .eraseblocks = { {16384 * 1024, 1} },
10533 .block_erase = spi_block_erase_c7,
10534 }
10535 },
10536 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10537 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10538 .write = spi_chip_write_256, /* Multi I/O supported */
10539 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10540 .voltage = {2700, 3600},
10541 },
10542
10543 {
Ed Swierk199ab392017-07-03 13:33:44 -070010544 .vendor = "Micron",
10545 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
10546 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010547 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070010548 .model_id = ST_N25Q256__3E,
10549 .total_size = 32768,
10550 .page_size = 256,
10551 /* supports SFDP */
10552 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010010553 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10554 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -070010555 .probe = probe_spi_rdid,
10556 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010557 .block_erasers =
10558 {
Ed Swierk199ab392017-07-03 13:33:44 -070010559 {
10560 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010561 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010562 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010563 .eraseblocks = { {4 * 1024, 8192} },
10564 .block_erase = spi_block_erase_20,
10565 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010566 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010567 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010568 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010569 .eraseblocks = { {64 * 1024, 512} },
10570 .block_erase = spi_block_erase_d8,
10571 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010572 .eraseblocks = { {32768 * 1024, 1} },
10573 .block_erase = spi_block_erase_c7,
10574 }
10575 },
10576 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10577 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10578 .write = spi_chip_write_256, /* Multi I/O supported */
10579 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10580 .voltage = {2700, 3600},
10581 },
10582
10583 {
10584 .vendor = "Micron",
10585 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
10586 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010587 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070010588 .model_id = ST_N25Q512__3E,
10589 .total_size = 65536,
10590 .page_size = 256,
10591 /* supports SFDP */
10592 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010010593 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020010594 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070010595 .probe = probe_spi_rdid,
10596 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010597 .block_erasers =
10598 {
Ed Swierk199ab392017-07-03 13:33:44 -070010599 {
10600 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010601 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010602 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010603 .eraseblocks = { {4 * 1024, 16384} },
10604 .block_erase = spi_block_erase_20,
10605 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010606 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010607 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010608 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010609 .eraseblocks = { {64 * 1024, 1024} },
10610 .block_erase = spi_block_erase_d8,
10611 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010612 .eraseblocks = { {65536 * 1024, 1} },
10613 .block_erase = spi_block_erase_c7,
10614 }
10615 },
10616 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10617 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10618 .write = spi_chip_write_256, /* Multi I/O supported */
10619 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10620 .voltage = {2700, 3600},
10621 },
10622
10623 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010624 .vendor = "MoselVitelic",
10625 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010626 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010627 .manufacture_id = SYNCMOS_MVC_ID,
10628 .model_id = MVC_V29C51000B,
10629 .total_size = 64,
10630 .page_size = 512,
10631 .feature_bits = FEATURE_EITHER_RESET,
10632 .tested = TEST_UNTESTED,
10633 .probe = probe_jedec,
10634 .probe_timing = TIMING_ZERO,
10635 .block_erasers =
10636 {
10637 {
10638 .eraseblocks = { {512, 128} },
10639 .block_erase = erase_sector_jedec,
10640 }, {
10641 .eraseblocks = { {64 * 1024, 1} },
10642 .block_erase = erase_chip_block_jedec,
10643 },
10644 },
10645 .write = write_jedec_1,
10646 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010647 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010648 },
10649
10650 {
10651 .vendor = "MoselVitelic",
10652 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010653 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010654 .manufacture_id = SYNCMOS_MVC_ID,
10655 .model_id = MVC_V29C51000T,
10656 .total_size = 64,
10657 .page_size = 512,
10658 .feature_bits = FEATURE_EITHER_RESET,
10659 .tested = TEST_UNTESTED,
10660 .probe = probe_jedec,
10661 .probe_timing = TIMING_ZERO,
10662 .block_erasers =
10663 {
10664 {
10665 .eraseblocks = { {512, 128} },
10666 .block_erase = erase_sector_jedec,
10667 }, {
10668 .eraseblocks = { {64 * 1024, 1} },
10669 .block_erase = erase_chip_block_jedec,
10670 },
10671 },
10672 .write = write_jedec_1,
10673 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010674 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010675 },
10676
10677 {
10678 .vendor = "MoselVitelic",
10679 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010680 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010681 .manufacture_id = SYNCMOS_MVC_ID,
10682 .model_id = MVC_V29C51400B,
10683 .total_size = 512,
10684 .page_size = 1024,
10685 .feature_bits = FEATURE_EITHER_RESET,
10686 .tested = TEST_UNTESTED,
10687 .probe = probe_jedec,
10688 .probe_timing = TIMING_ZERO,
10689 .block_erasers =
10690 {
10691 {
10692 .eraseblocks = { {1024, 512} },
10693 .block_erase = erase_sector_jedec,
10694 }, {
10695 .eraseblocks = { {512 * 1024, 1} },
10696 .block_erase = erase_chip_block_jedec,
10697 },
10698 },
10699 .write = write_jedec_1,
10700 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010701 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010702 },
10703
10704 {
10705 .vendor = "MoselVitelic",
10706 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010707 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010708 .manufacture_id = SYNCMOS_MVC_ID,
10709 .model_id = MVC_V29C51400T,
10710 .total_size = 512,
10711 .page_size = 1024,
10712 .feature_bits = FEATURE_EITHER_RESET,
10713 .tested = TEST_UNTESTED,
10714 .probe = probe_jedec,
10715 .probe_timing = TIMING_ZERO,
10716 .block_erasers =
10717 {
10718 {
10719 .eraseblocks = { {1024, 512} },
10720 .block_erase = erase_sector_jedec,
10721 }, {
10722 .eraseblocks = { {512 * 1024, 1} },
10723 .block_erase = erase_chip_block_jedec,
10724 },
10725 },
10726 .write = write_jedec_1,
10727 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010728 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010729 },
10730
10731 {
10732 .vendor = "MoselVitelic",
10733 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010734 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010735 .manufacture_id = SYNCMOS_MVC_ID,
10736 .model_id = MVC_V29LC51000,
10737 .total_size = 64,
10738 .page_size = 512,
10739 .feature_bits = FEATURE_EITHER_RESET,
10740 .tested = TEST_UNTESTED,
10741 .probe = probe_jedec,
10742 .probe_timing = TIMING_ZERO,
10743 .block_erasers =
10744 {
10745 {
10746 .eraseblocks = { {512, 128} },
10747 .block_erase = erase_sector_jedec,
10748 }, {
10749 .eraseblocks = { {64 * 1024, 1} },
10750 .block_erase = erase_chip_block_jedec,
10751 },
10752 },
10753 .write = write_jedec_1,
10754 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010755 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010756 },
10757
10758 {
10759 .vendor = "MoselVitelic",
10760 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010761 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010762 .manufacture_id = SYNCMOS_MVC_ID,
10763 .model_id = MVC_V29LC51001,
10764 .total_size = 128,
10765 .page_size = 512,
10766 .feature_bits = FEATURE_EITHER_RESET,
10767 .tested = TEST_UNTESTED,
10768 .probe = probe_jedec,
10769 .probe_timing = TIMING_ZERO,
10770 .block_erasers =
10771 {
10772 {
10773 .eraseblocks = { {512, 256} },
10774 .block_erase = erase_sector_jedec,
10775 }, {
10776 .eraseblocks = { {128 * 1024, 1} },
10777 .block_erase = erase_chip_block_jedec,
10778 },
10779 },
10780 .write = write_jedec_1,
10781 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010782 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010783 },
10784
10785 {
10786 .vendor = "MoselVitelic",
10787 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010788 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010789 .manufacture_id = SYNCMOS_MVC_ID,
10790 .model_id = MVC_V29LC51002,
10791 .total_size = 256,
10792 .page_size = 512,
10793 .feature_bits = FEATURE_EITHER_RESET,
10794 .tested = TEST_UNTESTED,
10795 .probe = probe_jedec,
10796 .probe_timing = TIMING_ZERO,
10797 .block_erasers =
10798 {
10799 {
10800 .eraseblocks = { {512, 512} },
10801 .block_erase = erase_sector_jedec,
10802 }, {
10803 .eraseblocks = { {256 * 1024, 1} },
10804 .block_erase = erase_chip_block_jedec,
10805 },
10806 },
10807 .write = write_jedec_1,
10808 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010809 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010810 },
10811
10812 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010813 .vendor = "Nantronics",
10814 .name = "N25S10",
10815 .bustype = BUS_SPI,
10816 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10817 .model_id = NANTRONICS_N25S10,
10818 .total_size = 128,
10819 .page_size = 256,
10820 .feature_bits = FEATURE_WRSR_WREN,
10821 .tested = TEST_UNTESTED,
10822 .probe = probe_spi_rdid,
10823 .probe_timing = TIMING_ZERO,
10824 .block_erasers =
10825 {
10826 {
10827 .eraseblocks = { {4 * 1024, 32} },
10828 .block_erase = spi_block_erase_20,
10829 }, {
10830 .eraseblocks = { {4 * 1024, 32} },
10831 .block_erase = spi_block_erase_d7,
10832 }, {
10833 .eraseblocks = { {32 * 1024, 4} },
10834 .block_erase = spi_block_erase_52,
10835 }, {
10836 .eraseblocks = { {64 * 1024, 2} },
10837 .block_erase = spi_block_erase_d8,
10838 }, {
10839 .eraseblocks = { {128 * 1024, 1} },
10840 .block_erase = spi_block_erase_60,
10841 }, {
10842 .eraseblocks = { {128 * 1024, 1} },
10843 .block_erase = spi_block_erase_c7,
10844 }
10845 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010846 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010847 .unlock = spi_disable_blockprotect_bp3_srwd,
10848 .write = spi_chip_write_256,
10849 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10850 .voltage = {2700, 3600},
10851 },
10852
10853 {
10854 .vendor = "Nantronics",
10855 .name = "N25S20",
10856 .bustype = BUS_SPI,
10857 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10858 .model_id = NANTRONICS_N25S20,
10859 .total_size = 256,
10860 .page_size = 256,
10861 .feature_bits = FEATURE_WRSR_WREN,
10862 .tested = TEST_UNTESTED,
10863 .probe = probe_spi_rdid,
10864 .probe_timing = TIMING_ZERO,
10865 .block_erasers =
10866 {
10867 {
10868 .eraseblocks = { {4 * 1024, 64} },
10869 .block_erase = spi_block_erase_20,
10870 }, {
10871 .eraseblocks = { {4 * 1024, 64} },
10872 .block_erase = spi_block_erase_d7,
10873 }, {
10874 .eraseblocks = { {32 * 1024, 8} },
10875 .block_erase = spi_block_erase_52,
10876 }, {
10877 .eraseblocks = { {64 * 1024, 4} },
10878 .block_erase = spi_block_erase_d8,
10879 }, {
10880 .eraseblocks = { {256 * 1024, 1} },
10881 .block_erase = spi_block_erase_60,
10882 }, {
10883 .eraseblocks = { {256 * 1024, 1} },
10884 .block_erase = spi_block_erase_c7,
10885 }
10886 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010887 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010888 .unlock = spi_disable_blockprotect_bp3_srwd,
10889 .write = spi_chip_write_256,
10890 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10891 .voltage = {2700, 3600},
10892 },
10893
10894 {
10895 .vendor = "Nantronics",
10896 .name = "N25S40",
10897 .bustype = BUS_SPI,
10898 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10899 .model_id = NANTRONICS_N25S40,
10900 .total_size = 512,
10901 .page_size = 256,
10902 .feature_bits = FEATURE_WRSR_WREN,
10903 .tested = TEST_UNTESTED,
10904 .probe = probe_spi_rdid,
10905 .probe_timing = TIMING_ZERO,
10906 .block_erasers =
10907 {
10908 {
10909 .eraseblocks = { {4 * 1024, 128} },
10910 .block_erase = spi_block_erase_20,
10911 }, {
10912 .eraseblocks = { {4 * 1024, 128} },
10913 .block_erase = spi_block_erase_d7,
10914 }, {
10915 .eraseblocks = { {32 * 1024, 16} },
10916 .block_erase = spi_block_erase_52,
10917 }, {
10918 .eraseblocks = { {64 * 1024, 8} },
10919 .block_erase = spi_block_erase_d8,
10920 }, {
10921 .eraseblocks = { {512 * 1024, 1} },
10922 .block_erase = spi_block_erase_60,
10923 }, {
10924 .eraseblocks = { {512 * 1024, 1} },
10925 .block_erase = spi_block_erase_c7,
10926 }
10927 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010928 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010929 .unlock = spi_disable_blockprotect_bp3_srwd,
10930 .write = spi_chip_write_256,
10931 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10932 .voltage = {2700, 3600},
10933 },
10934
10935 {
10936 .vendor = "Nantronics",
10937 .name = "N25S80",
10938 .bustype = BUS_SPI,
10939 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10940 .model_id = NANTRONICS_N25S80,
10941 .total_size = 1024,
10942 .page_size = 256,
10943 .feature_bits = FEATURE_WRSR_WREN,
10944 .tested = TEST_UNTESTED,
10945 .probe = probe_spi_rdid,
10946 .probe_timing = TIMING_ZERO,
10947 .block_erasers =
10948 {
10949 {
10950 .eraseblocks = { {4 * 1024, 256} },
10951 .block_erase = spi_block_erase_20,
10952 }, {
10953 .eraseblocks = { {32 * 1024, 32} },
10954 .block_erase = spi_block_erase_52,
10955 }, {
10956 .eraseblocks = { {64 * 1024, 16} },
10957 .block_erase = spi_block_erase_d8,
10958 }, {
10959 .eraseblocks = { {1024 * 1024, 1} },
10960 .block_erase = spi_block_erase_60,
10961 }, {
10962 .eraseblocks = { {1024 * 1024, 1} },
10963 .block_erase = spi_block_erase_c7,
10964 }
10965 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010966 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010967 .unlock = spi_disable_blockprotect_bp3_srwd,
10968 .write = spi_chip_write_256,
10969 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10970 .voltage = {2700, 3600},
10971 },
10972
10973 {
10974 .vendor = "Nantronics",
10975 .name = "N25S16",
10976 .bustype = BUS_SPI,
10977 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10978 .model_id = NANTRONICS_N25S16,
10979 .total_size = 2048,
10980 .page_size = 256,
10981 .feature_bits = FEATURE_WRSR_WREN,
10982 .tested = TEST_UNTESTED,
10983 .probe = probe_spi_rdid,
10984 .probe_timing = TIMING_ZERO,
10985 .block_erasers =
10986 {
10987 {
10988 .eraseblocks = { {4 * 1024, 512} },
10989 .block_erase = spi_block_erase_20,
10990 }, {
10991 .eraseblocks = { {64 * 1024, 32} },
10992 .block_erase = spi_block_erase_d8,
10993 }, {
10994 .eraseblocks = { {2048 * 1024, 1} },
10995 .block_erase = spi_block_erase_60,
10996 }, {
10997 .eraseblocks = { {2048 * 1024, 1} },
10998 .block_erase = spi_block_erase_c7,
10999 }
11000 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011001 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000011002 .unlock = spi_disable_blockprotect_bp3_srwd,
11003 .write = spi_chip_write_256,
11004 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11005 .voltage = {2700, 3600},
11006 },
11007
11008 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011009 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +000011010 .name = "Pm25LD256C",
11011 .bustype = BUS_SPI,
11012 .manufacture_id = PMC_ID,
11013 .model_id = PMC_PM25LD256C,
11014 .total_size = 32,
11015 .page_size = 256,
11016 .feature_bits = FEATURE_WRSR_WREN,
11017 .tested = TEST_UNTESTED,
11018 .probe = probe_spi_rdid,
11019 .probe_timing = TIMING_ZERO,
11020 .block_erasers =
11021 {
11022 {
11023 .eraseblocks = { {4 * 1024, 8} },
11024 .block_erase = spi_block_erase_20,
11025 }, {
11026 .eraseblocks = { {4 * 1024, 8} },
11027 .block_erase = spi_block_erase_d7,
11028 }, {
11029 .eraseblocks = { {32 * 1024, 1} },
11030 .block_erase = spi_block_erase_d8,
11031 }, {
11032 .eraseblocks = { {32 * 1024, 1} },
11033 .block_erase = spi_block_erase_60,
11034 }, {
11035 .eraseblocks = { {32 * 1024, 1} },
11036 .block_erase = spi_block_erase_c7,
11037 }
11038 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011039 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011040 .unlock = spi_disable_blockprotect,
11041 .write = spi_chip_write_256,
11042 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11043 .voltage = {2700, 3600},
11044 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100011045
Stefan Taunerf4451612013-04-19 01:59:15 +000011046 {
11047 .vendor = "PMC",
11048 .name = "Pm25LD512(C)",
11049 .bustype = BUS_SPI,
11050 .manufacture_id = PMC_ID,
11051 .model_id = PMC_PM25LD512,
11052 .total_size = 64,
11053 .page_size = 256,
11054 .feature_bits = FEATURE_WRSR_WREN,
11055 .tested = TEST_OK_PREW,
11056 .probe = probe_spi_rdid,
11057 .probe_timing = TIMING_ZERO,
11058 .block_erasers =
11059 {
11060 {
11061 .eraseblocks = { {4 * 1024, 16} },
11062 .block_erase = spi_block_erase_20,
11063 }, {
11064 .eraseblocks = { {4 * 1024, 16} },
11065 .block_erase = spi_block_erase_d7,
11066 }, {
11067 .eraseblocks = { {32 * 1024, 2} },
11068 .block_erase = spi_block_erase_d8,
11069 }, {
11070 .eraseblocks = { {64 * 1024, 1} },
11071 .block_erase = spi_block_erase_60,
11072 }, {
11073 .eraseblocks = { {64 * 1024, 1} },
11074 .block_erase = spi_block_erase_c7,
11075 }
11076 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011077 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011078 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11079 .write = spi_chip_write_256,
11080 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11081 .voltage = {2300, 3600},
11082 },
11083
11084 {
11085 .vendor = "PMC",
11086 .name = "Pm25LD010(C)",
11087 .bustype = BUS_SPI,
11088 .manufacture_id = PMC_ID,
11089 .model_id = PMC_PM25LD010,
11090 .total_size = 128,
11091 .page_size = 256,
11092 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011093 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011094 .probe = probe_spi_rdid,
11095 .probe_timing = TIMING_ZERO,
11096 .block_erasers =
11097 {
11098 {
11099 .eraseblocks = { {4 * 1024, 32} },
11100 .block_erase = spi_block_erase_20,
11101 }, {
11102 .eraseblocks = { {4 * 1024, 32} },
11103 .block_erase = spi_block_erase_d7,
11104 }, {
11105 .eraseblocks = { {32 * 1024, 4} },
11106 .block_erase = spi_block_erase_d8,
11107 }, {
11108 .eraseblocks = { {128 * 1024, 1} },
11109 .block_erase = spi_block_erase_60,
11110 }, {
11111 .eraseblocks = { {128 * 1024, 1} },
11112 .block_erase = spi_block_erase_c7,
11113 }
11114 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011115 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011116 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11117 .write = spi_chip_write_256,
11118 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11119 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
11120 },
11121
11122 {
11123 .vendor = "PMC",
11124 .name = "Pm25LD020(C)",
11125 .bustype = BUS_SPI,
11126 .manufacture_id = PMC_ID,
11127 .model_id = PMC_PM25LD020,
11128 .total_size = 256,
11129 .page_size = 256,
11130 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020011131 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011132 .probe = probe_spi_rdid,
11133 .probe_timing = TIMING_ZERO,
11134 .block_erasers =
11135 {
11136 {
11137 .eraseblocks = { {4 * 1024, 64} },
11138 .block_erase = spi_block_erase_20,
11139 }, {
11140 .eraseblocks = { {4 * 1024, 64} },
11141 .block_erase = spi_block_erase_d7,
11142 }, {
11143 .eraseblocks = { {64 * 1024, 4} },
11144 .block_erase = spi_block_erase_d8,
11145 }, {
11146 .eraseblocks = { {256 * 1024, 1} },
11147 .block_erase = spi_block_erase_60,
11148 }, {
11149 .eraseblocks = { {256 * 1024, 1} },
11150 .block_erase = spi_block_erase_c7,
11151 }
11152 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011153 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011154 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11155 .write = spi_chip_write_256,
11156 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11157 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
11158 },
11159
11160 {
11161 .vendor = "PMC",
11162 .name = "Pm25LD040(C)",
11163 .bustype = BUS_SPI,
11164 .manufacture_id = PMC_ID,
11165 .model_id = PMC_PM25LV040,
11166 .total_size = 512,
11167 .page_size = 256,
11168 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020011169 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011170 .probe = probe_spi_rdid,
11171 .probe_timing = TIMING_ZERO,
11172 .block_erasers =
11173 {
11174 {
11175 .eraseblocks = { {4 * 1024, 128} },
11176 .block_erase = spi_block_erase_20,
11177 }, {
11178 .eraseblocks = { {4 * 1024, 128} },
11179 .block_erase = spi_block_erase_d7,
11180 }, {
11181 .eraseblocks = { {64 * 1024, 8} },
11182 .block_erase = spi_block_erase_d8,
11183 }, {
11184 .eraseblocks = { {512 * 1024, 1} },
11185 .block_erase = spi_block_erase_60,
11186 }, {
11187 .eraseblocks = { {512 * 1024, 1} },
11188 .block_erase = spi_block_erase_c7,
11189 }
11190 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011191 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011192 .unlock = spi_disable_blockprotect,
11193 .write = spi_chip_write_256,
11194 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11195 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
11196 },
11197
Steven Honeyman81a8fb72015-06-02 22:32:24 +000011198 {
11199 .vendor = "PMC",
11200 .name = "Pm25LQ020",
11201 .bustype = BUS_SPI,
11202 .manufacture_id = PMC_ID,
11203 .model_id = PMC_PM25LQ020,
11204 .total_size = 256,
11205 .page_size = 256,
11206 /* OTP: 256B total; read 0x4B, write 0xB1 */
11207 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11208 .tested = TEST_UNTESTED,
11209 .probe = probe_spi_rdid,
11210 .probe_timing = TIMING_ZERO,
11211 .block_erasers =
11212 {
11213 {
11214 .eraseblocks = { {4 * 1024, 64} },
11215 .block_erase = spi_block_erase_20,
11216 }, {
11217 .eraseblocks = { {4 * 1024, 64} },
11218 .block_erase = spi_block_erase_d7,
11219 }, {
11220 .eraseblocks = { {64 * 1024, 4} },
11221 .block_erase = spi_block_erase_d8,
11222 }, {
11223 .eraseblocks = { {256 * 1024, 1} },
11224 .block_erase = spi_block_erase_60,
11225 }, {
11226 .eraseblocks = { {256 * 1024, 1} },
11227 .block_erase = spi_block_erase_c7,
11228 }
11229 },
11230 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11231 .unlock = spi_disable_blockprotect_bp3_srwd,
11232 .write = spi_chip_write_256,
11233 .read = spi_chip_read,
11234 .voltage = {2300, 3600},
11235 },
11236
11237 {
11238 .vendor = "PMC",
11239 .name = "Pm25LQ040",
11240 .bustype = BUS_SPI,
11241 .manufacture_id = PMC_ID,
11242 .model_id = PMC_PM25LQ040,
11243 .total_size = 512,
11244 .page_size = 256,
11245 /* OTP: 256B total; read 0x4B, write 0xB1 */
11246 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11247 .tested = TEST_UNTESTED,
11248 .probe = probe_spi_rdid,
11249 .probe_timing = TIMING_ZERO,
11250 .block_erasers =
11251 {
11252 {
11253 .eraseblocks = { {4 * 1024, 128} },
11254 .block_erase = spi_block_erase_20,
11255 }, {
11256 .eraseblocks = { {4 * 1024, 128} },
11257 .block_erase = spi_block_erase_d7,
11258 }, {
11259 .eraseblocks = { {64 * 1024, 8} },
11260 .block_erase = spi_block_erase_d8,
11261 }, {
11262 .eraseblocks = { {512 * 1024, 1} },
11263 .block_erase = spi_block_erase_60,
11264 }, {
11265 .eraseblocks = { {512 * 1024, 1} },
11266 .block_erase = spi_block_erase_c7,
11267 }
11268 },
11269 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11270 .unlock = spi_disable_blockprotect_bp3_srwd,
11271 .write = spi_chip_write_256,
11272 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11273 .voltage = {2300, 3600},
11274 },
11275
11276 {
11277 .vendor = "PMC",
11278 .name = "Pm25LQ080",
11279 .bustype = BUS_SPI,
11280 .manufacture_id = PMC_ID,
11281 .model_id = PMC_PM25LQ080,
11282 .total_size = 1024,
11283 .page_size = 256,
11284 /* OTP: 64B total; read 0x4B, write 0xB1 */
11285 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11286 .tested = TEST_UNTESTED,
11287 .probe = probe_spi_rdid,
11288 .probe_timing = TIMING_ZERO,
11289 .block_erasers =
11290 {
11291 {
11292 .eraseblocks = { {4 * 1024, 256} },
11293 .block_erase = spi_block_erase_20,
11294 }, {
11295 .eraseblocks = { {4 * 1024, 256} },
11296 .block_erase = spi_block_erase_d7,
11297 }, {
11298 .eraseblocks = { {64 * 1024, 16} },
11299 .block_erase = spi_block_erase_d8,
11300 }, {
11301 .eraseblocks = { {1024 * 1024, 1} },
11302 .block_erase = spi_block_erase_60,
11303 }, {
11304 .eraseblocks = { {1024 * 1024, 1} },
11305 .block_erase = spi_block_erase_c7,
11306 }
11307 },
11308 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11309 .unlock = spi_disable_blockprotect_bp3_srwd,
11310 .write = spi_chip_write_256,
11311 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11312 .voltage = {2300, 3600},
11313 },
11314
11315 {
11316 .vendor = "PMC",
11317 .name = "Pm25LQ016",
11318 .bustype = BUS_SPI,
11319 .manufacture_id = PMC_ID,
11320 .model_id = PMC_PM25LQ016,
11321 .total_size = 2048,
11322 .page_size = 256,
11323 /* OTP: 256B total; read 0x4B, write 0xB1 */
11324 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11325 .tested = TEST_UNTESTED,
11326 .probe = probe_spi_rdid,
11327 .probe_timing = TIMING_ZERO,
11328 .block_erasers =
11329 {
11330 {
11331 .eraseblocks = { {4 * 1024, 512} },
11332 .block_erase = spi_block_erase_20,
11333 }, {
11334 .eraseblocks = { {4 * 1024, 512} },
11335 .block_erase = spi_block_erase_d7,
11336 }, {
11337 .eraseblocks = { {64 * 1024, 32} },
11338 .block_erase = spi_block_erase_d8,
11339 }, {
11340 .eraseblocks = { {2048 * 1024, 1} },
11341 .block_erase = spi_block_erase_60,
11342 }, {
11343 .eraseblocks = { {2048 * 1024, 1} },
11344 .block_erase = spi_block_erase_c7,
11345 }
11346 },
11347 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11348 .unlock = spi_disable_blockprotect_bp3_srwd,
11349 .write = spi_chip_write_256,
11350 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11351 .voltage = {2300, 3600},
11352 },
11353
11354 {
11355 .vendor = "PMC",
11356 .name = "Pm25LQ032C",
11357 .bustype = BUS_SPI,
11358 .manufacture_id = PMC_ID,
11359 .model_id = PMC_PM25LQ032C,
11360 .total_size = 4096,
11361 .page_size = 256,
11362 /* OTP: 64B total; read 0x4B, write 0xB1 */
11363 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011364 .tested = TEST_OK_PREW,
Steven Honeyman81a8fb72015-06-02 22:32:24 +000011365 .probe = probe_spi_rdid,
11366 .probe_timing = TIMING_ZERO,
11367 .block_erasers =
11368 {
11369 {
11370 .eraseblocks = { {4 * 1024, 1024} },
11371 .block_erase = spi_block_erase_20,
11372 }, {
11373 .eraseblocks = { {4 * 1024, 1024} },
11374 .block_erase = spi_block_erase_d7,
11375 }, {
11376 .eraseblocks = { {64 * 1024, 64} },
11377 .block_erase = spi_block_erase_d8,
11378 }, {
11379 .eraseblocks = { {4096 * 1024, 1} },
11380 .block_erase = spi_block_erase_60,
11381 }, {
11382 .eraseblocks = { {4096 * 1024, 1} },
11383 .block_erase = spi_block_erase_c7,
11384 }
11385 },
11386 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11387 .unlock = spi_disable_blockprotect_bp3_srwd,
11388 .write = spi_chip_write_256,
11389 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11390 .voltage = {2700, 3600},
11391 },
11392
11393 {
Stefan Taunerf4451612013-04-19 01:59:15 +000011394 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011395 .name = "Pm25LV512(A)",
11396 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000011397 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011398 .model_id = PMC_PM25LV512,
11399 .total_size = 64,
11400 .page_size = 256,
11401 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +000011402 .tested = TEST_OK_PREW,
Stefan Taunerbecda742014-05-30 19:34:00 +000011403 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011404 .probe_timing = TIMING_ZERO,
11405 .block_erasers =
11406 {
11407 {
11408 .eraseblocks = { {4 * 1024, 16} },
11409 .block_erase = spi_block_erase_d7,
11410 }, {
11411 .eraseblocks = { {32 * 1024, 2} },
11412 .block_erase = spi_block_erase_d8,
11413 }, {
11414 .eraseblocks = { {64 * 1024, 1} },
11415 .block_erase = spi_block_erase_c7,
11416 }
11417 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011418 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011419 .unlock = spi_disable_blockprotect,
11420 .write = spi_chip_write_256,
11421 .read = spi_chip_read, /* Fast read (0x0B) supported */
11422 .voltage = {2700, 3600},
11423 },
11424
11425 {
11426 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011427 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011428 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000011429 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011430 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011431 .total_size = 128,
11432 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011433 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000011434 .tested = TEST_OK_PREW,
11435 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011436 .probe_timing = TIMING_ZERO,
11437 .block_erasers =
11438 {
11439 {
11440 .eraseblocks = { {4 * 1024, 32} },
11441 .block_erase = spi_block_erase_d7,
11442 }, {
11443 .eraseblocks = { {32 * 1024, 4} },
11444 .block_erase = spi_block_erase_d8,
11445 }, {
11446 .eraseblocks = { {128 * 1024, 1} },
11447 .block_erase = spi_block_erase_c7,
11448 }
11449 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011450 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011451 .unlock = spi_disable_blockprotect,
11452 .write = spi_chip_write_256,
11453 .read = spi_chip_read, /* Fast read (0x0B) supported */
11454 .voltage = {2700, 3600},
11455 },
11456
11457 {
11458 .vendor = "PMC",
11459 .name = "Pm25LV010A",
11460 .bustype = BUS_SPI,
11461 .manufacture_id = PMC_ID,
11462 .model_id = PMC_PM25LV010,
11463 .total_size = 128,
11464 .page_size = 256,
11465 .feature_bits = FEATURE_WRSR_WREN,
11466 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011467 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011468 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011469 .block_erasers =
11470 {
11471 {
11472 .eraseblocks = { {4 * 1024, 32} },
11473 .block_erase = spi_block_erase_d7,
11474 }, {
11475 .eraseblocks = { {32 * 1024, 4} },
11476 .block_erase = spi_block_erase_d8,
11477 }, {
11478 .eraseblocks = { {128 * 1024, 1} },
11479 .block_erase = spi_block_erase_c7,
11480 }
11481 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011482 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011483 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011484 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011485 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000011486 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011487 },
11488
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011489 {
11490 .vendor = "PMC",
11491 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011492 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011493 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011494 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011495 .total_size = 256,
11496 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011497 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011498 .tested = TEST_UNTESTED,
11499 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011500 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011501 .block_erasers =
11502 {
11503 {
11504 .eraseblocks = { {4 * 1024, 64} },
11505 .block_erase = spi_block_erase_d7,
11506 }, {
11507 .eraseblocks = { {64 * 1024, 4} },
11508 .block_erase = spi_block_erase_d8,
11509 }, {
11510 .eraseblocks = { {256 * 1024, 1} },
11511 .block_erase = spi_block_erase_c7,
11512 }
11513 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011514 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011515 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011516 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011517 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011518 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011519 },
11520
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011521 {
11522 .vendor = "PMC",
11523 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011524 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011525 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011526 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011527 .total_size = 512,
11528 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011529 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000011530 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011531 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011532 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011533 .block_erasers =
11534 {
11535 {
11536 .eraseblocks = { {4 * 1024, 128} },
11537 .block_erase = spi_block_erase_d7,
11538 }, {
11539 .eraseblocks = { {64 * 1024, 8} },
11540 .block_erase = spi_block_erase_d8,
11541 }, {
11542 .eraseblocks = { {512 * 1024, 1} },
11543 .block_erase = spi_block_erase_c7,
11544 }
11545 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011546 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011547 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011548 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011549 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011550 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011551 },
11552
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011553 {
11554 .vendor = "PMC",
11555 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011556 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011557 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011558 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011559 .total_size = 1024,
11560 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011561 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011562 .tested = TEST_UNTESTED,
11563 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011564 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011565 .block_erasers =
11566 {
11567 {
11568 .eraseblocks = { {4 * 1024, 256} },
11569 .block_erase = spi_block_erase_d7,
11570 }, {
11571 .eraseblocks = { {4 * 1024, 256} },
11572 .block_erase = spi_block_erase_20,
11573 }, {
11574 .eraseblocks = { {64 * 1024, 16} },
11575 .block_erase = spi_block_erase_d8,
11576 }, {
11577 .eraseblocks = { {1024 * 1024, 1} },
11578 .block_erase = spi_block_erase_60,
11579 }, {
11580 .eraseblocks = { {1024 * 1024, 1} },
11581 .block_erase = spi_block_erase_c7,
11582 }
11583 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011584 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011585 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011586 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011587 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011588 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011589 },
11590
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011591 {
11592 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011593 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011594 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011595 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011596 .model_id = PMC_PM25LV016B,
11597 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011598 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011599 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011600 .tested = TEST_UNTESTED,
11601 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011602 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011603 .block_erasers =
11604 {
11605 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011606 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +000011607 .block_erase = spi_block_erase_d7,
11608 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011609 .eraseblocks = { {4 * 1024, 512} },
11610 .block_erase = spi_block_erase_20,
11611 }, {
11612 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +000011613 .block_erase = spi_block_erase_d8,
11614 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011615 .eraseblocks = { {2 * 1024 * 1024, 1} },
11616 .block_erase = spi_block_erase_60,
11617 }, {
11618 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011619 .block_erase = spi_block_erase_c7,
11620 }
11621 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011622 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011623 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011624 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011625 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000011626 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011627 },
11628
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011629 {
11630 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011631 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011632 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011633 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011634 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011635 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011636 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011637 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011638 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000011639 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011640 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011641 .block_erasers =
11642 {
11643 {
11644 .eraseblocks = {
11645 {128 * 1024, 1},
11646 {96 * 1024, 1},
11647 {8 * 1024, 2},
11648 {16 * 1024, 1},
11649 },
Sean Nelson35727f72010-01-28 23:55:12 +000011650 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011651 }, {
11652 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011653 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011654 },
11655 },
Sean Nelson35727f72010-01-28 23:55:12 +000011656 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011657 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011658 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011659 },
11660
11661 {
11662 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011663 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011664 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011665 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011666 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011667 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011668 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011669 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011670 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011671 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011672 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011673 .block_erasers =
11674 {
11675 {
11676 .eraseblocks = {
11677 {16 * 1024, 1},
11678 {8 * 1024, 2},
11679 {96 * 1024, 1},
11680 {128 * 1024, 1},
11681 },
Sean Nelson35727f72010-01-28 23:55:12 +000011682 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011683 }, {
11684 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011685 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011686 },
11687 },
Sean Nelson35727f72010-01-28 23:55:12 +000011688 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011689 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011690 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011691 },
11692
11693 {
11694 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011695 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011696 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011697 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011698 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011699 .total_size = 128,
11700 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011701 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011702 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011703 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011704 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000011705 .block_erasers =
11706 {
11707 {
11708 .eraseblocks = { {4 * 1024, 32} },
11709 .block_erase = erase_sector_jedec,
11710 }, {
11711 .eraseblocks = { {64 * 1024, 2} },
11712 .block_erase = erase_block_jedec,
11713 }, {
11714 .eraseblocks = { {128 * 1024, 1} },
11715 .block_erase = erase_chip_block_jedec,
11716 }
11717 },
Sean Nelson35727f72010-01-28 23:55:12 +000011718 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011719 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011720 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011721 },
11722
11723 {
11724 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011725 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011726 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011727 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011728 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011729 .total_size = 256,
11730 .page_size = 4096,
11731 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11732 .tested = TEST_UNTESTED,
11733 .probe = probe_jedec,
11734 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100011735 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011736 {
11737 {
11738 .eraseblocks = { {4 * 1024, 64} },
11739 .block_erase = erase_sector_jedec,
11740 }, {
11741 .eraseblocks = { {64 * 1024, 4} },
11742 .block_erase = erase_block_jedec,
11743 }, {
11744 .eraseblocks = { {256 * 1024, 1} },
11745 .block_erase = erase_chip_block_jedec,
11746 }
11747 },
11748 .write = write_jedec_1,
11749 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011750 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011751 },
11752
11753 {
11754 .vendor = "PMC",
11755 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011756 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011757 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011758 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011759 .total_size = 512,
11760 .page_size = 4096,
11761 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011762 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011763 .probe = probe_jedec,
11764 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100011765 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011766 {
11767 {
11768 .eraseblocks = { {4 * 1024, 128} },
11769 .block_erase = erase_sector_jedec,
11770 }, {
11771 .eraseblocks = { {64 * 1024, 8} },
11772 .block_erase = erase_block_jedec,
11773 }, {
11774 .eraseblocks = { {512 * 1024, 1} },
11775 .block_erase = erase_chip_block_jedec,
11776 }
11777 },
11778 .write = write_jedec_1,
11779 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011780 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011781 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000011782
11783 {
11784 .vendor = "PMC",
11785 .name = "Pm39LV512",
11786 .bustype = BUS_PARALLEL,
11787 .manufacture_id = PMC_ID_NOPREFIX,
11788 .model_id = PMC_PM39LV512,
11789 .total_size = 64,
11790 .page_size = 4096,
11791 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11792 .tested = TEST_OK_PREW,
11793 .probe = probe_jedec,
11794 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11795 .block_erasers =
11796 {
11797 {
11798 .eraseblocks = { {4 * 1024, 16} },
11799 .block_erase = erase_sector_jedec,
11800 }, {
11801 .eraseblocks = { {64 * 1024, 1} },
11802 .block_erase = erase_block_jedec,
11803 }, {
11804 .eraseblocks = { {64 * 1024, 1} },
11805 .block_erase = erase_chip_block_jedec,
11806 }
11807 },
11808 .write = write_jedec_1,
11809 .read = read_memmapped,
11810 .voltage = {2700, 3600},
11811 },
11812
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011813 {
11814 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011815 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011816 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011817 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011818 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011819 .total_size = 256,
11820 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011821 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011822 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011823 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011824 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000011825 .block_erasers =
11826 {
11827 {
11828 .eraseblocks = { {4 * 1024, 64} },
11829 .block_erase = erase_sector_jedec,
11830 }, {
11831 .eraseblocks = { {16 * 1024, 16} },
11832 .block_erase = erase_block_jedec,
11833 }, {
11834 .eraseblocks = { {256 * 1024, 1} },
11835 .block_erase = erase_chip_block_jedec,
11836 }
11837 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011838 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000011839 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011840 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011841 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011842 },
11843
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011844 {
11845 .vendor = "PMC",
11846 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011847 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011848 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011849 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011850 .total_size = 512,
11851 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011852 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011853 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011854 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011855 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011856 .block_erasers =
11857 {
11858 {
11859 .eraseblocks = { {4 * 1024, 128} },
11860 .block_erase = erase_sector_jedec,
11861 }, {
11862 .eraseblocks = { {64 * 1024, 8} },
11863 .block_erase = erase_block_jedec,
11864 }, {
11865 .eraseblocks = { {512 * 1024, 1} },
11866 .block_erase = erase_chip_block_jedec,
11867 }
11868 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011869 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000011870 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011871 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011872 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011873 },
11874
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011875 {
Sean Nelsond70b09c2009-11-24 02:11:08 +000011876 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +000011877 .name = "LE25FW106",
11878 .bustype = BUS_SPI,
11879 .manufacture_id = SANYO_ID,
11880 .model_id = SANYO_LE25FW106,
11881 .total_size = 128,
11882 .page_size = 256,
11883 .feature_bits = FEATURE_WRSR_WREN,
11884 .tested = TEST_OK_PREW,
11885 .probe = probe_spi_res2,
11886 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011887 .block_erasers =
11888 {
Stefan Taunera60d4082014-06-04 16:17:03 +000011889 {
11890 .eraseblocks = { {2 * 1024, 64} },
11891 .block_erase = spi_block_erase_d7,
11892 }, {
11893 .eraseblocks = { {32 * 1024, 4} },
11894 .block_erase = spi_block_erase_d8,
11895 }, {
11896 .eraseblocks = { {128 * 1024, 1} },
11897 .block_erase = spi_block_erase_c7,
11898 }
11899 },
11900 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
11901 .unlock = spi_disable_blockprotect_bp1_srwd,
11902 .write = spi_chip_write_256,
11903 .read = spi_chip_read,
11904 .voltage = {2700, 3600},
11905 },
11906
11907 {
11908 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +000011909 .name = "LE25FW406A",
11910 .bustype = BUS_SPI,
11911 .manufacture_id = SANYO_ID,
11912 .model_id = SANYO_LE25FW406A,
11913 .total_size = 512,
11914 .page_size = 256,
11915 .feature_bits = FEATURE_WRSR_WREN,
11916 .tested = TEST_OK_PREW,
11917 .probe = probe_spi_res2,
11918 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011919 .block_erasers =
11920 {
Stefan Tauner33491b82014-05-18 21:36:04 +000011921 {
11922 .eraseblocks = { {4 * 1024, 128} },
11923 .block_erase = spi_block_erase_d7,
11924 }, {
11925 .eraseblocks = { {64 * 1024, 8} },
11926 .block_erase = spi_block_erase_d8,
11927 }, {
11928 .eraseblocks = { {512 * 1024, 1} },
11929 .block_erase = spi_block_erase_c7,
Alan Greenfdf5da42019-06-27 16:56:52 +100011930 }
11931 },
Stefan Tauner33491b82014-05-18 21:36:04 +000011932 .printlock = spi_prettyprint_status_register_plain,
11933 .unlock = spi_disable_blockprotect,
11934 .write = spi_chip_write_256,
11935 .read = spi_chip_read,
11936 .voltage = {2700, 3600},
11937 },
11938
11939 {
11940 .vendor = "Sanyo",
Angel Ponsf2cd3252018-09-30 19:03:45 +020011941 .name = "LE25FU106B",
11942 .bustype = BUS_SPI,
11943 .manufacture_id = SANYO_ID,
11944 .model_id = SANYO_LE25FU106B,
11945 .total_size = 128,
11946 .page_size = 256,
11947 .feature_bits = FEATURE_WRSR_WREN,
11948 .tested = TEST_UNTESTED,
11949 .probe = probe_spi_res2,
11950 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011951 .block_erasers =
11952 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020011953 /* FIXME: Is this correct?
11954 {
11955 .eraseblocks = { {2 * 1024, 64} },
11956 .block_erase = spi_block_erase_d7,
11957 },*/
11958 {
11959 .eraseblocks = { {32 * 1024, 4} },
11960 .block_erase = spi_block_erase_d8,
11961 }, {
11962 .eraseblocks = { {128 * 1024, 1} },
11963 .block_erase = spi_block_erase_c7,
11964 }
11965 },
11966 .printlock = spi_prettyprint_status_register_bp1_srwd,
11967 .unlock = spi_disable_blockprotect_bp1_srwd,
11968 .write = spi_chip_write_256,
11969 .read = spi_chip_read,
11970 .voltage = {2300, 3600},
11971 },
11972
11973 {
11974 .vendor = "Sanyo",
11975 .name = "LE25FU206",
11976 .bustype = BUS_SPI,
11977 .manufacture_id = SANYO_ID,
11978 .model_id = SANYO_LE25FU206,
11979 .total_size = 256,
11980 .page_size = 256,
11981 .feature_bits = FEATURE_WRSR_WREN,
11982 .tested = TEST_UNTESTED,
11983 .probe = probe_spi_res2,
11984 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011985 .block_erasers =
11986 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020011987 {
11988 .eraseblocks = { {4 * 1024, 64} },
11989 .block_erase = spi_block_erase_d7,
11990 }, {
11991 .eraseblocks = { {64 * 1024, 4} },
11992 .block_erase = spi_block_erase_d8,
11993 }, {
11994 .eraseblocks = { {256 * 1024, 1} },
11995 .block_erase = spi_block_erase_c7,
11996 }
11997 },
11998 .printlock = spi_prettyprint_status_register_bp1_srwd,
11999 .unlock = spi_disable_blockprotect_bp1_srwd,
12000 .write = spi_chip_write_256,
12001 .read = spi_chip_read,
12002 .voltage = {2300, 3600},
12003 },
12004
12005 {
12006 .vendor = "Sanyo",
12007 .name = "LE25FU206A",
12008 .bustype = BUS_SPI,
12009 .manufacture_id = SANYO_ID,
12010 .model_id = SANYO_LE25FU206A,
12011 .total_size = 256,
12012 .page_size = 256,
12013 .tested = TEST_UNTESTED,
12014 .probe = probe_spi_rdid,
12015 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012016 .block_erasers =
12017 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020012018 {
12019 .eraseblocks = { {4 * 1024, 64} },
12020 .block_erase = spi_block_erase_20,
12021 }, {
12022 .eraseblocks = { {4 * 1024, 64} },
12023 .block_erase = spi_block_erase_d7,
12024 }, {
12025 .eraseblocks = { {64 * 1024, 4} },
12026 .block_erase = spi_block_erase_d8,
12027 }, {
12028 .eraseblocks = { {256 * 1024, 1} },
12029 .block_erase = spi_block_erase_60,
12030 }, {
12031 .eraseblocks = { {256 * 1024, 1} },
12032 .block_erase = spi_block_erase_c7,
12033 }
12034 },
12035 .printlock = spi_prettyprint_status_register_bp2_srwd,
12036 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12037 .write = spi_chip_write_256,
12038 .read = spi_chip_read,
12039 .voltage = {2300, 3600},
12040 },
12041
12042 {
12043 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +000012044 .name = "LE25FU406B",
12045 .bustype = BUS_SPI,
12046 .manufacture_id = SANYO_ID,
12047 .model_id = SANYO_LE25FU406B,
12048 .total_size = 512,
12049 .page_size = 256,
12050 .feature_bits = FEATURE_WRSR_WREN,
12051 .tested = TEST_OK_PREW,
12052 .probe = probe_spi_res2,
12053 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012054 .block_erasers =
12055 {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012056 {
12057 .eraseblocks = { {4 * 1024, 128} },
12058 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012059 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012060 .eraseblocks = { {64 * 1024, 8} },
12061 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012062 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012063 .eraseblocks = { {512 * 1024, 1} },
12064 .block_erase = spi_block_erase_c7,
12065 }
Alan Greenfdf5da42019-06-27 16:56:52 +100012066 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012067 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +000012068 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12069 .write = spi_chip_write_256,
12070 .read = spi_chip_read,
12071 .voltage = {2300, 3600},
12072 },
12073
12074 {
12075 .vendor = "Sanyo",
Stefan Tauner2f055df2015-12-25 22:13:15 +000012076 .name = "LE25FU406C/LE25U40CMC",
12077 .bustype = BUS_SPI,
12078 .manufacture_id = SANYO_ID,
12079 .model_id = SANYO_LE25FU406C,
12080 .total_size = 512,
12081 .page_size = 256,
12082 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsce2c09d2018-09-30 20:22:02 +020012083 .tested = TEST_OK_PREW,
Stefan Tauner2f055df2015-12-25 22:13:15 +000012084 .probe = probe_spi_rdid,
12085 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012086 .block_erasers =
12087 {
Stefan Tauner2f055df2015-12-25 22:13:15 +000012088 {
12089 .eraseblocks = { {4 * 1024, 128} },
12090 .block_erase = spi_block_erase_20,
12091 }, {
12092 .eraseblocks = { {4 * 1024, 128} },
12093 .block_erase = spi_block_erase_d7,
12094 }, {
12095 .eraseblocks = { {64 * 1024, 8} },
12096 .block_erase = spi_block_erase_d8,
12097 }, {
12098 .eraseblocks = { {512 * 1024, 1} },
12099 .block_erase = spi_block_erase_60,
12100 }, {
12101 .eraseblocks = { {512 * 1024, 1} },
12102 .block_erase = spi_block_erase_c7,
12103 }
Alan Greenfdf5da42019-06-27 16:56:52 +100012104 },
Stefan Tauner2f055df2015-12-25 22:13:15 +000012105 .printlock = spi_prettyprint_status_register_bp2_srwd,
12106 .unlock = spi_disable_blockprotect_bp2_srwd,
12107 .write = spi_chip_write_256,
12108 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
12109 .voltage = {2300, 3600},
12110 },
12111
12112 {
12113 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012114 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012115 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +000012116 .manufacture_id = SANYO_ID,
12117 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012118 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +000012119 .page_size = 256,
12120 .tested = TEST_UNTESTED,
12121 .probe = probe_spi_rdid,
12122 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012123 .block_erasers =
12124 {
12125 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012126 .eraseblocks = { {256, 1024} },
12127 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012128 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012129 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +000012130 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012131 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012132 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000012133 .block_erase = spi_block_erase_c7,
12134 }
12135 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012136 .printlock = spi_prettyprint_status_register_default_welwip,
12137 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +000012138 .write = spi_chip_write_256,
12139 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012140 .voltage = {2700, 3600},
12141 },
12142
12143 {
12144 .vendor = "Sanyo",
12145 .name = "LE25FW403A",
12146 .bustype = BUS_SPI,
12147 .manufacture_id = SANYO_ID,
12148 .model_id = SANYO_LE25FW403A,
12149 .total_size = 512,
12150 .page_size = 256,
12151 .tested = TEST_UNTESTED,
12152 .probe = probe_spi_rdid,
12153 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012154 .block_erasers =
12155 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012156 {
12157 .eraseblocks = { {256, 2 * 1024} },
12158 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012159 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012160 .eraseblocks = { {64 * 1024, 8} },
12161 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012162 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012163 .eraseblocks = { {512 * 1024, 1} },
12164 .block_erase = spi_block_erase_c7,
12165 }
12166 },
12167 .printlock = spi_prettyprint_status_register_default_welwip,
12168 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12169 .write = spi_chip_write_256,
12170 .read = spi_chip_read,
12171 .voltage = {2700, 3600},
12172 },
12173
12174 {
12175 .vendor = "Sanyo",
12176 .name = "LE25FW418A",
12177 .bustype = BUS_SPI,
12178 .manufacture_id = SANYO_ID,
12179 .model_id = SANYO_LE25FW418A,
12180 .total_size = 512,
12181 .page_size = 256,
12182 .feature_bits = FEATURE_WRSR_WREN,
12183 .tested = TEST_UNTESTED,
12184 .probe = probe_spi_res2,
12185 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012186 .block_erasers =
12187 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012188 {
12189 .eraseblocks = { {4 * 1024, 128} },
12190 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012191 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012192 .eraseblocks = { {64 * 1024, 8} },
12193 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012194 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012195 .eraseblocks = { {512 * 1024, 1} },
12196 .block_erase = spi_block_erase_c7,
Alan Greenfdf5da42019-06-27 16:56:52 +100012197 }
12198 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012199 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012200 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12201 .write = spi_chip_write_256,
12202 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
12203 .voltage = {2700, 3600},
12204 },
12205
12206 {
12207 .vendor = "Sanyo",
12208 .name = "LE25FW806",
12209 .bustype = BUS_SPI,
12210 .manufacture_id = SANYO_ID,
12211 .model_id = SANYO_LE25FW806,
12212 .total_size = 1024,
12213 .page_size = 256,
12214 .feature_bits = FEATURE_WRSR_WREN,
12215 .tested = TEST_UNTESTED,
12216 .probe = probe_spi_res2,
12217 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012218 .block_erasers =
12219 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012220 {
12221 .eraseblocks = { {4 * 1024, 256} },
12222 .block_erase = spi_block_erase_20,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012223 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012224 .eraseblocks = { {4 * 1024, 256} },
12225 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012226 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012227 .eraseblocks = { {64 * 1024, 16} },
12228 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012229 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012230 .eraseblocks = { {1024 * 1024, 1} },
12231 .block_erase = spi_block_erase_c7,
12232 }
12233 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012234 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012235 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12236 .write = spi_chip_write_256,
12237 .read = spi_chip_read,
12238 .voltage = {2700, 3600},
12239 },
12240
12241 {
12242 .vendor = "Sanyo",
12243 .name = "LE25FW808",
12244 .bustype = BUS_SPI,
12245 .manufacture_id = SANYO_ID,
12246 .model_id = SANYO_LE25FW808,
12247 .total_size = 1024,
12248 .page_size = 256,
12249 .feature_bits = FEATURE_WRSR_WREN,
12250 .tested = TEST_UNTESTED,
12251 .probe = probe_spi_res2,
12252 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012253 .block_erasers =
12254 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012255 {
12256 .eraseblocks = { {8 * 1024, 128} },
12257 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012258 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012259 .eraseblocks = { {64 * 1024, 16} },
12260 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012261 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012262 .eraseblocks = { {1024 * 1024, 1} },
12263 .block_erase = spi_block_erase_c7,
12264 }
12265 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012266 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012267 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12268 .write = spi_chip_write_256,
12269 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
12270 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000012271 },
12272
12273 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012274 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000012275 .name = "LH28F008BJT-BTLZ1",
12276 .bustype = BUS_PARALLEL,
12277 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000012278 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000012279 .total_size = 1024,
12280 .page_size = 64 * 1024,
12281 .tested = TEST_OK_PREW,
12282 .probe = probe_82802ab,
12283 .probe_timing = TIMING_ZERO,
12284 .block_erasers =
12285 {
12286 {
12287 .eraseblocks = {
12288 {8 * 1024, 8},
12289 {64 * 1024, 15}
12290 },
12291 .block_erase = erase_block_82802ab,
12292 }, {
12293 .eraseblocks = { {1024 * 1024, 1} },
12294 .block_erase = erase_sector_49lfxxxc,
12295 }
12296 },
12297 .unlock = unlock_lh28f008bjt,
12298 .write = write_82802ab,
12299 .read = read_memmapped,
12300 .voltage = {2700, 3600},
12301 },
12302
12303 {
12304 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012305 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012306 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012307 .manufacture_id = SHARP_ID,
12308 .model_id = SHARP_LHF00L04,
12309 .total_size = 1024,
12310 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012311 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012312 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012313 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012314 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012315 .block_erasers =
12316 {
12317 {
12318 .eraseblocks = {
12319 {64 * 1024, 15},
12320 {8 * 1024, 8}
12321 },
Sean Nelson28accc22010-03-19 18:47:06 +000012322 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012323 }, {
12324 .eraseblocks = {
12325 {1024 * 1024, 1}
12326 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000012327 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012328 },
12329 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012330 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000012331 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012332 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012333 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012334 },
12335
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012336 {
12337 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000012338 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012339 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012340 .manufacture_id = SPANSION_ID,
12341 .model_id = SPANSION_S25FL004A,
12342 .total_size = 512,
12343 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012344 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000012345 .tested = TEST_UNTESTED,
12346 .probe = probe_spi_rdid,
12347 .probe_timing = TIMING_ZERO,
12348 .block_erasers =
12349 {
12350 {
12351 .eraseblocks = { {64 * 1024, 8} },
12352 .block_erase = spi_block_erase_d8,
12353 }, {
12354 .eraseblocks = { {512 * 1024, 1} },
12355 .block_erase = spi_block_erase_c7,
12356 }
12357 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012358 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012359 .unlock = spi_disable_blockprotect,
12360 .write = spi_chip_write_256,
12361 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012362 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012363 },
12364
12365 {
12366 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000012367 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012368 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000012369 .manufacture_id = SPANSION_ID,
12370 .model_id = SPANSION_S25FL008A,
12371 .total_size = 1024,
12372 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012373 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000012374 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000012375 .probe = probe_spi_rdid,
12376 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000012377 .block_erasers =
12378 {
12379 {
12380 .eraseblocks = { {64 * 1024, 16} },
12381 .block_erase = spi_block_erase_d8,
12382 }, {
12383 .eraseblocks = { {1024 * 1024, 1} },
12384 .block_erase = spi_block_erase_c7,
12385 }
12386 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012387 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012388 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000012389 .write = spi_chip_write_256,
12390 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012391 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000012392 },
12393
12394 {
12395 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012396 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012397 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012398 .manufacture_id = SPANSION_ID,
12399 .model_id = SPANSION_S25FL016A,
12400 .total_size = 2048,
12401 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012402 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012403 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012404 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012405 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012406 .block_erasers =
12407 {
12408 {
12409 .eraseblocks = { {64 * 1024, 32} },
12410 .block_erase = spi_block_erase_d8,
12411 }, {
12412 .eraseblocks = { {2 * 1024 * 1024, 1} },
12413 .block_erase = spi_block_erase_c7,
12414 }
12415 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012416 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012417 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012418 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012419 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012420 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012421 },
12422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012423 {
Rudy Hostf4e57772010-11-29 00:37:49 +000012424 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012425 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012426 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012427 .manufacture_id = SPANSION_ID,
12428 .model_id = SPANSION_S25FL032A,
12429 .total_size = 4096,
12430 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012431 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012432 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000012433 .probe = probe_spi_rdid,
12434 .probe_timing = TIMING_ZERO,
12435 .block_erasers =
12436 {
12437 {
12438 .eraseblocks = { {64 * 1024, 64} },
12439 .block_erase = spi_block_erase_d8,
12440 }, {
12441 .eraseblocks = { {4 * 1024 * 1024, 1} },
12442 .block_erase = spi_block_erase_c7,
12443 }
12444 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012445 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012446 .unlock = spi_disable_blockprotect,
12447 .write = spi_chip_write_256,
12448 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012449 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012450 },
12451
12452 {
12453 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012454 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012455 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012456 .manufacture_id = SPANSION_ID,
12457 .model_id = SPANSION_S25FL064A,
12458 .total_size = 8192,
12459 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012460 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000012461 .tested = TEST_OK_PREW,
12462 .probe = probe_spi_rdid,
12463 .probe_timing = TIMING_ZERO,
12464 .block_erasers =
12465 {
12466 {
12467 .eraseblocks = { {64 * 1024, 128} },
12468 .block_erase = spi_block_erase_d8,
12469 }, {
12470 .eraseblocks = { {8 * 1024 * 1024, 1} },
12471 .block_erase = spi_block_erase_c7,
12472 }
12473 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012474 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012475 .unlock = spi_disable_blockprotect,
12476 .write = spi_chip_write_256,
12477 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012478 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012479 },
12480
12481 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012482 .vendor = "Spansion",
12483 .name = "S25FL204K",
12484 .bustype = BUS_SPI,
12485 .manufacture_id = SPANSION_ID,
12486 .model_id = SPANSION_S25FL204,
12487 .total_size = 512,
12488 .page_size = 256,
12489 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012490 .tested = TEST_OK_PR,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012491 .probe = probe_spi_rdid,
12492 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012493 .block_erasers =
12494 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012495 {
12496 .eraseblocks = { {4 * 1024, 128} },
12497 .block_erase = spi_block_erase_20,
12498 }, {
12499 .eraseblocks = { {64 * 1024, 8} },
12500 .block_erase = spi_block_erase_d8,
12501 }, {
12502 .eraseblocks = { { 512 * 1024, 1} },
12503 .block_erase = spi_block_erase_60,
12504 }, {
12505 .eraseblocks = { { 512 * 1024, 1} },
12506 .block_erase = spi_block_erase_c7,
12507 }
12508 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012509 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012510 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012511 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012512 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012513 .voltage = {2700, 3600},
12514 },
12515
12516 {
12517 .vendor = "Spansion",
12518 .name = "S25FL208K",
12519 .bustype = BUS_SPI,
12520 .manufacture_id = SPANSION_ID,
12521 .model_id = SPANSION_S25FL208,
12522 .total_size = 1024,
12523 .page_size = 256,
12524 .feature_bits = FEATURE_WRSR_WREN,
Nico Huber1a7fb6e2018-10-02 20:34:13 +020012525 .tested = TEST_OK_PREW,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012526 .probe = probe_spi_rdid,
12527 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012528 .block_erasers =
12529 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012530 {
12531 .eraseblocks = { {4 * 1024, 256} },
12532 .block_erase = spi_block_erase_20,
12533 }, {
12534 .eraseblocks = { {64 * 1024, 16} },
12535 .block_erase = spi_block_erase_d8,
12536 }, {
12537 .eraseblocks = { { 1024 * 1024, 1} },
12538 .block_erase = spi_block_erase_60,
12539 }, {
12540 .eraseblocks = { { 1024 * 1024, 1} },
12541 .block_erase = spi_block_erase_c7,
12542 }
12543 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012544 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012545 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012546 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012547 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012548 .voltage = {2700, 3600},
12549 },
12550
12551 {
12552 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000012553 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012554 .bustype = BUS_SPI,
12555 .manufacture_id = SPANSION_ID,
12556 .model_id = SPANSION_S25FL216,
12557 .total_size = 2048,
12558 .page_size = 256,
12559 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
12560 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12561 .tested = TEST_UNTESTED,
12562 .probe = probe_spi_rdid,
12563 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012564 .block_erasers =
12565 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012566 {
12567 .eraseblocks = { {4 * 1024, 512} },
12568 .block_erase = spi_block_erase_20,
12569 }, {
12570 .eraseblocks = { {64 * 1024, 32} },
12571 .block_erase = spi_block_erase_d8,
12572 }, {
12573 .eraseblocks = { { 2048 * 1024, 1} },
12574 .block_erase = spi_block_erase_60,
12575 }, {
12576 .eraseblocks = { { 2048 * 1024, 1} },
12577 .block_erase = spi_block_erase_c7,
12578 }
12579 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012580 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012581 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012582 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012583 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012584 .voltage = {2700, 3600},
12585 },
12586
12587 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012588 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000012589 .name = "S25FL132K",
12590 .bustype = BUS_SPI,
12591 .manufacture_id = SPANSION_ID,
12592 .model_id = SPANSION_S25FL132K,
12593 .total_size = 4096,
12594 .page_size = 256,
12595 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
12596 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12597 .tested = TEST_UNTESTED,
12598 .probe = probe_spi_rdid,
12599 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012600 .block_erasers =
12601 {
Nikolay Martynov598968a2014-05-04 21:44:13 +000012602 {
12603 .eraseblocks = { {4 * 1024, 1024} },
12604 .block_erase = spi_block_erase_20,
12605 }, {
12606 .eraseblocks = { {64 * 1024, 64} },
12607 .block_erase = spi_block_erase_d8,
12608 }, {
12609 .eraseblocks = { { 4096 * 1024, 1} },
12610 .block_erase = spi_block_erase_60,
12611 }, {
12612 .eraseblocks = { { 4096 * 1024, 1} },
12613 .block_erase = spi_block_erase_c7,
12614 }
12615 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012616 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000012617 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12618 .write = spi_chip_write_256,
12619 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12620 .voltage = {2700, 3600},
12621 },
12622
12623 {
12624 .vendor = "Spansion",
12625 .name = "S25FL164K",
12626 .bustype = BUS_SPI,
12627 .manufacture_id = SPANSION_ID,
12628 .model_id = SPANSION_S25FL164K,
12629 .total_size = 8192,
12630 .page_size = 256,
12631 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
12632 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12633 .tested = TEST_OK_PREW,
12634 .probe = probe_spi_rdid,
12635 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012636 .block_erasers =
12637 {
Nikolay Martynov598968a2014-05-04 21:44:13 +000012638 {
12639 .eraseblocks = { {4 * 1024, 2048} },
12640 .block_erase = spi_block_erase_20,
12641 }, {
12642 .eraseblocks = { {64 * 1024, 128} },
12643 .block_erase = spi_block_erase_d8,
12644 }, {
12645 .eraseblocks = { { 8192 * 1024, 1} },
12646 .block_erase = spi_block_erase_60,
12647 }, {
12648 .eraseblocks = { { 8192 * 1024, 1} },
12649 .block_erase = spi_block_erase_c7,
12650 }
12651 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012652 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000012653 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12654 .write = spi_chip_write_256,
12655 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12656 .voltage = {2700, 3600},
12657 },
12658
12659 {
12660 .vendor = "Spansion",
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012661 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12662 .bustype = BUS_SPI,
12663 .manufacture_id = SPANSION_ID,
12664 .model_id = SPANSION_S25FL128,
12665 .total_size = 16384,
12666 .page_size = 256,
12667 /* supports 4B addressing */
12668 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12669 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12670 .tested = TEST_OK_PREW,
12671 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
12672 .probe = probe_spi_rdid,
12673 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012674 .block_erasers =
12675 {
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012676 {
12677 /* This chip supports erasing of 32 so-called "parameter sectors" with
12678 * opcode 0x20 which may be configured to be on top or bottom of the address
12679 * space. Trying to access an address outside these 4kB blocks does have no
12680 * effect on the memory contents, e.g.
12681 .eraseblocks = {
12682 {4 * 1024, 32},
12683 {64 * 1024, 254} // inaccessible
12684 },
12685 .block_erase = spi_block_erase_20,
12686 }, { */
12687 .eraseblocks = { { 64 * 1024, 256} },
12688 .block_erase = spi_block_erase_d8,
12689 }, {
12690 .eraseblocks = { { 16384 * 1024, 1} },
12691 .block_erase = spi_block_erase_60,
12692 }, {
12693 .eraseblocks = { { 16384 * 1024, 1} },
12694 .block_erase = spi_block_erase_c7,
12695 }
12696 },
12697 .printlock = spi_prettyprint_status_register_bp2_srwd,
12698 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12699 .write = spi_chip_write_256, /* Multi I/O supported */
12700 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12701 .voltage = {2700, 3600},
12702 },
12703
12704 {
12705 .vendor = "Spansion",
12706 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
12707 .bustype = BUS_SPI,
12708 .manufacture_id = SPANSION_ID,
12709 .model_id = SPANSION_S25FL128,
12710 .total_size = 16384,
12711 .page_size = 512,
12712 /* supports 4B addressing */
12713 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12714 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12715 .tested = TEST_UNTESTED,
12716 .probe = probe_spi_rdid,
12717 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012718 .block_erasers =
12719 {
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012720 {
12721 .eraseblocks = { {256 * 1024, 64} },
12722 .block_erase = spi_block_erase_d8,
12723 }, {
12724 .eraseblocks = { { 16384 * 1024, 1} },
12725 .block_erase = spi_block_erase_60,
12726 }, {
12727 .eraseblocks = { { 16384 * 1024, 1} },
12728 .block_erase = spi_block_erase_c7,
12729 }
12730 },
12731 .printlock = spi_prettyprint_status_register_bp2_srwd,
12732 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12733 .write = spi_chip_write_256, /* Multi I/O supported */
12734 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12735 .voltage = {2700, 3600},
12736 },
12737
12738 {
12739 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000012740 .name = "S25FL128P......0", /* uniform 64 kB sectors */
12741 .bustype = BUS_SPI,
12742 .manufacture_id = SPANSION_ID,
12743 .model_id = SPANSION_S25FL128,
12744 .total_size = 16384,
12745 .page_size = 256,
12746 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons3eb5a8c2018-10-02 01:21:24 +020012747 .tested = TEST_OK_PREW,
Stefan Tauner88b19252014-08-06 14:36:27 +000012748 .probe = probe_spi_rdid,
12749 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012750 .block_erasers =
12751 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012752 {
12753 .eraseblocks = { {64 * 1024, 256} },
12754 .block_erase = spi_block_erase_20,
12755 }, {
12756 .eraseblocks = { {64 * 1024, 256} },
12757 .block_erase = spi_block_erase_d8,
12758 }, {
12759 .eraseblocks = { { 16384 * 1024, 1} },
12760 .block_erase = spi_block_erase_60,
12761 }, {
12762 .eraseblocks = { { 16384 * 1024, 1} },
12763 .block_erase = spi_block_erase_c7,
12764 }
12765 },
12766 .printlock = spi_prettyprint_status_register_bp3_srwd,
12767 .unlock = spi_disable_blockprotect_bp3_srwd,
12768 .write = spi_chip_write_256,
12769 .read = spi_chip_read, /* Fast read (0x0B) supported */
12770 .voltage = {2700, 3600},
12771 },
12772
12773 {
12774 .vendor = "Spansion",
12775 .name = "S25FL128P......1", /* uniform 256kB sectors */
12776 .bustype = BUS_SPI,
12777 .manufacture_id = SPANSION_ID,
12778 .model_id = SPANSION_S25FL128,
12779 .total_size = 16384,
12780 .page_size = 256,
12781 .feature_bits = FEATURE_WRSR_WREN,
12782 .tested = TEST_UNTESTED,
12783 .probe = probe_spi_rdid,
12784 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012785 .block_erasers =
12786 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012787 {
12788 .eraseblocks = { {256 * 1024, 64} },
12789 .block_erase = spi_block_erase_d8,
12790 }, {
12791 .eraseblocks = { { 16384 * 1024, 1} },
12792 .block_erase = spi_block_erase_c7,
12793 }
12794 },
12795 .printlock = spi_prettyprint_status_register_bp2_srwd,
12796 .unlock = spi_disable_blockprotect_bp2_srwd,
12797 .write = spi_chip_write_256,
12798 .read = spi_chip_read, /* Fast read (0x0B) supported */
12799 .voltage = {2700, 3600},
12800 },
12801
12802 {
12803 .vendor = "Spansion",
12804 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012805 .bustype = BUS_SPI,
12806 .manufacture_id = SPANSION_ID,
12807 .model_id = SPANSION_S25FL128,
12808 .total_size = 16384,
12809 .page_size = 256,
12810 /* supports 4B addressing */
12811 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012813 .tested = TEST_OK_PREW,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012814 .probe = probe_spi_rdid,
12815 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012816 .block_erasers =
12817 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012818 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012819 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12820 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12821 * have no effect on the memory contents, but sets a flag in the SR.
12822 .eraseblocks = {
12823 {4 * 1024, 32},
12824 {64 * 1024, 254} // inaccessible
12825 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012826 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000012827 }, { */
12828 .eraseblocks = { { 64 * 1024, 256} },
12829 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012830 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000012831 .eraseblocks = { { 16384 * 1024, 1} },
12832 .block_erase = spi_block_erase_60,
12833 }, {
12834 .eraseblocks = { { 16384 * 1024, 1} },
12835 .block_erase = spi_block_erase_c7,
12836 }
12837 },
12838 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12839 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12840 .write = spi_chip_write_256, /* Multi I/O supported */
12841 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12842 .voltage = {2700, 3600},
12843 },
12844
12845 {
12846 .vendor = "Spansion",
12847 .name = "S25FL128S......1", /* uniform 256 kB sectors */
12848 .bustype = BUS_SPI,
12849 .manufacture_id = SPANSION_ID,
12850 .model_id = SPANSION_S25FL128,
12851 .total_size = 16384,
12852 .page_size = 512,
12853 /* supports 4B addressing */
12854 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12855 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12856 .tested = TEST_UNTESTED,
12857 .probe = probe_spi_rdid,
12858 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012859 .block_erasers =
12860 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012861 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012862 .eraseblocks = { {256 * 1024, 64} },
12863 .block_erase = spi_block_erase_d8,
12864 }, {
12865 .eraseblocks = { { 16384 * 1024, 1} },
12866 .block_erase = spi_block_erase_60,
12867 }, {
12868 .eraseblocks = { { 16384 * 1024, 1} },
12869 .block_erase = spi_block_erase_c7,
12870 }
12871 },
12872 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12873 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12874 .write = spi_chip_write_256, /* Multi I/O supported */
12875 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12876 .voltage = {2700, 3600},
12877 },
12878
12879 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012880 .vendor = "Spansion",
12881 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12882 .bustype = BUS_SPI,
12883 .manufacture_id = SPANSION_ID,
12884 .model_id = SPANSION_S25FL128,
12885 .total_size = 16384,
12886 .page_size = 256,
12887 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12889 .tested = TEST_OK_PREW,
12890 .probe = probe_spi_rdid,
12891 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012892 .block_erasers =
12893 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012894 {
12895 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
12896 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
12897 * effect on the memory contents, but sets a flag in the SR.
12898 .eraseblocks = {
12899 {4 * 1024, 32},
12900 {64 * 1024, 254} // inaccessible
12901 },
12902 .block_erase = spi_block_erase_20,
12903 }, { */
12904 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
12905 .eraseblocks = {
12906 {8 * 1024, 16},
12907 {64 * 1024, 254} // inaccessible
12908 },
12909 .block_erase = spi_block_erase_40,
12910 }, { */
12911 .eraseblocks = { { 64 * 1024, 256} },
12912 .block_erase = spi_block_erase_d8,
12913 }, {
12914 .eraseblocks = { { 16384 * 1024, 1} },
12915 .block_erase = spi_block_erase_60,
12916 }, {
12917 .eraseblocks = { { 16384 * 1024, 1} },
12918 .block_erase = spi_block_erase_c7,
12919 }
12920 },
12921 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12922 .unlock = spi_disable_blockprotect_bp2_srwd,
12923 .write = spi_chip_write_256, /* Multi I/O supported */
12924 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12925 .voltage = {2700, 3600},
12926 },
12927
12928 {
12929 .vendor = "Spansion",
12930 .name = "S25FL129P......1", /* uniform 256 kB sectors */
12931 .bustype = BUS_SPI,
12932 .manufacture_id = SPANSION_ID,
12933 .model_id = SPANSION_S25FL128,
12934 .total_size = 16384,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012935 .page_size = 256,
Stefan Tauner88b19252014-08-06 14:36:27 +000012936 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12937 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12938 .tested = TEST_UNTESTED,
12939 .probe = probe_spi_rdid,
12940 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012941 .block_erasers =
12942 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012943 {
12944 .eraseblocks = { {256 * 1024, 64} },
12945 .block_erase = spi_block_erase_d8,
12946 }, {
12947 .eraseblocks = { { 16384 * 1024, 1} },
12948 .block_erase = spi_block_erase_60,
12949 }, {
12950 .eraseblocks = { { 16384 * 1024, 1} },
12951 .block_erase = spi_block_erase_c7,
12952 }
12953 },
12954 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12955 .unlock = spi_disable_blockprotect_bp2_srwd,
12956 .write = spi_chip_write_256, /* Multi I/O supported */
12957 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12958 .voltage = {2700, 3600},
12959 },
12960
12961 {
Nico Huber57dbd642018-03-13 18:01:05 +010012962 .vendor = "Spansion",
12963 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12964 .bustype = BUS_SPI,
12965 .manufacture_id = SPANSION_ID,
12966 .model_id = SPANSION_S25FL256,
12967 .total_size = 32768,
12968 .page_size = 256,
12969 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber6329b0a2018-03-13 18:14:52 +010012970 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
Nico Huber57dbd642018-03-13 18:01:05 +010012971 .tested = TEST_OK_PREW,
12972 .probe = probe_spi_rdid,
12973 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012974 .block_erasers =
12975 {
Nico Huber57dbd642018-03-13 18:01:05 +010012976 {
12977 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12978 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12979 * have no effect on the memory contents, but sets a flag in the SR.
12980 .eraseblocks = {
12981 {4 * 1024, 32},
12982 {64 * 1024, 254} // inaccessible
12983 },
12984 .block_erase = spi_block_erase_20,
12985 }, { */
12986 .eraseblocks = { { 64 * 1024, 512} },
Nico Huber6329b0a2018-03-13 18:14:52 +010012987 .block_erase = spi_block_erase_dc,
12988 }, {
12989 .eraseblocks = { { 64 * 1024, 512} },
Nico Huber57dbd642018-03-13 18:01:05 +010012990 .block_erase = spi_block_erase_d8,
12991 }, {
12992 .eraseblocks = { { 32768 * 1024, 1} },
12993 .block_erase = spi_block_erase_60,
12994 }, {
12995 .eraseblocks = { { 32768 * 1024, 1} },
12996 .block_erase = spi_block_erase_c7,
12997 }
12998 },
12999 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
13000 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
13001 .write = spi_chip_write_256, /* Multi I/O supported */
13002 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13003 .voltage = {2700, 3600},
13004 .wrea_override = 0x17,
13005 },
13006
13007 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013008 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013009 .name = "SST25LF020A",
13010 .bustype = BUS_SPI,
13011 .manufacture_id = SST_ID,
13012 .model_id = SST_SST25VF020_REMS,
13013 .total_size = 256,
13014 .page_size = 256,
13015 .feature_bits = FEATURE_WRSR_EWSR,
13016 .tested = TEST_OK_PREW,
13017 .probe = probe_spi_rems,
13018 .probe_timing = TIMING_ZERO,
13019 .block_erasers =
13020 {
13021 {
13022 .eraseblocks = { {4 * 1024, 64} },
13023 .block_erase = spi_block_erase_20,
13024 }, {
13025 .eraseblocks = { {32 * 1024, 8} },
13026 .block_erase = spi_block_erase_52,
13027 }, {
13028 .eraseblocks = { {256 * 1024, 1} },
13029 .block_erase = spi_block_erase_60,
13030 },
13031 },
13032 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13033 .unlock = spi_disable_blockprotect,
13034 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13035 .read = spi_chip_read, /* Fast read (0x0B) supported */
13036 .voltage = {2700, 3600},
13037 },
13038
13039 {
13040 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013041 .name = "SST25LF040A",
13042 .bustype = BUS_SPI,
13043 .manufacture_id = SST_ID,
13044 .model_id = SST_SST25VF040_REMS,
13045 .total_size = 512,
13046 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013047 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013048 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013049 .probe = probe_spi_res2,
13050 .probe_timing = TIMING_ZERO,
13051 .block_erasers =
13052 {
13053 {
13054 .eraseblocks = { {4 * 1024, 128} },
13055 .block_erase = spi_block_erase_20,
13056 }, {
13057 .eraseblocks = { {32 * 1024, 16} },
13058 .block_erase = spi_block_erase_52,
13059 }, {
13060 .eraseblocks = { {512 * 1024, 1} },
13061 .block_erase = spi_block_erase_60,
13062 },
13063 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013064 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013065 .unlock = spi_disable_blockprotect,
13066 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13067 .read = spi_chip_read,
13068 .voltage = {3000, 3600},
13069 },
13070
13071 {
13072 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013073 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013074 .bustype = BUS_SPI,
13075 .manufacture_id = SST_ID,
13076 .model_id = SST_SST25VF080_REMS,
13077 .total_size = 1024,
13078 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013079 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013080 .tested = TEST_UNTESTED,
13081 .probe = probe_spi_res2,
13082 .probe_timing = TIMING_ZERO,
13083 .block_erasers =
13084 {
13085 {
13086 .eraseblocks = { {4 * 1024, 256} },
13087 .block_erase = spi_block_erase_20,
13088 }, {
13089 .eraseblocks = { {32 * 1024, 32} },
13090 .block_erase = spi_block_erase_52,
13091 }, {
13092 .eraseblocks = { {1024 * 1024, 1} },
13093 .block_erase = spi_block_erase_60,
13094 },
13095 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013096 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013097 .unlock = spi_disable_blockprotect,
13098 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13099 .read = spi_chip_read,
13100 .voltage = {3000, 3600},
13101 },
13102
13103 {
13104 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013105 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000013106 .bustype = BUS_SPI,
13107 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000013108 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000013109 .total_size = 64,
13110 .page_size = 256,
13111 .feature_bits = FEATURE_WRSR_EWSR,
13112 .tested = TEST_OK_PREW,
13113 .probe = probe_spi_rems,
13114 .probe_timing = TIMING_ZERO,
13115 .block_erasers =
13116 {
13117 {
13118 .eraseblocks = { {4 * 1024, 16} },
13119 .block_erase = spi_block_erase_20,
13120 }, {
13121 .eraseblocks = { {32 * 1024, 2} },
13122 .block_erase = spi_block_erase_52,
13123 }, {
13124 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013125 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013126 }, {
13127 .eraseblocks = { {64 * 1024, 1} },
13128 .block_erase = spi_block_erase_60,
13129 }, {
13130 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013131 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013132 },
13133 },
13134 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13135 .unlock = spi_disable_blockprotect,
13136 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013137 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013138 .voltage = {2700, 3600},
13139 },
13140
13141 {
13142 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013143 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013144 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013145 .manufacture_id = SST_ID,
13146 .model_id = SST_SST25VF010_REMS,
13147 .total_size = 128,
13148 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013149 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000013150 .tested = TEST_OK_PREW,
13151 .probe = probe_spi_rems,
13152 .probe_timing = TIMING_ZERO,
13153 .block_erasers =
13154 {
13155 {
13156 .eraseblocks = { {4 * 1024, 32} },
13157 .block_erase = spi_block_erase_20,
13158 }, {
13159 .eraseblocks = { {32 * 1024, 4} },
13160 .block_erase = spi_block_erase_52,
13161 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000013162 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013163 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013164 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000013165 .eraseblocks = { {128 * 1024, 1} },
13166 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000013167 }, {
13168 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013169 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013170 },
13171 },
13172 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13173 .unlock = spi_disable_blockprotect,
13174 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013175 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013176 .voltage = {2700, 3600},
13177 },
13178
13179 {
13180 .vendor = "SST",
13181 .name = "SST25VF020",
13182 .bustype = BUS_SPI,
13183 .manufacture_id = SST_ID,
13184 .model_id = SST_SST25VF020_REMS,
13185 .total_size = 256,
13186 .page_size = 256,
13187 .feature_bits = FEATURE_WRSR_EWSR,
13188 .tested = TEST_UNTESTED,
13189 .probe = probe_spi_rems,
13190 .probe_timing = TIMING_ZERO,
13191 .block_erasers =
13192 {
13193 {
13194 .eraseblocks = { {4 * 1024, 64} },
13195 .block_erase = spi_block_erase_20,
13196 }, {
13197 .eraseblocks = { {32 * 1024, 8} },
13198 .block_erase = spi_block_erase_52,
13199 }, {
13200 .eraseblocks = { {256 * 1024, 1} },
13201 .block_erase = spi_block_erase_60,
13202 },
13203 },
13204 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13205 .unlock = spi_disable_blockprotect,
13206 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13207 .read = spi_chip_read, /* only */
13208 .voltage = {2700, 3600},
13209 },
13210
13211 {
13212 .vendor = "SST",
13213 .name = "SST25VF020B",
13214 .bustype = BUS_SPI,
13215 .manufacture_id = SST_ID,
13216 .model_id = SST_SST25VF020B,
13217 .total_size = 256,
13218 .page_size = 256,
13219 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013220 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000013221 .probe = probe_spi_rdid,
13222 .probe_timing = TIMING_ZERO,
13223 .block_erasers =
13224 {
13225 {
13226 .eraseblocks = { {4 * 1024, 64} },
13227 .block_erase = spi_block_erase_20,
13228 }, {
13229 .eraseblocks = { {32 * 1024, 8} },
13230 .block_erase = spi_block_erase_52,
13231 }, {
13232 .eraseblocks = { {64 * 1024, 4} },
13233 .block_erase = spi_block_erase_d8,
13234 }, {
13235 .eraseblocks = { {256 * 1024, 1} },
13236 .block_erase = spi_block_erase_60,
13237 }, {
13238 .eraseblocks = { {256 * 1024, 1} },
13239 .block_erase = spi_block_erase_c7,
13240 },
13241 },
13242 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13243 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13244 .write = spi_aai_write, /* AAI supported (0xAD) */
13245 .read = spi_chip_read, /* Fast read (0x0B) supported */
13246 .voltage = {2700, 3600},
13247 },
13248
13249 {
13250 .vendor = "SST",
13251 .name = "SST25VF040",
13252 .bustype = BUS_SPI,
13253 .manufacture_id = SST_ID,
13254 .model_id = SST_SST25VF040_REMS,
13255 .total_size = 512,
13256 .page_size = 256,
13257 .feature_bits = FEATURE_WRSR_EWSR,
13258 .tested = TEST_OK_PR,
13259 .probe = probe_spi_rems,
13260 .probe_timing = TIMING_ZERO,
13261 .block_erasers =
13262 {
13263 {
13264 .eraseblocks = { {4 * 1024, 128} },
13265 .block_erase = spi_block_erase_20,
13266 }, {
13267 .eraseblocks = { {32 * 1024, 16} },
13268 .block_erase = spi_block_erase_52,
13269 }, {
13270 .eraseblocks = { {512 * 1024, 1} },
13271 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000013272 },
13273 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013274 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000013275 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000013276 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13277 .read = spi_chip_read,
13278 .voltage = {2700, 3600},
13279 },
13280
13281 {
13282 .vendor = "SST",
13283 .name = "SST25VF040B",
13284 .bustype = BUS_SPI,
13285 .manufacture_id = SST_ID,
13286 .model_id = SST_SST25VF040B,
13287 .total_size = 512,
13288 .page_size = 256,
13289 .feature_bits = FEATURE_WRSR_EWSR,
13290 .tested = TEST_OK_PREW,
13291 .probe = probe_spi_rdid,
13292 .probe_timing = TIMING_ZERO,
13293 .block_erasers =
13294 {
13295 {
13296 .eraseblocks = { {4 * 1024, 128} },
13297 .block_erase = spi_block_erase_20,
13298 }, {
13299 .eraseblocks = { {32 * 1024, 16} },
13300 .block_erase = spi_block_erase_52,
13301 }, {
13302 .eraseblocks = { {64 * 1024, 8} },
13303 .block_erase = spi_block_erase_d8,
13304 }, {
13305 .eraseblocks = { {512 * 1024, 1} },
13306 .block_erase = spi_block_erase_60,
13307 }, {
13308 .eraseblocks = { {512 * 1024, 1} },
13309 .block_erase = spi_block_erase_c7,
13310 },
13311 },
13312 .printlock = spi_prettyprint_status_register_sst25vf040b,
13313 .unlock = spi_disable_blockprotect,
13314 .write = spi_aai_write, /* AAI supported (0xAD) */
13315 .read = spi_chip_read, /* Fast read (0x0B) supported */
13316 .voltage = {2700, 3600},
13317 },
13318
13319 {
13320 .vendor = "SST",
13321 .name = "SST25VF040B.REMS",
13322 .bustype = BUS_SPI,
13323 .manufacture_id = SST_ID,
13324 .model_id = SST_SST25VF040B_REMS,
13325 .total_size = 512,
13326 .page_size = 256,
13327 .feature_bits = FEATURE_WRSR_EWSR,
13328 .tested = TEST_OK_PREW,
13329 .probe = probe_spi_rems,
13330 .probe_timing = TIMING_ZERO,
13331 .block_erasers =
13332 {
13333 {
13334 .eraseblocks = { {4 * 1024, 128} },
13335 .block_erase = spi_block_erase_20,
13336 }, {
13337 .eraseblocks = { {32 * 1024, 16} },
13338 .block_erase = spi_block_erase_52,
13339 }, {
13340 .eraseblocks = { {64 * 1024, 8} },
13341 .block_erase = spi_block_erase_d8,
13342 }, {
13343 .eraseblocks = { {512 * 1024, 1} },
13344 .block_erase = spi_block_erase_60,
13345 }, {
13346 .eraseblocks = { {512 * 1024, 1} },
13347 .block_erase = spi_block_erase_c7,
13348 },
13349 },
13350 .printlock = spi_prettyprint_status_register_sst25vf040b,
13351 .unlock = spi_disable_blockprotect,
13352 .write = spi_aai_write,
13353 .read = spi_chip_read,
13354 .voltage = {2700, 3600},
13355 },
13356
13357 {
13358 .vendor = "SST",
Ben Gardnerbcf61092015-11-22 02:23:31 +000013359 .name = "SST25WF020A",
13360 .bustype = BUS_SPI,
13361 .manufacture_id = SANYO_ID, /* See flashchips.h */
13362 .model_id = SST_SST25WF020A,
13363 .total_size = 256,
13364 .page_size = 256,
13365 .feature_bits = FEATURE_WRSR_WREN,
13366 .tested = TEST_UNTESTED,
13367 .probe = probe_spi_rdid,
13368 .probe_timing = TIMING_ZERO,
13369 .block_erasers =
13370 {
13371 {
13372 .eraseblocks = { {4 * 1024, 64} },
13373 .block_erase = spi_block_erase_20,
13374 }, {
13375 .eraseblocks = { {64 * 1024, 4} },
13376 .block_erase = spi_block_erase_d8,
13377 }, {
13378 .eraseblocks = { {256 * 1024, 1} },
13379 .block_erase = spi_block_erase_60,
13380 }, {
13381 .eraseblocks = { {256 * 1024, 1} },
13382 .block_erase = spi_block_erase_c7,
13383 },
13384 },
13385 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13386 .unlock = spi_disable_blockprotect_bp2_srwd,
13387 .write = spi_chip_write_256,
13388 .read = spi_chip_read, /* Fast read (0x0B) supported */
13389 .voltage = {1650, 1950},
13390 },
13391
13392 {
13393 .vendor = "SST",
13394 .name = "SST25WF040B",
13395 .bustype = BUS_SPI,
13396 .manufacture_id = SANYO_ID, /* See flashchips.h */
13397 .model_id = SST_SST25WF040B,
13398 .total_size = 512,
13399 .page_size = 256,
13400 .feature_bits = FEATURE_WRSR_WREN,
13401 .tested = TEST_UNTESTED,
13402 .probe = probe_spi_rdid,
13403 .probe_timing = TIMING_ZERO,
13404 .block_erasers =
13405 {
13406 {
13407 .eraseblocks = { {4 * 1024, 128} },
13408 .block_erase = spi_block_erase_20,
13409 }, {
13410 .eraseblocks = { {64 * 1024, 8} },
13411 .block_erase = spi_block_erase_d8,
13412 }, {
13413 .eraseblocks = { {512 * 1024, 1} },
13414 .block_erase = spi_block_erase_60,
13415 }, {
13416 .eraseblocks = { {512 * 1024, 1} },
13417 .block_erase = spi_block_erase_c7,
13418 },
13419 },
13420 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13421 .unlock = spi_disable_blockprotect_bp2_srwd,
13422 .write = spi_chip_write_256,
13423 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13424 .voltage = {1650, 1950},
13425 },
13426
13427 {
13428 .vendor = "SST",
13429 .name = "SST25WF080B",
13430 .bustype = BUS_SPI,
13431 .manufacture_id = SANYO_ID, /* See flashchips.h */
13432 .model_id = SST_SST25WF080B,
13433 .total_size = 1024,
13434 .page_size = 256,
13435 .feature_bits = FEATURE_WRSR_WREN,
13436 .tested = TEST_OK_PREW,
13437 .probe = probe_spi_rdid,
13438 .probe_timing = TIMING_ZERO,
13439 .block_erasers =
13440 {
13441 {
13442 .eraseblocks = { {4 * 1024, 256} },
13443 .block_erase = spi_block_erase_20,
13444 }, {
13445 .eraseblocks = { {64 * 1024, 16} },
13446 .block_erase = spi_block_erase_d8,
13447 }, {
13448 .eraseblocks = { {1024 * 1024, 1} },
13449 .block_erase = spi_block_erase_60,
13450 }, {
13451 .eraseblocks = { {1024 * 1024, 1} },
13452 .block_erase = spi_block_erase_c7,
13453 },
13454 },
13455 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13456 .unlock = spi_disable_blockprotect_bp2_srwd,
13457 .write = spi_chip_write_256,
13458 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13459 .voltage = {1650, 1950},
13460 },
13461
13462 {
13463 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013464 .name = "SST25VF080B",
13465 .bustype = BUS_SPI,
13466 .manufacture_id = SST_ID,
13467 .model_id = SST_SST25VF080B,
13468 .total_size = 1024,
13469 .page_size = 256,
13470 .feature_bits = FEATURE_WRSR_EWSR,
13471 .tested = TEST_OK_PREW,
13472 .probe = probe_spi_rdid,
13473 .probe_timing = TIMING_ZERO,
13474 .block_erasers =
13475 {
13476 {
13477 .eraseblocks = { {4 * 1024, 256} },
13478 .block_erase = spi_block_erase_20,
13479 }, {
13480 .eraseblocks = { {32 * 1024, 32} },
13481 .block_erase = spi_block_erase_52,
13482 }, {
13483 .eraseblocks = { {64 * 1024, 16} },
13484 .block_erase = spi_block_erase_d8,
13485 }, {
13486 .eraseblocks = { {1024 * 1024, 1} },
13487 .block_erase = spi_block_erase_60,
13488 }, {
13489 .eraseblocks = { {1024 * 1024, 1} },
13490 .block_erase = spi_block_erase_c7,
13491 },
13492 },
13493 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13494 .unlock = spi_disable_blockprotect,
13495 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000013496 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013497 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000013498 },
13499
13500 {
13501 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013502 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013503 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013504 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013505 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013506 .total_size = 2048,
13507 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013508 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000013509 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013510 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013511 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013512 .block_erasers =
13513 {
13514 {
13515 .eraseblocks = { {4 * 1024, 512} },
13516 .block_erase = spi_block_erase_20,
13517 }, {
13518 .eraseblocks = { {32 * 1024, 64} },
13519 .block_erase = spi_block_erase_52,
13520 }, {
13521 .eraseblocks = { {64 * 1024, 32} },
13522 .block_erase = spi_block_erase_d8,
13523 }, {
13524 .eraseblocks = { {2 * 1024 * 1024, 1} },
13525 .block_erase = spi_block_erase_60,
13526 }, {
13527 .eraseblocks = { {2 * 1024 * 1024, 1} },
13528 .block_erase = spi_block_erase_c7,
13529 },
13530 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013531 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013532 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000013533 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013534 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013535 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013536 },
13537
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013538 {
13539 .vendor = "SST",
13540 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013541 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013542 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013543 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013544 .total_size = 4096,
13545 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013546 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000013547 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013548 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013549 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013550 .block_erasers =
13551 {
13552 {
13553 .eraseblocks = { {4 * 1024, 1024} },
13554 .block_erase = spi_block_erase_20,
13555 }, {
13556 .eraseblocks = { {32 * 1024, 128} },
13557 .block_erase = spi_block_erase_52,
13558 }, {
13559 .eraseblocks = { {64 * 1024, 64} },
13560 .block_erase = spi_block_erase_d8,
13561 }, {
13562 .eraseblocks = { {4 * 1024 * 1024, 1} },
13563 .block_erase = spi_block_erase_60,
13564 }, {
13565 .eraseblocks = { {4 * 1024 * 1024, 1} },
13566 .block_erase = spi_block_erase_c7,
13567 },
13568 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013569 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013570 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000013571 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013572 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013573 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013574 },
13575
13576 {
13577 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013578 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013579 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013580 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013581 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013582 .total_size = 8192,
13583 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013584 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000013585 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013586 .probe = probe_spi_rdid,
13587 .probe_timing = TIMING_ZERO,
13588 .block_erasers =
13589 {
13590 {
13591 .eraseblocks = { {4 * 1024, 2048} },
13592 .block_erase = spi_block_erase_20,
13593 }, {
13594 .eraseblocks = { {32 * 1024, 256} },
13595 .block_erase = spi_block_erase_52,
13596 }, {
13597 .eraseblocks = { {64 * 1024, 128} },
13598 .block_erase = spi_block_erase_d8,
13599 }, {
13600 .eraseblocks = { {8 * 1024 * 1024, 1} },
13601 .block_erase = spi_block_erase_60,
13602 }, {
13603 .eraseblocks = { {8 * 1024 * 1024, 1} },
13604 .block_erase = spi_block_erase_c7,
13605 },
13606 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013607 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013608 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000013609 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013610 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013611 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013612 },
13613
13614 {
13615 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070013616 .name = "SST26VF016B(A)",
13617 .bustype = BUS_SPI,
13618 .manufacture_id = SST_ID,
13619 .model_id = SST_SST26VF016B,
13620 .total_size = 2048,
13621 .page_size = 256,
13622 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13623 .tested = TEST_OK_PREW,
13624 .probe = probe_spi_rdid,
13625 .probe_timing = TIMING_ZERO,
13626 .block_erasers =
13627 {
13628 {
13629 .eraseblocks = { {4 * 1024, 512} },
13630 .block_erase = spi_block_erase_20,
13631 }, {
13632 .eraseblocks = {
13633 {8 * 1024, 4},
13634 {32 * 1024, 1},
13635 {64 * 1024, 30},
13636 {32 * 1024, 1},
13637 {8 * 1024, 4},
13638 },
13639 .block_erase = spi_block_erase_d8,
13640 }, {
13641 .eraseblocks = { {2 * 1024 * 1024, 1} },
13642 .block_erase = spi_block_erase_c7,
13643 },
13644 },
13645 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13646 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13647 .write = spi_chip_write_256, /* Multi I/O supported */
13648 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13649 .voltage = {2700, 3600},
13650 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100013651
Wei Hu25584de2018-04-30 14:02:08 -070013652 {
13653 .vendor = "SST",
13654 .name = "SST26VF032B(A)",
13655 .bustype = BUS_SPI,
13656 .manufacture_id = SST_ID,
13657 .model_id = SST_SST26VF032B,
13658 .total_size = 4096,
13659 .page_size = 256,
13660 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13661 .tested = TEST_UNTESTED,
13662 .probe = probe_spi_rdid,
13663 .probe_timing = TIMING_ZERO,
13664 .block_erasers =
13665 {
13666 {
13667 .eraseblocks = { {4 * 1024, 1024} },
13668 .block_erase = spi_block_erase_20,
13669 }, {
13670 .eraseblocks = {
13671 {8 * 1024, 4},
13672 {32 * 1024, 1},
13673 {64 * 1024, 62},
13674 {32 * 1024, 1},
13675 {8 * 1024, 4},
13676 },
13677 .block_erase = spi_block_erase_d8,
13678 }, {
13679 .eraseblocks = { {4 * 1024 * 1024, 1} },
13680 .block_erase = spi_block_erase_c7,
13681 },
13682 },
13683 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13684 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13685 .write = spi_chip_write_256, /* Multi I/O supported */
13686 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13687 .voltage = {2700, 3600},
13688 },
13689
Wei Hu25584de2018-04-30 14:02:08 -070013690 {
13691 .vendor = "SST",
13692 .name = "SST26VF064B(A)",
13693 .bustype = BUS_SPI,
13694 .manufacture_id = SST_ID,
13695 .model_id = SST_SST26VF064B,
13696 .total_size = 8192,
13697 .page_size = 256,
13698 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13699 .tested = TEST_OK_PREW,
13700 .probe = probe_spi_rdid,
13701 .probe_timing = TIMING_ZERO,
13702 .block_erasers =
13703 {
13704 {
13705 .eraseblocks = { {4 * 1024, 2048} },
13706 .block_erase = spi_block_erase_20,
13707 }, {
13708 .eraseblocks = {
13709 {8 * 1024, 4},
13710 {32 * 1024, 1},
13711 {64 * 1024, 126},
13712 {32 * 1024, 1},
13713 {8 * 1024, 4},
13714 },
13715 .block_erase = spi_block_erase_d8,
13716 }, {
13717 .eraseblocks = { {8 * 1024 * 1024, 1} },
13718 .block_erase = spi_block_erase_c7,
13719 },
13720 },
13721 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13722 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13723 .write = spi_chip_write_256, /* Multi I/O supported */
13724 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13725 .voltage = {2700, 3600},
13726 },
13727
13728 {
13729 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000013730 .name = "SST25WF512",
13731 .bustype = BUS_SPI,
13732 .manufacture_id = SST_ID,
13733 .model_id = SST_SST25WF512,
13734 .total_size = 64,
13735 .page_size = 256,
13736 .feature_bits = FEATURE_WRSR_EITHER,
13737 .tested = TEST_UNTESTED,
13738 .probe = probe_spi_rdid,
13739 .probe_timing = TIMING_ZERO,
13740 .block_erasers =
13741 {
13742 {
13743 .eraseblocks = { {4 * 1024, 16} },
13744 .block_erase = spi_block_erase_20,
13745 }, {
13746 .eraseblocks = { {32 * 1024, 2} },
13747 .block_erase = spi_block_erase_52,
13748 }, {
13749 .eraseblocks = { {1024 * 64, 1} },
13750 .block_erase = spi_block_erase_60,
13751 }, {
13752 .eraseblocks = { {1024 * 64, 1} },
13753 .block_erase = spi_block_erase_c7,
13754 },
13755 },
Jason Harper43ddef02014-05-04 00:55:24 +000013756 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13757 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013758 .write = spi_aai_write,
13759 .read = spi_chip_read, /* Fast read (0x0B) supported */
13760 .voltage = {1650, 1950},
13761 },
13762
13763 {
13764 .vendor = "SST",
13765 .name = "SST25WF010",
13766 .bustype = BUS_SPI,
13767 .manufacture_id = SST_ID,
13768 .model_id = SST_SST25WF010,
13769 .total_size = 128,
13770 .page_size = 256,
13771 .feature_bits = FEATURE_WRSR_EITHER,
13772 .tested = TEST_UNTESTED,
13773 .probe = probe_spi_rdid,
13774 .probe_timing = TIMING_ZERO,
13775 .block_erasers =
13776 {
13777 {
13778 .eraseblocks = { {4 * 1024, 32} },
13779 .block_erase = spi_block_erase_20,
13780 }, {
13781 .eraseblocks = { {32 * 1024, 4} },
13782 .block_erase = spi_block_erase_52,
13783 }, {
13784 .eraseblocks = { {1024 * 128, 1} },
13785 .block_erase = spi_block_erase_60,
13786 }, {
13787 .eraseblocks = { {1024 * 128, 1} },
13788 .block_erase = spi_block_erase_c7,
13789 },
13790 },
Jason Harper43ddef02014-05-04 00:55:24 +000013791 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13792 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013793 .write = spi_aai_write,
13794 .read = spi_chip_read, /* Fast read (0x0B) supported */
13795 .voltage = {1650, 1950},
13796 },
13797
13798 {
13799 .vendor = "SST",
13800 .name = "SST25WF020",
13801 .bustype = BUS_SPI,
13802 .manufacture_id = SST_ID,
13803 .model_id = SST_SST25WF020,
13804 .total_size = 256,
13805 .page_size = 256,
13806 .feature_bits = FEATURE_WRSR_EITHER,
13807 .tested = TEST_UNTESTED,
13808 .probe = probe_spi_rdid,
13809 .probe_timing = TIMING_ZERO,
13810 .block_erasers =
13811 {
13812 {
13813 .eraseblocks = { {4 * 1024, 64} },
13814 .block_erase = spi_block_erase_20,
13815 }, {
13816 .eraseblocks = { {32 * 1024, 8} },
13817 .block_erase = spi_block_erase_52,
13818 }, {
13819 .eraseblocks = { {64 * 1024, 4} },
13820 .block_erase = spi_block_erase_d8,
13821 }, {
13822 .eraseblocks = { {1024 * 256, 1} },
13823 .block_erase = spi_block_erase_60,
13824 }, {
13825 .eraseblocks = { {1024 * 256, 1} },
13826 .block_erase = spi_block_erase_c7,
13827 },
13828 },
Jason Harper43ddef02014-05-04 00:55:24 +000013829 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13830 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013831 .write = spi_aai_write,
13832 .read = spi_chip_read, /* Fast read (0x0B) supported */
13833 .voltage = {1650, 1950},
13834 },
13835
13836 {
13837 .vendor = "SST",
13838 .name = "SST25WF040",
13839 .bustype = BUS_SPI,
13840 .manufacture_id = SST_ID,
13841 .model_id = SST_SST25WF040,
13842 .total_size = 512,
13843 .page_size = 256,
13844 .feature_bits = FEATURE_WRSR_EITHER,
13845 .tested = TEST_UNTESTED,
13846 .probe = probe_spi_rdid,
13847 .probe_timing = TIMING_ZERO,
13848 .block_erasers =
13849 {
13850 {
13851 .eraseblocks = { {4 * 1024, 128} },
13852 .block_erase = spi_block_erase_20,
13853 }, {
13854 .eraseblocks = { {32 * 1024, 16} },
13855 .block_erase = spi_block_erase_52,
13856 }, {
13857 .eraseblocks = { {64 * 1024, 8} },
13858 .block_erase = spi_block_erase_d8,
13859 }, {
13860 .eraseblocks = { {1024 * 512, 1} },
13861 .block_erase = spi_block_erase_60,
13862 }, {
13863 .eraseblocks = { {1024 * 512, 1} },
13864 .block_erase = spi_block_erase_c7,
13865 },
13866 },
Jason Harper43ddef02014-05-04 00:55:24 +000013867 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13868 .unlock = spi_disable_blockprotect_bp2_srwd,
13869 .write = spi_aai_write,
13870 .read = spi_chip_read, /* Fast read (0x0B) supported */
13871 .voltage = {1650, 1950},
13872 },
13873
13874 {
13875 .vendor = "SST",
13876 .name = "SST25WF080",
13877 .bustype = BUS_SPI,
13878 .manufacture_id = SST_ID,
13879 .model_id = SST_SST25WF080,
13880 .total_size = 1024,
13881 .page_size = 256,
13882 .feature_bits = FEATURE_WRSR_EITHER,
13883 .tested = TEST_OK_PREW,
13884 .probe = probe_spi_rdid,
13885 .probe_timing = TIMING_ZERO,
13886 .block_erasers =
13887 {
13888 {
13889 .eraseblocks = { {4 * 1024, 256} },
13890 .block_erase = spi_block_erase_20,
13891 }, {
13892 .eraseblocks = { {32 * 1024, 32} },
13893 .block_erase = spi_block_erase_52,
13894 }, {
13895 .eraseblocks = { {64 * 1024, 16} },
13896 .block_erase = spi_block_erase_d8,
13897 }, {
13898 .eraseblocks = { {1024 * 1024, 1} },
13899 .block_erase = spi_block_erase_60,
13900 }, {
13901 .eraseblocks = { {1024 * 1024, 1} },
13902 .block_erase = spi_block_erase_c7,
13903 },
13904 },
13905 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13906 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013907 .write = spi_aai_write,
13908 .read = spi_chip_read, /* Fast read (0x0B) supported */
13909 .voltage = {1650, 1950},
13910 },
13911
13912 {
13913 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013914 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013915 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013916 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013917 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013918 .total_size = 512,
13919 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013920 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013921 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013922 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013923 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013924 .block_erasers =
13925 {
13926 {
13927 .eraseblocks = { {128, 4096} },
13928 .block_erase = erase_sector_28sf040,
13929 }, {
13930 .eraseblocks = { {512 * 1024, 1} },
13931 .block_erase = erase_chip_28sf040,
13932 }
13933 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013934 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013935 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013936 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013937 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013938 },
13939
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013940 {
13941 .vendor = "SST",
13942 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013943 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013944 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013945 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013946 .total_size = 128,
13947 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013948 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013949 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013950 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013951 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013952 .block_erasers =
13953 {
13954 {
13955 .eraseblocks = { {128 * 1024, 1} },
13956 .block_erase = erase_chip_block_jedec,
13957 }
13958 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013959 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013960 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013961 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013962 },
13963
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013964 {
13965 .vendor = "SST",
13966 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013967 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013968 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013969 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013970 .total_size = 128,
13971 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013972 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013973 .tested = TEST_UNTESTED,
13974 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013975 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013976 .block_erasers =
13977 {
13978 {
13979 .eraseblocks = { {128 * 1024, 1} },
13980 .block_erase = erase_chip_block_jedec,
13981 }
13982 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013983 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013984 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013985 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013986 },
13987
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013988 {
13989 .vendor = "SST",
13990 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013991 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013992 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013993 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013994 .total_size = 256,
13995 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013996 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013997 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013998 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013999 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014000 .block_erasers =
14001 {
14002 {
14003 .eraseblocks = { {256 * 1024, 1} },
14004 .block_erase = erase_chip_block_jedec,
14005 }
14006 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014007 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014008 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014009 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014010 },
14011
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014012 {
14013 .vendor = "SST",
14014 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014015 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014016 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014017 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014018 .total_size = 256,
14019 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014020 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014021 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014022 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014023 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014024 .block_erasers =
14025 {
14026 {
14027 .eraseblocks = { {256 * 1024, 1} },
14028 .block_erase = erase_chip_block_jedec,
14029 }
14030 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014031 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014032 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014033 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014034 },
14035
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014036 {
14037 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000014038 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014039 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014040 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014041 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014042 .total_size = 64,
14043 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014044 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000014045 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014046 .probe = probe_jedec,
14047 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000014048 .block_erasers =
14049 {
14050 {
14051 .eraseblocks = { {4 * 1024, 16} },
14052 .block_erase = erase_sector_jedec,
14053 }, {
14054 .eraseblocks = { {64 * 1024, 1} },
14055 .block_erase = erase_chip_block_jedec,
14056 }
14057 },
Sean Nelson35727f72010-01-28 23:55:12 +000014058 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014059 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014060 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000014061 },
14062
14063 {
14064 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014065 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014066 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014067 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014068 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014069 .total_size = 128,
14070 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014071 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014072 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014073 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014074 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014075 .block_erasers =
14076 {
14077 {
14078 .eraseblocks = { {4 * 1024, 32} },
14079 .block_erase = erase_sector_jedec,
14080 }, {
14081 .eraseblocks = { {128 * 1024, 1} },
14082 .block_erase = erase_chip_block_jedec,
14083 }
14084 },
Sean Nelson35727f72010-01-28 23:55:12 +000014085 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014087 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014088 },
14089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014090 {
14091 .vendor = "SST",
14092 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014093 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014094 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014095 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014096 .total_size = 256,
14097 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014098 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000014099 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014100 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014101 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014102 .block_erasers =
14103 {
14104 {
14105 .eraseblocks = { {4 * 1024, 64} },
14106 .block_erase = erase_sector_jedec,
14107 }, {
14108 .eraseblocks = { {256 * 1024, 1} },
14109 .block_erase = erase_chip_block_jedec,
14110 }
14111 },
Sean Nelson35727f72010-01-28 23:55:12 +000014112 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014113 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014114 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014115 },
14116
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014117 {
14118 .vendor = "SST",
14119 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014120 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014121 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014122 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014123 .total_size = 512,
14124 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014125 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000014126 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014127 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014128 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014129 .block_erasers =
14130 {
14131 {
14132 .eraseblocks = { {4 * 1024, 128} },
14133 .block_erase = erase_sector_jedec,
14134 }, {
14135 .eraseblocks = { {512 * 1024, 1} },
14136 .block_erase = erase_chip_block_jedec,
14137 }
14138 },
Sean Nelson35727f72010-01-28 23:55:12 +000014139 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014140 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014141 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014142 },
14143
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014144 {
14145 .vendor = "SST",
14146 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014147 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014148 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014149 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014150 .total_size = 64,
14151 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014152 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000014153 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014154 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014155 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014156 .block_erasers =
14157 {
14158 {
14159 .eraseblocks = { {4 * 1024, 16} },
14160 .block_erase = erase_sector_jedec,
14161 }, {
14162 .eraseblocks = { {64 * 1024, 1} },
14163 .block_erase = erase_chip_block_jedec,
14164 }
14165 },
Sean Nelson35727f72010-01-28 23:55:12 +000014166 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014167 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014168 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014169 },
14170
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014171 {
14172 .vendor = "SST",
14173 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014174 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014175 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014176 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014177 .total_size = 128,
14178 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014179 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000014180 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014181 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014182 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014183 .block_erasers =
14184 {
14185 {
14186 .eraseblocks = { {4 * 1024, 32} },
14187 .block_erase = erase_sector_jedec,
14188 }, {
14189 .eraseblocks = { {128 * 1024, 1} },
14190 .block_erase = erase_chip_block_jedec,
14191 }
14192 },
Sean Nelson35727f72010-01-28 23:55:12 +000014193 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014194 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014195 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014196 },
14197
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014198 {
14199 .vendor = "SST",
14200 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014201 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014202 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014203 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014204 .total_size = 256,
14205 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014206 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014207 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014208 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014209 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014210 .block_erasers =
14211 {
14212 {
14213 .eraseblocks = { {4 * 1024, 64} },
14214 .block_erase = erase_sector_jedec,
14215 }, {
14216 .eraseblocks = { {256 * 1024, 1} },
14217 .block_erase = erase_chip_block_jedec,
14218 }
14219 },
Sean Nelson35727f72010-01-28 23:55:12 +000014220 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014221 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014222 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014223 },
14224
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014225 {
14226 .vendor = "SST",
14227 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014228 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014229 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014230 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014231 .total_size = 512,
14232 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014233 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014234 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014235 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014236 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014237 .block_erasers =
14238 {
14239 {
14240 .eraseblocks = { {4 * 1024, 128} },
14241 .block_erase = erase_sector_jedec,
14242 }, {
14243 .eraseblocks = { {512 * 1024, 1} },
14244 .block_erase = erase_chip_block_jedec,
14245 }
14246 },
Sean Nelson35727f72010-01-28 23:55:12 +000014247 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014248 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014249 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000014250 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014251
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014252 {
14253 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000014254 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014255 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014256 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014257 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000014258 .total_size = 1024,
14259 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014260 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000014261 .tested = TEST_UNTESTED,
14262 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014263 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014264 .block_erasers =
14265 {
14266 {
14267 .eraseblocks = { {4 * 1024, 256} },
14268 .block_erase = erase_sector_jedec,
14269 }, {
14270 .eraseblocks = { {64 * 1024, 16} },
14271 .block_erase = erase_block_jedec,
14272 }, {
14273 .eraseblocks = { {1024 * 1024, 1} },
14274 .block_erase = erase_chip_block_jedec,
14275 }
14276 },
Sean Nelson35727f72010-01-28 23:55:12 +000014277 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014278 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014279 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000014280 },
14281
14282 {
14283 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014284 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014285 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014286 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014287 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014288 .total_size = 256,
14289 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014290 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014291 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014292 .probe = probe_jedec,
14293 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014294 .block_erasers =
14295 {
14296 {
14297 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014298 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014299 }, {
14300 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014301 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014302 }, {
14303 .eraseblocks = { {256 * 1024, 1} },
14304 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14305 }
14306 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014307 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014308 .unlock = unlock_sst_fwhub,
14309 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014310 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014311 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014312 },
14313
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014314 {
14315 .vendor = "SST",
14316 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014317 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014318 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014319 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014320 .total_size = 384,
14321 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014322 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014323 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014324 .probe = probe_jedec,
14325 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014326 .block_erasers =
14327 {
14328 {
14329 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014330 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014331 }, {
14332 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014333 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014334 }, {
14335 .eraseblocks = { {384 * 1024, 1} },
14336 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14337 }
14338 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014339 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014340 .unlock = unlock_sst_fwhub,
14341 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014342 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014343 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014344 },
14345
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014346 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014347 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14348 * and is only honored for 64k block erase, but not 4k sector erase.
14349 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014350 .vendor = "SST",
14351 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014352 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014353 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014354 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014355 .total_size = 512,
14356 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014357 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014358 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014359 .probe = probe_jedec,
14360 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014361 .block_erasers =
14362 {
14363 {
14364 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014365 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014366 }, {
14367 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014368 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014369 }, {
14370 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000014371 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014372 },
14373 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014374 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014375 .unlock = unlock_sst_fwhub,
14376 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014377 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014378 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014379 },
14380
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014381 {
14382 .vendor = "SST",
14383 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014384 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014385 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014386 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014387 .total_size = 512,
14388 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014389 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014390 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014391 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014392 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014393 .block_erasers =
14394 {
14395 {
14396 .eraseblocks = { {4 * 1024, 128} },
14397 .block_erase = erase_sector_49lfxxxc,
14398 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014399 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014400 {64 * 1024, 7},
14401 {32 * 1024, 1},
14402 {8 * 1024, 2},
14403 {16 * 1024, 1},
14404 },
Sean Nelson69e58112010-03-23 17:10:28 +000014405 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014406 }
14407 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014408 .printlock = printlock_regspace2_block_eraser_1,
14409 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014410 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014411 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014412 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014413 },
14414
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014415 {
14416 .vendor = "SST",
14417 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014418 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014419 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014420 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014421 .total_size = 1024,
14422 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014423 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014424 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014425 .probe = probe_jedec,
14426 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014427 .block_erasers =
14428 {
14429 {
14430 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014431 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014432 }, {
14433 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014434 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014435 }, {
14436 .eraseblocks = { {1024 * 1024, 1} },
14437 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14438 }
14439 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014440 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014441 .unlock = unlock_sst_fwhub,
14442 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014443 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014444 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014445 },
14446
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014447 {
14448 .vendor = "SST",
14449 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014450 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014451 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014452 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014453 .total_size = 1024,
14454 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014455 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014456 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014457 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014458 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014459 .block_erasers =
14460 {
14461 {
14462 .eraseblocks = { {4 * 1024, 256} },
14463 .block_erase = erase_sector_49lfxxxc,
14464 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014465 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014466 {64 * 1024, 15},
14467 {32 * 1024, 1},
14468 {8 * 1024, 2},
14469 {16 * 1024, 1},
14470 },
Sean Nelson69e58112010-03-23 17:10:28 +000014471 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014472 }
14473 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014474 .printlock = printlock_regspace2_block_eraser_1,
14475 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014476 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014477 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014478 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014479 },
14480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014481 {
14482 .vendor = "SST",
14483 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014484 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014485 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014486 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014487 .total_size = 2048,
14488 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014489 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014490 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014491 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014492 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014493 .block_erasers =
14494 {
14495 {
14496 .eraseblocks = { {4 * 1024, 512} },
14497 .block_erase = erase_sector_49lfxxxc,
14498 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014499 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014500 {64 * 1024, 31},
14501 {32 * 1024, 1},
14502 {8 * 1024, 2},
14503 {16 * 1024, 1},
14504 },
Sean Nelson69e58112010-03-23 17:10:28 +000014505 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014506 }
14507 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014508 .printlock = printlock_regspace2_block_eraser_1,
14509 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014510 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014511 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014512 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014513 },
14514
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014515 {
14516 .vendor = "SST",
14517 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014518 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014519 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014520 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014521 .total_size = 256,
14522 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014523 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000014524 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014525 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014526 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014527 .block_erasers =
14528 {
14529 {
14530 .eraseblocks = { {4 * 1024, 64} },
14531 .block_erase = erase_sector_jedec,
14532 }, {
14533 .eraseblocks = { {16 * 1024, 16} },
14534 .block_erase = erase_block_jedec,
14535 }, {
14536 .eraseblocks = { {256 * 1024, 1} },
14537 .block_erase = NULL,
14538 }
14539 },
Sean Nelson35727f72010-01-28 23:55:12 +000014540 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014541 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014542 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000014543 },
14544
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014545 {
14546 .vendor = "SST",
14547 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014548 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014549 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014550 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014551 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000014552 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014553 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014554 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014555 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014556 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014557 .block_erasers =
14558 {
14559 {
14560 .eraseblocks = { {4 * 1024, 64} },
14561 .block_erase = erase_sector_jedec,
14562 }, {
14563 .eraseblocks = { {16 * 1024, 16} },
14564 .block_erase = erase_block_jedec,
14565 }, {
14566 .eraseblocks = { {256 * 1024, 1} },
14567 .block_erase = NULL,
14568 }
14569 },
Sean Nelson35727f72010-01-28 23:55:12 +000014570 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014571 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014572 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014573 },
14574
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014575 {
14576 .vendor = "SST",
14577 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014578 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014579 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014580 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014581 .total_size = 512,
14582 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014583 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014584 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014585 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014586 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014587 .block_erasers =
14588 {
14589 {
14590 .eraseblocks = { {4 * 1024, 128} },
14591 .block_erase = erase_sector_jedec,
14592 }, {
14593 .eraseblocks = { {64 * 1024, 8} },
14594 .block_erase = erase_block_jedec,
14595 }, {
14596 .eraseblocks = { {512 * 1024, 1} },
14597 .block_erase = NULL,
14598 }
14599 },
Sean Nelson35727f72010-01-28 23:55:12 +000014600 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014601 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014602 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014603 },
14604
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014605 {
14606 .vendor = "SST",
14607 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014608 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014609 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014610 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014611 .total_size = 512,
14612 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000014613 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014614 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014615 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014616 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014617 .block_erasers =
14618 {
14619 {
14620 .eraseblocks = { {4 * 1024, 128} },
14621 .block_erase = erase_sector_jedec,
14622 }, {
14623 .eraseblocks = { {64 * 1024, 8} },
14624 .block_erase = erase_block_jedec,
14625 }, {
14626 .eraseblocks = { {512 * 1024, 1} },
14627 .block_erase = NULL,
14628 }
14629 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014630 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014631 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014632 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014633 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014634 },
14635
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014636 {
14637 .vendor = "SST",
14638 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014639 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014640 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020014641 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014642 .total_size = 1024,
14643 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014644 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000014645 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014646 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014647 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014648 .block_erasers =
14649 {
14650 {
14651 .eraseblocks = { {4 * 1024, 256} },
14652 .block_erase = erase_sector_jedec,
14653 }, {
14654 .eraseblocks = { {64 * 1024, 16} },
14655 .block_erase = erase_block_jedec,
14656 }, {
14657 .eraseblocks = { {1024 * 1024, 1} },
14658 .block_erase = NULL,
14659 }
14660 },
Sean Nelson35727f72010-01-28 23:55:12 +000014661 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014662 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014663 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014664 },
14665
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014666 {
14667 .vendor = "SST",
14668 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014669 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014670 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014671 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014672 .total_size = 2048,
14673 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014674 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014675 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014676 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014677 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014678 .block_erasers =
14679 {
14680 {
14681 .eraseblocks = { {4 * 1024, 512} },
14682 .block_erase = erase_sector_49lfxxxc,
14683 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014684 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014685 {64 * 1024, 31},
14686 {32 * 1024, 1},
14687 {8 * 1024, 2},
14688 {16 * 1024, 1},
14689 },
Sean Nelson69e58112010-03-23 17:10:28 +000014690 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014691 }
14692 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014693 .printlock = printlock_regspace2_block_eraser_1,
14694 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014695 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014696 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014697 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014698 },
14699
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014700 {
14701 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014702 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014703 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014704 .manufacture_id = ST_ID,
14705 .model_id = ST_M29F002B,
14706 .total_size = 256,
14707 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014708 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014709 .tested = TEST_UNTESTED,
14710 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014711 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014712 .block_erasers =
14713 {
14714 {
14715 .eraseblocks = {
14716 {16 * 1024, 1},
14717 {8 * 1024, 2},
14718 {32 * 1024, 1},
14719 {64 * 1024, 3},
14720 },
14721 .block_erase = erase_sector_jedec,
14722 }, {
14723 .eraseblocks = { {256 * 1024, 1} },
14724 .block_erase = erase_chip_block_jedec,
14725 }
14726 },
Sean Nelson35727f72010-01-28 23:55:12 +000014727 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014728 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014729 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014730 },
14731
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014732 {
14733 .vendor = "ST",
14734 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014735 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014736 .manufacture_id = ST_ID,
14737 .model_id = ST_M29F002T,
14738 .total_size = 256,
14739 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014740 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014741 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014742 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014743 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014744 .block_erasers =
14745 {
14746 {
14747 .eraseblocks = {
14748 {64 * 1024, 3},
14749 {32 * 1024, 1},
14750 {8 * 1024, 2},
14751 {16 * 1024, 1},
14752 },
14753 .block_erase = erase_sector_jedec,
14754 }, {
14755 .eraseblocks = { {256 * 1024, 1} },
14756 .block_erase = erase_chip_block_jedec,
14757 }
14758 },
Sean Nelson35727f72010-01-28 23:55:12 +000014759 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014760 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014761 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014762 },
14763
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014764 {
14765 .vendor = "ST",
14766 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014767 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014768 .manufacture_id = ST_ID,
14769 .model_id = ST_M29F040B,
14770 .total_size = 512,
14771 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014772 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14773 .tested = TEST_UNTESTED,
14774 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000014775 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000014776 .block_erasers =
14777 {
14778 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014779 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000014780 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014781 }, {
14782 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000014783 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014784 }
14785 },
Sean Nelson35727f72010-01-28 23:55:12 +000014786 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014787 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014788 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014789 },
14790
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014791 {
Sean Nelson35727f72010-01-28 23:55:12 +000014792 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014793 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014794 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014795 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014796 .manufacture_id = ST_ID,
14797 .model_id = ST_M29F400BB,
14798 .total_size = 512,
14799 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014800 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014801 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014802 .probe = probe_jedec,
14803 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014804 .block_erasers =
14805 {
14806 {
14807 .eraseblocks = {
14808 {16 * 1024, 1},
14809 {8 * 1024, 2},
14810 {32 * 1024, 1},
14811 {64 * 1024, 7},
14812 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014813 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014814 }, {
14815 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014816 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014817 }
14818 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014819 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014820 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014821 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014822 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014823
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014824 {
14825 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14826 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014827 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014828 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014829 .manufacture_id = ST_ID,
14830 .model_id = ST_M29F400BT,
14831 .total_size = 512,
14832 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014833 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014834 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014835 .probe = probe_jedec,
14836 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000014837 .block_erasers =
14838 {
14839 {
14840 .eraseblocks = {
14841 {64 * 1024, 7},
14842 {32 * 1024, 1},
14843 {8 * 1024, 2},
14844 {16 * 1024, 1},
14845 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014846 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014847 }, {
14848 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014849 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014850 }
14851 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014852 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014853 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014854 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014855 },
14856
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014857 {
14858 .vendor = "ST",
14859 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014860 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014861 .manufacture_id = ST_ID,
14862 .model_id = ST_M29W010B,
14863 .total_size = 128,
14864 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014865 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014866 .tested = TEST_UNTESTED,
14867 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014868 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014869 .block_erasers =
14870 {
14871 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014872 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014873 .block_erase = erase_sector_jedec,
14874 }, {
14875 .eraseblocks = { {128 * 1024, 1} },
14876 .block_erase = erase_chip_block_jedec,
14877 }
14878 },
Sean Nelson35727f72010-01-28 23:55:12 +000014879 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014880 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014881 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014882 },
14883
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014884 {
14885 .vendor = "ST",
14886 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014887 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014888 .manufacture_id = ST_ID,
14889 .model_id = ST_M29W040B,
14890 .total_size = 512,
14891 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014892 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014893 .tested = TEST_UNTESTED,
14894 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014895 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014896 .block_erasers =
14897 {
14898 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014899 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014900 .block_erase = erase_sector_jedec,
14901 }, {
14902 .eraseblocks = { {512 * 1024, 1} },
14903 .block_erase = erase_chip_block_jedec,
14904 }
14905 },
Sean Nelson35727f72010-01-28 23:55:12 +000014906 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014907 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014908 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014909 },
14910
Stefan Taunereb582572012-09-21 12:52:50 +000014911 {
14912 .vendor = "ST",
14913 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014914 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100014915 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000014916 .model_id = ST_M29W512B,
14917 .total_size = 64,
14918 .page_size = 64 * 1024,
14919 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014920 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000014921 .probe = probe_jedec,
14922 .probe_timing = TIMING_ZERO,
14923 .block_erasers =
14924 {
14925 {
14926 .eraseblocks = { {64 * 1024, 1} },
14927 .block_erase = erase_chip_block_jedec,
14928 }
14929 },
14930 .write = write_jedec_1,
14931 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014932 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000014933 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000014934
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014935 {
14936 .vendor = "ST",
14937 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014938 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014939 .manufacture_id = ST_ID,
14940 .model_id = ST_M50FLW040A,
14941 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014942 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014943 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014944 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014945 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014946 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014947 .block_erasers =
14948 {
14949 {
Sean Nelson329bde72010-01-19 16:39:19 +000014950 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014951 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014952 {64 * 1024, 5}, /* block */
14953 {4 * 1024, 16}, /* sector */
14954 {4 * 1024, 16}, /* sector */
14955 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014956 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014957 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014958 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014959 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014960 }
14961 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014962 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100014963 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014964 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014965 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014966 },
14967
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014968 {
14969 .vendor = "ST",
14970 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014971 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014972 .manufacture_id = ST_ID,
14973 .model_id = ST_M50FLW040B,
14974 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014975 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014976 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014977 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014978 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014979 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014980 .block_erasers =
14981 {
14982 {
Sean Nelson329bde72010-01-19 16:39:19 +000014983 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014984 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014985 {4 * 1024, 16}, /* sector */
14986 {64 * 1024, 5}, /* block */
14987 {4 * 1024, 16}, /* sector */
14988 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014989 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014990 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014991 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014992 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014993 }
14994 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014995 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100014996 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014997 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014998 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014999 },
15000
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015001 {
15002 .vendor = "ST",
15003 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015004 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015005 .manufacture_id = ST_ID,
15006 .model_id = ST_M50FLW080A,
15007 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015008 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015009 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015010 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015011 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015012 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015013 .block_erasers =
15014 {
15015 {
Sean Nelson329bde72010-01-19 16:39:19 +000015016 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015017 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015018 {64 * 1024, 13}, /* block */
15019 {4 * 1024, 16}, /* sector */
15020 {4 * 1024, 16}, /* sector */
15021 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015022 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015023 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015024 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015025 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015026 }
15027 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015028 .printlock = printlock_regspace2_block_eraser_0,
15029 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015030 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015031 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015032 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015033 },
15034
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015035 {
15036 .vendor = "ST",
15037 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015038 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015039 .manufacture_id = ST_ID,
15040 .model_id = ST_M50FLW080B,
15041 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015042 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015043 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015044 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015045 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015046 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015047 .block_erasers =
15048 {
15049 {
Sean Nelson329bde72010-01-19 16:39:19 +000015050 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015051 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015052 {4 * 1024, 16}, /* sector */
15053 {64 * 1024, 13}, /* block */
15054 {4 * 1024, 16}, /* sector */
15055 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015056 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015057 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015058 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015059 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015060 }
15061 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015062 .printlock = printlock_regspace2_block_eraser_0,
15063 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015064 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015065 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015066 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015067 },
15068
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015069 {
15070 .vendor = "ST",
15071 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015072 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015073 .manufacture_id = ST_ID,
15074 .model_id = ST_M50FW002,
15075 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000015076 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015077 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015078 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015079 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015080 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015081 .block_erasers =
15082 {
15083 {
15084 .eraseblocks = {
15085 {64 * 1024, 3},
15086 {32 * 1024, 1},
15087 {8 * 1024, 2},
15088 {16 * 1024, 1},
15089 },
Sean Nelson28accc22010-03-19 18:47:06 +000015090 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015091 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000015092 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015093 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000015094 }
15095 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015096 .printlock = printlock_regspace2_block_eraser_0,
15097 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015098 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015099 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015100 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015101 },
15102
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015103 {
15104 .vendor = "ST",
15105 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015106 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015107 .manufacture_id = ST_ID,
15108 .model_id = ST_M50FW016,
15109 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015110 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015111 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015112 .tested = TEST_UNTESTED,
15113 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015114 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015115 .block_erasers =
15116 {
15117 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015118 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000015119 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015120 }
15121 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015122 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015123 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015124 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015125 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015126 },
15127
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015128 {
15129 .vendor = "ST",
15130 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015131 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015132 .manufacture_id = ST_ID,
15133 .model_id = ST_M50FW040,
15134 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015135 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015136 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000015137 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015138 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015139 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015140 .block_erasers =
15141 {
15142 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015143 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015144 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015145 }
15146 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015147 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015148 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015149 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015150 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015151 },
15152
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015153 {
15154 .vendor = "ST",
15155 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015156 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015157 .manufacture_id = ST_ID,
15158 .model_id = ST_M50FW080,
15159 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015160 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015161 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015162 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015163 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015164 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015165 .block_erasers =
15166 {
15167 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015168 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015169 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015170 }
15171 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015172 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015173 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015175 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015176 },
15177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015178 {
15179 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015180 .name = "M50LPW080",
15181 .bustype = BUS_LPC, /* A/A Mux */
15182 .manufacture_id = ST_ID,
15183 .model_id = ST_M50LPW080,
15184 .total_size = 1024,
15185 .page_size = 0,
15186 .feature_bits = FEATURE_REGISTERMAP,
15187 .tested = TEST_UNTESTED,
15188 .probe = probe_82802ab,
15189 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15190 .block_erasers =
15191 {
15192 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015193 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015194 .block_erase = erase_block_82802ab,
15195 }
15196 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015197 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015198 .write = write_82802ab,
15199 .read = read_memmapped,
15200 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15201 },
15202
15203 {
15204 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015205 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015206 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015207 .manufacture_id = ST_ID,
15208 .model_id = ST_M50LPW116,
15209 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015210 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015211 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015212 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015213 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000015214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015215 .block_erasers =
15216 {
15217 {
15218 .eraseblocks = {
15219 {4 * 1024, 16},
15220 {64 * 1024, 30},
15221 {32 * 1024, 1},
15222 {8 * 1024, 2},
15223 {16 * 1024, 1},
15224 },
Sean Nelson28accc22010-03-19 18:47:06 +000015225 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015226 }
15227 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015228 .printlock = printlock_regspace2_block_eraser_0,
15229 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015230 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015231 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015232 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015233 },
15234
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015235 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015236 .vendor = "SyncMOS/MoselVitelic",
15237 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015238 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015239 .manufacture_id = SYNCMOS_MVC_ID,
15240 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015241 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015242 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000015243 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015244 .tested = TEST_UNTESTED,
15245 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015246 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015247 .block_erasers =
15248 {
15249 {
15250 .eraseblocks = { {512, 256} },
15251 .block_erase = erase_sector_jedec,
15252 }, {
15253 .eraseblocks = { {128 * 1024, 1} },
15254 .block_erase = erase_chip_block_jedec,
15255 },
15256 },
Sean Nelson35727f72010-01-28 23:55:12 +000015257 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015258 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015259 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015260 },
15261
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015262 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015263 .vendor = "SyncMOS/MoselVitelic",
15264 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015265 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015266 .manufacture_id = SYNCMOS_MVC_ID,
15267 .model_id = SM_MVC_29C51001T,
15268 .total_size = 128,
15269 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000015270 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015271 .tested = TEST_UNTESTED,
15272 .probe = probe_jedec,
15273 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15274 .block_erasers =
15275 {
15276 {
15277 .eraseblocks = { {512, 256} },
15278 .block_erase = erase_sector_jedec,
15279 }, {
15280 .eraseblocks = { {128 * 1024, 1} },
15281 .block_erase = erase_chip_block_jedec,
15282 },
15283 },
15284 .write = write_jedec_1,
15285 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015286 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015287 },
15288
15289 {
15290 .vendor = "SyncMOS/MoselVitelic",
15291 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015292 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015293 .manufacture_id = SYNCMOS_MVC_ID,
15294 .model_id = SM_MVC_29C51002B,
15295 .total_size = 256,
15296 .page_size = 512,
15297 .feature_bits = FEATURE_EITHER_RESET,
15298 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015299 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015300 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015301 .block_erasers =
15302 {
15303 {
15304 .eraseblocks = { {512, 512} },
15305 .block_erase = erase_sector_jedec,
15306 }, {
15307 .eraseblocks = { {256 * 1024, 1} },
15308 .block_erase = erase_chip_block_jedec,
15309 },
15310 },
Sean Nelson35727f72010-01-28 23:55:12 +000015311 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015312 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000015313 },
15314
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015315 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015316 .vendor = "SyncMOS/MoselVitelic",
15317 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015318 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015319 .manufacture_id = SYNCMOS_MVC_ID,
15320 .model_id = SM_MVC_29C51002T,
15321 .total_size = 256,
15322 .page_size = 512,
15323 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015324 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015325 .probe = probe_jedec,
15326 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15327 .block_erasers =
15328 {
15329 {
15330 .eraseblocks = { {512, 512} },
15331 .block_erase = erase_sector_jedec,
15332 }, {
15333 .eraseblocks = { {256 * 1024, 1} },
15334 .block_erase = erase_chip_block_jedec,
15335 },
15336 },
15337 .write = write_jedec_1,
15338 .read = read_memmapped,
15339 },
15340
15341 {
15342 .vendor = "SyncMOS/MoselVitelic",
15343 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015344 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015345 .manufacture_id = SYNCMOS_MVC_ID,
15346 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015347 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015348 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015349 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015350 .tested = TEST_UNTESTED,
15351 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015352 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000015353 .block_erasers =
15354 {
15355 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015356 .eraseblocks = { {1024, 512} },
15357 .block_erase = erase_sector_jedec,
15358 }, {
15359 .eraseblocks = { {512 * 1024, 1} },
15360 .block_erase = erase_chip_block_jedec,
15361 },
15362 },
15363 .write = write_jedec_1,
15364 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015365 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015366 },
15367
15368 {
15369 .vendor = "SyncMOS/MoselVitelic",
15370 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015371 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015372 .manufacture_id = SYNCMOS_MVC_ID,
15373 .model_id = SM_MVC_29C51004T,
15374 .total_size = 512,
15375 .page_size = 1024,
15376 .feature_bits = FEATURE_EITHER_RESET,
15377 .tested = TEST_UNTESTED,
15378 .probe = probe_jedec,
15379 .probe_timing = TIMING_ZERO,
15380 .block_erasers =
15381 {
15382 {
15383 .eraseblocks = { {1024, 512} },
15384 .block_erase = erase_sector_jedec,
15385 }, {
15386 .eraseblocks = { {512 * 1024, 1} },
15387 .block_erase = erase_chip_block_jedec,
15388 },
15389 },
15390 .write = write_jedec_1,
15391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015392 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015393 },
15394
15395 {
15396 .vendor = "SyncMOS/MoselVitelic",
15397 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015398 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015399 .manufacture_id = SYNCMOS_MVC_ID,
15400 .model_id = SM_MVC_29C31004B,
15401 .total_size = 512,
15402 .page_size = 1024,
15403 .feature_bits = FEATURE_EITHER_RESET,
15404 .tested = TEST_UNTESTED,
15405 .probe = probe_jedec,
15406 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15407 .block_erasers =
15408 {
15409 {
15410 .eraseblocks = { {1024, 512} },
15411 .block_erase = erase_sector_jedec,
15412 }, {
15413 .eraseblocks = { {512 * 1024, 1} },
15414 .block_erase = erase_chip_block_jedec,
15415 },
15416 },
15417 .write = write_jedec_1,
15418 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015419 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015420 },
15421
15422 {
15423 .vendor = "SyncMOS/MoselVitelic",
15424 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015425 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015426 .manufacture_id = SYNCMOS_MVC_ID,
15427 .model_id = SM_MVC_29C31004T,
15428 .total_size = 512,
15429 .page_size = 1024,
15430 .feature_bits = FEATURE_EITHER_RESET,
15431 .tested = TEST_UNTESTED,
15432 .probe = probe_jedec,
15433 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15434 .block_erasers =
15435 {
15436 {
15437 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015438 .block_erase = erase_sector_jedec,
15439 }, {
15440 .eraseblocks = { {512 * 1024, 1} },
15441 .block_erase = erase_chip_block_jedec,
15442 },
15443 },
Sean Nelson35727f72010-01-28 23:55:12 +000015444 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015445 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015446 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015447 },
15448
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015449 {
Uwe Hermanna106d152009-05-27 23:17:40 +000015450 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015451 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015452 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015453 .manufacture_id = TI_OLD_ID,
15454 .model_id = TI_TMS29F002RB,
15455 .total_size = 256,
15456 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000015457 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015458 .tested = TEST_UNTESTED,
15459 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015460 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015461 .block_erasers =
15462 {
15463 {
15464 .eraseblocks = {
15465 {16 * 1024, 1},
15466 {8 * 1024, 2},
15467 {32 * 1024, 1},
15468 {64 * 1024, 3},
15469 },
15470 .block_erase = erase_sector_jedec,
15471 }, {
15472 .eraseblocks = { {256 * 1024, 1} },
15473 .block_erase = erase_chip_block_jedec,
15474 },
15475 },
Sean Nelson35727f72010-01-28 23:55:12 +000015476 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015477 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015478 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015479 },
15480
15481 {
Uwe Hermanna106d152009-05-27 23:17:40 +000015482 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015483 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015484 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015485 .manufacture_id = TI_OLD_ID,
15486 .model_id = TI_TMS29F002RT,
15487 .total_size = 256,
15488 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000015489 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015490 .tested = TEST_UNTESTED,
15491 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015492 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015493 .block_erasers =
15494 {
15495 {
15496 .eraseblocks = {
15497 {64 * 1024, 3},
15498 {32 * 1024, 1},
15499 {8 * 1024, 2},
15500 {16 * 1024, 1},
15501 },
15502 .block_erase = erase_sector_jedec,
15503 }, {
15504 .eraseblocks = { {256 * 1024, 1} },
15505 .block_erase = erase_chip_block_jedec,
15506 },
15507 },
Sean Nelson35727f72010-01-28 23:55:12 +000015508 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015509 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015510 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015511 },
15512
15513 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015514 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000015515 .name = "W25Q40.V",
15516 .bustype = BUS_SPI,
15517 .manufacture_id = WINBOND_NEX_ID,
15518 .model_id = WINBOND_NEX_W25Q40_V,
15519 .total_size = 512,
15520 .page_size = 256,
15521 /* supports SFDP */
15522 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +000015524 .tested = TEST_OK_PREW,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000015525 .probe = probe_spi_rdid,
15526 .probe_timing = TIMING_ZERO,
15527 .block_erasers =
15528 {
15529 {
15530 .eraseblocks = { {4 * 1024, 128} },
15531 .block_erase = spi_block_erase_20,
15532 }, {
15533 .eraseblocks = { {32 * 1024, 16} },
15534 .block_erase = spi_block_erase_52,
15535 }, {
15536 .eraseblocks = { {64 * 1024, 8} },
15537 .block_erase = spi_block_erase_d8,
15538 }, {
15539 .eraseblocks = { {512 * 1024, 1} },
15540 .block_erase = spi_block_erase_60,
15541 }, {
15542 .eraseblocks = { {512 * 1024, 1} },
15543 .block_erase = spi_block_erase_c7,
15544 }
15545 },
15546 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15547 .unlock = spi_disable_blockprotect,
15548 .write = spi_chip_write_256, /* Multi I/O supported */
15549 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15550 .voltage = {2700, 3600},
15551 },
15552
15553 {
15554 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015555 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015556 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015557 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015558 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015559 .total_size = 1024,
15560 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015561 /* supports SFDP */
15562 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015563 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015564 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015565 .probe = probe_spi_rdid,
15566 .probe_timing = TIMING_ZERO,
15567 .block_erasers =
15568 {
15569 {
15570 .eraseblocks = { {4 * 1024, 256} },
15571 .block_erase = spi_block_erase_20,
15572 }, {
15573 .eraseblocks = { {32 * 1024, 32} },
15574 .block_erase = spi_block_erase_52,
15575 }, {
15576 .eraseblocks = { {64 * 1024, 16} },
15577 .block_erase = spi_block_erase_d8,
15578 }, {
15579 .eraseblocks = { {1024 * 1024, 1} },
15580 .block_erase = spi_block_erase_60,
15581 }, {
15582 .eraseblocks = { {1024 * 1024, 1} },
15583 .block_erase = spi_block_erase_c7,
15584 }
15585 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015586 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015587 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015588 .write = spi_chip_write_256,
15589 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015590 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015591 },
15592
15593 {
15594 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015595 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015596 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015597 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015598 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015599 .total_size = 2048,
15600 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015601 /* supports SFDP */
15602 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015603 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000015604 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015605 .probe = probe_spi_rdid,
15606 .probe_timing = TIMING_ZERO,
15607 .block_erasers =
15608 {
15609 {
15610 .eraseblocks = { {4 * 1024, 512} },
15611 .block_erase = spi_block_erase_20,
15612 }, {
15613 .eraseblocks = { {32 * 1024, 64} },
15614 .block_erase = spi_block_erase_52,
15615 }, {
15616 .eraseblocks = { {64 * 1024, 32} },
15617 .block_erase = spi_block_erase_d8,
15618 }, {
15619 .eraseblocks = { {2 * 1024 * 1024, 1} },
15620 .block_erase = spi_block_erase_60,
15621 }, {
15622 .eraseblocks = { {2 * 1024 * 1024, 1} },
15623 .block_erase = spi_block_erase_c7,
15624 }
15625 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015626 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015627 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015628 .write = spi_chip_write_256,
15629 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015630 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015631 },
15632
15633 {
15634 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015635 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015636 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015637 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015638 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015639 .total_size = 4096,
15640 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015641 /* supports SFDP */
15642 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015643 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015644 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015645 .probe = probe_spi_rdid,
15646 .probe_timing = TIMING_ZERO,
15647 .block_erasers =
15648 {
15649 {
15650 .eraseblocks = { {4 * 1024, 1024} },
15651 .block_erase = spi_block_erase_20,
15652 }, {
15653 .eraseblocks = { {32 * 1024, 128} },
15654 .block_erase = spi_block_erase_52,
15655 }, {
15656 .eraseblocks = { {64 * 1024, 64} },
15657 .block_erase = spi_block_erase_d8,
15658 }, {
15659 .eraseblocks = { {4 * 1024 * 1024, 1} },
15660 .block_erase = spi_block_erase_60,
15661 }, {
15662 .eraseblocks = { {4 * 1024 * 1024, 1} },
15663 .block_erase = spi_block_erase_c7,
15664 }
15665 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015666 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015667 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015668 .write = spi_chip_write_256,
15669 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015670 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015671 },
15672
15673 {
15674 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015675 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015676 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000015677 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015678 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000015679 .total_size = 8192,
15680 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015681 /* supports SFDP */
15682 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015683 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015684 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000015685 .probe = probe_spi_rdid,
15686 .probe_timing = TIMING_ZERO,
15687 .block_erasers =
15688 {
15689 {
15690 .eraseblocks = { {4 * 1024, 2048} },
15691 .block_erase = spi_block_erase_20,
15692 }, {
15693 .eraseblocks = { {32 * 1024, 256} },
15694 .block_erase = spi_block_erase_52,
15695 }, {
15696 .eraseblocks = { {64 * 1024, 128} },
15697 .block_erase = spi_block_erase_d8,
15698 }, {
15699 .eraseblocks = { {8 * 1024 * 1024, 1} },
15700 .block_erase = spi_block_erase_60,
15701 }, {
15702 .eraseblocks = { {8 * 1024 * 1024, 1} },
15703 .block_erase = spi_block_erase_c7,
15704 }
15705 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015706 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015707 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000015708 .write = spi_chip_write_256,
15709 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015710 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000015711 },
15712
15713 {
15714 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015715 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015716 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015717 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015718 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015719 .total_size = 16384,
15720 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015721 /* supports SFDP */
15722 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015723 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015724 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015725 .probe = probe_spi_rdid,
15726 .probe_timing = TIMING_ZERO,
15727 .block_erasers =
15728 {
15729 {
15730 .eraseblocks = { {4 * 1024, 4096} },
15731 .block_erase = spi_block_erase_20,
15732 }, {
15733 .eraseblocks = { {32 * 1024, 512} },
15734 .block_erase = spi_block_erase_52,
15735 }, {
15736 .eraseblocks = { {64 * 1024, 256} },
15737 .block_erase = spi_block_erase_d8,
15738 }, {
15739 .eraseblocks = { {16 * 1024 * 1024, 1} },
15740 .block_erase = spi_block_erase_60,
15741 }, {
15742 .eraseblocks = { {16 * 1024 * 1024, 1} },
15743 .block_erase = spi_block_erase_c7,
15744 }
15745 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015746 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000015747 .unlock = spi_disable_blockprotect,
15748 .write = spi_chip_write_256,
15749 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015750 .voltage = {2700, 3600},
15751 },
15752
15753 {
15754 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020015755 .name = "W25Q128.V..M",
15756 .bustype = BUS_SPI,
15757 .manufacture_id = WINBOND_NEX_ID,
15758 .model_id = WINBOND_NEX_W25Q128_V_M,
15759 .total_size = 16384,
15760 .page_size = 256,
15761 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15762 .tested = TEST_OK_PREW,
15763 .probe = probe_spi_rdid,
15764 .probe_timing = TIMING_ZERO,
15765 .block_erasers =
15766 {
15767 {
15768 .eraseblocks = { {4 * 1024, 4096} },
15769 .block_erase = spi_block_erase_20,
15770 }, {
15771 .eraseblocks = { {32 * 1024, 512} },
15772 .block_erase = spi_block_erase_52,
15773 }, {
15774 .eraseblocks = { {64 * 1024, 256} },
15775 .block_erase = spi_block_erase_d8,
15776 }, {
15777 .eraseblocks = { {16 * 1024 * 1024, 1} },
15778 .block_erase = spi_block_erase_60,
15779 }, {
15780 .eraseblocks = { {16 * 1024 * 1024, 1} },
15781 .block_erase = spi_block_erase_c7,
15782 }
15783 },
15784 .unlock = spi_disable_blockprotect,
15785 .write = spi_chip_write_256,
15786 .read = spi_chip_read,
15787 .voltage = {2700, 3600},
15788 },
15789
15790 {
15791 .vendor = "Winbond",
Boris Baykovaa6c3742016-06-11 18:29:01 +020015792 .name = "W25Q256.V",
15793 .bustype = BUS_SPI,
15794 .manufacture_id = WINBOND_NEX_ID,
15795 .model_id = WINBOND_NEX_W25Q256_V,
15796 .total_size = 32768,
15797 .page_size = 256,
15798 /* supports SFDP */
15799 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15800 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nico Huberaac81422017-11-10 22:54:13 +010015801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
15802 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
Angel Pons3130cbd2018-09-30 19:32:30 +020015803 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015804 .probe = probe_spi_rdid,
15805 .probe_timing = TIMING_ZERO,
15806 .block_erasers =
15807 {
15808 {
15809 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020015810 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015811 }, {
15812 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020015813 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015814 }, {
15815 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020015816 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015817 }, {
15818 .eraseblocks = { {32 * 1024 * 1024, 1} },
15819 .block_erase = spi_block_erase_60,
15820 }, {
15821 .eraseblocks = { {32 * 1024 * 1024, 1} },
15822 .block_erase = spi_block_erase_c7,
15823 }
15824 },
15825 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15826 .unlock = spi_disable_blockprotect,
15827 .write = spi_chip_write_256,
15828 .read = spi_chip_read,
15829 .voltage = {2700, 3600},
15830 },
15831
15832 {
15833 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000015834 .name = "W25Q256JV_M",
15835 .bustype = BUS_SPI,
15836 .manufacture_id = WINBOND_NEX_ID,
15837 .model_id = WINBOND_NEX_W25Q256JV_M,
15838 .total_size = 32768,
15839 .page_size = 256,
15840 /* supports SFDP */
15841 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15842 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
15843 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
15844 .tested = TEST_OK_PREW,
15845 .probe = probe_spi_rdid,
15846 .probe_timing = TIMING_ZERO,
15847 .block_erasers =
15848 {
15849 {
15850 .eraseblocks = { {4 * 1024, 8192} },
15851 .block_erase = spi_block_erase_21,
15852 }, {
15853 .eraseblocks = { {4 * 1024, 8192} },
15854 .block_erase = spi_block_erase_20,
15855 }, {
15856 .eraseblocks = { {32 * 1024, 1024} },
15857 .block_erase = spi_block_erase_52,
15858 }, {
15859 .eraseblocks = { {64 * 1024, 512} },
15860 .block_erase = spi_block_erase_dc,
15861 }, {
15862 .eraseblocks = { {64 * 1024, 512} },
15863 .block_erase = spi_block_erase_d8,
15864 }, {
15865 .eraseblocks = { {32 * 1024 * 1024, 1} },
15866 .block_erase = spi_block_erase_60,
15867 }, {
15868 .eraseblocks = { {32 * 1024 * 1024, 1} },
15869 .block_erase = spi_block_erase_c7,
15870 }
15871 },
15872 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15873 .unlock = spi_disable_blockprotect,
15874 .write = spi_chip_write_256,
15875 .read = spi_chip_read,
15876 .voltage = {2700, 3600},
15877 },
15878
15879 {
15880 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015881 .name = "W25Q20.W",
15882 .bustype = BUS_SPI,
15883 .manufacture_id = WINBOND_NEX_ID,
15884 .model_id = WINBOND_NEX_W25Q20_W,
15885 .total_size = 256,
15886 .page_size = 256,
15887 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15889 .tested = TEST_UNTESTED,
15890 .probe = probe_spi_rdid,
15891 .probe_timing = TIMING_ZERO,
15892 .block_erasers =
15893 {
15894 {
15895 .eraseblocks = { {4 * 1024, 64} },
15896 .block_erase = spi_block_erase_20,
15897 }, {
15898 .eraseblocks = { {32 * 1024, 8} },
15899 .block_erase = spi_block_erase_52,
15900 }, {
15901 .eraseblocks = { {64 * 1024, 4} },
15902 .block_erase = spi_block_erase_d8,
15903 }, {
15904 .eraseblocks = { {256 * 1024, 1} },
15905 .block_erase = spi_block_erase_60,
15906 }, {
15907 .eraseblocks = { {256 * 1024, 1} },
15908 .block_erase = spi_block_erase_c7,
15909 }
15910 },
15911 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15912 .unlock = spi_disable_blockprotect,
15913 .write = spi_chip_write_256,
15914 .read = spi_chip_read,
15915 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15916 },
15917
15918 {
15919 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020015920 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015921 .bustype = BUS_SPI,
15922 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020015923 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015924 .total_size = 512,
15925 .page_size = 256,
15926 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15927 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons3164a0c2018-09-30 20:26:06 +020015928 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015929 .probe = probe_spi_rdid,
15930 .probe_timing = TIMING_ZERO,
15931 .block_erasers =
15932 {
15933 {
15934 .eraseblocks = { {4 * 1024, 128} },
15935 .block_erase = spi_block_erase_20,
15936 }, {
15937 .eraseblocks = { {32 * 1024, 16} },
15938 .block_erase = spi_block_erase_52,
15939 }, {
15940 .eraseblocks = { {64 * 1024, 8} },
15941 .block_erase = spi_block_erase_d8,
15942 }, {
15943 .eraseblocks = { {512 * 1024, 1} },
15944 .block_erase = spi_block_erase_60,
15945 }, {
15946 .eraseblocks = { {512 * 1024, 1} },
15947 .block_erase = spi_block_erase_c7,
15948 }
15949 },
15950 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15951 .unlock = spi_disable_blockprotect,
15952 .write = spi_chip_write_256,
15953 .read = spi_chip_read,
15954 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15955 },
15956
15957 {
15958 .vendor = "Winbond",
David Hendricksc699f5c2018-03-11 17:29:49 -070015959 .name = "W25Q80BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015960 .bustype = BUS_SPI,
15961 .manufacture_id = WINBOND_NEX_ID,
David Hendricksc699f5c2018-03-11 17:29:49 -070015962 .model_id = WINBOND_NEX_W25Q80BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015963 .total_size = 1024,
15964 .page_size = 256,
15965 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15966 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015967 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015968 .probe = probe_spi_rdid,
15969 .probe_timing = TIMING_ZERO,
15970 .block_erasers =
15971 {
15972 {
15973 .eraseblocks = { {4 * 1024, 256} },
15974 .block_erase = spi_block_erase_20,
15975 }, {
15976 .eraseblocks = { {32 * 1024, 32} },
15977 .block_erase = spi_block_erase_52,
15978 }, {
15979 .eraseblocks = { {64 * 1024, 16} },
15980 .block_erase = spi_block_erase_d8,
15981 }, {
15982 .eraseblocks = { {1 * 1024 * 1024, 1} },
15983 .block_erase = spi_block_erase_60,
15984 }, {
15985 .eraseblocks = { {1 * 1024 * 1024, 1} },
15986 .block_erase = spi_block_erase_c7,
15987 }
15988 },
15989 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15990 .unlock = spi_disable_blockprotect,
15991 .write = spi_chip_write_256,
15992 .read = spi_chip_read,
15993 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15994 },
Nico Huber25683572018-03-30 13:50:13 +020015995
15996 {
15997 .vendor = "Winbond",
15998 .name = "W25Q40EW",
15999 .bustype = BUS_SPI,
16000 .manufacture_id = WINBOND_NEX_ID,
16001 .model_id = WINBOND_NEX_W25Q40EW,
16002 .total_size = 512,
16003 .page_size = 256,
16004 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16005 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16006 .tested = TEST_UNTESTED,
16007 .probe = probe_spi_rdid,
16008 .probe_timing = TIMING_ZERO,
16009 .block_erasers =
16010 {
16011 {
16012 .eraseblocks = { {4 * 1024, 128} },
16013 .block_erase = spi_block_erase_20,
16014 }, {
16015 .eraseblocks = { {32 * 1024, 16} },
16016 .block_erase = spi_block_erase_52,
16017 }, {
16018 .eraseblocks = { {64 * 1024, 8} },
16019 .block_erase = spi_block_erase_d8,
16020 }, {
16021 .eraseblocks = { {512 * 1024, 1} },
16022 .block_erase = spi_block_erase_60,
16023 }, {
16024 .eraseblocks = { {512 * 1024, 1} },
16025 .block_erase = spi_block_erase_c7,
16026 }
16027 },
16028 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16029 .unlock = spi_disable_blockprotect,
16030 .write = spi_chip_write_256,
16031 .read = spi_chip_read,
16032 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
16033 },
16034
Stanislav Sedovf5775442018-03-07 14:16:51 -080016035 {
16036 .vendor = "Winbond",
16037 .name = "W25Q80EW",
16038 .bustype = BUS_SPI,
16039 .manufacture_id = WINBOND_NEX_ID,
16040 .model_id = WINBOND_NEX_W25Q80EW,
16041 .total_size = 1024,
16042 .page_size = 256,
16043 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16045 .tested = TEST_OK_PREW,
16046 .probe = probe_spi_rdid,
16047 .probe_timing = TIMING_ZERO,
16048 .block_erasers =
16049 {
16050 {
16051 .eraseblocks = { {4 * 1024, 256} },
16052 .block_erase = spi_block_erase_20,
16053 }, {
16054 .eraseblocks = { {32 * 1024, 32} },
16055 .block_erase = spi_block_erase_52,
16056 }, {
16057 .eraseblocks = { {64 * 1024, 16} },
16058 .block_erase = spi_block_erase_d8,
16059 }, {
16060 .eraseblocks = { {1 * 1024 * 1024, 1} },
16061 .block_erase = spi_block_erase_60,
16062 }, {
16063 .eraseblocks = { {1 * 1024 * 1024, 1} },
16064 .block_erase = spi_block_erase_c7,
16065 }
16066 },
16067 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16068 .unlock = spi_disable_blockprotect,
16069 .write = spi_chip_write_256,
16070 .read = spi_chip_read,
16071 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
16072 },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016073
16074 {
16075 .vendor = "Winbond",
16076 .name = "W25Q16.W",
16077 .bustype = BUS_SPI,
16078 .manufacture_id = WINBOND_NEX_ID,
16079 .model_id = WINBOND_NEX_W25Q16_W,
16080 .total_size = 2048,
16081 .page_size = 256,
16082 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16083 /* QPI enable 0x38, disable 0xFF */
16084 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16085 .tested = TEST_UNTESTED,
16086 .probe = probe_spi_rdid,
16087 .probe_timing = TIMING_ZERO,
16088 .block_erasers =
16089 {
16090 {
16091 .eraseblocks = { {4 * 1024, 512} },
16092 .block_erase = spi_block_erase_20,
16093 }, {
16094 .eraseblocks = { {32 * 1024, 64} },
16095 .block_erase = spi_block_erase_52,
16096 }, {
16097 .eraseblocks = { {64 * 1024, 32} },
16098 .block_erase = spi_block_erase_d8,
16099 }, {
16100 .eraseblocks = { {2 * 1024 * 1024, 1} },
16101 .block_erase = spi_block_erase_60,
16102 }, {
16103 .eraseblocks = { {2 * 1024 * 1024, 1} },
16104 .block_erase = spi_block_erase_c7,
16105 }
16106 },
16107 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16108 .unlock = spi_disable_blockprotect,
16109 .write = spi_chip_write_256,
16110 .read = spi_chip_read,
16111 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16112 },
16113
16114 {
16115 .vendor = "Winbond",
16116 .name = "W25Q32.W",
16117 .bustype = BUS_SPI,
16118 .manufacture_id = WINBOND_NEX_ID,
16119 .model_id = WINBOND_NEX_W25Q32_W,
16120 .total_size = 4096,
16121 .page_size = 256,
16122 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16123 /* QPI enable 0x38, disable 0xFF */
16124 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16125 .tested = TEST_OK_PREW,
16126 .probe = probe_spi_rdid,
16127 .probe_timing = TIMING_ZERO,
16128 .block_erasers =
16129 {
16130 {
16131 .eraseblocks = { {4 * 1024, 1024} },
16132 .block_erase = spi_block_erase_20,
16133 }, {
16134 .eraseblocks = { {32 * 1024, 128} },
16135 .block_erase = spi_block_erase_52,
16136 }, {
16137 .eraseblocks = { {64 * 1024, 64} },
16138 .block_erase = spi_block_erase_d8,
16139 }, {
16140 .eraseblocks = { {4 * 1024 * 1024, 1} },
16141 .block_erase = spi_block_erase_60,
16142 }, {
16143 .eraseblocks = { {4 * 1024 * 1024, 1} },
16144 .block_erase = spi_block_erase_c7,
16145 }
16146 },
16147 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16148 .unlock = spi_disable_blockprotect,
16149 .write = spi_chip_write_256,
16150 .read = spi_chip_read,
16151 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16152 },
16153
16154 {
16155 .vendor = "Winbond",
16156 .name = "W25Q64.W",
16157 .bustype = BUS_SPI,
16158 .manufacture_id = WINBOND_NEX_ID,
16159 .model_id = WINBOND_NEX_W25Q64_W,
16160 .total_size = 8192,
16161 .page_size = 256,
16162 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16163 /* QPI enable 0x38, disable 0xFF */
16164 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016165 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016166 .probe = probe_spi_rdid,
16167 .probe_timing = TIMING_ZERO,
16168 .block_erasers =
16169 {
16170 {
16171 .eraseblocks = { {4 * 1024, 2048} },
16172 .block_erase = spi_block_erase_20,
16173 }, {
16174 .eraseblocks = { {32 * 1024, 256} },
16175 .block_erase = spi_block_erase_52,
16176 }, {
16177 .eraseblocks = { {64 * 1024, 128} },
16178 .block_erase = spi_block_erase_d8,
16179 }, {
16180 .eraseblocks = { {8 * 1024 * 1024, 1} },
16181 .block_erase = spi_block_erase_60,
16182 }, {
16183 .eraseblocks = { {8 * 1024 * 1024, 1} },
16184 .block_erase = spi_block_erase_c7,
16185 }
16186 },
16187 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16188 .unlock = spi_disable_blockprotect,
16189 .write = spi_chip_write_256,
16190 .read = spi_chip_read,
16191 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000016192 },
16193
16194 {
16195 .vendor = "Winbond",
Nico Huber70eed9f2017-04-24 22:19:27 +020016196 .name = "W25Q128.W",
16197 .bustype = BUS_SPI,
16198 .manufacture_id = WINBOND_NEX_ID,
16199 .model_id = WINBOND_NEX_W25Q128_W,
16200 .total_size = 16384,
16201 .page_size = 256,
16202 /* supports SFDP */
16203 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks48729d32017-12-08 14:44:07 -080016205 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020016206 .probe = probe_spi_rdid,
16207 .probe_timing = TIMING_ZERO,
16208 .block_erasers =
16209 {
16210 {
16211 .eraseblocks = { {4 * 1024, 4096} },
16212 .block_erase = spi_block_erase_20,
16213 }, {
16214 .eraseblocks = { {32 * 1024, 512} },
16215 .block_erase = spi_block_erase_52,
16216 }, {
16217 .eraseblocks = { {64 * 1024, 256} },
16218 .block_erase = spi_block_erase_d8,
16219 }, {
16220 .eraseblocks = { {16 * 1024 * 1024, 1} },
16221 .block_erase = spi_block_erase_60,
16222 }, {
16223 .eraseblocks = { {16 * 1024 * 1024, 1} },
16224 .block_erase = spi_block_erase_c7,
16225 }
16226 },
16227 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16228 .unlock = spi_disable_blockprotect,
16229 .write = spi_chip_write_256,
16230 .read = spi_chip_read,
16231 .voltage = {1650, 1950},
16232 },
16233
16234 {
16235 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016236 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016237 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016238 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016239 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016240 .total_size = 128,
16241 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016242 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000016243 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016244 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016245 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016246 .block_erasers =
16247 {
16248 {
16249 .eraseblocks = { {4 * 1024, 32} },
16250 .block_erase = spi_block_erase_20,
16251 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016252 .eraseblocks = { {64 * 1024, 2} },
16253 .block_erase = spi_block_erase_d8,
16254 }, {
16255 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016256 .block_erase = spi_block_erase_c7,
16257 }
16258 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016259 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016260 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016261 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016262 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016263 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016264 },
16265
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016266 {
16267 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016268 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016269 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016270 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016271 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016272 .total_size = 256,
16273 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016274 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016275 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016276 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016277 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016278 .block_erasers =
16279 {
16280 {
16281 .eraseblocks = { {4 * 1024, 64} },
16282 .block_erase = spi_block_erase_20,
16283 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016284 .eraseblocks = { {64 * 1024, 4} },
16285 .block_erase = spi_block_erase_d8,
16286 }, {
16287 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016288 .block_erase = spi_block_erase_c7,
16289 }
16290 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016291 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016292 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016293 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016294 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016295 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016296 },
16297
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016298 {
16299 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016300 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016301 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016302 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016303 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016304 .total_size = 512,
16305 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016306 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000016307 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016308 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016309 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016310 .block_erasers =
16311 {
16312 {
16313 .eraseblocks = { {4 * 1024, 128} },
16314 .block_erase = spi_block_erase_20,
16315 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016316 .eraseblocks = { {64 * 1024, 8} },
16317 .block_erase = spi_block_erase_d8,
16318 }, {
16319 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016320 .block_erase = spi_block_erase_c7,
16321 }
16322 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016323 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016324 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016325 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016326 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016327 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016328 },
16329
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016330 {
16331 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016332 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016333 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016334 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016335 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016336 .total_size = 1024,
16337 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016338 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000016339 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016340 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016341 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016342 .block_erasers =
16343 {
16344 {
16345 .eraseblocks = { {4 * 1024, 256} },
16346 .block_erase = spi_block_erase_20,
16347 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016348 .eraseblocks = { {64 * 1024, 16} },
16349 .block_erase = spi_block_erase_d8,
16350 }, {
16351 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016352 .block_erase = spi_block_erase_c7,
16353 }
16354 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016355 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016356 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016357 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016358 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016359 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016360 },
16361
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016362 {
16363 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016364 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016365 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000016366 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016367 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000016368 .total_size = 2048,
16369 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016370 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000016371 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000016372 .probe = probe_spi_rdid,
16373 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016374 .block_erasers =
16375 {
16376 {
16377 .eraseblocks = { {4 * 1024, 512} },
16378 .block_erase = spi_block_erase_20,
16379 }, {
16380 .eraseblocks = { {32 * 1024, 64} },
16381 .block_erase = spi_block_erase_52,
16382 }, {
16383 .eraseblocks = { {64 * 1024, 32} },
16384 .block_erase = spi_block_erase_d8,
16385 }, {
16386 .eraseblocks = { {2 * 1024 * 1024, 1} },
16387 .block_erase = spi_block_erase_60,
16388 }, {
16389 .eraseblocks = { {2 * 1024 * 1024, 1} },
16390 .block_erase = spi_block_erase_c7,
16391 }
16392 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016393 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016394 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000016395 .write = spi_chip_write_256,
16396 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016397 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000016398 },
16399
16400 {
16401 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016402 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016403 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000016404 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016405 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000016406 .total_size = 4096,
16407 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016408 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000016409 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000016410 .probe = probe_spi_rdid,
16411 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016412 .block_erasers =
16413 {
16414 {
16415 .eraseblocks = { {4 * 1024, 1024} },
16416 .block_erase = spi_block_erase_20,
16417 }, {
16418 .eraseblocks = { {32 * 1024, 128} },
16419 .block_erase = spi_block_erase_52,
16420 }, {
16421 .eraseblocks = { {64 * 1024, 64} },
16422 .block_erase = spi_block_erase_d8,
16423 }, {
16424 .eraseblocks = { {4 * 1024 * 1024, 1} },
16425 .block_erase = spi_block_erase_60,
16426 }, {
16427 .eraseblocks = { {4 * 1024 * 1024, 1} },
16428 .block_erase = spi_block_erase_c7,
16429 }
16430 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016431 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016432 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000016433 .write = spi_chip_write_256,
16434 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016435 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000016436 },
16437
16438 {
16439 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016440 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016441 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000016442 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016443 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000016444 .total_size = 8192,
16445 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016446 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016447 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000016448 .probe = probe_spi_rdid,
16449 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016450 .block_erasers =
16451 {
16452 {
16453 .eraseblocks = { {4 * 1024, 2048} },
16454 .block_erase = spi_block_erase_20,
16455 }, {
16456 .eraseblocks = { {32 * 1024, 256} },
16457 .block_erase = spi_block_erase_52,
16458 }, {
16459 .eraseblocks = { {64 * 1024, 128} },
16460 .block_erase = spi_block_erase_d8,
16461 }, {
16462 .eraseblocks = { {8 * 1024 * 1024, 1} },
16463 .block_erase = spi_block_erase_60,
16464 }, {
16465 .eraseblocks = { {8 * 1024 * 1024, 1} },
16466 .block_erase = spi_block_erase_c7,
16467 }
16468 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016469 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016470 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000016471 .write = spi_chip_write_256,
16472 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016473 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000016474 },
16475
16476 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016477 .vendor = "Winbond",
16478 .name = "W25P80",
16479 .bustype = BUS_SPI,
16480 .manufacture_id = WINBOND_NEX_ID,
16481 .model_id = WINBOND_NEX_W25P80,
16482 .total_size = 1024,
16483 .page_size = 256,
16484 .feature_bits = FEATURE_WRSR_WREN,
16485 .tested = TEST_UNTESTED,
16486 .probe = probe_spi_rdid,
16487 .probe_timing = TIMING_ZERO,
16488 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016489 {
16490 {
16491 .eraseblocks = { {64 * 1024, 16} },
16492 .block_erase = spi_block_erase_d8,
16493 }, {
16494 .eraseblocks = { {1024 * 1024, 1} },
16495 .block_erase = spi_block_erase_c7,
16496 }
16497 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016498 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16499 .unlock = spi_disable_blockprotect,
16500 .write = spi_chip_write_256,
16501 .read = spi_chip_read, /* Fast read (0x0B) supported */
16502 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016503 },
16504
16505 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016506 .vendor = "Winbond",
16507 .name = "W25P16",
16508 .bustype = BUS_SPI,
16509 .manufacture_id = WINBOND_NEX_ID,
16510 .model_id = WINBOND_NEX_W25P16,
16511 .total_size = 2048,
16512 .page_size = 256,
16513 .feature_bits = FEATURE_WRSR_WREN,
16514 .tested = TEST_UNTESTED,
16515 .probe = probe_spi_rdid,
16516 .probe_timing = TIMING_ZERO,
16517 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016518 {
16519 {
16520 .eraseblocks = { {64 * 1024, 32} },
16521 .block_erase = spi_block_erase_d8,
16522 }, {
16523 .eraseblocks = { {2048 * 1024, 1} },
16524 .block_erase = spi_block_erase_c7,
16525 }
16526 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016527 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16528 .unlock = spi_disable_blockprotect,
16529 .write = spi_chip_write_256,
16530 .read = spi_chip_read, /* Fast read (0x0B) supported */
16531 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016532 },
16533
16534 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016535 .vendor = "Winbond",
16536 .name = "W25P32",
16537 .bustype = BUS_SPI,
16538 .manufacture_id = WINBOND_NEX_ID,
16539 .model_id = WINBOND_NEX_W25P32,
16540 .total_size = 4096,
16541 .page_size = 256,
16542 .feature_bits = FEATURE_WRSR_WREN,
16543 .tested = TEST_UNTESTED,
16544 .probe = probe_spi_rdid,
16545 .probe_timing = TIMING_ZERO,
16546 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016547 {
16548 {
16549 .eraseblocks = { {64 * 1024, 64} },
16550 .block_erase = spi_block_erase_d8,
16551 }, {
16552 .eraseblocks = { {4096 * 1024, 1} },
16553 .block_erase = spi_block_erase_c7,
16554 }
16555 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016556 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16557 .unlock = spi_disable_blockprotect,
16558 .write = spi_chip_write_256,
16559 .read = spi_chip_read, /* Fast read (0x0B) supported */
16560 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016561 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016562
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016563 {
Zheng Bao1db2b752009-11-26 11:05:01 +000016564 .vendor = "Winbond",
Urja Rannikko2a1aaba2015-06-20 11:53:10 +000016565 .name = "W29C512A/W29EE512",
16566 .bustype = BUS_PARALLEL,
16567 .manufacture_id = WINBOND_ID,
16568 .model_id = WINBOND_W29C512A,
16569 .total_size = 64,
16570 .page_size = 128,
16571 .feature_bits = FEATURE_LONG_RESET,
16572 .tested = TEST_OK_PREW,
16573 .probe = probe_jedec,
16574 .probe_timing = 10,
16575 .block_erasers =
16576 {
16577 {
16578 .eraseblocks = { {64 * 1024, 1} },
16579 .block_erase = erase_chip_block_jedec,
16580 }
16581 },
16582 .write = write_jedec,
16583 .read = read_memmapped,
16584 .voltage = {4500, 5500},
16585 },
16586
16587 {
16588 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016589 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016590 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016591 .manufacture_id = WINBOND_ID,
16592 .model_id = WINBOND_W29C010,
16593 .total_size = 128,
16594 .page_size = 128,
16595 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000016596 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016597 .probe = probe_w29ee011,
16598 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
16599 .block_erasers =
16600 {
16601 {
16602 .eraseblocks = { {128 * 1024, 1} },
16603 .block_erase = erase_chip_block_jedec,
16604 }
16605 },
16606 .write = write_jedec,
16607 .read = read_memmapped,
16608 },
16609
16610 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
16611 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016612 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016613 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016614 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016615 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016616 .total_size = 128,
16617 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016618 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000016619 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016620 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016621 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016622 .block_erasers =
16623 {
16624 {
16625 .eraseblocks = { {128 * 1024, 1} },
16626 .block_erase = erase_chip_block_jedec,
16627 }
16628 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016629 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016630 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000016631 },
16632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016633 {
16634 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016635 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016636 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016637 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016638 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016639 .total_size = 256,
16640 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016641 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016642 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016643 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016644 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016645 .block_erasers =
16646 {
16647 {
16648 .eraseblocks = { {256 * 1024, 1} },
16649 .block_erase = erase_chip_block_jedec,
16650 }
16651 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016652 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016653 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016654 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016655 },
16656
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016657 {
16658 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016659 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016660 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016661 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016662 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016663 .total_size = 512,
16664 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000016665 .feature_bits = FEATURE_LONG_RESET,
16666 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016667 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016668 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016669 .block_erasers =
16670 {
16671 {
16672 .eraseblocks = { {512 * 1024, 1} },
16673 .block_erase = erase_chip_block_jedec,
16674 }
16675 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016676 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016677 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016678 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016679 },
16680
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016681 {
16682 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000016683 .name = "W29GL032CB",
16684 .bustype = BUS_PARALLEL,
16685 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16686 .model_id = WINBOND_W29GL032CB,
16687 .total_size = 4096,
16688 .page_size = 128 * 1024, /* actual page size is 16 */
16689 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16690 .tested = TEST_UNTESTED,
16691 .probe = probe_jedec_29gl,
16692 .probe_timing = TIMING_ZERO,
16693 .block_erasers =
16694 {
16695 {
16696 .eraseblocks = {
16697 {8 * 1024, 8},
16698 {64 * 1024, 63},
16699 },
16700 .block_erase = erase_sector_jedec,
16701 }, {
16702 .eraseblocks = { {4 * 1024 * 1024, 1} },
16703 .block_erase = erase_chip_block_jedec,
16704 },
16705 },
16706 .write = write_jedec_1,
16707 .read = read_memmapped,
16708 .voltage = {2700, 3600},
16709 },
16710
16711 {
16712 .vendor = "Winbond",
16713 .name = "W29GL032CT",
16714 .bustype = BUS_PARALLEL,
16715 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16716 .model_id = WINBOND_W29GL032CT,
16717 .total_size = 4096,
16718 .page_size = 128 * 1024, /* actual page size is 16 */
16719 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16720 .tested = TEST_UNTESTED,
16721 .probe = probe_jedec_29gl,
16722 .probe_timing = TIMING_ZERO,
16723 .block_erasers =
16724 {
16725 {
16726 .eraseblocks = {
16727 {64 * 1024, 63},
16728 {8 * 1024, 8},
16729 },
16730 .block_erase = erase_sector_jedec,
16731 }, {
16732 .eraseblocks = { {4 * 1024 * 1024, 1} },
16733 .block_erase = erase_chip_block_jedec,
16734 },
16735 },
16736 .write = write_jedec_1,
16737 .read = read_memmapped,
16738 .voltage = {2700, 3600},
16739 },
16740
16741 {
16742 .vendor = "Winbond",
16743 .name = "W29GL032CH/L",
16744 .bustype = BUS_PARALLEL,
16745 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16746 .model_id = WINBOND_W29GL032CHL,
16747 .total_size = 4096,
16748 .page_size = 128 * 1024, /* actual page size is 16 */
16749 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16750 .tested = TEST_UNTESTED,
16751 .probe = probe_jedec_29gl,
16752 .probe_timing = TIMING_ZERO,
16753 .block_erasers =
16754 {
16755 {
16756 .eraseblocks = { {64 * 1024, 64} },
16757 .block_erase = erase_sector_jedec,
16758 }, {
16759 .eraseblocks = { {4 * 1024 * 1024, 1} },
16760 .block_erase = erase_chip_block_jedec,
16761 },
16762 },
16763 .write = write_jedec_1,
16764 .read = read_memmapped,
16765 .voltage = {2700, 3600},
16766 },
16767
16768 {
16769 .vendor = "Winbond",
16770 .name = "W29GL064CB",
16771 .bustype = BUS_PARALLEL,
16772 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16773 .model_id = WINBOND_W29GL064CB,
16774 .total_size = 8192,
16775 .page_size = 128 * 1024, /* actual page size is 16 */
16776 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16777 .tested = TEST_UNTESTED,
16778 .probe = probe_jedec_29gl,
16779 .probe_timing = TIMING_ZERO,
16780 .block_erasers =
16781 {
16782 {
16783 .eraseblocks = {
16784 {8 * 1024, 8},
16785 {64 * 1024, 127},
16786 },
16787 .block_erase = erase_sector_jedec,
16788 }, {
16789 .eraseblocks = { {8 * 1024 * 1024, 1} },
16790 .block_erase = erase_chip_block_jedec,
16791 },
16792 },
16793 .write = write_jedec_1,
16794 .read = read_memmapped,
16795 .voltage = {2700, 3600},
16796 },
16797
16798 {
16799 .vendor = "Winbond",
16800 .name = "W29GL064CT",
16801 .bustype = BUS_PARALLEL,
16802 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16803 .model_id = WINBOND_W29GL064CT,
16804 .total_size = 8192,
16805 .page_size = 128 * 1024, /* actual page size is 16 */
16806 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16807 .tested = TEST_UNTESTED,
16808 .probe = probe_jedec_29gl,
16809 .probe_timing = TIMING_ZERO,
16810 .block_erasers =
16811 {
16812 {
16813 .eraseblocks = {
16814 {64 * 1024, 127},
16815 {8 * 1024, 8},
16816 },
16817 .block_erase = erase_sector_jedec,
16818 }, {
16819 .eraseblocks = { {8 * 1024 * 1024, 1} },
16820 .block_erase = erase_chip_block_jedec,
16821 },
16822 },
16823 .write = write_jedec_1,
16824 .read = read_memmapped,
16825 .voltage = {2700, 3600},
16826 },
16827
16828 {
16829 .vendor = "Winbond",
16830 .name = "W29GL064CH/L",
16831 .bustype = BUS_PARALLEL,
16832 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16833 .model_id = WINBOND_W29GL064CHL,
16834 .total_size = 8192,
16835 .page_size = 128 * 1024, /* actual page size is 16 */
16836 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16837 .tested = TEST_UNTESTED,
16838 .probe = probe_jedec_29gl,
16839 .probe_timing = TIMING_ZERO,
16840 .block_erasers =
16841 {
16842 {
16843 .eraseblocks = { {64 * 1024, 128} },
16844 .block_erase = erase_sector_jedec,
16845 }, {
16846 .eraseblocks = { {8 * 1024 * 1024, 1} },
16847 .block_erase = erase_chip_block_jedec,
16848 },
16849 },
16850 .write = write_jedec_1,
16851 .read = read_memmapped,
16852 .voltage = {2700, 3600},
16853 },
16854
16855 {
16856 .vendor = "Winbond",
16857 .name = "W29GL128C",
16858 .bustype = BUS_PARALLEL,
16859 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16860 .model_id = WINBOND_W29GL128CHL,
16861 .total_size = 16384,
16862 .page_size = 128 * 1024, /* actual page size is 16 */
16863 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16864 .tested = TEST_UNTESTED,
16865 .probe = probe_jedec_29gl,
16866 .probe_timing = TIMING_ZERO,
16867 .block_erasers =
16868 {
16869 {
16870 .eraseblocks = { {128 * 1024, 128} },
16871 .block_erase = erase_sector_jedec,
16872 }, {
16873 .eraseblocks = { {16 * 1024 * 1024, 1} },
16874 .block_erase = erase_chip_block_jedec,
16875 },
16876 },
16877 .write = write_jedec_1,
16878 .read = read_memmapped,
16879 .voltage = {2700, 3600},
16880 },
16881
16882 {
16883 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000016884 .name = "W39F010",
16885 .bustype = BUS_PARALLEL,
16886 .manufacture_id = WINBOND_ID,
16887 .model_id = WINBOND_W39F010,
16888 .total_size = 128,
16889 .page_size = 4 * 1024,
16890 .feature_bits = FEATURE_EITHER_RESET,
16891 .tested = TEST_OK_PREW,
16892 .probe = probe_jedec,
16893 .probe_timing = 10,
16894 .block_erasers =
16895 {
16896 {
16897 .eraseblocks = { {4 * 1024, 32} },
16898 .block_erase = erase_block_jedec,
16899 }, {
16900 .eraseblocks = { {128 * 1024, 1} },
16901 .block_erase = erase_chip_block_jedec,
16902 }
16903 },
16904 .printlock = printlock_w39f010,
16905 .write = write_jedec_1,
16906 .read = read_memmapped,
16907 .voltage = {4500, 5500},
16908 },
16909
16910 {
16911 .vendor = "Winbond",
16912 .name = "W39L010",
16913 .bustype = BUS_PARALLEL,
16914 .manufacture_id = WINBOND_ID,
16915 .model_id = WINBOND_W39L010,
16916 .total_size = 128,
16917 .page_size = 4 * 1024,
16918 .feature_bits = FEATURE_EITHER_RESET,
16919 .tested = TEST_UNTESTED,
16920 .probe = probe_jedec,
16921 .probe_timing = 10,
16922 .block_erasers =
16923 {
16924 {
16925 .eraseblocks = { {4 * 1024, 32} },
16926 .block_erase = erase_block_jedec,
16927 }, {
16928 .eraseblocks = { {128 * 1024, 1} },
16929 .block_erase = erase_chip_block_jedec,
16930 }
16931 },
16932 .printlock = printlock_w39l010,
16933 .write = write_jedec_1,
16934 .read = read_memmapped,
16935 .voltage = {3000, 3600},
16936 },
16937
16938 {
16939 .vendor = "Winbond",
16940 .name = "W39L020",
16941 .bustype = BUS_PARALLEL,
16942 .manufacture_id = WINBOND_ID,
16943 .model_id = WINBOND_W39L020,
16944 .total_size = 256,
16945 .page_size = 4 * 1024,
16946 .feature_bits = FEATURE_EITHER_RESET,
16947 .tested = TEST_UNTESTED,
16948 .probe = probe_jedec,
16949 .probe_timing = 10,
16950 .block_erasers =
16951 {
16952 {
16953 .eraseblocks = { {4 * 1024, 64} },
16954 .block_erase = erase_block_jedec,
16955 }, {
16956 .eraseblocks = { {64 * 1024, 4} },
16957 .block_erase = erase_sector_jedec,
16958 }, {
16959 .eraseblocks = { {256 * 1024, 1} },
16960 .block_erase = erase_chip_block_jedec,
16961 }
16962 },
16963 .printlock = printlock_w39l020,
16964 .write = write_jedec_1,
16965 .read = read_memmapped,
16966 .voltage = {3000, 3600},
16967 },
16968
16969 {
16970 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000016971 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016972 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000016973 .manufacture_id = WINBOND_ID,
16974 .model_id = WINBOND_W39L040,
16975 .total_size = 512,
16976 .page_size = 64 * 1024,
16977 .feature_bits = FEATURE_EITHER_RESET,
16978 .tested = TEST_OK_PR,
16979 .probe = probe_jedec,
16980 .probe_timing = 10,
16981 .block_erasers =
16982 {
16983 {
16984 .eraseblocks = { {4 * 1024, 128} },
16985 .block_erase = erase_block_jedec,
16986 }, {
16987 .eraseblocks = { {64 * 1024, 8} },
16988 .block_erase = erase_sector_jedec,
16989 }, {
16990 .eraseblocks = { {512 * 1024, 1} },
16991 .block_erase = erase_chip_block_jedec,
16992 }
16993 },
16994 .printlock = printlock_w39l040,
16995 .write = write_jedec_1,
16996 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016997 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000016998 },
16999
17000 {
17001 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017002 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017003 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017004 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017005 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017006 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017007 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017008 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000017009 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017010 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000017011 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017012 .block_erasers =
17013 {
17014 {
17015 .eraseblocks = { {64 * 1024, 8} },
17016 .block_erase = erase_sector_jedec,
17017 }, {
17018 .eraseblocks = { {512 * 1024, 1} },
17019 .block_erase = erase_chip_block_jedec,
17020 }
17021 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017022 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000017023 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017024 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017025 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017026 },
17027
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017028 {
17029 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017030 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017031 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017032 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017033 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017034 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017035 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017036 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017037 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017038 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000017039 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017040 .block_erasers =
17041 {
17042 {
17043 .eraseblocks = { {64 * 1024, 8} },
17044 .block_erase = erase_sector_jedec,
17045 }, {
17046 .eraseblocks = { {512 * 1024, 1} },
17047 .block_erase = erase_chip_block_jedec,
17048 }
17049 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017050 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000017051 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017052 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017053 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017054 },
17055
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017056 {
17057 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017058 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017059 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017060 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017061 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017062 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017063 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017064 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017065 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000017066 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017067 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017068 .block_erasers =
17069 {
17070 {
17071 .eraseblocks = { {64 * 1024, 8} },
17072 .block_erase = erase_sector_jedec,
17073 }, {
17074 .eraseblocks = { {512 * 1024, 1} },
17075 .block_erase = erase_chip_block_jedec,
17076 }
17077 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000017078 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000017079 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017080 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017081 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017082 },
17083
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017084 {
17085 .vendor = "Winbond",
17086 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017087 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017088 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017089 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017090 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017091 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000017092 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000017093 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017094 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017095 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017096 .block_erasers =
17097 {
17098 {
17099 .eraseblocks = { {4 * 1024, 128} },
17100 .block_erase = erase_block_jedec,
17101 }, {
17102 .eraseblocks = { {64 * 1024, 8} },
17103 .block_erase = erase_sector_jedec,
17104 }, {
17105 .eraseblocks = { {512 * 1024, 1} },
17106 .block_erase = erase_chip_block_jedec,
17107 }
17108 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017109 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017110 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000017111 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017112 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017113 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017114 },
17115
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017116 {
17117 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017118 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017119 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017120 .manufacture_id = WINBOND_ID,
17121 .model_id = WINBOND_W39V040B,
17122 .total_size = 512,
17123 .page_size = 64 * 1024,
17124 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000017125 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017126 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000017127 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017128 .block_erasers =
17129 {
17130 {
17131 .eraseblocks = { {64 * 1024, 8} },
17132 .block_erase = erase_sector_jedec,
17133 }, {
17134 .eraseblocks = { {512 * 1024, 1} },
17135 .block_erase = erase_chip_block_jedec,
17136 }
17137 },
17138 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017139 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017140 .write = write_jedec_1,
17141 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017142 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017143 },
17144
17145 {
17146 .vendor = "Winbond",
17147 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017148 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017149 .manufacture_id = WINBOND_ID,
17150 .model_id = WINBOND_W39V040C,
17151 .total_size = 512,
17152 .page_size = 64 * 1024,
17153 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000017154 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017155 .probe = probe_jedec,
17156 .probe_timing = 10,
17157 .block_erasers =
17158 {
17159 {
17160 .eraseblocks = { {64 * 1024, 8} },
17161 .block_erase = erase_sector_jedec,
17162 }, {
17163 .eraseblocks = { {512 * 1024, 1} },
17164 .block_erase = erase_chip_block_jedec,
17165 }
17166 },
17167 .printlock = printlock_w39v040fc,
17168 .write = write_jedec_1,
17169 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017170 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017171 },
17172
17173 {
17174 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017175 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017176 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017177 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017178 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017179 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000017180 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017181 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000017182 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017183 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000017184 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017185 .block_erasers =
17186 {
17187 {
17188 .eraseblocks = { {64 * 1024, 16} },
17189 .block_erase = erase_sector_jedec,
17190 }, {
17191 .eraseblocks = { {1024 * 1024, 1} },
17192 .block_erase = erase_chip_block_jedec,
17193 }
17194 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017195 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000017196 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017197 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017198 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017199 },
17200
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017201 {
17202 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000017203 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017204 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017205 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017206 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017207 .total_size = 256,
17208 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017209 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000017210 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017211 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017212 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017213 .block_erasers =
17214 {
17215 {
17216 .eraseblocks = {
17217 {128 * 1024, 1},
17218 {96 * 1024, 1},
17219 {8 * 1024, 2},
17220 {16 * 1024, 1},
17221 },
17222 .block_erase = erase_sector_jedec,
17223 }, {
17224 .eraseblocks = { {256 * 1024, 1} },
17225 .block_erase = erase_chip_block_jedec,
17226 }
17227 },
Sean Nelson35727f72010-01-28 23:55:12 +000017228 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017229 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017230 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000017231 },
17232
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017233 {
17234 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017235 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017236 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017237 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017238 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017239 .total_size = 256,
17240 .page_size = 128,
17241 .feature_bits = FEATURE_EITHER_RESET,
17242 .tested = TEST_OK_PROBE,
17243 .probe = probe_jedec,
17244 .probe_timing = 10,
17245 .block_erasers =
17246 {
17247 {
17248 .eraseblocks = { {256 * 1024, 1} },
17249 .block_erase = erase_chip_block_jedec,
17250 }
17251 },
17252 .write = write_jedec_1,
17253 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017254 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017255 },
17256
17257 {
17258 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017259 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017260 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017261 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017262 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017263 .total_size = 256,
17264 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017265 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000017266 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017267 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000017268 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017269 .block_erasers =
17270 {
17271 {
17272 .eraseblocks = {
17273 {64 * 1024, 3},
17274 {32 * 1024, 1},
17275 {8 * 1024, 2},
17276 {16 * 1024, 1},
17277 },
17278 .block_erase = erase_sector_jedec,
17279 }, {
17280 .eraseblocks = { {256 * 1024, 1} },
17281 .block_erase = erase_chip_block_jedec,
17282 }
17283 },
Sean Nelson35727f72010-01-28 23:55:12 +000017284 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017285 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017286 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017287 },
17288
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017289 {
17290 .vendor = "Winbond",
17291 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017292 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017293 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017294 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017295 .total_size = 256,
17296 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017297 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000017298 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017299 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017300 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017301 .block_erasers =
17302 {
17303 {
17304 .eraseblocks = {
17305 {64 * 1024, 3},
17306 {32 * 1024, 1},
17307 {8 * 1024, 2},
17308 {16 * 1024, 1},
17309 },
17310 .block_erase = erase_sector_jedec,
17311 }, {
17312 .eraseblocks = { {256 * 1024, 1} },
17313 .block_erase = erase_chip_block_jedec,
17314 }
17315 },
Sean Nelson35727f72010-01-28 23:55:12 +000017316 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017317 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017318 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017319 },
17320
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017321 {
17322 .vendor = "Winbond",
17323 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017324 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017325 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017326 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017327 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000017328 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017329 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000017330 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000017331 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017332 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017333 .block_erasers =
17334 {
17335 {
Stefan Tauner6697f712014-08-06 15:09:15 +000017336 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017337 .block_erase = erase_sector_jedec,
17338 }, {
17339 .eraseblocks = { {1024 * 1024, 1} },
17340 .block_erase = erase_chip_block_jedec,
17341 }
17342 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017343 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017344 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000017345 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017346 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017347 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000017348 },
17349
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017350 {
17351 .vendor = "Winbond",
17352 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017353 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017354 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017355 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017356 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017357 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017358 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017359 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000017360 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017361 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017362 .block_erasers =
17363 {
17364 {
Stefan Tauner6697f712014-08-06 15:09:15 +000017365 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017366 .block_erase = erase_sector_jedec,
17367 }, {
17368 .eraseblocks = { {512 * 1024, 1} },
17369 .block_erase = erase_chip_block_jedec,
17370 }
17371 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017372 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000017373 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017374 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017375 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000017376 },
nybashcbb46e22018-02-11 17:53:49 -080017377
17378 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100017379 .vendor = "Zetta Device",
17380 .name = "ZD25D20",
17381 .bustype = BUS_SPI,
17382 .manufacture_id = ZETTADEVICE_ID,
17383 .model_id = ZETTADEVICE_ZD25D20,
17384 .total_size = 256,
17385 .page_size = 256,
17386 .feature_bits = FEATURE_WRSR_WREN,
17387 .tested = TEST_UNTESTED,
17388 .probe = probe_spi_rdid,
17389 .probe_timing = TIMING_ZERO,
17390 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080017391 {
17392 {
17393 .eraseblocks = { {4 * 1024, 64} },
17394 .block_erase = spi_block_erase_20,
17395 }, {
17396 .eraseblocks = { {32 * 1024, 8} },
17397 .block_erase = spi_block_erase_52,
17398 }, {
17399 .eraseblocks = { {64 * 1024, 4} },
17400 .block_erase = spi_block_erase_d8,
17401 }, {
17402 .eraseblocks = { {256 * 1024, 1} },
17403 .block_erase = spi_block_erase_60,
17404 }, {
17405 .eraseblocks = { {256 * 1024, 1} },
17406 .block_erase = spi_block_erase_c7,
17407 }
17408 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100017409 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17410 .unlock = spi_disable_blockprotect,
17411 .write = spi_chip_write_256,
17412 .read = spi_chip_read,
17413 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080017414 },
17415
17416 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100017417 .vendor = "Zetta Device",
17418 .name = "ZD25D40",
17419 .bustype = BUS_SPI,
17420 .manufacture_id = ZETTADEVICE_ID,
17421 .model_id = ZETTADEVICE_ZD25D40,
17422 .total_size = 512,
17423 .page_size = 256,
17424 .feature_bits = FEATURE_WRSR_WREN,
17425 .tested = TEST_UNTESTED,
17426 .probe = probe_spi_rdid,
17427 .probe_timing = TIMING_ZERO,
17428 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080017429 {
17430 {
17431 .eraseblocks = { {4 * 1024, 128} },
17432 .block_erase = spi_block_erase_20,
17433 }, {
17434 .eraseblocks = { {32 * 1024, 16} },
17435 .block_erase = spi_block_erase_52,
17436 }, {
17437 .eraseblocks = { {64 * 1024, 8} },
17438 .block_erase = spi_block_erase_d8,
17439 }, {
17440 .eraseblocks = { {512 * 1024, 1} },
17441 .block_erase = spi_block_erase_60,
17442 }, {
17443 .eraseblocks = { {512 * 1024, 1} },
17444 .block_erase = spi_block_erase_c7,
17445 }
17446 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100017447 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17448 .unlock = spi_disable_blockprotect,
17449 .write = spi_chip_write_256,
17450 .read = spi_chip_read,
17451 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080017452 },
17453
Stefan Taunerac1b4c82012-02-17 14:51:04 +000017454 {
17455 .vendor = "Unknown",
17456 .name = "SFDP-capable chip",
17457 .bustype = BUS_SPI,
17458 .manufacture_id = GENERIC_MANUF_ID,
17459 .model_id = SFDP_DEVICE_ID,
17460 /* We present our own "report this" text hence we do not
17461 * want the default "This flash part has status UNTESTED..."
17462 * text to be printed. */
17463 .tested = TEST_OK_PREW,
17464 .probe = probe_spi_sfdp,
17465 .unlock = spi_disable_blockprotect, /* is this safe? */
17466 .read = spi_chip_read,
17467 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000017468 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000017469 /* Everything below will be set by the probing function. */
17470 .write = NULL,
17471 .total_size = 0,
17472 .page_size = 0,
17473 .feature_bits = 0,
17474 .block_erasers = {},
17475 },
FENG yu ningff692fb2008-12-08 18:15:10 +000017476
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017477 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000017478 .vendor = "Programmer",
17479 .name = "Opaque flash chip",
17480 .bustype = BUS_PROG,
17481 .manufacture_id = PROGMANUF_ID,
17482 .model_id = PROGDEV_ID,
17483 .total_size = 0,
17484 .page_size = 256,
17485 /* probe is assumed to work, rest will be filled in by probe */
17486 .tested = TEST_OK_PROBE,
17487 .probe = probe_opaque,
17488 /* eraseblock sizes will be set by the probing function */
17489 .block_erasers =
17490 {
17491 {
17492 .block_erase = erase_opaque,
17493 }
17494 },
17495 .write = write_opaque,
17496 .read = read_opaque,
17497 },
17498
17499 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000017500 .vendor = "AMIC",
17501 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017502 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000017503 .manufacture_id = AMIC_ID,
17504 .model_id = GENERIC_DEVICE_ID,
17505 .total_size = 0,
17506 .page_size = 256,
17507 .tested = TEST_BAD_PREW,
17508 .probe = probe_spi_rdid4,
17509 .probe_timing = TIMING_ZERO,
17510 .write = NULL,
17511 .read = NULL,
17512 },
17513
17514 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017515 .vendor = "Atmel",
17516 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017517 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017518 .manufacture_id = ATMEL_ID,
17519 .model_id = GENERIC_DEVICE_ID,
17520 .total_size = 0,
17521 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017522 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017523 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017524 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017525 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017526 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017527 },
17528
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017529 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000017530 .vendor = "Eon",
17531 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017532 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017533 .manufacture_id = EON_ID_NOPREFIX,
17534 .model_id = GENERIC_DEVICE_ID,
17535 .total_size = 0,
17536 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017537 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017538 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017539 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017540 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017541 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017542 },
17543
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017544 {
17545 .vendor = "Macronix",
17546 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017547 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000017548 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017549 .model_id = GENERIC_DEVICE_ID,
17550 .total_size = 0,
17551 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017552 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017553 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017554 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017555 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017556 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017557 },
17558
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017559 {
17560 .vendor = "PMC",
17561 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017562 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017563 .manufacture_id = PMC_ID,
17564 .model_id = GENERIC_DEVICE_ID,
17565 .total_size = 0,
17566 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017567 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017568 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017569 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017570 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017571 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017572 },
17573
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017574 {
17575 .vendor = "SST",
17576 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017577 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017578 .manufacture_id = SST_ID,
17579 .model_id = GENERIC_DEVICE_ID,
17580 .total_size = 0,
17581 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017582 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017583 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017584 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017585 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017586 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017587 },
17588
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017589 {
17590 .vendor = "ST",
17591 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017592 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017593 .manufacture_id = ST_ID,
17594 .model_id = GENERIC_DEVICE_ID,
17595 .total_size = 0,
17596 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017597 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017598 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017599 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017600 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017601 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017602 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000017603
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017604 {
Sean Nelson118e1d62009-11-24 02:08:11 +000017605 .vendor = "Sanyo",
17606 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017607 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000017608 .manufacture_id = SANYO_ID,
17609 .model_id = GENERIC_DEVICE_ID,
17610 .total_size = 0,
17611 .page_size = 256,
17612 .tested = TEST_BAD_PREW,
17613 .probe = probe_spi_rdid,
17614 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000017615 .write = NULL,
17616 .read = NULL,
17617 },
17618
17619 {
Stefan Taunereb582572012-09-21 12:52:50 +000017620 .vendor = "Winbond",
17621 .name = "unknown Winbond (ex Nexcom) SPI chip",
17622 .bustype = BUS_SPI,
17623 .manufacture_id = WINBOND_NEX_ID,
17624 .model_id = GENERIC_DEVICE_ID,
17625 .total_size = 0,
17626 .page_size = 256,
17627 .tested = TEST_BAD_PREW,
17628 .probe = probe_spi_rdid,
17629 .probe_timing = TIMING_ZERO,
17630 .write = NULL,
17631 .read = NULL,
17632 },
17633
17634 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017635 .vendor = "Generic",
17636 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017637 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017638 .manufacture_id = GENERIC_MANUF_ID,
17639 .model_id = GENERIC_DEVICE_ID,
17640 .total_size = 0,
17641 .page_size = 256,
17642 .tested = TEST_BAD_PREW,
17643 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017644 .write = NULL,
17645 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000017646
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017647 {
17648 .vendor = "Generic",
17649 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017650 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017651 .manufacture_id = GENERIC_MANUF_ID,
17652 .model_id = GENERIC_DEVICE_ID,
17653 .total_size = 0,
17654 .page_size = 256,
17655 .tested = TEST_BAD_PREW,
17656 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017657 .write = NULL,
17658 },
17659
Stefan Tauner96658be2014-05-26 22:05:31 +000017660 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000017661};
Stefan Tauner96658be2014-05-26 22:05:31 +000017662
17663const unsigned int flashchips_size = ARRAY_SIZE(flashchips);