blob: f3aab52154f0c01dc91de8f82461ab47d5fedbbd [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,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000528 .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,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000560 .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
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001712 {
1713 .vendor = "Atmel",
1714 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001715 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001716 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001717 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001718 .total_size = 4096,
1719 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001720 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001721 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001722 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001723 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001724 .block_erasers =
1725 {
1726 {
1727 .eraseblocks = { {4 * 1024, 1024} },
1728 .block_erase = spi_block_erase_20,
1729 }, {
1730 .eraseblocks = { {32 * 1024, 128} },
1731 .block_erase = spi_block_erase_52,
1732 }, {
1733 .eraseblocks = { {64 * 1024, 64} },
1734 .block_erase = spi_block_erase_d8,
1735 }, {
1736 .eraseblocks = { {4 * 1024 * 1024, 1} },
1737 .block_erase = spi_block_erase_60,
1738 }, {
1739 .eraseblocks = { {4 * 1024 * 1024, 1} },
1740 .block_erase = spi_block_erase_c7,
1741 }
1742 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001743 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001744 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001745 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001746 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001747 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001748 },
1749
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001750 {
1751 .vendor = "Atmel",
1752 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001753 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001754 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001755 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001756 .total_size = 4096,
1757 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001758 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001760 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001761 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001762 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001763 .block_erasers =
1764 {
1765 {
1766 .eraseblocks = { {4 * 1024, 1024} },
1767 .block_erase = spi_block_erase_20,
1768 }, {
1769 .eraseblocks = { {32 * 1024, 128} },
1770 .block_erase = spi_block_erase_52,
1771 }, {
1772 .eraseblocks = { {64 * 1024, 64} },
1773 .block_erase = spi_block_erase_d8,
1774 }, {
1775 .eraseblocks = { {4 * 1024 * 1024, 1} },
1776 .block_erase = spi_block_erase_60,
1777 }, {
1778 .eraseblocks = { {4 * 1024 * 1024, 1} },
1779 .block_erase = spi_block_erase_c7,
1780 }
1781 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001782 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001783 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001784 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001785 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001786 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001787 },
1788
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001789 {
1790 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001791 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001792 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001793 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001794 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001795 .total_size = 8192,
1796 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001797 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001798 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001799 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001800 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001801 .block_erasers =
1802 {
1803 {
1804 .eraseblocks = { {4 * 1024, 2048} },
1805 .block_erase = spi_block_erase_20,
1806 }, {
1807 .eraseblocks = { {32 * 1024, 256} },
1808 .block_erase = spi_block_erase_52,
1809 }, {
1810 .eraseblocks = { {64 * 1024, 128} },
1811 .block_erase = spi_block_erase_d8,
1812 }, {
1813 .eraseblocks = { {8 * 1024 * 1024, 1} },
1814 .block_erase = spi_block_erase_60,
1815 }, {
1816 .eraseblocks = { {8 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_c7,
1818 }
1819 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001820 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001821 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001822 .write = spi_chip_write_256,
1823 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001824 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001825 },
1826
1827 {
1828 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001829 .name = "AT25DL081",
1830 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001831 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001832 .model_id = ATMEL_AT25DF081,
1833 .total_size = 1024,
1834 .page_size = 256,
1835 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1836 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1837 .tested = TEST_UNTESTED,
1838 .probe = probe_spi_rdid,
1839 .probe_timing = TIMING_ZERO,
1840 .block_erasers =
1841 {
1842 {
1843 .eraseblocks = { {4 * 1024, 256} },
1844 .block_erase = spi_block_erase_20,
1845 }, {
1846 .eraseblocks = { {32 * 1024, 32} },
1847 .block_erase = spi_block_erase_52,
1848 }, {
1849 .eraseblocks = { {64 * 1024, 16} },
1850 .block_erase = spi_block_erase_d8,
1851 }, {
1852 .eraseblocks = { {1 * 1024 * 1024, 1} },
1853 .block_erase = spi_block_erase_60,
1854 }, {
1855 .eraseblocks = { {1 * 1024 * 1024, 1} },
1856 .block_erase = spi_block_erase_c7,
1857 }
1858 },
1859 .printlock = spi_prettyprint_status_register_at25df_sec,
1860 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1861 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1862 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1863 .voltage = {1650, 1950},
1864 },
1865
1866 {
1867 .vendor = "Atmel",
1868 .name = "AT25DL161",
1869 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001870 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001871 .model_id = ATMEL_AT25DL161,
1872 .total_size = 2048,
1873 .page_size = 256,
1874 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1875 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1876 .tested = TEST_UNTESTED,
1877 .probe = probe_spi_rdid,
1878 .probe_timing = TIMING_ZERO,
1879 .block_erasers =
1880 {
1881 {
1882 .eraseblocks = { {4 * 1024, 512} },
1883 .block_erase = spi_block_erase_20,
1884 }, {
1885 .eraseblocks = { {32 * 1024, 64} },
1886 .block_erase = spi_block_erase_52,
1887 }, {
1888 .eraseblocks = { {64 * 1024, 32} },
1889 .block_erase = spi_block_erase_d8,
1890 }, {
1891 .eraseblocks = { {2 * 1024 * 1024, 1} },
1892 .block_erase = spi_block_erase_60,
1893 }, {
1894 .eraseblocks = { {2 * 1024 * 1024, 1} },
1895 .block_erase = spi_block_erase_c7,
1896 }
1897 },
1898 .printlock = spi_prettyprint_status_register_at25df_sec,
1899 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1900 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1901 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1902 .voltage = {1650, 1950},
1903 },
1904
1905 {
1906 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001907 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001908 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001909 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001910 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001911 .total_size = 2048,
1912 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001913 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1914 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001915 .tested = TEST_UNTESTED,
1916 .probe = probe_spi_rdid,
1917 .probe_timing = TIMING_ZERO,
1918 .block_erasers =
1919 {
1920 {
1921 .eraseblocks = { {4 * 1024, 512} },
1922 .block_erase = spi_block_erase_20,
1923 }, {
1924 .eraseblocks = { {32 * 1024, 64} },
1925 .block_erase = spi_block_erase_52,
1926 }, {
1927 .eraseblocks = { {64 * 1024, 32} },
1928 .block_erase = spi_block_erase_d8,
1929 }, {
1930 .eraseblocks = { {2 * 1024 * 1024, 1} },
1931 .block_erase = spi_block_erase_60,
1932 }, {
1933 .eraseblocks = { {2 * 1024 * 1024, 1} },
1934 .block_erase = spi_block_erase_c7,
1935 }
1936 },
1937 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001938 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001939 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001940 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001941 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001942 },
1943
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001944 {
1945 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001946 .name = "AT25F512",
1947 .bustype = BUS_SPI,
1948 .manufacture_id = ATMEL_ID,
1949 .model_id = ATMEL_AT25F512,
1950 .total_size = 64,
1951 .page_size = 256,
1952 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001953 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001954 .probe = probe_spi_at25f,
1955 .probe_timing = TIMING_ZERO,
1956 .block_erasers =
1957 {
1958 {
1959 .eraseblocks = { {32 * 1024, 2} },
1960 .block_erase = spi_block_erase_52,
1961 }, {
1962 .eraseblocks = { {64 * 1024, 1} },
1963 .block_erase = spi_block_erase_62,
1964 }
1965 },
1966 .printlock = spi_prettyprint_status_register_at25f,
1967 .unlock = spi_disable_blockprotect_at25f,
1968 .write = spi_chip_write_256,
1969 .read = spi_chip_read,
1970 .voltage = {2700, 3600},
1971 },
1972
1973 {
1974 .vendor = "Atmel",
1975 .name = "AT25F512A",
1976 .bustype = BUS_SPI,
1977 .manufacture_id = ATMEL_ID,
1978 .model_id = ATMEL_AT25F512A,
1979 .total_size = 64,
1980 .page_size = 128,
1981 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001982 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001983 .probe = probe_spi_at25f,
1984 .probe_timing = TIMING_ZERO,
1985 .block_erasers =
1986 {
1987 {
1988 .eraseblocks = { {32 * 1024, 2} },
1989 .block_erase = spi_block_erase_52,
1990 }, {
1991 .eraseblocks = { {64 * 1024, 1} },
1992 .block_erase = spi_block_erase_62,
1993 }
1994 },
1995 .printlock = spi_prettyprint_status_register_at25f512a,
1996 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1997 .unlock = spi_disable_blockprotect_at25f512a,
1998 .write = spi_chip_write_256,
1999 .read = spi_chip_read,
2000 .voltage = {2700, 3600},
2001 },
2002
2003 {
2004 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002005 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002006 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002007 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002008 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002009 .total_size = 64,
2010 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002011 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2012 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002013 .tested = TEST_UNTESTED,
2014 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002015 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002016 .block_erasers =
2017 {
2018 {
2019 .eraseblocks = { {4 * 1024, 16} },
2020 .block_erase = spi_block_erase_20,
2021 }, {
2022 .eraseblocks = { {32 * 1024, 2} },
2023 .block_erase = spi_block_erase_52,
2024 }, {
2025 .eraseblocks = { {32 * 1024, 2} },
2026 .block_erase = spi_block_erase_d8,
2027 }, {
2028 .eraseblocks = { {64 * 1024, 1} },
2029 .block_erase = spi_block_erase_60,
2030 }, {
2031 .eraseblocks = { {64 * 1024, 1} },
2032 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002033 }, {
2034 .eraseblocks = { {64 * 1024, 1} },
2035 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002036 }
2037 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002038 .printlock = spi_prettyprint_status_register_at25f512b,
2039 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002040 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002041 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002042 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002043 },
2044
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002045 {
2046 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002047 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
2048 * All other properties seem to be the same.*/
2049 .name = "AT25F1024(A)",
2050 .bustype = BUS_SPI,
2051 .manufacture_id = ATMEL_ID,
2052 .model_id = ATMEL_AT25F1024,
2053 .total_size = 128,
2054 .page_size = 256,
2055 .feature_bits = FEATURE_WRSR_WREN,
2056 .tested = TEST_OK_PREW,
2057 .probe = probe_spi_at25f,
2058 .probe_timing = TIMING_ZERO,
2059 .block_erasers =
2060 {
2061 {
2062 .eraseblocks = { {32 * 1024, 4} },
2063 .block_erase = spi_block_erase_52,
2064 }, {
2065 .eraseblocks = { {128 * 1024, 1} },
2066 .block_erase = spi_block_erase_62,
2067 }
2068 },
2069 .printlock = spi_prettyprint_status_register_at25f,
2070 .unlock = spi_disable_blockprotect_at25f,
2071 .write = spi_chip_write_256,
2072 .read = spi_chip_read,
2073 .voltage = {2700, 3600},
2074 },
2075
2076 {
2077 .vendor = "Atmel",
2078 .name = "AT25F2048",
2079 .bustype = BUS_SPI,
2080 .manufacture_id = ATMEL_ID,
2081 .model_id = ATMEL_AT25F2048,
2082 .total_size = 256,
2083 .page_size = 256,
2084 .feature_bits = FEATURE_WRSR_WREN,
2085 .tested = TEST_UNTESTED,
2086 .probe = probe_spi_at25f,
2087 .probe_timing = TIMING_ZERO,
2088 .block_erasers =
2089 {
2090 {
2091 .eraseblocks = { {64 * 1024, 4} },
2092 .block_erase = spi_block_erase_52,
2093 }, {
2094 .eraseblocks = { {256 * 1024, 1} },
2095 .block_erase = spi_block_erase_62,
2096 }
2097 },
2098 .printlock = spi_prettyprint_status_register_at25f,
2099 .unlock = spi_disable_blockprotect_at25f,
2100 .write = spi_chip_write_256,
2101 .read = spi_chip_read,
2102 .voltage = {2700, 3600},
2103 },
2104
2105 {
2106 .vendor = "Atmel",
2107 .name = "AT25F4096",
2108 .bustype = BUS_SPI,
2109 .manufacture_id = ATMEL_ID,
2110 .model_id = ATMEL_AT25F4096,
2111 .total_size = 512,
2112 .page_size = 256,
2113 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner6697f712014-08-06 15:09:15 +00002114 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002115 .probe = probe_spi_at25f,
2116 .probe_timing = TIMING_ZERO,
2117 .block_erasers =
2118 {
2119 {
2120 .eraseblocks = { {64 * 1024, 8} },
2121 .block_erase = spi_block_erase_52,
2122 }, {
2123 .eraseblocks = { {512 * 1024, 1} },
2124 .block_erase = spi_block_erase_62,
2125 }
2126 },
2127 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002128 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2129 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002130 .write = spi_chip_write_256,
2131 .read = spi_chip_read,
2132 .voltage = {2700, 3600},
2133 },
2134
2135 {
2136 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002137 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002138 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002139 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002140 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002141 .total_size = 128,
2142 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002143 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002144 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002145 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002146 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002147 .block_erasers =
2148 {
2149 {
2150 .eraseblocks = { {4 * 1024, 32} },
2151 .block_erase = spi_block_erase_20,
2152 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002153 .eraseblocks = { {4 * 1024, 32} },
2154 .block_erase = spi_block_erase_d7,
2155 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002156 .eraseblocks = { {32 * 1024, 4} },
2157 .block_erase = spi_block_erase_52,
2158 }, {
2159 .eraseblocks = { {32 * 1024, 4} },
2160 .block_erase = spi_block_erase_d8,
2161 }, {
2162 .eraseblocks = { {128 * 1024, 1} },
2163 .block_erase = spi_block_erase_60,
2164 }, {
2165 .eraseblocks = { {128 * 1024, 1} },
2166 .block_erase = spi_block_erase_c7,
2167 }
2168 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002169 .printlock = spi_prettyprint_status_register_at25fs010,
2170 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002171 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002172 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002173 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002174 },
2175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002176 {
2177 .vendor = "Atmel",
2178 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002179 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002180 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002181 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002182 .total_size = 512,
2183 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002184 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002185 .tested = TEST_UNTESTED,
2186 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002187 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002188 .block_erasers =
2189 {
2190 {
2191 .eraseblocks = { {4 * 1024, 128} },
2192 .block_erase = spi_block_erase_20,
2193 }, {
2194 .eraseblocks = { {64 * 1024, 8} },
2195 .block_erase = spi_block_erase_52,
2196 }, {
2197 .eraseblocks = { {64 * 1024, 8} },
2198 .block_erase = spi_block_erase_d8,
2199 }, {
2200 .eraseblocks = { {512 * 1024, 1} },
2201 .block_erase = spi_block_erase_60,
2202 }, {
2203 .eraseblocks = { {512 * 1024, 1} },
2204 .block_erase = spi_block_erase_c7,
2205 }
2206 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002207 .printlock = spi_prettyprint_status_register_at25fs040,
2208 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002209 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002210 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002211 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002212 },
2213
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002214 {
2215 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002216 .name = "AT25SF041",
2217 .bustype = BUS_SPI,
2218 .manufacture_id = ATMEL_ID,
2219 .model_id = ATMEL_AT25SF041,
2220 .total_size = 512,
2221 .page_size = 256,
2222 .feature_bits = FEATURE_WRSR_WREN,
2223 .tested = TEST_OK_PREW,
2224 .probe = probe_spi_rdid,
2225 .probe_timing = TIMING_ZERO,
2226 .block_erasers =
2227 {
2228 {
2229 .eraseblocks = { {4 * 1024, 128} },
2230 .block_erase = spi_block_erase_20,
2231 }, {
2232 .eraseblocks = { {32 * 1024, 16} },
2233 .block_erase = spi_block_erase_52,
2234 }, {
2235 .eraseblocks = { {64 * 1024, 8} },
2236 .block_erase = spi_block_erase_d8,
2237 }, {
2238 .eraseblocks = { {512 * 1024, 1} },
2239 .block_erase = spi_block_erase_60,
2240 }, {
2241 .eraseblocks = { {512 * 1024, 1} },
2242 .block_erase = spi_block_erase_c7,
2243 }
2244 },
2245 .printlock = spi_prettyprint_status_register_plain,
2246 .unlock = spi_disable_blockprotect,
2247 .write = spi_chip_write_256,
2248 .read = spi_chip_read,
2249 .voltage = {2500, 3600},
2250 },
2251
2252 {
2253 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002254 .name = "AT25SF081",
2255 .bustype = BUS_SPI,
2256 .manufacture_id = ATMEL_ID,
2257 .model_id = ATMEL_AT25SF081,
2258 .total_size = 1024,
2259 .page_size = 256,
2260 .feature_bits = FEATURE_WRSR_WREN,
2261 .tested = TEST_OK_PREW,
2262 .probe = probe_spi_rdid,
2263 .probe_timing = TIMING_ZERO,
2264 .block_erasers =
2265 {
2266 {
2267 .eraseblocks = { {4 * 1024, 256} },
2268 .block_erase = spi_block_erase_20,
2269 }, {
2270 .eraseblocks = { {32 * 1024, 32} },
2271 .block_erase = spi_block_erase_52,
2272 }, {
2273 .eraseblocks = { {64 * 1024, 16} },
2274 .block_erase = spi_block_erase_d8,
2275 }, {
2276 .eraseblocks = { {1024 * 1024, 1} },
2277 .block_erase = spi_block_erase_60,
2278 }, {
2279 .eraseblocks = { {1024 * 1024, 1} },
2280 .block_erase = spi_block_erase_c7,
2281 }
2282 },
2283 .printlock = spi_prettyprint_status_register_plain,
2284 .unlock = spi_disable_blockprotect,
2285 .write = spi_chip_write_256,
2286 .read = spi_chip_read,
2287 .voltage = {2300, 3600},
2288 },
2289
2290 {
2291 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002292 .name = "AT25SF161",
2293 .bustype = BUS_SPI,
2294 .manufacture_id = ATMEL_ID,
2295 .model_id = ATMEL_AT25SF161,
2296 .total_size = 2048,
2297 .page_size = 256,
2298 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2299 .tested = TEST_OK_PREW,
2300 .probe = probe_spi_rdid,
2301 .probe_timing = TIMING_ZERO,
2302 .block_erasers =
2303 {
2304 {
2305 .eraseblocks = { {4 * 1024, 512} },
2306 .block_erase = spi_block_erase_20,
2307 }, {
2308 .eraseblocks = { {32 * 1024, 64} },
2309 .block_erase = spi_block_erase_52,
2310 }, {
2311 .eraseblocks = { {64 * 1024, 32} },
2312 .block_erase = spi_block_erase_d8,
2313 }, {
2314 .eraseblocks = { {2048 * 1024, 1} },
2315 .block_erase = spi_block_erase_60,
2316 }, {
2317 .eraseblocks = { {2048 * 1024, 1} },
2318 .block_erase = spi_block_erase_c7,
2319 }
2320 },
2321 .printlock = spi_prettyprint_status_register_plain,
2322 .unlock = spi_disable_blockprotect,
2323 .write = spi_chip_write_256,
2324 .read = spi_chip_read,
2325 .voltage = {2500, 3600},
2326 },
2327
2328 {
Alan Green57938f82019-06-27 15:06:43 +10002329 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002330 .name = "AT25SL128A",
2331 .bustype = BUS_SPI,
2332 .manufacture_id = ATMEL_ID,
2333 .model_id = ATMEL_AT25SL128A,
2334 .total_size = 16384,
2335 .page_size = 256,
2336 /* supports SFDP */
2337 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
2338 .tested = TEST_OK_PREW,
2339 .probe = probe_spi_rdid,
2340 .probe_timing = TIMING_ZERO,
2341 .block_erasers =
2342 {
2343 {
2344 .eraseblocks = { {4 * 1024, 4096} },
2345 .block_erase = spi_block_erase_20,
2346 }, {
2347 .eraseblocks = { {32 * 1024, 512} },
2348 .block_erase = spi_block_erase_52,
2349 }, {
2350 .eraseblocks = { {64 * 1024, 256} },
2351 .block_erase = spi_block_erase_d8,
2352 }, {
2353 .eraseblocks = { {16 * 1024 * 1024, 1} },
2354 .block_erase = spi_block_erase_60,
2355 }, {
2356 .eraseblocks = { {16 * 1024 * 1024, 1} },
2357 .block_erase = spi_block_erase_c7,
2358 }
2359 },
2360 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2361 .unlock = spi_disable_blockprotect,
2362 .write = spi_chip_write_256,
2363 .read = spi_chip_read,
2364 .voltage = {1700, 2000},
2365 },
2366
2367 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002368 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002369 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002370 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002371 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002372 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002373 .total_size = 512,
2374 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002375 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002376 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002377 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002378 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002379 .block_erasers =
2380 {
2381 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002382 .eraseblocks = { {256, 2048} },
2383 .block_erase = spi_block_erase_81,
2384 }, {
2385 .eraseblocks = { {2 * 1024, 256} },
2386 .block_erase = spi_block_erase_50,
2387 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002388 .eraseblocks = { {4 * 1024, 128} },
2389 .block_erase = spi_block_erase_20,
2390 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002391 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002392 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002393 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002394 .write = spi_chip_write_1,
2395 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002396 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002397 },
2398
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002399 {
2400 .vendor = "Atmel",
2401 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002402 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002403 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002404 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002405 .total_size = 1024,
2406 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002407 .feature_bits = FEATURE_WRSR_WREN,
2408 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002409 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002410 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002411 .block_erasers =
2412 {
2413 {
2414 .eraseblocks = { {4 * 1024, 256} },
2415 .block_erase = spi_block_erase_20,
2416 }, {
2417 .eraseblocks = { {32 * 1024, 32} },
2418 .block_erase = spi_block_erase_52,
2419 }, {
2420 .eraseblocks = { {64 * 1024, 16} },
2421 .block_erase = spi_block_erase_d8,
2422 }, {
2423 .eraseblocks = { {1024 * 1024, 1} },
2424 .block_erase = spi_block_erase_60,
2425 }, {
2426 .eraseblocks = { {1024 * 1024, 1} },
2427 .block_erase = spi_block_erase_c7,
2428 }
2429 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002430 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002431 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002432 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002433 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002434 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002435 },
2436
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002437 {
2438 .vendor = "Atmel",
2439 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002440 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002441 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002442 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002443 .total_size = 2048,
2444 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002445 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002446 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002447 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002448 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002449 .block_erasers =
2450 {
2451 {
2452 .eraseblocks = { {4 * 1024, 512} },
2453 .block_erase = spi_block_erase_20,
2454 }, {
2455 .eraseblocks = { {32 * 1024, 64} },
2456 .block_erase = spi_block_erase_52,
2457 }, {
2458 .eraseblocks = { {64 * 1024, 32} },
2459 .block_erase = spi_block_erase_d8,
2460 }, {
2461 .eraseblocks = { {2 * 1024 * 1024, 1} },
2462 .block_erase = spi_block_erase_60,
2463 }, {
2464 .eraseblocks = { {2 * 1024 * 1024, 1} },
2465 .block_erase = spi_block_erase_c7,
2466 }
2467 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002468 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002469 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002470 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002471 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002472 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002473 },
2474
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002475 {
2476 .vendor = "Atmel",
2477 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002478 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002479 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002480 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002481 .total_size = 2048,
2482 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002483 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002484 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002485 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002486 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002487 .block_erasers =
2488 {
2489 {
2490 .eraseblocks = { {4 * 1024, 512} },
2491 .block_erase = spi_block_erase_20,
2492 }, {
2493 .eraseblocks = { {32 * 1024, 64} },
2494 .block_erase = spi_block_erase_52,
2495 }, {
2496 .eraseblocks = { {64 * 1024, 32} },
2497 .block_erase = spi_block_erase_d8,
2498 }, {
2499 .eraseblocks = { {2 * 1024 * 1024, 1} },
2500 .block_erase = spi_block_erase_60,
2501 }, {
2502 .eraseblocks = { {2 * 1024 * 1024, 1} },
2503 .block_erase = spi_block_erase_c7,
2504 }
2505 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002506 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002507 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002508 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002509 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002510 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002511 },
2512
2513 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002514 /*{
2515 .vendor = "Atmel",
2516 .name = "AT26DF321",
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_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002520 .total_size = 4096,
2521 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002522 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002523 .tested = TEST_UNTESTED,
2524 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002525 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002526 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002527 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002528 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002529 .read = spi_chip_read,
2530 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002531
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002532 {
2533 .vendor = "Atmel",
2534 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002535 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002536 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002537 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002538 .total_size = 512,
2539 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002540 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002541 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002542 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002543 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002544 .block_erasers =
2545 {
2546 {
2547 .eraseblocks = { {4 * 1024, 128} },
2548 .block_erase = spi_block_erase_20,
2549 }, {
2550 .eraseblocks = { {32 * 1024, 16} },
2551 .block_erase = spi_block_erase_52,
2552 }, {
2553 .eraseblocks = { {64 * 1024, 8} },
2554 .block_erase = spi_block_erase_d8,
2555 }, {
2556 .eraseblocks = { {512 * 1024, 1} },
2557 .block_erase = spi_block_erase_60,
2558 }, {
2559 .eraseblocks = { {512 * 1024, 1} },
2560 .block_erase = spi_block_erase_c7,
2561 }
2562 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002563 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002564 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002565 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002566 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002567 },
2568
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002569 {
2570 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002571 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002572 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002573 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002574 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002575 .total_size = 64,
2576 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002577 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002578 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002579 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002580 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002581 .block_erasers =
2582 {
2583 {
2584 .eraseblocks = { {64 * 1024, 1} },
2585 .block_erase = erase_chip_block_jedec,
2586 }
2587 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002588 .write = write_jedec,
2589 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002590 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002591 },
2592
2593 {
2594 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002595 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002596 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002597 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002598 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002599 .total_size = 128,
2600 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002601 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002602 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002603 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002604 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002605 .block_erasers =
2606 {
2607 {
2608 .eraseblocks = { {128 * 1024, 1} },
2609 .block_erase = erase_chip_block_jedec,
2610 }
2611 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002612 .write = write_jedec, /* FIXME */
2613 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002614 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002615 },
2616
2617 {
2618 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002619 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002620 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002621 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002622 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002623 .total_size = 256,
2624 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002625 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002626 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002627 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002628 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002629 .block_erasers =
2630 {
2631 {
2632 .eraseblocks = { {256 * 1024, 1} },
2633 .block_erase = erase_chip_block_jedec,
2634 }
2635 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002636 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002637 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002638 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002639 },
2640
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002641 {
2642 .vendor = "Atmel",
2643 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002644 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002645 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002646 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002647 .total_size = 512,
2648 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002649 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002650 .tested = TEST_UNTESTED,
2651 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002652 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002653 .block_erasers =
2654 {
2655 {
2656 .eraseblocks = { {512 * 1024, 1} },
2657 .block_erase = erase_chip_block_jedec,
2658 }
2659 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002660 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002661 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002662 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002663 },
2664
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002665 {
2666 .vendor = "Atmel",
2667 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002668 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002669 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002670 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002671 .total_size = 16896, /* No power of two sizes */
2672 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002673 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002674 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2675 .feature_bits = FEATURE_OTP,
2676 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002677 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002678 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002679 .block_erasers =
2680 {
2681 {
2682 .eraseblocks = {
2683 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2684 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2685 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2686 },
2687 .block_erase = spi_erase_at45cs_sector,
2688 }
2689 },
2690 .printlock = spi_prettyprint_status_register_plain,
2691 .gran = write_gran_1056bytes,
2692 .write = spi_write_at45db,
2693 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002694 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002695 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002696
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002697 {
2698 .vendor = "Atmel",
2699 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002700 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002701 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002702 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002703 .total_size = 128, /* or 132, determined from status register */
2704 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002705 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002706 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2707 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002708 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002709 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002710 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002711 .block_erasers =
2712 {
2713 {
2714 .eraseblocks = { {256, 512} },
2715 .block_erase = spi_erase_at45db_page,
2716 }, {
2717 .eraseblocks = { {8 * 256, 512/8} },
2718 .block_erase = spi_erase_at45db_block,
2719 }, {
2720 .eraseblocks = {
2721 {8 * 256, 1},
2722 {120 * 256, 1},
2723 {128 * 256, 3},
2724 },
2725 .block_erase = spi_erase_at45db_sector
2726 }, {
2727 .eraseblocks = { {128 * 1024, 1} },
2728 .block_erase = spi_erase_at45db_chip,
2729 }
2730 },
2731 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2732 .printlock = spi_prettyprint_status_register_at45db,
2733 /* granularity will be set by the probing function. */
2734 .write = spi_write_at45db,
2735 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002736 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002737 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002739 {
2740 .vendor = "Atmel",
2741 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002742 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002743 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002744 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002745 .total_size = 256, /* or 264, determined from status register */
2746 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002747 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002748 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2749 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002750 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002751 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002752 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002753 .block_erasers =
2754 {
2755 {
2756 .eraseblocks = { {256, 1024} },
2757 .block_erase = spi_erase_at45db_page,
2758 }, {
2759 .eraseblocks = { {8 * 256, 1024/8} },
2760 .block_erase = spi_erase_at45db_block,
2761 }, {
2762 .eraseblocks = {
2763 {8 * 256, 1},
2764 {120 * 256, 1},
2765 {128 * 256, 7},
2766 },
2767 .block_erase = spi_erase_at45db_sector
2768 }, {
2769 .eraseblocks = { {256 * 1024, 1} },
2770 .block_erase = spi_erase_at45db_chip,
2771 }
2772 },
2773 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2774 .printlock = spi_prettyprint_status_register_at45db,
2775 /* granularity will be set by the probing function. */
2776 .write = spi_write_at45db,
2777 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002778 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002779 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002780
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002781 {
2782 .vendor = "Atmel",
2783 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002784 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002785 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002786 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002787 .total_size = 512, /* or 528, determined from status register */
2788 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002789 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002790 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2791 .feature_bits = FEATURE_OTP,
2792 .tested = TEST_OK_PREW,
2793 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002794 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002795 .block_erasers =
2796 {
2797 {
2798 .eraseblocks = { {256, 2048} },
2799 .block_erase = spi_erase_at45db_page,
2800 }, {
2801 .eraseblocks = { {8 * 256, 2048/8} },
2802 .block_erase = spi_erase_at45db_block,
2803 }, {
2804 .eraseblocks = {
2805 {8 * 256, 1},
2806 {248 * 256, 1},
2807 {256 * 256, 7},
2808 },
2809 .block_erase = spi_erase_at45db_sector
2810 }, {
2811 .eraseblocks = { {512 * 1024, 1} },
2812 .block_erase = spi_erase_at45db_chip,
2813 }
2814 },
2815 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2816 .printlock = spi_prettyprint_status_register_at45db,
2817 /* granularity will be set by the probing function. */
2818 .write = spi_write_at45db,
2819 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2820 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002821 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002822
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002823 {
2824 .vendor = "Atmel",
2825 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002826 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002827 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002828 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002829 .total_size = 1024, /* or 1056, determined from status register */
2830 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002831 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002832 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2833 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002834 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002835 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002836 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002837 .block_erasers =
2838 {
2839 {
2840 .eraseblocks = { {256, 4096} },
2841 .block_erase = spi_erase_at45db_page,
2842 }, {
2843 .eraseblocks = { {8 * 256, 4096/8} },
2844 .block_erase = spi_erase_at45db_block,
2845 }, {
2846 .eraseblocks = {
2847 {8 * 256, 1},
2848 {248 * 256, 1},
2849 {256 * 256, 15},
2850 },
2851 .block_erase = spi_erase_at45db_sector
2852 }, {
2853 .eraseblocks = { {1024 * 1024, 1} },
2854 .block_erase = spi_erase_at45db_chip,
2855 }
2856 },
2857 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2858 .printlock = spi_prettyprint_status_register_at45db,
2859 /* granularity will be set by the probing function. */
2860 .write = spi_write_at45db,
2861 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002862 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002863 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002864
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002865 {
2866 .vendor = "Atmel",
2867 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002868 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002869 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002870 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002871 .total_size = 2048, /* or 2112, determined from status register */
2872 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002873 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002874 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2875 .feature_bits = FEATURE_OTP,
2876 .tested = TEST_OK_PREW,
2877 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002878 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002879 .block_erasers =
2880 {
2881 {
2882 .eraseblocks = { {512, 4096} },
2883 .block_erase = spi_erase_at45db_page,
2884 }, {
2885 .eraseblocks = { {8 * 512, 4096/8} },
2886 .block_erase = spi_erase_at45db_block,
2887 }, {
2888 .eraseblocks = {
2889 {8 * 512, 1},
2890 {248 * 512, 1},
2891 {256 * 512, 15},
2892 },
2893 .block_erase = spi_erase_at45db_sector
2894 }, {
2895 .eraseblocks = { {2048 * 1024, 1} },
2896 .block_erase = spi_erase_at45db_chip,
2897 }
2898 },
2899 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2900 .printlock = spi_prettyprint_status_register_at45db,
2901 /* granularity will be set by the probing function. */
2902 .write = spi_write_at45db,
2903 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002904 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002905 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002906
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002907 {
2908 .vendor = "Atmel",
2909 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002910 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002911 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002912 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10002913 .total_size = 4224, /* No power of two sizes */
2914 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002915 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002916 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2917 .feature_bits = FEATURE_OTP,
2918 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002919 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002920 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002921 .block_erasers =
2922 {
2923 {
2924 .eraseblocks = { {528, 8192} },
2925 .block_erase = spi_erase_at45db_page,
2926 }, {
2927 .eraseblocks = { {8 * 528, 8192/8} },
2928 .block_erase = spi_erase_at45db_block,
2929 }, /* Although the datasheets describes sectors (which can be write protected)
2930 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00002931 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002932 .eraseblocks = {
2933 {8 * 528, 1},
2934 {120 * 528, 1},
2935 {128 * 528, 63},
2936 },
2937 .block_erase = spi_erase_at45db_sector
2938 }, */ {
2939 .eraseblocks = { {4224 * 1024, 1} },
2940 .block_erase = spi_erase_at45db_chip,
2941 }
2942 },
2943 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2944 .gran = write_gran_528bytes,
2945 .write = spi_write_at45db,
2946 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002947 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002948 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002949
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002950 {
2951 .vendor = "Atmel",
2952 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002953 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002954 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002955 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10002956 .total_size = 4096, /* or 4224, determined from status register */
2957 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002958 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002959 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002960 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00002961 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002962 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002963 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002964 .block_erasers =
2965 {
2966 {
2967 .eraseblocks = { {512, 8192} },
2968 .block_erase = spi_erase_at45db_page,
2969 }, {
2970 .eraseblocks = { {8 * 512, 8192/8} },
2971 .block_erase = spi_erase_at45db_block,
2972 }, {
2973 .eraseblocks = {
2974 {8 * 512, 1},
2975 {120 * 512, 1},
2976 {128 * 512, 63},
2977 },
2978 .block_erase = spi_erase_at45db_sector
2979 }, {
2980 .eraseblocks = { {4096 * 1024, 1} },
2981 .block_erase = spi_erase_at45db_chip,
2982 }
2983 },
2984 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2985 .printlock = spi_prettyprint_status_register_at45db,
2986 /* granularity will be set by the probing function. */
2987 .write = spi_write_at45db,
2988 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2989 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2990 },
2991
2992 {
2993 .vendor = "Atmel",
2994 .name = "AT45DB321E",
2995 .bustype = BUS_SPI,
2996 .manufacture_id = ATMEL_ID,
2997 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10002998 .total_size = 4096, /* or 4224, determined from status register */
2999 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003000 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3001 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3002 .feature_bits = FEATURE_OTP,
3003 .tested = TEST_UNTESTED,
3004 .probe = probe_spi_at45db,
3005 .probe_timing = TIMING_ZERO,
3006 .block_erasers =
3007 {
3008 {
3009 .eraseblocks = { {512, 8192} },
3010 .block_erase = spi_erase_at45db_page,
3011 }, {
3012 .eraseblocks = { {8 * 512, 8192/8} },
3013 .block_erase = spi_erase_at45db_block,
3014 }, {
3015 .eraseblocks = {
3016 {8 * 512, 1},
3017 {120 * 512, 1},
3018 {128 * 512, 63},
3019 },
3020 .block_erase = spi_erase_at45db_sector
3021 }, {
3022 .eraseblocks = { {4096 * 1024, 1} },
3023 .block_erase = spi_erase_at45db_chip,
3024 }
3025 },
3026 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3027 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
3028 /* granularity will be set by the probing function. */
3029 .write = spi_write_at45db,
3030 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3031 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003032 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003033
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003034 {
3035 .vendor = "Atmel",
3036 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003037 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003038 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003039 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003040 .total_size = 8192, /* or 8448, determined from status register */
3041 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003042 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003043 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3044 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003045 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003046 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003047 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003048 .block_erasers =
3049 {
3050 {
3051 .eraseblocks = { {1024, 8192} },
3052 .block_erase = spi_erase_at45db_page,
3053 }, {
3054 .eraseblocks = { {8 * 1024, 8192/8} },
3055 .block_erase = spi_erase_at45db_block,
3056 }, {
3057 .eraseblocks = {
3058 {8 * 1024, 1},
3059 {248 * 1024, 1},
3060 {256 * 1024, 31},
3061 },
3062 .block_erase = spi_erase_at45db_sector
3063 }, {
3064 .eraseblocks = { {8192 * 1024, 1} },
3065 .block_erase = spi_erase_at45db_chip,
3066 }
3067 },
3068 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3069 .printlock = spi_prettyprint_status_register_at45db,
3070 /* granularity will be set by the probing function. */
3071 .write = spi_write_at45db,
3072 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003073 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003074 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003075
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003076 {
3077 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003078 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003079 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003080 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003081 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003082 .total_size = 64,
3083 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003084 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003085 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003086 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003087 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003088 .block_erasers =
3089 {
3090 {
3091 .eraseblocks = { {64 * 1024, 1} },
3092 .block_erase = erase_chip_block_jedec,
3093 }
3094 },
Sean Nelson35727f72010-01-28 23:55:12 +00003095 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003096 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003097 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003098 },
3099
3100 {
3101 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003102 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003103 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003104 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003105 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003106 .total_size = 256,
3107 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003108 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003109 .tested = TEST_UNTESTED,
3110 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003111 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003112 .block_erasers =
3113 {
3114 {
3115 .eraseblocks = {
3116 {16 * 1024, 1},
3117 {8 * 1024, 2},
3118 {96 * 1024, 1},
3119 {128 * 1024, 1},
3120 },
3121 .block_erase = erase_sector_jedec,
3122 }, {
3123 .eraseblocks = { {256 * 1024, 1} },
3124 .block_erase = erase_chip_block_jedec,
3125 }
3126 },
Sean Nelson35727f72010-01-28 23:55:12 +00003127 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003128 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003129 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003130 },
3131
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003132 {
3133 .vendor = "Atmel",
3134 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003135 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003136 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003137 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003138 .total_size = 256,
3139 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003140 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003141 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003142 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003143 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003144 .block_erasers =
3145 {
3146 {
3147 .eraseblocks = {
3148 {128 * 1024, 1},
3149 {96 * 1024, 1},
3150 {8 * 1024, 2},
3151 {16 * 1024, 1},
3152 },
3153 .block_erase = erase_sector_jedec,
3154 }, {
3155 .eraseblocks = { {256 * 1024, 1} },
3156 .block_erase = erase_chip_block_jedec,
3157 }
3158 },
Sean Nelson35727f72010-01-28 23:55:12 +00003159 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003160 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003161 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003162 },
3163
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003164 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003165 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003166 .name = "AT49(H)F010",
3167 .bustype = BUS_PARALLEL,
3168 .manufacture_id = ATMEL_ID,
3169 .model_id = ATMEL_AT49F010,
3170 .total_size = 128,
3171 .page_size = 0, /* unused */
3172 .feature_bits = FEATURE_EITHER_RESET,
3173 .tested = TEST_OK_PREW,
3174 .probe = probe_jedec,
3175 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3176 .block_erasers =
3177 {
3178 {
3179 .eraseblocks = { {128 * 1024, 1} },
3180 .block_erase = erase_chip_block_jedec,
3181 }
3182 },
3183 .printlock = printlock_at49f,
Elyes HAOUAS124ef382018-03-27 12:15:09 +02003184 .write = write_jedec_1,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003185 .read = read_memmapped,
3186 .voltage = {4500, 5500},
3187 },
3188
3189 {
3190 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003191 .name = "AT49F020",
3192 .bustype = BUS_PARALLEL,
3193 .manufacture_id = ATMEL_ID,
3194 .model_id = ATMEL_AT49F020,
3195 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003196 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003197 .feature_bits = FEATURE_EITHER_RESET,
3198 .tested = TEST_OK_PRE,
3199 .probe = probe_jedec,
3200 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3201 .block_erasers =
3202 {
3203 {
3204 .eraseblocks = { {256 * 1024, 1} },
3205 .block_erase = erase_chip_block_jedec,
3206 }
3207 /* Chip features an optional permanent write protection
3208 * of the first 8 kB. The erase function is the same as
3209 * above, but 00000H to 01FFFH will not be erased.
3210 * FIXME: add another eraser when partial erasers are
3211 * supported.
3212 */
3213 },
3214 .printlock = printlock_at49f,
3215 .write = write_jedec_1,
3216 .read = read_memmapped,
3217 .voltage = {4500, 5500},
3218 },
3219
3220 {
3221 .vendor = "Atmel",
3222 .name = "AT49F040",
3223 .bustype = BUS_PARALLEL,
3224 .manufacture_id = ATMEL_ID,
3225 .model_id = ATMEL_AT49F040,
3226 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003227 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003228 .feature_bits = FEATURE_EITHER_RESET,
3229 .tested = TEST_UNTESTED,
3230 .probe = probe_jedec,
3231 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3232 .block_erasers =
3233 {
3234 {
3235 .eraseblocks = { {512 * 1024, 1} },
3236 .block_erase = erase_chip_block_jedec,
3237 }
3238 /* Chip features an optional permanent write protection
3239 * of the first 16 kB. The erase function is the same as
3240 * above, but 00000H to 03FFFH will not be erased.
3241 * FIXME: add another eraser when partial erasers are
3242 * supported.
3243 */
3244 },
3245 .printlock = printlock_at49f,
3246 .write = write_jedec_1,
3247 .read = read_memmapped,
3248 .voltage = {4500, 5500},
3249 },
3250
3251 {
3252 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003253 .name = "AT49F080",
3254 .bustype = BUS_PARALLEL,
3255 .manufacture_id = ATMEL_ID,
3256 .model_id = ATMEL_AT49F080,
3257 .total_size = 1024,
3258 .page_size = 0, /* unused */
3259 .feature_bits = FEATURE_EITHER_RESET,
3260 .tested = TEST_UNTESTED,
3261 .probe = probe_jedec,
3262 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3263 .block_erasers =
3264 {
3265 {
3266 .eraseblocks = { {1024 * 1024, 1} },
3267 .block_erase = erase_chip_block_jedec,
3268 }
3269 /* Chip features an optional permanent write protection
3270 * of the first 16 kB. The erase function is the same as
3271 * above, but 00000H to 03FFFH will not be erased.
3272 * FIXME: add another eraser when partial erasers are
3273 * supported.
3274 */
3275 },
3276 .printlock = printlock_at49f,
3277 .write = write_jedec_1,
3278 .read = read_memmapped,
3279 .voltage = {4500, 5500},
3280 },
3281
3282 {
3283 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3284 .vendor = "Atmel",
3285 .name = "AT49F080T",
3286 .bustype = BUS_PARALLEL,
3287 .manufacture_id = ATMEL_ID,
3288 .model_id = ATMEL_AT49F080T,
3289 .total_size = 1024,
3290 .page_size = 0, /* unused */
3291 .feature_bits = FEATURE_EITHER_RESET,
3292 .tested = TEST_UNTESTED,
3293 .probe = probe_jedec,
3294 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3295 .block_erasers =
3296 {
3297 {
3298 .eraseblocks = { {1024 * 1024, 1} },
3299 .block_erase = erase_chip_block_jedec,
3300 }
3301 /* Chip features an optional permanent write protection
3302 * of the first 16 kB. The erase function is the same as
3303 * above, but FC000H to FFFFFH will not be erased.
3304 * FIXME: add another eraser when partial erasers are
3305 * supported.
3306 */
3307 },
3308 .printlock = printlock_at49f,
3309 .write = write_jedec_1,
3310 .read = read_memmapped,
3311 .voltage = {4500, 5500},
3312 },
3313
3314 {
3315 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003316 .name = "AT49LH002",
3317 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3318 .manufacture_id = ATMEL_ID,
3319 .model_id = ATMEL_AT49LH002,
3320 .total_size = 256,
3321 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003322 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003323 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003324 .probe = probe_82802ab,
3325 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003326 .block_erasers =
3327 {
3328 {
3329 .eraseblocks = {
3330 {64 * 1024, 3},
3331 {32 * 1024, 1},
3332 {8 * 1024, 2},
3333 {16 * 1024, 1},
3334 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003335 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003336 }, {
3337 .eraseblocks = {
3338 {64 * 1024, 4},
3339 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003340 .block_erase = erase_block_82802ab,
3341 },
3342 },
3343 .printlock = printlock_regspace2_block_eraser_0,
3344 .unlock = unlock_regspace2_block_eraser_0,
3345 .write = write_82802ab,
3346 .read = read_memmapped,
3347 .voltage = {3000, 3600},
3348 },
3349
3350 {
3351 .vendor = "Atmel",
3352 .name = "AT49LH00B4",
3353 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3354 .manufacture_id = ATMEL_ID,
3355 .model_id = ATMEL_AT49LH00B4,
3356 .total_size = 512,
3357 .page_size = 0, /* unused */
3358 .feature_bits = FEATURE_REGISTERMAP,
3359 .tested = TEST_UNTESTED,
3360 .probe = probe_82802ab,
3361 .probe_timing = TIMING_ZERO,
3362 .block_erasers =
3363 {
3364 {
3365 .eraseblocks = {
3366 {8 * 1024, 2},
3367 {16 * 1024, 1},
3368 {32 * 1024, 1},
3369 {64 * 1024, 7},
3370 },
3371 .block_erase = NULL, /* TODO: Implement. */
3372 }, {
3373 .eraseblocks = {
3374 {64 * 1024, 8},
3375 },
3376 .block_erase = erase_block_82802ab,
3377 },
3378 },
3379 .printlock = printlock_regspace2_block_eraser_0,
3380 .unlock = unlock_regspace2_block_eraser_0,
3381 .write = write_82802ab,
3382 .read = read_memmapped,
3383 .voltage = {3000, 3600},
3384 },
3385
3386 {
3387 .vendor = "Atmel",
3388 .name = "AT49LH004",
3389 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3390 .manufacture_id = ATMEL_ID,
3391 .model_id = ATMEL_AT49LH004,
3392 .total_size = 512,
3393 .page_size = 0, /* unused */
3394 .feature_bits = FEATURE_REGISTERMAP,
3395 .tested = TEST_UNTESTED,
3396 .probe = probe_82802ab,
3397 .probe_timing = TIMING_ZERO,
3398 .block_erasers =
3399 {
3400 {
3401 .eraseblocks = {
3402 {64 * 1024, 7},
3403 {32 * 1024, 1},
3404 {8 * 1024, 2},
3405 {16 * 1024, 1},
3406 },
3407 .block_erase = erase_block_82802ab,
3408 }, {
3409 .eraseblocks = {
3410 {64 * 1024, 8},
3411 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003412 .block_erase = NULL, /* TODO: Implement. */
3413 },
3414 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003415 .printlock = printlock_regspace2_block_eraser_0,
3416 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003417 .write = write_82802ab,
3418 .read = read_memmapped,
3419 .voltage = {3000, 3600},
3420 },
3421
3422 {
Andrew Morganca081462011-09-13 22:05:44 +00003423 .vendor = "Catalyst",
3424 .name = "CAT28F512",
3425 .bustype = BUS_PARALLEL,
3426 .manufacture_id = CATALYST_ID,
3427 .model_id = CATALYST_CAT28F512,
3428 .total_size = 64,
3429 .page_size = 0, /* unused */
3430 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003431 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003432 .probe = probe_jedec, /* FIXME! */
3433 .probe_timing = TIMING_ZERO,
3434 .block_erasers =
3435 {
3436 {
3437 .eraseblocks = { {64 * 1024, 1} },
3438 .block_erase = NULL, /* TODO */
3439 },
3440 },
3441 .write = NULL, /* TODO */
3442 .read = read_memmapped,
3443 .voltage = {4500, 5500},
3444 },
3445
3446 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003447 .vendor = "Bright",
3448 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003449 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003450 .manufacture_id = BRIGHT_ID,
3451 .model_id = BRIGHT_BM29F040,
3452 .total_size = 512,
3453 .page_size = 64 * 1024,
3454 .feature_bits = FEATURE_EITHER_RESET,
3455 .tested = TEST_OK_PR,
3456 .probe = probe_jedec,
3457 .probe_timing = TIMING_ZERO,
3458 .block_erasers =
3459 {
3460 {
3461 .eraseblocks = { {64 * 1024, 8} },
3462 .block_erase = erase_sector_jedec,
3463 }, {
3464 .eraseblocks = { {512 * 1024, 1} },
3465 .block_erase = erase_chip_block_jedec,
3466 },
3467 },
3468 .write = write_jedec_1,
3469 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003470 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003471 },
3472
3473 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003474 .vendor = "ENE",
3475 .name = "KB9012 (EDI)",
3476 .bustype = BUS_SPI,
3477 .spi_cmd_set = SPI_EDI,
3478 .total_size = 128,
3479 .page_size = 128,
3480 .feature_bits = FEATURE_ERASED_ZERO,
3481 .tested = TEST_OK_PREW,
3482 .probe = edi_probe_kb9012,
3483 .probe_timing = TIMING_ZERO,
3484 .block_erasers =
3485 {
3486 {
3487 .eraseblocks = { {128, 1024} },
3488 .block_erase = edi_chip_block_erase,
3489 },
3490 },
3491 .gran = write_gran_128bytes,
3492 .write = edi_chip_write,
3493 .read = edi_chip_read,
3494 .voltage = {2700, 3600},
3495 },
3496
3497 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003498 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003499 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003500 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003501 .manufacture_id = ESMT_ID,
3502 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003503 .total_size = 256,
3504 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003505 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003506 .tested = TEST_UNTESTED,
3507 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003508 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003509 .block_erasers =
3510 {
3511 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003512 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003513 {128 * 1024, 1},
3514 {96 * 1024, 1},
3515 {8 * 1024, 2},
3516 {16 * 1024, 1},
3517 },
3518 .block_erase = erase_sector_jedec,
3519 }, {
3520 .eraseblocks = { {256 * 1024, 1} },
3521 .block_erase = erase_chip_block_jedec,
3522 }
3523 },
Sean Nelson35727f72010-01-28 23:55:12 +00003524 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003525 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003526 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003527 },
3528
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003529 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003530 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003531 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003532 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003533 .manufacture_id = ESMT_ID,
3534 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003535 .total_size = 1024,
3536 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003537 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003538 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003539 .probe = probe_spi_rdid,
3540 .probe_timing = TIMING_ZERO,
3541 .block_erasers =
3542 {
3543 {
3544 .eraseblocks = { {4 * 1024, 256} },
3545 .block_erase = spi_block_erase_20,
3546 }, {
3547 .eraseblocks = { {64 * 1024, 16} },
3548 .block_erase = spi_block_erase_d8,
3549 }, {
3550 .eraseblocks = { {1024 * 1024, 1} },
3551 .block_erase = spi_block_erase_60,
3552 }, {
3553 .eraseblocks = { {1024 * 1024, 1} },
3554 .block_erase = spi_block_erase_c7,
3555 }
3556 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003557 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003558 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003559 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003560 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003561 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003562 },
3563
3564 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003565 .vendor = "ESMT",
3566 .name = "F25L32PA",
3567 .bustype = BUS_SPI,
3568 .manufacture_id = ESMT_ID,
3569 .model_id = ESMT_F25L32PA,
3570 .total_size = 4096,
3571 .page_size = 256,
3572 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3573 .tested = TEST_UNTESTED,
3574 .probe = probe_spi_rdid,
3575 .probe_timing = TIMING_ZERO,
3576 .block_erasers =
3577 {
3578 {
3579 .eraseblocks = { {4 * 1024, 1024} },
3580 .block_erase = spi_block_erase_20,
3581 }, {
3582 .eraseblocks = { {64 * 1024, 64} },
3583 .block_erase = spi_block_erase_d8,
3584 }, {
3585 .eraseblocks = { {4 * 1024 * 1024, 1} },
3586 .block_erase = spi_block_erase_60,
3587 }, {
3588 .eraseblocks = { {4 * 1024 * 1024, 1} },
3589 .block_erase = spi_block_erase_c7,
3590 }
3591 },
3592 .printlock = spi_prettyprint_status_register_bp2_bpl,
3593 .unlock = spi_disable_blockprotect,
3594 .write = spi_chip_write_256,
3595 .read = spi_chip_read,
3596 .voltage = {2700, 3600},
3597 },
3598
3599 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003600 .vendor = "Eon",
3601 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003602 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003603 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003604 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003605 .total_size = 64,
3606 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003607 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003608 .tested = TEST_UNTESTED,
3609 .probe = probe_spi_rdid,
3610 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003611 .block_erasers =
3612 {
3613 {
3614 .eraseblocks = {
3615 {4 * 1024, 2},
3616 {8 * 1024, 1},
3617 {16 * 1024, 1},
3618 {32 * 1024, 1},
3619 },
3620 .block_erase = spi_block_erase_d8,
3621 }, {
3622 .eraseblocks = { {64 * 1024, 1} },
3623 .block_erase = spi_block_erase_c7,
3624 }
3625 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003626 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003627 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003628 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003629 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003630 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003631 },
3632
3633 {
3634 .vendor = "Eon",
3635 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003636 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003637 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003638 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003639 .total_size = 64,
3640 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003641 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003642 .tested = TEST_UNTESTED,
3643 .probe = probe_spi_rdid,
3644 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003645 .block_erasers =
3646 {
3647 {
3648 .eraseblocks = {
3649 {32 * 1024, 1},
3650 {16 * 1024, 1},
3651 {8 * 1024, 1},
3652 {4 * 1024, 2},
3653 },
3654 .block_erase = spi_block_erase_d8,
3655 }, {
3656 .eraseblocks = { {64 * 1024, 1} },
3657 .block_erase = spi_block_erase_c7,
3658 }
3659 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003660 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003661 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003662 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003663 .read = spi_chip_read, /* Fast read (0x0B) supported */
3664 .voltage = {2700, 3600},
3665 },
3666
3667 {
3668 .vendor = "Eon",
3669 .name = "EN25P05",
3670 .bustype = BUS_SPI,
3671 .manufacture_id = EON_ID_NOPREFIX,
3672 .model_id = EON_EN25B05,
3673 .total_size = 64,
3674 .page_size = 256,
3675 .feature_bits = FEATURE_WRSR_WREN,
3676 .tested = TEST_UNTESTED,
3677 .probe = probe_spi_rdid,
3678 .probe_timing = TIMING_ZERO,
3679 .block_erasers =
3680 {
3681 {
3682 .eraseblocks = {
3683 {32 * 1024, 2} },
3684 .block_erase = spi_block_erase_d8,
3685 }, {
3686 .eraseblocks = { {64 * 1024, 1} },
3687 .block_erase = spi_block_erase_c7,
3688 }
3689 },
3690 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3691 .unlock = spi_disable_blockprotect,
3692 .write = spi_chip_write_256,
3693 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003694 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003695 },
3696
3697 {
3698 .vendor = "Eon",
3699 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003700 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003701 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003702 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003703 .total_size = 128,
3704 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003705 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003706 .tested = TEST_UNTESTED,
3707 .probe = probe_spi_rdid,
3708 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003709 .block_erasers =
3710 {
3711 {
3712 .eraseblocks = {
3713 {4 * 1024, 2},
3714 {8 * 1024, 1},
3715 {16 * 1024, 1},
3716 {32 * 1024, 3},
3717 },
3718 .block_erase = spi_block_erase_d8,
3719 }, {
3720 .eraseblocks = { {128 * 1024, 1} },
3721 .block_erase = spi_block_erase_c7,
3722 }
3723 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003724 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003725 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003726 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003727 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003728 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003729 },
3730
3731 {
3732 .vendor = "Eon",
3733 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003734 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003735 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003736 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003737 .total_size = 128,
3738 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003739 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003740 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003741 .probe = probe_spi_rdid,
3742 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003743 .block_erasers =
3744 {
3745 {
3746 .eraseblocks = {
3747 {32 * 1024, 3},
3748 {16 * 1024, 1},
3749 {8 * 1024, 1},
3750 {4 * 1024, 2},
3751 },
3752 .block_erase = spi_block_erase_d8,
3753 }, {
3754 .eraseblocks = { {128 * 1024, 1} },
3755 .block_erase = spi_block_erase_c7,
3756 }
3757 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003758 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003759 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003760 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003761 .read = spi_chip_read, /* Fast read (0x0B) supported */
3762 .voltage = {2700, 3600},
3763 },
3764
3765 {
3766 .vendor = "Eon",
3767 .name = "EN25P10",
3768 .bustype = BUS_SPI,
3769 .manufacture_id = EON_ID_NOPREFIX,
3770 .model_id = EON_EN25B10,
3771 .total_size = 128,
3772 .page_size = 256,
3773 .feature_bits = FEATURE_WRSR_WREN,
3774 .tested = TEST_UNTESTED,
3775 .probe = probe_spi_rdid,
3776 .probe_timing = TIMING_ZERO,
3777 .block_erasers =
3778 {
3779 {
3780 .eraseblocks = { {32 * 1024, 4} },
3781 .block_erase = spi_block_erase_d8,
3782 }, {
3783 .eraseblocks = { {128 * 1024, 1} },
3784 .block_erase = spi_block_erase_c7,
3785 }
3786 },
3787 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3788 .unlock = spi_disable_blockprotect,
3789 .write = spi_chip_write_256,
3790 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003791 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003792 },
3793
3794 {
3795 .vendor = "Eon",
3796 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003797 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003798 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003799 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003800 .total_size = 256,
3801 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003802 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003803 .tested = TEST_UNTESTED,
3804 .probe = probe_spi_rdid,
3805 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003806 .block_erasers =
3807 {
3808 {
3809 .eraseblocks = {
3810 {4 * 1024, 2},
3811 {8 * 1024, 1},
3812 {16 * 1024, 1},
3813 {32 * 1024, 1},
3814 {64 * 1024, 3}
3815 },
3816 .block_erase = spi_block_erase_d8,
3817 }, {
3818 .eraseblocks = { {256 * 1024, 1} },
3819 .block_erase = spi_block_erase_c7,
3820 }
3821 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003822 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003823 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003824 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003825 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003826 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003827 },
3828
3829 {
3830 .vendor = "Eon",
3831 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003832 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003833 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003834 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003835 .total_size = 256,
3836 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003837 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003838 .tested = TEST_UNTESTED,
3839 .probe = probe_spi_rdid,
3840 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003841 .block_erasers =
3842 {
3843 {
3844 .eraseblocks = {
3845 {64 * 1024, 3},
3846 {32 * 1024, 1},
3847 {16 * 1024, 1},
3848 {8 * 1024, 1},
3849 {4 * 1024, 2},
3850 },
3851 .block_erase = spi_block_erase_d8,
3852 }, {
3853 .eraseblocks = { {256 * 1024, 1} },
3854 .block_erase = spi_block_erase_c7,
3855 }
3856 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003857 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003858 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003859 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003860 .read = spi_chip_read, /* Fast read (0x0B) supported */
3861 .voltage = {2700, 3600},
3862 },
3863
3864 {
3865 .vendor = "Eon",
3866 .name = "EN25P20",
3867 .bustype = BUS_SPI,
3868 .manufacture_id = EON_ID_NOPREFIX,
3869 .model_id = EON_EN25B20,
3870 .total_size = 256,
3871 .page_size = 256,
3872 .feature_bits = FEATURE_WRSR_WREN,
3873 .tested = TEST_UNTESTED,
3874 .probe = probe_spi_rdid,
3875 .probe_timing = TIMING_ZERO,
3876 .block_erasers =
3877 {
3878 {
3879 .eraseblocks = { {64 * 1024, 4} },
3880 .block_erase = spi_block_erase_d8,
3881 }, {
3882 .eraseblocks = { {256 * 1024, 1} },
3883 .block_erase = spi_block_erase_c7,
3884 }
3885 },
3886 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3887 .unlock = spi_disable_blockprotect,
3888 .write = spi_chip_write_256,
3889 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003890 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003891 },
3892
3893 {
3894 .vendor = "Eon",
3895 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003896 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003897 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003898 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003899 .total_size = 512,
3900 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003901 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003902 .tested = TEST_UNTESTED,
3903 .probe = probe_spi_rdid,
3904 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003905 .block_erasers =
3906 {
3907 {
3908 .eraseblocks = {
3909 {4 * 1024, 2},
3910 {8 * 1024, 1},
3911 {16 * 1024, 1},
3912 {32 * 1024, 1},
3913 {64 * 1024, 7}
3914 },
3915 .block_erase = spi_block_erase_d8,
3916 }, {
3917 .eraseblocks = { {512 * 1024, 1} },
3918 .block_erase = spi_block_erase_c7,
3919 }
3920 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003921 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003922 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003923 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003924 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003925 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003926 },
3927
3928 {
3929 .vendor = "Eon",
3930 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003931 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003932 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003933 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003934 .total_size = 512,
3935 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003936 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003937 .tested = TEST_UNTESTED,
3938 .probe = probe_spi_rdid,
3939 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003940 .block_erasers =
3941 {
3942 {
3943 .eraseblocks = {
3944 {64 * 1024, 7},
3945 {32 * 1024, 1},
3946 {16 * 1024, 1},
3947 {8 * 1024, 1},
3948 {4 * 1024, 2},
3949 },
3950 .block_erase = spi_block_erase_d8,
3951 }, {
3952 .eraseblocks = { {512 * 1024, 1} },
3953 .block_erase = spi_block_erase_c7,
3954 }
3955 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003956 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003957 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003958 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003959 .read = spi_chip_read, /* Fast read (0x0B) supported */
3960 .voltage = {2700, 3600},
3961 },
3962
3963 {
3964 .vendor = "Eon",
3965 .name = "EN25P40",
3966 .bustype = BUS_SPI,
3967 .manufacture_id = EON_ID_NOPREFIX,
3968 .model_id = EON_EN25B40,
3969 .total_size = 512,
3970 .page_size = 256,
3971 .feature_bits = FEATURE_WRSR_WREN,
3972 .tested = TEST_UNTESTED,
3973 .probe = probe_spi_rdid,
3974 .probe_timing = TIMING_ZERO,
3975 .block_erasers =
3976 {
3977 {
3978 .eraseblocks = { {64 * 1024, 8} },
3979 .block_erase = spi_block_erase_d8,
3980 }, {
3981 .eraseblocks = { {512 * 1024, 1} },
3982 .block_erase = spi_block_erase_c7,
3983 }
3984 },
3985 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3986 .unlock = spi_disable_blockprotect,
3987 .write = spi_chip_write_256,
3988 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003989 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003990 },
3991
3992 {
3993 .vendor = "Eon",
3994 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003995 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003996 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003997 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003998 .total_size = 1024,
3999 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004000 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004001 .tested = TEST_UNTESTED,
4002 .probe = probe_spi_rdid,
4003 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004004 .block_erasers =
4005 {
4006 {
4007 .eraseblocks = {
4008 {4 * 1024, 2},
4009 {8 * 1024, 1},
4010 {16 * 1024, 1},
4011 {32 * 1024, 1},
4012 {64 * 1024, 15}
4013 },
4014 .block_erase = spi_block_erase_d8,
4015 }, {
4016 .eraseblocks = { {1024 * 1024, 1} },
4017 .block_erase = spi_block_erase_c7,
4018 }
4019 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004020 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004021 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004022 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004023 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004024 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004025 },
4026
4027 {
4028 .vendor = "Eon",
4029 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004030 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004031 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004032 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00004033 .total_size = 1024,
4034 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004035 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004036 .tested = TEST_UNTESTED,
4037 .probe = probe_spi_rdid,
4038 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004039 .block_erasers =
4040 {
4041 {
4042 .eraseblocks = {
4043 {64 * 1024, 15},
4044 {32 * 1024, 1},
4045 {16 * 1024, 1},
4046 {8 * 1024, 1},
4047 {4 * 1024, 2},
4048 },
4049 .block_erase = spi_block_erase_d8,
4050 }, {
4051 .eraseblocks = { {1024 * 1024, 1} },
4052 .block_erase = spi_block_erase_c7,
4053 }
4054 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004055 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004056 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004057 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004058 .read = spi_chip_read, /* Fast read (0x0B) supported */
4059 .voltage = {2700, 3600},
4060 },
4061
4062 {
4063 .vendor = "Eon",
4064 .name = "EN25P80",
4065 .bustype = BUS_SPI,
4066 .manufacture_id = EON_ID_NOPREFIX,
4067 .model_id = EON_EN25B80,
4068 .total_size = 1024,
4069 .page_size = 256,
4070 .feature_bits = FEATURE_WRSR_WREN,
4071 .tested = TEST_UNTESTED,
4072 .probe = probe_spi_rdid,
4073 .probe_timing = TIMING_ZERO,
4074 .block_erasers =
4075 {
4076 {
4077 .eraseblocks = { {64 * 1024, 16} },
4078 .block_erase = spi_block_erase_d8,
4079 }, {
4080 .eraseblocks = { {1024 * 1024, 1} },
4081 .block_erase = spi_block_erase_c7,
4082 }
4083 },
4084 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4085 .unlock = spi_disable_blockprotect,
4086 .write = spi_chip_write_256,
4087 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004088 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004089 },
4090
4091 {
4092 .vendor = "Eon",
4093 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004094 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004095 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004096 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004097 .total_size = 2048,
4098 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004099 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004100 .tested = TEST_UNTESTED,
4101 .probe = probe_spi_rdid,
4102 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004103 .block_erasers =
4104 {
4105 {
4106 .eraseblocks = {
4107 {4 * 1024, 2},
4108 {8 * 1024, 1},
4109 {16 * 1024, 1},
4110 {32 * 1024, 1},
4111 {64 * 1024, 31},
4112 },
4113 .block_erase = spi_block_erase_d8,
4114 }, {
4115 .eraseblocks = { {2 * 1024 * 1024, 1} },
4116 .block_erase = spi_block_erase_c7,
4117 }
4118 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004119 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004120 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004121 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004122 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004123 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004124 },
4125
4126 {
4127 .vendor = "Eon",
4128 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004129 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004130 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004131 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004132 .total_size = 2048,
4133 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004134 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004135 .tested = TEST_UNTESTED,
4136 .probe = probe_spi_rdid,
4137 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004138 .block_erasers =
4139 {
4140 {
4141 .eraseblocks = {
4142 {64 * 1024, 31},
4143 {32 * 1024, 1},
4144 {16 * 1024, 1},
4145 {8 * 1024, 1},
4146 {4 * 1024, 2},
4147 },
4148 .block_erase = spi_block_erase_d8,
4149 }, {
4150 .eraseblocks = { {2 * 1024 * 1024, 1} },
4151 .block_erase = spi_block_erase_c7,
4152 }
4153 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004154 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004155 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004156 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004157 .read = spi_chip_read, /* Fast read (0x0B) supported */
4158 .voltage = {2700, 3600},
4159 },
4160
4161 {
4162 .vendor = "Eon",
4163 .name = "EN25P16",
4164 .bustype = BUS_SPI,
4165 .manufacture_id = EON_ID_NOPREFIX,
4166 .model_id = EON_EN25B16,
4167 .total_size = 2048,
4168 .page_size = 256,
4169 .feature_bits = FEATURE_WRSR_WREN,
4170 .tested = TEST_UNTESTED,
4171 .probe = probe_spi_rdid,
4172 .probe_timing = TIMING_ZERO,
4173 .block_erasers =
4174 {
4175 {
4176 .eraseblocks = { {64 * 1024, 32} },
4177 .block_erase = spi_block_erase_d8,
4178 }, {
4179 .eraseblocks = { {2 * 1024 * 1024, 1} },
4180 .block_erase = spi_block_erase_c7,
4181 }
4182 },
4183 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4184 .unlock = spi_disable_blockprotect,
4185 .write = spi_chip_write_256,
4186 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004187 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004188 },
4189
4190 {
4191 .vendor = "Eon",
4192 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004193 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004194 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004195 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004196 .total_size = 4096,
4197 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004198 /* OTP: 512B total; enter 0x3A */
4199 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004200 .tested = TEST_UNTESTED,
4201 .probe = probe_spi_rdid,
4202 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004203 .block_erasers =
4204 {
4205 {
4206 .eraseblocks = {
4207 {4 * 1024, 2},
4208 {8 * 1024, 1},
4209 {16 * 1024, 1},
4210 {32 * 1024, 1},
4211 {64 * 1024, 63},
4212 },
4213 .block_erase = spi_block_erase_d8,
4214 }, {
4215 .eraseblocks = { {4 * 1024 * 1024, 1} },
4216 .block_erase = spi_block_erase_c7,
4217 }
4218 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004219 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004220 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004221 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004222 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004223 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004224 },
4225
4226 {
4227 .vendor = "Eon",
4228 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004229 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004230 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004231 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004232 .total_size = 4096,
4233 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004234 /* OTP: 512B total; enter 0x3A */
4235 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004236 .tested = TEST_UNTESTED,
4237 .probe = probe_spi_rdid,
4238 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004239 .block_erasers =
4240 {
4241 {
4242 .eraseblocks = {
4243 {64 * 1024, 63},
4244 {32 * 1024, 1},
4245 {16 * 1024, 1},
4246 {8 * 1024, 1},
4247 {4 * 1024, 2},
4248 },
4249 .block_erase = spi_block_erase_d8,
4250 }, {
4251 .eraseblocks = { {4 * 1024 * 1024, 1} },
4252 .block_erase = spi_block_erase_c7,
4253 }
4254 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004255 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004256 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004257 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004258 .read = spi_chip_read, /* Fast read (0x0B) supported */
4259 .voltage = {2700, 3600},
4260 },
4261
4262 {
4263 .vendor = "Eon",
4264 .name = "EN25P32", /* Uniform version of EN25B32 */
4265 .bustype = BUS_SPI,
4266 .manufacture_id = EON_ID_NOPREFIX,
4267 .model_id = EON_EN25B32,
4268 .total_size = 4096,
4269 .page_size = 256,
4270 /* OTP: 512B total; enter 0x3A */
4271 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4272 .tested = TEST_UNTESTED,
4273 .probe = probe_spi_rdid,
4274 .probe_timing = TIMING_ZERO,
4275 .block_erasers =
4276 {
4277 {
4278 .eraseblocks = { {64 * 1024, 64} },
4279 .block_erase = spi_block_erase_d8,
4280 }, {
4281 .eraseblocks = { {4 * 1024 * 1024, 1} },
4282 .block_erase = spi_block_erase_c7,
4283 }
4284 },
4285 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4286 .unlock = spi_disable_blockprotect,
4287 .write = spi_chip_write_256,
4288 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004289 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004290 },
4291
4292 {
4293 .vendor = "Eon",
4294 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004295 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004296 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004297 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004298 .total_size = 8192,
4299 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004300 /* OTP: 512B total; enter 0x3A */
4301 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004302 .tested = TEST_UNTESTED,
4303 .probe = probe_spi_rdid,
4304 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004305 .block_erasers =
4306 {
4307 {
4308 .eraseblocks = {
4309 {4 * 1024, 2},
4310 {8 * 1024, 1},
4311 {16 * 1024, 1},
4312 {32 * 1024, 1},
4313 {64 * 1024, 127},
4314 },
4315 .block_erase = spi_block_erase_d8,
4316 }, {
4317 .eraseblocks = { {8 * 1024 * 1024, 1} },
4318 .block_erase = spi_block_erase_c7,
4319 }
4320 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004321 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004322 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004323 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004324 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004325 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004326 },
4327
4328 {
4329 .vendor = "Eon",
4330 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004331 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004332 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004333 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004334 .total_size = 8192,
4335 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004336 /* OTP: 512B total; enter 0x3A */
4337 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004338 .tested = TEST_UNTESTED,
4339 .probe = probe_spi_rdid,
4340 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004341 .block_erasers =
4342 {
4343 {
4344 .eraseblocks = {
4345 {64 * 1024, 127},
4346 {32 * 1024, 1},
4347 {16 * 1024, 1},
4348 {8 * 1024, 1},
4349 {4 * 1024, 2},
4350 },
4351 .block_erase = spi_block_erase_d8,
4352 }, {
4353 .eraseblocks = { {8 * 1024 * 1024, 1} },
4354 .block_erase = spi_block_erase_c7,
4355 }
4356 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004357 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004358 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004359 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004360 .read = spi_chip_read, /* Fast read (0x0B) supported */
4361 .voltage = {2700, 3600},
4362 },
4363
4364 {
4365 .vendor = "Eon",
4366 .name = "EN25P64",
4367 .bustype = BUS_SPI,
4368 .manufacture_id = EON_ID_NOPREFIX,
4369 .model_id = EON_EN25B64,
4370 .total_size = 8192,
4371 .page_size = 256,
4372 /* OTP: 512B total; enter 0x3A */
4373 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4374 .tested = TEST_UNTESTED,
4375 .probe = probe_spi_rdid,
4376 .probe_timing = TIMING_ZERO,
4377 .block_erasers =
4378 {
4379 {
4380 .eraseblocks = { {64 * 1024, 128} },
4381 .block_erase = spi_block_erase_d8,
4382 }, {
4383 .eraseblocks = { {8 * 1024 * 1024, 1} },
4384 .block_erase = spi_block_erase_c7,
4385 }
4386 },
4387 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4388 .unlock = spi_disable_blockprotect,
4389 .write = spi_chip_write_256,
4390 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004391 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004392 },
4393
4394 {
4395 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004396 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004397 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004398 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004399 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004400 .total_size = 64,
4401 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004402 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004403 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004404 .probe = probe_spi_rdid,
4405 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004406 .block_erasers =
4407 {
4408 {
4409 .eraseblocks = { {4 * 1024, 16} },
4410 .block_erase = spi_block_erase_20,
4411 }, {
4412 .eraseblocks = { {32 * 1024, 2} },
4413 .block_erase = spi_block_erase_d8,
4414 }, {
4415 .eraseblocks = { {32 * 1024, 2} },
4416 .block_erase = spi_block_erase_52,
4417 }, {
4418 .eraseblocks = { {64 * 1024, 1} },
4419 .block_erase = spi_block_erase_60,
4420 }, {
4421 .eraseblocks = { {64 * 1024, 1} },
4422 .block_erase = spi_block_erase_c7,
4423 }
4424 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004425 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004426 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004427 .write = spi_chip_write_256,
4428 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004429 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004430 },
4431
4432 {
4433 .vendor = "Eon",
4434 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004435 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004436 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004437 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004438 .total_size = 128,
4439 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004440 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004441 .tested = TEST_UNTESTED,
4442 .probe = probe_spi_rdid,
4443 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004444 .block_erasers =
4445 {
4446 {
4447 .eraseblocks = { {4 * 1024, 32} },
4448 .block_erase = spi_block_erase_20,
4449 }, {
4450 .eraseblocks = { {32 * 1024, 4} },
4451 .block_erase = spi_block_erase_d8,
4452 }, {
4453 .eraseblocks = { {32 * 1024, 4} },
4454 .block_erase = spi_block_erase_52,
4455 }, {
4456 .eraseblocks = { {128 * 1024, 1} },
4457 .block_erase = spi_block_erase_60,
4458 }, {
4459 .eraseblocks = { {128 * 1024, 1} },
4460 .block_erase = spi_block_erase_c7,
4461 }
4462 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004463 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004464 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004465 .write = spi_chip_write_256,
4466 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004467 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004468 },
4469
4470 {
4471 .vendor = "Eon",
4472 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004473 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004474 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004475 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004476 .total_size = 256,
4477 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004478 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004479 .tested = TEST_UNTESTED,
4480 .probe = probe_spi_rdid,
4481 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004482 .block_erasers =
4483 {
4484 {
4485 .eraseblocks = { {4 * 1024, 64} },
4486 .block_erase = spi_block_erase_20,
4487 }, {
4488 .eraseblocks = { {64 * 1024, 4} },
4489 .block_erase = spi_block_erase_d8,
4490 }, {
4491 .eraseblocks = { {64 * 1024, 4} },
4492 .block_erase = spi_block_erase_52,
4493 }, {
4494 .eraseblocks = { {256 * 1024, 1} },
4495 .block_erase = spi_block_erase_60,
4496 }, {
4497 .eraseblocks = { {256 * 1024, 1} },
4498 .block_erase = spi_block_erase_c7,
4499 }
4500 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004501 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004502 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004503 .write = spi_chip_write_256,
4504 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004505 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004506 },
4507
4508 {
4509 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004510 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004511 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004512 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004513 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004514 .total_size = 512,
4515 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004516 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004517 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004518 .probe = probe_spi_rdid,
4519 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004520 .block_erasers =
4521 {
4522 {
Sean Nelson54596372010-01-09 05:30:14 +00004523 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004524 .block_erase = spi_block_erase_20,
4525 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004526 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004527 .block_erase = spi_block_erase_d8,
4528 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004529 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004530 .block_erase = spi_block_erase_60,
4531 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004532 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004533 .block_erase = spi_block_erase_c7,
4534 },
4535 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004536 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004537 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004538 .write = spi_chip_write_256,
4539 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004540 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004541 },
4542
4543 {
4544 .vendor = "Eon",
4545 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004546 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004547 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004548 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004549 .total_size = 1024,
4550 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004551 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004552 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004553 .probe = probe_spi_rdid,
4554 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004555 .block_erasers =
4556 {
4557 {
4558 .eraseblocks = { {4 * 1024, 256} },
4559 .block_erase = spi_block_erase_20,
4560 }, {
4561 .eraseblocks = { {64 * 1024, 16} },
4562 .block_erase = spi_block_erase_d8,
4563 }, {
4564 .eraseblocks = { {1024 * 1024, 1} },
4565 .block_erase = spi_block_erase_60,
4566 }, {
4567 .eraseblocks = { {1024 * 1024, 1} },
4568 .block_erase = spi_block_erase_c7,
4569 }
4570 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004571 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004572 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004573 .write = spi_chip_write_256,
4574 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004575 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004576 },
4577
4578 {
4579 .vendor = "Eon",
4580 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004581 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004582 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004583 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004584 .total_size = 2048,
4585 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004586 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004587 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004588 .probe = probe_spi_rdid,
4589 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004590 .block_erasers =
4591 {
4592 {
4593 .eraseblocks = { {4 * 1024, 512} },
4594 .block_erase = spi_block_erase_20,
4595 }, {
4596 .eraseblocks = { {64 * 1024, 32} },
4597 .block_erase = spi_block_erase_d8,
4598 }, {
4599 .eraseblocks = { {2 * 1024 * 1024, 1} },
4600 .block_erase = spi_block_erase_60,
4601 }, {
4602 .eraseblocks = { {2 * 1024 * 1024, 1} },
4603 .block_erase = spi_block_erase_c7,
4604 }
4605 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004606 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004607 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004608 .write = spi_chip_write_256,
4609 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004610 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004611 },
4612
4613 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004614 .vendor = "Eon",
4615 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004616 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004617 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004618 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004619 .total_size = 4096,
4620 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004621 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004622 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004623 .probe = probe_spi_rdid,
4624 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004625 .block_erasers =
4626 {
4627 {
4628 .eraseblocks = { {4 * 1024, 1024} },
4629 .block_erase = spi_block_erase_20,
4630 }, {
4631 .eraseblocks = { {64 * 1024, 64} },
4632 .block_erase = spi_block_erase_d8,
4633 }, {
4634 .eraseblocks = { {4 * 1024 * 1024, 1} },
4635 .block_erase = spi_block_erase_60,
4636 }, {
4637 .eraseblocks = { {4 * 1024 * 1024, 1} },
4638 .block_erase = spi_block_erase_c7,
4639 }
4640 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004641 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004642 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004643 .write = spi_chip_write_256,
4644 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004645 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004646 },
4647
4648 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004649 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004650 .name = "EN25F64",
4651 .bustype = BUS_SPI,
4652 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004653 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004654 .total_size = 8192,
4655 .page_size = 256,
4656 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004657 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004658 .probe = probe_spi_rdid,
4659 .probe_timing = TIMING_ZERO,
4660 .block_erasers =
4661 {
4662 {
4663 .eraseblocks = { {4 * 1024, 2048} },
4664 .block_erase = spi_block_erase_20,
4665 }, {
4666 .eraseblocks = { {64 * 1024, 128} },
4667 .block_erase = spi_block_erase_d8,
4668 }, {
4669 .eraseblocks = { {8 * 1024 * 1024, 1} },
4670 .block_erase = spi_block_erase_60,
4671 }, {
4672 .eraseblocks = { {8 * 1024 * 1024, 1} },
4673 .block_erase = spi_block_erase_c7,
4674 }
4675 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004676 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004677 .unlock = spi_disable_blockprotect,
4678 .write = spi_chip_write_256,
4679 .read = spi_chip_read,
4680 .voltage = {2700, 3600},
4681 },
4682
4683 {
4684 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004685 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004686 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004687 .manufacture_id = EON_ID_NOPREFIX,
4688 .model_id = EON_EN25Q40,
4689 .total_size = 512,
4690 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004691 /* OTP: 256B total; enter 0x3A */
4692 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004693 .tested = TEST_UNTESTED,
4694 .probe = probe_spi_rdid,
4695 .probe_timing = TIMING_ZERO,
4696 .block_erasers =
4697 {
4698 {
4699 .eraseblocks = { {4 * 1024, 128} },
4700 .block_erase = spi_block_erase_20,
4701 }, {
4702 .eraseblocks = { {64 * 1024, 8} },
4703 .block_erase = spi_block_erase_d8,
4704 }, {
4705 .eraseblocks = { {512 * 1024, 1} },
4706 .block_erase = spi_block_erase_60,
4707 }, {
4708 .eraseblocks = { {512 * 1024, 1} },
4709 .block_erase = spi_block_erase_c7,
4710 }
4711 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004712 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004713 .unlock = spi_disable_blockprotect,
4714 .write = spi_chip_write_256,
4715 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004716 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004717 },
4718
4719 {
4720 .vendor = "Eon",
4721 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004722 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004723 .manufacture_id = EON_ID_NOPREFIX,
4724 .model_id = EON_EN25Q80,
4725 .total_size = 1024,
4726 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004727 /* OTP: 256B total; enter 0x3A */
4728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004729 .tested = TEST_UNTESTED,
4730 .probe = probe_spi_rdid,
4731 .probe_timing = TIMING_ZERO,
4732 .block_erasers =
4733 {
4734 {
4735 .eraseblocks = { {4 * 1024, 256} },
4736 .block_erase = spi_block_erase_20,
4737 }, {
4738 .eraseblocks = { {64 * 1024, 16} },
4739 .block_erase = spi_block_erase_d8,
4740 }, {
4741 .eraseblocks = { {1024 * 1024, 1} },
4742 .block_erase = spi_block_erase_60,
4743 }, {
4744 .eraseblocks = { {1024 * 1024, 1} },
4745 .block_erase = spi_block_erase_c7,
4746 }
4747 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004748 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004749 .unlock = spi_disable_blockprotect,
4750 .write = spi_chip_write_256,
4751 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004752 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004753 },
4754
4755 {
4756 /* Note: EN25D16 is an evil twin which shares the model ID
4757 but has different write protection capabilities */
4758 .vendor = "Eon",
4759 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004760 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004761 .manufacture_id = EON_ID_NOPREFIX,
4762 .model_id = EON_EN25Q16,
4763 .total_size = 2048,
4764 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004765 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4766 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004767 .tested = TEST_UNTESTED,
4768 .probe = probe_spi_rdid,
4769 .probe_timing = TIMING_ZERO,
4770 .block_erasers =
4771 {
4772 {
4773 .eraseblocks = { {4 * 1024, 512} },
4774 .block_erase = spi_block_erase_20,
4775 }, {
4776 .eraseblocks = { {64 * 1024, 32} },
4777 .block_erase = spi_block_erase_d8,
4778 }, {
4779 /* not supported by Q16 version */
4780 .eraseblocks = { {64 * 1024, 32} },
4781 .block_erase = spi_block_erase_52,
4782 }, {
4783 .eraseblocks = { {2 * 1024 * 1024, 1} },
4784 .block_erase = spi_block_erase_60,
4785 }, {
4786 .eraseblocks = { {2 * 1024 * 1024, 1} },
4787 .block_erase = spi_block_erase_c7,
4788 }
4789 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004790 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004791 .unlock = spi_disable_blockprotect,
4792 .write = spi_chip_write_256,
4793 .read = spi_chip_read,
4794 .voltage = {2700, 3600},
4795 },
4796
4797 {
4798 .vendor = "Eon",
4799 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004800 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004801 .manufacture_id = EON_ID_NOPREFIX,
4802 .model_id = EON_EN25Q32,
4803 .total_size = 4096,
4804 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004805 /* OTP: 512B total; enter 0x3A */
4806 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004807 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004808 .probe = probe_spi_rdid,
4809 .probe_timing = TIMING_ZERO,
4810 .block_erasers =
4811 {
4812 {
4813 .eraseblocks = { {4 * 1024, 1024} },
4814 .block_erase = spi_block_erase_20,
4815 }, {
4816 .eraseblocks = { {64 * 1024, 64} },
4817 .block_erase = spi_block_erase_d8,
4818 }, {
4819 .eraseblocks = { {4 * 1024 * 1024, 1} },
4820 .block_erase = spi_block_erase_60,
4821 }, {
4822 .eraseblocks = { {4 * 1024 * 1024, 1} },
4823 .block_erase = spi_block_erase_c7,
4824 }
4825 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004826 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004827 .unlock = spi_disable_blockprotect,
4828 .write = spi_chip_write_256,
4829 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004830 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004831 },
4832
4833 {
4834 .vendor = "Eon",
4835 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004836 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004837 .manufacture_id = EON_ID_NOPREFIX,
4838 .model_id = EON_EN25Q64,
4839 .total_size = 8192,
4840 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004841 /* OTP: 512B total; enter 0x3A */
4842 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004843 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004844 .probe = probe_spi_rdid,
4845 .probe_timing = TIMING_ZERO,
4846 .block_erasers =
4847 {
4848 {
4849 .eraseblocks = { {4 * 1024, 2048} },
4850 .block_erase = spi_block_erase_20,
4851 }, {
4852 .eraseblocks = { {64 * 1024, 128} },
4853 .block_erase = spi_block_erase_d8,
4854 }, {
4855 .eraseblocks = { {8 * 1024 * 1024, 1} },
4856 .block_erase = spi_block_erase_60,
4857 }, {
4858 .eraseblocks = { {8 * 1024 * 1024, 1} },
4859 .block_erase = spi_block_erase_c7,
4860 }
4861 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004862 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004863 .unlock = spi_disable_blockprotect,
4864 .write = spi_chip_write_256,
4865 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004866 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004867 },
4868
4869 {
4870 .vendor = "Eon",
4871 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004872 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004873 .manufacture_id = EON_ID_NOPREFIX,
4874 .model_id = EON_EN25Q128,
4875 .total_size = 16384,
4876 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004877 /* OTP: 512B total; enter 0x3A */
4878 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0be072c2016-03-13 15:16:30 +00004879 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004880 .probe = probe_spi_rdid,
4881 .probe_timing = TIMING_ZERO,
4882 .block_erasers =
4883 {
4884 {
4885 .eraseblocks = { {4 * 1024, 4096} },
4886 .block_erase = spi_block_erase_20,
4887 }, {
4888 .eraseblocks = { {64 * 1024, 256} },
4889 .block_erase = spi_block_erase_d8,
4890 }, {
4891 .eraseblocks = { {16 * 1024 * 1024, 1} },
4892 .block_erase = spi_block_erase_60,
4893 }, {
4894 .eraseblocks = { {16 * 1024 * 1024, 1} },
4895 .block_erase = spi_block_erase_c7,
4896 }
4897 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004898 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004899 .unlock = spi_disable_blockprotect,
4900 .write = spi_chip_write_256,
4901 .read = spi_chip_read,
4902 },
4903
4904 {
4905 .vendor = "Eon",
4906 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004907 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004908 .manufacture_id = EON_ID_NOPREFIX,
4909 .model_id = EON_EN25QH16,
4910 .total_size = 2048,
4911 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004912 /* supports SFDP */
4913 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004914 /* QPI enable 0x38, disable 0xFF */
4915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004916 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004917 .probe = probe_spi_rdid,
4918 .probe_timing = TIMING_ZERO,
4919 .block_erasers =
4920 {
4921 {
4922 .eraseblocks = { {4 * 1024, 512} },
4923 .block_erase = spi_block_erase_20,
4924 }, {
4925 .eraseblocks = { {64 * 1024, 32} },
4926 .block_erase = spi_block_erase_d8,
4927 }, {
4928 .eraseblocks = { {1024 * 2048, 1} },
4929 .block_erase = spi_block_erase_60,
4930 }, {
4931 .eraseblocks = { {1024 * 2048, 1} },
4932 .block_erase = spi_block_erase_c7,
4933 }
4934 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004935 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004936 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004937 .write = spi_chip_write_256,
4938 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004939 .voltage = {2700, 3600},
4940 },
4941
4942 {
4943 .vendor = "Eon",
4944 .name = "EN25QH32",
4945 .bustype = BUS_SPI,
4946 .manufacture_id = EON_ID_NOPREFIX,
4947 .model_id = EON_EN25QH32,
4948 .total_size = 4096,
4949 .page_size = 256,
4950 /* supports SFDP */
4951 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004952 /* QPI enable 0x38, disable 0xFF */
4953 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004954 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004955 .probe = probe_spi_rdid,
4956 .probe_timing = TIMING_ZERO,
4957 .block_erasers =
4958 {
4959 {
4960 .eraseblocks = { {4 * 1024, 1024} },
4961 .block_erase = spi_block_erase_20,
4962 }, {
4963 .eraseblocks = { {64 * 1024, 64} },
4964 .block_erase = spi_block_erase_d8,
4965 }, {
4966 .eraseblocks = { {1024 * 4096, 1} },
4967 .block_erase = spi_block_erase_60,
4968 }, {
4969 .eraseblocks = { {1024 * 4096, 1} },
4970 .block_erase = spi_block_erase_c7,
4971 }
4972 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004973 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004974 .unlock = spi_disable_blockprotect_bp3_srwd,
4975 .write = spi_chip_write_256,
4976 .read = spi_chip_read,
4977 .voltage = {2700, 3600},
4978 },
4979
4980 {
4981 .vendor = "Eon",
4982 .name = "EN25QH64",
4983 .bustype = BUS_SPI,
4984 .manufacture_id = EON_ID_NOPREFIX,
4985 .model_id = EON_EN25QH64,
4986 .total_size = 8192,
4987 .page_size = 256,
4988 /* supports SFDP */
4989 /* OTP: 512B total; enter 0x3A */
4990 /* QPI enable 0x38, disable 0xFF */
4991 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004992 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004993 .probe = probe_spi_rdid,
4994 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10004995 .block_erasers =
4996 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004997 {
4998 .eraseblocks = { {4 * 1024, 2048} },
4999 .block_erase = spi_block_erase_20,
5000 }, {
5001 .eraseblocks = { {64 * 1024, 128} },
5002 .block_erase = spi_block_erase_d8,
5003 }, {
5004 .eraseblocks = { { 8192 * 1024, 1} },
5005 .block_erase = spi_block_erase_60,
5006 }, {
5007 .eraseblocks = { { 8192 * 1024, 1} },
5008 .block_erase = spi_block_erase_c7,
5009 }
5010 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005011 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005012 .unlock = spi_disable_blockprotect_bp3_srwd,
5013 .write = spi_chip_write_256,
5014 .read = spi_chip_read,
5015 .voltage = {2700, 3600},
5016 },
5017
5018 {
5019 .vendor = "Eon",
5020 .name = "EN25QH128",
5021 .bustype = BUS_SPI,
5022 .manufacture_id = EON_ID_NOPREFIX,
5023 .model_id = EON_EN25QH128,
5024 .total_size = 16384,
5025 .page_size = 256,
5026 /* supports SFDP */
5027 /* OTP: 512B total; enter 0x3A */
5028 /* QPI enable 0x38, disable 0xFF */
5029 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5030 .tested = TEST_UNTESTED,
5031 .probe = probe_spi_rdid,
5032 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005033 .block_erasers =
5034 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005035 {
5036 .eraseblocks = { {4 * 1024, 4096} },
5037 .block_erase = spi_block_erase_20,
5038 }, {
5039 .eraseblocks = { {64 * 1024, 256} },
5040 .block_erase = spi_block_erase_d8,
5041 }, {
5042 .eraseblocks = { { 16384 * 1024, 1} },
5043 .block_erase = spi_block_erase_60,
5044 }, {
5045 .eraseblocks = { { 16384 * 1024, 1} },
5046 .block_erase = spi_block_erase_c7,
5047 }
5048 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005049 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005050 .unlock = spi_disable_blockprotect_bp3_srwd,
5051 .write = spi_chip_write_256,
5052 .read = spi_chip_read,
5053 .voltage = {2700, 3600},
5054 },
5055
5056 {
5057 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005058 .name = "EN25S10",
5059 .bustype = BUS_SPI,
5060 .manufacture_id = EON_ID_NOPREFIX,
5061 .model_id = EON_EN25S10,
5062 .total_size = 128,
5063 .page_size = 256,
5064 /* OTP: 256B total; enter 0x3A */
5065 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5066 .tested = TEST_UNTESTED,
5067 .probe = probe_spi_rdid,
5068 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005069 .block_erasers =
5070 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005071 {
5072 .eraseblocks = { {4 * 1024, 32} },
5073 .block_erase = spi_block_erase_20,
5074 }, {
5075 .eraseblocks = { {32 * 1024, 4} },
5076 .block_erase = spi_block_erase_52,
5077 }, {
5078 .eraseblocks = { {128 * 1024, 1} },
5079 .block_erase = spi_block_erase_60,
5080 }, {
5081 .eraseblocks = { {128 * 1024, 1} },
5082 .block_erase = spi_block_erase_c7,
5083 }
5084 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005085 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005086 .unlock = spi_disable_blockprotect,
5087 .write = spi_chip_write_256,
5088 .read = spi_chip_read,
5089 .voltage = {1650, 1950},
5090 },
5091
5092 {
5093 .vendor = "Eon",
5094 .name = "EN25S20",
5095 .bustype = BUS_SPI,
5096 .manufacture_id = EON_ID_NOPREFIX,
5097 .model_id = EON_EN25S20,
5098 .total_size = 256,
5099 .page_size = 256,
5100 /* OTP: 256B total; enter 0x3A */
5101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5102 .tested = TEST_UNTESTED,
5103 .probe = probe_spi_rdid,
5104 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005105 .block_erasers =
5106 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005107 {
5108 .eraseblocks = { {4 * 1024, 64} },
5109 .block_erase = spi_block_erase_20,
5110 }, {
5111 .eraseblocks = { {64 * 1024, 4} },
5112 .block_erase = spi_block_erase_d8,
5113 }, {
5114 .eraseblocks = { {256 * 1024, 1} },
5115 .block_erase = spi_block_erase_60,
5116 }, {
5117 .eraseblocks = { {256 * 1024, 1} },
5118 .block_erase = spi_block_erase_c7,
5119 }
5120 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005121 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005122 .unlock = spi_disable_blockprotect,
5123 .write = spi_chip_write_256,
5124 .read = spi_chip_read,
5125 .voltage = {1650, 1950},
5126 },
5127
5128 {
5129 .vendor = "Eon",
5130 .name = "EN25S40",
5131 .bustype = BUS_SPI,
5132 .manufacture_id = EON_ID_NOPREFIX,
5133 .model_id = EON_EN25S40,
5134 .total_size = 512,
5135 .page_size = 256,
5136 /* OTP: 256B total; enter 0x3A */
5137 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Ponsc748be52018-09-30 17:23:03 +02005138 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005139 .probe = probe_spi_rdid,
5140 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005141 .block_erasers =
5142 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005143 {
5144 .eraseblocks = { {4 * 1024, 128} },
5145 .block_erase = spi_block_erase_20,
5146 }, {
5147 .eraseblocks = { {64 * 1024, 8} },
5148 .block_erase = spi_block_erase_d8,
5149 }, {
5150 .eraseblocks = { {512 * 1024, 1} },
5151 .block_erase = spi_block_erase_60,
5152 }, {
5153 .eraseblocks = { {512 * 1024, 1} },
5154 .block_erase = spi_block_erase_c7,
5155 }
5156 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005157 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005158 .unlock = spi_disable_blockprotect,
5159 .write = spi_chip_write_256,
5160 .read = spi_chip_read,
5161 .voltage = {1650, 1950},
5162 },
5163
5164 {
5165 .vendor = "Eon",
5166 .name = "EN25S80",
5167 .bustype = BUS_SPI,
5168 .manufacture_id = EON_ID_NOPREFIX,
5169 .model_id = EON_EN25S80,
5170 .total_size = 1024,
5171 .page_size = 256,
5172 /* OTP: 256B total; enter 0x3A */
5173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5174 .tested = TEST_UNTESTED,
5175 .probe = probe_spi_rdid,
5176 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005177 .block_erasers =
5178 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005179 {
5180 .eraseblocks = { {4 * 1024, 256} },
5181 .block_erase = spi_block_erase_20,
5182 }, {
5183 .eraseblocks = { {64 * 1024, 16} },
5184 .block_erase = spi_block_erase_d8,
5185 }, {
5186 .eraseblocks = { {1024 * 1024, 1} },
5187 .block_erase = spi_block_erase_60,
5188 }, {
5189 .eraseblocks = { {1024 * 1024, 1} },
5190 .block_erase = spi_block_erase_c7,
5191 }
5192 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005193 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005194 .unlock = spi_disable_blockprotect,
5195 .write = spi_chip_write_256,
5196 .read = spi_chip_read,
5197 .voltage = {1650, 1950},
5198 },
5199
5200 {
5201 .vendor = "Eon",
5202 .name = "EN25S16",
5203 .bustype = BUS_SPI,
5204 .manufacture_id = EON_ID_NOPREFIX,
5205 .model_id = EON_EN25S16,
5206 .total_size = 2048,
5207 .page_size = 256,
5208 /* OTP: 512B total; enter 0x3A */
5209 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5210 .tested = TEST_UNTESTED,
5211 .probe = probe_spi_rdid,
5212 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005213 .block_erasers =
5214 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005215 {
5216 .eraseblocks = { {4 * 1024, 512} },
5217 .block_erase = spi_block_erase_20,
5218 }, {
5219 .eraseblocks = { {64 * 1024, 32} },
5220 .block_erase = spi_block_erase_52,
5221 }, {
5222 .eraseblocks = { {32 * 1024, 64} },
5223 .block_erase = spi_block_erase_d8,
5224 }, {
5225 .eraseblocks = { {2048 * 1024, 1} },
5226 .block_erase = spi_block_erase_60,
5227 }, {
5228 .eraseblocks = { {2048 * 1024, 1} },
5229 .block_erase = spi_block_erase_c7,
5230 }
5231 },
5232 .printlock = spi_prettyprint_status_register_en25s_wp,
5233 .unlock = spi_disable_blockprotect_bp3_srwd,
5234 .write = spi_chip_write_256,
5235 .read = spi_chip_read,
5236 .voltage = {1650, 1950},
5237 },
5238
5239 {
5240 .vendor = "Eon",
5241 .name = "EN25S32",
5242 .bustype = BUS_SPI,
5243 .manufacture_id = EON_ID_NOPREFIX,
5244 .model_id = EON_EN25S32,
5245 .total_size = 4096,
5246 .page_size = 256,
5247 /* OTP: 512B total; enter 0x3A */
5248 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5249 .tested = TEST_UNTESTED,
5250 .probe = probe_spi_rdid,
5251 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005252 .block_erasers =
5253 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005254 {
5255 .eraseblocks = { {4 * 1024, 1024} },
5256 .block_erase = spi_block_erase_20,
5257 }, {
5258 .eraseblocks = { {32 * 1024, 128} },
5259 .block_erase = spi_block_erase_52,
5260 }, {
5261 .eraseblocks = { {64 * 1024, 64} },
5262 .block_erase = spi_block_erase_d8,
5263 }, {
5264 .eraseblocks = { {4096 * 1024, 1} },
5265 .block_erase = spi_block_erase_60,
5266 }, {
5267 .eraseblocks = { {4096 * 1024, 1} },
5268 .block_erase = spi_block_erase_c7,
5269 }
5270 },
5271 .printlock = spi_prettyprint_status_register_en25s_wp,
5272 .unlock = spi_disable_blockprotect_bp3_srwd,
5273 .write = spi_chip_write_256,
5274 .read = spi_chip_read,
5275 .voltage = {1650, 1950},
5276 },
5277
5278 {
5279 .vendor = "Eon",
5280 .name = "EN25S64",
5281 .bustype = BUS_SPI,
5282 .manufacture_id = EON_ID_NOPREFIX,
5283 .model_id = EON_EN25S64,
5284 .total_size = 8192,
5285 .page_size = 256,
5286 /* OTP: 512B total; enter 0x3A */
5287 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5288 .tested = TEST_UNTESTED,
5289 .probe = probe_spi_rdid,
5290 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005291 .block_erasers =
5292 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005293 {
5294 .eraseblocks = { {4 * 1024, 2048} },
5295 .block_erase = spi_block_erase_20,
5296 }, {
5297 .eraseblocks = { {64 * 1024, 128} },
5298 .block_erase = spi_block_erase_d8,
5299 }, {
5300 .eraseblocks = { {8192 * 1024, 1} },
5301 .block_erase = spi_block_erase_60,
5302 }, {
5303 .eraseblocks = { {8192 * 1024, 1} },
5304 .block_erase = spi_block_erase_c7,
5305 }
5306 },
5307 .printlock = spi_prettyprint_status_register_en25s_wp,
5308 .unlock = spi_disable_blockprotect_bp3_srwd,
5309 .write = spi_chip_write_256,
5310 .read = spi_chip_read,
5311 .voltage = {1650, 1950},
5312 },
5313
5314 {
5315 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00005316 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005317 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00005318 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005319 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00005320 .total_size = 128,
5321 .page_size = 128,
5322 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005323 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00005324 .probe = probe_jedec,
5325 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5326 .block_erasers =
5327 {
5328 {
5329 .eraseblocks = { {16 * 1024, 8} },
5330 .block_erase = erase_sector_jedec,
5331 },
5332 {
5333 .eraseblocks = { {128 * 1024, 1} },
5334 .block_erase = erase_chip_block_jedec,
5335 },
5336 },
5337 .write = write_jedec_1,
5338 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005339 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00005340 },
5341
5342 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005343 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005344 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005345 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005346 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005347 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005348 .total_size = 256,
5349 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005350 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005351 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005352 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005353 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005354 .block_erasers =
5355 {
5356 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005357 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005358 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005359 {8 * 1024, 2},
5360 {32 * 1024, 1},
5361 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005362 },
5363 .block_erase = erase_sector_jedec,
5364 }, {
5365 .eraseblocks = { {256 * 1024, 1} },
5366 .block_erase = erase_chip_block_jedec,
5367 },
5368 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005369 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005370 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005371 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005372 },
5373
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005374 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005375 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005376 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005377 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005378 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005379 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005380 .total_size = 256,
5381 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005382 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005383 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005384 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005385 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005386 .block_erasers =
5387 {
5388 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005389 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005390 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005391 {32 * 1024, 1},
5392 {8 * 1024, 2},
5393 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005394 },
5395 .block_erase = erase_sector_jedec,
5396 }, {
5397 .eraseblocks = { {256 * 1024, 1} },
5398 .block_erase = erase_chip_block_jedec,
5399 },
5400 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005401 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005402 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005403 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005404 },
5405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005406 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005407 .vendor = "Eon",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005408 .name = "EN29LV040(A)",
5409 .bustype = BUS_PARALLEL,
5410 .manufacture_id = EON_ID,
5411 .model_id = EON_EN29LV040,
5412 .total_size = 512,
5413 .page_size = 4 * 1024,
5414 .tested = TEST_OK_PREW,
5415 .probe = probe_jedec,
5416 .probe_timing = TIMING_ZERO,
5417 .block_erasers =
5418 {
5419 {
5420 .eraseblocks = { {64 * 1024, 8} },
5421 .block_erase = erase_sector_jedec,
5422 },
5423 {
5424 .eraseblocks = { {512 * 1024, 1} },
5425 .block_erase = erase_chip_block_jedec,
5426 },
5427 },
5428 .write = write_jedec_1,
5429 .read = read_memmapped,
5430 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5431 },
5432
5433 {
5434 .vendor = "Eon",
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005435 .name = "EN29LV640B",
5436 .bustype = BUS_PARALLEL,
5437 .manufacture_id = EON_ID,
5438 .model_id = EON_EN29LV640B,
5439 .total_size = 8192,
5440 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005441 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005442 .tested = TEST_OK_PREW,
5443 .probe = probe_en29lv640b,
5444 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5445 .block_erasers =
5446 {
5447 {
5448 .eraseblocks = {
5449 {8 * 1024, 8},
5450 {64 * 1024, 127},
5451 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005452 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005453 }, {
5454 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005455 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005456 },
5457 },
5458 .write = write_en29lv640b,
5459 .read = read_memmapped,
5460 .voltage = {2700, 3600},
5461 },
5462
5463 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005464 .vendor = "Eon",
5465 .name = "EN29GL064(A)B",
5466 .bustype = BUS_PARALLEL,
5467 .manufacture_id = EON_ID,
5468 .model_id = EON_EN29GL064B,
5469 .total_size = 8192,
5470 .page_size = 128 * 1024, /* actual page size is 16 */
5471 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5472 .tested = TEST_UNTESTED,
5473 .probe = probe_jedec_29gl,
5474 .probe_timing = TIMING_ZERO,
5475 .block_erasers =
5476 {
5477 {
5478 .eraseblocks = {
5479 {8 * 1024, 8},
5480 {64 * 1024, 127},
5481 },
5482 .block_erase = erase_sector_jedec,
5483 }, {
5484 .eraseblocks = { {8 * 1024 * 1024, 1} },
5485 .block_erase = erase_chip_block_jedec,
5486 },
5487 },
5488 .write = write_jedec_1,
5489 .read = read_memmapped,
5490 .voltage = {2700, 3600},
5491 },
5492
5493 {
5494 .vendor = "Eon",
5495 .name = "EN29GL064(A)T",
5496 .bustype = BUS_PARALLEL,
5497 .manufacture_id = EON_ID,
5498 .model_id = EON_EN29GL064T,
5499 .total_size = 8192,
5500 .page_size = 128 * 1024, /* actual page size is 16 */
5501 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5502 .tested = TEST_UNTESTED,
5503 .probe = probe_jedec_29gl,
5504 .probe_timing = TIMING_ZERO,
5505 .block_erasers =
5506 {
5507 {
5508 .eraseblocks = {
5509 {64 * 1024, 127},
5510 {8 * 1024, 8},
5511 },
5512 .block_erase = erase_sector_jedec,
5513 }, {
5514 .eraseblocks = { {8 * 1024 * 1024, 1} },
5515 .block_erase = erase_chip_block_jedec,
5516 },
5517 },
5518 .write = write_jedec_1,
5519 .read = read_memmapped,
5520 .voltage = {2700, 3600},
5521 },
5522
5523 {
5524 .vendor = "Eon",
5525 .name = "EN29GL064H/L",
5526 .bustype = BUS_PARALLEL,
5527 .manufacture_id = EON_ID,
5528 .model_id = EON_EN29GL064HL,
5529 .total_size = 8192,
5530 .page_size = 128 * 1024, /* actual page size is 16 */
5531 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5532 .tested = TEST_UNTESTED,
5533 .probe = probe_jedec_29gl,
5534 .probe_timing = TIMING_ZERO,
5535 .block_erasers =
5536 {
5537 {
5538 .eraseblocks = { {64 * 1024, 128} },
5539 .block_erase = erase_sector_jedec,
5540 }, {
5541 .eraseblocks = { {8 * 1024 * 1024, 1} },
5542 .block_erase = erase_chip_block_jedec,
5543 },
5544 },
5545 .write = write_jedec_1,
5546 .read = read_memmapped,
5547 .voltage = {2700, 3600},
5548 },
5549
5550 {
5551 .vendor = "Eon",
5552 .name = "EN29GL128",
5553 .bustype = BUS_PARALLEL,
5554 .manufacture_id = EON_ID,
5555 .model_id = EON_EN29GL128HL,
5556 .total_size = 16384,
5557 .page_size = 128 * 1024, /* actual page size is 16 */
5558 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5559 .tested = TEST_UNTESTED,
5560 .probe = probe_jedec_29gl,
5561 .probe_timing = TIMING_ZERO,
5562 .block_erasers =
5563 {
5564 {
5565 .eraseblocks = { {128 * 1024, 128} },
5566 .block_erase = erase_sector_jedec,
5567 }, {
5568 .eraseblocks = { {16 * 1024 * 1024, 1} },
5569 .block_erase = erase_chip_block_jedec,
5570 },
5571 },
5572 .write = write_jedec_1,
5573 .read = read_memmapped,
5574 .voltage = {2700, 3600},
5575 },
5576
5577 {
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005578 .vendor = "ESI",
5579 .name = "ES25P40",
5580 .bustype = BUS_SPI,
5581 .manufacture_id = EXCEL_ID_NOPREFIX,
5582 .model_id = EXCEL_ES25P40,
5583 .total_size = 512,
5584 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005585 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005586 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5587 .feature_bits = FEATURE_WRSR_WREN,
5588 .tested = TEST_UNTESTED,
5589 .probe = probe_spi_rdid,
5590 .probe_timing = TIMING_ZERO,
5591 .block_erasers =
5592 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005593 {
5594 .eraseblocks = { {64 * 1024, 8} },
5595 .block_erase = spi_block_erase_d8,
5596 }, {
5597 .eraseblocks = { {512 * 1024, 1} },
5598 .block_erase = spi_block_erase_c7,
5599 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005600 },
5601 .printlock = spi_prettyprint_status_register_bp2_srwd,
5602 .unlock = spi_disable_blockprotect_bp2_srwd,
5603 .write = spi_chip_write_256,
5604 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5605 .voltage = {2700, 3600},
5606 },
5607
5608 {
5609 .vendor = "ESI",
5610 .name = "ES25P80",
5611 .bustype = BUS_SPI,
5612 .manufacture_id = EXCEL_ID_NOPREFIX,
5613 .model_id = EXCEL_ES25P80,
5614 .total_size = 1024,
5615 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005616 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005617 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5618 .feature_bits = FEATURE_WRSR_WREN,
5619 .tested = TEST_UNTESTED,
5620 .probe = probe_spi_rdid,
5621 .probe_timing = TIMING_ZERO,
5622 .block_erasers =
5623 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005624 {
5625 .eraseblocks = { {64 * 1024, 16} },
5626 .block_erase = spi_block_erase_d8,
5627 }, {
5628 .eraseblocks = { {1024 * 1024, 1} },
5629 .block_erase = spi_block_erase_c7,
5630 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005631 },
5632 .printlock = spi_prettyprint_status_register_bp2_srwd,
5633 .unlock = spi_disable_blockprotect_bp2_srwd,
5634 .write = spi_chip_write_256,
5635 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5636 .voltage = {2700, 3600},
5637 },
5638
5639 {
5640 .vendor = "ESI",
5641 .name = "ES25P16",
5642 .bustype = BUS_SPI,
5643 .manufacture_id = EXCEL_ID_NOPREFIX,
5644 .model_id = EXCEL_ES25P16,
5645 .total_size = 2 * 1024,
5646 .page_size = 256,
Elyes HAOUASe2c90c42018-08-18 09:04:41 +02005647 /* 256-byte parameter page separate from memory array:
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005648 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5649 .feature_bits = FEATURE_WRSR_WREN,
5650 .tested = TEST_UNTESTED,
5651 .probe = probe_spi_rdid,
5652 .probe_timing = TIMING_ZERO,
5653 .block_erasers =
5654 {
5655 {
5656 .eraseblocks = { {64 * 1024, 32} },
5657 .block_erase = spi_block_erase_d8,
5658 }, {
5659 .eraseblocks = { {2 * 1024 * 1024, 1} },
5660 .block_erase = spi_block_erase_c7,
5661 }
5662 },
5663 .printlock = spi_prettyprint_status_register_bp2_srwd,
5664 .unlock = spi_disable_blockprotect_bp2_srwd,
5665 .write = spi_chip_write_256,
5666 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5667 .voltage = {2700, 3600},
5668 },
5669
5670 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005671 .vendor = "Fujitsu",
5672 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005673 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005674 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005675 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005676 .total_size = 512,
5677 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005678 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005679 .tested = TEST_UNTESTED,
5680 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005681 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005682 .block_erasers =
5683 {
5684 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005685 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005686 {16 * 1024, 1},
5687 {8 * 1024, 2},
5688 {32 * 1024, 1},
5689 {64 * 1024, 7},
5690 },
Sean Nelson35727f72010-01-28 23:55:12 +00005691 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005692 }, {
5693 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005694 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005695 },
5696 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005697 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005698 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005699 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005700 },
5701
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005702 {
5703 .vendor = "Fujitsu",
5704 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005705 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005706 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005707 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005708 .total_size = 512,
5709 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005710 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005711 .tested = TEST_UNTESTED,
5712 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005713 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005714 .block_erasers =
5715 {
5716 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005717 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005718 {64 * 1024, 7},
5719 {32 * 1024, 1},
5720 {8 * 1024, 2},
5721 {16 * 1024, 1},
5722 },
Sean Nelson35727f72010-01-28 23:55:12 +00005723 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005724 }, {
5725 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005726 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005727 },
5728 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005729 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005730 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005731 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005732 },
5733
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005734 {
Sean Nelson35727f72010-01-28 23:55:12 +00005735 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005736 .vendor = "Fujitsu",
5737 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005738 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005739 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005740 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005741 .total_size = 512,
5742 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005743 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005744 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005745 .probe = probe_jedec,
5746 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005747 .block_erasers =
5748 {
5749 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005750 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005751 {16 * 1024, 1},
5752 {8 * 1024, 2},
5753 {32 * 1024, 1},
5754 {64 * 1024, 7},
5755 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005756 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005757 }, {
5758 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005759 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005760 },
5761 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005762 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005763 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005764 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005765 },
5766
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005767 {
5768 .vendor = "Fujitsu",
5769 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005770 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005771 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005772 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005773 .total_size = 512,
5774 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005775 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005776 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005777 .probe = probe_jedec,
5778 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005779 .block_erasers =
5780 {
5781 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005782 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005783 {64 * 1024, 7},
5784 {32 * 1024, 1},
5785 {8 * 1024, 2},
5786 {16 * 1024, 1},
5787 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005788 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005789 }, {
5790 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005791 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005792 },
5793 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005794 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005795 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005796 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005797 },
5798
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005799 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005800 .vendor = "Fujitsu",
5801 .name = "MBM29LV160BE",
5802 .bustype = BUS_PARALLEL,
5803 .manufacture_id = FUJITSU_ID,
5804 .model_id = FUJITSU_MBM29LV160BE,
5805 .total_size = 2 * 1024,
5806 .page_size = 0,
5807 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5808 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005809 .probe = probe_jedec,
5810 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005811 .block_erasers =
5812 {
5813 {
5814 .eraseblocks = {
5815 {16 * 1024, 1},
5816 {8 * 1024, 2},
5817 {32 * 1024, 1},
5818 {64 * 1024, 31},
5819 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005820 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005821 }, {
5822 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005823 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005824 },
5825 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005826 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005827 .read = read_memmapped,
5828 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5829 },
5830
5831 {
5832 .vendor = "Fujitsu",
5833 .name = "MBM29LV160TE",
5834 .bustype = BUS_PARALLEL,
5835 .manufacture_id = FUJITSU_ID,
5836 .model_id = FUJITSU_MBM29LV160TE,
5837 .total_size = 2 * 1024,
5838 .page_size = 0,
5839 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5840 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005841 .probe = probe_jedec,
5842 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005843 .block_erasers =
5844 {
5845 {
5846 .eraseblocks = {
5847 {64 * 1024, 31},
5848 {32 * 1024, 1},
5849 {8 * 1024, 2},
5850 {16 * 1024, 1},
5851 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005852 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005853 }, {
5854 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005855 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005856 },
5857 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005858 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005859 .read = read_memmapped,
5860 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5861 },
5862
5863 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005864 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00005865 .name = "GD25LQ40",
5866 .bustype = BUS_SPI,
5867 .manufacture_id = GIGADEVICE_ID,
5868 .model_id = GIGADEVICE_GD25LQ40,
5869 .total_size = 512,
5870 .page_size = 256,
5871 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5872 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5873 .tested = TEST_UNTESTED,
5874 .probe = probe_spi_rdid,
5875 .probe_timing = TIMING_ZERO,
5876 .block_erasers =
5877 {
5878 {
5879 .eraseblocks = { {4 * 1024, 128} },
5880 .block_erase = spi_block_erase_20,
5881 }, {
5882 .eraseblocks = { {32 * 1024, 16} },
5883 .block_erase = spi_block_erase_52,
5884 }, {
5885 .eraseblocks = { {64 * 1024, 8} },
5886 .block_erase = spi_block_erase_d8,
5887 }, {
5888 .eraseblocks = { {512 * 1024, 1} },
5889 .block_erase = spi_block_erase_60,
5890 }, {
5891 .eraseblocks = { {512 * 1024, 1} },
5892 .block_erase = spi_block_erase_c7,
5893 }
5894 },
5895 .printlock = spi_prettyprint_status_register_bp4_srwd,
5896 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5897 .write = spi_chip_write_256,
5898 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5899 .voltage = {1695, 1950},
5900 },
5901
5902 {
5903 .vendor = "GigaDevice",
5904 .name = "GD25LQ80",
5905 .bustype = BUS_SPI,
5906 .manufacture_id = GIGADEVICE_ID,
5907 .model_id = GIGADEVICE_GD25LQ80,
5908 .total_size = 1024,
5909 .page_size = 256,
5910 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5911 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5912 .tested = TEST_UNTESTED,
5913 .probe = probe_spi_rdid,
5914 .probe_timing = TIMING_ZERO,
5915 .block_erasers =
5916 {
5917 {
5918 .eraseblocks = { {4 * 1024, 256} },
5919 .block_erase = spi_block_erase_20,
5920 }, {
5921 .eraseblocks = { {32 * 1024, 32} },
5922 .block_erase = spi_block_erase_52,
5923 }, {
5924 .eraseblocks = { {64 * 1024, 16} },
5925 .block_erase = spi_block_erase_d8,
5926 }, {
5927 .eraseblocks = { {1 * 1024 * 1024, 1} },
5928 .block_erase = spi_block_erase_60,
5929 }, {
5930 .eraseblocks = { {1 * 1024 * 1024, 1} },
5931 .block_erase = spi_block_erase_c7,
5932 }
5933 },
5934 .printlock = spi_prettyprint_status_register_bp4_srwd,
5935 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5936 .write = spi_chip_write_256,
5937 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5938 .voltage = {1695, 1950},
5939 },
5940
5941 {
5942 .vendor = "GigaDevice",
5943 .name = "GD25LQ16",
5944 .bustype = BUS_SPI,
5945 .manufacture_id = GIGADEVICE_ID,
5946 .model_id = GIGADEVICE_GD25LQ16,
5947 .total_size = 2048,
5948 .page_size = 256,
5949 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5950 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5951 .tested = TEST_UNTESTED,
5952 .probe = probe_spi_rdid,
5953 .probe_timing = TIMING_ZERO,
5954 .block_erasers =
5955 {
5956 {
5957 .eraseblocks = { {4 * 1024, 512} },
5958 .block_erase = spi_block_erase_20,
5959 }, {
5960 .eraseblocks = { {32 * 1024, 64} },
5961 .block_erase = spi_block_erase_52,
5962 }, {
5963 .eraseblocks = { {64 * 1024, 32} },
5964 .block_erase = spi_block_erase_d8,
5965 }, {
5966 .eraseblocks = { {2 * 1024 * 1024, 1} },
5967 .block_erase = spi_block_erase_60,
5968 }, {
5969 .eraseblocks = { {2 * 1024 * 1024, 1} },
5970 .block_erase = spi_block_erase_c7,
5971 }
5972 },
5973 .printlock = spi_prettyprint_status_register_bp4_srwd,
5974 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5975 .write = spi_chip_write_256,
5976 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5977 .voltage = {1695, 1950},
5978 },
5979
5980 {
5981 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005982 .name = "GD25LQ32",
5983 .bustype = BUS_SPI,
5984 .manufacture_id = GIGADEVICE_ID,
5985 .model_id = GIGADEVICE_GD25LQ32,
5986 .total_size = 4096,
5987 .page_size = 256,
5988 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5989 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5990 .tested = TEST_OK_PREW,
5991 .probe = probe_spi_rdid,
5992 .probe_timing = TIMING_ZERO,
5993 .block_erasers =
5994 {
5995 {
5996 .eraseblocks = { {4 * 1024, 1024} },
5997 .block_erase = spi_block_erase_20,
5998 }, {
5999 .eraseblocks = { {32 * 1024, 128} },
6000 .block_erase = spi_block_erase_52,
6001 }, {
6002 .eraseblocks = { {64 * 1024, 64} },
6003 .block_erase = spi_block_erase_d8,
6004 }, {
6005 .eraseblocks = { {4 * 1024 * 1024, 1} },
6006 .block_erase = spi_block_erase_60,
6007 }, {
6008 .eraseblocks = { {4 * 1024 * 1024, 1} },
6009 .block_erase = spi_block_erase_c7,
6010 }
6011 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006012 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006013 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6014 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00006015 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6016 .voltage = {1695, 1950},
6017 },
6018
6019 {
6020 .vendor = "GigaDevice",
6021 .name = "GD25LQ64(B)",
6022 .bustype = BUS_SPI,
6023 .manufacture_id = GIGADEVICE_ID,
6024 .model_id = GIGADEVICE_GD25LQ64,
6025 .total_size = 8192,
6026 .page_size = 256,
6027 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00006029 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006030 .probe = probe_spi_rdid,
6031 .probe_timing = TIMING_ZERO,
6032 .block_erasers =
6033 {
6034 {
6035 .eraseblocks = { {4 * 1024, 2048} },
6036 .block_erase = spi_block_erase_20,
6037 }, {
6038 .eraseblocks = { {32 * 1024, 256} },
6039 .block_erase = spi_block_erase_52,
6040 }, {
6041 .eraseblocks = { {64 * 1024, 128} },
6042 .block_erase = spi_block_erase_d8,
6043 }, {
6044 .eraseblocks = { {8 * 1024 * 1024, 1} },
6045 .block_erase = spi_block_erase_60,
6046 }, {
6047 .eraseblocks = { {8 * 1024 * 1024, 1} },
6048 .block_erase = spi_block_erase_c7,
6049 }
6050 },
6051 .printlock = spi_prettyprint_status_register_bp4_srwd,
6052 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6053 .write = spi_chip_write_256,
6054 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6055 .voltage = {1695, 1950},
6056 },
6057
6058 {
6059 .vendor = "GigaDevice",
6060 .name = "GD25LQ128",
6061 .bustype = BUS_SPI,
6062 .manufacture_id = GIGADEVICE_ID,
6063 .model_id = GIGADEVICE_GD25LQ128,
6064 .total_size = 16384,
6065 .page_size = 256,
6066 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6067 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6068 .tested = TEST_UNTESTED,
6069 .probe = probe_spi_rdid,
6070 .probe_timing = TIMING_ZERO,
6071 .block_erasers =
6072 {
6073 {
6074 .eraseblocks = { {4 * 1024, 4096} },
6075 .block_erase = spi_block_erase_20,
6076 }, {
6077 .eraseblocks = { {32 * 1024, 512} },
6078 .block_erase = spi_block_erase_52,
6079 }, {
6080 .eraseblocks = { {64 * 1024, 256} },
6081 .block_erase = spi_block_erase_d8,
6082 }, {
6083 .eraseblocks = { {16 * 1024 * 1024, 1} },
6084 .block_erase = spi_block_erase_60,
6085 }, {
6086 .eraseblocks = { {16 * 1024 * 1024, 1} },
6087 .block_erase = spi_block_erase_c7,
6088 }
6089 },
6090 .printlock = spi_prettyprint_status_register_bp4_srwd,
6091 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6092 .write = spi_chip_write_256,
6093 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6094 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006095 },
6096
6097 {
6098 .vendor = "GigaDevice",
6099 .name = "GD25Q512",
6100 .bustype = BUS_SPI,
6101 .manufacture_id = GIGADEVICE_ID,
6102 .model_id = GIGADEVICE_GD25Q512,
6103 .total_size = 64,
6104 .page_size = 256,
6105 .feature_bits = FEATURE_WRSR_WREN,
Nico Huberc6fe5d82018-08-18 12:45:58 +02006106 .tested = TEST_OK_PREW,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006107 .probe = probe_spi_rdid,
6108 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006109 .block_erasers =
6110 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006111 {
6112 .eraseblocks = { {4 * 1024, 16} },
6113 .block_erase = spi_block_erase_20,
6114 }, {
6115 .eraseblocks = { {32 * 1024, 2} },
6116 .block_erase = spi_block_erase_52,
6117 }, {
6118 .eraseblocks = { {64 * 1024, 1} },
6119 .block_erase = spi_block_erase_60,
6120 }, {
6121 .eraseblocks = { {64 * 1024, 1} },
6122 .block_erase = spi_block_erase_c7,
6123 }
6124 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006125 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006126 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6127 .write = spi_chip_write_256,
6128 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6129 .voltage = {2700, 3600},
6130 },
6131
6132 {
6133 .vendor = "GigaDevice",
6134 .name = "GD25Q10",
6135 .bustype = BUS_SPI,
6136 .manufacture_id = GIGADEVICE_ID,
6137 .model_id = GIGADEVICE_GD25Q10,
6138 .total_size = 128,
6139 .page_size = 256,
6140 .feature_bits = FEATURE_WRSR_WREN,
6141 .tested = TEST_UNTESTED,
6142 .probe = probe_spi_rdid,
6143 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006144 .block_erasers =
6145 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006146 {
6147 .eraseblocks = { {4 * 1024, 32} },
6148 .block_erase = spi_block_erase_20,
6149 }, {
6150 .eraseblocks = { {32 * 1024, 4} },
6151 .block_erase = spi_block_erase_52,
6152 }, {
6153 .eraseblocks = { {64 * 1024, 2} },
6154 .block_erase = spi_block_erase_d8,
6155 }, {
6156 .eraseblocks = { {128 * 1024, 1} },
6157 .block_erase = spi_block_erase_60,
6158 }, {
6159 .eraseblocks = { {128 * 1024, 1} },
6160 .block_erase = spi_block_erase_c7,
6161 }
6162 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006163 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006164 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6165 .write = spi_chip_write_256,
6166 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6167 .voltage = {2700, 3600},
6168 },
6169
6170 {
6171 .vendor = "GigaDevice",
6172 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006173 .bustype = BUS_SPI,
6174 .manufacture_id = GIGADEVICE_ID,
6175 .model_id = GIGADEVICE_GD25Q20,
6176 .total_size = 256,
6177 .page_size = 256,
6178 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00006179 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006180 .probe = probe_spi_rdid,
6181 .probe_timing = TIMING_ZERO,
6182 .block_erasers =
6183 {
6184 {
6185 .eraseblocks = { {4 * 1024, 64} },
6186 .block_erase = spi_block_erase_20,
6187 }, {
6188 .eraseblocks = { {32 * 1024, 8} },
6189 .block_erase = spi_block_erase_52,
6190 }, {
6191 .eraseblocks = { {64 * 1024, 4} },
6192 .block_erase = spi_block_erase_d8,
6193 }, {
6194 .eraseblocks = { {256 * 1024, 1} },
6195 .block_erase = spi_block_erase_60,
6196 }, {
6197 .eraseblocks = { {256 * 1024, 1} },
6198 .block_erase = spi_block_erase_c7,
6199 }
6200 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006201 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006202 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006203 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006204 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006205 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006206 },
6207
6208 {
6209 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006210 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006211 .bustype = BUS_SPI,
6212 .manufacture_id = GIGADEVICE_ID,
6213 .model_id = GIGADEVICE_GD25Q40,
6214 .total_size = 512,
6215 .page_size = 256,
6216 .feature_bits = FEATURE_WRSR_WREN,
6217 .tested = TEST_UNTESTED,
6218 .probe = probe_spi_rdid,
6219 .probe_timing = TIMING_ZERO,
6220 .block_erasers =
6221 {
6222 {
6223 .eraseblocks = { {4 * 1024, 128} },
6224 .block_erase = spi_block_erase_20,
6225 }, {
6226 .eraseblocks = { {32 * 1024, 16} },
6227 .block_erase = spi_block_erase_52,
6228 }, {
6229 .eraseblocks = { {64 * 1024, 8} },
6230 .block_erase = spi_block_erase_d8,
6231 }, {
6232 .eraseblocks = { {512 * 1024, 1} },
6233 .block_erase = spi_block_erase_60,
6234 }, {
6235 .eraseblocks = { {512 * 1024, 1} },
6236 .block_erase = spi_block_erase_c7,
6237 }
6238 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006239 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006240 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006241 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006242 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006243 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006244 },
6245
6246 {
6247 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006248 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006249 .bustype = BUS_SPI,
6250 .manufacture_id = GIGADEVICE_ID,
6251 .model_id = GIGADEVICE_GD25Q80,
6252 .total_size = 1024,
6253 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006254 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6256 .tested = TEST_OK_PREW,
6257 .probe = probe_spi_rdid,
6258 .probe_timing = TIMING_ZERO,
6259 .block_erasers =
6260 {
6261 {
6262 .eraseblocks = { {4 * 1024, 256} },
6263 .block_erase = spi_block_erase_20,
6264 }, {
6265 .eraseblocks = { {32 * 1024, 32} },
6266 .block_erase = spi_block_erase_52,
6267 }, {
6268 .eraseblocks = { {64 * 1024, 16} },
6269 .block_erase = spi_block_erase_d8,
6270 }, {
6271 .eraseblocks = { {1024 * 1024, 1} },
6272 .block_erase = spi_block_erase_60,
6273 }, {
6274 .eraseblocks = { {1024 * 1024, 1} },
6275 .block_erase = spi_block_erase_c7,
6276 }
6277 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006278 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006279 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006280 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006281 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006282 .voltage = {2700, 3600},
6283 },
6284
6285 {
6286 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006287 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006288 .bustype = BUS_SPI,
6289 .manufacture_id = GIGADEVICE_ID,
6290 .model_id = GIGADEVICE_GD25Q16,
6291 .total_size = 2048,
6292 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006293 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00006295 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006296 .probe = probe_spi_rdid,
6297 .probe_timing = TIMING_ZERO,
6298 .block_erasers =
6299 {
6300 {
6301 .eraseblocks = { {4 * 1024, 512} },
6302 .block_erase = spi_block_erase_20,
6303 }, {
6304 .eraseblocks = { {32 * 1024, 64} },
6305 .block_erase = spi_block_erase_52,
6306 }, {
6307 .eraseblocks = { {64 * 1024, 32} },
6308 .block_erase = spi_block_erase_d8,
6309 }, {
6310 .eraseblocks = { {2 * 1024 * 1024, 1} },
6311 .block_erase = spi_block_erase_60,
6312 }, {
6313 .eraseblocks = { {2 * 1024 * 1024, 1} },
6314 .block_erase = spi_block_erase_c7,
6315 }
6316 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006317 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006318 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006319 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006320 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006321 .voltage = {2700, 3600},
6322 },
6323
6324 {
6325 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006326 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006327 .bustype = BUS_SPI,
6328 .manufacture_id = GIGADEVICE_ID,
6329 .model_id = GIGADEVICE_GD25Q32,
6330 .total_size = 4096,
6331 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006332 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006334 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006335 .probe = probe_spi_rdid,
6336 .probe_timing = TIMING_ZERO,
6337 .block_erasers =
6338 {
6339 {
6340 .eraseblocks = { {4 * 1024, 1024} },
6341 .block_erase = spi_block_erase_20,
6342 }, {
6343 .eraseblocks = { {32 * 1024, 128} },
6344 .block_erase = spi_block_erase_52,
6345 }, {
6346 .eraseblocks = { {64 * 1024, 64} },
6347 .block_erase = spi_block_erase_d8,
6348 }, {
6349 .eraseblocks = { {4 * 1024 * 1024, 1} },
6350 .block_erase = spi_block_erase_60,
6351 }, {
6352 .eraseblocks = { {4 * 1024 * 1024, 1} },
6353 .block_erase = spi_block_erase_c7,
6354 }
6355 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006356 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006357 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006358 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006359 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006360 .voltage = {2700, 3600},
6361 },
6362
6363 {
6364 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006365 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006366 .bustype = BUS_SPI,
6367 .manufacture_id = GIGADEVICE_ID,
6368 .model_id = GIGADEVICE_GD25Q64,
6369 .total_size = 8192,
6370 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006371 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00006373 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006374 .probe = probe_spi_rdid,
6375 .probe_timing = TIMING_ZERO,
6376 .block_erasers =
6377 {
6378 {
6379 .eraseblocks = { {4 * 1024, 2048} },
6380 .block_erase = spi_block_erase_20,
6381 }, {
6382 .eraseblocks = { {32 * 1024, 256} },
6383 .block_erase = spi_block_erase_52,
6384 }, {
6385 .eraseblocks = { {64 * 1024, 128} },
6386 .block_erase = spi_block_erase_d8,
6387 }, {
6388 .eraseblocks = { {8 * 1024 * 1024, 1} },
6389 .block_erase = spi_block_erase_60,
6390 }, {
6391 .eraseblocks = { {8 * 1024 * 1024, 1} },
6392 .block_erase = spi_block_erase_c7,
6393 }
6394 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006395 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006396 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006397 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006398 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00006399 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006400 },
6401
6402 {
6403 .vendor = "GigaDevice",
Angel Pons20657ce2018-09-30 17:05:18 +02006404 .name = "GD25B128B/GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006405 .bustype = BUS_SPI,
6406 .manufacture_id = GIGADEVICE_ID,
6407 .model_id = GIGADEVICE_GD25Q128,
6408 .total_size = 16384,
6409 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006410 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006411 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons20657ce2018-09-30 17:05:18 +02006412 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006413 .probe = probe_spi_rdid,
6414 .probe_timing = TIMING_ZERO,
6415 .block_erasers =
6416 {
6417 {
6418 .eraseblocks = { {4 * 1024, 4096} },
6419 .block_erase = spi_block_erase_20,
6420 }, {
6421 .eraseblocks = { {32 * 1024, 512} },
6422 .block_erase = spi_block_erase_52,
6423 }, {
6424 .eraseblocks = { {64 * 1024, 256} },
6425 .block_erase = spi_block_erase_d8,
6426 }, {
6427 .eraseblocks = { {16 * 1024 * 1024, 1} },
6428 .block_erase = spi_block_erase_60,
6429 }, {
6430 .eraseblocks = { {16 * 1024 * 1024, 1} },
6431 .block_erase = spi_block_erase_c7,
6432 }
6433 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006434 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006435 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6436 .write = spi_chip_write_256,
6437 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6438 .voltage = {2700, 3600},
6439 },
6440
6441 {
6442 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006443 .name = "GD25Q128C",
6444 .bustype = BUS_SPI,
6445 .manufacture_id = GIGADEVICE_ID,
6446 .model_id = GIGADEVICE_GD25Q128,
6447 .total_size = 16384,
6448 .page_size = 256,
6449 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6450 /* QPI: enable 0x38, disable 0xFF */
6451 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Angel Ponsbce364c2018-09-30 20:04:14 +02006452 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006453 .probe = probe_spi_rdid,
6454 .probe_timing = TIMING_ZERO,
6455 .block_erasers =
6456 {
6457 {
6458 .eraseblocks = { {4 * 1024, 4096} },
6459 .block_erase = spi_block_erase_20,
6460 }, {
6461 .eraseblocks = { {32 * 1024, 512} },
6462 .block_erase = spi_block_erase_52,
6463 }, {
6464 .eraseblocks = { {64 * 1024, 256} },
6465 .block_erase = spi_block_erase_d8,
6466 }, {
6467 .eraseblocks = { {16 * 1024 * 1024, 1} },
6468 .block_erase = spi_block_erase_60,
6469 }, {
6470 .eraseblocks = { {16 * 1024 * 1024, 1} },
6471 .block_erase = spi_block_erase_c7,
6472 }
6473 },
6474 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6475 .printlock = spi_prettyprint_status_register_bp4_srwd,
6476 .unlock = spi_disable_blockprotect_bp4_srwd,
6477 .write = spi_chip_write_256,
6478 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6479 .voltage = {2700, 3600},
6480 },
6481
6482 {
6483 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006484 .name = "GD25T80",
6485 .bustype = BUS_SPI,
6486 .manufacture_id = GIGADEVICE_ID,
6487 .model_id = GIGADEVICE_GD25T80,
6488 .total_size = 1024,
6489 .page_size = 256,
6490 /* OTP: 256B total; enter 0x3A */
6491 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6492 .tested = TEST_UNTESTED,
6493 .probe = probe_spi_rdid,
6494 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006495 .block_erasers =
6496 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006497 {
6498 .eraseblocks = { {4 * 1024, 256} },
6499 .block_erase = spi_block_erase_20,
6500 }, {
6501 .eraseblocks = { {64 * 1024, 16} },
6502 .block_erase = spi_block_erase_52,
6503 }, {
6504 .eraseblocks = { {64 * 1024, 16} },
6505 .block_erase = spi_block_erase_d8,
6506 }, {
6507 .eraseblocks = { {1024 * 1024, 1} },
6508 .block_erase = spi_block_erase_60,
6509 }, {
6510 .eraseblocks = { {1024 * 1024, 1} },
6511 .block_erase = spi_block_erase_c7,
6512 }
6513 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00006514 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006515 .unlock = spi_disable_blockprotect,
6516 .write = spi_chip_write_256,
6517 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006518 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006519 },
6520
6521 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006522 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006523 .name = "GD25VQ21B",
6524 .bustype = BUS_SPI,
6525 .manufacture_id = GIGADEVICE_ID,
6526 .model_id = GIGADEVICE_GD25VQ21B,
6527 .total_size = 256,
6528 .page_size = 256,
6529 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6531 .tested = TEST_UNTESTED,
6532 .probe = probe_spi_rdid,
6533 .probe_timing = TIMING_ZERO,
6534 .block_erasers =
6535 {
6536 {
6537 .eraseblocks = { { 4 * 1024, 64} },
6538 .block_erase = spi_block_erase_20,
6539 }, {
6540 .eraseblocks = { { 32 * 1024, 8} },
6541 .block_erase = spi_block_erase_52,
6542 }, {
6543 .eraseblocks = { { 64 * 1024, 4} },
6544 .block_erase = spi_block_erase_d8,
6545 }, {
6546 .eraseblocks = { {256 * 1024, 1} },
6547 .block_erase = spi_block_erase_60,
6548 }, {
6549 .eraseblocks = { {256 * 1024, 1} },
6550 .block_erase = spi_block_erase_c7,
6551 }
6552 },
6553 .printlock = spi_prettyprint_status_register_bp4_srwd,
6554 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6555 .write = spi_chip_write_256,
6556 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6557 .voltage = {2300, 3600},
6558 },
6559
6560 {
6561 .vendor = "GigaDevice",
6562 .name = "GD25VQ40C",
6563 .bustype = BUS_SPI,
6564 .manufacture_id = GIGADEVICE_ID,
6565 .model_id = GIGADEVICE_GD25VQ41B,
6566 .total_size = 512,
6567 .page_size = 256,
6568 /* Supports SFDP */
6569 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6570 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6571 .tested = TEST_UNTESTED,
6572 .probe = probe_spi_rdid,
6573 .probe_timing = TIMING_ZERO,
6574 .block_erasers =
6575 {
6576 {
6577 .eraseblocks = { { 4 * 1024, 128} },
6578 .block_erase = spi_block_erase_20,
6579 }, {
6580 .eraseblocks = { { 32 * 1024, 16} },
6581 .block_erase = spi_block_erase_52,
6582 }, {
6583 .eraseblocks = { { 64 * 1024, 8} },
6584 .block_erase = spi_block_erase_d8,
6585 }, {
6586 .eraseblocks = { {512 * 1024, 1} },
6587 .block_erase = spi_block_erase_60,
6588 }, {
6589 .eraseblocks = { {512 * 1024, 1} },
6590 .block_erase = spi_block_erase_c7,
6591 }
6592 },
6593 .printlock = spi_prettyprint_status_register_bp4_srwd,
6594 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6595 .write = spi_chip_write_256,
6596 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6597 .voltage = {2300, 3600},
6598 },
6599
6600 {
6601 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006602 .name = "GD25VQ41B",
6603 .bustype = BUS_SPI,
6604 .manufacture_id = GIGADEVICE_ID,
6605 .model_id = GIGADEVICE_GD25VQ41B,
6606 .total_size = 512,
6607 .page_size = 256,
6608 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6609 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006610 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006611 .probe = probe_spi_rdid,
6612 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006613 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006614 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006615 {
6616 .eraseblocks = { { 4 * 1024, 128} },
6617 .block_erase = spi_block_erase_20,
6618 }, {
6619 .eraseblocks = { { 32 * 1024, 16} },
6620 .block_erase = spi_block_erase_52,
6621 }, {
6622 .eraseblocks = { { 64 * 1024, 8} },
6623 .block_erase = spi_block_erase_d8,
6624 }, {
6625 .eraseblocks = { {512 * 1024, 1} },
6626 .block_erase = spi_block_erase_60,
6627 }, {
6628 .eraseblocks = { {512 * 1024, 1} },
6629 .block_erase = spi_block_erase_c7,
6630 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006631 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006632 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006633 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6634 .write = spi_chip_write_256,
6635 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6636 .voltage = {2300, 3600},
6637 },
6638
6639 {
6640 .vendor = "GigaDevice",
6641 .name = "GD25VQ80C",
6642 .bustype = BUS_SPI,
6643 .manufacture_id = GIGADEVICE_ID,
6644 .model_id = GIGADEVICE_GD25VQ80C,
6645 .total_size = 1024,
6646 .page_size = 256,
6647 /* Supports SFDP */
6648 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6649 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6650 .tested = TEST_UNTESTED,
6651 .probe = probe_spi_rdid,
6652 .probe_timing = TIMING_ZERO,
6653 .block_erasers =
6654 {
6655 {
6656 .eraseblocks = { { 4 * 1024, 256} },
6657 .block_erase = spi_block_erase_20,
6658 }, {
6659 .eraseblocks = { { 32 * 1024, 32} },
6660 .block_erase = spi_block_erase_52,
6661 }, {
6662 .eraseblocks = { { 64 * 1024, 16} },
6663 .block_erase = spi_block_erase_d8,
6664 }, {
6665 .eraseblocks = { {1024 * 1024, 1} },
6666 .block_erase = spi_block_erase_60,
6667 }, {
6668 .eraseblocks = { {1024 * 1024, 1} },
6669 .block_erase = spi_block_erase_c7,
6670 }
6671 },
6672 .printlock = spi_prettyprint_status_register_bp4_srwd,
6673 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6674 .write = spi_chip_write_256,
6675 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6676 .voltage = {2300, 3600},
6677 },
6678
6679 {
6680 .vendor = "GigaDevice",
6681 .name = "GD25VQ16C",
6682 .bustype = BUS_SPI,
6683 .manufacture_id = GIGADEVICE_ID,
6684 .model_id = GIGADEVICE_GD25VQ16C,
6685 .total_size = 2 * 1024,
6686 .page_size = 256,
6687 /* Supports SFDP */
6688 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6689 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6690 .tested = TEST_UNTESTED,
6691 .probe = probe_spi_rdid,
6692 .probe_timing = TIMING_ZERO,
6693 .block_erasers =
6694 {
6695 {
6696 .eraseblocks = { { 4 * 1024, 512} },
6697 .block_erase = spi_block_erase_20,
6698 }, {
6699 .eraseblocks = { { 32 * 1024, 64} },
6700 .block_erase = spi_block_erase_52,
6701 }, {
6702 .eraseblocks = { { 64 * 1024, 32} },
6703 .block_erase = spi_block_erase_d8,
6704 }, {
6705 .eraseblocks = { {2 * 1024 * 1024, 1} },
6706 .block_erase = spi_block_erase_60,
6707 }, {
6708 .eraseblocks = { {2 * 1024 * 1024, 1} },
6709 .block_erase = spi_block_erase_c7,
6710 }
6711 },
6712 .printlock = spi_prettyprint_status_register_bp4_srwd,
6713 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006714 .write = spi_chip_write_256,
6715 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6716 .voltage = {2300, 3600},
6717 },
6718
6719 {
David Borgc96a8bd2010-06-21 16:12:22 +00006720 .vendor = "Hyundai",
6721 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006722 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006723 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006724 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00006725 .total_size = 256,
6726 .page_size = 256 * 1024,
6727 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006728 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00006729 .probe = probe_jedec,
6730 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6731 .block_erasers =
6732 {
6733 {
6734 .eraseblocks = {
6735 {64 * 1024, 3},
6736 {32 * 1024, 1},
6737 {8 * 1024, 2},
6738 {16 * 1024, 1},
6739 },
6740 .block_erase = erase_sector_jedec,
6741 }, {
6742 .eraseblocks = { {256 * 1024, 1} },
6743 .block_erase = erase_chip_block_jedec,
6744 },
6745 },
6746 .write = write_jedec_1,
6747 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006748 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006749 },
6750
6751 {
6752 .vendor = "Hyundai",
6753 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006754 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006755 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006756 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00006757 .total_size = 256,
6758 .page_size = 256 * 1024,
6759 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6760 .tested = TEST_UNTESTED,
6761 .probe = probe_jedec,
6762 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6763 .block_erasers =
6764 {
6765 {
6766 .eraseblocks = {
6767 {16 * 1024, 1},
6768 {8 * 1024, 2},
6769 {32 * 1024, 1},
6770 {64 * 1024, 3},
6771 },
6772 .block_erase = erase_sector_jedec,
6773 }, {
6774 .eraseblocks = { {256 * 1024, 1} },
6775 .block_erase = erase_chip_block_jedec,
6776 },
6777 },
6778 .write = write_jedec_1,
6779 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006780 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006781 },
6782
6783 {
Joshua Roysf1324e02010-09-16 00:51:51 +00006784 .vendor = "Hyundai",
6785 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006786 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006787 .manufacture_id = HYUNDAI_ID,
6788 .model_id = HYUNDAI_HY29F040A,
6789 .total_size = 512,
6790 .page_size = 64 * 1024,
6791 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6792 .tested = TEST_UNTESTED,
6793 .probe = probe_jedec,
6794 .probe_timing = TIMING_ZERO,
6795 .block_erasers =
6796 {
6797 {
6798 .eraseblocks = { {64 * 1024, 8} },
6799 .block_erase = erase_sector_jedec,
6800 }, {
6801 .eraseblocks = { {512 * 1024, 1} },
6802 .block_erase = erase_chip_block_jedec,
6803 },
6804 },
6805 .write = write_jedec_1,
6806 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006807 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006808 },
6809
6810 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006811 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006812 .name = "25F160S33B8",
6813 .bustype = BUS_SPI,
6814 .manufacture_id = INTEL_ID,
6815 .model_id = INTEL_25F160S33B8,
6816 .total_size = 2048,
6817 .page_size = 256,
6818 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6819 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6820 .tested = TEST_UNTESTED,
6821 .probe = probe_spi_rdid,
6822 .probe_timing = TIMING_ZERO,
6823 .block_erasers =
6824 {
6825 {
6826 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6827 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6828 * have no effect on the memory contents, but sets a flag in the SR.
6829 .eraseblocks = {
6830 {8 * 1024, 8},
6831 {64 * 1024, 31} // inaccessible
6832 },
6833 .block_erase = spi_block_erase_40,
6834 }, { */
6835 .eraseblocks = { {64 * 1024, 32} },
6836 .block_erase = spi_block_erase_d8,
6837 }, {
6838 .eraseblocks = { {2 * 1024 * 1024, 1} },
6839 .block_erase = spi_block_erase_c7,
6840 }
6841 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006842 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6843 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006844 .write = spi_chip_write_256,
6845 .read = spi_chip_read, /* also fast read 0x0B */
6846 .voltage = {2700, 3600},
6847 },
6848
6849 {
6850 .vendor = "Intel",
6851 .name = "25F160S33T8",
6852 .bustype = BUS_SPI,
6853 .manufacture_id = INTEL_ID,
6854 .model_id = INTEL_25F160S33T8,
6855 .total_size = 2048,
6856 .page_size = 256,
6857 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6858 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6859 .tested = TEST_UNTESTED,
6860 .probe = probe_spi_rdid,
6861 .probe_timing = TIMING_ZERO,
6862 .block_erasers =
6863 {
6864 {
6865 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6866 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6867 * have no effect on the memory contents, but sets a flag in the SR.
6868 .eraseblocks = {
6869 {64 * 1024, 31}, // inaccessible
6870 {8 * 1024, 8}
6871 },
6872 .block_erase = spi_block_erase_40,
6873 }, { */
6874 .eraseblocks = { {64 * 1024, 32} },
6875 .block_erase = spi_block_erase_d8,
6876 }, {
6877 .eraseblocks = { {2 * 1024 * 1024, 1} },
6878 .block_erase = spi_block_erase_c7,
6879 }
6880 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006881 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6882 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006883 .write = spi_chip_write_256,
6884 .read = spi_chip_read, /* also fast read 0x0B */
6885 .voltage = {2700, 3600},
6886 },
6887
6888 {
6889 .vendor = "Intel",
6890 .name = "25F320S33B8",
6891 .bustype = BUS_SPI,
6892 .manufacture_id = INTEL_ID,
6893 .model_id = INTEL_25F320S33B8,
6894 .total_size = 4096,
6895 .page_size = 256,
6896 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6898 .tested = TEST_UNTESTED,
6899 .probe = probe_spi_rdid,
6900 .probe_timing = TIMING_ZERO,
6901 .block_erasers =
6902 {
6903 {
6904 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6905 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6906 * have no effect on the memory contents, but sets a flag in the SR.
6907 .eraseblocks = {
6908 {8 * 1024, 8},
6909 {64 * 1024, 63} // inaccessible
6910 },
6911 .block_erase = spi_block_erase_40,
6912 }, { */
6913 .eraseblocks = { {64 * 1024, 64} },
6914 .block_erase = spi_block_erase_d8,
6915 }, {
6916 .eraseblocks = { {4 * 1024 * 1024, 1} },
6917 .block_erase = spi_block_erase_c7,
6918 }
6919 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006920 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6921 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006922 .write = spi_chip_write_256,
6923 .read = spi_chip_read, /* also fast read 0x0B */
6924 .voltage = {2700, 3600},
6925 },
6926
6927 {
6928 .vendor = "Intel",
6929 .name = "25F320S33T8",
6930 .bustype = BUS_SPI,
6931 .manufacture_id = INTEL_ID,
6932 .model_id = INTEL_25F320S33T8,
6933 .total_size = 4096,
6934 .page_size = 256,
6935 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6936 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6937 .tested = TEST_UNTESTED,
6938 .probe = probe_spi_rdid,
6939 .probe_timing = TIMING_ZERO,
6940 .block_erasers =
6941 {
6942 {
6943 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6944 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6945 * have no effect on the memory contents, but sets a flag in the SR.
6946 .eraseblocks = {
6947 {64 * 1024, 63}, // inaccessible
6948 {8 * 1024, 8}
6949 },
6950 .block_erase = spi_block_erase_40,
6951 }, { */
6952 .eraseblocks = { {64 * 1024, 64} },
6953 .block_erase = spi_block_erase_d8,
6954 }, {
6955 .eraseblocks = { {4 * 1024 * 1024, 1} },
6956 .block_erase = spi_block_erase_c7,
6957 }
6958 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006959 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6960 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006961 .write = spi_chip_write_256,
6962 .read = spi_chip_read, /* also fast read 0x0B */
6963 .voltage = {2700, 3600},
6964 },
6965
6966 {
6967 .vendor = "Intel",
6968 .name = "25F640S33B8",
6969 .bustype = BUS_SPI,
6970 .manufacture_id = INTEL_ID,
6971 .model_id = INTEL_25F640S33B8,
6972 .total_size = 8192,
6973 .page_size = 256,
6974 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6975 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6976 .tested = TEST_UNTESTED,
6977 .probe = probe_spi_rdid,
6978 .probe_timing = TIMING_ZERO,
6979 .block_erasers =
6980 {
6981 {
6982 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6983 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6984 * have no effect on the memory contents, but sets a flag in the SR.
6985 .eraseblocks = {
6986 {8 * 1024, 8},
6987 {64 * 1024, 127} // inaccessible
6988 },
6989 .block_erase = spi_block_erase_40,
6990 }, { */
6991 .eraseblocks = { {64 * 1024, 128} },
6992 .block_erase = spi_block_erase_d8,
6993 }, {
6994 .eraseblocks = { {8 * 1024 * 1024, 1} },
6995 .block_erase = spi_block_erase_c7,
6996 }
6997 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006998 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6999 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00007000 .write = spi_chip_write_256,
7001 .read = spi_chip_read, /* also fast read 0x0B */
7002 .voltage = {2700, 3600},
7003 },
7004
7005 {
7006 .vendor = "Intel",
7007 .name = "25F640S33T8",
7008 .bustype = BUS_SPI,
7009 .manufacture_id = INTEL_ID,
7010 .model_id = INTEL_25F640S33T8,
7011 .total_size = 8192,
7012 .page_size = 256,
7013 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7014 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7015 .tested = TEST_UNTESTED,
7016 .probe = probe_spi_rdid,
7017 .probe_timing = TIMING_ZERO,
7018 .block_erasers =
7019 {
7020 {
7021 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7022 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7023 * have no effect on the memory contents, but sets a flag in the SR.
7024 .eraseblocks = {
7025 {64 * 1024, 127}, // inaccessible
7026 {8 * 1024, 8}
7027 },
7028 .block_erase = spi_block_erase_40,
7029 }, { */
7030 .eraseblocks = { {64 * 1024, 128} },
7031 .block_erase = spi_block_erase_d8,
7032 }, {
7033 .eraseblocks = { {8 * 1024 * 1024, 1} },
7034 .block_erase = spi_block_erase_c7,
7035 }
7036 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00007037 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7038 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00007039 .write = spi_chip_write_256,
7040 .read = spi_chip_read, /* also fast read 0x0B */
7041 .voltage = {2700, 3600},
7042 },
7043
7044 {
7045 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007046 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007047 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007048 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007049 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007050 .total_size = 128,
7051 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00007052 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007053 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007054 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00007055 .block_erasers =
7056 {
7057 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007058 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007059 {8 * 1024, 1},
7060 {4 * 1024, 2},
7061 {112 * 1024, 1},
7062 },
Sean Nelson28accc22010-03-19 18:47:06 +00007063 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007064 },
7065 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007066 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007067 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007068 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007069 },
7070
7071 {
7072 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007073 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007074 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007075 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007076 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007077 .total_size = 128,
7078 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Stefan Tauner23e10b82016-01-23 16:16:49 +00007079 .tested = TEST_OK_PREW,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007080 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007081 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00007082 .block_erasers =
7083 {
7084 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007085 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007086 {112 * 1024, 1},
7087 {4 * 1024, 2},
7088 {8 * 1024, 1},
7089 },
Sean Nelson28accc22010-03-19 18:47:06 +00007090 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007091 },
7092 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007093 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007094 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007095 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00007096 },
7097
7098 {
7099 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007100 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007101 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007102 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007103 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007104 .total_size = 256,
7105 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007106 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00007107 .probe = probe_82802ab,
7108 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7109 .block_erasers =
7110 {
7111 {
7112 .eraseblocks = {
7113 {128 * 1024, 1},
7114 {96 * 1024, 1},
7115 {8 * 1024, 2},
7116 {16 * 1024, 1},
7117 },
7118 .block_erase = erase_block_82802ab,
7119 },
7120 },
7121 .write = write_82802ab,
7122 .read = read_memmapped,
7123 },
7124
7125 {
7126 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007127 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007128 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007129 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007130 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007131 .total_size = 512,
7132 .page_size = 256,
7133 .tested = TEST_UNTESTED,
7134 .probe = probe_82802ab,
7135 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007136 .block_erasers =
7137 {
7138 {
7139 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007140 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007141 },
7142 },
Sean Nelsondee4a832010-03-22 04:39:31 +00007143 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00007144 .write = write_82802ab,
7145 .read = read_memmapped,
7146 },
7147
7148 {
7149 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007150 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007151 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007152 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007153 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007154 .total_size = 512,
7155 .page_size = 128 * 1024, /* maximal block size */
7156 .tested = TEST_UNTESTED,
7157 .probe = probe_82802ab,
7158 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7159 .block_erasers =
7160 {
7161 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007162 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007163 {16 * 1024, 1},
7164 {8 * 1024, 2},
7165 {96 * 1024, 1},
7166 {128 * 1024, 3},
7167 },
7168 .block_erase = erase_block_82802ab,
7169 },
7170 },
7171 .write = write_82802ab,
7172 .read = read_memmapped,
7173 },
7174
7175 {
7176 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007177 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007178 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007179 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007180 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007181 .total_size = 512,
7182 .page_size = 128 * 1024, /* maximal block size */
7183 .tested = TEST_UNTESTED,
7184 .probe = probe_82802ab,
7185 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7186 .block_erasers =
7187 {
7188 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007189 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007190 {128 * 1024, 3},
7191 {96 * 1024, 1},
7192 {8 * 1024, 2},
7193 {16 * 1024, 1},
7194 },
7195 .block_erase = erase_block_82802ab,
7196 },
7197 },
7198 .write = write_82802ab,
7199 .read = read_memmapped,
7200 },
7201
7202 {
7203 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007204 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007205 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007206 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007207 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007208 .total_size = 512,
7209 .page_size = 128 * 1024, /* maximal block size */
7210 .feature_bits = FEATURE_ADDR_SHIFTED,
7211 .tested = TEST_UNTESTED,
7212 .probe = probe_82802ab,
7213 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7214 .block_erasers =
7215 {
7216 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007217 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007218 {16 * 1024, 1},
7219 {8 * 1024, 2},
7220 {96 * 1024, 1},
7221 {128 * 1024, 3},
7222 },
7223 .block_erase = erase_block_82802ab,
7224 },
7225 },
7226 .write = write_82802ab,
7227 .read = read_memmapped,
7228 },
7229
7230 {
7231 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007232 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007233 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007234 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007235 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007236 .total_size = 512,
7237 .page_size = 128 * 1024, /* maximal block size */
7238 .feature_bits = FEATURE_ADDR_SHIFTED,
7239 .tested = TEST_UNTESTED,
7240 .probe = probe_82802ab,
7241 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7242 .block_erasers =
7243 {
7244 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007245 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007246 {128 * 1024, 3},
7247 {96 * 1024, 1},
7248 {8 * 1024, 2},
7249 {16 * 1024, 1},
7250 },
7251 .block_erase = erase_block_82802ab,
7252 },
7253 },
7254 .write = write_82802ab,
7255 .read = read_memmapped,
7256 },
7257
7258 {
7259 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007260 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007261 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007262 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007263 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007264 .total_size = 512,
7265 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007266 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007267 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007268 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007269 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007270 .block_erasers =
7271 {
7272 {
7273 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007274 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007275 },
7276 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007277 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007278 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007279 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007280 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007281 },
7282
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007283 {
7284 .vendor = "Intel",
7285 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007286 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007287 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007288 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007289 .total_size = 1024,
7290 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007291 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00007292 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007293 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007294 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007295 .block_erasers =
7296 {
7297 {
7298 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00007299 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007300 },
7301 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007302 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007303 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007304 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007305 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007306 },
7307
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007308 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007309 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007310 .name = "IS25LP064",
7311 .bustype = BUS_SPI,
7312 .manufacture_id = ISSI_ID_SPI,
7313 .model_id = ISSI_IS25LP064,
7314 .total_size = 8192,
7315 .page_size = 256,
7316 /* OTP: 1024B total; read 0x48; write 0x42 */
7317 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7318 .tested = TEST_UNTESTED,
7319 .probe = probe_spi_rdid,
7320 .probe_timing = TIMING_ZERO,
7321 .block_erasers =
7322 {
7323 {
7324 .eraseblocks = { {4 * 1024, 2048} },
7325 .block_erase = spi_block_erase_20,
7326 }, {
7327 .eraseblocks = { {4 * 1024, 2048} },
7328 .block_erase = spi_block_erase_d7,
7329 }, {
7330 .eraseblocks = { {32 * 1024, 256} },
7331 .block_erase = spi_block_erase_52,
7332 }, {
7333 .eraseblocks = { {64 * 1024, 128} },
7334 .block_erase = spi_block_erase_d8,
7335 }, {
7336 .eraseblocks = { {8 * 1024 * 1024, 1} },
7337 .block_erase = spi_block_erase_60,
7338 }, {
7339 .eraseblocks = { {8 * 1024 * 1024, 1} },
7340 .block_erase = spi_block_erase_c7,
7341 }
7342 },
7343 .unlock = spi_disable_blockprotect,
7344 .write = spi_chip_write_256,
7345 .read = spi_chip_read,
7346 .voltage = {2300, 3600},
7347 },
7348
7349 {
7350 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007351 .name = "IS25LP128",
7352 .bustype = BUS_SPI,
7353 .manufacture_id = ISSI_ID_SPI,
7354 .model_id = ISSI_IS25LP128,
7355 .total_size = 16384,
7356 .page_size = 256,
7357 /* OTP: 1024B total; read 0x48; write 0x42 */
7358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7359 .tested = TEST_OK_PREW,
7360 .probe = probe_spi_rdid,
7361 .probe_timing = TIMING_ZERO,
7362 .block_erasers =
7363 {
7364 {
7365 .eraseblocks = { {4 * 1024, 4096} },
7366 .block_erase = spi_block_erase_20,
7367 }, {
7368 .eraseblocks = { {4 * 1024, 4096} },
7369 .block_erase = spi_block_erase_d7,
7370 }, {
7371 .eraseblocks = { {32 * 1024, 512} },
7372 .block_erase = spi_block_erase_52,
7373 }, {
7374 .eraseblocks = { {64 * 1024, 256} },
7375 .block_erase = spi_block_erase_d8,
7376 }, {
7377 .eraseblocks = { {16 * 1024 * 1024, 1} },
7378 .block_erase = spi_block_erase_60,
7379 }, {
7380 .eraseblocks = { {16 * 1024 * 1024, 1} },
7381 .block_erase = spi_block_erase_c7,
7382 }
7383 },
7384 .unlock = spi_disable_blockprotect,
7385 .write = spi_chip_write_256,
7386 .read = spi_chip_read,
7387 .voltage = {2300, 3600},
7388 },
7389
7390 {
7391 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007392 .name = "IS25LP256",
7393 .bustype = BUS_SPI,
7394 .manufacture_id = ISSI_ID_SPI,
7395 .model_id = ISSI_IS25LP256,
7396 .total_size = 32768,
7397 .page_size = 256,
7398 /* supports SFDP */
7399 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7400 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7401 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7402 .tested = TEST_OK_PREW,
7403 .probe = probe_spi_rdid,
7404 .probe_timing = TIMING_ZERO,
7405 .block_erasers =
7406 {
7407 {
7408 .eraseblocks = { {4 * 1024, 8192} },
7409 .block_erase = spi_block_erase_21,
7410 }, {
7411 .eraseblocks = { {4 * 1024, 8192} },
7412 .block_erase = spi_block_erase_20,
7413 /* could also use spi_block_erase_d7 */
7414 }, {
7415 .eraseblocks = { {32 * 1024, 1024} },
7416 .block_erase = spi_block_erase_5c,
7417 }, {
7418 .eraseblocks = { {32 * 1024, 1024} },
7419 .block_erase = spi_block_erase_52,
7420 }, {
7421 .eraseblocks = { {64 * 1024, 512} },
7422 .block_erase = spi_block_erase_dc,
7423 }, {
7424 .eraseblocks = { {64 * 1024, 512} },
7425 .block_erase = spi_block_erase_d8,
7426 }, {
7427 .eraseblocks = { {32 * 1024 * 1024, 1} },
7428 .block_erase = spi_block_erase_60,
7429 }, {
7430 .eraseblocks = { {32 * 1024 * 1024, 1} },
7431 .block_erase = spi_block_erase_c7,
7432 }
7433 },
7434 .unlock = spi_disable_blockprotect,
7435 .write = spi_chip_write_256,
7436 .read = spi_chip_read,
7437 .voltage = {2300, 3600},
7438 },
7439
7440 {
7441 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007442 .name = "IS25WP032",
7443 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007444 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007445 .model_id = ISSI_IS25WP032,
7446 .total_size = 4096,
7447 .page_size = 256,
7448 /* OTP: 1024B total; read 0x48; write 0x42 */
7449 /* QPI enable 0x35, disable 0xF5 */
7450 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7451 .tested = TEST_UNTESTED,
7452 .probe = probe_spi_rdid,
7453 .probe_timing = TIMING_ZERO,
7454 .block_erasers =
7455 {
7456 {
7457 .eraseblocks = { {4 * 1024, 1024} },
7458 .block_erase = spi_block_erase_20,
7459 }, {
7460 .eraseblocks = { {4 * 1024, 1024} },
7461 .block_erase = spi_block_erase_d7,
7462 }, {
7463 .eraseblocks = { {32 * 1024, 128} },
7464 .block_erase = spi_block_erase_52,
7465 }, {
7466 .eraseblocks = { {64 * 1024, 64} },
7467 .block_erase = spi_block_erase_d8,
7468 }, {
7469 .eraseblocks = { {4 * 1024 * 1024, 1} },
7470 .block_erase = spi_block_erase_60,
7471 }, {
7472 .eraseblocks = { {4 * 1024 * 1024, 1} },
7473 .block_erase = spi_block_erase_c7,
7474 }
7475 },
7476 .unlock = spi_disable_blockprotect,
7477 .write = spi_chip_write_256,
7478 .read = spi_chip_read,
7479 .voltage = {1650, 1950},
7480 },
7481
7482 {
7483 .vendor = "ISSI",
7484 .name = "IS25WP064",
7485 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007486 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007487 .model_id = ISSI_IS25WP064,
7488 .total_size = 8192,
7489 .page_size = 256,
7490 /* OTP: 1024B total; read 0x48; write 0x42 */
7491 /* QPI enable 0x35, disable 0xF5 */
7492 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7493 .tested = TEST_OK_PREW,
7494 .probe = probe_spi_rdid,
7495 .probe_timing = TIMING_ZERO,
7496 .block_erasers =
7497 {
7498 {
7499 .eraseblocks = { {4 * 1024, 2048} },
7500 .block_erase = spi_block_erase_20,
7501 }, {
7502 .eraseblocks = { {4 * 1024, 2048} },
7503 .block_erase = spi_block_erase_d7,
7504 }, {
7505 .eraseblocks = { {32 * 1024, 256} },
7506 .block_erase = spi_block_erase_52,
7507 }, {
7508 .eraseblocks = { {64 * 1024, 128} },
7509 .block_erase = spi_block_erase_d8,
7510 }, {
7511 .eraseblocks = { {8 * 1024 * 1024, 1} },
7512 .block_erase = spi_block_erase_60,
7513 }, {
7514 .eraseblocks = { {8 * 1024 * 1024, 1} },
7515 .block_erase = spi_block_erase_c7,
7516 }
7517 },
7518 .unlock = spi_disable_blockprotect,
7519 .write = spi_chip_write_256,
7520 .read = spi_chip_read,
7521 .voltage = {1650, 1950},
7522 },
7523
7524 {
7525 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007526 .name = "IS25WP128",
7527 .bustype = BUS_SPI,
7528 .manufacture_id = ISSI_ID_SPI,
7529 .model_id = ISSI_IS25WP128,
7530 .total_size = 16384,
7531 .page_size = 256,
7532 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huberb27b8d12018-10-02 20:46:21 +02007533 /* QPI enable 0x35, disable 0xF5 */
7534 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks3083ed92017-05-02 13:25:56 -07007535 .tested = TEST_OK_PREW,
7536 .probe = probe_spi_rdid,
7537 .probe_timing = TIMING_ZERO,
7538 .block_erasers =
7539 {
7540 {
7541 .eraseblocks = { {4 * 1024, 4096} },
7542 .block_erase = spi_block_erase_20,
7543 }, {
7544 .eraseblocks = { {4 * 1024, 4096} },
7545 .block_erase = spi_block_erase_d7,
7546 }, {
7547 .eraseblocks = { {32 * 1024, 512} },
7548 .block_erase = spi_block_erase_52,
7549 }, {
7550 .eraseblocks = { {64 * 1024, 256} },
7551 .block_erase = spi_block_erase_d8,
7552 }, {
7553 .eraseblocks = { {16 * 1024 * 1024, 1} },
7554 .block_erase = spi_block_erase_60,
7555 }, {
7556 .eraseblocks = { {16 * 1024 * 1024, 1} },
7557 .block_erase = spi_block_erase_c7,
7558 }
7559 },
7560 .unlock = spi_disable_blockprotect,
7561 .write = spi_chip_write_256,
7562 .read = spi_chip_read,
7563 .voltage = {1650, 1950},
7564 },
7565
7566 {
7567 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007568 .name = "IS25WP256",
7569 .bustype = BUS_SPI,
7570 .manufacture_id = ISSI_ID_SPI,
7571 .model_id = ISSI_IS25WP256,
7572 .total_size = 32768,
7573 .page_size = 256,
7574 /* supports SFDP */
7575 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7576 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7577 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7578 .tested = TEST_OK_PREW,
7579 .probe = probe_spi_rdid,
7580 .probe_timing = TIMING_ZERO,
7581 .block_erasers =
7582 {
7583 {
7584 .eraseblocks = { {4 * 1024, 8192} },
7585 .block_erase = spi_block_erase_21,
7586 }, {
7587 .eraseblocks = { {4 * 1024, 8192} },
7588 .block_erase = spi_block_erase_20,
7589 /* could also use spi_block_erase_d7 */
7590 }, {
7591 .eraseblocks = { {32 * 1024, 1024} },
7592 .block_erase = spi_block_erase_5c,
7593 }, {
7594 .eraseblocks = { {32 * 1024, 1024} },
7595 .block_erase = spi_block_erase_52,
7596 }, {
7597 .eraseblocks = { {64 * 1024, 512} },
7598 .block_erase = spi_block_erase_dc,
7599 }, {
7600 .eraseblocks = { {64 * 1024, 512} },
7601 .block_erase = spi_block_erase_d8,
7602 }, {
7603 .eraseblocks = { {32 * 1024 * 1024, 1} },
7604 .block_erase = spi_block_erase_60,
7605 }, {
7606 .eraseblocks = { {32 * 1024 * 1024, 1} },
7607 .block_erase = spi_block_erase_c7,
7608 }
7609 },
7610 .unlock = spi_disable_blockprotect,
7611 .write = spi_chip_write_256,
7612 .read = spi_chip_read,
7613 .voltage = {1650, 1950},
7614 },
7615
7616 {
7617 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007618 .name = "IS29GL064B",
7619 .bustype = BUS_PARALLEL,
7620 .manufacture_id = ISSI_ID,
7621 .model_id = ISSI_PMC_IS29GL064B,
7622 .total_size = 8192,
7623 .page_size = 128 * 1024, /* actual page size is 16 */
7624 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7625 .tested = TEST_UNTESTED,
7626 .probe = probe_jedec_29gl,
7627 .probe_timing = TIMING_ZERO,
7628 .block_erasers =
7629 {
7630 {
7631 .eraseblocks = {
7632 {8 * 1024, 8},
7633 {64 * 1024, 127},
7634 },
7635 .block_erase = erase_sector_jedec,
7636 }, {
7637 .eraseblocks = { {8 * 1024 * 1024, 1} },
7638 .block_erase = erase_chip_block_jedec,
7639 },
7640 },
7641 .write = write_jedec_1,
7642 .read = read_memmapped,
7643 .voltage = {2700, 3600},
7644 },
7645
7646 {
7647 .vendor = "ISSI",
7648 .name = "IS29GL064T",
7649 .bustype = BUS_PARALLEL,
7650 .manufacture_id = ISSI_ID,
7651 .model_id = ISSI_PMC_IS29GL064T,
7652 .total_size = 8192,
7653 .page_size = 128 * 1024, /* actual page size is 16 */
7654 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7655 .tested = TEST_UNTESTED,
7656 .probe = probe_jedec_29gl,
7657 .probe_timing = TIMING_ZERO,
7658 .block_erasers =
7659 {
7660 {
7661 .eraseblocks = {
7662 {64 * 1024, 127},
7663 {8 * 1024, 8},
7664 },
7665 .block_erase = erase_sector_jedec,
7666 }, {
7667 .eraseblocks = { {8 * 1024 * 1024, 1} },
7668 .block_erase = erase_chip_block_jedec,
7669 },
7670 },
7671 .write = write_jedec_1,
7672 .read = read_memmapped,
7673 .voltage = {2700, 3600},
7674 },
7675
7676 {
7677 .vendor = "ISSI",
7678 .name = "IS29GL064H/L",
7679 .bustype = BUS_PARALLEL,
7680 .manufacture_id = ISSI_ID,
7681 .model_id = ISSI_PMC_IS29GL064HL,
7682 .total_size = 8192,
7683 .page_size = 128 * 1024, /* actual page size is 16 */
7684 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7685 .tested = TEST_UNTESTED,
7686 .probe = probe_jedec_29gl,
7687 .probe_timing = TIMING_ZERO,
7688 .block_erasers =
7689 {
7690 {
7691 .eraseblocks = { {64 * 1024, 128} },
7692 .block_erase = erase_sector_jedec,
7693 }, {
7694 .eraseblocks = { {8 * 1024 * 1024, 1} },
7695 .block_erase = erase_chip_block_jedec,
7696 },
7697 },
7698 .write = write_jedec_1,
7699 .read = read_memmapped,
7700 .voltage = {2700, 3600},
7701 },
7702
7703 {
7704 .vendor = "ISSI",
7705 .name = "IS29GL128H/L",
7706 .bustype = BUS_PARALLEL,
7707 .manufacture_id = ISSI_ID,
7708 .model_id = ISSI_PMC_IS29GL128HL,
7709 .total_size = 16384,
7710 .page_size = 128 * 1024, /* actual page size is 16 */
7711 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7712 .tested = TEST_UNTESTED,
7713 .probe = probe_jedec_29gl,
7714 .probe_timing = TIMING_ZERO,
7715 .block_erasers =
7716 {
7717 {
7718 .eraseblocks = { {128 * 1024, 128} },
7719 .block_erase = erase_sector_jedec,
7720 }, {
7721 .eraseblocks = { {16 * 1024 * 1024, 1} },
7722 .block_erase = erase_chip_block_jedec,
7723 },
7724 },
7725 .write = write_jedec_1,
7726 .read = read_memmapped,
7727 .voltage = {2700, 3600},
7728 },
7729
7730 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007731 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007732 .name = "MX23L1654",
7733 .bustype = BUS_SPI,
7734 .manufacture_id = MACRONIX_ID,
7735 .model_id = MACRONIX_MX23L1654,
7736 .total_size = 2048,
7737 .page_size = 256,
7738 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7739 .probe = probe_spi_rdid,
7740 .probe_timing = TIMING_ZERO,
7741 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7742 .read = spi_chip_read, /* Fast read (0x0B) supported */
7743 .voltage = {3000, 3600},
7744 },
7745
7746 {
7747 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007748 .name = "MX23L3254",
7749 .bustype = BUS_SPI,
7750 .manufacture_id = MACRONIX_ID,
7751 .model_id = MACRONIX_MX23L3254,
7752 .total_size = 4096,
7753 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00007754 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007755 .probe = probe_spi_rdid,
7756 .probe_timing = TIMING_ZERO,
7757 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7758 .read = spi_chip_read, /* Fast read (0x0B) supported */
7759 .voltage = {3000, 3600},
7760 },
7761
7762 {
7763 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007764 .name = "MX23L6454",
7765 .bustype = BUS_SPI,
7766 .manufacture_id = MACRONIX_ID,
7767 .model_id = MACRONIX_MX23L6454,
7768 .total_size = 8192,
7769 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007770 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00007771 .probe = probe_spi_rdid,
7772 .probe_timing = TIMING_ZERO,
7773 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7774 .read = spi_chip_read, /* Fast read (0x0B) supported */
7775 .voltage = {3000, 3600},
7776 },
7777
7778 {
7779 .vendor = "Macronix",
7780 .name = "MX23L12854",
7781 .bustype = BUS_SPI,
7782 .manufacture_id = MACRONIX_ID,
7783 .model_id = MACRONIX_MX23L12854,
7784 .total_size = 16384,
7785 .page_size = 256,
7786 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7787 .probe = probe_spi_rdid,
7788 .probe_timing = TIMING_ZERO,
7789 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7790 .read = spi_chip_read, /* Fast read (0x0B) supported */
7791 .voltage = {3000, 3600},
7792 },
7793
7794 {
7795 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007796 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007797 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007798 .manufacture_id = MACRONIX_ID,
7799 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007800 .total_size = 64,
7801 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007802 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007803 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007804 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007805 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007806 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007807 .block_erasers =
7808 {
7809 {
7810 .eraseblocks = { {4 * 1024, 16} },
7811 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007812 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007813 .eraseblocks = { {64 * 1024, 1} },
7814 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007815 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007816 .eraseblocks = { {64 * 1024, 1} },
7817 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007818 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007819 .eraseblocks = { {64 * 1024, 1} },
7820 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007821 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007822 .eraseblocks = { {64 * 1024, 1} },
7823 .block_erase = spi_block_erase_c7,
7824 },
7825 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007826 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007827 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007828 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007829 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
7830 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00007831 },
7832
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007833 {
7834 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007835 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007836 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007837 .manufacture_id = MACRONIX_ID,
7838 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007839 .total_size = 128,
7840 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007841 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007842 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00007843 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007844 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007845 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007846 .block_erasers =
7847 {
7848 {
7849 .eraseblocks = { {4 * 1024, 32} },
7850 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007851 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007852 .eraseblocks = { {64 * 1024, 2} },
7853 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007854 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007855 .eraseblocks = { {128 * 1024, 1} },
7856 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007857 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007858 .eraseblocks = { {128 * 1024, 1} },
7859 .block_erase = spi_block_erase_c7,
7860 },
7861 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007862 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007863 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007864 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007865 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007866 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007867 },
7868
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007869 {
7870 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007871 .name = "MX25L2005(C)/MX25L2006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007872 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007873 .manufacture_id = MACRONIX_ID,
7874 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007875 .total_size = 256,
7876 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007877 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007878 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007879 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007880 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007881 .block_erasers =
7882 {
7883 {
7884 .eraseblocks = { {4 * 1024, 64} },
7885 .block_erase = spi_block_erase_20,
7886 }, {
7887 .eraseblocks = { {64 * 1024, 4} },
7888 .block_erase = spi_block_erase_52,
7889 }, {
7890 .eraseblocks = { {64 * 1024, 4} },
7891 .block_erase = spi_block_erase_d8,
7892 }, {
7893 .eraseblocks = { {256 * 1024, 1} },
7894 .block_erase = spi_block_erase_60,
7895 }, {
7896 .eraseblocks = { {256 * 1024, 1} },
7897 .block_erase = spi_block_erase_c7,
7898 },
7899 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007900 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007901 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007902 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007903 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007904 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007905 },
7906
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007907 {
7908 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007909 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007910 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007911 .manufacture_id = MACRONIX_ID,
7912 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007913 .total_size = 512,
7914 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007915 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00007916 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007917 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007918 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007919 .block_erasers =
7920 {
7921 {
7922 .eraseblocks = { {4 * 1024, 128} },
7923 .block_erase = spi_block_erase_20,
7924 }, {
7925 .eraseblocks = { {64 * 1024, 8} },
7926 .block_erase = spi_block_erase_52,
7927 }, {
7928 .eraseblocks = { {64 * 1024, 8} },
7929 .block_erase = spi_block_erase_d8,
7930 }, {
7931 .eraseblocks = { {512 * 1024, 1} },
7932 .block_erase = spi_block_erase_60,
7933 }, {
7934 .eraseblocks = { {512 * 1024, 1} },
7935 .block_erase = spi_block_erase_c7,
7936 },
7937 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007938 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007939 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007940 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007941 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007942 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007943 },
7944
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007945 {
7946 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007947 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007948 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007949 .manufacture_id = MACRONIX_ID,
7950 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007951 .total_size = 1024,
7952 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007953 /* MX25L8006E, MX25L8008E support SFDP */
7954 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
David Hendricks67db2eb2010-09-03 03:35:48 +00007955 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00007956 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007957 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007958 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007959 .block_erasers =
7960 {
7961 {
7962 .eraseblocks = { {4 * 1024, 256} },
7963 .block_erase = spi_block_erase_20,
7964 }, {
7965 .eraseblocks = { {64 * 1024, 16} },
7966 .block_erase = spi_block_erase_52,
7967 }, {
7968 .eraseblocks = { {64 * 1024, 16} },
7969 .block_erase = spi_block_erase_d8,
7970 }, {
7971 .eraseblocks = { {1024 * 1024, 1} },
7972 .block_erase = spi_block_erase_60,
7973 }, {
7974 .eraseblocks = { {1024 * 1024, 1} },
7975 .block_erase = spi_block_erase_c7,
7976 },
7977 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007978 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007979 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007980 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007981 .read = spi_chip_read, /* Fast read (0x0B) supported */
7982 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00007983 },
7984
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007985 {
7986 .vendor = "Macronix",
7987 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007988 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007989 .manufacture_id = MACRONIX_ID,
7990 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007991 .total_size = 2048,
7992 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007993 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00007994 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007995 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007996 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007997 .block_erasers =
7998 {
7999 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008000 .eraseblocks = { {64 * 1024, 32} },
8001 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008002 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008003 .eraseblocks = { {64 * 1024, 32} },
8004 .block_erase = spi_block_erase_d8,
8005 }, {
8006 .eraseblocks = { {2 * 1024 * 1024, 1} },
8007 .block_erase = spi_block_erase_60,
8008 }, {
8009 .eraseblocks = { {2 * 1024 * 1024, 1} },
8010 .block_erase = spi_block_erase_c7,
8011 },
8012 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008013 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00008014 .unlock = spi_disable_blockprotect,
8015 .write = spi_chip_write_256,
8016 .read = spi_chip_read, /* Fast read (0x0B) supported */
8017 .voltage = {2700, 3600},
8018 },
8019
8020 {
8021 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008022 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008023 .bustype = BUS_SPI,
8024 .manufacture_id = MACRONIX_ID,
8025 .model_id = MACRONIX_MX25L1605,
8026 .total_size = 2048,
8027 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008028 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008029 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8030 .tested = TEST_OK_PREW,
8031 .probe = probe_spi_rdid,
8032 .probe_timing = TIMING_ZERO,
8033 .block_erasers =
8034 {
8035 {
8036 .eraseblocks = { {4 * 1024, 512} },
8037 .block_erase = spi_block_erase_20,
8038 }, {
8039 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008040 .block_erase = spi_block_erase_52,
8041 }, {
8042 .eraseblocks = { {64 * 1024, 32} },
8043 .block_erase = spi_block_erase_d8,
8044 }, {
8045 .eraseblocks = { {2 * 1024 * 1024, 1} },
8046 .block_erase = spi_block_erase_60,
8047 }, {
8048 .eraseblocks = { {2 * 1024 * 1024, 1} },
8049 .block_erase = spi_block_erase_c7,
8050 },
8051 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008052 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008053 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008054 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008055 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008056 .voltage = {2700, 3600},
8057 },
8058
8059 {
8060 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008061 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008062 .bustype = BUS_SPI,
8063 .manufacture_id = MACRONIX_ID,
8064 .model_id = MACRONIX_MX25L1605,
8065 .total_size = 2048,
8066 .page_size = 256,
8067 .feature_bits = FEATURE_WRSR_WREN,
8068 .tested = TEST_OK_PREW,
8069 .probe = probe_spi_rdid,
8070 .probe_timing = TIMING_ZERO,
8071 .block_erasers =
8072 {
8073 {
8074 .eraseblocks = { {4 * 1024, 512} },
8075 .block_erase = spi_block_erase_20,
8076 }, {
8077 .eraseblocks = { {64 * 1024, 32} },
8078 .block_erase = spi_block_erase_d8,
8079 }, {
8080 .eraseblocks = { {2 * 1024 * 1024, 1} },
8081 .block_erase = spi_block_erase_60,
8082 }, {
8083 .eraseblocks = { {2 * 1024 * 1024, 1} },
8084 .block_erase = spi_block_erase_c7,
8085 },
8086 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008087 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008088 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008089 .write = spi_chip_write_256,
8090 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008091 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008092 },
8093
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008094 {
8095 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008096 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008097 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008098 .manufacture_id = MACRONIX_ID,
8099 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008100 .total_size = 2048,
8101 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008102 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8103 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008104 .tested = TEST_UNTESTED,
8105 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008106 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008107 .block_erasers =
8108 {
8109 {
8110 .eraseblocks = { {4 * 1024, 512} },
8111 .block_erase = spi_block_erase_20,
8112 }, {
8113 .eraseblocks = { {64 * 1024, 32} },
8114 .block_erase = spi_block_erase_d8,
8115 }, {
8116 .eraseblocks = { {2 * 1024 * 1024, 1} },
8117 .block_erase = spi_block_erase_60,
8118 }, {
8119 .eraseblocks = { {2 * 1024 * 1024, 1} },
8120 .block_erase = spi_block_erase_c7,
8121 }
8122 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008123 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008124 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008125 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008126 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008127 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008128 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00008129
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008130 {
8131 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00008132 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008133 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008134 .manufacture_id = MACRONIX_ID,
8135 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008136 .total_size = 2048,
8137 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008138 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8139 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008140 .tested = TEST_UNTESTED,
8141 .probe = probe_spi_rdid,
8142 .probe_timing = TIMING_ZERO,
8143 .block_erasers =
8144 {
8145 {
8146 .eraseblocks = { {4 * 1024, 512} },
8147 .block_erase = spi_block_erase_20,
8148 }, {
8149 .eraseblocks = { {64 * 1024, 32} },
8150 .block_erase = spi_block_erase_d8,
8151 }, {
8152 .eraseblocks = { {2 * 1024 * 1024, 1} },
8153 .block_erase = spi_block_erase_60,
8154 }, {
8155 .eraseblocks = { {2 * 1024 * 1024, 1} },
8156 .block_erase = spi_block_erase_c7,
8157 }
8158 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008159 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008160 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008161 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008162 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008163 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00008164 },
8165
8166 {
8167 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00008168 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008169 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008170 .manufacture_id = MACRONIX_ID,
8171 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008172 .total_size = 4096,
8173 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008174 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00008175 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008176 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008177 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008178 .block_erasers =
8179 {
8180 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008181 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008182 .block_erase = spi_block_erase_20,
8183 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008184 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008185 .block_erase = spi_block_erase_d8,
8186 }, {
8187 .eraseblocks = { {4 * 1024 * 1024, 1} },
8188 .block_erase = spi_block_erase_60,
8189 }, {
8190 .eraseblocks = { {4 * 1024 * 1024, 1} },
8191 .block_erase = spi_block_erase_c7,
8192 },
8193 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008194 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008195 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008196 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008197 .read = spi_chip_read, /* Fast read (0x0B) supported */
8198 .voltage = {2700, 3600},
8199 },
8200
8201 {
8202 .vendor = "Macronix",
8203 .name = "MX25L3205D/MX25L3208D",
8204 .bustype = BUS_SPI,
8205 .manufacture_id = MACRONIX_ID,
8206 .model_id = MACRONIX_MX25L3205,
8207 .total_size = 4096,
8208 .page_size = 256,
8209 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8211 .tested = TEST_OK_PREW,
8212 .probe = probe_spi_rdid,
8213 .probe_timing = TIMING_ZERO,
8214 .block_erasers =
8215 {
8216 {
8217 .eraseblocks = { {4 * 1024, 1024} },
8218 .block_erase = spi_block_erase_20,
8219 }, {
8220 .eraseblocks = { {64 * 1024, 64} },
8221 .block_erase = spi_block_erase_d8,
8222 }, {
8223 .eraseblocks = { {4 * 1024 * 1024, 1} },
8224 .block_erase = spi_block_erase_60,
8225 }, {
8226 .eraseblocks = { {4 * 1024 * 1024, 1} },
8227 .block_erase = spi_block_erase_c7,
8228 },
8229 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008230 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008231 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008232 .write = spi_chip_write_256,
8233 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8234 .voltage = {2700, 3600},
8235 },
8236
8237 {
8238 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008239 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008240 .bustype = BUS_SPI,
8241 .manufacture_id = MACRONIX_ID,
8242 .model_id = MACRONIX_MX25L3205,
8243 .total_size = 4096,
8244 .page_size = 256,
8245 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8246 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8247 .tested = TEST_OK_PREW,
8248 .probe = probe_spi_rdid,
8249 .probe_timing = TIMING_ZERO,
8250 .block_erasers =
8251 {
8252 {
8253 .eraseblocks = { {4 * 1024, 1024} },
8254 .block_erase = spi_block_erase_20,
8255 }, {
8256 .eraseblocks = { {64 * 1024, 64} },
8257 .block_erase = spi_block_erase_d8,
8258 }, {
8259 .eraseblocks = { {64 * 1024, 64} },
8260 .block_erase = spi_block_erase_52,
8261 }, {
8262 .eraseblocks = { {4 * 1024 * 1024, 1} },
8263 .block_erase = spi_block_erase_60,
8264 }, {
8265 .eraseblocks = { {4 * 1024 * 1024, 1} },
8266 .block_erase = spi_block_erase_c7,
8267 },
8268 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008269 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008270 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008271 .write = spi_chip_write_256,
8272 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008273 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008274 },
8275
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008276 {
8277 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008278 .name = "MX25L3273E",
8279 .bustype = BUS_SPI,
8280 .manufacture_id = MACRONIX_ID,
8281 .model_id = MACRONIX_MX25L3205,
8282 .total_size = 4096,
8283 .page_size = 256,
8284 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8285 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008286 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008287 .probe = probe_spi_rdid,
8288 .probe_timing = TIMING_ZERO,
8289 .block_erasers =
8290 {
8291 {
8292 .eraseblocks = { {4 * 1024, 1024} },
8293 .block_erase = spi_block_erase_20,
8294 }, {
8295 .eraseblocks = { {32 * 1024, 128} },
8296 .block_erase = spi_block_erase_52,
8297 }, {
8298 .eraseblocks = { {64 * 1024, 64} },
8299 .block_erase = spi_block_erase_d8,
8300 }, {
8301 .eraseblocks = { {4 * 1024 * 1024, 1} },
8302 .block_erase = spi_block_erase_60,
8303 }, {
8304 .eraseblocks = { {4 * 1024 * 1024, 1} },
8305 .block_erase = spi_block_erase_c7,
8306 },
8307 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008308 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008309 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008310 .write = spi_chip_write_256,
8311 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8312 .voltage = {2700, 3600},
8313 },
8314
8315 {
8316 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008317 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008318 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008319 .manufacture_id = MACRONIX_ID,
8320 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008321 .total_size = 4096,
8322 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008323 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
8324 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008325 .tested = TEST_UNTESTED,
8326 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008327 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008328 .block_erasers =
8329 {
8330 {
8331 .eraseblocks = { {4 * 1024, 1024} },
8332 .block_erase = spi_block_erase_20,
8333 }, {
8334 .eraseblocks = { {64 * 1024, 64} },
8335 .block_erase = spi_block_erase_d8,
8336 }, {
8337 .eraseblocks = { {4 * 1024 * 1024, 1} },
8338 .block_erase = spi_block_erase_60,
8339 }, {
8340 .eraseblocks = { {4 * 1024 * 1024, 1} },
8341 .block_erase = spi_block_erase_c7,
8342 }
8343 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008344 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008345 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008346 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008347 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008348 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008349 },
8350
8351 {
8352 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008353 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008354 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008355 .manufacture_id = MACRONIX_ID,
8356 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008357 .total_size = 8192,
8358 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008359 /* Has an additional 512B EEPROM sector */
8360 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00008361 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008362 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008363 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008364 .block_erasers =
8365 {
8366 {
8367 .eraseblocks = { {64 * 1024, 128} },
8368 .block_erase = spi_block_erase_20,
8369 }, {
8370 .eraseblocks = { {64 * 1024, 128} },
8371 .block_erase = spi_block_erase_d8,
8372 }, {
8373 .eraseblocks = { {8 * 1024 * 1024, 1} },
8374 .block_erase = spi_block_erase_60,
8375 }, {
8376 .eraseblocks = { {8 * 1024 * 1024, 1} },
8377 .block_erase = spi_block_erase_c7,
8378 }
8379 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008380 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008381 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008382 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008383 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008384 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008385 },
8386
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008387 {
8388 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008389 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00008390 .bustype = BUS_SPI,
8391 .manufacture_id = MACRONIX_ID,
8392 .model_id = MACRONIX_MX25L6405,
8393 .total_size = 8192,
8394 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008395 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008396 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8397 .tested = TEST_OK_PREW,
8398 .probe = probe_spi_rdid,
8399 .probe_timing = TIMING_ZERO,
8400 .block_erasers =
8401 {
8402 {
8403 .eraseblocks = { {4 * 1024, 2048} },
8404 .block_erase = spi_block_erase_20,
8405 }, {
8406 .eraseblocks = { {64 * 1024, 128} },
8407 .block_erase = spi_block_erase_d8,
8408 }, {
8409 .eraseblocks = { {8 * 1024 * 1024, 1} },
8410 .block_erase = spi_block_erase_60,
8411 }, {
8412 .eraseblocks = { {8 * 1024 * 1024, 1} },
8413 .block_erase = spi_block_erase_c7,
8414 }
8415 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008416 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008417 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008418 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008419 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00008420 .voltage = {2700, 3600},
8421 },
8422
8423 {
8424 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008425 .name = "MX25L6406E/MX25L6408E",
8426 .bustype = BUS_SPI,
8427 .manufacture_id = MACRONIX_ID,
8428 .model_id = MACRONIX_MX25L6405,
8429 .total_size = 8192,
8430 .page_size = 256,
8431 /* MX25L6406E supports SFDP */
8432 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
8433 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8434 .tested = TEST_OK_PREW,
8435 .probe = probe_spi_rdid,
8436 .probe_timing = TIMING_ZERO,
8437 .block_erasers =
8438 {
8439 {
8440 .eraseblocks = { {4 * 1024, 2048} },
8441 .block_erase = spi_block_erase_20,
8442 }, {
8443 .eraseblocks = { {64 * 1024, 128} },
8444 .block_erase = spi_block_erase_52,
8445 }, {
8446 .eraseblocks = { {64 * 1024, 128} },
8447 .block_erase = spi_block_erase_d8,
8448 }, {
8449 .eraseblocks = { {8 * 1024 * 1024, 1} },
8450 .block_erase = spi_block_erase_60,
8451 }, {
8452 .eraseblocks = { {8 * 1024 * 1024, 1} },
8453 .block_erase = spi_block_erase_c7,
8454 }
8455 },
8456 .printlock = spi_prettyprint_status_register_bp3_srwd,
8457 .unlock = spi_disable_blockprotect_bp3_srwd,
8458 .write = spi_chip_write_256,
8459 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
8460 .voltage = {2700, 3600},
8461 },
8462
8463 {
8464 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01008465 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00008466 .bustype = BUS_SPI,
8467 .manufacture_id = MACRONIX_ID,
8468 .model_id = MACRONIX_MX25L6405,
8469 .total_size = 8192,
8470 .page_size = 256,
8471 /* supports SFDP */
8472 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8473 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8474 .tested = TEST_OK_PREW,
8475 .probe = probe_spi_rdid,
8476 .probe_timing = TIMING_ZERO,
8477 .block_erasers =
8478 {
8479 {
8480 .eraseblocks = { {4 * 1024, 2048} },
8481 .block_erase = spi_block_erase_20,
8482 }, {
8483 .eraseblocks = { {32 * 1024, 256} },
8484 .block_erase = spi_block_erase_52,
8485 }, {
8486 .eraseblocks = { {64 * 1024, 128} },
8487 .block_erase = spi_block_erase_d8,
8488 }, {
8489 .eraseblocks = { {8 * 1024 * 1024, 1} },
8490 .block_erase = spi_block_erase_60,
8491 }, {
8492 .eraseblocks = { {8 * 1024 * 1024, 1} },
8493 .block_erase = spi_block_erase_c7,
8494 }
8495 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008496 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008497 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008498 .write = spi_chip_write_256,
8499 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8500 .voltage = {2700, 3600},
8501 },
8502
8503 {
8504 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00008505 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008506 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008507 .manufacture_id = MACRONIX_ID,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008508 .model_id = MACRONIX_MX25L12805D,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008509 .total_size = 16384,
8510 .page_size = 256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008511 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008512 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00008513 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008514 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008515 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008516 .block_erasers =
8517 {
8518 {
8519 .eraseblocks = { {4 * 1024, 4096} },
8520 .block_erase = spi_block_erase_20,
8521 }, {
8522 .eraseblocks = { {64 * 1024, 256} },
8523 .block_erase = spi_block_erase_d8,
8524 }, {
8525 .eraseblocks = { {16 * 1024 * 1024, 1} },
8526 .block_erase = spi_block_erase_60,
8527 }, {
8528 .eraseblocks = { {16 * 1024 * 1024, 1} },
8529 .block_erase = spi_block_erase_c7,
8530 }
8531 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008532 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008533 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008534 .write = spi_chip_write_256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008535 .read = spi_chip_read, /* Fast read (0x0B) supported */
8536 .voltage = {2700, 3600},
8537 },
8538
8539 {
8540 .vendor = "Macronix",
8541 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8542 .bustype = BUS_SPI,
8543 .manufacture_id = MACRONIX_ID,
8544 .model_id = MACRONIX_MX25L12805D,
8545 .total_size = 16384,
8546 .page_size = 256,
8547 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8548 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8549 .tested = TEST_OK_PREW,
8550 .probe = probe_spi_rdid,
8551 .probe_timing = TIMING_ZERO,
8552 .block_erasers =
8553 {
8554 {
8555 .eraseblocks = { {4 * 1024, 4096} },
8556 .block_erase = spi_block_erase_20,
8557 }, {
8558 .eraseblocks = { {32 * 1024, 512} },
8559 .block_erase = spi_block_erase_52,
8560 }, {
8561 .eraseblocks = { {64 * 1024, 256} },
8562 .block_erase = spi_block_erase_d8,
8563 }, {
8564 .eraseblocks = { {16 * 1024 * 1024, 1} },
8565 .block_erase = spi_block_erase_60,
8566 }, {
8567 .eraseblocks = { {16 * 1024 * 1024, 1} },
8568 .block_erase = spi_block_erase_c7,
8569 }
8570 },
8571 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8572 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8573 .unlock = spi_disable_blockprotect_bp3_srwd,
8574 .write = spi_chip_write_256,
8575 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008576 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008577 },
8578
8579 {
8580 .vendor = "Macronix",
Nico Huberaac81422017-11-10 22:54:13 +01008581 .name = "MX25L25635F",
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008582 .bustype = BUS_SPI,
8583 .manufacture_id = MACRONIX_ID,
8584 .model_id = MACRONIX_MX25L25635F,
8585 .total_size = 32768,
8586 .page_size = 256,
8587 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Kasper Revsbechf56607e2018-10-19 23:59:17 +02008589 .tested = TEST_OK_PREW,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008590 .probe = probe_spi_rdid,
8591 .probe_timing = TIMING_ZERO,
8592 .block_erasers =
8593 {
8594 {
8595 .eraseblocks = { {4 * 1024, 8192} },
Nico Huberaac81422017-11-10 22:54:13 +01008596 .block_erase = spi_block_erase_21,
8597 }, {
8598 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +02008599 .block_erase = spi_block_erase_20,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008600 }, {
8601 .eraseblocks = { {32 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008602 .block_erase = spi_block_erase_5c,
8603 }, {
8604 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008605 .block_erase = spi_block_erase_52,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008606 }, {
8607 .eraseblocks = { {64 * 1024, 512} },
Nico Huberaac81422017-11-10 22:54:13 +01008608 .block_erase = spi_block_erase_dc,
8609 }, {
8610 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +02008611 .block_erase = spi_block_erase_d8,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008612 }, {
8613 .eraseblocks = { {32 * 1024 * 1024, 1} },
8614 .block_erase = spi_block_erase_60,
8615 }, {
8616 .eraseblocks = { {32 * 1024 * 1024, 1} },
8617 .block_erase = spi_block_erase_c7,
8618 }
8619 },
8620 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8621 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8622 .unlock = spi_disable_blockprotect_bp3_srwd,
8623 .write = spi_chip_write_256,
8624 .read = spi_chip_read, /* Fast read (0x0B) supported */
8625 .voltage = {2700, 3600},
8626 },
8627
8628 {
8629 .vendor = "Macronix",
Timothy Pearsone29591d2016-08-27 15:43:00 -05008630 .name = "MX66L51235F",
8631 .bustype = BUS_SPI,
8632 .manufacture_id = MACRONIX_ID,
8633 .model_id = MACRONIX_MX66L51235F,
8634 .total_size = 65536,
8635 .page_size = 256,
8636 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008637 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Angel Pons09dddd82018-09-30 19:23:43 +02008638 .tested = TEST_OK_PREW,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008639 .probe = probe_spi_rdid,
8640 .probe_timing = TIMING_ZERO,
8641 .block_erasers =
8642 {
8643 {
8644 .eraseblocks = { {4 * 1024, 16384} },
Nico Huberaac81422017-11-10 22:54:13 +01008645 .block_erase = spi_block_erase_21,
8646 }, {
8647 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7a077222017-10-14 18:18:30 +02008648 .block_erase = spi_block_erase_20,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008649 }, {
8650 .eraseblocks = { {32 * 1024, 2048} },
Nico Huberaac81422017-11-10 22:54:13 +01008651 .block_erase = spi_block_erase_5c,
8652 }, {
8653 .eraseblocks = { {32 * 1024, 2048} },
Nico Huber7a077222017-10-14 18:18:30 +02008654 .block_erase = spi_block_erase_52,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008655 }, {
8656 .eraseblocks = { {64 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008657 .block_erase = spi_block_erase_dc,
8658 }, {
8659 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008660 .block_erase = spi_block_erase_d8,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008661 }, {
8662 .eraseblocks = { {64 * 1024 * 1024, 1} },
8663 .block_erase = spi_block_erase_60,
8664 }, {
8665 .eraseblocks = { {64 * 1024 * 1024, 1} },
8666 .block_erase = spi_block_erase_c7,
8667 }
8668 },
8669 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8670 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8671 .unlock = spi_disable_blockprotect_bp3_srwd,
8672 .write = spi_chip_write_256,
8673 .read = spi_chip_read, /* Fast read (0x0B) supported */
8674 .voltage = {2700, 3600},
8675 },
8676
8677 {
8678 .vendor = "Macronix",
Angel Ponsf112e242018-09-30 20:14:17 +02008679 .name = "MX25U8032E",
8680 .bustype = BUS_SPI,
8681 .manufacture_id = MACRONIX_ID,
8682 .model_id = MACRONIX_MX25U8032E,
8683 .total_size = 1024,
8684 .page_size = 256,
8685 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8686 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8687 .tested = TEST_OK_PREW,
8688 .probe = probe_spi_rdid,
8689 .probe_timing = TIMING_ZERO,
8690 .block_erasers =
8691 {
8692 {
8693 .eraseblocks = { {4 * 1024, 256} },
8694 .block_erase = spi_block_erase_20,
8695 }, {
8696 .eraseblocks = { {32 * 1024, 32} },
8697 .block_erase = spi_block_erase_52,
8698 }, {
8699 .eraseblocks = { {64 * 1024, 16} },
8700 .block_erase = spi_block_erase_d8,
8701 }, {
8702 .eraseblocks = { {1024 * 1024, 1} },
8703 .block_erase = spi_block_erase_60,
8704 }, {
8705 .eraseblocks = { {1024 * 1024, 1} },
8706 .block_erase = spi_block_erase_c7,
8707 }
8708 },
8709 /* TODO: security register */
8710 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8711 .unlock = spi_disable_blockprotect_bp3_srwd,
8712 .write = spi_chip_write_256,
8713 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8714 .voltage = {1650, 2000},
8715 },
8716
8717 {
8718 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00008719 .name = "MX25U1635E",
8720 .bustype = BUS_SPI,
8721 .manufacture_id = MACRONIX_ID,
8722 .model_id = MACRONIX_MX25U1635E,
8723 .total_size = 2048,
8724 .page_size = 256,
8725 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8726 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8727 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008728 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00008729 .probe = probe_spi_rdid,
8730 .probe_timing = TIMING_ZERO,
8731 .block_erasers =
8732 {
8733 {
8734 .eraseblocks = { {4 * 1024, 512} },
8735 .block_erase = spi_block_erase_20,
8736 }, {
8737 .eraseblocks = { {32 * 1024, 64} },
8738 .block_erase = spi_block_erase_52,
8739 }, {
8740 .eraseblocks = { {64 * 1024, 32} },
8741 .block_erase = spi_block_erase_d8,
8742 }, {
8743 .eraseblocks = { {2 * 1024 * 1024, 1} },
8744 .block_erase = spi_block_erase_60,
8745 }, {
8746 .eraseblocks = { {2 * 1024 * 1024, 1} },
8747 .block_erase = spi_block_erase_c7,
8748 }
8749 },
8750 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008751 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008752 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008753 .write = spi_chip_write_256,
8754 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8755 .voltage = {1650, 2000},
8756 },
8757
8758 {
8759 .vendor = "Macronix",
8760 .name = "MX25U3235E/F",
8761 .bustype = BUS_SPI,
8762 .manufacture_id = MACRONIX_ID,
8763 .model_id = MACRONIX_MX25U3235E,
8764 .total_size = 4096,
8765 .page_size = 256,
8766 /* F model supports SFDP */
8767 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8768 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8769 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8770 .tested = TEST_OK_PREW,
8771 .probe = probe_spi_rdid,
8772 .probe_timing = TIMING_ZERO,
8773 .block_erasers =
8774 {
8775 {
8776 .eraseblocks = { {4 * 1024, 1024} },
8777 .block_erase = spi_block_erase_20,
8778 }, {
8779 .eraseblocks = { {32 * 1024, 128} },
8780 .block_erase = spi_block_erase_52,
8781 }, {
8782 .eraseblocks = { {64 * 1024, 64} },
8783 .block_erase = spi_block_erase_d8,
8784 }, {
8785 .eraseblocks = { {4 * 1024 * 1024, 1} },
8786 .block_erase = spi_block_erase_60,
8787 }, {
8788 .eraseblocks = { {4 * 1024 * 1024, 1} },
8789 .block_erase = spi_block_erase_c7,
8790 }
8791 },
8792 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008793 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008794 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008795 .write = spi_chip_write_256,
8796 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8797 .voltage = {1650, 2000},
8798 },
8799
8800 {
8801 .vendor = "Macronix",
8802 .name = "MX25U6435E/F",
8803 .bustype = BUS_SPI,
8804 .manufacture_id = MACRONIX_ID,
8805 .model_id = MACRONIX_MX25U6435E,
8806 .total_size = 8192,
8807 .page_size = 256,
8808 /* F model supports SFDP */
8809 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8810 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8811 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008812 .tested = TEST_OK_PREW,
Vincent Palatinf800f552013-03-15 02:03:16 +00008813 .probe = probe_spi_rdid,
8814 .probe_timing = TIMING_ZERO,
8815 .block_erasers =
8816 {
8817 {
8818 .eraseblocks = { {4 * 1024, 2048} },
8819 .block_erase = spi_block_erase_20,
8820 }, {
8821 .eraseblocks = { {32 * 1024, 256} },
8822 .block_erase = spi_block_erase_52,
8823 }, {
8824 .eraseblocks = { {64 * 1024, 128} },
8825 .block_erase = spi_block_erase_d8,
8826 }, {
8827 .eraseblocks = { {8 * 1024 * 1024, 1} },
8828 .block_erase = spi_block_erase_60,
8829 }, {
8830 .eraseblocks = { {8 * 1024 * 1024, 1} },
8831 .block_erase = spi_block_erase_c7,
8832 }
8833 },
8834 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008835 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008836 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008837 .write = spi_chip_write_256,
8838 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8839 .voltage = {1650, 2000},
8840 },
8841
8842 {
8843 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00008844 .name = "MX25U12835F",
8845 .bustype = BUS_SPI,
8846 .manufacture_id = MACRONIX_ID,
8847 .model_id = MACRONIX_MX25U12835E,
8848 .total_size = 16384,
8849 .page_size = 256,
8850 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Angel Pons471da832018-09-30 17:29:48 +02008852 .tested = TEST_OK_PREW,
Martin Roth440057a2014-07-13 00:05:07 +00008853 .probe = probe_spi_rdid,
8854 .probe_timing = TIMING_ZERO,
8855 .block_erasers =
8856 {
8857 {
8858 .eraseblocks = { {4 * 1024, 4096} },
8859 .block_erase = spi_block_erase_20,
8860 }, {
8861 .eraseblocks = { {32 * 1024, 512} },
8862 .block_erase = spi_block_erase_52,
8863 }, {
8864 .eraseblocks = { {64 * 1024, 256} },
8865 .block_erase = spi_block_erase_d8,
8866 }, {
8867 .eraseblocks = { {16 * 1024 * 1024, 1} },
8868 .block_erase = spi_block_erase_60,
8869 }, {
8870 .eraseblocks = { {16 * 1024 * 1024, 1} },
8871 .block_erase = spi_block_erase_c7,
8872 }
8873 },
8874 /* TODO: security register */
8875 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8876 .unlock = spi_disable_blockprotect_bp3_srwd,
8877 .write = spi_chip_write_256, /* Multi I/O supported */
8878 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8879 .voltage = {1650, 2000},
8880 },
8881
8882 {
Stefan Taunera4617f72015-01-10 15:59:54 +00008883 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07008884 .name = "MX25U25635F",
8885 .bustype = BUS_SPI,
8886 .manufacture_id = MACRONIX_ID,
8887 .model_id = MACRONIX_MX25U25635F,
8888 .total_size = 32768,
8889 .page_size = 256,
8890 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8891 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8892 .tested = TEST_OK_PR,
8893 .probe = probe_spi_rdid,
8894 .probe_timing = TIMING_ZERO,
8895 .block_erasers =
8896 {
8897 {
8898 .eraseblocks = { {4 * 1024, 8192} },
8899 .block_erase = spi_block_erase_21,
8900 }, {
8901 .eraseblocks = { {4 * 1024, 8192} },
8902 .block_erase = spi_block_erase_20,
8903 }, {
8904 .eraseblocks = { {32 * 1024, 1024} },
8905 .block_erase = spi_block_erase_5c,
8906 }, {
8907 .eraseblocks = { {32 * 1024, 1024} },
8908 .block_erase = spi_block_erase_52,
8909 }, {
8910 .eraseblocks = { {64 * 1024, 512} },
8911 .block_erase = spi_block_erase_dc,
8912 }, {
8913 .eraseblocks = { {64 * 1024, 512} },
8914 .block_erase = spi_block_erase_d8,
8915 }, {
8916 .eraseblocks = { {32 * 1024 * 1024, 1} },
8917 .block_erase = spi_block_erase_60,
8918 }, {
8919 .eraseblocks = { {32 * 1024 * 1024, 1} },
8920 .block_erase = spi_block_erase_c7,
8921 }
8922 },
8923 /* TODO: security register */
8924 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8925 .unlock = spi_disable_blockprotect_bp3_srwd,
8926 .write = spi_chip_write_256, /* Multi I/O supported */
8927 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8928 .voltage = {1650, 2000},
8929 },
8930
8931 {
8932 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +01008933 .name = "MX25U51245G",
8934 .bustype = BUS_SPI,
8935 .manufacture_id = MACRONIX_ID,
8936 .model_id = MACRONIX_MX25U51245G,
8937 .total_size = 65536,
8938 .page_size = 256,
8939 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
8940 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8941 .tested = TEST_OK_PREW,
8942 .probe = probe_spi_rdid,
8943 .probe_timing = TIMING_ZERO,
8944 .block_erasers =
8945 {
8946 {
8947 .eraseblocks = { {4 * 1024, 16384} },
8948 .block_erase = spi_block_erase_21,
8949 }, {
8950 .eraseblocks = { {4 * 1024, 16384} },
8951 .block_erase = spi_block_erase_20,
8952 }, {
8953 .eraseblocks = { {32 * 1024, 2048} },
8954 .block_erase = spi_block_erase_5c,
8955 }, {
8956 .eraseblocks = { {32 * 1024, 2048} },
8957 .block_erase = spi_block_erase_52,
8958 }, {
8959 .eraseblocks = { {64 * 1024, 1024} },
8960 .block_erase = spi_block_erase_dc,
8961 }, {
8962 .eraseblocks = { {64 * 1024, 1024} },
8963 .block_erase = spi_block_erase_d8,
8964 }, {
8965 .eraseblocks = { {64 * 1024 * 1024, 1} },
8966 .block_erase = spi_block_erase_60,
8967 }, {
8968 .eraseblocks = { {64 * 1024 * 1024, 1} },
8969 .block_erase = spi_block_erase_c7,
8970 }
8971 },
8972 /* TODO: security register */
8973 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8974 .unlock = spi_disable_blockprotect_bp3_srwd,
8975 .write = spi_chip_write_256, /* Multi I/O supported */
8976 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8977 .voltage = {1650, 2000},
8978 },
8979
8980 {
8981 .vendor = "Macronix",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00008982 .name = "MX25L6495F",
8983 .bustype = BUS_SPI,
8984 .manufacture_id = MACRONIX_ID,
8985 .model_id = MACRONIX_MX25L6495F,
8986 .total_size = 8192,
8987 .page_size = 256,
8988 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8989 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8990 .tested = TEST_OK_PREW,
8991 .probe = probe_spi_rdid,
8992 .probe_timing = TIMING_ZERO,
8993 .block_erasers =
8994 {
8995 {
8996 .eraseblocks = { {4 * 1024, 2048} },
8997 .block_erase = spi_block_erase_20,
8998 }, {
8999 .eraseblocks = { {64 * 1024, 128} },
9000 .block_erase = spi_block_erase_d8,
9001 }, {
9002 .eraseblocks = { {32 * 1024, 256} },
9003 .block_erase = spi_block_erase_52,
9004 }, {
9005 .eraseblocks = { {8 * 1024 * 1024, 1} },
9006 .block_erase = spi_block_erase_60,
9007 }, {
9008 .eraseblocks = { {8 * 1024 * 1024, 1} },
9009 .block_erase = spi_block_erase_c7,
9010 }
9011 },
9012 .unlock = spi_disable_blockprotect,
9013 .write = spi_chip_write_256,
9014 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9015 .voltage = {2700, 3600},
9016 },
9017
9018 {
Martin Roth440057a2014-07-13 00:05:07 +00009019 .vendor = "Macronix",
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009020 .name = "MX25R6435F",
9021 .bustype = BUS_SPI,
9022 .manufacture_id = MACRONIX_ID,
9023 .model_id = MACRONIX_MX25R6435F,
9024 .total_size = 8192,
9025 .page_size = 256,
9026 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9027 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9028 .tested = TEST_OK_PREW,
9029 .probe = probe_spi_rdid,
9030 .probe_timing = TIMING_ZERO,
9031 .block_erasers =
9032 {
9033 {
9034 .eraseblocks = { {4 * 1024, 2048} },
9035 .block_erase = spi_block_erase_20,
9036 }, {
9037 .eraseblocks = { {64 * 1024, 128} },
9038 .block_erase = spi_block_erase_d8,
9039 }, {
9040 .eraseblocks = { {32 * 1024, 256} },
9041 .block_erase = spi_block_erase_52,
9042 }, {
9043 .eraseblocks = { {8 * 1024 * 1024, 1} },
9044 .block_erase = spi_block_erase_60,
9045 }, {
9046 .eraseblocks = { {8 * 1024 * 1024, 1} },
9047 .block_erase = spi_block_erase_c7,
9048 }
9049 },
9050 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9051 .unlock = spi_disable_blockprotect_bp3_srwd,
9052 .write = spi_chip_write_256,
9053 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9054 .voltage = {1650, 3600},
9055 },
9056
9057 {
9058 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00009059 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009060 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009061 .manufacture_id = MACRONIX_ID,
9062 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009063 .total_size = 128,
9064 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009065 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9066 .tested = TEST_UNTESTED,
9067 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009068 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009069 .block_erasers =
9070 {
9071 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009072 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009073 {8 * 1024, 1},
9074 {4 * 1024, 2},
9075 {8 * 1024, 2},
9076 {32 * 1024, 1},
9077 {64 * 1024, 1},
9078 },
Sean Nelson35727f72010-01-28 23:55:12 +00009079 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009080 }, {
9081 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009082 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009083 }
9084 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009085 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009087 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009088 },
9089
9090 {
9091 .vendor = "Macronix",
9092 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009093 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009094 .manufacture_id = MACRONIX_ID,
9095 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009096 .total_size = 128,
9097 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009098 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00009099 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009100 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009101 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009102 .block_erasers =
9103 {
9104 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009105 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009106 {64 * 1024, 1},
9107 {32 * 1024, 1},
9108 {8 * 1024, 2},
9109 {4 * 1024, 2},
9110 {8 * 1024, 1},
9111 },
Sean Nelson35727f72010-01-28 23:55:12 +00009112 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009113 }, {
9114 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009115 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009116 }
9117 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009118 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009119 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009120 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009121 },
9122
9123 {
9124 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009125 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009126 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009127 .manufacture_id = MACRONIX_ID,
9128 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009129 .total_size = 256,
9130 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009131 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009132 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009133 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009134 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009135 .block_erasers =
9136 {
9137 {
9138 .eraseblocks = {
9139 {16 * 1024, 1},
9140 {8 * 1024, 2},
9141 {32 * 1024, 1},
9142 {64 * 1024, 3},
9143 },
Sean Nelson35727f72010-01-28 23:55:12 +00009144 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009145 }, {
9146 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009147 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009148 },
9149 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009150 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009151 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009152 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009153 },
9154
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009155 {
9156 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009157 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009158 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009159 .manufacture_id = MACRONIX_ID,
9160 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009161 .total_size = 256,
9162 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009163 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009164 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009165 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009166 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009167 .block_erasers =
9168 {
9169 {
9170 .eraseblocks = {
9171 {64 * 1024, 3},
9172 {32 * 1024, 1},
9173 {8 * 1024, 2},
9174 {16 * 1024, 1},
9175 },
Sean Nelson35727f72010-01-28 23:55:12 +00009176 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009177 }, {
9178 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009179 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009180 },
9181 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009182 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009183 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009184 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009185 },
9186
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009187 {
9188 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00009189 .name = "MX29F022(N)B",
9190 .bustype = BUS_PARALLEL,
9191 .manufacture_id = MACRONIX_ID,
9192 .model_id = MACRONIX_MX29F022B,
9193 .total_size = 256,
9194 .page_size = 0, /* unused */
9195 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9196 .tested = TEST_UNTESTED,
9197 .probe = probe_jedec,
9198 .probe_timing = TIMING_ZERO,
9199 .block_erasers =
9200 {
9201 {
9202 .eraseblocks = {
9203 {16 * 1024, 1},
9204 {8 * 1024, 2},
9205 {32 * 1024, 1},
9206 {64 * 1024, 3},
9207 },
9208 .block_erase = erase_sector_jedec,
9209 }, {
9210 .eraseblocks = { {256 * 1024, 1} },
9211 .block_erase = erase_chip_block_jedec,
9212 }
9213 },
9214 .write = write_jedec_1,
9215 .read = read_memmapped,
9216 .voltage = {4500, 5500},
9217 },
9218
9219 {
9220 .vendor = "Macronix",
9221 .name = "MX29F022(N)T",
9222 .bustype = BUS_PARALLEL,
9223 .manufacture_id = MACRONIX_ID,
9224 .model_id = MACRONIX_MX29F022T,
9225 .total_size = 256,
9226 .page_size = 0, /* unused */
9227 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9228 .tested = TEST_OK_PREW,
9229 .probe = probe_jedec,
9230 .probe_timing = TIMING_ZERO,
9231 .block_erasers =
9232 {
9233 {
9234 .eraseblocks = {
9235 {64 * 1024, 3},
9236 {32 * 1024, 1},
9237 {8 * 1024, 2},
9238 {16 * 1024, 1},
9239 },
9240 .block_erase = erase_sector_jedec,
9241 }, {
9242 .eraseblocks = { {256 * 1024, 1} },
9243 .block_erase = erase_chip_block_jedec,
9244 }
9245 },
9246 .write = write_jedec_1,
9247 .read = read_memmapped,
9248 .voltage = {4500, 5500},
9249 },
9250
9251 {
9252 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00009253 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009254 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00009255 .manufacture_id = MACRONIX_ID,
9256 .model_id = MACRONIX_MX29F040,
9257 .total_size = 512,
9258 .page_size = 64 * 1024,
9259 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9260 .tested = TEST_UNTESTED,
9261 .probe = probe_jedec,
9262 .probe_timing = TIMING_ZERO,
9263 .block_erasers =
9264 {
9265 {
9266 .eraseblocks = { {64 * 1024, 8} },
9267 .block_erase = erase_sector_jedec,
9268 }, {
9269 .eraseblocks = { {512 * 1024, 1} },
9270 .block_erase = erase_chip_block_jedec,
9271 },
9272 },
9273 .write = write_jedec_1,
9274 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009275 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00009276 },
9277
9278 {
9279 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009280 .name = "MX29GL320EB",
9281 .bustype = BUS_PARALLEL,
9282 .manufacture_id = MACRONIX_ID,
9283 .model_id = MACRONIX_MX29GL320EB,
9284 .total_size = 4096,
9285 .page_size = 128 * 1024, /* actual page size is 16 */
9286 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9287 .tested = TEST_UNTESTED,
9288 .probe = probe_jedec_29gl,
9289 .probe_timing = TIMING_ZERO,
9290 .block_erasers =
9291 {
9292 {
9293 .eraseblocks = {
9294 {8 * 1024, 8},
9295 {64 * 1024, 63},
9296 },
9297 .block_erase = erase_sector_jedec,
9298 }, {
9299 .eraseblocks = { {4 * 1024 * 1024, 1} },
9300 .block_erase = erase_chip_block_jedec,
9301 },
9302 },
9303 .write = write_jedec_1,
9304 .read = read_memmapped,
9305 .voltage = {2700, 3600},
9306 },
9307
9308 {
9309 .vendor = "Macronix",
9310 .name = "MX29GL320ET",
9311 .bustype = BUS_PARALLEL,
9312 .manufacture_id = MACRONIX_ID,
9313 .model_id = MACRONIX_MX29GL320ET,
9314 .total_size = 4096,
9315 .page_size = 128 * 1024, /* actual page size is 16 */
9316 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9317 .tested = TEST_UNTESTED,
9318 .probe = probe_jedec_29gl,
9319 .probe_timing = TIMING_ZERO,
9320 .block_erasers =
9321 {
9322 {
9323 .eraseblocks = {
9324 {64 * 1024, 63},
9325 {8 * 1024, 8},
9326 },
9327 .block_erase = erase_sector_jedec,
9328 }, {
9329 .eraseblocks = { {4 * 1024 * 1024, 1} },
9330 .block_erase = erase_chip_block_jedec,
9331 },
9332 },
9333 .write = write_jedec_1,
9334 .read = read_memmapped,
9335 .voltage = {2700, 3600},
9336 },
9337
9338 {
9339 .vendor = "Macronix",
9340 .name = "MX29GL320EH/L",
9341 .bustype = BUS_PARALLEL,
9342 .manufacture_id = MACRONIX_ID,
9343 .model_id = MACRONIX_MX29GL320EHL,
9344 .total_size = 4096,
9345 .page_size = 128 * 1024, /* actual page size is 16 */
9346 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9347 .tested = TEST_UNTESTED,
9348 .probe = probe_jedec_29gl,
9349 .probe_timing = TIMING_ZERO,
9350 .block_erasers =
9351 {
9352 {
9353 .eraseblocks = { {64 * 1024, 64} },
9354 .block_erase = erase_sector_jedec,
9355 }, {
9356 .eraseblocks = { {4 * 1024 * 1024, 1} },
9357 .block_erase = erase_chip_block_jedec,
9358 },
9359 },
9360 .write = write_jedec_1,
9361 .read = read_memmapped,
9362 .voltage = {2700, 3600},
9363 },
9364
9365 {
9366 .vendor = "Macronix",
9367 .name = "MX29GL640EB",
9368 .bustype = BUS_PARALLEL,
9369 .manufacture_id = MACRONIX_ID,
9370 .model_id = MACRONIX_MX29GL640EB,
9371 .total_size = 8192,
9372 .page_size = 128 * 1024, /* actual page size is 16 */
9373 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9374 .tested = TEST_UNTESTED,
9375 .probe = probe_jedec_29gl,
9376 .probe_timing = TIMING_ZERO,
9377 .block_erasers =
9378 {
9379 {
9380 .eraseblocks = {
9381 {8 * 1024, 8},
9382 {64 * 1024, 127},
9383 },
9384 .block_erase = erase_sector_jedec,
9385 }, {
9386 .eraseblocks = { {8 * 1024 * 1024, 1} },
9387 .block_erase = erase_chip_block_jedec,
9388 },
9389 },
9390 .write = write_jedec_1,
9391 .read = read_memmapped,
9392 .voltage = {2700, 3600},
9393 },
9394
9395 {
9396 .vendor = "Macronix",
9397 .name = "MX29GL640ET",
9398 .bustype = BUS_PARALLEL,
9399 .manufacture_id = MACRONIX_ID,
9400 .model_id = MACRONIX_MX29GL640ET,
9401 .total_size = 8192,
9402 .page_size = 128 * 1024, /* actual page size is 16 */
9403 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9404 .tested = TEST_UNTESTED,
9405 .probe = probe_jedec_29gl,
9406 .probe_timing = TIMING_ZERO,
9407 .block_erasers =
9408 {
9409 {
9410 .eraseblocks = {
9411 {64 * 1024, 127},
9412 {8 * 1024, 8},
9413 },
9414 .block_erase = erase_sector_jedec,
9415 }, {
9416 .eraseblocks = { {8 * 1024 * 1024, 1} },
9417 .block_erase = erase_chip_block_jedec,
9418 },
9419 },
9420 .write = write_jedec_1,
9421 .read = read_memmapped,
9422 .voltage = {2700, 3600},
9423 },
9424
9425 {
9426 .vendor = "Macronix",
9427 .name = "MX29GL640EH/L",
9428 .bustype = BUS_PARALLEL,
9429 .manufacture_id = MACRONIX_ID,
9430 .model_id = MACRONIX_MX29GL640EHL,
9431 .total_size = 8192,
9432 .page_size = 128 * 1024, /* actual page size is 16 */
9433 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9434 .tested = TEST_UNTESTED,
9435 .probe = probe_jedec_29gl,
9436 .probe_timing = TIMING_ZERO,
9437 .block_erasers =
9438 {
9439 {
9440 .eraseblocks = { {64 * 1024, 128} },
9441 .block_erase = erase_sector_jedec,
9442 }, {
9443 .eraseblocks = { {8 * 1024 * 1024, 1} },
9444 .block_erase = erase_chip_block_jedec,
9445 },
9446 },
9447 .write = write_jedec_1,
9448 .read = read_memmapped,
9449 .voltage = {2700, 3600},
9450 },
9451
9452 {
9453 .vendor = "Macronix",
9454 .name = "MX29GL128F",
9455 .bustype = BUS_PARALLEL,
9456 .manufacture_id = MACRONIX_ID,
9457 .model_id = MACRONIX_MX29GL128F,
9458 .total_size = 16384,
9459 .page_size = 128 * 1024, /* actual page size is 16 */
9460 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9461 .tested = TEST_UNTESTED,
9462 .probe = probe_jedec_29gl,
9463 .probe_timing = TIMING_ZERO,
9464 .block_erasers =
9465 {
9466 {
9467 .eraseblocks = { {128 * 1024, 128} },
9468 .block_erase = erase_sector_jedec,
9469 }, {
9470 .eraseblocks = { {16 * 1024 * 1024, 1} },
9471 .block_erase = erase_chip_block_jedec,
9472 },
9473 },
9474 .write = write_jedec_1,
9475 .read = read_memmapped,
9476 .voltage = {2700, 3600},
9477 },
9478
9479 {
9480 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00009481 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009482 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009483 .manufacture_id = MACRONIX_ID,
9484 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009485 .total_size = 512,
9486 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009487 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9488 .tested = TEST_UNTESTED,
9489 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009490 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009491 .block_erasers =
9492 {
9493 {
Stefan Tauner6697f712014-08-06 15:09:15 +00009494 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00009495 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009496 }, {
9497 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009498 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009499 },
9500 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009501 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009502 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009503 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00009504 },
9505
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009506 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009507 .vendor = "Micron/Numonyx/ST",
9508 .name = "M25P05-A",
9509 .bustype = BUS_SPI,
9510 .manufacture_id = ST_ID,
9511 .model_id = ST_M25P05A,
9512 .total_size = 64,
9513 .page_size = 256,
9514 .feature_bits = FEATURE_WRSR_WREN,
9515 .tested = TEST_OK_PREW,
9516 .probe = probe_spi_rdid,
9517 .probe_timing = TIMING_ZERO,
9518 .block_erasers =
9519 {
9520 {
9521 .eraseblocks = { {32 * 1024, 2} },
9522 .block_erase = spi_block_erase_d8,
9523 }, {
9524 .eraseblocks = { {64 * 1024, 1} },
9525 .block_erase = spi_block_erase_c7,
9526 }
9527 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009528 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009529 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009530 .write = spi_chip_write_256,
9531 .read = spi_chip_read,
9532 .voltage = {2700, 3600},
9533 },
9534
9535 /* The ST M25P05 is a bit of a problem. It has the same ID as the
9536 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
9537 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
9538 * only is successful if RDID does not work.
9539 */
9540 {
9541 .vendor = "Micron/Numonyx/ST",
9542 .name = "M25P05",
9543 .bustype = BUS_SPI,
9544 .manufacture_id = 0, /* Not used. */
9545 .model_id = ST_M25P05_RES,
9546 .total_size = 64,
9547 .page_size = 256,
9548 .feature_bits = FEATURE_WRSR_WREN,
9549 .tested = TEST_UNTESTED,
9550 .probe = probe_spi_res1,
9551 .probe_timing = TIMING_ZERO,
9552 .block_erasers =
9553 {
9554 {
9555 .eraseblocks = { {32 * 1024, 2} },
9556 .block_erase = spi_block_erase_d8,
9557 }, {
9558 .eraseblocks = { {64 * 1024, 1} },
9559 .block_erase = spi_block_erase_c7,
9560 }
9561 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009562 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009563 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009564 .write = spi_chip_write_1, /* 128 */
9565 .read = spi_chip_read,
9566 .voltage = {2700, 3600},
9567 },
9568
9569 {
9570 .vendor = "Micron/Numonyx/ST",
9571 .name = "M25P10-A",
9572 .bustype = BUS_SPI,
9573 .manufacture_id = ST_ID,
9574 .model_id = ST_M25P10A,
9575 .total_size = 128,
9576 .page_size = 256,
9577 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009578 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009579 .probe = probe_spi_rdid,
9580 .probe_timing = TIMING_ZERO,
9581 .block_erasers =
9582 {
9583 {
9584 .eraseblocks = { {32 * 1024, 4} },
9585 .block_erase = spi_block_erase_d8,
9586 }, {
9587 .eraseblocks = { {128 * 1024, 1} },
9588 .block_erase = spi_block_erase_c7,
9589 }
9590 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009591 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009592 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009593 .write = spi_chip_write_256,
9594 .read = spi_chip_read,
9595 .voltage = {2700, 3600},
9596 },
9597
9598 /* The ST M25P10 has the same problem as the M25P05. */
9599 {
9600 .vendor = "Micron/Numonyx/ST",
9601 .name = "M25P10",
9602 .bustype = BUS_SPI,
9603 .manufacture_id = 0, /* Not used. */
9604 .model_id = ST_M25P10_RES,
9605 .total_size = 128,
9606 .page_size = 256,
9607 .feature_bits = FEATURE_WRSR_WREN,
9608 .tested = TEST_UNTESTED,
9609 .probe = probe_spi_res1,
9610 .probe_timing = TIMING_ZERO,
9611 .block_erasers =
9612 {
9613 {
9614 .eraseblocks = { {32 * 1024, 4} },
9615 .block_erase = spi_block_erase_d8,
9616 }, {
9617 .eraseblocks = { {128 * 1024, 1} },
9618 .block_erase = spi_block_erase_c7,
9619 }
9620 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009621 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009622 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009623 .write = spi_chip_write_1, /* 128 */
9624 .read = spi_chip_read,
9625 .voltage = {2700, 3600},
9626 },
9627
9628 {
9629 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9630 .name = "M25P20",
9631 .bustype = BUS_SPI,
9632 .manufacture_id = ST_ID,
9633 .model_id = ST_M25P20,
9634 .total_size = 256,
9635 .page_size = 256,
9636 .feature_bits = FEATURE_WRSR_WREN,
9637 .tested = TEST_UNTESTED,
9638 .probe = probe_spi_rdid,
9639 .probe_timing = TIMING_ZERO,
9640 .block_erasers =
9641 {
9642 {
9643 .eraseblocks = { {64 * 1024, 4} },
9644 .block_erase = spi_block_erase_d8,
9645 }, {
9646 .eraseblocks = { {256 * 1024, 1} },
9647 .block_erase = spi_block_erase_c7,
9648 }
9649 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009650 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009651 .unlock = spi_disable_blockprotect,
9652 .write = spi_chip_write_256,
9653 .read = spi_chip_read, /* Fast read (0x0B) supported */
9654 .voltage = {2700, 3600},
9655 },
9656
9657 {
9658 .vendor = "Micron/Numonyx/ST",
9659 .name = "M25P20-old",
9660 .bustype = BUS_SPI,
9661 .manufacture_id = 0, /* Not used. */
9662 .model_id = ST_M25P20_RES,
9663 .total_size = 256,
9664 .page_size = 256,
9665 .feature_bits = FEATURE_WRSR_WREN,
9666 .tested = TEST_OK_PREW,
9667 .probe = probe_spi_res1,
9668 .probe_timing = TIMING_ZERO,
9669 .block_erasers =
9670 {
9671 {
9672 .eraseblocks = { {64 * 1024, 4} },
9673 .block_erase = spi_block_erase_d8,
9674 }, {
9675 .eraseblocks = { {256 * 1024, 1} },
9676 .block_erase = spi_block_erase_c7,
9677 }
9678 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009679 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009680 .unlock = spi_disable_blockprotect,
9681 .write = spi_chip_write_256,
9682 .read = spi_chip_read, /* Fast read (0x0B) supported */
9683 .voltage = {2700, 3600},
9684 },
9685
9686 {
9687 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9688 .name = "M25P40",
9689 .bustype = BUS_SPI,
9690 .manufacture_id = ST_ID,
9691 .model_id = ST_M25P40,
9692 .total_size = 512,
9693 .page_size = 256,
9694 .feature_bits = FEATURE_WRSR_WREN,
9695 .tested = TEST_OK_PREW,
9696 .probe = probe_spi_rdid,
9697 .probe_timing = TIMING_ZERO,
9698 .block_erasers =
9699 {
9700 {
9701 .eraseblocks = { {64 * 1024, 8} },
9702 .block_erase = spi_block_erase_d8,
9703 }, {
9704 .eraseblocks = { {512 * 1024, 1} },
9705 .block_erase = spi_block_erase_c7,
9706 }
9707 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009708 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009709 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009710 .write = spi_chip_write_256,
9711 .read = spi_chip_read,
9712 .voltage = {2700, 3600},
9713 },
9714
9715 {
9716 .vendor = "Micron/Numonyx/ST",
9717 .name = "M25P40-old",
9718 .bustype = BUS_SPI,
9719 .manufacture_id = 0, /* Not used. */
9720 .model_id = ST_M25P40_RES,
9721 .total_size = 512,
9722 .page_size = 256,
9723 .feature_bits = FEATURE_WRSR_WREN,
9724 .tested = TEST_UNTESTED,
9725 .probe = probe_spi_res1,
9726 .probe_timing = TIMING_ZERO,
9727 .block_erasers =
9728 {
9729 {
9730 .eraseblocks = { {64 * 1024, 8} },
9731 .block_erase = spi_block_erase_d8,
9732 }, {
9733 .eraseblocks = { {512 * 1024, 1} },
9734 .block_erase = spi_block_erase_c7,
9735 }
9736 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009737 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009738 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009739 .write = spi_chip_write_256,
9740 .read = spi_chip_read,
9741 },
9742
9743 {
9744 .vendor = "Micron/Numonyx/ST",
9745 .name = "M25P80",
9746 .bustype = BUS_SPI,
9747 .manufacture_id = ST_ID,
9748 .model_id = ST_M25P80,
9749 .total_size = 1024,
9750 .page_size = 256,
9751 .feature_bits = FEATURE_WRSR_WREN,
9752 .tested = TEST_OK_PREW,
9753 .probe = probe_spi_rdid,
9754 .probe_timing = TIMING_ZERO,
9755 .block_erasers =
9756 {
9757 {
9758 .eraseblocks = { {64 * 1024, 16} },
9759 .block_erase = spi_block_erase_d8,
9760 }, {
9761 .eraseblocks = { {1024 * 1024, 1} },
9762 .block_erase = spi_block_erase_c7,
9763 }
9764 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009765 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009766 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009767 .write = spi_chip_write_256,
9768 .read = spi_chip_read,
9769 .voltage = {2700, 3600},
9770 },
9771
9772 {
9773 .vendor = "Micron/Numonyx/ST",
9774 .name = "M25P16",
9775 .bustype = BUS_SPI,
9776 .manufacture_id = ST_ID,
9777 .model_id = ST_M25P16,
9778 .total_size = 2048,
9779 .page_size = 256,
9780 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009781 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009782 .probe = probe_spi_rdid,
9783 .probe_timing = TIMING_ZERO,
9784 .block_erasers =
9785 {
9786 {
9787 .eraseblocks = { {64 * 1024, 32} },
9788 .block_erase = spi_block_erase_d8,
9789 }, {
9790 .eraseblocks = { {2 * 1024 * 1024, 1} },
9791 .block_erase = spi_block_erase_c7,
9792 }
9793 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009794 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009795 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009796 .write = spi_chip_write_256,
9797 .read = spi_chip_read,
9798 .voltage = {2700, 3600},
9799 },
9800
9801 {
9802 .vendor = "Micron/Numonyx/ST",
9803 .name = "M25P32",
9804 .bustype = BUS_SPI,
9805 .manufacture_id = ST_ID,
9806 .model_id = ST_M25P32,
9807 .total_size = 4096,
9808 .page_size = 256,
9809 .feature_bits = FEATURE_WRSR_WREN,
9810 .tested = TEST_OK_PREW,
9811 .probe = probe_spi_rdid,
9812 .probe_timing = TIMING_ZERO,
9813 .block_erasers =
9814 {
9815 {
9816 .eraseblocks = { {64 * 1024, 64} },
9817 .block_erase = spi_block_erase_d8,
9818 }, {
9819 .eraseblocks = { {4 * 1024 * 1024, 1} },
9820 .block_erase = spi_block_erase_c7,
9821 }
9822 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009823 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009824 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009825 .write = spi_chip_write_256,
9826 .read = spi_chip_read,
9827 .voltage = {2700, 3600},
9828 },
9829
9830 {
9831 .vendor = "Micron/Numonyx/ST",
9832 .name = "M25P64",
9833 .bustype = BUS_SPI,
9834 .manufacture_id = ST_ID,
9835 .model_id = ST_M25P64,
9836 .total_size = 8192,
9837 .page_size = 256,
9838 .feature_bits = FEATURE_WRSR_WREN,
9839 .tested = TEST_OK_PREW,
9840 .probe = probe_spi_rdid,
9841 .probe_timing = TIMING_ZERO,
9842 .block_erasers =
9843 {
9844 {
9845 .eraseblocks = { {64 * 1024, 128} },
9846 .block_erase = spi_block_erase_d8,
9847 }, {
9848 .eraseblocks = { {8 * 1024 * 1024, 1} },
9849 .block_erase = spi_block_erase_c7,
9850 }
9851 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009852 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009853 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009854 .write = spi_chip_write_256,
9855 .read = spi_chip_read,
9856 .voltage = {2700, 3600},
9857 },
9858
9859 {
9860 .vendor = "Micron/Numonyx/ST",
9861 .name = "M25P128",
9862 .bustype = BUS_SPI,
9863 .manufacture_id = ST_ID,
9864 .model_id = ST_M25P128,
9865 .total_size = 16384,
9866 .page_size = 256,
9867 .feature_bits = FEATURE_WRSR_WREN,
9868 .tested = TEST_OK_PREW,
9869 .probe = probe_spi_rdid,
9870 .probe_timing = TIMING_ZERO,
9871 .block_erasers =
9872 {
9873 {
9874 .eraseblocks = { {256 * 1024, 64} },
9875 .block_erase = spi_block_erase_d8,
9876 }, {
9877 .eraseblocks = { {16 * 1024 * 1024, 1} },
9878 .block_erase = spi_block_erase_c7,
9879 }
9880 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009881 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009882 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009883 .write = spi_chip_write_256,
9884 .read = spi_chip_read,
9885 .voltage = {2700, 3600},
9886 },
9887
9888 {
9889 .vendor = "Micron/Numonyx/ST",
9890 .name = "M25PE10",
9891 .bustype = BUS_SPI,
9892 .manufacture_id = ST_ID,
9893 .model_id = ST_M25PE10,
9894 .total_size = 128,
9895 .page_size = 256,
9896 .feature_bits = FEATURE_WRSR_WREN,
9897 .tested = TEST_UNTESTED,
9898 .probe = probe_spi_rdid,
9899 .probe_timing = TIMING_ZERO,
9900 .block_erasers =
9901 {
9902 {
9903 .eraseblocks = { {4 * 1024, 32} },
9904 .block_erase = spi_block_erase_20,
9905 }, {
9906 .eraseblocks = { {64 * 1024, 2} },
9907 .block_erase = spi_block_erase_d8,
9908 }, {
9909 .eraseblocks = { {128 * 1024, 1} },
9910 .block_erase = spi_block_erase_c7,
9911 }
9912 },
9913 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9914 .unlock = spi_disable_blockprotect,
9915 .write = spi_chip_write_256,
9916 .read = spi_chip_read,
9917 .voltage = {2700, 3600},
9918 },
9919
9920 {
9921 .vendor = "Micron/Numonyx/ST",
9922 .name = "M25PE20",
9923 .bustype = BUS_SPI,
9924 .manufacture_id = ST_ID,
9925 .model_id = ST_M25PE20,
9926 .total_size = 256,
9927 .page_size = 256,
9928 .feature_bits = FEATURE_WRSR_WREN,
9929 .tested = TEST_UNTESTED,
9930 .probe = probe_spi_rdid,
9931 .probe_timing = TIMING_ZERO,
9932 .block_erasers =
9933 {
9934 {
9935 .eraseblocks = { {4 * 1024, 64} },
9936 .block_erase = spi_block_erase_20,
9937 }, {
9938 .eraseblocks = { {64 * 1024, 4} },
9939 .block_erase = spi_block_erase_d8,
9940 }, {
9941 .eraseblocks = { {256 * 1024, 1} },
9942 .block_erase = spi_block_erase_c7,
9943 }
9944 },
9945 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9946 .unlock = spi_disable_blockprotect,
9947 .write = spi_chip_write_256,
9948 .read = spi_chip_read,
9949 .voltage = {2700, 3600},
9950 },
9951
9952 {
9953 .vendor = "Micron/Numonyx/ST",
9954 .name = "M25PE40",
9955 .bustype = BUS_SPI,
9956 .manufacture_id = ST_ID,
9957 .model_id = ST_M25PE40,
9958 .total_size = 512,
9959 .page_size = 256,
9960 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009961 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009962 .probe = probe_spi_rdid,
9963 .probe_timing = TIMING_ZERO,
9964 .block_erasers =
9965 {
9966 {
9967 .eraseblocks = { {4 * 1024, 128} },
9968 .block_erase = spi_block_erase_20,
9969 }, {
9970 .eraseblocks = { {64 * 1024, 8} },
9971 .block_erase = spi_block_erase_d8,
9972 }, {
9973 .eraseblocks = { {512 * 1024, 1} },
9974 .block_erase = spi_block_erase_c7,
9975 }
9976 },
9977 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9978 .unlock = spi_disable_blockprotect,
9979 .write = spi_chip_write_256,
9980 .read = spi_chip_read,
9981 .voltage = {2700, 3600},
9982 },
9983
9984 {
9985 .vendor = "Micron/Numonyx/ST",
9986 .name = "M25PE80",
9987 .bustype = BUS_SPI,
9988 .manufacture_id = ST_ID,
9989 .model_id = ST_M25PE80,
9990 .total_size = 1024,
9991 .page_size = 256,
9992 .feature_bits = FEATURE_WRSR_WREN,
9993 .tested = TEST_OK_PREW,
9994 .probe = probe_spi_rdid,
9995 .probe_timing = TIMING_ZERO,
9996 .block_erasers =
9997 {
9998 {
9999 .eraseblocks = { {4 * 1024, 256} },
10000 .block_erase = spi_block_erase_20,
10001 }, {
10002 .eraseblocks = { {64 * 1024, 16} },
10003 .block_erase = spi_block_erase_d8,
10004 }, {
10005 .eraseblocks = { {1024 * 1024, 1} },
10006 .block_erase = spi_block_erase_c7,
10007 }
10008 },
10009 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10010 .unlock = spi_disable_blockprotect,
10011 .write = spi_chip_write_256,
10012 .read = spi_chip_read,
10013 .voltage = {2700, 3600},
10014 },
10015
10016 {
10017 .vendor = "Micron/Numonyx/ST",
10018 .name = "M25PE16",
10019 .bustype = BUS_SPI,
10020 .manufacture_id = ST_ID,
10021 .model_id = ST_M25PE16,
10022 .total_size = 2048,
10023 .page_size = 256,
10024 .feature_bits = FEATURE_WRSR_WREN,
10025 .tested = TEST_UNTESTED,
10026 .probe = probe_spi_rdid,
10027 .probe_timing = TIMING_ZERO,
10028 .block_erasers =
10029 {
10030 {
10031 .eraseblocks = { {4 * 1024, 512} },
10032 .block_erase = spi_block_erase_20,
10033 }, {
10034 .eraseblocks = { {64 * 1024, 32} },
10035 .block_erase = spi_block_erase_d8,
10036 }, {
10037 .eraseblocks = { {2 * 1024 * 1024, 1} },
10038 .block_erase = spi_block_erase_c7,
10039 }
10040 },
10041 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10042 .unlock = spi_disable_blockprotect,
10043 .write = spi_chip_write_256,
10044 .read = spi_chip_read,
10045 .voltage = {2700, 3600},
10046 },
10047
10048 {
10049 .vendor = "Micron/Numonyx/ST",
10050 .name = "M25PX80",
10051 .bustype = BUS_SPI,
10052 .manufacture_id = ST_ID,
10053 .model_id = ST_M25PX80,
10054 .total_size = 1024,
10055 .page_size = 256,
10056 /* OTP: 64B total; read 0x4B, write 0x42 */
10057 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10058 .tested = TEST_OK_PREW,
10059 .probe = probe_spi_rdid,
10060 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010061 .block_erasers =
10062 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010063 {
10064 .eraseblocks = { { 4 * 1024, 256 } },
10065 .block_erase = spi_block_erase_20,
10066 }, {
10067 .eraseblocks = { {64 * 1024, 16} },
10068 .block_erase = spi_block_erase_d8,
10069 }, {
10070 .eraseblocks = { {1024 * 1024, 1} },
10071 .block_erase = spi_block_erase_c7,
10072 }
10073 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010074 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010075 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10076 .write = spi_chip_write_256,
10077 .read = spi_chip_read,
10078 .voltage = {2700, 3600},
10079 },
10080
10081 {
10082 .vendor = "Micron/Numonyx/ST",
10083 .name = "M25PX16",
10084 .bustype = BUS_SPI,
10085 .manufacture_id = ST_ID,
10086 .model_id = ST_M25PX16,
10087 .total_size = 2048,
10088 .page_size = 256,
10089 /* OTP: 64B total; read 0x4B; write 0x42 */
10090 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10091 .tested = TEST_OK_PREW,
10092 .probe = probe_spi_rdid,
10093 .probe_timing = TIMING_ZERO,
10094 .block_erasers =
10095 {
10096 {
10097 .eraseblocks = { { 4 * 1024, 512 } },
10098 .block_erase = spi_block_erase_20,
10099 }, {
10100 .eraseblocks = { {64 * 1024, 32} },
10101 .block_erase = spi_block_erase_d8,
10102 }, {
10103 .eraseblocks = { {2 * 1024 * 1024, 1} },
10104 .block_erase = spi_block_erase_c7,
10105 }
10106 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010107 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010108 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10109 .write = spi_chip_write_256,
10110 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010111 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010112 },
10113
10114 {
10115 .vendor = "Micron/Numonyx/ST",
10116 .name = "M25PX32",
10117 .bustype = BUS_SPI,
10118 .manufacture_id = ST_ID,
10119 .model_id = ST_M25PX32,
10120 .total_size = 4096,
10121 .page_size = 256,
10122 /* OTP: 64B total; read 0x4B; write 0x42 */
10123 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10124 .tested = TEST_OK_PRE,
10125 .probe = probe_spi_rdid,
10126 .probe_timing = TIMING_ZERO,
10127 .block_erasers =
10128 {
10129 {
10130 .eraseblocks = { { 4 * 1024, 1024 } },
10131 .block_erase = spi_block_erase_20,
10132 }, {
10133 .eraseblocks = { {64 * 1024, 64} },
10134 .block_erase = spi_block_erase_d8,
10135 }, {
10136 .eraseblocks = { {4 * 1024 * 1024, 1} },
10137 .block_erase = spi_block_erase_c7,
10138 }
10139 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010140 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010141 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10142 .write = spi_chip_write_256,
10143 .read = spi_chip_read,
10144 .voltage = {2700, 3600},
10145 },
10146
10147 {
10148 .vendor = "Micron/Numonyx/ST",
10149 .name = "M25PX64",
10150 .bustype = BUS_SPI,
10151 .manufacture_id = ST_ID,
10152 .model_id = ST_M25PX64,
10153 .total_size = 8192,
10154 .page_size = 256,
10155 /* OTP: 64B total; read 0x4B; write 0x42 */
10156 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010157 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010158 .probe = probe_spi_rdid,
10159 .probe_timing = TIMING_ZERO,
10160 .block_erasers =
10161 {
10162 {
10163 .eraseblocks = { { 4 * 1024, 2048 } },
10164 .block_erase = spi_block_erase_20,
10165 }, {
10166 .eraseblocks = { {64 * 1024, 128} },
10167 .block_erase = spi_block_erase_d8,
10168 }, {
10169 .eraseblocks = { {8 * 1024 * 1024, 1} },
10170 .block_erase = spi_block_erase_c7,
10171 }
10172 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010173 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010174 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10175 .write = spi_chip_write_256,
10176 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010177 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010178 },
10179
10180 {
10181 .vendor = "Micron/Numonyx/ST",
10182 .name = "M45PE10",
10183 .bustype = BUS_SPI,
10184 .manufacture_id = ST_ID,
10185 .model_id = ST_M45PE10,
10186 .total_size = 128,
10187 .page_size = 256,
10188 .tested = TEST_UNTESTED,
10189 .probe = probe_spi_rdid,
10190 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010191 .block_erasers =
10192 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010193 {
10194 .eraseblocks = { {256, 512} },
10195 .block_erase = spi_block_erase_db,
10196 }, {
10197 .eraseblocks = { {64 * 1024, 2} },
10198 .block_erase = spi_block_erase_d8,
10199 }
10200 },
10201 .printlock = spi_prettyprint_status_register_default_welwip,
10202 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10203 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10204 .read = spi_chip_read, /* Fast read (0x0B) supported */
10205 .voltage = {2700, 3600},
10206 },
10207
10208 {
10209 .vendor = "Micron/Numonyx/ST",
10210 .name = "M45PE20",
10211 .bustype = BUS_SPI,
10212 .manufacture_id = ST_ID,
10213 .model_id = ST_M45PE20,
10214 .total_size = 256,
10215 .page_size = 256,
10216 .tested = TEST_UNTESTED,
10217 .probe = probe_spi_rdid,
10218 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010219 .block_erasers =
10220 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010221 {
10222 .eraseblocks = { {256, 1024} },
10223 .block_erase = spi_block_erase_db,
10224 }, {
10225 .eraseblocks = { {64 * 1024, 4} },
10226 .block_erase = spi_block_erase_d8,
10227 }
10228 },
10229 .printlock = spi_prettyprint_status_register_default_welwip,
10230 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10231 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10232 .read = spi_chip_read, /* Fast read (0x0B) supported */
10233 .voltage = {2700, 3600},
10234 },
10235
10236 {
10237 .vendor = "Micron/Numonyx/ST",
10238 .name = "M45PE40",
10239 .bustype = BUS_SPI,
10240 .manufacture_id = ST_ID,
10241 .model_id = ST_M45PE40,
10242 .total_size = 512,
10243 .page_size = 256,
10244 .tested = TEST_UNTESTED,
10245 .probe = probe_spi_rdid,
10246 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010247 .block_erasers =
10248 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010249 {
10250 .eraseblocks = { {256, 2048} },
10251 .block_erase = spi_block_erase_db,
10252 }, {
10253 .eraseblocks = { {64 * 1024, 8} },
10254 .block_erase = spi_block_erase_d8,
10255 }
10256 },
10257 .printlock = spi_prettyprint_status_register_default_welwip,
10258 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000010259 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010260 .read = spi_chip_read, /* Fast read (0x0B) supported */
10261 .voltage = {2700, 3600},
10262 },
10263
10264 {
10265 .vendor = "Micron/Numonyx/ST",
10266 .name = "M45PE80",
10267 .bustype = BUS_SPI,
10268 .manufacture_id = ST_ID,
10269 .model_id = ST_M45PE80,
10270 .total_size = 1024,
10271 .page_size = 256,
10272 .tested = TEST_UNTESTED,
10273 .probe = probe_spi_rdid,
10274 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010275 .block_erasers =
10276 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010277 {
10278 .eraseblocks = { {256, 4096} },
10279 .block_erase = spi_block_erase_db,
10280 }, {
10281 .eraseblocks = { {64 * 1024, 16} },
10282 .block_erase = spi_block_erase_d8,
10283 }
10284 },
10285 .printlock = spi_prettyprint_status_register_default_welwip,
10286 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10287 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10288 .read = spi_chip_read, /* Fast read (0x0B) supported */
10289 .voltage = {2700, 3600},
10290 },
10291
10292 {
10293 .vendor = "Micron/Numonyx/ST",
10294 .name = "M45PE16",
10295 .bustype = BUS_SPI,
10296 .manufacture_id = ST_ID,
10297 .model_id = ST_M45PE16,
10298 .total_size = 2048,
10299 .page_size = 256,
10300 .tested = TEST_UNTESTED,
10301 .probe = probe_spi_rdid,
10302 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010303 .block_erasers =
10304 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010305 {
10306 .eraseblocks = { {256, 8192} },
10307 .block_erase = spi_block_erase_db,
10308 }, {
10309 .eraseblocks = { {64 * 1024, 32} },
10310 .block_erase = spi_block_erase_d8,
10311 }
10312 },
10313 .printlock = spi_prettyprint_status_register_default_welwip,
10314 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10315 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10316 .read = spi_chip_read, /* Fast read (0x0B) supported */
10317 .voltage = {2700, 3600},
10318 },
10319
10320 {
10321 .vendor = "Micron/Numonyx/ST",
10322 .name = "N25Q016",
10323 .bustype = BUS_SPI,
10324 .manufacture_id = ST_ID,
10325 .model_id = ST_N25Q016__1E,
10326 .total_size = 2048,
10327 .page_size = 256,
10328 /* supports SFDP */
10329 /* OTP: 64B total; read 0x4B, write 0x42 */
10330 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10331 .tested = TEST_UNTESTED,
10332 .probe = probe_spi_rdid,
10333 .probe_timing = TIMING_ZERO,
10334 .block_erasers =
10335 {
10336 {
10337 .eraseblocks = { {4 * 1024, 512} },
10338 .block_erase = spi_block_erase_20,
10339 }, {
10340 .eraseblocks = { {32 * 1024, 64} },
10341 .block_erase = spi_block_erase_52,
10342 }, {
10343 .eraseblocks = { {64 * 1024, 32} },
10344 .block_erase = spi_block_erase_d8,
10345 }, {
10346 .eraseblocks = { {2 * 1024 * 1024, 1} },
10347 .block_erase = spi_block_erase_c7,
10348 }
10349 },
10350 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10351 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10352 .write = spi_chip_write_256, /* Multi I/O supported */
10353 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10354 .voltage = {1700, 2000},
10355 },
10356
10357 {
10358 .vendor = "Micron/Numonyx/ST",
10359 .name = "N25Q032..1E",
10360 .bustype = BUS_SPI,
10361 .manufacture_id = ST_ID,
10362 .model_id = ST_N25Q032__1E,
10363 .total_size = 4096,
10364 .page_size = 256,
10365 /* supports SFDP */
10366 /* OTP: 64B total; read 0x4B, write 0x42 */
10367 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10368 .tested = TEST_UNTESTED,
10369 .probe = probe_spi_rdid,
10370 .probe_timing = TIMING_ZERO,
10371 .block_erasers =
10372 {
10373 {
10374 .eraseblocks = { {4 * 1024, 1024} },
10375 .block_erase = spi_block_erase_20,
10376 }, {
10377 .eraseblocks = { {64 * 1024, 64} },
10378 .block_erase = spi_block_erase_d8,
10379 }, {
10380 .eraseblocks = { {4 * 1024 * 1024, 1} },
10381 .block_erase = spi_block_erase_c7,
10382 }
10383 },
10384 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10385 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10386 .write = spi_chip_write_256, /* Multi I/O supported */
10387 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10388 .voltage = {1700, 2000},
10389 },
10390
10391 {
10392 .vendor = "Micron/Numonyx/ST",
10393 .name = "N25Q032..3E",
10394 .bustype = BUS_SPI,
10395 .manufacture_id = ST_ID,
10396 .model_id = ST_N25Q032__3E,
10397 .total_size = 4096,
10398 .page_size = 256,
10399 /* supports SFDP */
10400 /* OTP: 64B total; read 0x4B, write 0x42 */
10401 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10402 .tested = TEST_OK_PREW,
10403 .probe = probe_spi_rdid,
10404 .probe_timing = TIMING_ZERO,
10405 .block_erasers =
10406 {
10407 {
10408 .eraseblocks = { {4 * 1024, 1024} },
10409 .block_erase = spi_block_erase_20,
10410 }, {
10411 .eraseblocks = { {64 * 1024, 64} },
10412 .block_erase = spi_block_erase_d8,
10413 }, {
10414 .eraseblocks = { {4 * 1024 * 1024, 1} },
10415 .block_erase = spi_block_erase_c7,
10416 }
10417 },
10418 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10419 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10420 .write = spi_chip_write_256, /* Multi I/O supported */
10421 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10422 .voltage = {2700, 3600},
10423 },
10424
10425 {
10426 .vendor = "Micron/Numonyx/ST",
10427 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10428 .bustype = BUS_SPI,
10429 .manufacture_id = ST_ID,
10430 .model_id = ST_N25Q064__1E,
10431 .total_size = 8192,
10432 .page_size = 256,
10433 /* supports SFDP */
10434 /* OTP: 64B total; read 0x4B, write 0x42 */
10435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010436 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010437 .probe = probe_spi_rdid,
10438 .probe_timing = TIMING_ZERO,
10439 .block_erasers =
10440 {
10441 {
10442 .eraseblocks = { {4 * 1024, 2048 } },
10443 .block_erase = spi_block_erase_20,
10444 }, {
10445 .eraseblocks = { {64 * 1024, 128} },
10446 .block_erase = spi_block_erase_d8,
10447 }, {
10448 .eraseblocks = { {8 * 1024 * 1024, 1} },
10449 .block_erase = spi_block_erase_c7,
10450 }
10451 },
10452 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10453 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10454 .write = spi_chip_write_256, /* Multi I/O supported */
10455 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10456 .voltage = {1700, 2000},
10457 },
10458
10459 {
10460 .vendor = "Micron/Numonyx/ST",
10461 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10462 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010463 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010464 .model_id = ST_N25Q064__3E,
10465 .total_size = 8192,
10466 .page_size = 256,
10467 /* supports SFDP */
10468 /* OTP: 64B total; read 0x4B, write 0x42 */
10469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10470 .tested = TEST_OK_PREW,
10471 .probe = probe_spi_rdid,
10472 .probe_timing = TIMING_ZERO,
10473 .block_erasers =
10474 {
10475 {
10476 .eraseblocks = { {4 * 1024, 2048 } },
10477 .block_erase = spi_block_erase_20,
10478 }, {
10479 .eraseblocks = { {64 * 1024, 128} },
10480 .block_erase = spi_block_erase_d8,
10481 }, {
10482 .eraseblocks = { {8 * 1024 * 1024, 1} },
10483 .block_erase = spi_block_erase_c7,
10484 }
10485 },
10486 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10487 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10488 .write = spi_chip_write_256, /* Multi I/O supported */
10489 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10490 .voltage = {2700, 3600},
10491 },
10492
10493 {
10494 .vendor = "Micron/Numonyx/ST",
10495 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10496 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010497 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010498 .model_id = ST_N25Q128__1E,
10499 .total_size = 16384,
10500 .page_size = 256,
10501 /* supports SFDP */
10502 /* OTP: 64B total; read 0x4B, write 0x42 */
10503 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010504 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010505 .probe = probe_spi_rdid,
10506 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010507 .block_erasers =
10508 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010509 {
10510 .eraseblocks = { {4 * 1024, 4096 } },
10511 .block_erase = spi_block_erase_20,
10512 }, {
10513 .eraseblocks = { {64 * 1024, 256} },
10514 .block_erase = spi_block_erase_d8,
10515 }, {
10516 .eraseblocks = { {16384 * 1024, 1} },
10517 .block_erase = spi_block_erase_c7,
10518 }
10519 },
10520 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10521 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10522 .write = spi_chip_write_256, /* Multi I/O supported */
10523 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10524 .voltage = {1700, 2000},
10525 },
10526
10527 {
10528 .vendor = "Micron/Numonyx/ST",
10529 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10530 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010531 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010532 .model_id = ST_N25Q128__3E,
10533 .total_size = 16384,
10534 .page_size = 256,
10535 /* supports SFDP */
10536 /* OTP: 64B total; read 0x4B, write 0x42 */
10537 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10538 .tested = TEST_OK_PREW,
10539 .probe = probe_spi_rdid,
10540 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010541 .block_erasers =
10542 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010543 {
10544 .eraseblocks = { {4 * 1024, 4096 } },
10545 .block_erase = spi_block_erase_20,
10546 }, {
10547 .eraseblocks = { {64 * 1024, 256} },
10548 .block_erase = spi_block_erase_d8,
10549 }, {
10550 .eraseblocks = { {16384 * 1024, 1} },
10551 .block_erase = spi_block_erase_c7,
10552 }
10553 },
10554 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10555 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10556 .write = spi_chip_write_256, /* Multi I/O supported */
10557 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10558 .voltage = {2700, 3600},
10559 },
10560
10561 {
Ed Swierk199ab392017-07-03 13:33:44 -070010562 .vendor = "Micron",
10563 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
10564 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010565 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070010566 .model_id = ST_N25Q256__3E,
10567 .total_size = 32768,
10568 .page_size = 256,
10569 /* supports SFDP */
10570 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010010571 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10572 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -070010573 .probe = probe_spi_rdid,
10574 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010575 .block_erasers =
10576 {
Ed Swierk199ab392017-07-03 13:33:44 -070010577 {
10578 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010579 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010580 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010581 .eraseblocks = { {4 * 1024, 8192} },
10582 .block_erase = spi_block_erase_20,
10583 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010584 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010585 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010586 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010587 .eraseblocks = { {64 * 1024, 512} },
10588 .block_erase = spi_block_erase_d8,
10589 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010590 .eraseblocks = { {32768 * 1024, 1} },
10591 .block_erase = spi_block_erase_c7,
10592 }
10593 },
10594 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10595 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10596 .write = spi_chip_write_256, /* Multi I/O supported */
10597 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10598 .voltage = {2700, 3600},
10599 },
10600
10601 {
10602 .vendor = "Micron",
10603 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
10604 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100010605 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070010606 .model_id = ST_N25Q512__3E,
10607 .total_size = 65536,
10608 .page_size = 256,
10609 /* supports SFDP */
10610 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010010611 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020010612 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070010613 .probe = probe_spi_rdid,
10614 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010615 .block_erasers =
10616 {
Ed Swierk199ab392017-07-03 13:33:44 -070010617 {
10618 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010619 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010620 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010621 .eraseblocks = { {4 * 1024, 16384} },
10622 .block_erase = spi_block_erase_20,
10623 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010624 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010625 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010626 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010627 .eraseblocks = { {64 * 1024, 1024} },
10628 .block_erase = spi_block_erase_d8,
10629 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010630 .eraseblocks = { {65536 * 1024, 1} },
10631 .block_erase = spi_block_erase_c7,
10632 }
10633 },
10634 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10635 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10636 .write = spi_chip_write_256, /* Multi I/O supported */
10637 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10638 .voltage = {2700, 3600},
10639 },
10640
10641 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010642 .vendor = "MoselVitelic",
10643 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010644 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010645 .manufacture_id = SYNCMOS_MVC_ID,
10646 .model_id = MVC_V29C51000B,
10647 .total_size = 64,
10648 .page_size = 512,
10649 .feature_bits = FEATURE_EITHER_RESET,
10650 .tested = TEST_UNTESTED,
10651 .probe = probe_jedec,
10652 .probe_timing = TIMING_ZERO,
10653 .block_erasers =
10654 {
10655 {
10656 .eraseblocks = { {512, 128} },
10657 .block_erase = erase_sector_jedec,
10658 }, {
10659 .eraseblocks = { {64 * 1024, 1} },
10660 .block_erase = erase_chip_block_jedec,
10661 },
10662 },
10663 .write = write_jedec_1,
10664 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010665 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010666 },
10667
10668 {
10669 .vendor = "MoselVitelic",
10670 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010671 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010672 .manufacture_id = SYNCMOS_MVC_ID,
10673 .model_id = MVC_V29C51000T,
10674 .total_size = 64,
10675 .page_size = 512,
10676 .feature_bits = FEATURE_EITHER_RESET,
10677 .tested = TEST_UNTESTED,
10678 .probe = probe_jedec,
10679 .probe_timing = TIMING_ZERO,
10680 .block_erasers =
10681 {
10682 {
10683 .eraseblocks = { {512, 128} },
10684 .block_erase = erase_sector_jedec,
10685 }, {
10686 .eraseblocks = { {64 * 1024, 1} },
10687 .block_erase = erase_chip_block_jedec,
10688 },
10689 },
10690 .write = write_jedec_1,
10691 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010692 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010693 },
10694
10695 {
10696 .vendor = "MoselVitelic",
10697 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010698 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010699 .manufacture_id = SYNCMOS_MVC_ID,
10700 .model_id = MVC_V29C51400B,
10701 .total_size = 512,
10702 .page_size = 1024,
10703 .feature_bits = FEATURE_EITHER_RESET,
10704 .tested = TEST_UNTESTED,
10705 .probe = probe_jedec,
10706 .probe_timing = TIMING_ZERO,
10707 .block_erasers =
10708 {
10709 {
10710 .eraseblocks = { {1024, 512} },
10711 .block_erase = erase_sector_jedec,
10712 }, {
10713 .eraseblocks = { {512 * 1024, 1} },
10714 .block_erase = erase_chip_block_jedec,
10715 },
10716 },
10717 .write = write_jedec_1,
10718 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010719 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010720 },
10721
10722 {
10723 .vendor = "MoselVitelic",
10724 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010725 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010726 .manufacture_id = SYNCMOS_MVC_ID,
10727 .model_id = MVC_V29C51400T,
10728 .total_size = 512,
10729 .page_size = 1024,
10730 .feature_bits = FEATURE_EITHER_RESET,
10731 .tested = TEST_UNTESTED,
10732 .probe = probe_jedec,
10733 .probe_timing = TIMING_ZERO,
10734 .block_erasers =
10735 {
10736 {
10737 .eraseblocks = { {1024, 512} },
10738 .block_erase = erase_sector_jedec,
10739 }, {
10740 .eraseblocks = { {512 * 1024, 1} },
10741 .block_erase = erase_chip_block_jedec,
10742 },
10743 },
10744 .write = write_jedec_1,
10745 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010746 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010747 },
10748
10749 {
10750 .vendor = "MoselVitelic",
10751 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010752 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010753 .manufacture_id = SYNCMOS_MVC_ID,
10754 .model_id = MVC_V29LC51000,
10755 .total_size = 64,
10756 .page_size = 512,
10757 .feature_bits = FEATURE_EITHER_RESET,
10758 .tested = TEST_UNTESTED,
10759 .probe = probe_jedec,
10760 .probe_timing = TIMING_ZERO,
10761 .block_erasers =
10762 {
10763 {
10764 .eraseblocks = { {512, 128} },
10765 .block_erase = erase_sector_jedec,
10766 }, {
10767 .eraseblocks = { {64 * 1024, 1} },
10768 .block_erase = erase_chip_block_jedec,
10769 },
10770 },
10771 .write = write_jedec_1,
10772 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010773 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010774 },
10775
10776 {
10777 .vendor = "MoselVitelic",
10778 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010779 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010780 .manufacture_id = SYNCMOS_MVC_ID,
10781 .model_id = MVC_V29LC51001,
10782 .total_size = 128,
10783 .page_size = 512,
10784 .feature_bits = FEATURE_EITHER_RESET,
10785 .tested = TEST_UNTESTED,
10786 .probe = probe_jedec,
10787 .probe_timing = TIMING_ZERO,
10788 .block_erasers =
10789 {
10790 {
10791 .eraseblocks = { {512, 256} },
10792 .block_erase = erase_sector_jedec,
10793 }, {
10794 .eraseblocks = { {128 * 1024, 1} },
10795 .block_erase = erase_chip_block_jedec,
10796 },
10797 },
10798 .write = write_jedec_1,
10799 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010800 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010801 },
10802
10803 {
10804 .vendor = "MoselVitelic",
10805 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010806 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010807 .manufacture_id = SYNCMOS_MVC_ID,
10808 .model_id = MVC_V29LC51002,
10809 .total_size = 256,
10810 .page_size = 512,
10811 .feature_bits = FEATURE_EITHER_RESET,
10812 .tested = TEST_UNTESTED,
10813 .probe = probe_jedec,
10814 .probe_timing = TIMING_ZERO,
10815 .block_erasers =
10816 {
10817 {
10818 .eraseblocks = { {512, 512} },
10819 .block_erase = erase_sector_jedec,
10820 }, {
10821 .eraseblocks = { {256 * 1024, 1} },
10822 .block_erase = erase_chip_block_jedec,
10823 },
10824 },
10825 .write = write_jedec_1,
10826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010827 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010828 },
10829
10830 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010831 .vendor = "Nantronics",
10832 .name = "N25S10",
10833 .bustype = BUS_SPI,
10834 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10835 .model_id = NANTRONICS_N25S10,
10836 .total_size = 128,
10837 .page_size = 256,
10838 .feature_bits = FEATURE_WRSR_WREN,
10839 .tested = TEST_UNTESTED,
10840 .probe = probe_spi_rdid,
10841 .probe_timing = TIMING_ZERO,
10842 .block_erasers =
10843 {
10844 {
10845 .eraseblocks = { {4 * 1024, 32} },
10846 .block_erase = spi_block_erase_20,
10847 }, {
10848 .eraseblocks = { {4 * 1024, 32} },
10849 .block_erase = spi_block_erase_d7,
10850 }, {
10851 .eraseblocks = { {32 * 1024, 4} },
10852 .block_erase = spi_block_erase_52,
10853 }, {
10854 .eraseblocks = { {64 * 1024, 2} },
10855 .block_erase = spi_block_erase_d8,
10856 }, {
10857 .eraseblocks = { {128 * 1024, 1} },
10858 .block_erase = spi_block_erase_60,
10859 }, {
10860 .eraseblocks = { {128 * 1024, 1} },
10861 .block_erase = spi_block_erase_c7,
10862 }
10863 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010864 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010865 .unlock = spi_disable_blockprotect_bp3_srwd,
10866 .write = spi_chip_write_256,
10867 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10868 .voltage = {2700, 3600},
10869 },
10870
10871 {
10872 .vendor = "Nantronics",
10873 .name = "N25S20",
10874 .bustype = BUS_SPI,
10875 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10876 .model_id = NANTRONICS_N25S20,
10877 .total_size = 256,
10878 .page_size = 256,
10879 .feature_bits = FEATURE_WRSR_WREN,
10880 .tested = TEST_UNTESTED,
10881 .probe = probe_spi_rdid,
10882 .probe_timing = TIMING_ZERO,
10883 .block_erasers =
10884 {
10885 {
10886 .eraseblocks = { {4 * 1024, 64} },
10887 .block_erase = spi_block_erase_20,
10888 }, {
10889 .eraseblocks = { {4 * 1024, 64} },
10890 .block_erase = spi_block_erase_d7,
10891 }, {
10892 .eraseblocks = { {32 * 1024, 8} },
10893 .block_erase = spi_block_erase_52,
10894 }, {
10895 .eraseblocks = { {64 * 1024, 4} },
10896 .block_erase = spi_block_erase_d8,
10897 }, {
10898 .eraseblocks = { {256 * 1024, 1} },
10899 .block_erase = spi_block_erase_60,
10900 }, {
10901 .eraseblocks = { {256 * 1024, 1} },
10902 .block_erase = spi_block_erase_c7,
10903 }
10904 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010905 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010906 .unlock = spi_disable_blockprotect_bp3_srwd,
10907 .write = spi_chip_write_256,
10908 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10909 .voltage = {2700, 3600},
10910 },
10911
10912 {
10913 .vendor = "Nantronics",
10914 .name = "N25S40",
10915 .bustype = BUS_SPI,
10916 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10917 .model_id = NANTRONICS_N25S40,
10918 .total_size = 512,
10919 .page_size = 256,
10920 .feature_bits = FEATURE_WRSR_WREN,
10921 .tested = TEST_UNTESTED,
10922 .probe = probe_spi_rdid,
10923 .probe_timing = TIMING_ZERO,
10924 .block_erasers =
10925 {
10926 {
10927 .eraseblocks = { {4 * 1024, 128} },
10928 .block_erase = spi_block_erase_20,
10929 }, {
10930 .eraseblocks = { {4 * 1024, 128} },
10931 .block_erase = spi_block_erase_d7,
10932 }, {
10933 .eraseblocks = { {32 * 1024, 16} },
10934 .block_erase = spi_block_erase_52,
10935 }, {
10936 .eraseblocks = { {64 * 1024, 8} },
10937 .block_erase = spi_block_erase_d8,
10938 }, {
10939 .eraseblocks = { {512 * 1024, 1} },
10940 .block_erase = spi_block_erase_60,
10941 }, {
10942 .eraseblocks = { {512 * 1024, 1} },
10943 .block_erase = spi_block_erase_c7,
10944 }
10945 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010946 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010947 .unlock = spi_disable_blockprotect_bp3_srwd,
10948 .write = spi_chip_write_256,
10949 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10950 .voltage = {2700, 3600},
10951 },
10952
10953 {
10954 .vendor = "Nantronics",
10955 .name = "N25S80",
10956 .bustype = BUS_SPI,
10957 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10958 .model_id = NANTRONICS_N25S80,
10959 .total_size = 1024,
10960 .page_size = 256,
10961 .feature_bits = FEATURE_WRSR_WREN,
10962 .tested = TEST_UNTESTED,
10963 .probe = probe_spi_rdid,
10964 .probe_timing = TIMING_ZERO,
10965 .block_erasers =
10966 {
10967 {
10968 .eraseblocks = { {4 * 1024, 256} },
10969 .block_erase = spi_block_erase_20,
10970 }, {
10971 .eraseblocks = { {32 * 1024, 32} },
10972 .block_erase = spi_block_erase_52,
10973 }, {
10974 .eraseblocks = { {64 * 1024, 16} },
10975 .block_erase = spi_block_erase_d8,
10976 }, {
10977 .eraseblocks = { {1024 * 1024, 1} },
10978 .block_erase = spi_block_erase_60,
10979 }, {
10980 .eraseblocks = { {1024 * 1024, 1} },
10981 .block_erase = spi_block_erase_c7,
10982 }
10983 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010984 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010985 .unlock = spi_disable_blockprotect_bp3_srwd,
10986 .write = spi_chip_write_256,
10987 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10988 .voltage = {2700, 3600},
10989 },
10990
10991 {
10992 .vendor = "Nantronics",
10993 .name = "N25S16",
10994 .bustype = BUS_SPI,
10995 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10996 .model_id = NANTRONICS_N25S16,
10997 .total_size = 2048,
10998 .page_size = 256,
10999 .feature_bits = FEATURE_WRSR_WREN,
11000 .tested = TEST_UNTESTED,
11001 .probe = probe_spi_rdid,
11002 .probe_timing = TIMING_ZERO,
11003 .block_erasers =
11004 {
11005 {
11006 .eraseblocks = { {4 * 1024, 512} },
11007 .block_erase = spi_block_erase_20,
11008 }, {
11009 .eraseblocks = { {64 * 1024, 32} },
11010 .block_erase = spi_block_erase_d8,
11011 }, {
11012 .eraseblocks = { {2048 * 1024, 1} },
11013 .block_erase = spi_block_erase_60,
11014 }, {
11015 .eraseblocks = { {2048 * 1024, 1} },
11016 .block_erase = spi_block_erase_c7,
11017 }
11018 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011019 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000011020 .unlock = spi_disable_blockprotect_bp3_srwd,
11021 .write = spi_chip_write_256,
11022 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11023 .voltage = {2700, 3600},
11024 },
11025
11026 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011027 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +000011028 .name = "Pm25LD256C",
11029 .bustype = BUS_SPI,
11030 .manufacture_id = PMC_ID,
11031 .model_id = PMC_PM25LD256C,
11032 .total_size = 32,
11033 .page_size = 256,
11034 .feature_bits = FEATURE_WRSR_WREN,
11035 .tested = TEST_UNTESTED,
11036 .probe = probe_spi_rdid,
11037 .probe_timing = TIMING_ZERO,
11038 .block_erasers =
11039 {
11040 {
11041 .eraseblocks = { {4 * 1024, 8} },
11042 .block_erase = spi_block_erase_20,
11043 }, {
11044 .eraseblocks = { {4 * 1024, 8} },
11045 .block_erase = spi_block_erase_d7,
11046 }, {
11047 .eraseblocks = { {32 * 1024, 1} },
11048 .block_erase = spi_block_erase_d8,
11049 }, {
11050 .eraseblocks = { {32 * 1024, 1} },
11051 .block_erase = spi_block_erase_60,
11052 }, {
11053 .eraseblocks = { {32 * 1024, 1} },
11054 .block_erase = spi_block_erase_c7,
11055 }
11056 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011057 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011058 .unlock = spi_disable_blockprotect,
11059 .write = spi_chip_write_256,
11060 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11061 .voltage = {2700, 3600},
11062 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100011063
Stefan Taunerf4451612013-04-19 01:59:15 +000011064 {
11065 .vendor = "PMC",
11066 .name = "Pm25LD512(C)",
11067 .bustype = BUS_SPI,
11068 .manufacture_id = PMC_ID,
11069 .model_id = PMC_PM25LD512,
11070 .total_size = 64,
11071 .page_size = 256,
11072 .feature_bits = FEATURE_WRSR_WREN,
11073 .tested = TEST_OK_PREW,
11074 .probe = probe_spi_rdid,
11075 .probe_timing = TIMING_ZERO,
11076 .block_erasers =
11077 {
11078 {
11079 .eraseblocks = { {4 * 1024, 16} },
11080 .block_erase = spi_block_erase_20,
11081 }, {
11082 .eraseblocks = { {4 * 1024, 16} },
11083 .block_erase = spi_block_erase_d7,
11084 }, {
11085 .eraseblocks = { {32 * 1024, 2} },
11086 .block_erase = spi_block_erase_d8,
11087 }, {
11088 .eraseblocks = { {64 * 1024, 1} },
11089 .block_erase = spi_block_erase_60,
11090 }, {
11091 .eraseblocks = { {64 * 1024, 1} },
11092 .block_erase = spi_block_erase_c7,
11093 }
11094 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011095 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011096 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11097 .write = spi_chip_write_256,
11098 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11099 .voltage = {2300, 3600},
11100 },
11101
11102 {
11103 .vendor = "PMC",
11104 .name = "Pm25LD010(C)",
11105 .bustype = BUS_SPI,
11106 .manufacture_id = PMC_ID,
11107 .model_id = PMC_PM25LD010,
11108 .total_size = 128,
11109 .page_size = 256,
11110 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011111 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011112 .probe = probe_spi_rdid,
11113 .probe_timing = TIMING_ZERO,
11114 .block_erasers =
11115 {
11116 {
11117 .eraseblocks = { {4 * 1024, 32} },
11118 .block_erase = spi_block_erase_20,
11119 }, {
11120 .eraseblocks = { {4 * 1024, 32} },
11121 .block_erase = spi_block_erase_d7,
11122 }, {
11123 .eraseblocks = { {32 * 1024, 4} },
11124 .block_erase = spi_block_erase_d8,
11125 }, {
11126 .eraseblocks = { {128 * 1024, 1} },
11127 .block_erase = spi_block_erase_60,
11128 }, {
11129 .eraseblocks = { {128 * 1024, 1} },
11130 .block_erase = spi_block_erase_c7,
11131 }
11132 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011133 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011134 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11135 .write = spi_chip_write_256,
11136 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11137 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
11138 },
11139
11140 {
11141 .vendor = "PMC",
11142 .name = "Pm25LD020(C)",
11143 .bustype = BUS_SPI,
11144 .manufacture_id = PMC_ID,
11145 .model_id = PMC_PM25LD020,
11146 .total_size = 256,
11147 .page_size = 256,
11148 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020011149 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011150 .probe = probe_spi_rdid,
11151 .probe_timing = TIMING_ZERO,
11152 .block_erasers =
11153 {
11154 {
11155 .eraseblocks = { {4 * 1024, 64} },
11156 .block_erase = spi_block_erase_20,
11157 }, {
11158 .eraseblocks = { {4 * 1024, 64} },
11159 .block_erase = spi_block_erase_d7,
11160 }, {
11161 .eraseblocks = { {64 * 1024, 4} },
11162 .block_erase = spi_block_erase_d8,
11163 }, {
11164 .eraseblocks = { {256 * 1024, 1} },
11165 .block_erase = spi_block_erase_60,
11166 }, {
11167 .eraseblocks = { {256 * 1024, 1} },
11168 .block_erase = spi_block_erase_c7,
11169 }
11170 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011171 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011172 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11173 .write = spi_chip_write_256,
11174 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11175 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
11176 },
11177
11178 {
11179 .vendor = "PMC",
11180 .name = "Pm25LD040(C)",
11181 .bustype = BUS_SPI,
11182 .manufacture_id = PMC_ID,
11183 .model_id = PMC_PM25LV040,
11184 .total_size = 512,
11185 .page_size = 256,
11186 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020011187 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000011188 .probe = probe_spi_rdid,
11189 .probe_timing = TIMING_ZERO,
11190 .block_erasers =
11191 {
11192 {
11193 .eraseblocks = { {4 * 1024, 128} },
11194 .block_erase = spi_block_erase_20,
11195 }, {
11196 .eraseblocks = { {4 * 1024, 128} },
11197 .block_erase = spi_block_erase_d7,
11198 }, {
11199 .eraseblocks = { {64 * 1024, 8} },
11200 .block_erase = spi_block_erase_d8,
11201 }, {
11202 .eraseblocks = { {512 * 1024, 1} },
11203 .block_erase = spi_block_erase_60,
11204 }, {
11205 .eraseblocks = { {512 * 1024, 1} },
11206 .block_erase = spi_block_erase_c7,
11207 }
11208 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011209 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000011210 .unlock = spi_disable_blockprotect,
11211 .write = spi_chip_write_256,
11212 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11213 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
11214 },
11215
Steven Honeyman81a8fb72015-06-02 22:32:24 +000011216 {
11217 .vendor = "PMC",
11218 .name = "Pm25LQ020",
11219 .bustype = BUS_SPI,
11220 .manufacture_id = PMC_ID,
11221 .model_id = PMC_PM25LQ020,
11222 .total_size = 256,
11223 .page_size = 256,
11224 /* OTP: 256B total; read 0x4B, write 0xB1 */
11225 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11226 .tested = TEST_UNTESTED,
11227 .probe = probe_spi_rdid,
11228 .probe_timing = TIMING_ZERO,
11229 .block_erasers =
11230 {
11231 {
11232 .eraseblocks = { {4 * 1024, 64} },
11233 .block_erase = spi_block_erase_20,
11234 }, {
11235 .eraseblocks = { {4 * 1024, 64} },
11236 .block_erase = spi_block_erase_d7,
11237 }, {
11238 .eraseblocks = { {64 * 1024, 4} },
11239 .block_erase = spi_block_erase_d8,
11240 }, {
11241 .eraseblocks = { {256 * 1024, 1} },
11242 .block_erase = spi_block_erase_60,
11243 }, {
11244 .eraseblocks = { {256 * 1024, 1} },
11245 .block_erase = spi_block_erase_c7,
11246 }
11247 },
11248 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11249 .unlock = spi_disable_blockprotect_bp3_srwd,
11250 .write = spi_chip_write_256,
11251 .read = spi_chip_read,
11252 .voltage = {2300, 3600},
11253 },
11254
11255 {
11256 .vendor = "PMC",
11257 .name = "Pm25LQ040",
11258 .bustype = BUS_SPI,
11259 .manufacture_id = PMC_ID,
11260 .model_id = PMC_PM25LQ040,
11261 .total_size = 512,
11262 .page_size = 256,
11263 /* OTP: 256B total; read 0x4B, write 0xB1 */
11264 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11265 .tested = TEST_UNTESTED,
11266 .probe = probe_spi_rdid,
11267 .probe_timing = TIMING_ZERO,
11268 .block_erasers =
11269 {
11270 {
11271 .eraseblocks = { {4 * 1024, 128} },
11272 .block_erase = spi_block_erase_20,
11273 }, {
11274 .eraseblocks = { {4 * 1024, 128} },
11275 .block_erase = spi_block_erase_d7,
11276 }, {
11277 .eraseblocks = { {64 * 1024, 8} },
11278 .block_erase = spi_block_erase_d8,
11279 }, {
11280 .eraseblocks = { {512 * 1024, 1} },
11281 .block_erase = spi_block_erase_60,
11282 }, {
11283 .eraseblocks = { {512 * 1024, 1} },
11284 .block_erase = spi_block_erase_c7,
11285 }
11286 },
11287 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11288 .unlock = spi_disable_blockprotect_bp3_srwd,
11289 .write = spi_chip_write_256,
11290 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11291 .voltage = {2300, 3600},
11292 },
11293
11294 {
11295 .vendor = "PMC",
11296 .name = "Pm25LQ080",
11297 .bustype = BUS_SPI,
11298 .manufacture_id = PMC_ID,
11299 .model_id = PMC_PM25LQ080,
11300 .total_size = 1024,
11301 .page_size = 256,
11302 /* OTP: 64B total; read 0x4B, write 0xB1 */
11303 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11304 .tested = TEST_UNTESTED,
11305 .probe = probe_spi_rdid,
11306 .probe_timing = TIMING_ZERO,
11307 .block_erasers =
11308 {
11309 {
11310 .eraseblocks = { {4 * 1024, 256} },
11311 .block_erase = spi_block_erase_20,
11312 }, {
11313 .eraseblocks = { {4 * 1024, 256} },
11314 .block_erase = spi_block_erase_d7,
11315 }, {
11316 .eraseblocks = { {64 * 1024, 16} },
11317 .block_erase = spi_block_erase_d8,
11318 }, {
11319 .eraseblocks = { {1024 * 1024, 1} },
11320 .block_erase = spi_block_erase_60,
11321 }, {
11322 .eraseblocks = { {1024 * 1024, 1} },
11323 .block_erase = spi_block_erase_c7,
11324 }
11325 },
11326 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11327 .unlock = spi_disable_blockprotect_bp3_srwd,
11328 .write = spi_chip_write_256,
11329 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11330 .voltage = {2300, 3600},
11331 },
11332
11333 {
11334 .vendor = "PMC",
11335 .name = "Pm25LQ016",
11336 .bustype = BUS_SPI,
11337 .manufacture_id = PMC_ID,
11338 .model_id = PMC_PM25LQ016,
11339 .total_size = 2048,
11340 .page_size = 256,
11341 /* OTP: 256B total; read 0x4B, write 0xB1 */
11342 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11343 .tested = TEST_UNTESTED,
11344 .probe = probe_spi_rdid,
11345 .probe_timing = TIMING_ZERO,
11346 .block_erasers =
11347 {
11348 {
11349 .eraseblocks = { {4 * 1024, 512} },
11350 .block_erase = spi_block_erase_20,
11351 }, {
11352 .eraseblocks = { {4 * 1024, 512} },
11353 .block_erase = spi_block_erase_d7,
11354 }, {
11355 .eraseblocks = { {64 * 1024, 32} },
11356 .block_erase = spi_block_erase_d8,
11357 }, {
11358 .eraseblocks = { {2048 * 1024, 1} },
11359 .block_erase = spi_block_erase_60,
11360 }, {
11361 .eraseblocks = { {2048 * 1024, 1} },
11362 .block_erase = spi_block_erase_c7,
11363 }
11364 },
11365 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11366 .unlock = spi_disable_blockprotect_bp3_srwd,
11367 .write = spi_chip_write_256,
11368 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11369 .voltage = {2300, 3600},
11370 },
11371
11372 {
11373 .vendor = "PMC",
11374 .name = "Pm25LQ032C",
11375 .bustype = BUS_SPI,
11376 .manufacture_id = PMC_ID,
11377 .model_id = PMC_PM25LQ032C,
11378 .total_size = 4096,
11379 .page_size = 256,
11380 /* OTP: 64B total; read 0x4B, write 0xB1 */
11381 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011382 .tested = TEST_OK_PREW,
Steven Honeyman81a8fb72015-06-02 22:32:24 +000011383 .probe = probe_spi_rdid,
11384 .probe_timing = TIMING_ZERO,
11385 .block_erasers =
11386 {
11387 {
11388 .eraseblocks = { {4 * 1024, 1024} },
11389 .block_erase = spi_block_erase_20,
11390 }, {
11391 .eraseblocks = { {4 * 1024, 1024} },
11392 .block_erase = spi_block_erase_d7,
11393 }, {
11394 .eraseblocks = { {64 * 1024, 64} },
11395 .block_erase = spi_block_erase_d8,
11396 }, {
11397 .eraseblocks = { {4096 * 1024, 1} },
11398 .block_erase = spi_block_erase_60,
11399 }, {
11400 .eraseblocks = { {4096 * 1024, 1} },
11401 .block_erase = spi_block_erase_c7,
11402 }
11403 },
11404 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11405 .unlock = spi_disable_blockprotect_bp3_srwd,
11406 .write = spi_chip_write_256,
11407 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11408 .voltage = {2700, 3600},
11409 },
11410
11411 {
Stefan Taunerf4451612013-04-19 01:59:15 +000011412 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011413 .name = "Pm25LV512(A)",
11414 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000011415 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011416 .model_id = PMC_PM25LV512,
11417 .total_size = 64,
11418 .page_size = 256,
11419 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +000011420 .tested = TEST_OK_PREW,
Stefan Taunerbecda742014-05-30 19:34:00 +000011421 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011422 .probe_timing = TIMING_ZERO,
11423 .block_erasers =
11424 {
11425 {
11426 .eraseblocks = { {4 * 1024, 16} },
11427 .block_erase = spi_block_erase_d7,
11428 }, {
11429 .eraseblocks = { {32 * 1024, 2} },
11430 .block_erase = spi_block_erase_d8,
11431 }, {
11432 .eraseblocks = { {64 * 1024, 1} },
11433 .block_erase = spi_block_erase_c7,
11434 }
11435 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011436 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011437 .unlock = spi_disable_blockprotect,
11438 .write = spi_chip_write_256,
11439 .read = spi_chip_read, /* Fast read (0x0B) supported */
11440 .voltage = {2700, 3600},
11441 },
11442
11443 {
11444 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011445 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011446 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000011447 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011448 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011449 .total_size = 128,
11450 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011451 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000011452 .tested = TEST_OK_PREW,
11453 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011454 .probe_timing = TIMING_ZERO,
11455 .block_erasers =
11456 {
11457 {
11458 .eraseblocks = { {4 * 1024, 32} },
11459 .block_erase = spi_block_erase_d7,
11460 }, {
11461 .eraseblocks = { {32 * 1024, 4} },
11462 .block_erase = spi_block_erase_d8,
11463 }, {
11464 .eraseblocks = { {128 * 1024, 1} },
11465 .block_erase = spi_block_erase_c7,
11466 }
11467 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011468 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011469 .unlock = spi_disable_blockprotect,
11470 .write = spi_chip_write_256,
11471 .read = spi_chip_read, /* Fast read (0x0B) supported */
11472 .voltage = {2700, 3600},
11473 },
11474
11475 {
11476 .vendor = "PMC",
11477 .name = "Pm25LV010A",
11478 .bustype = BUS_SPI,
11479 .manufacture_id = PMC_ID,
11480 .model_id = PMC_PM25LV010,
11481 .total_size = 128,
11482 .page_size = 256,
11483 .feature_bits = FEATURE_WRSR_WREN,
11484 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011485 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011486 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011487 .block_erasers =
11488 {
11489 {
11490 .eraseblocks = { {4 * 1024, 32} },
11491 .block_erase = spi_block_erase_d7,
11492 }, {
11493 .eraseblocks = { {32 * 1024, 4} },
11494 .block_erase = spi_block_erase_d8,
11495 }, {
11496 .eraseblocks = { {128 * 1024, 1} },
11497 .block_erase = spi_block_erase_c7,
11498 }
11499 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011500 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011501 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011502 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011503 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000011504 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011505 },
11506
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011507 {
11508 .vendor = "PMC",
11509 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011510 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011511 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011512 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011513 .total_size = 256,
11514 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011515 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011516 .tested = TEST_UNTESTED,
11517 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011518 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011519 .block_erasers =
11520 {
11521 {
11522 .eraseblocks = { {4 * 1024, 64} },
11523 .block_erase = spi_block_erase_d7,
11524 }, {
11525 .eraseblocks = { {64 * 1024, 4} },
11526 .block_erase = spi_block_erase_d8,
11527 }, {
11528 .eraseblocks = { {256 * 1024, 1} },
11529 .block_erase = spi_block_erase_c7,
11530 }
11531 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011532 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011533 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011534 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011535 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011536 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011537 },
11538
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011539 {
11540 .vendor = "PMC",
11541 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011542 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011543 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011544 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011545 .total_size = 512,
11546 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011547 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000011548 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011549 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011550 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011551 .block_erasers =
11552 {
11553 {
11554 .eraseblocks = { {4 * 1024, 128} },
11555 .block_erase = spi_block_erase_d7,
11556 }, {
11557 .eraseblocks = { {64 * 1024, 8} },
11558 .block_erase = spi_block_erase_d8,
11559 }, {
11560 .eraseblocks = { {512 * 1024, 1} },
11561 .block_erase = spi_block_erase_c7,
11562 }
11563 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011564 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011565 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011566 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011567 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011568 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011569 },
11570
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011571 {
11572 .vendor = "PMC",
11573 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011574 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011575 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011576 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011577 .total_size = 1024,
11578 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011579 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011580 .tested = TEST_UNTESTED,
11581 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011582 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011583 .block_erasers =
11584 {
11585 {
11586 .eraseblocks = { {4 * 1024, 256} },
11587 .block_erase = spi_block_erase_d7,
11588 }, {
11589 .eraseblocks = { {4 * 1024, 256} },
11590 .block_erase = spi_block_erase_20,
11591 }, {
11592 .eraseblocks = { {64 * 1024, 16} },
11593 .block_erase = spi_block_erase_d8,
11594 }, {
11595 .eraseblocks = { {1024 * 1024, 1} },
11596 .block_erase = spi_block_erase_60,
11597 }, {
11598 .eraseblocks = { {1024 * 1024, 1} },
11599 .block_erase = spi_block_erase_c7,
11600 }
11601 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011602 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011603 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011604 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011605 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011606 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011607 },
11608
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011609 {
11610 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011611 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011612 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011613 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011614 .model_id = PMC_PM25LV016B,
11615 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011616 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011617 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011618 .tested = TEST_UNTESTED,
11619 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011620 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011621 .block_erasers =
11622 {
11623 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011624 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +000011625 .block_erase = spi_block_erase_d7,
11626 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011627 .eraseblocks = { {4 * 1024, 512} },
11628 .block_erase = spi_block_erase_20,
11629 }, {
11630 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +000011631 .block_erase = spi_block_erase_d8,
11632 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011633 .eraseblocks = { {2 * 1024 * 1024, 1} },
11634 .block_erase = spi_block_erase_60,
11635 }, {
11636 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011637 .block_erase = spi_block_erase_c7,
11638 }
11639 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011640 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011641 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011642 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011643 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000011644 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011645 },
11646
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011647 {
11648 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011649 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011650 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011651 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011652 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011653 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011654 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011655 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011656 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000011657 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011658 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011659 .block_erasers =
11660 {
11661 {
11662 .eraseblocks = {
11663 {128 * 1024, 1},
11664 {96 * 1024, 1},
11665 {8 * 1024, 2},
11666 {16 * 1024, 1},
11667 },
Sean Nelson35727f72010-01-28 23:55:12 +000011668 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011669 }, {
11670 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011671 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011672 },
11673 },
Sean Nelson35727f72010-01-28 23:55:12 +000011674 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011675 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011676 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011677 },
11678
11679 {
11680 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011681 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011682 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011683 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011684 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011685 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011686 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011687 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011688 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011689 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011690 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011691 .block_erasers =
11692 {
11693 {
11694 .eraseblocks = {
11695 {16 * 1024, 1},
11696 {8 * 1024, 2},
11697 {96 * 1024, 1},
11698 {128 * 1024, 1},
11699 },
Sean Nelson35727f72010-01-28 23:55:12 +000011700 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011701 }, {
11702 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011703 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011704 },
11705 },
Sean Nelson35727f72010-01-28 23:55:12 +000011706 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011707 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011708 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011709 },
11710
11711 {
11712 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011713 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011714 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011715 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011716 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011717 .total_size = 128,
11718 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011719 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011720 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011721 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011722 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000011723 .block_erasers =
11724 {
11725 {
11726 .eraseblocks = { {4 * 1024, 32} },
11727 .block_erase = erase_sector_jedec,
11728 }, {
11729 .eraseblocks = { {64 * 1024, 2} },
11730 .block_erase = erase_block_jedec,
11731 }, {
11732 .eraseblocks = { {128 * 1024, 1} },
11733 .block_erase = erase_chip_block_jedec,
11734 }
11735 },
Sean Nelson35727f72010-01-28 23:55:12 +000011736 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011737 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011738 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011739 },
11740
11741 {
11742 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011743 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011744 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011745 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011746 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011747 .total_size = 256,
11748 .page_size = 4096,
11749 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11750 .tested = TEST_UNTESTED,
11751 .probe = probe_jedec,
11752 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100011753 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011754 {
11755 {
11756 .eraseblocks = { {4 * 1024, 64} },
11757 .block_erase = erase_sector_jedec,
11758 }, {
11759 .eraseblocks = { {64 * 1024, 4} },
11760 .block_erase = erase_block_jedec,
11761 }, {
11762 .eraseblocks = { {256 * 1024, 1} },
11763 .block_erase = erase_chip_block_jedec,
11764 }
11765 },
11766 .write = write_jedec_1,
11767 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011768 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011769 },
11770
11771 {
11772 .vendor = "PMC",
11773 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011774 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011775 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011776 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011777 .total_size = 512,
11778 .page_size = 4096,
11779 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011780 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011781 .probe = probe_jedec,
11782 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100011783 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011784 {
11785 {
11786 .eraseblocks = { {4 * 1024, 128} },
11787 .block_erase = erase_sector_jedec,
11788 }, {
11789 .eraseblocks = { {64 * 1024, 8} },
11790 .block_erase = erase_block_jedec,
11791 }, {
11792 .eraseblocks = { {512 * 1024, 1} },
11793 .block_erase = erase_chip_block_jedec,
11794 }
11795 },
11796 .write = write_jedec_1,
11797 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011798 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011799 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000011800
11801 {
11802 .vendor = "PMC",
11803 .name = "Pm39LV512",
11804 .bustype = BUS_PARALLEL,
11805 .manufacture_id = PMC_ID_NOPREFIX,
11806 .model_id = PMC_PM39LV512,
11807 .total_size = 64,
11808 .page_size = 4096,
11809 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11810 .tested = TEST_OK_PREW,
11811 .probe = probe_jedec,
11812 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11813 .block_erasers =
11814 {
11815 {
11816 .eraseblocks = { {4 * 1024, 16} },
11817 .block_erase = erase_sector_jedec,
11818 }, {
11819 .eraseblocks = { {64 * 1024, 1} },
11820 .block_erase = erase_block_jedec,
11821 }, {
11822 .eraseblocks = { {64 * 1024, 1} },
11823 .block_erase = erase_chip_block_jedec,
11824 }
11825 },
11826 .write = write_jedec_1,
11827 .read = read_memmapped,
11828 .voltage = {2700, 3600},
11829 },
11830
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011831 {
11832 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011833 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011834 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011835 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011836 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011837 .total_size = 256,
11838 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011839 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011840 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011841 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011842 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000011843 .block_erasers =
11844 {
11845 {
11846 .eraseblocks = { {4 * 1024, 64} },
11847 .block_erase = erase_sector_jedec,
11848 }, {
11849 .eraseblocks = { {16 * 1024, 16} },
11850 .block_erase = erase_block_jedec,
11851 }, {
11852 .eraseblocks = { {256 * 1024, 1} },
11853 .block_erase = erase_chip_block_jedec,
11854 }
11855 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011856 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000011857 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011858 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011859 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011860 },
11861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011862 {
11863 .vendor = "PMC",
11864 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011865 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011866 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011867 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011868 .total_size = 512,
11869 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011870 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011871 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011872 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011873 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011874 .block_erasers =
11875 {
11876 {
11877 .eraseblocks = { {4 * 1024, 128} },
11878 .block_erase = erase_sector_jedec,
11879 }, {
11880 .eraseblocks = { {64 * 1024, 8} },
11881 .block_erase = erase_block_jedec,
11882 }, {
11883 .eraseblocks = { {512 * 1024, 1} },
11884 .block_erase = erase_chip_block_jedec,
11885 }
11886 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011887 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000011888 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011889 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011890 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011891 },
11892
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011893 {
Sean Nelsond70b09c2009-11-24 02:11:08 +000011894 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +000011895 .name = "LE25FW106",
11896 .bustype = BUS_SPI,
11897 .manufacture_id = SANYO_ID,
11898 .model_id = SANYO_LE25FW106,
11899 .total_size = 128,
11900 .page_size = 256,
11901 .feature_bits = FEATURE_WRSR_WREN,
11902 .tested = TEST_OK_PREW,
11903 .probe = probe_spi_res2,
11904 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011905 .block_erasers =
11906 {
Stefan Taunera60d4082014-06-04 16:17:03 +000011907 {
11908 .eraseblocks = { {2 * 1024, 64} },
11909 .block_erase = spi_block_erase_d7,
11910 }, {
11911 .eraseblocks = { {32 * 1024, 4} },
11912 .block_erase = spi_block_erase_d8,
11913 }, {
11914 .eraseblocks = { {128 * 1024, 1} },
11915 .block_erase = spi_block_erase_c7,
11916 }
11917 },
11918 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
11919 .unlock = spi_disable_blockprotect_bp1_srwd,
11920 .write = spi_chip_write_256,
11921 .read = spi_chip_read,
11922 .voltage = {2700, 3600},
11923 },
11924
11925 {
11926 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +000011927 .name = "LE25FW406A",
11928 .bustype = BUS_SPI,
11929 .manufacture_id = SANYO_ID,
11930 .model_id = SANYO_LE25FW406A,
11931 .total_size = 512,
11932 .page_size = 256,
11933 .feature_bits = FEATURE_WRSR_WREN,
11934 .tested = TEST_OK_PREW,
11935 .probe = probe_spi_res2,
11936 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011937 .block_erasers =
11938 {
Stefan Tauner33491b82014-05-18 21:36:04 +000011939 {
11940 .eraseblocks = { {4 * 1024, 128} },
11941 .block_erase = spi_block_erase_d7,
11942 }, {
11943 .eraseblocks = { {64 * 1024, 8} },
11944 .block_erase = spi_block_erase_d8,
11945 }, {
11946 .eraseblocks = { {512 * 1024, 1} },
11947 .block_erase = spi_block_erase_c7,
Alan Greenfdf5da42019-06-27 16:56:52 +100011948 }
11949 },
Stefan Tauner33491b82014-05-18 21:36:04 +000011950 .printlock = spi_prettyprint_status_register_plain,
11951 .unlock = spi_disable_blockprotect,
11952 .write = spi_chip_write_256,
11953 .read = spi_chip_read,
11954 .voltage = {2700, 3600},
11955 },
11956
11957 {
11958 .vendor = "Sanyo",
Angel Ponsf2cd3252018-09-30 19:03:45 +020011959 .name = "LE25FU106B",
11960 .bustype = BUS_SPI,
11961 .manufacture_id = SANYO_ID,
11962 .model_id = SANYO_LE25FU106B,
11963 .total_size = 128,
11964 .page_size = 256,
11965 .feature_bits = FEATURE_WRSR_WREN,
11966 .tested = TEST_UNTESTED,
11967 .probe = probe_spi_res2,
11968 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011969 .block_erasers =
11970 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020011971 /* FIXME: Is this correct?
11972 {
11973 .eraseblocks = { {2 * 1024, 64} },
11974 .block_erase = spi_block_erase_d7,
11975 },*/
11976 {
11977 .eraseblocks = { {32 * 1024, 4} },
11978 .block_erase = spi_block_erase_d8,
11979 }, {
11980 .eraseblocks = { {128 * 1024, 1} },
11981 .block_erase = spi_block_erase_c7,
11982 }
11983 },
11984 .printlock = spi_prettyprint_status_register_bp1_srwd,
11985 .unlock = spi_disable_blockprotect_bp1_srwd,
11986 .write = spi_chip_write_256,
11987 .read = spi_chip_read,
11988 .voltage = {2300, 3600},
11989 },
11990
11991 {
11992 .vendor = "Sanyo",
11993 .name = "LE25FU206",
11994 .bustype = BUS_SPI,
11995 .manufacture_id = SANYO_ID,
11996 .model_id = SANYO_LE25FU206,
11997 .total_size = 256,
11998 .page_size = 256,
11999 .feature_bits = FEATURE_WRSR_WREN,
12000 .tested = TEST_UNTESTED,
12001 .probe = probe_spi_res2,
12002 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012003 .block_erasers =
12004 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020012005 {
12006 .eraseblocks = { {4 * 1024, 64} },
12007 .block_erase = spi_block_erase_d7,
12008 }, {
12009 .eraseblocks = { {64 * 1024, 4} },
12010 .block_erase = spi_block_erase_d8,
12011 }, {
12012 .eraseblocks = { {256 * 1024, 1} },
12013 .block_erase = spi_block_erase_c7,
12014 }
12015 },
12016 .printlock = spi_prettyprint_status_register_bp1_srwd,
12017 .unlock = spi_disable_blockprotect_bp1_srwd,
12018 .write = spi_chip_write_256,
12019 .read = spi_chip_read,
12020 .voltage = {2300, 3600},
12021 },
12022
12023 {
12024 .vendor = "Sanyo",
12025 .name = "LE25FU206A",
12026 .bustype = BUS_SPI,
12027 .manufacture_id = SANYO_ID,
12028 .model_id = SANYO_LE25FU206A,
12029 .total_size = 256,
12030 .page_size = 256,
12031 .tested = TEST_UNTESTED,
12032 .probe = probe_spi_rdid,
12033 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012034 .block_erasers =
12035 {
Angel Ponsf2cd3252018-09-30 19:03:45 +020012036 {
12037 .eraseblocks = { {4 * 1024, 64} },
12038 .block_erase = spi_block_erase_20,
12039 }, {
12040 .eraseblocks = { {4 * 1024, 64} },
12041 .block_erase = spi_block_erase_d7,
12042 }, {
12043 .eraseblocks = { {64 * 1024, 4} },
12044 .block_erase = spi_block_erase_d8,
12045 }, {
12046 .eraseblocks = { {256 * 1024, 1} },
12047 .block_erase = spi_block_erase_60,
12048 }, {
12049 .eraseblocks = { {256 * 1024, 1} },
12050 .block_erase = spi_block_erase_c7,
12051 }
12052 },
12053 .printlock = spi_prettyprint_status_register_bp2_srwd,
12054 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12055 .write = spi_chip_write_256,
12056 .read = spi_chip_read,
12057 .voltage = {2300, 3600},
12058 },
12059
12060 {
12061 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +000012062 .name = "LE25FU406B",
12063 .bustype = BUS_SPI,
12064 .manufacture_id = SANYO_ID,
12065 .model_id = SANYO_LE25FU406B,
12066 .total_size = 512,
12067 .page_size = 256,
12068 .feature_bits = FEATURE_WRSR_WREN,
12069 .tested = TEST_OK_PREW,
12070 .probe = probe_spi_res2,
12071 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012072 .block_erasers =
12073 {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012074 {
12075 .eraseblocks = { {4 * 1024, 128} },
12076 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012077 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012078 .eraseblocks = { {64 * 1024, 8} },
12079 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012080 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000012081 .eraseblocks = { {512 * 1024, 1} },
12082 .block_erase = spi_block_erase_c7,
12083 }
Alan Greenfdf5da42019-06-27 16:56:52 +100012084 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012085 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +000012086 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12087 .write = spi_chip_write_256,
12088 .read = spi_chip_read,
12089 .voltage = {2300, 3600},
12090 },
12091
12092 {
12093 .vendor = "Sanyo",
Stefan Tauner2f055df2015-12-25 22:13:15 +000012094 .name = "LE25FU406C/LE25U40CMC",
12095 .bustype = BUS_SPI,
12096 .manufacture_id = SANYO_ID,
12097 .model_id = SANYO_LE25FU406C,
12098 .total_size = 512,
12099 .page_size = 256,
12100 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsce2c09d2018-09-30 20:22:02 +020012101 .tested = TEST_OK_PREW,
Stefan Tauner2f055df2015-12-25 22:13:15 +000012102 .probe = probe_spi_rdid,
12103 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012104 .block_erasers =
12105 {
Stefan Tauner2f055df2015-12-25 22:13:15 +000012106 {
12107 .eraseblocks = { {4 * 1024, 128} },
12108 .block_erase = spi_block_erase_20,
12109 }, {
12110 .eraseblocks = { {4 * 1024, 128} },
12111 .block_erase = spi_block_erase_d7,
12112 }, {
12113 .eraseblocks = { {64 * 1024, 8} },
12114 .block_erase = spi_block_erase_d8,
12115 }, {
12116 .eraseblocks = { {512 * 1024, 1} },
12117 .block_erase = spi_block_erase_60,
12118 }, {
12119 .eraseblocks = { {512 * 1024, 1} },
12120 .block_erase = spi_block_erase_c7,
12121 }
Alan Greenfdf5da42019-06-27 16:56:52 +100012122 },
Stefan Tauner2f055df2015-12-25 22:13:15 +000012123 .printlock = spi_prettyprint_status_register_bp2_srwd,
12124 .unlock = spi_disable_blockprotect_bp2_srwd,
12125 .write = spi_chip_write_256,
12126 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
12127 .voltage = {2300, 3600},
12128 },
12129
12130 {
12131 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012132 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012133 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +000012134 .manufacture_id = SANYO_ID,
12135 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012136 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +000012137 .page_size = 256,
12138 .tested = TEST_UNTESTED,
12139 .probe = probe_spi_rdid,
12140 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012141 .block_erasers =
12142 {
12143 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012144 .eraseblocks = { {256, 1024} },
12145 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012146 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012147 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +000012148 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012149 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012150 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000012151 .block_erase = spi_block_erase_c7,
12152 }
12153 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012154 .printlock = spi_prettyprint_status_register_default_welwip,
12155 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +000012156 .write = spi_chip_write_256,
12157 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012158 .voltage = {2700, 3600},
12159 },
12160
12161 {
12162 .vendor = "Sanyo",
12163 .name = "LE25FW403A",
12164 .bustype = BUS_SPI,
12165 .manufacture_id = SANYO_ID,
12166 .model_id = SANYO_LE25FW403A,
12167 .total_size = 512,
12168 .page_size = 256,
12169 .tested = TEST_UNTESTED,
12170 .probe = probe_spi_rdid,
12171 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012172 .block_erasers =
12173 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012174 {
12175 .eraseblocks = { {256, 2 * 1024} },
12176 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012177 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012178 .eraseblocks = { {64 * 1024, 8} },
12179 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012180 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012181 .eraseblocks = { {512 * 1024, 1} },
12182 .block_erase = spi_block_erase_c7,
12183 }
12184 },
12185 .printlock = spi_prettyprint_status_register_default_welwip,
12186 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
12187 .write = spi_chip_write_256,
12188 .read = spi_chip_read,
12189 .voltage = {2700, 3600},
12190 },
12191
12192 {
12193 .vendor = "Sanyo",
12194 .name = "LE25FW418A",
12195 .bustype = BUS_SPI,
12196 .manufacture_id = SANYO_ID,
12197 .model_id = SANYO_LE25FW418A,
12198 .total_size = 512,
12199 .page_size = 256,
12200 .feature_bits = FEATURE_WRSR_WREN,
12201 .tested = TEST_UNTESTED,
12202 .probe = probe_spi_res2,
12203 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012204 .block_erasers =
12205 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012206 {
12207 .eraseblocks = { {4 * 1024, 128} },
12208 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012209 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012210 .eraseblocks = { {64 * 1024, 8} },
12211 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012212 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012213 .eraseblocks = { {512 * 1024, 1} },
12214 .block_erase = spi_block_erase_c7,
Alan Greenfdf5da42019-06-27 16:56:52 +100012215 }
12216 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012217 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012218 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12219 .write = spi_chip_write_256,
12220 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
12221 .voltage = {2700, 3600},
12222 },
12223
12224 {
12225 .vendor = "Sanyo",
12226 .name = "LE25FW806",
12227 .bustype = BUS_SPI,
12228 .manufacture_id = SANYO_ID,
12229 .model_id = SANYO_LE25FW806,
12230 .total_size = 1024,
12231 .page_size = 256,
12232 .feature_bits = FEATURE_WRSR_WREN,
12233 .tested = TEST_UNTESTED,
12234 .probe = probe_spi_res2,
12235 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012236 .block_erasers =
12237 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012238 {
12239 .eraseblocks = { {4 * 1024, 256} },
12240 .block_erase = spi_block_erase_20,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012241 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012242 .eraseblocks = { {4 * 1024, 256} },
12243 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012244 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012245 .eraseblocks = { {64 * 1024, 16} },
12246 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012247 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012248 .eraseblocks = { {1024 * 1024, 1} },
12249 .block_erase = spi_block_erase_c7,
12250 }
12251 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012252 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012253 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12254 .write = spi_chip_write_256,
12255 .read = spi_chip_read,
12256 .voltage = {2700, 3600},
12257 },
12258
12259 {
12260 .vendor = "Sanyo",
12261 .name = "LE25FW808",
12262 .bustype = BUS_SPI,
12263 .manufacture_id = SANYO_ID,
12264 .model_id = SANYO_LE25FW808,
12265 .total_size = 1024,
12266 .page_size = 256,
12267 .feature_bits = FEATURE_WRSR_WREN,
12268 .tested = TEST_UNTESTED,
12269 .probe = probe_spi_res2,
12270 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012271 .block_erasers =
12272 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012273 {
12274 .eraseblocks = { {8 * 1024, 128} },
12275 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012276 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012277 .eraseblocks = { {64 * 1024, 16} },
12278 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012279 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012280 .eraseblocks = { {1024 * 1024, 1} },
12281 .block_erase = spi_block_erase_c7,
12282 }
12283 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012284 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000012285 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
12286 .write = spi_chip_write_256,
12287 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
12288 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000012289 },
12290
12291 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012292 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000012293 .name = "LH28F008BJT-BTLZ1",
12294 .bustype = BUS_PARALLEL,
12295 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000012296 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000012297 .total_size = 1024,
12298 .page_size = 64 * 1024,
12299 .tested = TEST_OK_PREW,
12300 .probe = probe_82802ab,
12301 .probe_timing = TIMING_ZERO,
12302 .block_erasers =
12303 {
12304 {
12305 .eraseblocks = {
12306 {8 * 1024, 8},
12307 {64 * 1024, 15}
12308 },
12309 .block_erase = erase_block_82802ab,
12310 }, {
12311 .eraseblocks = { {1024 * 1024, 1} },
12312 .block_erase = erase_sector_49lfxxxc,
12313 }
12314 },
12315 .unlock = unlock_lh28f008bjt,
12316 .write = write_82802ab,
12317 .read = read_memmapped,
12318 .voltage = {2700, 3600},
12319 },
12320
12321 {
12322 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012323 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012324 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012325 .manufacture_id = SHARP_ID,
12326 .model_id = SHARP_LHF00L04,
12327 .total_size = 1024,
12328 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012329 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012330 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012331 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012332 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012333 .block_erasers =
12334 {
12335 {
12336 .eraseblocks = {
12337 {64 * 1024, 15},
12338 {8 * 1024, 8}
12339 },
Sean Nelson28accc22010-03-19 18:47:06 +000012340 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012341 }, {
12342 .eraseblocks = {
12343 {1024 * 1024, 1}
12344 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000012345 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000012346 },
12347 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012348 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000012349 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012350 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012351 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012352 },
12353
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012354 {
12355 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000012356 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012357 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012358 .manufacture_id = SPANSION_ID,
12359 .model_id = SPANSION_S25FL004A,
12360 .total_size = 512,
12361 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012362 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000012363 .tested = TEST_UNTESTED,
12364 .probe = probe_spi_rdid,
12365 .probe_timing = TIMING_ZERO,
12366 .block_erasers =
12367 {
12368 {
12369 .eraseblocks = { {64 * 1024, 8} },
12370 .block_erase = spi_block_erase_d8,
12371 }, {
12372 .eraseblocks = { {512 * 1024, 1} },
12373 .block_erase = spi_block_erase_c7,
12374 }
12375 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012376 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012377 .unlock = spi_disable_blockprotect,
12378 .write = spi_chip_write_256,
12379 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012380 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012381 },
12382
12383 {
12384 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000012385 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012386 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000012387 .manufacture_id = SPANSION_ID,
12388 .model_id = SPANSION_S25FL008A,
12389 .total_size = 1024,
12390 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012391 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000012392 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000012393 .probe = probe_spi_rdid,
12394 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000012395 .block_erasers =
12396 {
12397 {
12398 .eraseblocks = { {64 * 1024, 16} },
12399 .block_erase = spi_block_erase_d8,
12400 }, {
12401 .eraseblocks = { {1024 * 1024, 1} },
12402 .block_erase = spi_block_erase_c7,
12403 }
12404 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012405 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012406 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000012407 .write = spi_chip_write_256,
12408 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012409 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000012410 },
12411
12412 {
12413 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012414 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012415 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012416 .manufacture_id = SPANSION_ID,
12417 .model_id = SPANSION_S25FL016A,
12418 .total_size = 2048,
12419 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012420 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012421 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012422 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012423 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012424 .block_erasers =
12425 {
12426 {
12427 .eraseblocks = { {64 * 1024, 32} },
12428 .block_erase = spi_block_erase_d8,
12429 }, {
12430 .eraseblocks = { {2 * 1024 * 1024, 1} },
12431 .block_erase = spi_block_erase_c7,
12432 }
12433 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012434 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012435 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012436 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012437 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012438 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012439 },
12440
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012441 {
Rudy Hostf4e57772010-11-29 00:37:49 +000012442 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012443 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012444 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012445 .manufacture_id = SPANSION_ID,
12446 .model_id = SPANSION_S25FL032A,
12447 .total_size = 4096,
12448 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012449 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012450 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000012451 .probe = probe_spi_rdid,
12452 .probe_timing = TIMING_ZERO,
12453 .block_erasers =
12454 {
12455 {
12456 .eraseblocks = { {64 * 1024, 64} },
12457 .block_erase = spi_block_erase_d8,
12458 }, {
12459 .eraseblocks = { {4 * 1024 * 1024, 1} },
12460 .block_erase = spi_block_erase_c7,
12461 }
12462 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012463 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012464 .unlock = spi_disable_blockprotect,
12465 .write = spi_chip_write_256,
12466 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012467 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012468 },
12469
12470 {
12471 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012472 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012473 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000012474 .manufacture_id = SPANSION_ID,
12475 .model_id = SPANSION_S25FL064A,
12476 .total_size = 8192,
12477 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012478 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000012479 .tested = TEST_OK_PREW,
12480 .probe = probe_spi_rdid,
12481 .probe_timing = TIMING_ZERO,
12482 .block_erasers =
12483 {
12484 {
12485 .eraseblocks = { {64 * 1024, 128} },
12486 .block_erase = spi_block_erase_d8,
12487 }, {
12488 .eraseblocks = { {8 * 1024 * 1024, 1} },
12489 .block_erase = spi_block_erase_c7,
12490 }
12491 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012492 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000012493 .unlock = spi_disable_blockprotect,
12494 .write = spi_chip_write_256,
12495 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012496 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000012497 },
12498
12499 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012500 .vendor = "Spansion",
12501 .name = "S25FL204K",
12502 .bustype = BUS_SPI,
12503 .manufacture_id = SPANSION_ID,
12504 .model_id = SPANSION_S25FL204,
12505 .total_size = 512,
12506 .page_size = 256,
12507 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012508 .tested = TEST_OK_PR,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012509 .probe = probe_spi_rdid,
12510 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012511 .block_erasers =
12512 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012513 {
12514 .eraseblocks = { {4 * 1024, 128} },
12515 .block_erase = spi_block_erase_20,
12516 }, {
12517 .eraseblocks = { {64 * 1024, 8} },
12518 .block_erase = spi_block_erase_d8,
12519 }, {
12520 .eraseblocks = { { 512 * 1024, 1} },
12521 .block_erase = spi_block_erase_60,
12522 }, {
12523 .eraseblocks = { { 512 * 1024, 1} },
12524 .block_erase = spi_block_erase_c7,
12525 }
12526 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012527 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012528 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012529 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012530 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012531 .voltage = {2700, 3600},
12532 },
12533
12534 {
12535 .vendor = "Spansion",
12536 .name = "S25FL208K",
12537 .bustype = BUS_SPI,
12538 .manufacture_id = SPANSION_ID,
12539 .model_id = SPANSION_S25FL208,
12540 .total_size = 1024,
12541 .page_size = 256,
12542 .feature_bits = FEATURE_WRSR_WREN,
Nico Huber1a7fb6e2018-10-02 20:34:13 +020012543 .tested = TEST_OK_PREW,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012544 .probe = probe_spi_rdid,
12545 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012546 .block_erasers =
12547 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012548 {
12549 .eraseblocks = { {4 * 1024, 256} },
12550 .block_erase = spi_block_erase_20,
12551 }, {
12552 .eraseblocks = { {64 * 1024, 16} },
12553 .block_erase = spi_block_erase_d8,
12554 }, {
12555 .eraseblocks = { { 1024 * 1024, 1} },
12556 .block_erase = spi_block_erase_60,
12557 }, {
12558 .eraseblocks = { { 1024 * 1024, 1} },
12559 .block_erase = spi_block_erase_c7,
12560 }
12561 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012562 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012563 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012564 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012565 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012566 .voltage = {2700, 3600},
12567 },
12568
12569 {
12570 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000012571 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012572 .bustype = BUS_SPI,
12573 .manufacture_id = SPANSION_ID,
12574 .model_id = SPANSION_S25FL216,
12575 .total_size = 2048,
12576 .page_size = 256,
12577 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
12578 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12579 .tested = TEST_UNTESTED,
12580 .probe = probe_spi_rdid,
12581 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012582 .block_erasers =
12583 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012584 {
12585 .eraseblocks = { {4 * 1024, 512} },
12586 .block_erase = spi_block_erase_20,
12587 }, {
12588 .eraseblocks = { {64 * 1024, 32} },
12589 .block_erase = spi_block_erase_d8,
12590 }, {
12591 .eraseblocks = { { 2048 * 1024, 1} },
12592 .block_erase = spi_block_erase_60,
12593 }, {
12594 .eraseblocks = { { 2048 * 1024, 1} },
12595 .block_erase = spi_block_erase_c7,
12596 }
12597 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012598 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000012599 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012600 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000012601 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000012602 .voltage = {2700, 3600},
12603 },
12604
12605 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012606 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000012607 .name = "S25FL132K",
12608 .bustype = BUS_SPI,
12609 .manufacture_id = SPANSION_ID,
12610 .model_id = SPANSION_S25FL132K,
12611 .total_size = 4096,
12612 .page_size = 256,
12613 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
12614 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12615 .tested = TEST_UNTESTED,
12616 .probe = probe_spi_rdid,
12617 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012618 .block_erasers =
12619 {
Nikolay Martynov598968a2014-05-04 21:44:13 +000012620 {
12621 .eraseblocks = { {4 * 1024, 1024} },
12622 .block_erase = spi_block_erase_20,
12623 }, {
12624 .eraseblocks = { {64 * 1024, 64} },
12625 .block_erase = spi_block_erase_d8,
12626 }, {
12627 .eraseblocks = { { 4096 * 1024, 1} },
12628 .block_erase = spi_block_erase_60,
12629 }, {
12630 .eraseblocks = { { 4096 * 1024, 1} },
12631 .block_erase = spi_block_erase_c7,
12632 }
12633 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012634 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000012635 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12636 .write = spi_chip_write_256,
12637 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12638 .voltage = {2700, 3600},
12639 },
12640
12641 {
12642 .vendor = "Spansion",
12643 .name = "S25FL164K",
12644 .bustype = BUS_SPI,
12645 .manufacture_id = SPANSION_ID,
12646 .model_id = SPANSION_S25FL164K,
12647 .total_size = 8192,
12648 .page_size = 256,
12649 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
12650 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12651 .tested = TEST_OK_PREW,
12652 .probe = probe_spi_rdid,
12653 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012654 .block_erasers =
12655 {
Nikolay Martynov598968a2014-05-04 21:44:13 +000012656 {
12657 .eraseblocks = { {4 * 1024, 2048} },
12658 .block_erase = spi_block_erase_20,
12659 }, {
12660 .eraseblocks = { {64 * 1024, 128} },
12661 .block_erase = spi_block_erase_d8,
12662 }, {
12663 .eraseblocks = { { 8192 * 1024, 1} },
12664 .block_erase = spi_block_erase_60,
12665 }, {
12666 .eraseblocks = { { 8192 * 1024, 1} },
12667 .block_erase = spi_block_erase_c7,
12668 }
12669 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012670 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000012671 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12672 .write = spi_chip_write_256,
12673 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12674 .voltage = {2700, 3600},
12675 },
12676
12677 {
12678 .vendor = "Spansion",
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012679 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12680 .bustype = BUS_SPI,
12681 .manufacture_id = SPANSION_ID,
12682 .model_id = SPANSION_S25FL128,
12683 .total_size = 16384,
12684 .page_size = 256,
12685 /* supports 4B addressing */
12686 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12687 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12688 .tested = TEST_OK_PREW,
12689 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
12690 .probe = probe_spi_rdid,
12691 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012692 .block_erasers =
12693 {
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012694 {
12695 /* This chip supports erasing of 32 so-called "parameter sectors" with
12696 * opcode 0x20 which may be configured to be on top or bottom of the address
12697 * space. Trying to access an address outside these 4kB blocks does have no
12698 * effect on the memory contents, e.g.
12699 .eraseblocks = {
12700 {4 * 1024, 32},
12701 {64 * 1024, 254} // inaccessible
12702 },
12703 .block_erase = spi_block_erase_20,
12704 }, { */
12705 .eraseblocks = { { 64 * 1024, 256} },
12706 .block_erase = spi_block_erase_d8,
12707 }, {
12708 .eraseblocks = { { 16384 * 1024, 1} },
12709 .block_erase = spi_block_erase_60,
12710 }, {
12711 .eraseblocks = { { 16384 * 1024, 1} },
12712 .block_erase = spi_block_erase_c7,
12713 }
12714 },
12715 .printlock = spi_prettyprint_status_register_bp2_srwd,
12716 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12717 .write = spi_chip_write_256, /* Multi I/O supported */
12718 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12719 .voltage = {2700, 3600},
12720 },
12721
12722 {
12723 .vendor = "Spansion",
12724 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
12725 .bustype = BUS_SPI,
12726 .manufacture_id = SPANSION_ID,
12727 .model_id = SPANSION_S25FL128,
12728 .total_size = 16384,
12729 .page_size = 512,
12730 /* supports 4B addressing */
12731 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12732 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12733 .tested = TEST_UNTESTED,
12734 .probe = probe_spi_rdid,
12735 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012736 .block_erasers =
12737 {
Jernej Å krabece814a9b2014-12-12 00:32:03 +000012738 {
12739 .eraseblocks = { {256 * 1024, 64} },
12740 .block_erase = spi_block_erase_d8,
12741 }, {
12742 .eraseblocks = { { 16384 * 1024, 1} },
12743 .block_erase = spi_block_erase_60,
12744 }, {
12745 .eraseblocks = { { 16384 * 1024, 1} },
12746 .block_erase = spi_block_erase_c7,
12747 }
12748 },
12749 .printlock = spi_prettyprint_status_register_bp2_srwd,
12750 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12751 .write = spi_chip_write_256, /* Multi I/O supported */
12752 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12753 .voltage = {2700, 3600},
12754 },
12755
12756 {
12757 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000012758 .name = "S25FL128P......0", /* uniform 64 kB sectors */
12759 .bustype = BUS_SPI,
12760 .manufacture_id = SPANSION_ID,
12761 .model_id = SPANSION_S25FL128,
12762 .total_size = 16384,
12763 .page_size = 256,
12764 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons3eb5a8c2018-10-02 01:21:24 +020012765 .tested = TEST_OK_PREW,
Stefan Tauner88b19252014-08-06 14:36:27 +000012766 .probe = probe_spi_rdid,
12767 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012768 .block_erasers =
12769 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012770 {
12771 .eraseblocks = { {64 * 1024, 256} },
12772 .block_erase = spi_block_erase_20,
12773 }, {
12774 .eraseblocks = { {64 * 1024, 256} },
12775 .block_erase = spi_block_erase_d8,
12776 }, {
12777 .eraseblocks = { { 16384 * 1024, 1} },
12778 .block_erase = spi_block_erase_60,
12779 }, {
12780 .eraseblocks = { { 16384 * 1024, 1} },
12781 .block_erase = spi_block_erase_c7,
12782 }
12783 },
12784 .printlock = spi_prettyprint_status_register_bp3_srwd,
12785 .unlock = spi_disable_blockprotect_bp3_srwd,
12786 .write = spi_chip_write_256,
12787 .read = spi_chip_read, /* Fast read (0x0B) supported */
12788 .voltage = {2700, 3600},
12789 },
12790
12791 {
12792 .vendor = "Spansion",
12793 .name = "S25FL128P......1", /* uniform 256kB sectors */
12794 .bustype = BUS_SPI,
12795 .manufacture_id = SPANSION_ID,
12796 .model_id = SPANSION_S25FL128,
12797 .total_size = 16384,
12798 .page_size = 256,
12799 .feature_bits = FEATURE_WRSR_WREN,
12800 .tested = TEST_UNTESTED,
12801 .probe = probe_spi_rdid,
12802 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012803 .block_erasers =
12804 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012805 {
12806 .eraseblocks = { {256 * 1024, 64} },
12807 .block_erase = spi_block_erase_d8,
12808 }, {
12809 .eraseblocks = { { 16384 * 1024, 1} },
12810 .block_erase = spi_block_erase_c7,
12811 }
12812 },
12813 .printlock = spi_prettyprint_status_register_bp2_srwd,
12814 .unlock = spi_disable_blockprotect_bp2_srwd,
12815 .write = spi_chip_write_256,
12816 .read = spi_chip_read, /* Fast read (0x0B) supported */
12817 .voltage = {2700, 3600},
12818 },
12819
12820 {
12821 .vendor = "Spansion",
12822 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012823 .bustype = BUS_SPI,
12824 .manufacture_id = SPANSION_ID,
12825 .model_id = SPANSION_S25FL128,
12826 .total_size = 16384,
12827 .page_size = 256,
12828 /* supports 4B addressing */
12829 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12830 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012831 .tested = TEST_OK_PREW,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012832 .probe = probe_spi_rdid,
12833 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012834 .block_erasers =
12835 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012836 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012837 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12838 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12839 * have no effect on the memory contents, but sets a flag in the SR.
12840 .eraseblocks = {
12841 {4 * 1024, 32},
12842 {64 * 1024, 254} // inaccessible
12843 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012844 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000012845 }, { */
12846 .eraseblocks = { { 64 * 1024, 256} },
12847 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012848 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000012849 .eraseblocks = { { 16384 * 1024, 1} },
12850 .block_erase = spi_block_erase_60,
12851 }, {
12852 .eraseblocks = { { 16384 * 1024, 1} },
12853 .block_erase = spi_block_erase_c7,
12854 }
12855 },
12856 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12857 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12858 .write = spi_chip_write_256, /* Multi I/O supported */
12859 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12860 .voltage = {2700, 3600},
12861 },
12862
12863 {
12864 .vendor = "Spansion",
12865 .name = "S25FL128S......1", /* uniform 256 kB sectors */
12866 .bustype = BUS_SPI,
12867 .manufacture_id = SPANSION_ID,
12868 .model_id = SPANSION_S25FL128,
12869 .total_size = 16384,
12870 .page_size = 512,
12871 /* supports 4B addressing */
12872 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12873 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12874 .tested = TEST_UNTESTED,
12875 .probe = probe_spi_rdid,
12876 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012877 .block_erasers =
12878 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012879 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012880 .eraseblocks = { {256 * 1024, 64} },
12881 .block_erase = spi_block_erase_d8,
12882 }, {
12883 .eraseblocks = { { 16384 * 1024, 1} },
12884 .block_erase = spi_block_erase_60,
12885 }, {
12886 .eraseblocks = { { 16384 * 1024, 1} },
12887 .block_erase = spi_block_erase_c7,
12888 }
12889 },
12890 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12891 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12892 .write = spi_chip_write_256, /* Multi I/O supported */
12893 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12894 .voltage = {2700, 3600},
12895 },
12896
12897 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012898 .vendor = "Spansion",
12899 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12900 .bustype = BUS_SPI,
12901 .manufacture_id = SPANSION_ID,
12902 .model_id = SPANSION_S25FL128,
12903 .total_size = 16384,
12904 .page_size = 256,
12905 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12906 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12907 .tested = TEST_OK_PREW,
12908 .probe = probe_spi_rdid,
12909 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012910 .block_erasers =
12911 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012912 {
12913 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
12914 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
12915 * effect on the memory contents, but sets a flag in the SR.
12916 .eraseblocks = {
12917 {4 * 1024, 32},
12918 {64 * 1024, 254} // inaccessible
12919 },
12920 .block_erase = spi_block_erase_20,
12921 }, { */
12922 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
12923 .eraseblocks = {
12924 {8 * 1024, 16},
12925 {64 * 1024, 254} // inaccessible
12926 },
12927 .block_erase = spi_block_erase_40,
12928 }, { */
12929 .eraseblocks = { { 64 * 1024, 256} },
12930 .block_erase = spi_block_erase_d8,
12931 }, {
12932 .eraseblocks = { { 16384 * 1024, 1} },
12933 .block_erase = spi_block_erase_60,
12934 }, {
12935 .eraseblocks = { { 16384 * 1024, 1} },
12936 .block_erase = spi_block_erase_c7,
12937 }
12938 },
12939 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12940 .unlock = spi_disable_blockprotect_bp2_srwd,
12941 .write = spi_chip_write_256, /* Multi I/O supported */
12942 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12943 .voltage = {2700, 3600},
12944 },
12945
12946 {
12947 .vendor = "Spansion",
12948 .name = "S25FL129P......1", /* uniform 256 kB sectors */
12949 .bustype = BUS_SPI,
12950 .manufacture_id = SPANSION_ID,
12951 .model_id = SPANSION_S25FL128,
12952 .total_size = 16384,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012953 .page_size = 256,
Stefan Tauner88b19252014-08-06 14:36:27 +000012954 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12955 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12956 .tested = TEST_UNTESTED,
12957 .probe = probe_spi_rdid,
12958 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012959 .block_erasers =
12960 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012961 {
12962 .eraseblocks = { {256 * 1024, 64} },
12963 .block_erase = spi_block_erase_d8,
12964 }, {
12965 .eraseblocks = { { 16384 * 1024, 1} },
12966 .block_erase = spi_block_erase_60,
12967 }, {
12968 .eraseblocks = { { 16384 * 1024, 1} },
12969 .block_erase = spi_block_erase_c7,
12970 }
12971 },
12972 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12973 .unlock = spi_disable_blockprotect_bp2_srwd,
12974 .write = spi_chip_write_256, /* Multi I/O supported */
12975 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12976 .voltage = {2700, 3600},
12977 },
12978
12979 {
Nico Huber57dbd642018-03-13 18:01:05 +010012980 .vendor = "Spansion",
12981 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12982 .bustype = BUS_SPI,
12983 .manufacture_id = SPANSION_ID,
12984 .model_id = SPANSION_S25FL256,
12985 .total_size = 32768,
12986 .page_size = 256,
12987 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber6329b0a2018-03-13 18:14:52 +010012988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
Nico Huber57dbd642018-03-13 18:01:05 +010012989 .tested = TEST_OK_PREW,
12990 .probe = probe_spi_rdid,
12991 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012992 .block_erasers =
12993 {
Nico Huber57dbd642018-03-13 18:01:05 +010012994 {
12995 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12996 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12997 * have no effect on the memory contents, but sets a flag in the SR.
12998 .eraseblocks = {
12999 {4 * 1024, 32},
13000 {64 * 1024, 254} // inaccessible
13001 },
13002 .block_erase = spi_block_erase_20,
13003 }, { */
13004 .eraseblocks = { { 64 * 1024, 512} },
Nico Huber6329b0a2018-03-13 18:14:52 +010013005 .block_erase = spi_block_erase_dc,
13006 }, {
13007 .eraseblocks = { { 64 * 1024, 512} },
Nico Huber57dbd642018-03-13 18:01:05 +010013008 .block_erase = spi_block_erase_d8,
13009 }, {
13010 .eraseblocks = { { 32768 * 1024, 1} },
13011 .block_erase = spi_block_erase_60,
13012 }, {
13013 .eraseblocks = { { 32768 * 1024, 1} },
13014 .block_erase = spi_block_erase_c7,
13015 }
13016 },
13017 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
13018 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
13019 .write = spi_chip_write_256, /* Multi I/O supported */
13020 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13021 .voltage = {2700, 3600},
13022 .wrea_override = 0x17,
13023 },
13024
13025 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013026 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013027 .name = "SST25LF020A",
13028 .bustype = BUS_SPI,
13029 .manufacture_id = SST_ID,
13030 .model_id = SST_SST25VF020_REMS,
13031 .total_size = 256,
13032 .page_size = 256,
13033 .feature_bits = FEATURE_WRSR_EWSR,
13034 .tested = TEST_OK_PREW,
13035 .probe = probe_spi_rems,
13036 .probe_timing = TIMING_ZERO,
13037 .block_erasers =
13038 {
13039 {
13040 .eraseblocks = { {4 * 1024, 64} },
13041 .block_erase = spi_block_erase_20,
13042 }, {
13043 .eraseblocks = { {32 * 1024, 8} },
13044 .block_erase = spi_block_erase_52,
13045 }, {
13046 .eraseblocks = { {256 * 1024, 1} },
13047 .block_erase = spi_block_erase_60,
13048 },
13049 },
13050 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13051 .unlock = spi_disable_blockprotect,
13052 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13053 .read = spi_chip_read, /* Fast read (0x0B) supported */
13054 .voltage = {2700, 3600},
13055 },
13056
13057 {
13058 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013059 .name = "SST25LF040A",
13060 .bustype = BUS_SPI,
13061 .manufacture_id = SST_ID,
13062 .model_id = SST_SST25VF040_REMS,
13063 .total_size = 512,
13064 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013065 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013066 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013067 .probe = probe_spi_res2,
13068 .probe_timing = TIMING_ZERO,
13069 .block_erasers =
13070 {
13071 {
13072 .eraseblocks = { {4 * 1024, 128} },
13073 .block_erase = spi_block_erase_20,
13074 }, {
13075 .eraseblocks = { {32 * 1024, 16} },
13076 .block_erase = spi_block_erase_52,
13077 }, {
13078 .eraseblocks = { {512 * 1024, 1} },
13079 .block_erase = spi_block_erase_60,
13080 },
13081 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013082 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013083 .unlock = spi_disable_blockprotect,
13084 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13085 .read = spi_chip_read,
13086 .voltage = {3000, 3600},
13087 },
13088
13089 {
13090 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013091 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013092 .bustype = BUS_SPI,
13093 .manufacture_id = SST_ID,
13094 .model_id = SST_SST25VF080_REMS,
13095 .total_size = 1024,
13096 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013097 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013098 .tested = TEST_UNTESTED,
13099 .probe = probe_spi_res2,
13100 .probe_timing = TIMING_ZERO,
13101 .block_erasers =
13102 {
13103 {
13104 .eraseblocks = { {4 * 1024, 256} },
13105 .block_erase = spi_block_erase_20,
13106 }, {
13107 .eraseblocks = { {32 * 1024, 32} },
13108 .block_erase = spi_block_erase_52,
13109 }, {
13110 .eraseblocks = { {1024 * 1024, 1} },
13111 .block_erase = spi_block_erase_60,
13112 },
13113 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013114 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013115 .unlock = spi_disable_blockprotect,
13116 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13117 .read = spi_chip_read,
13118 .voltage = {3000, 3600},
13119 },
13120
13121 {
13122 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013123 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000013124 .bustype = BUS_SPI,
13125 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000013126 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000013127 .total_size = 64,
13128 .page_size = 256,
13129 .feature_bits = FEATURE_WRSR_EWSR,
13130 .tested = TEST_OK_PREW,
13131 .probe = probe_spi_rems,
13132 .probe_timing = TIMING_ZERO,
13133 .block_erasers =
13134 {
13135 {
13136 .eraseblocks = { {4 * 1024, 16} },
13137 .block_erase = spi_block_erase_20,
13138 }, {
13139 .eraseblocks = { {32 * 1024, 2} },
13140 .block_erase = spi_block_erase_52,
13141 }, {
13142 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013143 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013144 }, {
13145 .eraseblocks = { {64 * 1024, 1} },
13146 .block_erase = spi_block_erase_60,
13147 }, {
13148 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013149 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013150 },
13151 },
13152 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13153 .unlock = spi_disable_blockprotect,
13154 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013155 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013156 .voltage = {2700, 3600},
13157 },
13158
13159 {
13160 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013161 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013162 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013163 .manufacture_id = SST_ID,
13164 .model_id = SST_SST25VF010_REMS,
13165 .total_size = 128,
13166 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013167 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000013168 .tested = TEST_OK_PREW,
13169 .probe = probe_spi_rems,
13170 .probe_timing = TIMING_ZERO,
13171 .block_erasers =
13172 {
13173 {
13174 .eraseblocks = { {4 * 1024, 32} },
13175 .block_erase = spi_block_erase_20,
13176 }, {
13177 .eraseblocks = { {32 * 1024, 4} },
13178 .block_erase = spi_block_erase_52,
13179 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000013180 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013181 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013182 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000013183 .eraseblocks = { {128 * 1024, 1} },
13184 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000013185 }, {
13186 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013187 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013188 },
13189 },
13190 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13191 .unlock = spi_disable_blockprotect,
13192 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013193 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013194 .voltage = {2700, 3600},
13195 },
13196
13197 {
13198 .vendor = "SST",
13199 .name = "SST25VF020",
13200 .bustype = BUS_SPI,
13201 .manufacture_id = SST_ID,
13202 .model_id = SST_SST25VF020_REMS,
13203 .total_size = 256,
13204 .page_size = 256,
13205 .feature_bits = FEATURE_WRSR_EWSR,
13206 .tested = TEST_UNTESTED,
13207 .probe = probe_spi_rems,
13208 .probe_timing = TIMING_ZERO,
13209 .block_erasers =
13210 {
13211 {
13212 .eraseblocks = { {4 * 1024, 64} },
13213 .block_erase = spi_block_erase_20,
13214 }, {
13215 .eraseblocks = { {32 * 1024, 8} },
13216 .block_erase = spi_block_erase_52,
13217 }, {
13218 .eraseblocks = { {256 * 1024, 1} },
13219 .block_erase = spi_block_erase_60,
13220 },
13221 },
13222 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13223 .unlock = spi_disable_blockprotect,
13224 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13225 .read = spi_chip_read, /* only */
13226 .voltage = {2700, 3600},
13227 },
13228
13229 {
13230 .vendor = "SST",
13231 .name = "SST25VF020B",
13232 .bustype = BUS_SPI,
13233 .manufacture_id = SST_ID,
13234 .model_id = SST_SST25VF020B,
13235 .total_size = 256,
13236 .page_size = 256,
13237 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013238 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000013239 .probe = probe_spi_rdid,
13240 .probe_timing = TIMING_ZERO,
13241 .block_erasers =
13242 {
13243 {
13244 .eraseblocks = { {4 * 1024, 64} },
13245 .block_erase = spi_block_erase_20,
13246 }, {
13247 .eraseblocks = { {32 * 1024, 8} },
13248 .block_erase = spi_block_erase_52,
13249 }, {
13250 .eraseblocks = { {64 * 1024, 4} },
13251 .block_erase = spi_block_erase_d8,
13252 }, {
13253 .eraseblocks = { {256 * 1024, 1} },
13254 .block_erase = spi_block_erase_60,
13255 }, {
13256 .eraseblocks = { {256 * 1024, 1} },
13257 .block_erase = spi_block_erase_c7,
13258 },
13259 },
13260 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13261 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13262 .write = spi_aai_write, /* AAI supported (0xAD) */
13263 .read = spi_chip_read, /* Fast read (0x0B) supported */
13264 .voltage = {2700, 3600},
13265 },
13266
13267 {
13268 .vendor = "SST",
13269 .name = "SST25VF040",
13270 .bustype = BUS_SPI,
13271 .manufacture_id = SST_ID,
13272 .model_id = SST_SST25VF040_REMS,
13273 .total_size = 512,
13274 .page_size = 256,
13275 .feature_bits = FEATURE_WRSR_EWSR,
13276 .tested = TEST_OK_PR,
13277 .probe = probe_spi_rems,
13278 .probe_timing = TIMING_ZERO,
13279 .block_erasers =
13280 {
13281 {
13282 .eraseblocks = { {4 * 1024, 128} },
13283 .block_erase = spi_block_erase_20,
13284 }, {
13285 .eraseblocks = { {32 * 1024, 16} },
13286 .block_erase = spi_block_erase_52,
13287 }, {
13288 .eraseblocks = { {512 * 1024, 1} },
13289 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000013290 },
13291 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013292 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000013293 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000013294 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13295 .read = spi_chip_read,
13296 .voltage = {2700, 3600},
13297 },
13298
13299 {
13300 .vendor = "SST",
13301 .name = "SST25VF040B",
13302 .bustype = BUS_SPI,
13303 .manufacture_id = SST_ID,
13304 .model_id = SST_SST25VF040B,
13305 .total_size = 512,
13306 .page_size = 256,
13307 .feature_bits = FEATURE_WRSR_EWSR,
13308 .tested = TEST_OK_PREW,
13309 .probe = probe_spi_rdid,
13310 .probe_timing = TIMING_ZERO,
13311 .block_erasers =
13312 {
13313 {
13314 .eraseblocks = { {4 * 1024, 128} },
13315 .block_erase = spi_block_erase_20,
13316 }, {
13317 .eraseblocks = { {32 * 1024, 16} },
13318 .block_erase = spi_block_erase_52,
13319 }, {
13320 .eraseblocks = { {64 * 1024, 8} },
13321 .block_erase = spi_block_erase_d8,
13322 }, {
13323 .eraseblocks = { {512 * 1024, 1} },
13324 .block_erase = spi_block_erase_60,
13325 }, {
13326 .eraseblocks = { {512 * 1024, 1} },
13327 .block_erase = spi_block_erase_c7,
13328 },
13329 },
13330 .printlock = spi_prettyprint_status_register_sst25vf040b,
13331 .unlock = spi_disable_blockprotect,
13332 .write = spi_aai_write, /* AAI supported (0xAD) */
13333 .read = spi_chip_read, /* Fast read (0x0B) supported */
13334 .voltage = {2700, 3600},
13335 },
13336
13337 {
13338 .vendor = "SST",
13339 .name = "SST25VF040B.REMS",
13340 .bustype = BUS_SPI,
13341 .manufacture_id = SST_ID,
13342 .model_id = SST_SST25VF040B_REMS,
13343 .total_size = 512,
13344 .page_size = 256,
13345 .feature_bits = FEATURE_WRSR_EWSR,
13346 .tested = TEST_OK_PREW,
13347 .probe = probe_spi_rems,
13348 .probe_timing = TIMING_ZERO,
13349 .block_erasers =
13350 {
13351 {
13352 .eraseblocks = { {4 * 1024, 128} },
13353 .block_erase = spi_block_erase_20,
13354 }, {
13355 .eraseblocks = { {32 * 1024, 16} },
13356 .block_erase = spi_block_erase_52,
13357 }, {
13358 .eraseblocks = { {64 * 1024, 8} },
13359 .block_erase = spi_block_erase_d8,
13360 }, {
13361 .eraseblocks = { {512 * 1024, 1} },
13362 .block_erase = spi_block_erase_60,
13363 }, {
13364 .eraseblocks = { {512 * 1024, 1} },
13365 .block_erase = spi_block_erase_c7,
13366 },
13367 },
13368 .printlock = spi_prettyprint_status_register_sst25vf040b,
13369 .unlock = spi_disable_blockprotect,
13370 .write = spi_aai_write,
13371 .read = spi_chip_read,
13372 .voltage = {2700, 3600},
13373 },
13374
13375 {
13376 .vendor = "SST",
Ben Gardnerbcf61092015-11-22 02:23:31 +000013377 .name = "SST25WF020A",
13378 .bustype = BUS_SPI,
13379 .manufacture_id = SANYO_ID, /* See flashchips.h */
13380 .model_id = SST_SST25WF020A,
13381 .total_size = 256,
13382 .page_size = 256,
13383 .feature_bits = FEATURE_WRSR_WREN,
13384 .tested = TEST_UNTESTED,
13385 .probe = probe_spi_rdid,
13386 .probe_timing = TIMING_ZERO,
13387 .block_erasers =
13388 {
13389 {
13390 .eraseblocks = { {4 * 1024, 64} },
13391 .block_erase = spi_block_erase_20,
13392 }, {
13393 .eraseblocks = { {64 * 1024, 4} },
13394 .block_erase = spi_block_erase_d8,
13395 }, {
13396 .eraseblocks = { {256 * 1024, 1} },
13397 .block_erase = spi_block_erase_60,
13398 }, {
13399 .eraseblocks = { {256 * 1024, 1} },
13400 .block_erase = spi_block_erase_c7,
13401 },
13402 },
13403 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13404 .unlock = spi_disable_blockprotect_bp2_srwd,
13405 .write = spi_chip_write_256,
13406 .read = spi_chip_read, /* Fast read (0x0B) supported */
13407 .voltage = {1650, 1950},
13408 },
13409
13410 {
13411 .vendor = "SST",
13412 .name = "SST25WF040B",
13413 .bustype = BUS_SPI,
13414 .manufacture_id = SANYO_ID, /* See flashchips.h */
13415 .model_id = SST_SST25WF040B,
13416 .total_size = 512,
13417 .page_size = 256,
13418 .feature_bits = FEATURE_WRSR_WREN,
13419 .tested = TEST_UNTESTED,
13420 .probe = probe_spi_rdid,
13421 .probe_timing = TIMING_ZERO,
13422 .block_erasers =
13423 {
13424 {
13425 .eraseblocks = { {4 * 1024, 128} },
13426 .block_erase = spi_block_erase_20,
13427 }, {
13428 .eraseblocks = { {64 * 1024, 8} },
13429 .block_erase = spi_block_erase_d8,
13430 }, {
13431 .eraseblocks = { {512 * 1024, 1} },
13432 .block_erase = spi_block_erase_60,
13433 }, {
13434 .eraseblocks = { {512 * 1024, 1} },
13435 .block_erase = spi_block_erase_c7,
13436 },
13437 },
13438 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13439 .unlock = spi_disable_blockprotect_bp2_srwd,
13440 .write = spi_chip_write_256,
13441 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13442 .voltage = {1650, 1950},
13443 },
13444
13445 {
13446 .vendor = "SST",
13447 .name = "SST25WF080B",
13448 .bustype = BUS_SPI,
13449 .manufacture_id = SANYO_ID, /* See flashchips.h */
13450 .model_id = SST_SST25WF080B,
13451 .total_size = 1024,
13452 .page_size = 256,
13453 .feature_bits = FEATURE_WRSR_WREN,
13454 .tested = TEST_OK_PREW,
13455 .probe = probe_spi_rdid,
13456 .probe_timing = TIMING_ZERO,
13457 .block_erasers =
13458 {
13459 {
13460 .eraseblocks = { {4 * 1024, 256} },
13461 .block_erase = spi_block_erase_20,
13462 }, {
13463 .eraseblocks = { {64 * 1024, 16} },
13464 .block_erase = spi_block_erase_d8,
13465 }, {
13466 .eraseblocks = { {1024 * 1024, 1} },
13467 .block_erase = spi_block_erase_60,
13468 }, {
13469 .eraseblocks = { {1024 * 1024, 1} },
13470 .block_erase = spi_block_erase_c7,
13471 },
13472 },
13473 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13474 .unlock = spi_disable_blockprotect_bp2_srwd,
13475 .write = spi_chip_write_256,
13476 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13477 .voltage = {1650, 1950},
13478 },
13479
13480 {
13481 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013482 .name = "SST25VF080B",
13483 .bustype = BUS_SPI,
13484 .manufacture_id = SST_ID,
13485 .model_id = SST_SST25VF080B,
13486 .total_size = 1024,
13487 .page_size = 256,
13488 .feature_bits = FEATURE_WRSR_EWSR,
13489 .tested = TEST_OK_PREW,
13490 .probe = probe_spi_rdid,
13491 .probe_timing = TIMING_ZERO,
13492 .block_erasers =
13493 {
13494 {
13495 .eraseblocks = { {4 * 1024, 256} },
13496 .block_erase = spi_block_erase_20,
13497 }, {
13498 .eraseblocks = { {32 * 1024, 32} },
13499 .block_erase = spi_block_erase_52,
13500 }, {
13501 .eraseblocks = { {64 * 1024, 16} },
13502 .block_erase = spi_block_erase_d8,
13503 }, {
13504 .eraseblocks = { {1024 * 1024, 1} },
13505 .block_erase = spi_block_erase_60,
13506 }, {
13507 .eraseblocks = { {1024 * 1024, 1} },
13508 .block_erase = spi_block_erase_c7,
13509 },
13510 },
13511 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13512 .unlock = spi_disable_blockprotect,
13513 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000013514 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013515 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000013516 },
13517
13518 {
13519 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013520 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013521 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013522 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013523 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013524 .total_size = 2048,
13525 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013526 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000013527 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013528 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013529 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013530 .block_erasers =
13531 {
13532 {
13533 .eraseblocks = { {4 * 1024, 512} },
13534 .block_erase = spi_block_erase_20,
13535 }, {
13536 .eraseblocks = { {32 * 1024, 64} },
13537 .block_erase = spi_block_erase_52,
13538 }, {
13539 .eraseblocks = { {64 * 1024, 32} },
13540 .block_erase = spi_block_erase_d8,
13541 }, {
13542 .eraseblocks = { {2 * 1024 * 1024, 1} },
13543 .block_erase = spi_block_erase_60,
13544 }, {
13545 .eraseblocks = { {2 * 1024 * 1024, 1} },
13546 .block_erase = spi_block_erase_c7,
13547 },
13548 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013549 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013550 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000013551 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013552 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013553 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013554 },
13555
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013556 {
13557 .vendor = "SST",
13558 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013559 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013560 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013561 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013562 .total_size = 4096,
13563 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013564 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000013565 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013566 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013567 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013568 .block_erasers =
13569 {
13570 {
13571 .eraseblocks = { {4 * 1024, 1024} },
13572 .block_erase = spi_block_erase_20,
13573 }, {
13574 .eraseblocks = { {32 * 1024, 128} },
13575 .block_erase = spi_block_erase_52,
13576 }, {
13577 .eraseblocks = { {64 * 1024, 64} },
13578 .block_erase = spi_block_erase_d8,
13579 }, {
13580 .eraseblocks = { {4 * 1024 * 1024, 1} },
13581 .block_erase = spi_block_erase_60,
13582 }, {
13583 .eraseblocks = { {4 * 1024 * 1024, 1} },
13584 .block_erase = spi_block_erase_c7,
13585 },
13586 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013587 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013588 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000013589 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013590 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013591 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013592 },
13593
13594 {
13595 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013596 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013597 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013598 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013599 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013600 .total_size = 8192,
13601 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013602 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000013603 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013604 .probe = probe_spi_rdid,
13605 .probe_timing = TIMING_ZERO,
13606 .block_erasers =
13607 {
13608 {
13609 .eraseblocks = { {4 * 1024, 2048} },
13610 .block_erase = spi_block_erase_20,
13611 }, {
13612 .eraseblocks = { {32 * 1024, 256} },
13613 .block_erase = spi_block_erase_52,
13614 }, {
13615 .eraseblocks = { {64 * 1024, 128} },
13616 .block_erase = spi_block_erase_d8,
13617 }, {
13618 .eraseblocks = { {8 * 1024 * 1024, 1} },
13619 .block_erase = spi_block_erase_60,
13620 }, {
13621 .eraseblocks = { {8 * 1024 * 1024, 1} },
13622 .block_erase = spi_block_erase_c7,
13623 },
13624 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013625 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013626 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000013627 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013628 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013629 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013630 },
13631
13632 {
13633 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070013634 .name = "SST26VF016B(A)",
13635 .bustype = BUS_SPI,
13636 .manufacture_id = SST_ID,
13637 .model_id = SST_SST26VF016B,
13638 .total_size = 2048,
13639 .page_size = 256,
13640 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13641 .tested = TEST_OK_PREW,
13642 .probe = probe_spi_rdid,
13643 .probe_timing = TIMING_ZERO,
13644 .block_erasers =
13645 {
13646 {
13647 .eraseblocks = { {4 * 1024, 512} },
13648 .block_erase = spi_block_erase_20,
13649 }, {
13650 .eraseblocks = {
13651 {8 * 1024, 4},
13652 {32 * 1024, 1},
13653 {64 * 1024, 30},
13654 {32 * 1024, 1},
13655 {8 * 1024, 4},
13656 },
13657 .block_erase = spi_block_erase_d8,
13658 }, {
13659 .eraseblocks = { {2 * 1024 * 1024, 1} },
13660 .block_erase = spi_block_erase_c7,
13661 },
13662 },
13663 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13664 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13665 .write = spi_chip_write_256, /* Multi I/O supported */
13666 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13667 .voltage = {2700, 3600},
13668 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100013669
Wei Hu25584de2018-04-30 14:02:08 -070013670 {
13671 .vendor = "SST",
13672 .name = "SST26VF032B(A)",
13673 .bustype = BUS_SPI,
13674 .manufacture_id = SST_ID,
13675 .model_id = SST_SST26VF032B,
13676 .total_size = 4096,
13677 .page_size = 256,
13678 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13679 .tested = TEST_UNTESTED,
13680 .probe = probe_spi_rdid,
13681 .probe_timing = TIMING_ZERO,
13682 .block_erasers =
13683 {
13684 {
13685 .eraseblocks = { {4 * 1024, 1024} },
13686 .block_erase = spi_block_erase_20,
13687 }, {
13688 .eraseblocks = {
13689 {8 * 1024, 4},
13690 {32 * 1024, 1},
13691 {64 * 1024, 62},
13692 {32 * 1024, 1},
13693 {8 * 1024, 4},
13694 },
13695 .block_erase = spi_block_erase_d8,
13696 }, {
13697 .eraseblocks = { {4 * 1024 * 1024, 1} },
13698 .block_erase = spi_block_erase_c7,
13699 },
13700 },
13701 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13702 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13703 .write = spi_chip_write_256, /* Multi I/O supported */
13704 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13705 .voltage = {2700, 3600},
13706 },
13707
Wei Hu25584de2018-04-30 14:02:08 -070013708 {
13709 .vendor = "SST",
13710 .name = "SST26VF064B(A)",
13711 .bustype = BUS_SPI,
13712 .manufacture_id = SST_ID,
13713 .model_id = SST_SST26VF064B,
13714 .total_size = 8192,
13715 .page_size = 256,
13716 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13717 .tested = TEST_OK_PREW,
13718 .probe = probe_spi_rdid,
13719 .probe_timing = TIMING_ZERO,
13720 .block_erasers =
13721 {
13722 {
13723 .eraseblocks = { {4 * 1024, 2048} },
13724 .block_erase = spi_block_erase_20,
13725 }, {
13726 .eraseblocks = {
13727 {8 * 1024, 4},
13728 {32 * 1024, 1},
13729 {64 * 1024, 126},
13730 {32 * 1024, 1},
13731 {8 * 1024, 4},
13732 },
13733 .block_erase = spi_block_erase_d8,
13734 }, {
13735 .eraseblocks = { {8 * 1024 * 1024, 1} },
13736 .block_erase = spi_block_erase_c7,
13737 },
13738 },
13739 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13740 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13741 .write = spi_chip_write_256, /* Multi I/O supported */
13742 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13743 .voltage = {2700, 3600},
13744 },
13745
13746 {
13747 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000013748 .name = "SST25WF512",
13749 .bustype = BUS_SPI,
13750 .manufacture_id = SST_ID,
13751 .model_id = SST_SST25WF512,
13752 .total_size = 64,
13753 .page_size = 256,
13754 .feature_bits = FEATURE_WRSR_EITHER,
13755 .tested = TEST_UNTESTED,
13756 .probe = probe_spi_rdid,
13757 .probe_timing = TIMING_ZERO,
13758 .block_erasers =
13759 {
13760 {
13761 .eraseblocks = { {4 * 1024, 16} },
13762 .block_erase = spi_block_erase_20,
13763 }, {
13764 .eraseblocks = { {32 * 1024, 2} },
13765 .block_erase = spi_block_erase_52,
13766 }, {
13767 .eraseblocks = { {1024 * 64, 1} },
13768 .block_erase = spi_block_erase_60,
13769 }, {
13770 .eraseblocks = { {1024 * 64, 1} },
13771 .block_erase = spi_block_erase_c7,
13772 },
13773 },
Jason Harper43ddef02014-05-04 00:55:24 +000013774 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13775 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013776 .write = spi_aai_write,
13777 .read = spi_chip_read, /* Fast read (0x0B) supported */
13778 .voltage = {1650, 1950},
13779 },
13780
13781 {
13782 .vendor = "SST",
13783 .name = "SST25WF010",
13784 .bustype = BUS_SPI,
13785 .manufacture_id = SST_ID,
13786 .model_id = SST_SST25WF010,
13787 .total_size = 128,
13788 .page_size = 256,
13789 .feature_bits = FEATURE_WRSR_EITHER,
13790 .tested = TEST_UNTESTED,
13791 .probe = probe_spi_rdid,
13792 .probe_timing = TIMING_ZERO,
13793 .block_erasers =
13794 {
13795 {
13796 .eraseblocks = { {4 * 1024, 32} },
13797 .block_erase = spi_block_erase_20,
13798 }, {
13799 .eraseblocks = { {32 * 1024, 4} },
13800 .block_erase = spi_block_erase_52,
13801 }, {
13802 .eraseblocks = { {1024 * 128, 1} },
13803 .block_erase = spi_block_erase_60,
13804 }, {
13805 .eraseblocks = { {1024 * 128, 1} },
13806 .block_erase = spi_block_erase_c7,
13807 },
13808 },
Jason Harper43ddef02014-05-04 00:55:24 +000013809 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13810 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013811 .write = spi_aai_write,
13812 .read = spi_chip_read, /* Fast read (0x0B) supported */
13813 .voltage = {1650, 1950},
13814 },
13815
13816 {
13817 .vendor = "SST",
13818 .name = "SST25WF020",
13819 .bustype = BUS_SPI,
13820 .manufacture_id = SST_ID,
13821 .model_id = SST_SST25WF020,
13822 .total_size = 256,
13823 .page_size = 256,
13824 .feature_bits = FEATURE_WRSR_EITHER,
13825 .tested = TEST_UNTESTED,
13826 .probe = probe_spi_rdid,
13827 .probe_timing = TIMING_ZERO,
13828 .block_erasers =
13829 {
13830 {
13831 .eraseblocks = { {4 * 1024, 64} },
13832 .block_erase = spi_block_erase_20,
13833 }, {
13834 .eraseblocks = { {32 * 1024, 8} },
13835 .block_erase = spi_block_erase_52,
13836 }, {
13837 .eraseblocks = { {64 * 1024, 4} },
13838 .block_erase = spi_block_erase_d8,
13839 }, {
13840 .eraseblocks = { {1024 * 256, 1} },
13841 .block_erase = spi_block_erase_60,
13842 }, {
13843 .eraseblocks = { {1024 * 256, 1} },
13844 .block_erase = spi_block_erase_c7,
13845 },
13846 },
Jason Harper43ddef02014-05-04 00:55:24 +000013847 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13848 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013849 .write = spi_aai_write,
13850 .read = spi_chip_read, /* Fast read (0x0B) supported */
13851 .voltage = {1650, 1950},
13852 },
13853
13854 {
13855 .vendor = "SST",
13856 .name = "SST25WF040",
13857 .bustype = BUS_SPI,
13858 .manufacture_id = SST_ID,
13859 .model_id = SST_SST25WF040,
13860 .total_size = 512,
13861 .page_size = 256,
13862 .feature_bits = FEATURE_WRSR_EITHER,
13863 .tested = TEST_UNTESTED,
13864 .probe = probe_spi_rdid,
13865 .probe_timing = TIMING_ZERO,
13866 .block_erasers =
13867 {
13868 {
13869 .eraseblocks = { {4 * 1024, 128} },
13870 .block_erase = spi_block_erase_20,
13871 }, {
13872 .eraseblocks = { {32 * 1024, 16} },
13873 .block_erase = spi_block_erase_52,
13874 }, {
13875 .eraseblocks = { {64 * 1024, 8} },
13876 .block_erase = spi_block_erase_d8,
13877 }, {
13878 .eraseblocks = { {1024 * 512, 1} },
13879 .block_erase = spi_block_erase_60,
13880 }, {
13881 .eraseblocks = { {1024 * 512, 1} },
13882 .block_erase = spi_block_erase_c7,
13883 },
13884 },
Jason Harper43ddef02014-05-04 00:55:24 +000013885 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13886 .unlock = spi_disable_blockprotect_bp2_srwd,
13887 .write = spi_aai_write,
13888 .read = spi_chip_read, /* Fast read (0x0B) supported */
13889 .voltage = {1650, 1950},
13890 },
13891
13892 {
13893 .vendor = "SST",
13894 .name = "SST25WF080",
13895 .bustype = BUS_SPI,
13896 .manufacture_id = SST_ID,
13897 .model_id = SST_SST25WF080,
13898 .total_size = 1024,
13899 .page_size = 256,
13900 .feature_bits = FEATURE_WRSR_EITHER,
13901 .tested = TEST_OK_PREW,
13902 .probe = probe_spi_rdid,
13903 .probe_timing = TIMING_ZERO,
13904 .block_erasers =
13905 {
13906 {
13907 .eraseblocks = { {4 * 1024, 256} },
13908 .block_erase = spi_block_erase_20,
13909 }, {
13910 .eraseblocks = { {32 * 1024, 32} },
13911 .block_erase = spi_block_erase_52,
13912 }, {
13913 .eraseblocks = { {64 * 1024, 16} },
13914 .block_erase = spi_block_erase_d8,
13915 }, {
13916 .eraseblocks = { {1024 * 1024, 1} },
13917 .block_erase = spi_block_erase_60,
13918 }, {
13919 .eraseblocks = { {1024 * 1024, 1} },
13920 .block_erase = spi_block_erase_c7,
13921 },
13922 },
13923 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13924 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013925 .write = spi_aai_write,
13926 .read = spi_chip_read, /* Fast read (0x0B) supported */
13927 .voltage = {1650, 1950},
13928 },
13929
13930 {
13931 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013932 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013933 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013934 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013935 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013936 .total_size = 512,
13937 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013938 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013939 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013940 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013941 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013942 .block_erasers =
13943 {
13944 {
13945 .eraseblocks = { {128, 4096} },
13946 .block_erase = erase_sector_28sf040,
13947 }, {
13948 .eraseblocks = { {512 * 1024, 1} },
13949 .block_erase = erase_chip_28sf040,
13950 }
13951 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013952 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013953 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013954 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013955 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013956 },
13957
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013958 {
13959 .vendor = "SST",
13960 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013961 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013962 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013963 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013964 .total_size = 128,
13965 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013966 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013967 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013968 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013969 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013970 .block_erasers =
13971 {
13972 {
13973 .eraseblocks = { {128 * 1024, 1} },
13974 .block_erase = erase_chip_block_jedec,
13975 }
13976 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013977 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013978 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013979 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013980 },
13981
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013982 {
13983 .vendor = "SST",
13984 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013985 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013986 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013987 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013988 .total_size = 128,
13989 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013990 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013991 .tested = TEST_UNTESTED,
13992 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013993 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013994 .block_erasers =
13995 {
13996 {
13997 .eraseblocks = { {128 * 1024, 1} },
13998 .block_erase = erase_chip_block_jedec,
13999 }
14000 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014001 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014002 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014003 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014004 },
14005
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014006 {
14007 .vendor = "SST",
14008 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014009 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014010 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014011 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014012 .total_size = 256,
14013 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014014 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014015 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014016 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014017 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014018 .block_erasers =
14019 {
14020 {
14021 .eraseblocks = { {256 * 1024, 1} },
14022 .block_erase = erase_chip_block_jedec,
14023 }
14024 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014025 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014026 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014027 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014028 },
14029
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014030 {
14031 .vendor = "SST",
14032 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014033 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014034 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014035 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014036 .total_size = 256,
14037 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014038 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014039 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014040 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014041 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014042 .block_erasers =
14043 {
14044 {
14045 .eraseblocks = { {256 * 1024, 1} },
14046 .block_erase = erase_chip_block_jedec,
14047 }
14048 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014049 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014050 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014051 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014052 },
14053
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014054 {
14055 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000014056 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014057 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014058 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014059 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014060 .total_size = 64,
14061 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014062 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000014063 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014064 .probe = probe_jedec,
14065 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000014066 .block_erasers =
14067 {
14068 {
14069 .eraseblocks = { {4 * 1024, 16} },
14070 .block_erase = erase_sector_jedec,
14071 }, {
14072 .eraseblocks = { {64 * 1024, 1} },
14073 .block_erase = erase_chip_block_jedec,
14074 }
14075 },
Sean Nelson35727f72010-01-28 23:55:12 +000014076 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000014077 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014078 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000014079 },
14080
14081 {
14082 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014083 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014084 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014085 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014086 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014087 .total_size = 128,
14088 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014089 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014090 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014091 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014092 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014093 .block_erasers =
14094 {
14095 {
14096 .eraseblocks = { {4 * 1024, 32} },
14097 .block_erase = erase_sector_jedec,
14098 }, {
14099 .eraseblocks = { {128 * 1024, 1} },
14100 .block_erase = erase_chip_block_jedec,
14101 }
14102 },
Sean Nelson35727f72010-01-28 23:55:12 +000014103 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014104 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014105 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014106 },
14107
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014108 {
14109 .vendor = "SST",
14110 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014111 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014112 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014113 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014114 .total_size = 256,
14115 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014116 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000014117 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014118 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014119 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014120 .block_erasers =
14121 {
14122 {
14123 .eraseblocks = { {4 * 1024, 64} },
14124 .block_erase = erase_sector_jedec,
14125 }, {
14126 .eraseblocks = { {256 * 1024, 1} },
14127 .block_erase = erase_chip_block_jedec,
14128 }
14129 },
Sean Nelson35727f72010-01-28 23:55:12 +000014130 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014131 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014132 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014133 },
14134
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014135 {
14136 .vendor = "SST",
14137 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014138 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014139 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014140 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014141 .total_size = 512,
14142 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014143 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000014144 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014145 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014146 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014147 .block_erasers =
14148 {
14149 {
14150 .eraseblocks = { {4 * 1024, 128} },
14151 .block_erase = erase_sector_jedec,
14152 }, {
14153 .eraseblocks = { {512 * 1024, 1} },
14154 .block_erase = erase_chip_block_jedec,
14155 }
14156 },
Sean Nelson35727f72010-01-28 23:55:12 +000014157 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014158 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014159 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014160 },
14161
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014162 {
14163 .vendor = "SST",
14164 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014165 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014166 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014167 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014168 .total_size = 64,
14169 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014170 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000014171 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014172 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014173 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014174 .block_erasers =
14175 {
14176 {
14177 .eraseblocks = { {4 * 1024, 16} },
14178 .block_erase = erase_sector_jedec,
14179 }, {
14180 .eraseblocks = { {64 * 1024, 1} },
14181 .block_erase = erase_chip_block_jedec,
14182 }
14183 },
Sean Nelson35727f72010-01-28 23:55:12 +000014184 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014185 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014186 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014187 },
14188
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014189 {
14190 .vendor = "SST",
14191 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014192 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014193 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014194 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014195 .total_size = 128,
14196 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014197 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000014198 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014199 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014200 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014201 .block_erasers =
14202 {
14203 {
14204 .eraseblocks = { {4 * 1024, 32} },
14205 .block_erase = erase_sector_jedec,
14206 }, {
14207 .eraseblocks = { {128 * 1024, 1} },
14208 .block_erase = erase_chip_block_jedec,
14209 }
14210 },
Sean Nelson35727f72010-01-28 23:55:12 +000014211 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014212 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014213 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014214 },
14215
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014216 {
14217 .vendor = "SST",
14218 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014219 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014220 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014221 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014222 .total_size = 256,
14223 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014224 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014225 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014226 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014227 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014228 .block_erasers =
14229 {
14230 {
14231 .eraseblocks = { {4 * 1024, 64} },
14232 .block_erase = erase_sector_jedec,
14233 }, {
14234 .eraseblocks = { {256 * 1024, 1} },
14235 .block_erase = erase_chip_block_jedec,
14236 }
14237 },
Sean Nelson35727f72010-01-28 23:55:12 +000014238 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014239 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014240 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014241 },
14242
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014243 {
14244 .vendor = "SST",
14245 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014246 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014247 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014248 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014249 .total_size = 512,
14250 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014251 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014252 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014253 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014254 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014255 .block_erasers =
14256 {
14257 {
14258 .eraseblocks = { {4 * 1024, 128} },
14259 .block_erase = erase_sector_jedec,
14260 }, {
14261 .eraseblocks = { {512 * 1024, 1} },
14262 .block_erase = erase_chip_block_jedec,
14263 }
14264 },
Sean Nelson35727f72010-01-28 23:55:12 +000014265 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014266 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014267 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000014268 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014269
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014270 {
14271 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000014272 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014273 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014274 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014275 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000014276 .total_size = 1024,
14277 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014278 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000014279 .tested = TEST_UNTESTED,
14280 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014281 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014282 .block_erasers =
14283 {
14284 {
14285 .eraseblocks = { {4 * 1024, 256} },
14286 .block_erase = erase_sector_jedec,
14287 }, {
14288 .eraseblocks = { {64 * 1024, 16} },
14289 .block_erase = erase_block_jedec,
14290 }, {
14291 .eraseblocks = { {1024 * 1024, 1} },
14292 .block_erase = erase_chip_block_jedec,
14293 }
14294 },
Sean Nelson35727f72010-01-28 23:55:12 +000014295 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014296 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014297 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000014298 },
14299
14300 {
14301 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014302 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014303 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014304 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014305 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014306 .total_size = 256,
14307 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014308 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014309 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014310 .probe = probe_jedec,
14311 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014312 .block_erasers =
14313 {
14314 {
14315 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014316 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014317 }, {
14318 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014319 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014320 }, {
14321 .eraseblocks = { {256 * 1024, 1} },
14322 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14323 }
14324 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014325 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014326 .unlock = unlock_sst_fwhub,
14327 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014328 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014329 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014330 },
14331
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014332 {
14333 .vendor = "SST",
14334 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014335 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014336 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014337 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014338 .total_size = 384,
14339 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014340 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014341 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014342 .probe = probe_jedec,
14343 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014344 .block_erasers =
14345 {
14346 {
14347 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014348 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014349 }, {
14350 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014351 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014352 }, {
14353 .eraseblocks = { {384 * 1024, 1} },
14354 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14355 }
14356 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014357 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014358 .unlock = unlock_sst_fwhub,
14359 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014360 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014361 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014362 },
14363
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014364 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014365 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14366 * and is only honored for 64k block erase, but not 4k sector erase.
14367 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014368 .vendor = "SST",
14369 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014370 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014371 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014372 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014373 .total_size = 512,
14374 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014375 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014376 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014377 .probe = probe_jedec,
14378 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014379 .block_erasers =
14380 {
14381 {
14382 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014383 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014384 }, {
14385 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014386 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014387 }, {
14388 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000014389 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014390 },
14391 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014392 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014393 .unlock = unlock_sst_fwhub,
14394 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014395 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014396 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014397 },
14398
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014399 {
14400 .vendor = "SST",
14401 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014402 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014403 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014404 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014405 .total_size = 512,
14406 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014407 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014408 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014409 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014410 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014411 .block_erasers =
14412 {
14413 {
14414 .eraseblocks = { {4 * 1024, 128} },
14415 .block_erase = erase_sector_49lfxxxc,
14416 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014417 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014418 {64 * 1024, 7},
14419 {32 * 1024, 1},
14420 {8 * 1024, 2},
14421 {16 * 1024, 1},
14422 },
Sean Nelson69e58112010-03-23 17:10:28 +000014423 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014424 }
14425 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014426 .printlock = printlock_regspace2_block_eraser_1,
14427 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014428 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014429 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014430 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014431 },
14432
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014433 {
14434 .vendor = "SST",
14435 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014436 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014437 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014438 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014439 .total_size = 1024,
14440 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014441 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014442 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014443 .probe = probe_jedec,
14444 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014445 .block_erasers =
14446 {
14447 {
14448 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014449 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014450 }, {
14451 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014452 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014453 }, {
14454 .eraseblocks = { {1024 * 1024, 1} },
14455 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14456 }
14457 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014458 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014459 .unlock = unlock_sst_fwhub,
14460 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014461 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014462 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014463 },
14464
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014465 {
14466 .vendor = "SST",
14467 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014468 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014469 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014470 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014471 .total_size = 1024,
14472 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014473 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014474 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014475 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014476 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014477 .block_erasers =
14478 {
14479 {
14480 .eraseblocks = { {4 * 1024, 256} },
14481 .block_erase = erase_sector_49lfxxxc,
14482 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014483 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014484 {64 * 1024, 15},
14485 {32 * 1024, 1},
14486 {8 * 1024, 2},
14487 {16 * 1024, 1},
14488 },
Sean Nelson69e58112010-03-23 17:10:28 +000014489 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014490 }
14491 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014492 .printlock = printlock_regspace2_block_eraser_1,
14493 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014494 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014495 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014496 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014497 },
14498
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014499 {
14500 .vendor = "SST",
14501 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014502 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014503 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014504 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014505 .total_size = 2048,
14506 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014507 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014508 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014509 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014510 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014511 .block_erasers =
14512 {
14513 {
14514 .eraseblocks = { {4 * 1024, 512} },
14515 .block_erase = erase_sector_49lfxxxc,
14516 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014517 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014518 {64 * 1024, 31},
14519 {32 * 1024, 1},
14520 {8 * 1024, 2},
14521 {16 * 1024, 1},
14522 },
Sean Nelson69e58112010-03-23 17:10:28 +000014523 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014524 }
14525 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014526 .printlock = printlock_regspace2_block_eraser_1,
14527 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014528 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014529 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014530 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014531 },
14532
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014533 {
14534 .vendor = "SST",
14535 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014536 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014537 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014538 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014539 .total_size = 256,
14540 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014541 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000014542 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014543 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014544 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014545 .block_erasers =
14546 {
14547 {
14548 .eraseblocks = { {4 * 1024, 64} },
14549 .block_erase = erase_sector_jedec,
14550 }, {
14551 .eraseblocks = { {16 * 1024, 16} },
14552 .block_erase = erase_block_jedec,
14553 }, {
14554 .eraseblocks = { {256 * 1024, 1} },
14555 .block_erase = NULL,
14556 }
14557 },
Sean Nelson35727f72010-01-28 23:55:12 +000014558 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014559 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014560 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000014561 },
14562
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014563 {
14564 .vendor = "SST",
14565 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014566 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014567 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014568 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014569 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000014570 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014571 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014572 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014573 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014574 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014575 .block_erasers =
14576 {
14577 {
14578 .eraseblocks = { {4 * 1024, 64} },
14579 .block_erase = erase_sector_jedec,
14580 }, {
14581 .eraseblocks = { {16 * 1024, 16} },
14582 .block_erase = erase_block_jedec,
14583 }, {
14584 .eraseblocks = { {256 * 1024, 1} },
14585 .block_erase = NULL,
14586 }
14587 },
Sean Nelson35727f72010-01-28 23:55:12 +000014588 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014589 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014590 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014591 },
14592
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014593 {
14594 .vendor = "SST",
14595 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014596 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014597 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014598 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014599 .total_size = 512,
14600 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014601 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014602 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014603 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014604 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014605 .block_erasers =
14606 {
14607 {
14608 .eraseblocks = { {4 * 1024, 128} },
14609 .block_erase = erase_sector_jedec,
14610 }, {
14611 .eraseblocks = { {64 * 1024, 8} },
14612 .block_erase = erase_block_jedec,
14613 }, {
14614 .eraseblocks = { {512 * 1024, 1} },
14615 .block_erase = NULL,
14616 }
14617 },
Sean Nelson35727f72010-01-28 23:55:12 +000014618 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014619 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014620 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014621 },
14622
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014623 {
14624 .vendor = "SST",
14625 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014626 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014627 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014628 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014629 .total_size = 512,
14630 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000014631 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014632 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014633 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014634 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014635 .block_erasers =
14636 {
14637 {
14638 .eraseblocks = { {4 * 1024, 128} },
14639 .block_erase = erase_sector_jedec,
14640 }, {
14641 .eraseblocks = { {64 * 1024, 8} },
14642 .block_erase = erase_block_jedec,
14643 }, {
14644 .eraseblocks = { {512 * 1024, 1} },
14645 .block_erase = NULL,
14646 }
14647 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014648 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014649 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014650 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014651 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014652 },
14653
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014654 {
14655 .vendor = "SST",
14656 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014657 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014658 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020014659 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014660 .total_size = 1024,
14661 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014662 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000014663 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014664 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014665 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014666 .block_erasers =
14667 {
14668 {
14669 .eraseblocks = { {4 * 1024, 256} },
14670 .block_erase = erase_sector_jedec,
14671 }, {
14672 .eraseblocks = { {64 * 1024, 16} },
14673 .block_erase = erase_block_jedec,
14674 }, {
14675 .eraseblocks = { {1024 * 1024, 1} },
14676 .block_erase = NULL,
14677 }
14678 },
Sean Nelson35727f72010-01-28 23:55:12 +000014679 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014680 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014681 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014682 },
14683
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014684 {
14685 .vendor = "SST",
14686 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014687 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014688 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014689 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014690 .total_size = 2048,
14691 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014692 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014693 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014694 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014695 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014696 .block_erasers =
14697 {
14698 {
14699 .eraseblocks = { {4 * 1024, 512} },
14700 .block_erase = erase_sector_49lfxxxc,
14701 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014702 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014703 {64 * 1024, 31},
14704 {32 * 1024, 1},
14705 {8 * 1024, 2},
14706 {16 * 1024, 1},
14707 },
Sean Nelson69e58112010-03-23 17:10:28 +000014708 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014709 }
14710 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014711 .printlock = printlock_regspace2_block_eraser_1,
14712 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014713 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014714 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014715 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014716 },
14717
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014718 {
14719 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014720 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014721 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014722 .manufacture_id = ST_ID,
14723 .model_id = ST_M29F002B,
14724 .total_size = 256,
14725 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014726 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014727 .tested = TEST_UNTESTED,
14728 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014729 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014730 .block_erasers =
14731 {
14732 {
14733 .eraseblocks = {
14734 {16 * 1024, 1},
14735 {8 * 1024, 2},
14736 {32 * 1024, 1},
14737 {64 * 1024, 3},
14738 },
14739 .block_erase = erase_sector_jedec,
14740 }, {
14741 .eraseblocks = { {256 * 1024, 1} },
14742 .block_erase = erase_chip_block_jedec,
14743 }
14744 },
Sean Nelson35727f72010-01-28 23:55:12 +000014745 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014746 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014747 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014748 },
14749
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014750 {
14751 .vendor = "ST",
14752 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014753 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014754 .manufacture_id = ST_ID,
14755 .model_id = ST_M29F002T,
14756 .total_size = 256,
14757 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014758 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014759 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014760 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014761 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014762 .block_erasers =
14763 {
14764 {
14765 .eraseblocks = {
14766 {64 * 1024, 3},
14767 {32 * 1024, 1},
14768 {8 * 1024, 2},
14769 {16 * 1024, 1},
14770 },
14771 .block_erase = erase_sector_jedec,
14772 }, {
14773 .eraseblocks = { {256 * 1024, 1} },
14774 .block_erase = erase_chip_block_jedec,
14775 }
14776 },
Sean Nelson35727f72010-01-28 23:55:12 +000014777 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014778 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014779 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014780 },
14781
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014782 {
14783 .vendor = "ST",
14784 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014785 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014786 .manufacture_id = ST_ID,
14787 .model_id = ST_M29F040B,
14788 .total_size = 512,
14789 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014790 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14791 .tested = TEST_UNTESTED,
14792 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000014793 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000014794 .block_erasers =
14795 {
14796 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014797 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000014798 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014799 }, {
14800 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000014801 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014802 }
14803 },
Sean Nelson35727f72010-01-28 23:55:12 +000014804 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014805 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014806 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014807 },
14808
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014809 {
Sean Nelson35727f72010-01-28 23:55:12 +000014810 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014811 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014812 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014813 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014814 .manufacture_id = ST_ID,
14815 .model_id = ST_M29F400BB,
14816 .total_size = 512,
14817 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014818 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014819 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014820 .probe = probe_jedec,
14821 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014822 .block_erasers =
14823 {
14824 {
14825 .eraseblocks = {
14826 {16 * 1024, 1},
14827 {8 * 1024, 2},
14828 {32 * 1024, 1},
14829 {64 * 1024, 7},
14830 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014831 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014832 }, {
14833 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014834 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014835 }
14836 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014837 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014838 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014839 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014840 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014841
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014842 {
14843 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14844 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014845 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014846 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014847 .manufacture_id = ST_ID,
14848 .model_id = ST_M29F400BT,
14849 .total_size = 512,
14850 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014851 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014852 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014853 .probe = probe_jedec,
14854 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000014855 .block_erasers =
14856 {
14857 {
14858 .eraseblocks = {
14859 {64 * 1024, 7},
14860 {32 * 1024, 1},
14861 {8 * 1024, 2},
14862 {16 * 1024, 1},
14863 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014864 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014865 }, {
14866 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014867 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014868 }
14869 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014870 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014871 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014872 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014873 },
14874
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014875 {
14876 .vendor = "ST",
14877 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014878 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014879 .manufacture_id = ST_ID,
14880 .model_id = ST_M29W010B,
14881 .total_size = 128,
14882 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014883 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014884 .tested = TEST_UNTESTED,
14885 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014886 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014887 .block_erasers =
14888 {
14889 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014890 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014891 .block_erase = erase_sector_jedec,
14892 }, {
14893 .eraseblocks = { {128 * 1024, 1} },
14894 .block_erase = erase_chip_block_jedec,
14895 }
14896 },
Sean Nelson35727f72010-01-28 23:55:12 +000014897 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014898 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014899 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014900 },
14901
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014902 {
14903 .vendor = "ST",
14904 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014905 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014906 .manufacture_id = ST_ID,
14907 .model_id = ST_M29W040B,
14908 .total_size = 512,
14909 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014910 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014911 .tested = TEST_UNTESTED,
14912 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014913 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014914 .block_erasers =
14915 {
14916 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014917 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014918 .block_erase = erase_sector_jedec,
14919 }, {
14920 .eraseblocks = { {512 * 1024, 1} },
14921 .block_erase = erase_chip_block_jedec,
14922 }
14923 },
Sean Nelson35727f72010-01-28 23:55:12 +000014924 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014925 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014926 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014927 },
14928
Stefan Taunereb582572012-09-21 12:52:50 +000014929 {
14930 .vendor = "ST",
14931 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014932 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100014933 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000014934 .model_id = ST_M29W512B,
14935 .total_size = 64,
14936 .page_size = 64 * 1024,
14937 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014938 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000014939 .probe = probe_jedec,
14940 .probe_timing = TIMING_ZERO,
14941 .block_erasers =
14942 {
14943 {
14944 .eraseblocks = { {64 * 1024, 1} },
14945 .block_erase = erase_chip_block_jedec,
14946 }
14947 },
14948 .write = write_jedec_1,
14949 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014950 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000014951 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000014952
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014953 {
14954 .vendor = "ST",
14955 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014956 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014957 .manufacture_id = ST_ID,
14958 .model_id = ST_M50FLW040A,
14959 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014960 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014961 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014962 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014963 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014964 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014965 .block_erasers =
14966 {
14967 {
Sean Nelson329bde72010-01-19 16:39:19 +000014968 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014969 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014970 {64 * 1024, 5}, /* block */
14971 {4 * 1024, 16}, /* sector */
14972 {4 * 1024, 16}, /* sector */
14973 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014974 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014975 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014976 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014977 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014978 }
14979 },
Sean Nelson28accc22010-03-19 18:47:06 +000014980 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014981 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014982 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014983 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014984 },
14985
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014986 {
14987 .vendor = "ST",
14988 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014989 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014990 .manufacture_id = ST_ID,
14991 .model_id = ST_M50FLW040B,
14992 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014993 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014994 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014995 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014996 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014997 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014998 .block_erasers =
14999 {
15000 {
Sean Nelson329bde72010-01-19 16:39:19 +000015001 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015002 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015003 {4 * 1024, 16}, /* sector */
15004 {64 * 1024, 5}, /* block */
15005 {4 * 1024, 16}, /* sector */
15006 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015007 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015008 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015009 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015010 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015011 }
15012 },
Sean Nelson28accc22010-03-19 18:47:06 +000015013 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015014 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015015 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015016 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015017 },
15018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015019 {
15020 .vendor = "ST",
15021 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015022 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015023 .manufacture_id = ST_ID,
15024 .model_id = ST_M50FLW080A,
15025 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015026 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015027 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015028 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015029 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015030 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015031 .block_erasers =
15032 {
15033 {
Sean Nelson329bde72010-01-19 16:39:19 +000015034 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015035 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015036 {64 * 1024, 13}, /* block */
15037 {4 * 1024, 16}, /* sector */
15038 {4 * 1024, 16}, /* sector */
15039 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015040 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015041 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015042 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015043 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015044 }
15045 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015046 .printlock = printlock_regspace2_block_eraser_0,
15047 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015048 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015049 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015050 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015051 },
15052
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015053 {
15054 .vendor = "ST",
15055 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015056 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015057 .manufacture_id = ST_ID,
15058 .model_id = ST_M50FLW080B,
15059 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015060 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015061 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015062 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015063 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015064 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015065 .block_erasers =
15066 {
15067 {
Sean Nelson329bde72010-01-19 16:39:19 +000015068 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015069 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015070 {4 * 1024, 16}, /* sector */
15071 {64 * 1024, 13}, /* block */
15072 {4 * 1024, 16}, /* sector */
15073 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015074 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015075 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015076 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015077 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015078 }
15079 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015080 .printlock = printlock_regspace2_block_eraser_0,
15081 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015082 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015083 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015084 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015085 },
15086
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015087 {
15088 .vendor = "ST",
15089 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015090 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015091 .manufacture_id = ST_ID,
15092 .model_id = ST_M50FW002,
15093 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000015094 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015095 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015096 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015097 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015098 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015099 .block_erasers =
15100 {
15101 {
15102 .eraseblocks = {
15103 {64 * 1024, 3},
15104 {32 * 1024, 1},
15105 {8 * 1024, 2},
15106 {16 * 1024, 1},
15107 },
Sean Nelson28accc22010-03-19 18:47:06 +000015108 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015109 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000015110 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015111 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000015112 }
15113 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015114 .printlock = printlock_regspace2_block_eraser_0,
15115 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015116 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015117 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015118 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015119 },
15120
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015121 {
15122 .vendor = "ST",
15123 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015124 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015125 .manufacture_id = ST_ID,
15126 .model_id = ST_M50FW016,
15127 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015128 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015129 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015130 .tested = TEST_UNTESTED,
15131 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015132 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015133 .block_erasers =
15134 {
15135 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015136 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000015137 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015138 }
15139 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015140 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015141 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015142 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015143 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015144 },
15145
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015146 {
15147 .vendor = "ST",
15148 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015149 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015150 .manufacture_id = ST_ID,
15151 .model_id = ST_M50FW040,
15152 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015153 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015154 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000015155 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015156 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015157 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015158 .block_erasers =
15159 {
15160 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015161 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015162 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015163 }
15164 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015165 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015166 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015167 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015168 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015169 },
15170
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015171 {
15172 .vendor = "ST",
15173 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015174 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015175 .manufacture_id = ST_ID,
15176 .model_id = ST_M50FW080,
15177 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015178 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015179 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015180 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015181 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015182 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015183 .block_erasers =
15184 {
15185 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015186 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015187 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015188 }
15189 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015190 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015191 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015192 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015193 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015194 },
15195
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015196 {
15197 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015198 .name = "M50LPW080",
15199 .bustype = BUS_LPC, /* A/A Mux */
15200 .manufacture_id = ST_ID,
15201 .model_id = ST_M50LPW080,
15202 .total_size = 1024,
15203 .page_size = 0,
15204 .feature_bits = FEATURE_REGISTERMAP,
15205 .tested = TEST_UNTESTED,
15206 .probe = probe_82802ab,
15207 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15208 .block_erasers =
15209 {
15210 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015211 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015212 .block_erase = erase_block_82802ab,
15213 }
15214 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015215 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015216 .write = write_82802ab,
15217 .read = read_memmapped,
15218 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15219 },
15220
15221 {
15222 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015223 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015224 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015225 .manufacture_id = ST_ID,
15226 .model_id = ST_M50LPW116,
15227 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015228 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015229 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015230 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015231 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000015232 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015233 .block_erasers =
15234 {
15235 {
15236 .eraseblocks = {
15237 {4 * 1024, 16},
15238 {64 * 1024, 30},
15239 {32 * 1024, 1},
15240 {8 * 1024, 2},
15241 {16 * 1024, 1},
15242 },
Sean Nelson28accc22010-03-19 18:47:06 +000015243 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015244 }
15245 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015246 .printlock = printlock_regspace2_block_eraser_0,
15247 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015248 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015249 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015250 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015251 },
15252
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015253 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015254 .vendor = "SyncMOS/MoselVitelic",
15255 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015256 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015257 .manufacture_id = SYNCMOS_MVC_ID,
15258 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015259 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015260 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000015261 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015262 .tested = TEST_UNTESTED,
15263 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015264 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015265 .block_erasers =
15266 {
15267 {
15268 .eraseblocks = { {512, 256} },
15269 .block_erase = erase_sector_jedec,
15270 }, {
15271 .eraseblocks = { {128 * 1024, 1} },
15272 .block_erase = erase_chip_block_jedec,
15273 },
15274 },
Sean Nelson35727f72010-01-28 23:55:12 +000015275 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015276 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015277 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015278 },
15279
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015280 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015281 .vendor = "SyncMOS/MoselVitelic",
15282 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015283 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015284 .manufacture_id = SYNCMOS_MVC_ID,
15285 .model_id = SM_MVC_29C51001T,
15286 .total_size = 128,
15287 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000015288 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015289 .tested = TEST_UNTESTED,
15290 .probe = probe_jedec,
15291 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15292 .block_erasers =
15293 {
15294 {
15295 .eraseblocks = { {512, 256} },
15296 .block_erase = erase_sector_jedec,
15297 }, {
15298 .eraseblocks = { {128 * 1024, 1} },
15299 .block_erase = erase_chip_block_jedec,
15300 },
15301 },
15302 .write = write_jedec_1,
15303 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015304 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015305 },
15306
15307 {
15308 .vendor = "SyncMOS/MoselVitelic",
15309 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015310 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015311 .manufacture_id = SYNCMOS_MVC_ID,
15312 .model_id = SM_MVC_29C51002B,
15313 .total_size = 256,
15314 .page_size = 512,
15315 .feature_bits = FEATURE_EITHER_RESET,
15316 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015317 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015318 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015319 .block_erasers =
15320 {
15321 {
15322 .eraseblocks = { {512, 512} },
15323 .block_erase = erase_sector_jedec,
15324 }, {
15325 .eraseblocks = { {256 * 1024, 1} },
15326 .block_erase = erase_chip_block_jedec,
15327 },
15328 },
Sean Nelson35727f72010-01-28 23:55:12 +000015329 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015330 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000015331 },
15332
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015333 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015334 .vendor = "SyncMOS/MoselVitelic",
15335 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015336 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015337 .manufacture_id = SYNCMOS_MVC_ID,
15338 .model_id = SM_MVC_29C51002T,
15339 .total_size = 256,
15340 .page_size = 512,
15341 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015342 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015343 .probe = probe_jedec,
15344 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15345 .block_erasers =
15346 {
15347 {
15348 .eraseblocks = { {512, 512} },
15349 .block_erase = erase_sector_jedec,
15350 }, {
15351 .eraseblocks = { {256 * 1024, 1} },
15352 .block_erase = erase_chip_block_jedec,
15353 },
15354 },
15355 .write = write_jedec_1,
15356 .read = read_memmapped,
15357 },
15358
15359 {
15360 .vendor = "SyncMOS/MoselVitelic",
15361 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015362 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015363 .manufacture_id = SYNCMOS_MVC_ID,
15364 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015365 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015366 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015367 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015368 .tested = TEST_UNTESTED,
15369 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015370 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000015371 .block_erasers =
15372 {
15373 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000015374 .eraseblocks = { {1024, 512} },
15375 .block_erase = erase_sector_jedec,
15376 }, {
15377 .eraseblocks = { {512 * 1024, 1} },
15378 .block_erase = erase_chip_block_jedec,
15379 },
15380 },
15381 .write = write_jedec_1,
15382 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015383 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015384 },
15385
15386 {
15387 .vendor = "SyncMOS/MoselVitelic",
15388 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015389 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015390 .manufacture_id = SYNCMOS_MVC_ID,
15391 .model_id = SM_MVC_29C51004T,
15392 .total_size = 512,
15393 .page_size = 1024,
15394 .feature_bits = FEATURE_EITHER_RESET,
15395 .tested = TEST_UNTESTED,
15396 .probe = probe_jedec,
15397 .probe_timing = TIMING_ZERO,
15398 .block_erasers =
15399 {
15400 {
15401 .eraseblocks = { {1024, 512} },
15402 .block_erase = erase_sector_jedec,
15403 }, {
15404 .eraseblocks = { {512 * 1024, 1} },
15405 .block_erase = erase_chip_block_jedec,
15406 },
15407 },
15408 .write = write_jedec_1,
15409 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015410 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015411 },
15412
15413 {
15414 .vendor = "SyncMOS/MoselVitelic",
15415 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015416 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015417 .manufacture_id = SYNCMOS_MVC_ID,
15418 .model_id = SM_MVC_29C31004B,
15419 .total_size = 512,
15420 .page_size = 1024,
15421 .feature_bits = FEATURE_EITHER_RESET,
15422 .tested = TEST_UNTESTED,
15423 .probe = probe_jedec,
15424 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15425 .block_erasers =
15426 {
15427 {
15428 .eraseblocks = { {1024, 512} },
15429 .block_erase = erase_sector_jedec,
15430 }, {
15431 .eraseblocks = { {512 * 1024, 1} },
15432 .block_erase = erase_chip_block_jedec,
15433 },
15434 },
15435 .write = write_jedec_1,
15436 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015437 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000015438 },
15439
15440 {
15441 .vendor = "SyncMOS/MoselVitelic",
15442 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015443 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000015444 .manufacture_id = SYNCMOS_MVC_ID,
15445 .model_id = SM_MVC_29C31004T,
15446 .total_size = 512,
15447 .page_size = 1024,
15448 .feature_bits = FEATURE_EITHER_RESET,
15449 .tested = TEST_UNTESTED,
15450 .probe = probe_jedec,
15451 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15452 .block_erasers =
15453 {
15454 {
15455 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015456 .block_erase = erase_sector_jedec,
15457 }, {
15458 .eraseblocks = { {512 * 1024, 1} },
15459 .block_erase = erase_chip_block_jedec,
15460 },
15461 },
Sean Nelson35727f72010-01-28 23:55:12 +000015462 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015463 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015464 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015465 },
15466
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015467 {
Uwe Hermanna106d152009-05-27 23:17:40 +000015468 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015469 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015470 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015471 .manufacture_id = TI_OLD_ID,
15472 .model_id = TI_TMS29F002RB,
15473 .total_size = 256,
15474 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000015475 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015476 .tested = TEST_UNTESTED,
15477 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015478 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015479 .block_erasers =
15480 {
15481 {
15482 .eraseblocks = {
15483 {16 * 1024, 1},
15484 {8 * 1024, 2},
15485 {32 * 1024, 1},
15486 {64 * 1024, 3},
15487 },
15488 .block_erase = erase_sector_jedec,
15489 }, {
15490 .eraseblocks = { {256 * 1024, 1} },
15491 .block_erase = erase_chip_block_jedec,
15492 },
15493 },
Sean Nelson35727f72010-01-28 23:55:12 +000015494 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015495 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015496 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015497 },
15498
15499 {
Uwe Hermanna106d152009-05-27 23:17:40 +000015500 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015501 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015502 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015503 .manufacture_id = TI_OLD_ID,
15504 .model_id = TI_TMS29F002RT,
15505 .total_size = 256,
15506 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000015507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015508 .tested = TEST_UNTESTED,
15509 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015510 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015511 .block_erasers =
15512 {
15513 {
15514 .eraseblocks = {
15515 {64 * 1024, 3},
15516 {32 * 1024, 1},
15517 {8 * 1024, 2},
15518 {16 * 1024, 1},
15519 },
15520 .block_erase = erase_sector_jedec,
15521 }, {
15522 .eraseblocks = { {256 * 1024, 1} },
15523 .block_erase = erase_chip_block_jedec,
15524 },
15525 },
Sean Nelson35727f72010-01-28 23:55:12 +000015526 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015527 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015528 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000015529 },
15530
15531 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015532 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000015533 .name = "W25Q40.V",
15534 .bustype = BUS_SPI,
15535 .manufacture_id = WINBOND_NEX_ID,
15536 .model_id = WINBOND_NEX_W25Q40_V,
15537 .total_size = 512,
15538 .page_size = 256,
15539 /* supports SFDP */
15540 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15541 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +000015542 .tested = TEST_OK_PREW,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000015543 .probe = probe_spi_rdid,
15544 .probe_timing = TIMING_ZERO,
15545 .block_erasers =
15546 {
15547 {
15548 .eraseblocks = { {4 * 1024, 128} },
15549 .block_erase = spi_block_erase_20,
15550 }, {
15551 .eraseblocks = { {32 * 1024, 16} },
15552 .block_erase = spi_block_erase_52,
15553 }, {
15554 .eraseblocks = { {64 * 1024, 8} },
15555 .block_erase = spi_block_erase_d8,
15556 }, {
15557 .eraseblocks = { {512 * 1024, 1} },
15558 .block_erase = spi_block_erase_60,
15559 }, {
15560 .eraseblocks = { {512 * 1024, 1} },
15561 .block_erase = spi_block_erase_c7,
15562 }
15563 },
15564 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15565 .unlock = spi_disable_blockprotect,
15566 .write = spi_chip_write_256, /* Multi I/O supported */
15567 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15568 .voltage = {2700, 3600},
15569 },
15570
15571 {
15572 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015573 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015574 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015575 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015576 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015577 .total_size = 1024,
15578 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015579 /* supports SFDP */
15580 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015581 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015582 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015583 .probe = probe_spi_rdid,
15584 .probe_timing = TIMING_ZERO,
15585 .block_erasers =
15586 {
15587 {
15588 .eraseblocks = { {4 * 1024, 256} },
15589 .block_erase = spi_block_erase_20,
15590 }, {
15591 .eraseblocks = { {32 * 1024, 32} },
15592 .block_erase = spi_block_erase_52,
15593 }, {
15594 .eraseblocks = { {64 * 1024, 16} },
15595 .block_erase = spi_block_erase_d8,
15596 }, {
15597 .eraseblocks = { {1024 * 1024, 1} },
15598 .block_erase = spi_block_erase_60,
15599 }, {
15600 .eraseblocks = { {1024 * 1024, 1} },
15601 .block_erase = spi_block_erase_c7,
15602 }
15603 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015604 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015605 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015606 .write = spi_chip_write_256,
15607 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015608 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015609 },
15610
15611 {
15612 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015613 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015614 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015615 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015616 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015617 .total_size = 2048,
15618 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015619 /* supports SFDP */
15620 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015621 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000015622 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015623 .probe = probe_spi_rdid,
15624 .probe_timing = TIMING_ZERO,
15625 .block_erasers =
15626 {
15627 {
15628 .eraseblocks = { {4 * 1024, 512} },
15629 .block_erase = spi_block_erase_20,
15630 }, {
15631 .eraseblocks = { {32 * 1024, 64} },
15632 .block_erase = spi_block_erase_52,
15633 }, {
15634 .eraseblocks = { {64 * 1024, 32} },
15635 .block_erase = spi_block_erase_d8,
15636 }, {
15637 .eraseblocks = { {2 * 1024 * 1024, 1} },
15638 .block_erase = spi_block_erase_60,
15639 }, {
15640 .eraseblocks = { {2 * 1024 * 1024, 1} },
15641 .block_erase = spi_block_erase_c7,
15642 }
15643 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015644 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015645 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015646 .write = spi_chip_write_256,
15647 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015648 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015649 },
15650
15651 {
15652 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015653 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015654 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015655 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015656 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015657 .total_size = 4096,
15658 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015659 /* supports SFDP */
15660 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015661 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015662 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015663 .probe = probe_spi_rdid,
15664 .probe_timing = TIMING_ZERO,
15665 .block_erasers =
15666 {
15667 {
15668 .eraseblocks = { {4 * 1024, 1024} },
15669 .block_erase = spi_block_erase_20,
15670 }, {
15671 .eraseblocks = { {32 * 1024, 128} },
15672 .block_erase = spi_block_erase_52,
15673 }, {
15674 .eraseblocks = { {64 * 1024, 64} },
15675 .block_erase = spi_block_erase_d8,
15676 }, {
15677 .eraseblocks = { {4 * 1024 * 1024, 1} },
15678 .block_erase = spi_block_erase_60,
15679 }, {
15680 .eraseblocks = { {4 * 1024 * 1024, 1} },
15681 .block_erase = spi_block_erase_c7,
15682 }
15683 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015684 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015685 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000015686 .write = spi_chip_write_256,
15687 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015688 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000015689 },
15690
15691 {
15692 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015693 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015694 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000015695 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015696 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000015697 .total_size = 8192,
15698 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015699 /* supports SFDP */
15700 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015701 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000015702 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000015703 .probe = probe_spi_rdid,
15704 .probe_timing = TIMING_ZERO,
15705 .block_erasers =
15706 {
15707 {
15708 .eraseblocks = { {4 * 1024, 2048} },
15709 .block_erase = spi_block_erase_20,
15710 }, {
15711 .eraseblocks = { {32 * 1024, 256} },
15712 .block_erase = spi_block_erase_52,
15713 }, {
15714 .eraseblocks = { {64 * 1024, 128} },
15715 .block_erase = spi_block_erase_d8,
15716 }, {
15717 .eraseblocks = { {8 * 1024 * 1024, 1} },
15718 .block_erase = spi_block_erase_60,
15719 }, {
15720 .eraseblocks = { {8 * 1024 * 1024, 1} },
15721 .block_erase = spi_block_erase_c7,
15722 }
15723 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015724 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015725 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000015726 .write = spi_chip_write_256,
15727 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015728 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000015729 },
15730
15731 {
15732 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015733 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015734 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015735 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015736 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015737 .total_size = 16384,
15738 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015739 /* supports SFDP */
15740 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000015741 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015742 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000015743 .probe = probe_spi_rdid,
15744 .probe_timing = TIMING_ZERO,
15745 .block_erasers =
15746 {
15747 {
15748 .eraseblocks = { {4 * 1024, 4096} },
15749 .block_erase = spi_block_erase_20,
15750 }, {
15751 .eraseblocks = { {32 * 1024, 512} },
15752 .block_erase = spi_block_erase_52,
15753 }, {
15754 .eraseblocks = { {64 * 1024, 256} },
15755 .block_erase = spi_block_erase_d8,
15756 }, {
15757 .eraseblocks = { {16 * 1024 * 1024, 1} },
15758 .block_erase = spi_block_erase_60,
15759 }, {
15760 .eraseblocks = { {16 * 1024 * 1024, 1} },
15761 .block_erase = spi_block_erase_c7,
15762 }
15763 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015764 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000015765 .unlock = spi_disable_blockprotect,
15766 .write = spi_chip_write_256,
15767 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015768 .voltage = {2700, 3600},
15769 },
15770
15771 {
15772 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020015773 .name = "W25Q128.V..M",
15774 .bustype = BUS_SPI,
15775 .manufacture_id = WINBOND_NEX_ID,
15776 .model_id = WINBOND_NEX_W25Q128_V_M,
15777 .total_size = 16384,
15778 .page_size = 256,
15779 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15780 .tested = TEST_OK_PREW,
15781 .probe = probe_spi_rdid,
15782 .probe_timing = TIMING_ZERO,
15783 .block_erasers =
15784 {
15785 {
15786 .eraseblocks = { {4 * 1024, 4096} },
15787 .block_erase = spi_block_erase_20,
15788 }, {
15789 .eraseblocks = { {32 * 1024, 512} },
15790 .block_erase = spi_block_erase_52,
15791 }, {
15792 .eraseblocks = { {64 * 1024, 256} },
15793 .block_erase = spi_block_erase_d8,
15794 }, {
15795 .eraseblocks = { {16 * 1024 * 1024, 1} },
15796 .block_erase = spi_block_erase_60,
15797 }, {
15798 .eraseblocks = { {16 * 1024 * 1024, 1} },
15799 .block_erase = spi_block_erase_c7,
15800 }
15801 },
15802 .unlock = spi_disable_blockprotect,
15803 .write = spi_chip_write_256,
15804 .read = spi_chip_read,
15805 .voltage = {2700, 3600},
15806 },
15807
15808 {
15809 .vendor = "Winbond",
Boris Baykovaa6c3742016-06-11 18:29:01 +020015810 .name = "W25Q256.V",
15811 .bustype = BUS_SPI,
15812 .manufacture_id = WINBOND_NEX_ID,
15813 .model_id = WINBOND_NEX_W25Q256_V,
15814 .total_size = 32768,
15815 .page_size = 256,
15816 /* supports SFDP */
15817 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15818 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nico Huberaac81422017-11-10 22:54:13 +010015819 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
15820 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
Angel Pons3130cbd2018-09-30 19:32:30 +020015821 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015822 .probe = probe_spi_rdid,
15823 .probe_timing = TIMING_ZERO,
15824 .block_erasers =
15825 {
15826 {
15827 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020015828 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015829 }, {
15830 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020015831 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015832 }, {
15833 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020015834 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020015835 }, {
15836 .eraseblocks = { {32 * 1024 * 1024, 1} },
15837 .block_erase = spi_block_erase_60,
15838 }, {
15839 .eraseblocks = { {32 * 1024 * 1024, 1} },
15840 .block_erase = spi_block_erase_c7,
15841 }
15842 },
15843 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15844 .unlock = spi_disable_blockprotect,
15845 .write = spi_chip_write_256,
15846 .read = spi_chip_read,
15847 .voltage = {2700, 3600},
15848 },
15849
15850 {
15851 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000015852 .name = "W25Q256JV_M",
15853 .bustype = BUS_SPI,
15854 .manufacture_id = WINBOND_NEX_ID,
15855 .model_id = WINBOND_NEX_W25Q256JV_M,
15856 .total_size = 32768,
15857 .page_size = 256,
15858 /* supports SFDP */
15859 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15860 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
15861 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
15862 .tested = TEST_OK_PREW,
15863 .probe = probe_spi_rdid,
15864 .probe_timing = TIMING_ZERO,
15865 .block_erasers =
15866 {
15867 {
15868 .eraseblocks = { {4 * 1024, 8192} },
15869 .block_erase = spi_block_erase_21,
15870 }, {
15871 .eraseblocks = { {4 * 1024, 8192} },
15872 .block_erase = spi_block_erase_20,
15873 }, {
15874 .eraseblocks = { {32 * 1024, 1024} },
15875 .block_erase = spi_block_erase_52,
15876 }, {
15877 .eraseblocks = { {64 * 1024, 512} },
15878 .block_erase = spi_block_erase_dc,
15879 }, {
15880 .eraseblocks = { {64 * 1024, 512} },
15881 .block_erase = spi_block_erase_d8,
15882 }, {
15883 .eraseblocks = { {32 * 1024 * 1024, 1} },
15884 .block_erase = spi_block_erase_60,
15885 }, {
15886 .eraseblocks = { {32 * 1024 * 1024, 1} },
15887 .block_erase = spi_block_erase_c7,
15888 }
15889 },
15890 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15891 .unlock = spi_disable_blockprotect,
15892 .write = spi_chip_write_256,
15893 .read = spi_chip_read,
15894 .voltage = {2700, 3600},
15895 },
15896
15897 {
15898 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015899 .name = "W25Q20.W",
15900 .bustype = BUS_SPI,
15901 .manufacture_id = WINBOND_NEX_ID,
15902 .model_id = WINBOND_NEX_W25Q20_W,
15903 .total_size = 256,
15904 .page_size = 256,
15905 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15906 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15907 .tested = TEST_UNTESTED,
15908 .probe = probe_spi_rdid,
15909 .probe_timing = TIMING_ZERO,
15910 .block_erasers =
15911 {
15912 {
15913 .eraseblocks = { {4 * 1024, 64} },
15914 .block_erase = spi_block_erase_20,
15915 }, {
15916 .eraseblocks = { {32 * 1024, 8} },
15917 .block_erase = spi_block_erase_52,
15918 }, {
15919 .eraseblocks = { {64 * 1024, 4} },
15920 .block_erase = spi_block_erase_d8,
15921 }, {
15922 .eraseblocks = { {256 * 1024, 1} },
15923 .block_erase = spi_block_erase_60,
15924 }, {
15925 .eraseblocks = { {256 * 1024, 1} },
15926 .block_erase = spi_block_erase_c7,
15927 }
15928 },
15929 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15930 .unlock = spi_disable_blockprotect,
15931 .write = spi_chip_write_256,
15932 .read = spi_chip_read,
15933 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15934 },
15935
15936 {
15937 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020015938 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015939 .bustype = BUS_SPI,
15940 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020015941 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015942 .total_size = 512,
15943 .page_size = 256,
15944 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons3164a0c2018-09-30 20:26:06 +020015946 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015947 .probe = probe_spi_rdid,
15948 .probe_timing = TIMING_ZERO,
15949 .block_erasers =
15950 {
15951 {
15952 .eraseblocks = { {4 * 1024, 128} },
15953 .block_erase = spi_block_erase_20,
15954 }, {
15955 .eraseblocks = { {32 * 1024, 16} },
15956 .block_erase = spi_block_erase_52,
15957 }, {
15958 .eraseblocks = { {64 * 1024, 8} },
15959 .block_erase = spi_block_erase_d8,
15960 }, {
15961 .eraseblocks = { {512 * 1024, 1} },
15962 .block_erase = spi_block_erase_60,
15963 }, {
15964 .eraseblocks = { {512 * 1024, 1} },
15965 .block_erase = spi_block_erase_c7,
15966 }
15967 },
15968 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15969 .unlock = spi_disable_blockprotect,
15970 .write = spi_chip_write_256,
15971 .read = spi_chip_read,
15972 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15973 },
15974
15975 {
15976 .vendor = "Winbond",
David Hendricksc699f5c2018-03-11 17:29:49 -070015977 .name = "W25Q80BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015978 .bustype = BUS_SPI,
15979 .manufacture_id = WINBOND_NEX_ID,
David Hendricksc699f5c2018-03-11 17:29:49 -070015980 .model_id = WINBOND_NEX_W25Q80BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015981 .total_size = 1024,
15982 .page_size = 256,
15983 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15984 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015985 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015986 .probe = probe_spi_rdid,
15987 .probe_timing = TIMING_ZERO,
15988 .block_erasers =
15989 {
15990 {
15991 .eraseblocks = { {4 * 1024, 256} },
15992 .block_erase = spi_block_erase_20,
15993 }, {
15994 .eraseblocks = { {32 * 1024, 32} },
15995 .block_erase = spi_block_erase_52,
15996 }, {
15997 .eraseblocks = { {64 * 1024, 16} },
15998 .block_erase = spi_block_erase_d8,
15999 }, {
16000 .eraseblocks = { {1 * 1024 * 1024, 1} },
16001 .block_erase = spi_block_erase_60,
16002 }, {
16003 .eraseblocks = { {1 * 1024 * 1024, 1} },
16004 .block_erase = spi_block_erase_c7,
16005 }
16006 },
16007 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16008 .unlock = spi_disable_blockprotect,
16009 .write = spi_chip_write_256,
16010 .read = spi_chip_read,
16011 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16012 },
Nico Huber25683572018-03-30 13:50:13 +020016013
16014 {
16015 .vendor = "Winbond",
16016 .name = "W25Q40EW",
16017 .bustype = BUS_SPI,
16018 .manufacture_id = WINBOND_NEX_ID,
16019 .model_id = WINBOND_NEX_W25Q40EW,
16020 .total_size = 512,
16021 .page_size = 256,
16022 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16023 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16024 .tested = TEST_UNTESTED,
16025 .probe = probe_spi_rdid,
16026 .probe_timing = TIMING_ZERO,
16027 .block_erasers =
16028 {
16029 {
16030 .eraseblocks = { {4 * 1024, 128} },
16031 .block_erase = spi_block_erase_20,
16032 }, {
16033 .eraseblocks = { {32 * 1024, 16} },
16034 .block_erase = spi_block_erase_52,
16035 }, {
16036 .eraseblocks = { {64 * 1024, 8} },
16037 .block_erase = spi_block_erase_d8,
16038 }, {
16039 .eraseblocks = { {512 * 1024, 1} },
16040 .block_erase = spi_block_erase_60,
16041 }, {
16042 .eraseblocks = { {512 * 1024, 1} },
16043 .block_erase = spi_block_erase_c7,
16044 }
16045 },
16046 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16047 .unlock = spi_disable_blockprotect,
16048 .write = spi_chip_write_256,
16049 .read = spi_chip_read,
16050 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
16051 },
16052
Stanislav Sedovf5775442018-03-07 14:16:51 -080016053 {
16054 .vendor = "Winbond",
16055 .name = "W25Q80EW",
16056 .bustype = BUS_SPI,
16057 .manufacture_id = WINBOND_NEX_ID,
16058 .model_id = WINBOND_NEX_W25Q80EW,
16059 .total_size = 1024,
16060 .page_size = 256,
16061 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16062 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16063 .tested = TEST_OK_PREW,
16064 .probe = probe_spi_rdid,
16065 .probe_timing = TIMING_ZERO,
16066 .block_erasers =
16067 {
16068 {
16069 .eraseblocks = { {4 * 1024, 256} },
16070 .block_erase = spi_block_erase_20,
16071 }, {
16072 .eraseblocks = { {32 * 1024, 32} },
16073 .block_erase = spi_block_erase_52,
16074 }, {
16075 .eraseblocks = { {64 * 1024, 16} },
16076 .block_erase = spi_block_erase_d8,
16077 }, {
16078 .eraseblocks = { {1 * 1024 * 1024, 1} },
16079 .block_erase = spi_block_erase_60,
16080 }, {
16081 .eraseblocks = { {1 * 1024 * 1024, 1} },
16082 .block_erase = spi_block_erase_c7,
16083 }
16084 },
16085 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16086 .unlock = spi_disable_blockprotect,
16087 .write = spi_chip_write_256,
16088 .read = spi_chip_read,
16089 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
16090 },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016091
16092 {
16093 .vendor = "Winbond",
16094 .name = "W25Q16.W",
16095 .bustype = BUS_SPI,
16096 .manufacture_id = WINBOND_NEX_ID,
16097 .model_id = WINBOND_NEX_W25Q16_W,
16098 .total_size = 2048,
16099 .page_size = 256,
16100 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16101 /* QPI enable 0x38, disable 0xFF */
16102 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16103 .tested = TEST_UNTESTED,
16104 .probe = probe_spi_rdid,
16105 .probe_timing = TIMING_ZERO,
16106 .block_erasers =
16107 {
16108 {
16109 .eraseblocks = { {4 * 1024, 512} },
16110 .block_erase = spi_block_erase_20,
16111 }, {
16112 .eraseblocks = { {32 * 1024, 64} },
16113 .block_erase = spi_block_erase_52,
16114 }, {
16115 .eraseblocks = { {64 * 1024, 32} },
16116 .block_erase = spi_block_erase_d8,
16117 }, {
16118 .eraseblocks = { {2 * 1024 * 1024, 1} },
16119 .block_erase = spi_block_erase_60,
16120 }, {
16121 .eraseblocks = { {2 * 1024 * 1024, 1} },
16122 .block_erase = spi_block_erase_c7,
16123 }
16124 },
16125 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16126 .unlock = spi_disable_blockprotect,
16127 .write = spi_chip_write_256,
16128 .read = spi_chip_read,
16129 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16130 },
16131
16132 {
16133 .vendor = "Winbond",
16134 .name = "W25Q32.W",
16135 .bustype = BUS_SPI,
16136 .manufacture_id = WINBOND_NEX_ID,
16137 .model_id = WINBOND_NEX_W25Q32_W,
16138 .total_size = 4096,
16139 .page_size = 256,
16140 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16141 /* QPI enable 0x38, disable 0xFF */
16142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16143 .tested = TEST_OK_PREW,
16144 .probe = probe_spi_rdid,
16145 .probe_timing = TIMING_ZERO,
16146 .block_erasers =
16147 {
16148 {
16149 .eraseblocks = { {4 * 1024, 1024} },
16150 .block_erase = spi_block_erase_20,
16151 }, {
16152 .eraseblocks = { {32 * 1024, 128} },
16153 .block_erase = spi_block_erase_52,
16154 }, {
16155 .eraseblocks = { {64 * 1024, 64} },
16156 .block_erase = spi_block_erase_d8,
16157 }, {
16158 .eraseblocks = { {4 * 1024 * 1024, 1} },
16159 .block_erase = spi_block_erase_60,
16160 }, {
16161 .eraseblocks = { {4 * 1024 * 1024, 1} },
16162 .block_erase = spi_block_erase_c7,
16163 }
16164 },
16165 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16166 .unlock = spi_disable_blockprotect,
16167 .write = spi_chip_write_256,
16168 .read = spi_chip_read,
16169 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16170 },
16171
16172 {
16173 .vendor = "Winbond",
16174 .name = "W25Q64.W",
16175 .bustype = BUS_SPI,
16176 .manufacture_id = WINBOND_NEX_ID,
16177 .model_id = WINBOND_NEX_W25Q64_W,
16178 .total_size = 8192,
16179 .page_size = 256,
16180 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16181 /* QPI enable 0x38, disable 0xFF */
16182 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016183 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016184 .probe = probe_spi_rdid,
16185 .probe_timing = TIMING_ZERO,
16186 .block_erasers =
16187 {
16188 {
16189 .eraseblocks = { {4 * 1024, 2048} },
16190 .block_erase = spi_block_erase_20,
16191 }, {
16192 .eraseblocks = { {32 * 1024, 256} },
16193 .block_erase = spi_block_erase_52,
16194 }, {
16195 .eraseblocks = { {64 * 1024, 128} },
16196 .block_erase = spi_block_erase_d8,
16197 }, {
16198 .eraseblocks = { {8 * 1024 * 1024, 1} },
16199 .block_erase = spi_block_erase_60,
16200 }, {
16201 .eraseblocks = { {8 * 1024 * 1024, 1} },
16202 .block_erase = spi_block_erase_c7,
16203 }
16204 },
16205 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16206 .unlock = spi_disable_blockprotect,
16207 .write = spi_chip_write_256,
16208 .read = spi_chip_read,
16209 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000016210 },
16211
16212 {
16213 .vendor = "Winbond",
Nico Huber70eed9f2017-04-24 22:19:27 +020016214 .name = "W25Q128.W",
16215 .bustype = BUS_SPI,
16216 .manufacture_id = WINBOND_NEX_ID,
16217 .model_id = WINBOND_NEX_W25Q128_W,
16218 .total_size = 16384,
16219 .page_size = 256,
16220 /* supports SFDP */
16221 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16222 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks48729d32017-12-08 14:44:07 -080016223 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020016224 .probe = probe_spi_rdid,
16225 .probe_timing = TIMING_ZERO,
16226 .block_erasers =
16227 {
16228 {
16229 .eraseblocks = { {4 * 1024, 4096} },
16230 .block_erase = spi_block_erase_20,
16231 }, {
16232 .eraseblocks = { {32 * 1024, 512} },
16233 .block_erase = spi_block_erase_52,
16234 }, {
16235 .eraseblocks = { {64 * 1024, 256} },
16236 .block_erase = spi_block_erase_d8,
16237 }, {
16238 .eraseblocks = { {16 * 1024 * 1024, 1} },
16239 .block_erase = spi_block_erase_60,
16240 }, {
16241 .eraseblocks = { {16 * 1024 * 1024, 1} },
16242 .block_erase = spi_block_erase_c7,
16243 }
16244 },
16245 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16246 .unlock = spi_disable_blockprotect,
16247 .write = spi_chip_write_256,
16248 .read = spi_chip_read,
16249 .voltage = {1650, 1950},
16250 },
16251
16252 {
16253 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016254 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016255 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016256 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016257 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016258 .total_size = 128,
16259 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016260 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000016261 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016262 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016263 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016264 .block_erasers =
16265 {
16266 {
16267 .eraseblocks = { {4 * 1024, 32} },
16268 .block_erase = spi_block_erase_20,
16269 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016270 .eraseblocks = { {64 * 1024, 2} },
16271 .block_erase = spi_block_erase_d8,
16272 }, {
16273 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016274 .block_erase = spi_block_erase_c7,
16275 }
16276 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016277 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016278 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016279 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016280 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016281 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016282 },
16283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016284 {
16285 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016286 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016287 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016288 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016289 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016290 .total_size = 256,
16291 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016292 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016293 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016294 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016295 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016296 .block_erasers =
16297 {
16298 {
16299 .eraseblocks = { {4 * 1024, 64} },
16300 .block_erase = spi_block_erase_20,
16301 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016302 .eraseblocks = { {64 * 1024, 4} },
16303 .block_erase = spi_block_erase_d8,
16304 }, {
16305 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016306 .block_erase = spi_block_erase_c7,
16307 }
16308 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016309 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016310 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016311 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016312 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016313 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016314 },
16315
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016316 {
16317 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016318 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016319 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016320 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016321 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016322 .total_size = 512,
16323 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016324 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000016325 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016326 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016327 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016328 .block_erasers =
16329 {
16330 {
16331 .eraseblocks = { {4 * 1024, 128} },
16332 .block_erase = spi_block_erase_20,
16333 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016334 .eraseblocks = { {64 * 1024, 8} },
16335 .block_erase = spi_block_erase_d8,
16336 }, {
16337 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016338 .block_erase = spi_block_erase_c7,
16339 }
16340 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016341 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016342 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016343 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016344 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016345 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016346 },
16347
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016348 {
16349 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016350 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016351 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016352 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016353 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016354 .total_size = 1024,
16355 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016356 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000016357 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016358 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016359 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016360 .block_erasers =
16361 {
16362 {
16363 .eraseblocks = { {4 * 1024, 256} },
16364 .block_erase = spi_block_erase_20,
16365 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016366 .eraseblocks = { {64 * 1024, 16} },
16367 .block_erase = spi_block_erase_d8,
16368 }, {
16369 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016370 .block_erase = spi_block_erase_c7,
16371 }
16372 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016373 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016374 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000016375 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016376 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016377 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016378 },
16379
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016380 {
16381 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016382 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016383 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000016384 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016385 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000016386 .total_size = 2048,
16387 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016388 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000016389 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000016390 .probe = probe_spi_rdid,
16391 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016392 .block_erasers =
16393 {
16394 {
16395 .eraseblocks = { {4 * 1024, 512} },
16396 .block_erase = spi_block_erase_20,
16397 }, {
16398 .eraseblocks = { {32 * 1024, 64} },
16399 .block_erase = spi_block_erase_52,
16400 }, {
16401 .eraseblocks = { {64 * 1024, 32} },
16402 .block_erase = spi_block_erase_d8,
16403 }, {
16404 .eraseblocks = { {2 * 1024 * 1024, 1} },
16405 .block_erase = spi_block_erase_60,
16406 }, {
16407 .eraseblocks = { {2 * 1024 * 1024, 1} },
16408 .block_erase = spi_block_erase_c7,
16409 }
16410 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016411 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016412 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000016413 .write = spi_chip_write_256,
16414 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016415 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000016416 },
16417
16418 {
16419 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016420 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016421 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000016422 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016423 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000016424 .total_size = 4096,
16425 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016426 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000016427 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000016428 .probe = probe_spi_rdid,
16429 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016430 .block_erasers =
16431 {
16432 {
16433 .eraseblocks = { {4 * 1024, 1024} },
16434 .block_erase = spi_block_erase_20,
16435 }, {
16436 .eraseblocks = { {32 * 1024, 128} },
16437 .block_erase = spi_block_erase_52,
16438 }, {
16439 .eraseblocks = { {64 * 1024, 64} },
16440 .block_erase = spi_block_erase_d8,
16441 }, {
16442 .eraseblocks = { {4 * 1024 * 1024, 1} },
16443 .block_erase = spi_block_erase_60,
16444 }, {
16445 .eraseblocks = { {4 * 1024 * 1024, 1} },
16446 .block_erase = spi_block_erase_c7,
16447 }
16448 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016449 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016450 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000016451 .write = spi_chip_write_256,
16452 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016453 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000016454 },
16455
16456 {
16457 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016458 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016459 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000016460 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016461 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000016462 .total_size = 8192,
16463 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000016464 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016465 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000016466 .probe = probe_spi_rdid,
16467 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016468 .block_erasers =
16469 {
16470 {
16471 .eraseblocks = { {4 * 1024, 2048} },
16472 .block_erase = spi_block_erase_20,
16473 }, {
16474 .eraseblocks = { {32 * 1024, 256} },
16475 .block_erase = spi_block_erase_52,
16476 }, {
16477 .eraseblocks = { {64 * 1024, 128} },
16478 .block_erase = spi_block_erase_d8,
16479 }, {
16480 .eraseblocks = { {8 * 1024 * 1024, 1} },
16481 .block_erase = spi_block_erase_60,
16482 }, {
16483 .eraseblocks = { {8 * 1024 * 1024, 1} },
16484 .block_erase = spi_block_erase_c7,
16485 }
16486 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016487 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016488 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000016489 .write = spi_chip_write_256,
16490 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016491 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000016492 },
16493
16494 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016495 .vendor = "Winbond",
16496 .name = "W25P80",
16497 .bustype = BUS_SPI,
16498 .manufacture_id = WINBOND_NEX_ID,
16499 .model_id = WINBOND_NEX_W25P80,
16500 .total_size = 1024,
16501 .page_size = 256,
16502 .feature_bits = FEATURE_WRSR_WREN,
16503 .tested = TEST_UNTESTED,
16504 .probe = probe_spi_rdid,
16505 .probe_timing = TIMING_ZERO,
16506 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016507 {
16508 {
16509 .eraseblocks = { {64 * 1024, 16} },
16510 .block_erase = spi_block_erase_d8,
16511 }, {
16512 .eraseblocks = { {1024 * 1024, 1} },
16513 .block_erase = spi_block_erase_c7,
16514 }
16515 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016516 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16517 .unlock = spi_disable_blockprotect,
16518 .write = spi_chip_write_256,
16519 .read = spi_chip_read, /* Fast read (0x0B) supported */
16520 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016521 },
16522
16523 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016524 .vendor = "Winbond",
16525 .name = "W25P16",
16526 .bustype = BUS_SPI,
16527 .manufacture_id = WINBOND_NEX_ID,
16528 .model_id = WINBOND_NEX_W25P16,
16529 .total_size = 2048,
16530 .page_size = 256,
16531 .feature_bits = FEATURE_WRSR_WREN,
16532 .tested = TEST_UNTESTED,
16533 .probe = probe_spi_rdid,
16534 .probe_timing = TIMING_ZERO,
16535 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016536 {
16537 {
16538 .eraseblocks = { {64 * 1024, 32} },
16539 .block_erase = spi_block_erase_d8,
16540 }, {
16541 .eraseblocks = { {2048 * 1024, 1} },
16542 .block_erase = spi_block_erase_c7,
16543 }
16544 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016545 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16546 .unlock = spi_disable_blockprotect,
16547 .write = spi_chip_write_256,
16548 .read = spi_chip_read, /* Fast read (0x0B) supported */
16549 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016550 },
16551
16552 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100016553 .vendor = "Winbond",
16554 .name = "W25P32",
16555 .bustype = BUS_SPI,
16556 .manufacture_id = WINBOND_NEX_ID,
16557 .model_id = WINBOND_NEX_W25P32,
16558 .total_size = 4096,
16559 .page_size = 256,
16560 .feature_bits = FEATURE_WRSR_WREN,
16561 .tested = TEST_UNTESTED,
16562 .probe = probe_spi_rdid,
16563 .probe_timing = TIMING_ZERO,
16564 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016565 {
16566 {
16567 .eraseblocks = { {64 * 1024, 64} },
16568 .block_erase = spi_block_erase_d8,
16569 }, {
16570 .eraseblocks = { {4096 * 1024, 1} },
16571 .block_erase = spi_block_erase_c7,
16572 }
16573 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016574 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16575 .unlock = spi_disable_blockprotect,
16576 .write = spi_chip_write_256,
16577 .read = spi_chip_read, /* Fast read (0x0B) supported */
16578 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016579 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100016580
David Hendricksc9ee0ed2018-02-11 17:40:53 -080016581 {
Zheng Bao1db2b752009-11-26 11:05:01 +000016582 .vendor = "Winbond",
Urja Rannikko2a1aaba2015-06-20 11:53:10 +000016583 .name = "W29C512A/W29EE512",
16584 .bustype = BUS_PARALLEL,
16585 .manufacture_id = WINBOND_ID,
16586 .model_id = WINBOND_W29C512A,
16587 .total_size = 64,
16588 .page_size = 128,
16589 .feature_bits = FEATURE_LONG_RESET,
16590 .tested = TEST_OK_PREW,
16591 .probe = probe_jedec,
16592 .probe_timing = 10,
16593 .block_erasers =
16594 {
16595 {
16596 .eraseblocks = { {64 * 1024, 1} },
16597 .block_erase = erase_chip_block_jedec,
16598 }
16599 },
16600 .write = write_jedec,
16601 .read = read_memmapped,
16602 .voltage = {4500, 5500},
16603 },
16604
16605 {
16606 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016607 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016608 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016609 .manufacture_id = WINBOND_ID,
16610 .model_id = WINBOND_W29C010,
16611 .total_size = 128,
16612 .page_size = 128,
16613 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000016614 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000016615 .probe = probe_w29ee011,
16616 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
16617 .block_erasers =
16618 {
16619 {
16620 .eraseblocks = { {128 * 1024, 1} },
16621 .block_erase = erase_chip_block_jedec,
16622 }
16623 },
16624 .write = write_jedec,
16625 .read = read_memmapped,
16626 },
16627
16628 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
16629 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016630 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016631 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016632 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016633 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016634 .total_size = 128,
16635 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016636 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000016637 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016638 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016639 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016640 .block_erasers =
16641 {
16642 {
16643 .eraseblocks = { {128 * 1024, 1} },
16644 .block_erase = erase_chip_block_jedec,
16645 }
16646 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016647 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016648 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000016649 },
16650
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016651 {
16652 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016653 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016654 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016655 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016656 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016657 .total_size = 256,
16658 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016659 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016660 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016661 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016662 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016663 .block_erasers =
16664 {
16665 {
16666 .eraseblocks = { {256 * 1024, 1} },
16667 .block_erase = erase_chip_block_jedec,
16668 }
16669 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016670 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016671 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016672 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016673 },
16674
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016675 {
16676 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016677 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016678 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016679 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016680 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016681 .total_size = 512,
16682 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000016683 .feature_bits = FEATURE_LONG_RESET,
16684 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016685 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016686 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016687 .block_erasers =
16688 {
16689 {
16690 .eraseblocks = { {512 * 1024, 1} },
16691 .block_erase = erase_chip_block_jedec,
16692 }
16693 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016694 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016695 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016696 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016697 },
16698
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016699 {
16700 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000016701 .name = "W29GL032CB",
16702 .bustype = BUS_PARALLEL,
16703 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16704 .model_id = WINBOND_W29GL032CB,
16705 .total_size = 4096,
16706 .page_size = 128 * 1024, /* actual page size is 16 */
16707 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16708 .tested = TEST_UNTESTED,
16709 .probe = probe_jedec_29gl,
16710 .probe_timing = TIMING_ZERO,
16711 .block_erasers =
16712 {
16713 {
16714 .eraseblocks = {
16715 {8 * 1024, 8},
16716 {64 * 1024, 63},
16717 },
16718 .block_erase = erase_sector_jedec,
16719 }, {
16720 .eraseblocks = { {4 * 1024 * 1024, 1} },
16721 .block_erase = erase_chip_block_jedec,
16722 },
16723 },
16724 .write = write_jedec_1,
16725 .read = read_memmapped,
16726 .voltage = {2700, 3600},
16727 },
16728
16729 {
16730 .vendor = "Winbond",
16731 .name = "W29GL032CT",
16732 .bustype = BUS_PARALLEL,
16733 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16734 .model_id = WINBOND_W29GL032CT,
16735 .total_size = 4096,
16736 .page_size = 128 * 1024, /* actual page size is 16 */
16737 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16738 .tested = TEST_UNTESTED,
16739 .probe = probe_jedec_29gl,
16740 .probe_timing = TIMING_ZERO,
16741 .block_erasers =
16742 {
16743 {
16744 .eraseblocks = {
16745 {64 * 1024, 63},
16746 {8 * 1024, 8},
16747 },
16748 .block_erase = erase_sector_jedec,
16749 }, {
16750 .eraseblocks = { {4 * 1024 * 1024, 1} },
16751 .block_erase = erase_chip_block_jedec,
16752 },
16753 },
16754 .write = write_jedec_1,
16755 .read = read_memmapped,
16756 .voltage = {2700, 3600},
16757 },
16758
16759 {
16760 .vendor = "Winbond",
16761 .name = "W29GL032CH/L",
16762 .bustype = BUS_PARALLEL,
16763 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16764 .model_id = WINBOND_W29GL032CHL,
16765 .total_size = 4096,
16766 .page_size = 128 * 1024, /* actual page size is 16 */
16767 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16768 .tested = TEST_UNTESTED,
16769 .probe = probe_jedec_29gl,
16770 .probe_timing = TIMING_ZERO,
16771 .block_erasers =
16772 {
16773 {
16774 .eraseblocks = { {64 * 1024, 64} },
16775 .block_erase = erase_sector_jedec,
16776 }, {
16777 .eraseblocks = { {4 * 1024 * 1024, 1} },
16778 .block_erase = erase_chip_block_jedec,
16779 },
16780 },
16781 .write = write_jedec_1,
16782 .read = read_memmapped,
16783 .voltage = {2700, 3600},
16784 },
16785
16786 {
16787 .vendor = "Winbond",
16788 .name = "W29GL064CB",
16789 .bustype = BUS_PARALLEL,
16790 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16791 .model_id = WINBOND_W29GL064CB,
16792 .total_size = 8192,
16793 .page_size = 128 * 1024, /* actual page size is 16 */
16794 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16795 .tested = TEST_UNTESTED,
16796 .probe = probe_jedec_29gl,
16797 .probe_timing = TIMING_ZERO,
16798 .block_erasers =
16799 {
16800 {
16801 .eraseblocks = {
16802 {8 * 1024, 8},
16803 {64 * 1024, 127},
16804 },
16805 .block_erase = erase_sector_jedec,
16806 }, {
16807 .eraseblocks = { {8 * 1024 * 1024, 1} },
16808 .block_erase = erase_chip_block_jedec,
16809 },
16810 },
16811 .write = write_jedec_1,
16812 .read = read_memmapped,
16813 .voltage = {2700, 3600},
16814 },
16815
16816 {
16817 .vendor = "Winbond",
16818 .name = "W29GL064CT",
16819 .bustype = BUS_PARALLEL,
16820 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16821 .model_id = WINBOND_W29GL064CT,
16822 .total_size = 8192,
16823 .page_size = 128 * 1024, /* actual page size is 16 */
16824 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16825 .tested = TEST_UNTESTED,
16826 .probe = probe_jedec_29gl,
16827 .probe_timing = TIMING_ZERO,
16828 .block_erasers =
16829 {
16830 {
16831 .eraseblocks = {
16832 {64 * 1024, 127},
16833 {8 * 1024, 8},
16834 },
16835 .block_erase = erase_sector_jedec,
16836 }, {
16837 .eraseblocks = { {8 * 1024 * 1024, 1} },
16838 .block_erase = erase_chip_block_jedec,
16839 },
16840 },
16841 .write = write_jedec_1,
16842 .read = read_memmapped,
16843 .voltage = {2700, 3600},
16844 },
16845
16846 {
16847 .vendor = "Winbond",
16848 .name = "W29GL064CH/L",
16849 .bustype = BUS_PARALLEL,
16850 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16851 .model_id = WINBOND_W29GL064CHL,
16852 .total_size = 8192,
16853 .page_size = 128 * 1024, /* actual page size is 16 */
16854 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16855 .tested = TEST_UNTESTED,
16856 .probe = probe_jedec_29gl,
16857 .probe_timing = TIMING_ZERO,
16858 .block_erasers =
16859 {
16860 {
16861 .eraseblocks = { {64 * 1024, 128} },
16862 .block_erase = erase_sector_jedec,
16863 }, {
16864 .eraseblocks = { {8 * 1024 * 1024, 1} },
16865 .block_erase = erase_chip_block_jedec,
16866 },
16867 },
16868 .write = write_jedec_1,
16869 .read = read_memmapped,
16870 .voltage = {2700, 3600},
16871 },
16872
16873 {
16874 .vendor = "Winbond",
16875 .name = "W29GL128C",
16876 .bustype = BUS_PARALLEL,
16877 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
16878 .model_id = WINBOND_W29GL128CHL,
16879 .total_size = 16384,
16880 .page_size = 128 * 1024, /* actual page size is 16 */
16881 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
16882 .tested = TEST_UNTESTED,
16883 .probe = probe_jedec_29gl,
16884 .probe_timing = TIMING_ZERO,
16885 .block_erasers =
16886 {
16887 {
16888 .eraseblocks = { {128 * 1024, 128} },
16889 .block_erase = erase_sector_jedec,
16890 }, {
16891 .eraseblocks = { {16 * 1024 * 1024, 1} },
16892 .block_erase = erase_chip_block_jedec,
16893 },
16894 },
16895 .write = write_jedec_1,
16896 .read = read_memmapped,
16897 .voltage = {2700, 3600},
16898 },
16899
16900 {
16901 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000016902 .name = "W39F010",
16903 .bustype = BUS_PARALLEL,
16904 .manufacture_id = WINBOND_ID,
16905 .model_id = WINBOND_W39F010,
16906 .total_size = 128,
16907 .page_size = 4 * 1024,
16908 .feature_bits = FEATURE_EITHER_RESET,
16909 .tested = TEST_OK_PREW,
16910 .probe = probe_jedec,
16911 .probe_timing = 10,
16912 .block_erasers =
16913 {
16914 {
16915 .eraseblocks = { {4 * 1024, 32} },
16916 .block_erase = erase_block_jedec,
16917 }, {
16918 .eraseblocks = { {128 * 1024, 1} },
16919 .block_erase = erase_chip_block_jedec,
16920 }
16921 },
16922 .printlock = printlock_w39f010,
16923 .write = write_jedec_1,
16924 .read = read_memmapped,
16925 .voltage = {4500, 5500},
16926 },
16927
16928 {
16929 .vendor = "Winbond",
16930 .name = "W39L010",
16931 .bustype = BUS_PARALLEL,
16932 .manufacture_id = WINBOND_ID,
16933 .model_id = WINBOND_W39L010,
16934 .total_size = 128,
16935 .page_size = 4 * 1024,
16936 .feature_bits = FEATURE_EITHER_RESET,
16937 .tested = TEST_UNTESTED,
16938 .probe = probe_jedec,
16939 .probe_timing = 10,
16940 .block_erasers =
16941 {
16942 {
16943 .eraseblocks = { {4 * 1024, 32} },
16944 .block_erase = erase_block_jedec,
16945 }, {
16946 .eraseblocks = { {128 * 1024, 1} },
16947 .block_erase = erase_chip_block_jedec,
16948 }
16949 },
16950 .printlock = printlock_w39l010,
16951 .write = write_jedec_1,
16952 .read = read_memmapped,
16953 .voltage = {3000, 3600},
16954 },
16955
16956 {
16957 .vendor = "Winbond",
16958 .name = "W39L020",
16959 .bustype = BUS_PARALLEL,
16960 .manufacture_id = WINBOND_ID,
16961 .model_id = WINBOND_W39L020,
16962 .total_size = 256,
16963 .page_size = 4 * 1024,
16964 .feature_bits = FEATURE_EITHER_RESET,
16965 .tested = TEST_UNTESTED,
16966 .probe = probe_jedec,
16967 .probe_timing = 10,
16968 .block_erasers =
16969 {
16970 {
16971 .eraseblocks = { {4 * 1024, 64} },
16972 .block_erase = erase_block_jedec,
16973 }, {
16974 .eraseblocks = { {64 * 1024, 4} },
16975 .block_erase = erase_sector_jedec,
16976 }, {
16977 .eraseblocks = { {256 * 1024, 1} },
16978 .block_erase = erase_chip_block_jedec,
16979 }
16980 },
16981 .printlock = printlock_w39l020,
16982 .write = write_jedec_1,
16983 .read = read_memmapped,
16984 .voltage = {3000, 3600},
16985 },
16986
16987 {
16988 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000016989 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016990 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000016991 .manufacture_id = WINBOND_ID,
16992 .model_id = WINBOND_W39L040,
16993 .total_size = 512,
16994 .page_size = 64 * 1024,
16995 .feature_bits = FEATURE_EITHER_RESET,
16996 .tested = TEST_OK_PR,
16997 .probe = probe_jedec,
16998 .probe_timing = 10,
16999 .block_erasers =
17000 {
17001 {
17002 .eraseblocks = { {4 * 1024, 128} },
17003 .block_erase = erase_block_jedec,
17004 }, {
17005 .eraseblocks = { {64 * 1024, 8} },
17006 .block_erase = erase_sector_jedec,
17007 }, {
17008 .eraseblocks = { {512 * 1024, 1} },
17009 .block_erase = erase_chip_block_jedec,
17010 }
17011 },
17012 .printlock = printlock_w39l040,
17013 .write = write_jedec_1,
17014 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017015 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000017016 },
17017
17018 {
17019 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017020 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017021 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017022 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017023 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017024 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017025 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017026 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000017027 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017028 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000017029 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017030 .block_erasers =
17031 {
17032 {
17033 .eraseblocks = { {64 * 1024, 8} },
17034 .block_erase = erase_sector_jedec,
17035 }, {
17036 .eraseblocks = { {512 * 1024, 1} },
17037 .block_erase = erase_chip_block_jedec,
17038 }
17039 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017040 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000017041 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017042 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017043 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017044 },
17045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017046 {
17047 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017048 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017049 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017050 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017051 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017052 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017053 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017054 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017055 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017056 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000017057 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017058 .block_erasers =
17059 {
17060 {
17061 .eraseblocks = { {64 * 1024, 8} },
17062 .block_erase = erase_sector_jedec,
17063 }, {
17064 .eraseblocks = { {512 * 1024, 1} },
17065 .block_erase = erase_chip_block_jedec,
17066 }
17067 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017068 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000017069 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017070 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017071 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017072 },
17073
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017074 {
17075 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017076 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017077 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017078 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017079 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017080 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017081 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017082 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017083 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000017084 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017085 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017086 .block_erasers =
17087 {
17088 {
17089 .eraseblocks = { {64 * 1024, 8} },
17090 .block_erase = erase_sector_jedec,
17091 }, {
17092 .eraseblocks = { {512 * 1024, 1} },
17093 .block_erase = erase_chip_block_jedec,
17094 }
17095 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000017096 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000017097 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017098 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017099 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017100 },
17101
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017102 {
17103 .vendor = "Winbond",
17104 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017105 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017106 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017107 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017108 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017109 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000017110 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000017111 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017112 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017113 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017114 .block_erasers =
17115 {
17116 {
17117 .eraseblocks = { {4 * 1024, 128} },
17118 .block_erase = erase_block_jedec,
17119 }, {
17120 .eraseblocks = { {64 * 1024, 8} },
17121 .block_erase = erase_sector_jedec,
17122 }, {
17123 .eraseblocks = { {512 * 1024, 1} },
17124 .block_erase = erase_chip_block_jedec,
17125 }
17126 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017127 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017128 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000017129 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017130 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017131 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017132 },
17133
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017134 {
17135 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017136 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017137 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017138 .manufacture_id = WINBOND_ID,
17139 .model_id = WINBOND_W39V040B,
17140 .total_size = 512,
17141 .page_size = 64 * 1024,
17142 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000017143 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017144 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000017145 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017146 .block_erasers =
17147 {
17148 {
17149 .eraseblocks = { {64 * 1024, 8} },
17150 .block_erase = erase_sector_jedec,
17151 }, {
17152 .eraseblocks = { {512 * 1024, 1} },
17153 .block_erase = erase_chip_block_jedec,
17154 }
17155 },
17156 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017157 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017158 .write = write_jedec_1,
17159 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017160 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017161 },
17162
17163 {
17164 .vendor = "Winbond",
17165 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017166 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017167 .manufacture_id = WINBOND_ID,
17168 .model_id = WINBOND_W39V040C,
17169 .total_size = 512,
17170 .page_size = 64 * 1024,
17171 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000017172 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017173 .probe = probe_jedec,
17174 .probe_timing = 10,
17175 .block_erasers =
17176 {
17177 {
17178 .eraseblocks = { {64 * 1024, 8} },
17179 .block_erase = erase_sector_jedec,
17180 }, {
17181 .eraseblocks = { {512 * 1024, 1} },
17182 .block_erase = erase_chip_block_jedec,
17183 }
17184 },
17185 .printlock = printlock_w39v040fc,
17186 .write = write_jedec_1,
17187 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017188 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017189 },
17190
17191 {
17192 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017193 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017194 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017195 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017196 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017197 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000017198 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017199 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000017200 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017201 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000017202 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017203 .block_erasers =
17204 {
17205 {
17206 .eraseblocks = { {64 * 1024, 16} },
17207 .block_erase = erase_sector_jedec,
17208 }, {
17209 .eraseblocks = { {1024 * 1024, 1} },
17210 .block_erase = erase_chip_block_jedec,
17211 }
17212 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017213 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000017214 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017215 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017216 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017217 },
17218
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017219 {
17220 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000017221 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017222 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017223 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017224 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017225 .total_size = 256,
17226 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017227 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000017228 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017229 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017230 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017231 .block_erasers =
17232 {
17233 {
17234 .eraseblocks = {
17235 {128 * 1024, 1},
17236 {96 * 1024, 1},
17237 {8 * 1024, 2},
17238 {16 * 1024, 1},
17239 },
17240 .block_erase = erase_sector_jedec,
17241 }, {
17242 .eraseblocks = { {256 * 1024, 1} },
17243 .block_erase = erase_chip_block_jedec,
17244 }
17245 },
Sean Nelson35727f72010-01-28 23:55:12 +000017246 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017247 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017248 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000017249 },
17250
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017251 {
17252 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017253 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017254 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017255 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017256 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017257 .total_size = 256,
17258 .page_size = 128,
17259 .feature_bits = FEATURE_EITHER_RESET,
17260 .tested = TEST_OK_PROBE,
17261 .probe = probe_jedec,
17262 .probe_timing = 10,
17263 .block_erasers =
17264 {
17265 {
17266 .eraseblocks = { {256 * 1024, 1} },
17267 .block_erase = erase_chip_block_jedec,
17268 }
17269 },
17270 .write = write_jedec_1,
17271 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017272 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000017273 },
17274
17275 {
17276 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017277 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017278 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017279 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017280 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017281 .total_size = 256,
17282 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017283 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000017284 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017285 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000017286 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017287 .block_erasers =
17288 {
17289 {
17290 .eraseblocks = {
17291 {64 * 1024, 3},
17292 {32 * 1024, 1},
17293 {8 * 1024, 2},
17294 {16 * 1024, 1},
17295 },
17296 .block_erase = erase_sector_jedec,
17297 }, {
17298 .eraseblocks = { {256 * 1024, 1} },
17299 .block_erase = erase_chip_block_jedec,
17300 }
17301 },
Sean Nelson35727f72010-01-28 23:55:12 +000017302 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017303 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017304 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017305 },
17306
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017307 {
17308 .vendor = "Winbond",
17309 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017310 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017311 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017312 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017313 .total_size = 256,
17314 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000017315 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000017316 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017317 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017318 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017319 .block_erasers =
17320 {
17321 {
17322 .eraseblocks = {
17323 {64 * 1024, 3},
17324 {32 * 1024, 1},
17325 {8 * 1024, 2},
17326 {16 * 1024, 1},
17327 },
17328 .block_erase = erase_sector_jedec,
17329 }, {
17330 .eraseblocks = { {256 * 1024, 1} },
17331 .block_erase = erase_chip_block_jedec,
17332 }
17333 },
Sean Nelson35727f72010-01-28 23:55:12 +000017334 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017335 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017336 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000017337 },
17338
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017339 {
17340 .vendor = "Winbond",
17341 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017342 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017343 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017344 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017345 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000017346 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017347 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000017348 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000017349 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017350 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017351 .block_erasers =
17352 {
17353 {
Stefan Tauner6697f712014-08-06 15:09:15 +000017354 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017355 .block_erase = erase_sector_jedec,
17356 }, {
17357 .eraseblocks = { {1024 * 1024, 1} },
17358 .block_erase = erase_chip_block_jedec,
17359 }
17360 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017361 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000017362 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000017363 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017364 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017365 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000017366 },
17367
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017368 {
17369 .vendor = "Winbond",
17370 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017371 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017372 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000017373 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017374 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000017375 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017376 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017377 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000017378 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017379 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017380 .block_erasers =
17381 {
17382 {
Stefan Tauner6697f712014-08-06 15:09:15 +000017383 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000017384 .block_erase = erase_sector_jedec,
17385 }, {
17386 .eraseblocks = { {512 * 1024, 1} },
17387 .block_erase = erase_chip_block_jedec,
17388 }
17389 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000017390 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000017391 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017392 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000017393 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000017394 },
nybashcbb46e22018-02-11 17:53:49 -080017395
17396 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100017397 .vendor = "Zetta Device",
17398 .name = "ZD25D20",
17399 .bustype = BUS_SPI,
17400 .manufacture_id = ZETTADEVICE_ID,
17401 .model_id = ZETTADEVICE_ZD25D20,
17402 .total_size = 256,
17403 .page_size = 256,
17404 .feature_bits = FEATURE_WRSR_WREN,
17405 .tested = TEST_UNTESTED,
17406 .probe = probe_spi_rdid,
17407 .probe_timing = TIMING_ZERO,
17408 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080017409 {
17410 {
17411 .eraseblocks = { {4 * 1024, 64} },
17412 .block_erase = spi_block_erase_20,
17413 }, {
17414 .eraseblocks = { {32 * 1024, 8} },
17415 .block_erase = spi_block_erase_52,
17416 }, {
17417 .eraseblocks = { {64 * 1024, 4} },
17418 .block_erase = spi_block_erase_d8,
17419 }, {
17420 .eraseblocks = { {256 * 1024, 1} },
17421 .block_erase = spi_block_erase_60,
17422 }, {
17423 .eraseblocks = { {256 * 1024, 1} },
17424 .block_erase = spi_block_erase_c7,
17425 }
17426 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100017427 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17428 .unlock = spi_disable_blockprotect,
17429 .write = spi_chip_write_256,
17430 .read = spi_chip_read,
17431 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080017432 },
17433
17434 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100017435 .vendor = "Zetta Device",
17436 .name = "ZD25D40",
17437 .bustype = BUS_SPI,
17438 .manufacture_id = ZETTADEVICE_ID,
17439 .model_id = ZETTADEVICE_ZD25D40,
17440 .total_size = 512,
17441 .page_size = 256,
17442 .feature_bits = FEATURE_WRSR_WREN,
17443 .tested = TEST_UNTESTED,
17444 .probe = probe_spi_rdid,
17445 .probe_timing = TIMING_ZERO,
17446 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080017447 {
17448 {
17449 .eraseblocks = { {4 * 1024, 128} },
17450 .block_erase = spi_block_erase_20,
17451 }, {
17452 .eraseblocks = { {32 * 1024, 16} },
17453 .block_erase = spi_block_erase_52,
17454 }, {
17455 .eraseblocks = { {64 * 1024, 8} },
17456 .block_erase = spi_block_erase_d8,
17457 }, {
17458 .eraseblocks = { {512 * 1024, 1} },
17459 .block_erase = spi_block_erase_60,
17460 }, {
17461 .eraseblocks = { {512 * 1024, 1} },
17462 .block_erase = spi_block_erase_c7,
17463 }
17464 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100017465 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17466 .unlock = spi_disable_blockprotect,
17467 .write = spi_chip_write_256,
17468 .read = spi_chip_read,
17469 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080017470 },
17471
Stefan Taunerac1b4c82012-02-17 14:51:04 +000017472 {
17473 .vendor = "Unknown",
17474 .name = "SFDP-capable chip",
17475 .bustype = BUS_SPI,
17476 .manufacture_id = GENERIC_MANUF_ID,
17477 .model_id = SFDP_DEVICE_ID,
17478 /* We present our own "report this" text hence we do not
17479 * want the default "This flash part has status UNTESTED..."
17480 * text to be printed. */
17481 .tested = TEST_OK_PREW,
17482 .probe = probe_spi_sfdp,
17483 .unlock = spi_disable_blockprotect, /* is this safe? */
17484 .read = spi_chip_read,
17485 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000017486 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000017487 /* Everything below will be set by the probing function. */
17488 .write = NULL,
17489 .total_size = 0,
17490 .page_size = 0,
17491 .feature_bits = 0,
17492 .block_erasers = {},
17493 },
FENG yu ningff692fb2008-12-08 18:15:10 +000017494
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017495 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000017496 .vendor = "Programmer",
17497 .name = "Opaque flash chip",
17498 .bustype = BUS_PROG,
17499 .manufacture_id = PROGMANUF_ID,
17500 .model_id = PROGDEV_ID,
17501 .total_size = 0,
17502 .page_size = 256,
17503 /* probe is assumed to work, rest will be filled in by probe */
17504 .tested = TEST_OK_PROBE,
17505 .probe = probe_opaque,
17506 /* eraseblock sizes will be set by the probing function */
17507 .block_erasers =
17508 {
17509 {
17510 .block_erase = erase_opaque,
17511 }
17512 },
17513 .write = write_opaque,
17514 .read = read_opaque,
17515 },
17516
17517 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000017518 .vendor = "AMIC",
17519 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017520 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000017521 .manufacture_id = AMIC_ID,
17522 .model_id = GENERIC_DEVICE_ID,
17523 .total_size = 0,
17524 .page_size = 256,
17525 .tested = TEST_BAD_PREW,
17526 .probe = probe_spi_rdid4,
17527 .probe_timing = TIMING_ZERO,
17528 .write = NULL,
17529 .read = NULL,
17530 },
17531
17532 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017533 .vendor = "Atmel",
17534 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017535 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017536 .manufacture_id = ATMEL_ID,
17537 .model_id = GENERIC_DEVICE_ID,
17538 .total_size = 0,
17539 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017540 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017541 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017542 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017543 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017544 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017545 },
17546
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017547 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000017548 .vendor = "Eon",
17549 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017550 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017551 .manufacture_id = EON_ID_NOPREFIX,
17552 .model_id = GENERIC_DEVICE_ID,
17553 .total_size = 0,
17554 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017555 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017556 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017557 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017558 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017559 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017560 },
17561
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017562 {
17563 .vendor = "Macronix",
17564 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017565 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000017566 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017567 .model_id = GENERIC_DEVICE_ID,
17568 .total_size = 0,
17569 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017570 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017571 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017572 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017573 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017574 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017575 },
17576
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017577 {
17578 .vendor = "PMC",
17579 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017580 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017581 .manufacture_id = PMC_ID,
17582 .model_id = GENERIC_DEVICE_ID,
17583 .total_size = 0,
17584 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017585 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017586 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017587 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017588 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017589 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017590 },
17591
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017592 {
17593 .vendor = "SST",
17594 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017595 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017596 .manufacture_id = SST_ID,
17597 .model_id = GENERIC_DEVICE_ID,
17598 .total_size = 0,
17599 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017600 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017601 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017602 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017603 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017604 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017605 },
17606
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017607 {
17608 .vendor = "ST",
17609 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017610 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017611 .manufacture_id = ST_ID,
17612 .model_id = GENERIC_DEVICE_ID,
17613 .total_size = 0,
17614 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000017615 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017616 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000017617 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017618 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017619 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000017620 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000017621
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017622 {
Sean Nelson118e1d62009-11-24 02:08:11 +000017623 .vendor = "Sanyo",
17624 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017625 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000017626 .manufacture_id = SANYO_ID,
17627 .model_id = GENERIC_DEVICE_ID,
17628 .total_size = 0,
17629 .page_size = 256,
17630 .tested = TEST_BAD_PREW,
17631 .probe = probe_spi_rdid,
17632 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000017633 .write = NULL,
17634 .read = NULL,
17635 },
17636
17637 {
Stefan Taunereb582572012-09-21 12:52:50 +000017638 .vendor = "Winbond",
17639 .name = "unknown Winbond (ex Nexcom) SPI chip",
17640 .bustype = BUS_SPI,
17641 .manufacture_id = WINBOND_NEX_ID,
17642 .model_id = GENERIC_DEVICE_ID,
17643 .total_size = 0,
17644 .page_size = 256,
17645 .tested = TEST_BAD_PREW,
17646 .probe = probe_spi_rdid,
17647 .probe_timing = TIMING_ZERO,
17648 .write = NULL,
17649 .read = NULL,
17650 },
17651
17652 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017653 .vendor = "Generic",
17654 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017655 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017656 .manufacture_id = GENERIC_MANUF_ID,
17657 .model_id = GENERIC_DEVICE_ID,
17658 .total_size = 0,
17659 .page_size = 256,
17660 .tested = TEST_BAD_PREW,
17661 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017662 .write = NULL,
17663 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000017664
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017665 {
17666 .vendor = "Generic",
17667 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017668 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017669 .manufacture_id = GENERIC_MANUF_ID,
17670 .model_id = GENERIC_DEVICE_ID,
17671 .total_size = 0,
17672 .page_size = 256,
17673 .tested = TEST_BAD_PREW,
17674 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000017675 .write = NULL,
17676 },
17677
Stefan Tauner96658be2014-05-26 22:05:31 +000017678 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000017679};
Stefan Tauner96658be2014-05-26 22:05:31 +000017680
17681const unsigned int flashchips_size = ARRAY_SIZE(flashchips);