blob: 46e88079516243916b5566157ae7d4972f15ab7a [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 *
Stefan Reinauerce532972007-05-23 17:20:56 +000020 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
Uwe Hermannd1107642007-08-29 17:52:32 +000022 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ollie Lho184a4042005-11-26 21:55:36 +000023 */
24
25#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000026#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000027#include "chipdrivers.h"
Ollie Lho184a4042005-11-26 21:55:36 +000028
Uwe Hermannfc425e82008-03-16 02:06:25 +000029/**
Uwe Hermanna9720402009-05-21 15:55:46 +000030 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000031 *
Stefan Tauner0554ca52013-07-25 22:54:25 +000032 * Please keep the list sorted by vendor name and chip family, so that the output of 'flashrom -L' is roughly
33 * alphabetically sorted. Within families keep them in order of density.
Uwe Hermannfc425e82008-03-16 02:06:25 +000034 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000035const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000036
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000037 /*
38 * .vendor = Vendor name
39 * .name = Chip name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000048 * .block_erasers[] = Array of erase layouts and erase functions
49 * {
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
52 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000053 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000055 * .write = Chip write function
56 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000057 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000058 */
59
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000060 {
61 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000062 .name = "Am29F010",
63 .bustype = BUS_PARALLEL,
64 .manufacture_id = AMD_ID,
65 .model_id = AMD_AM29F010,
66 .total_size = 128,
67 .page_size = 16 * 1024,
68 .feature_bits = FEATURE_SHORT_RESET,
69 .tested = TEST_UNTESTED,
70 .probe = probe_jedec,
71 .probe_timing = TIMING_ZERO,
72 .block_erasers =
73 {
74 {
75 .eraseblocks = { {16 * 1024, 8} },
76 .block_erase = erase_sector_jedec,
77 }, {
78 .eraseblocks = { {128 * 1024, 1} },
79 .block_erase = erase_chip_block_jedec,
80 },
81 },
82 .write = write_jedec_1,
83 .read = read_memmapped,
84 .voltage = {4500, 5500},
85 },
86
87 {
88 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000089 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000090 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000091 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000092 .model_id = AMD_AM29F010,
Uwe Hermanna8b37272009-06-19 15:54:39 +000093 .total_size = 128,
94 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000095 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +000096 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000097 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000098 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000099 .block_erasers =
100 {
101 {
102 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000103 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000104 }, {
105 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000106 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000107 },
108 },
Sean Nelson35727f72010-01-28 23:55:12 +0000109 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +0000110 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000111 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +0000112 },
113
114 {
115 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000116 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000117 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000118 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000119 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000120 .total_size = 256,
121 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000122 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 .tested = TEST_UNTESTED,
124 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000125 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000126 .block_erasers =
127 {
128 {
129 .eraseblocks = {
130 {16 * 1024, 1},
131 {8 * 1024, 2},
132 {32 * 1024, 1},
133 {64 * 1024, 3},
134 },
135 .block_erase = erase_sector_jedec,
136 }, {
137 .eraseblocks = { {256 * 1024, 1} },
138 .block_erase = erase_chip_block_jedec,
139 },
140 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000141 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000142 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000143 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000144 },
145
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000146 {
147 .vendor = "AMD",
148 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000149 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000150 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000151 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000152 .total_size = 256,
153 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000154 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
155 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000156 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000157 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000158 .block_erasers =
159 {
160 {
161 .eraseblocks = {
162 {64 * 1024, 3},
163 {32 * 1024, 1},
164 {8 * 1024, 2},
165 {16 * 1024, 1},
166 },
167 .block_erase = erase_sector_jedec,
168 }, {
169 .eraseblocks = { {256 * 1024, 1} },
170 .block_erase = erase_chip_block_jedec,
171 },
172 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000173 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000174 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000175 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000176 },
177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 {
179 .vendor = "AMD",
180 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000181 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000182 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000183 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000184 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000185 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000187 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000188 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000189 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000190 .block_erasers =
191 {
192 {
193 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000195 }, {
196 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000197 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000198 },
199 },
Sean Nelson35727f72010-01-28 23:55:12 +0000200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000201 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000202 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000203 },
204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000205 {
206 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000207 .name = "Am29F040",
208 .bustype = BUS_PARALLEL,
209 .manufacture_id = AMD_ID,
210 .model_id = AMD_AM29F040,
211 .total_size = 512,
212 .page_size = 64 * 1024,
213 .feature_bits = FEATURE_EITHER_RESET,
214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
216 .probe_timing = TIMING_ZERO,
217 .block_erasers =
218 {
219 {
220 .eraseblocks = { {64 * 1024, 8} },
221 .block_erase = erase_sector_jedec,
222 }, {
223 .eraseblocks = { {512 * 1024, 1} },
224 .block_erase = erase_chip_block_jedec,
225 },
226 },
227 .write = write_jedec_1,
228 .read = read_memmapped,
229 .voltage = {4500, 5500},
230 },
231
232 {
233 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000234 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000235 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000236 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000237 .model_id = AMD_AM29F040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000238 .total_size = 512,
239 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_UNTESTED,
242 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000243 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000244 .block_erasers =
245 {
246 {
247 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000248 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000249 }, {
250 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000251 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000252 },
253 },
Sean Nelson35727f72010-01-28 23:55:12 +0000254 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000255 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000256 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000257 },
258
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000259 {
260 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000261 .name = "Am29F080",
262 .bustype = BUS_PARALLEL,
263 .manufacture_id = AMD_ID,
264 .model_id = AMD_AM29F080,
265 .total_size = 1024,
266 .page_size = 64 * 1024,
267 .feature_bits = FEATURE_EITHER_RESET,
268 .tested = TEST_UNTESTED,
269 .probe = probe_jedec,
270 .probe_timing = TIMING_ZERO,
271 .block_erasers =
272 {
273 {
274 .eraseblocks = { {64 * 1024, 16} },
275 .block_erase = erase_sector_jedec,
276 }, {
277 .eraseblocks = { {1024 * 1024, 1} },
278 .block_erase = erase_chip_block_jedec,
279 },
280 },
281 .write = write_jedec_1,
282 .read = read_memmapped,
283 .voltage = {4500, 5500},
284 },
285
286 {
287 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000288 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000289 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000290 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000291 .model_id = AMD_AM29F080,
Peter Stuge8440cc02009-01-25 23:55:12 +0000292 .total_size = 1024,
293 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000294 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000295 .tested = TEST_UNTESTED,
296 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000297 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000298 .block_erasers =
299 {
300 {
301 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000302 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000303 }, {
304 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000305 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000306 },
307 },
Sean Nelson35727f72010-01-28 23:55:12 +0000308 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000309 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000310 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000311 },
312
313 {
314 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000315 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000316 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000317 .manufacture_id = AMD_ID,
318 .model_id = AMD_AM29LV001BB,
319 .total_size = 128,
320 .page_size = 64 * 1024, /* unused */
321 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
322 .tested = TEST_OK_PREW,
323 .probe = probe_jedec,
324 .probe_timing = TIMING_ZERO,
325 .block_erasers =
326 {
327 {
328 .eraseblocks = {
329 {8 * 1024, 1},
330 {4 * 1024, 2},
331 {16 * 1024, 7},
332 },
333 .block_erase = erase_sector_jedec,
334 }, {
335 .eraseblocks = { {128 * 1024, 1} },
336 .block_erase = erase_chip_block_jedec,
337 },
338 },
339 .write = write_jedec_1,
340 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000341 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000342 },
343
344 {
345 .vendor = "AMD",
346 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000347 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000348 .manufacture_id = AMD_ID,
349 .model_id = AMD_AM29LV001BT,
350 .total_size = 128,
351 .page_size = 64 * 1024, /* unused */
352 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
353 .tested = TEST_UNTESTED,
354 .probe = probe_jedec,
355 .probe_timing = TIMING_ZERO,
356 .block_erasers =
357 {
358 {
359 .eraseblocks = {
360 {16 * 1024, 7},
361 {4 * 1024, 2},
362 {8 * 1024, 1},
363 },
364 .block_erase = erase_sector_jedec,
365 }, {
366 .eraseblocks = { {128 * 1024, 1} },
367 .block_erase = erase_chip_block_jedec,
368 },
369 },
370 .write = write_jedec_1,
371 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000372 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000373 },
374
375 {
376 .vendor = "AMD",
377 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000378 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000379 .manufacture_id = AMD_ID,
380 .model_id = AMD_AM29LV002BB,
381 .total_size = 256,
382 .page_size = 64 * 1024, /* unused */
383 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
384 .tested = TEST_UNTESTED,
385 .probe = probe_jedec,
386 .probe_timing = TIMING_ZERO,
387 .block_erasers =
388 {
389 {
390 .eraseblocks = {
391 {16 * 1024, 1},
392 {8 * 1024, 2},
393 {32 * 1024, 1},
394 {64 * 1024, 3},
395 },
396 .block_erase = erase_sector_jedec,
397 }, {
398 .eraseblocks = { {256 * 1024, 1} },
399 .block_erase = erase_chip_block_jedec,
400 },
401 },
402 .write = write_jedec_1,
403 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000404 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000405 },
406
407 {
408 .vendor = "AMD",
409 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000410 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000411 .manufacture_id = AMD_ID,
412 .model_id = AMD_AM29LV002BT,
413 .total_size = 256,
414 .page_size = 64 * 1024, /* unused */
415 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
416 .tested = TEST_UNTESTED,
417 .probe = probe_jedec,
418 .probe_timing = TIMING_ZERO,
419 .block_erasers =
420 {
421 {
422 .eraseblocks = {
423 {64 * 1024, 3},
424 {32 * 1024, 1},
425 {8 * 1024, 2},
426 {16 * 1024, 1},
427 },
428 .block_erase = erase_sector_jedec,
429 }, {
430 .eraseblocks = { {256 * 1024, 1} },
431 .block_erase = erase_chip_block_jedec,
432 },
433 },
434 .write = write_jedec_1,
435 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000436 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000437 },
438
439 {
440 .vendor = "AMD",
441 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000442 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000443 .manufacture_id = AMD_ID,
444 .model_id = AMD_AM29LV004BB,
445 .total_size = 512,
446 .page_size = 64 * 1024, /* unused */
447 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
448 .tested = TEST_UNTESTED,
449 .probe = probe_jedec,
450 .probe_timing = TIMING_ZERO,
451 .block_erasers =
452 {
453 {
454 .eraseblocks = {
455 {16 * 1024, 1},
456 {8 * 1024, 2},
457 {32 * 1024, 1},
458 {64 * 1024, 7},
459 },
460 .block_erase = erase_sector_jedec,
461 }, {
462 .eraseblocks = { {512 * 1024, 1} },
463 .block_erase = erase_chip_block_jedec,
464 },
465 },
466 .write = write_jedec_1,
467 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000468 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000469 },
470
471 {
472 .vendor = "AMD",
473 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000474 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000475 .manufacture_id = AMD_ID,
476 .model_id = AMD_AM29LV004BT,
477 .total_size = 512,
478 .page_size = 64 * 1024, /* unused */
479 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
480 .tested = TEST_UNTESTED,
481 .probe = probe_jedec,
482 .probe_timing = TIMING_ZERO,
483 .block_erasers =
484 {
485 {
486 .eraseblocks = {
487 {64 * 1024, 7},
488 {32 * 1024, 1},
489 {8 * 1024, 2},
490 {16 * 1024, 1},
491 },
492 .block_erase = erase_sector_jedec,
493 }, {
494 .eraseblocks = { {512 * 1024, 1} },
495 .block_erase = erase_chip_block_jedec,
496 },
497 },
498 .write = write_jedec_1,
499 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000500 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000501 },
502
503 {
504 .vendor = "AMD",
505 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000506 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000507 .manufacture_id = AMD_ID,
508 .model_id = AMD_AM29LV008BB,
509 .total_size = 1024,
510 .page_size = 64 * 1024, /* unused */
511 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000512 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000513 .probe = probe_jedec,
514 .probe_timing = TIMING_ZERO,
515 .block_erasers =
516 {
517 {
518 .eraseblocks = {
519 {16 * 1024, 1},
520 {8 * 1024, 2},
521 {32 * 1024, 1},
522 {64 * 1024, 15},
523 },
524 .block_erase = erase_sector_jedec,
525 }, {
526 .eraseblocks = { {1024 * 1024, 1} },
527 .block_erase = erase_chip_block_jedec,
528 },
529 },
530 .write = write_jedec_1,
531 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000532 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000533 },
534
535 {
536 .vendor = "AMD",
537 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000538 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000539 .manufacture_id = AMD_ID,
540 .model_id = AMD_AM29LV008BT,
541 .total_size = 1024,
542 .page_size = 64 * 1024, /* unused */
543 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
544 .tested = TEST_UNTESTED,
545 .probe = probe_jedec,
546 .probe_timing = TIMING_ZERO,
547 .block_erasers =
548 {
549 {
550 .eraseblocks = {
551 {64 * 1024, 15},
552 {32 * 1024, 1},
553 {8 * 1024, 2},
554 {16 * 1024, 1},
555 },
556 .block_erase = erase_sector_jedec,
557 }, {
558 .eraseblocks = { {1024 * 1024, 1} },
559 .block_erase = erase_chip_block_jedec,
560 },
561 },
562 .write = write_jedec_1,
563 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000564 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000565 },
566
567 {
568 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000569 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000570 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000571 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000572 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000573 .total_size = 512,
574 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000575 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000576 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000577 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000578 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000579 .block_erasers =
580 {
581 {
582 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000583 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000584 }, {
585 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000586 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000587 },
588 },
Sean Nelson35727f72010-01-28 23:55:12 +0000589 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000590 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000591 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000592 },
593
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000594 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000595 .vendor = "AMD",
596 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000597 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000598 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000599 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000600 .total_size = 1024,
601 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000602 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000603 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000604 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000605 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000606 .block_erasers =
607 {
608 {
609 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000610 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000611 }, {
612 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000613 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000614 },
615 },
Sean Nelson35727f72010-01-28 23:55:12 +0000616 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000617 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000618 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000619 },
620
621 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000622 .vendor = "AMIC",
623 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000624 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000625 .manufacture_id = AMIC_ID,
626 .model_id = AMIC_A25L05PT,
627 .total_size = 64,
628 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000629 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000630 .tested = TEST_UNTESTED,
631 .probe = probe_spi_rdid4,
632 .probe_timing = TIMING_ZERO,
633 .block_erasers =
634 {
635 {
636 .eraseblocks = {
637 {32 * 1024, 1},
638 {16 * 1024, 1},
639 {8 * 1024, 1},
640 {4 * 1024, 2},
641 },
642 .block_erase = spi_block_erase_d8,
643 }, {
644 .eraseblocks = { {64 * 1024, 1} },
645 .block_erase = spi_block_erase_c7,
646 }
647 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000648 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000649 .unlock = spi_disable_blockprotect,
650 .write = spi_chip_write_256,
651 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000652 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000653 },
654
655 {
656 .vendor = "AMIC",
657 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000658 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000659 .manufacture_id = AMIC_ID,
660 .model_id = AMIC_A25L05PU,
661 .total_size = 64,
662 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000663 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000664 .tested = TEST_UNTESTED,
665 .probe = probe_spi_rdid4,
666 .probe_timing = TIMING_ZERO,
667 .block_erasers =
668 {
669 {
670 .eraseblocks = {
671 {4 * 1024, 2},
672 {8 * 1024, 1},
673 {16 * 1024, 1},
674 {32 * 1024, 1},
675 },
676 .block_erase = spi_block_erase_d8,
677 }, {
678 .eraseblocks = { {64 * 1024, 1} },
679 .block_erase = spi_block_erase_c7,
680 }
681 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000682 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000683 .unlock = spi_disable_blockprotect,
684 .write = spi_chip_write_256,
685 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000686 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000687 },
688
689 {
690 .vendor = "AMIC",
691 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000692 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000693 .manufacture_id = AMIC_ID,
694 .model_id = AMIC_A25L10PT,
695 .total_size = 128,
696 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000697 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000698 .tested = TEST_UNTESTED,
699 .probe = probe_spi_rdid4,
700 .probe_timing = TIMING_ZERO,
701 .block_erasers =
702 {
703 {
704 .eraseblocks = {
705 {64 * 1024, 1},
706 {32 * 1024, 1},
707 {16 * 1024, 1},
708 {8 * 1024, 1},
709 {4 * 1024, 2},
710 },
711 .block_erase = spi_block_erase_d8,
712 }, {
713 .eraseblocks = { {128 * 1024, 1} },
714 .block_erase = spi_block_erase_c7,
715 }
716 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000717 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000718 .unlock = spi_disable_blockprotect,
719 .write = spi_chip_write_256,
720 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000721 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000722 },
723
724 {
725 .vendor = "AMIC",
726 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000727 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000728 .manufacture_id = AMIC_ID,
729 .model_id = AMIC_A25L10PU,
730 .total_size = 128,
731 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000732 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000733 .tested = TEST_UNTESTED,
734 .probe = probe_spi_rdid4,
735 .probe_timing = TIMING_ZERO,
736 .block_erasers =
737 {
738 {
739 .eraseblocks = {
740 {4 * 1024, 2},
741 {8 * 1024, 1},
742 {16 * 1024, 1},
743 {32 * 1024, 1},
744 {64 * 1024, 1},
745 },
746 .block_erase = spi_block_erase_d8,
747 }, {
748 .eraseblocks = { {128 * 1024, 1} },
749 .block_erase = spi_block_erase_c7,
750 }
751 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000752 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000753 .unlock = spi_disable_blockprotect,
754 .write = spi_chip_write_256,
755 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000756 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000757 },
758
759 {
760 .vendor = "AMIC",
761 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000762 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000763 .manufacture_id = AMIC_ID,
764 .model_id = AMIC_A25L20PT,
765 .total_size = 256,
766 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000767 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000768 .tested = TEST_UNTESTED,
769 .probe = probe_spi_rdid4,
770 .probe_timing = TIMING_ZERO,
771 .block_erasers =
772 {
773 {
774 .eraseblocks = {
775 {64 * 1024, 3},
776 {32 * 1024, 1},
777 {16 * 1024, 1},
778 {8 * 1024, 1},
779 {4 * 1024, 2},
780 },
781 .block_erase = spi_block_erase_d8,
782 }, {
783 .eraseblocks = { {256 * 1024, 1} },
784 .block_erase = spi_block_erase_c7,
785 }
786 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000787 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000788 .unlock = spi_disable_blockprotect,
789 .write = spi_chip_write_256,
790 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000791 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000792 },
793
794 {
795 .vendor = "AMIC",
796 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000797 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000798 .manufacture_id = AMIC_ID,
799 .model_id = AMIC_A25L20PU,
800 .total_size = 256,
801 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000802 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000803 .tested = TEST_UNTESTED,
804 .probe = probe_spi_rdid4,
805 .probe_timing = TIMING_ZERO,
806 .block_erasers =
807 {
808 {
809 .eraseblocks = {
810 {4 * 1024, 2},
811 {8 * 1024, 1},
812 {16 * 1024, 1},
813 {32 * 1024, 1},
814 {64 * 1024, 3},
815 },
816 .block_erase = spi_block_erase_d8,
817 }, {
818 .eraseblocks = { {256 * 1024, 1} },
819 .block_erase = spi_block_erase_c7,
820 }
821 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000822 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000823 .unlock = spi_disable_blockprotect,
824 .write = spi_chip_write_256,
825 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000826 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000827 },
828
829 /* The A25L40P{T,U} chips are distinguished by their
830 * erase block layouts, but without any distinction in RDID.
831 * This inexplicable quirk was verified by Rudolf Marek
832 * and discussed on the flashrom mailing list on 2010-07-12.
833 */
834 {
835 .vendor = "AMIC",
836 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000837 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000838 .manufacture_id = AMIC_ID,
839 .model_id = AMIC_A25L40PT,
840 .total_size = 512,
841 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000842 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000843 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000844 .probe = probe_spi_rdid4,
845 .probe_timing = TIMING_ZERO,
846 .block_erasers =
847 {
848 {
849 .eraseblocks = {
850 {64 * 1024, 7},
851 {32 * 1024, 1},
852 {16 * 1024, 1},
853 {8 * 1024, 1},
854 {4 * 1024, 2},
855 },
856 .block_erase = spi_block_erase_d8,
857 }, {
858 .eraseblocks = { {512 * 1024, 1} },
859 .block_erase = spi_block_erase_c7,
860 }
861 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000862 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000863 .unlock = spi_disable_blockprotect,
864 .write = spi_chip_write_256,
865 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000866 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000867 },
868
869 {
870 .vendor = "AMIC",
871 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000872 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000873 .manufacture_id = AMIC_ID,
874 .model_id = AMIC_A25L40PU,
875 .total_size = 512,
876 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000877 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000878 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000879 .probe = probe_spi_rdid4,
880 .probe_timing = TIMING_ZERO,
881 .block_erasers =
882 {
883 {
884 .eraseblocks = {
885 {4 * 1024, 2},
886 {8 * 1024, 1},
887 {16 * 1024, 1},
888 {32 * 1024, 1},
889 {64 * 1024, 7},
890 },
891 .block_erase = spi_block_erase_d8,
892 }, {
893 .eraseblocks = { {512 * 1024, 1} },
894 .block_erase = spi_block_erase_c7,
895 }
896 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000897 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000898 .unlock = spi_disable_blockprotect,
899 .write = spi_chip_write_256,
900 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000901 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000902 },
903
904 {
905 .vendor = "AMIC",
906 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000907 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000908 .manufacture_id = AMIC_ID,
909 .model_id = AMIC_A25L80P,
910 .total_size = 1024,
911 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000912 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000913 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000914 .probe = probe_spi_rdid4,
915 .probe_timing = TIMING_ZERO,
916 .block_erasers =
917 {
918 {
919 .eraseblocks = {
920 {4 * 1024, 2},
921 {8 * 1024, 1},
922 {16 * 1024, 1},
923 {32 * 1024, 1},
924 {64 * 1024, 15},
925 },
926 .block_erase = spi_block_erase_d8,
927 }, {
928 .eraseblocks = { {1024 * 1024, 1} },
929 .block_erase = spi_block_erase_c7,
930 }
931 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000932 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000933 .unlock = spi_disable_blockprotect,
934 .write = spi_chip_write_256,
935 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000936 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000937 },
938
939 {
940 .vendor = "AMIC",
941 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000942 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000943 .manufacture_id = AMIC_ID,
944 .model_id = AMIC_A25L16PT,
945 .total_size = 2048,
946 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000947 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000948 .tested = TEST_UNTESTED,
949 .probe = probe_spi_rdid4,
950 .probe_timing = TIMING_ZERO,
951 .block_erasers =
952 {
953 {
954 .eraseblocks = {
955 {64 * 1024, 31},
956 {32 * 1024, 1},
957 {16 * 1024, 1},
958 {8 * 1024, 1},
959 {4 * 1024, 2},
960 },
961 .block_erase = spi_block_erase_d8,
962 }, {
963 .eraseblocks = { {2048 * 1024, 1} },
964 .block_erase = spi_block_erase_60,
965 }, {
966 .eraseblocks = { {2048 * 1024, 1} },
967 .block_erase = spi_block_erase_c7,
968 }
969 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000970 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000971 .unlock = spi_disable_blockprotect,
972 .write = spi_chip_write_256,
973 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000974 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000975 },
976
977 {
978 .vendor = "AMIC",
979 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000980 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000981 .manufacture_id = AMIC_ID,
982 .model_id = AMIC_A25L16PU,
983 .total_size = 2048,
984 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000985 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000986 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000987 .probe = probe_spi_rdid4,
988 .probe_timing = TIMING_ZERO,
989 .block_erasers =
990 {
991 {
992 .eraseblocks = {
993 {4 * 1024, 2},
994 {8 * 1024, 1},
995 {16 * 1024, 1},
996 {32 * 1024, 1},
997 {64 * 1024, 31},
998 },
999 .block_erase = spi_block_erase_d8,
1000 }, {
1001 .eraseblocks = { {2048 * 1024, 1} },
1002 .block_erase = spi_block_erase_60,
1003 }, {
1004 .eraseblocks = { {2048 * 1024, 1} },
1005 .block_erase = spi_block_erase_c7,
1006 }
1007 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001008 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001009 .unlock = spi_disable_blockprotect,
1010 .write = spi_chip_write_256,
1011 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001012 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001013 },
1014
1015 {
1016 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +00001017 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001018 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001019 .manufacture_id = AMIC_ID_NOPREFIX,
1020 .model_id = AMIC_A25L512,
1021 .total_size = 64,
1022 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001023 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001024 .tested = TEST_UNTESTED,
1025 .probe = probe_spi_rdid,
1026 .probe_timing = TIMING_ZERO,
1027 .block_erasers =
1028 {
1029 {
1030 .eraseblocks = { { 4 * 1024, 16 } },
1031 .block_erase = spi_block_erase_20,
1032 }, {
1033 .eraseblocks = { { 64 * 1024, 1 } },
1034 .block_erase = spi_block_erase_d8,
1035 }, {
1036 .eraseblocks = { { 64 * 1024, 1 } },
1037 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001038 }
Dan Lenski11617122010-07-29 15:00:40 +00001039 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001040 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001041 .unlock = spi_disable_blockprotect,
1042 .write = spi_chip_write_256,
1043 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001044 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001045 },
1046
1047 {
1048 .vendor = "AMIC",
1049 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001050 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001051 .manufacture_id = AMIC_ID_NOPREFIX,
1052 .model_id = AMIC_A25L010,
1053 .total_size = 128,
1054 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001055 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001056 .tested = TEST_UNTESTED,
1057 .probe = probe_spi_rdid,
1058 .probe_timing = TIMING_ZERO,
1059 .block_erasers =
1060 {
1061 {
1062 .eraseblocks = { { 4 * 1024, 32 } },
1063 .block_erase = spi_block_erase_20,
1064 }, {
1065 .eraseblocks = { { 64 * 1024, 2 } },
1066 .block_erase = spi_block_erase_d8,
1067 }, {
1068 .eraseblocks = { { 128 * 1024, 1 } },
1069 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001070 }
Dan Lenski11617122010-07-29 15:00:40 +00001071 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001072 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001073 .unlock = spi_disable_blockprotect,
1074 .write = spi_chip_write_256,
1075 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001076 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001077 },
1078
1079 {
1080 .vendor = "AMIC",
1081 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001082 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001083 .manufacture_id = AMIC_ID_NOPREFIX,
1084 .model_id = AMIC_A25L020,
1085 .total_size = 256,
1086 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001087 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001088 .tested = TEST_UNTESTED,
1089 .probe = probe_spi_rdid,
1090 .probe_timing = TIMING_ZERO,
1091 .block_erasers =
1092 {
1093 {
1094 .eraseblocks = { { 4 * 1024, 64 } },
1095 .block_erase = spi_block_erase_20,
1096 }, {
1097 .eraseblocks = { { 64 * 1024, 4 } },
1098 .block_erase = spi_block_erase_d8,
1099 }, {
1100 .eraseblocks = { { 256 * 1024, 1 } },
1101 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001102 }
Dan Lenski11617122010-07-29 15:00:40 +00001103 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001104 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001105 .unlock = spi_disable_blockprotect,
1106 .write = spi_chip_write_256,
1107 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001108 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001109 },
1110
1111 {
1112 .vendor = "AMIC",
1113 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001114 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001115 .manufacture_id = AMIC_ID_NOPREFIX,
1116 .model_id = AMIC_A25L040,
1117 .total_size = 512,
1118 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001119 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001120 .tested = TEST_UNTESTED,
1121 .probe = probe_spi_rdid,
1122 .probe_timing = TIMING_ZERO,
1123 .block_erasers =
1124 {
1125 {
1126 .eraseblocks = { { 4 * 1024, 128 } },
1127 .block_erase = spi_block_erase_20,
1128 }, {
1129 .eraseblocks = { { 64 * 1024, 8 } },
1130 .block_erase = spi_block_erase_d8,
1131 }, {
1132 .eraseblocks = { { 512 * 1024, 1 } },
1133 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001134 }
Dan Lenski11617122010-07-29 15:00:40 +00001135 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001136 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001137 .unlock = spi_disable_blockprotect,
1138 .write = spi_chip_write_256,
1139 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001140 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001141 },
1142
1143 {
1144 .vendor = "AMIC",
1145 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001146 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001147 .manufacture_id = AMIC_ID_NOPREFIX,
1148 .model_id = AMIC_A25L080,
1149 .total_size = 1024,
1150 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001151 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001152 .tested = TEST_UNTESTED,
1153 .probe = probe_spi_rdid,
1154 .probe_timing = TIMING_ZERO,
1155 .block_erasers =
1156 {
1157 {
1158 .eraseblocks = { { 4 * 1024, 256 } },
1159 .block_erase = spi_block_erase_20,
1160 }, {
1161 .eraseblocks = { { 64 * 1024, 16 } },
1162 .block_erase = spi_block_erase_d8,
1163 }, {
1164 .eraseblocks = { { 1024 * 1024, 1 } },
1165 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001166 }
Dan Lenski11617122010-07-29 15:00:40 +00001167 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001168 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001169 .unlock = spi_disable_blockprotect,
1170 .write = spi_chip_write_256,
1171 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001172 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001173 },
1174
1175 {
1176 .vendor = "AMIC",
1177 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001178 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001179 .manufacture_id = AMIC_ID_NOPREFIX,
1180 .model_id = AMIC_A25L016,
1181 .total_size = 2048,
1182 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001183 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001184 .tested = TEST_UNTESTED,
1185 .probe = probe_spi_rdid,
1186 .probe_timing = TIMING_ZERO,
1187 .block_erasers =
1188 {
1189 {
1190 .eraseblocks = { { 4 * 1024, 512 } },
1191 .block_erase = spi_block_erase_20,
1192 }, {
1193 .eraseblocks = { { 64 * 1024, 32 } },
1194 .block_erase = spi_block_erase_d8,
1195 }, {
1196 .eraseblocks = { { 2048 * 1024, 1 } },
1197 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001198 }
Dan Lenski11617122010-07-29 15:00:40 +00001199 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001200 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001201 .unlock = spi_disable_blockprotect,
1202 .write = spi_chip_write_256,
1203 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001204 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001205 },
1206
1207 {
1208 .vendor = "AMIC",
1209 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001210 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001211 .manufacture_id = AMIC_ID_NOPREFIX,
1212 .model_id = AMIC_A25L032,
1213 .total_size = 4096,
1214 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001215 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1216 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001217 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001218 .probe = probe_spi_rdid,
1219 .probe_timing = TIMING_ZERO,
1220 .block_erasers =
1221 {
1222 {
1223 .eraseblocks = { { 4 * 1024, 1024 } },
1224 .block_erase = spi_block_erase_20,
1225 }, {
1226 .eraseblocks = { { 64 * 1024, 64 } },
1227 .block_erase = spi_block_erase_52,
1228 }, {
1229 .eraseblocks = { { 64 * 1024, 64 } },
1230 .block_erase = spi_block_erase_d8,
1231 }, {
1232 .eraseblocks = { { 4096 * 1024, 1 } },
1233 .block_erase = spi_block_erase_60,
1234 }, {
1235 .eraseblocks = { { 4096 * 1024, 1 } },
1236 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001237 }
Dan Lenski11617122010-07-29 15:00:40 +00001238 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001239 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1240 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001241 .write = spi_chip_write_256,
1242 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001243 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001244 },
1245
1246 {
1247 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001248 .name = "A25LQ16",
1249 .bustype = BUS_SPI,
1250 .manufacture_id = AMIC_ID_NOPREFIX,
1251 .model_id = AMIC_A25LQ16,
1252 .total_size = 2048,
1253 .page_size = 256,
1254 /* supports SFDP */
1255 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1256 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1257 .tested = TEST_UNTESTED,
1258 .probe = probe_spi_rdid,
1259 .probe_timing = TIMING_ZERO,
1260 .block_erasers = {
1261 {
1262 .eraseblocks = { { 4 * 1024, 512 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 64 * 1024, 32 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 32 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 2048 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 2048 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
1276 }
1277 },
1278 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1279 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
1282 .voltage = {2700, 3600},
1283 },
1284
1285 {
1286 .vendor = "AMIC",
1287 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001288 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A25LQ032,
1291 .total_size = 4096,
1292 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001293 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001294 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1295 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001296 .tested = TEST_UNTESTED,
1297 .probe = probe_spi_rdid,
1298 .probe_timing = TIMING_ZERO,
1299 .block_erasers =
1300 {
1301 {
1302 .eraseblocks = { { 4 * 1024, 1024 } },
1303 .block_erase = spi_block_erase_20,
1304 }, {
1305 .eraseblocks = { { 64 * 1024, 64 } },
1306 .block_erase = spi_block_erase_52,
1307 }, {
1308 .eraseblocks = { { 64 * 1024, 64 } },
1309 .block_erase = spi_block_erase_d8,
1310 }, {
1311 .eraseblocks = { { 4096 * 1024, 1 } },
1312 .block_erase = spi_block_erase_60,
1313 }, {
1314 .eraseblocks = { { 4096 * 1024, 1 } },
1315 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001316 }
Dan Lenski11617122010-07-29 15:00:40 +00001317 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001318 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1319 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1320 .write = spi_chip_write_256,
1321 .read = spi_chip_read,
1322 .voltage = {2700, 3600},
1323 },
1324
1325 {
1326 .vendor = "AMIC",
1327 .name = "A25LQ64",
1328 .bustype = BUS_SPI,
1329 .manufacture_id = AMIC_ID_NOPREFIX,
Stefan Tauner23e10b82016-01-23 16:16:49 +00001330 .model_id = AMIC_A25LQ64,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001331 .total_size = 8192,
1332 .page_size = 256,
1333 /* supports SFDP */
1334 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1335 /* QPI enable 0x35, disable 0xF5 */
1336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1337 .tested = TEST_UNTESTED,
1338 .probe = probe_spi_rdid,
1339 .probe_timing = TIMING_ZERO,
1340 .block_erasers =
1341 {
1342 {
1343 .eraseblocks = { { 4 * 1024, 2048 } },
1344 .block_erase = spi_block_erase_20,
1345 }, {
1346 .eraseblocks = { { 32 * 1024, 256 } },
1347 .block_erase = spi_block_erase_52,
1348 }, {
1349 .eraseblocks = { { 64 * 1024, 128 } },
1350 .block_erase = spi_block_erase_d8,
1351 }, {
1352 .eraseblocks = { { 8192 * 1024, 1 } },
1353 .block_erase = spi_block_erase_60,
1354 }, {
1355 .eraseblocks = { { 8192 * 1024, 1 } },
1356 .block_erase = spi_block_erase_c7,
1357 }
1358 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001359 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001360 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001361 .write = spi_chip_write_256,
1362 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001363 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001364 },
1365
1366 {
1367 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001368 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001369 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001370 .manufacture_id = AMIC_ID_NOPREFIX,
1371 .model_id = AMIC_A29002B,
1372 .total_size = 256,
1373 .page_size = 64 * 1024,
1374 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1375 .tested = TEST_UNTESTED,
1376 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001377 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001378 .block_erasers =
1379 {
1380 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001381 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001382 {16 * 1024, 1},
1383 {8 * 1024, 2},
1384 {32 * 1024, 1},
1385 {64 * 1024, 3},
1386 },
1387 .block_erase = erase_sector_jedec,
1388 }, {
1389 .eraseblocks = { {256 * 1024, 1} },
1390 .block_erase = erase_chip_block_jedec,
1391 },
1392 },
1393 .write = write_jedec_1,
1394 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001395 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001396 },
1397
1398 {
1399 .vendor = "AMIC",
1400 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001401 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 .manufacture_id = AMIC_ID_NOPREFIX,
1403 .model_id = AMIC_A29002T,
1404 .total_size = 256,
1405 .page_size = 64 * 1024,
1406 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001407 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001408 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001409 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001410 .block_erasers =
1411 {
1412 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001413 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001414 {64 * 1024, 3},
1415 {32 * 1024, 1},
1416 {8 * 1024, 2},
1417 {16 * 1024, 1},
1418 },
1419 .block_erase = erase_sector_jedec,
1420 }, {
1421 .eraseblocks = { {256 * 1024, 1} },
1422 .block_erase = erase_chip_block_jedec,
1423 },
1424 },
1425 .write = write_jedec_1,
1426 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001427 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001428 },
1429
1430 {
1431 .vendor = "AMIC",
1432 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001433 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001434 .manufacture_id = AMIC_ID_NOPREFIX,
1435 .model_id = AMIC_A29040B,
1436 .total_size = 512,
1437 .page_size = 64 * 1024,
1438 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001439 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001440 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001441 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001442 .block_erasers =
1443 {
1444 {
1445 .eraseblocks = { {64 * 1024, 8} },
1446 .block_erase = erase_sector_jedec,
1447 }, {
1448 .eraseblocks = { {512 * 1024, 1} },
1449 .block_erase = erase_chip_block_jedec,
1450 },
1451 },
1452 .write = write_jedec_1,
1453 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001454 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001455 },
1456
1457 {
1458 .vendor = "AMIC",
1459 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001460 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001461 .manufacture_id = AMIC_ID_NOPREFIX,
1462 .model_id = AMIC_A49LF040A,
1463 .total_size = 512,
1464 .page_size = 64 * 1024,
1465 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001466 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001467 .probe = probe_jedec,
1468 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1469 .block_erasers =
1470 {
1471 {
1472 .eraseblocks = { {64 * 1024, 8} },
1473 .block_erase = erase_block_jedec,
1474 }, {
1475 .eraseblocks = { {512 * 1024, 1} },
1476 .block_erase = erase_chip_block_jedec,
1477 }
1478 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001479 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001480 .write = write_jedec_1,
1481 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001482 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001483 },
1484
1485 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001486 .vendor = "Atmel",
1487 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001488 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001489 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001490 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001491 .total_size = 256,
1492 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001493 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001495 .tested = TEST_UNTESTED,
1496 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001497 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001498 .block_erasers =
1499 {
1500 {
1501 .eraseblocks = { {4 * 1024, 64} },
1502 .block_erase = spi_block_erase_20,
1503 }, {
1504 .eraseblocks = { {32 * 1024, 8} },
1505 .block_erase = spi_block_erase_52,
1506 }, {
1507 .eraseblocks = { {64 * 1024, 4} },
1508 .block_erase = spi_block_erase_d8,
1509 }, {
1510 .eraseblocks = { {256 * 1024, 1} },
1511 .block_erase = spi_block_erase_60,
1512 }, {
1513 .eraseblocks = { {256 * 1024, 1} },
1514 .block_erase = spi_block_erase_c7,
1515 }
1516 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001518 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001519 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001520 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001521 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001522 },
1523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001524 {
1525 .vendor = "Atmel",
1526 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001527 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001528 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001529 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001530 .total_size = 512,
1531 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001532 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001533 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001534 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001535 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001536 .block_erasers =
1537 {
1538 {
1539 .eraseblocks = { {4 * 1024, 128} },
1540 .block_erase = spi_block_erase_20,
1541 }, {
1542 .eraseblocks = { {32 * 1024, 16} },
1543 .block_erase = spi_block_erase_52,
1544 }, {
1545 .eraseblocks = { {64 * 1024, 8} },
1546 .block_erase = spi_block_erase_d8,
1547 }, {
1548 .eraseblocks = { {512 * 1024, 1} },
1549 .block_erase = spi_block_erase_60,
1550 }, {
1551 .eraseblocks = { {512 * 1024, 1} },
1552 .block_erase = spi_block_erase_c7,
1553 }
1554 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001555 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001556 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001557 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001558 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001559 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001560 },
1561
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001562 {
1563 .vendor = "Atmel",
1564 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001565 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001566 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001567 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001568 .total_size = 1024,
1569 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001570 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001571 .tested = TEST_UNTESTED,
1572 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001573 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001574 .block_erasers =
1575 {
1576 {
1577 .eraseblocks = { {4 * 1024, 256} },
1578 .block_erase = spi_block_erase_20,
1579 }, {
1580 .eraseblocks = { {32 * 1024, 32} },
1581 .block_erase = spi_block_erase_52,
1582 }, {
1583 .eraseblocks = { {64 * 1024, 16} },
1584 .block_erase = spi_block_erase_d8,
1585 }, {
1586 .eraseblocks = { {1024 * 1024, 1} },
1587 .block_erase = spi_block_erase_60,
1588 }, {
1589 .eraseblocks = { {1024 * 1024, 1} },
1590 .block_erase = spi_block_erase_c7,
1591 }
1592 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001593 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001594 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001595 .write = spi_chip_write_256,
1596 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001597 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001598 },
1599
1600 {
1601 .vendor = "Atmel",
1602 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001603 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001604 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001605 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001606 .total_size = 1024,
1607 .page_size = 256,
1608 .feature_bits = FEATURE_WRSR_WREN,
1609 .tested = TEST_UNTESTED,
1610 .probe = probe_spi_rdid,
1611 .probe_timing = TIMING_ZERO,
1612 .block_erasers =
1613 {
1614 {
1615 .eraseblocks = { {4 * 1024, 256} },
1616 .block_erase = spi_block_erase_20,
1617 }, {
1618 .eraseblocks = { {32 * 1024, 32} },
1619 .block_erase = spi_block_erase_52,
1620 }, {
1621 .eraseblocks = { {64 * 1024, 16} },
1622 .block_erase = spi_block_erase_d8,
1623 }, {
1624 .eraseblocks = { {1024 * 1024, 1} },
1625 .block_erase = spi_block_erase_60,
1626 }, {
1627 .eraseblocks = { {1024 * 1024, 1} },
1628 .block_erase = spi_block_erase_c7,
1629 }
1630 },
1631 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001632 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001633 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001634 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001635 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001636 },
1637
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001638 {
1639 .vendor = "Atmel",
1640 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001641 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001642 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001643 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .total_size = 2048,
1645 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001646 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner2abab942012-04-27 20:41:23 +00001647 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001648 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001649 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001650 .block_erasers =
1651 {
1652 {
1653 .eraseblocks = { {4 * 1024, 512} },
1654 .block_erase = spi_block_erase_20,
1655 }, {
1656 .eraseblocks = { {32 * 1024, 64} },
1657 .block_erase = spi_block_erase_52,
1658 }, {
1659 .eraseblocks = { {64 * 1024, 32} },
1660 .block_erase = spi_block_erase_d8,
1661 }, {
1662 .eraseblocks = { {2 * 1024 * 1024, 1} },
1663 .block_erase = spi_block_erase_60,
1664 }, {
1665 .eraseblocks = { {2 * 1024 * 1024, 1} },
1666 .block_erase = spi_block_erase_c7,
1667 }
1668 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001669 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001670 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001671 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001672 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001673 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001674 },
1675
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001676 {
1677 .vendor = "Atmel",
1678 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001679 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001680 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001681 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001682 .total_size = 4096,
1683 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001684 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001685 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001686 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001687 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001688 .block_erasers =
1689 {
1690 {
1691 .eraseblocks = { {4 * 1024, 1024} },
1692 .block_erase = spi_block_erase_20,
1693 }, {
1694 .eraseblocks = { {32 * 1024, 128} },
1695 .block_erase = spi_block_erase_52,
1696 }, {
1697 .eraseblocks = { {64 * 1024, 64} },
1698 .block_erase = spi_block_erase_d8,
1699 }, {
1700 .eraseblocks = { {4 * 1024 * 1024, 1} },
1701 .block_erase = spi_block_erase_60,
1702 }, {
1703 .eraseblocks = { {4 * 1024 * 1024, 1} },
1704 .block_erase = spi_block_erase_c7,
1705 }
1706 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001707 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001708 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001709 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001710 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001711 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001712 },
1713
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001714 {
1715 .vendor = "Atmel",
1716 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001717 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001718 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001719 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001720 .total_size = 4096,
1721 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001722 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1723 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001724 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001725 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001726 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001727 .block_erasers =
1728 {
1729 {
1730 .eraseblocks = { {4 * 1024, 1024} },
1731 .block_erase = spi_block_erase_20,
1732 }, {
1733 .eraseblocks = { {32 * 1024, 128} },
1734 .block_erase = spi_block_erase_52,
1735 }, {
1736 .eraseblocks = { {64 * 1024, 64} },
1737 .block_erase = spi_block_erase_d8,
1738 }, {
1739 .eraseblocks = { {4 * 1024 * 1024, 1} },
1740 .block_erase = spi_block_erase_60,
1741 }, {
1742 .eraseblocks = { {4 * 1024 * 1024, 1} },
1743 .block_erase = spi_block_erase_c7,
1744 }
1745 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001746 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001747 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001748 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001749 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001750 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001751 },
1752
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001753 {
1754 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001755 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001756 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001757 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001758 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001759 .total_size = 8192,
1760 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001761 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001762 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001763 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001764 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001765 .block_erasers =
1766 {
1767 {
1768 .eraseblocks = { {4 * 1024, 2048} },
1769 .block_erase = spi_block_erase_20,
1770 }, {
1771 .eraseblocks = { {32 * 1024, 256} },
1772 .block_erase = spi_block_erase_52,
1773 }, {
1774 .eraseblocks = { {64 * 1024, 128} },
1775 .block_erase = spi_block_erase_d8,
1776 }, {
1777 .eraseblocks = { {8 * 1024 * 1024, 1} },
1778 .block_erase = spi_block_erase_60,
1779 }, {
1780 .eraseblocks = { {8 * 1024 * 1024, 1} },
1781 .block_erase = spi_block_erase_c7,
1782 }
1783 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001784 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001785 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001786 .write = spi_chip_write_256,
1787 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001788 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001789 },
1790
1791 {
1792 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001793 .name = "AT25DL081",
1794 .bustype = BUS_SPI,
1795 .manufacture_id = ATMEL_ID,
1796 .model_id = ATMEL_AT25DF081,
1797 .total_size = 1024,
1798 .page_size = 256,
1799 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1800 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1801 .tested = TEST_UNTESTED,
1802 .probe = probe_spi_rdid,
1803 .probe_timing = TIMING_ZERO,
1804 .block_erasers =
1805 {
1806 {
1807 .eraseblocks = { {4 * 1024, 256} },
1808 .block_erase = spi_block_erase_20,
1809 }, {
1810 .eraseblocks = { {32 * 1024, 32} },
1811 .block_erase = spi_block_erase_52,
1812 }, {
1813 .eraseblocks = { {64 * 1024, 16} },
1814 .block_erase = spi_block_erase_d8,
1815 }, {
1816 .eraseblocks = { {1 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_60,
1818 }, {
1819 .eraseblocks = { {1 * 1024 * 1024, 1} },
1820 .block_erase = spi_block_erase_c7,
1821 }
1822 },
1823 .printlock = spi_prettyprint_status_register_at25df_sec,
1824 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1825 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1826 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1827 .voltage = {1650, 1950},
1828 },
1829
1830 {
1831 .vendor = "Atmel",
1832 .name = "AT25DL161",
1833 .bustype = BUS_SPI,
1834 .manufacture_id = ATMEL_ID,
1835 .model_id = ATMEL_AT25DL161,
1836 .total_size = 2048,
1837 .page_size = 256,
1838 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1839 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1840 .tested = TEST_UNTESTED,
1841 .probe = probe_spi_rdid,
1842 .probe_timing = TIMING_ZERO,
1843 .block_erasers =
1844 {
1845 {
1846 .eraseblocks = { {4 * 1024, 512} },
1847 .block_erase = spi_block_erase_20,
1848 }, {
1849 .eraseblocks = { {32 * 1024, 64} },
1850 .block_erase = spi_block_erase_52,
1851 }, {
1852 .eraseblocks = { {64 * 1024, 32} },
1853 .block_erase = spi_block_erase_d8,
1854 }, {
1855 .eraseblocks = { {2 * 1024 * 1024, 1} },
1856 .block_erase = spi_block_erase_60,
1857 }, {
1858 .eraseblocks = { {2 * 1024 * 1024, 1} },
1859 .block_erase = spi_block_erase_c7,
1860 }
1861 },
1862 .printlock = spi_prettyprint_status_register_at25df_sec,
1863 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1864 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1865 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1866 .voltage = {1650, 1950},
1867 },
1868
1869 {
1870 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001871 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001872 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001873 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001874 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001875 .total_size = 2048,
1876 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001877 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1878 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001879 .tested = TEST_UNTESTED,
1880 .probe = probe_spi_rdid,
1881 .probe_timing = TIMING_ZERO,
1882 .block_erasers =
1883 {
1884 {
1885 .eraseblocks = { {4 * 1024, 512} },
1886 .block_erase = spi_block_erase_20,
1887 }, {
1888 .eraseblocks = { {32 * 1024, 64} },
1889 .block_erase = spi_block_erase_52,
1890 }, {
1891 .eraseblocks = { {64 * 1024, 32} },
1892 .block_erase = spi_block_erase_d8,
1893 }, {
1894 .eraseblocks = { {2 * 1024 * 1024, 1} },
1895 .block_erase = spi_block_erase_60,
1896 }, {
1897 .eraseblocks = { {2 * 1024 * 1024, 1} },
1898 .block_erase = spi_block_erase_c7,
1899 }
1900 },
1901 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001902 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001903 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001904 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001905 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001906 },
1907
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001908 {
1909 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001910 .name = "AT25F512",
1911 .bustype = BUS_SPI,
1912 .manufacture_id = ATMEL_ID,
1913 .model_id = ATMEL_AT25F512,
1914 .total_size = 64,
1915 .page_size = 256,
1916 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001917 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001918 .probe = probe_spi_at25f,
1919 .probe_timing = TIMING_ZERO,
1920 .block_erasers =
1921 {
1922 {
1923 .eraseblocks = { {32 * 1024, 2} },
1924 .block_erase = spi_block_erase_52,
1925 }, {
1926 .eraseblocks = { {64 * 1024, 1} },
1927 .block_erase = spi_block_erase_62,
1928 }
1929 },
1930 .printlock = spi_prettyprint_status_register_at25f,
1931 .unlock = spi_disable_blockprotect_at25f,
1932 .write = spi_chip_write_256,
1933 .read = spi_chip_read,
1934 .voltage = {2700, 3600},
1935 },
1936
1937 {
1938 .vendor = "Atmel",
1939 .name = "AT25F512A",
1940 .bustype = BUS_SPI,
1941 .manufacture_id = ATMEL_ID,
1942 .model_id = ATMEL_AT25F512A,
1943 .total_size = 64,
1944 .page_size = 128,
1945 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001946 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001947 .probe = probe_spi_at25f,
1948 .probe_timing = TIMING_ZERO,
1949 .block_erasers =
1950 {
1951 {
1952 .eraseblocks = { {32 * 1024, 2} },
1953 .block_erase = spi_block_erase_52,
1954 }, {
1955 .eraseblocks = { {64 * 1024, 1} },
1956 .block_erase = spi_block_erase_62,
1957 }
1958 },
1959 .printlock = spi_prettyprint_status_register_at25f512a,
1960 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1961 .unlock = spi_disable_blockprotect_at25f512a,
1962 .write = spi_chip_write_256,
1963 .read = spi_chip_read,
1964 .voltage = {2700, 3600},
1965 },
1966
1967 {
1968 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001969 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001970 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001971 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001972 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001973 .total_size = 64,
1974 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001975 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1976 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001977 .tested = TEST_UNTESTED,
1978 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001979 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001980 .block_erasers =
1981 {
1982 {
1983 .eraseblocks = { {4 * 1024, 16} },
1984 .block_erase = spi_block_erase_20,
1985 }, {
1986 .eraseblocks = { {32 * 1024, 2} },
1987 .block_erase = spi_block_erase_52,
1988 }, {
1989 .eraseblocks = { {32 * 1024, 2} },
1990 .block_erase = spi_block_erase_d8,
1991 }, {
1992 .eraseblocks = { {64 * 1024, 1} },
1993 .block_erase = spi_block_erase_60,
1994 }, {
1995 .eraseblocks = { {64 * 1024, 1} },
1996 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001997 }, {
1998 .eraseblocks = { {64 * 1024, 1} },
1999 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002000 }
2001 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002002 .printlock = spi_prettyprint_status_register_at25f512b,
2003 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002004 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002005 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002006 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002007 },
2008
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002009 {
2010 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002011 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
2012 * All other properties seem to be the same.*/
2013 .name = "AT25F1024(A)",
2014 .bustype = BUS_SPI,
2015 .manufacture_id = ATMEL_ID,
2016 .model_id = ATMEL_AT25F1024,
2017 .total_size = 128,
2018 .page_size = 256,
2019 .feature_bits = FEATURE_WRSR_WREN,
2020 .tested = TEST_OK_PREW,
2021 .probe = probe_spi_at25f,
2022 .probe_timing = TIMING_ZERO,
2023 .block_erasers =
2024 {
2025 {
2026 .eraseblocks = { {32 * 1024, 4} },
2027 .block_erase = spi_block_erase_52,
2028 }, {
2029 .eraseblocks = { {128 * 1024, 1} },
2030 .block_erase = spi_block_erase_62,
2031 }
2032 },
2033 .printlock = spi_prettyprint_status_register_at25f,
2034 .unlock = spi_disable_blockprotect_at25f,
2035 .write = spi_chip_write_256,
2036 .read = spi_chip_read,
2037 .voltage = {2700, 3600},
2038 },
2039
2040 {
2041 .vendor = "Atmel",
2042 .name = "AT25F2048",
2043 .bustype = BUS_SPI,
2044 .manufacture_id = ATMEL_ID,
2045 .model_id = ATMEL_AT25F2048,
2046 .total_size = 256,
2047 .page_size = 256,
2048 .feature_bits = FEATURE_WRSR_WREN,
2049 .tested = TEST_UNTESTED,
2050 .probe = probe_spi_at25f,
2051 .probe_timing = TIMING_ZERO,
2052 .block_erasers =
2053 {
2054 {
2055 .eraseblocks = { {64 * 1024, 4} },
2056 .block_erase = spi_block_erase_52,
2057 }, {
2058 .eraseblocks = { {256 * 1024, 1} },
2059 .block_erase = spi_block_erase_62,
2060 }
2061 },
2062 .printlock = spi_prettyprint_status_register_at25f,
2063 .unlock = spi_disable_blockprotect_at25f,
2064 .write = spi_chip_write_256,
2065 .read = spi_chip_read,
2066 .voltage = {2700, 3600},
2067 },
2068
2069 {
2070 .vendor = "Atmel",
2071 .name = "AT25F4096",
2072 .bustype = BUS_SPI,
2073 .manufacture_id = ATMEL_ID,
2074 .model_id = ATMEL_AT25F4096,
2075 .total_size = 512,
2076 .page_size = 256,
2077 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner6697f712014-08-06 15:09:15 +00002078 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002079 .probe = probe_spi_at25f,
2080 .probe_timing = TIMING_ZERO,
2081 .block_erasers =
2082 {
2083 {
2084 .eraseblocks = { {64 * 1024, 8} },
2085 .block_erase = spi_block_erase_52,
2086 }, {
2087 .eraseblocks = { {512 * 1024, 1} },
2088 .block_erase = spi_block_erase_62,
2089 }
2090 },
2091 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002092 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2093 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002094 .write = spi_chip_write_256,
2095 .read = spi_chip_read,
2096 .voltage = {2700, 3600},
2097 },
2098
2099 {
2100 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002101 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002102 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002103 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002104 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002105 .total_size = 128,
2106 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002107 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002108 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002109 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002110 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002111 .block_erasers =
2112 {
2113 {
2114 .eraseblocks = { {4 * 1024, 32} },
2115 .block_erase = spi_block_erase_20,
2116 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002117 .eraseblocks = { {4 * 1024, 32} },
2118 .block_erase = spi_block_erase_d7,
2119 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002120 .eraseblocks = { {32 * 1024, 4} },
2121 .block_erase = spi_block_erase_52,
2122 }, {
2123 .eraseblocks = { {32 * 1024, 4} },
2124 .block_erase = spi_block_erase_d8,
2125 }, {
2126 .eraseblocks = { {128 * 1024, 1} },
2127 .block_erase = spi_block_erase_60,
2128 }, {
2129 .eraseblocks = { {128 * 1024, 1} },
2130 .block_erase = spi_block_erase_c7,
2131 }
2132 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002133 .printlock = spi_prettyprint_status_register_at25fs010,
2134 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002135 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002136 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002137 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002138 },
2139
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002140 {
2141 .vendor = "Atmel",
2142 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002143 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002144 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002145 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002146 .total_size = 512,
2147 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002148 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002149 .tested = TEST_UNTESTED,
2150 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002151 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002152 .block_erasers =
2153 {
2154 {
2155 .eraseblocks = { {4 * 1024, 128} },
2156 .block_erase = spi_block_erase_20,
2157 }, {
2158 .eraseblocks = { {64 * 1024, 8} },
2159 .block_erase = spi_block_erase_52,
2160 }, {
2161 .eraseblocks = { {64 * 1024, 8} },
2162 .block_erase = spi_block_erase_d8,
2163 }, {
2164 .eraseblocks = { {512 * 1024, 1} },
2165 .block_erase = spi_block_erase_60,
2166 }, {
2167 .eraseblocks = { {512 * 1024, 1} },
2168 .block_erase = spi_block_erase_c7,
2169 }
2170 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002171 .printlock = spi_prettyprint_status_register_at25fs040,
2172 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002173 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002174 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002175 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002176 },
2177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002178 {
2179 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002180 .name = "AT25SF041",
2181 .bustype = BUS_SPI,
2182 .manufacture_id = ATMEL_ID,
2183 .model_id = ATMEL_AT25SF041,
2184 .total_size = 512,
2185 .page_size = 256,
2186 .feature_bits = FEATURE_WRSR_WREN,
2187 .tested = TEST_OK_PREW,
2188 .probe = probe_spi_rdid,
2189 .probe_timing = TIMING_ZERO,
2190 .block_erasers =
2191 {
2192 {
2193 .eraseblocks = { {4 * 1024, 128} },
2194 .block_erase = spi_block_erase_20,
2195 }, {
2196 .eraseblocks = { {32 * 1024, 16} },
2197 .block_erase = spi_block_erase_52,
2198 }, {
2199 .eraseblocks = { {64 * 1024, 8} },
2200 .block_erase = spi_block_erase_d8,
2201 }, {
2202 .eraseblocks = { {512 * 1024, 1} },
2203 .block_erase = spi_block_erase_60,
2204 }, {
2205 .eraseblocks = { {512 * 1024, 1} },
2206 .block_erase = spi_block_erase_c7,
2207 }
2208 },
2209 .printlock = spi_prettyprint_status_register_plain,
2210 .unlock = spi_disable_blockprotect,
2211 .write = spi_chip_write_256,
2212 .read = spi_chip_read,
2213 .voltage = {2500, 3600},
2214 },
2215
2216 {
2217 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002218 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002219 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002220 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002221 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002222 .total_size = 512,
2223 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002224 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002225 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002226 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002227 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002228 .block_erasers =
2229 {
2230 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002231 .eraseblocks = { {256, 2048} },
2232 .block_erase = spi_block_erase_81,
2233 }, {
2234 .eraseblocks = { {2 * 1024, 256} },
2235 .block_erase = spi_block_erase_50,
2236 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002237 .eraseblocks = { {4 * 1024, 128} },
2238 .block_erase = spi_block_erase_20,
2239 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002240 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002241 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002242 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002243 .write = spi_chip_write_1,
2244 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002245 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002246 },
2247
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002248 {
2249 .vendor = "Atmel",
2250 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002251 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002252 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002253 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002254 .total_size = 1024,
2255 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002256 .feature_bits = FEATURE_WRSR_WREN,
2257 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002258 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002259 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002260 .block_erasers =
2261 {
2262 {
2263 .eraseblocks = { {4 * 1024, 256} },
2264 .block_erase = spi_block_erase_20,
2265 }, {
2266 .eraseblocks = { {32 * 1024, 32} },
2267 .block_erase = spi_block_erase_52,
2268 }, {
2269 .eraseblocks = { {64 * 1024, 16} },
2270 .block_erase = spi_block_erase_d8,
2271 }, {
2272 .eraseblocks = { {1024 * 1024, 1} },
2273 .block_erase = spi_block_erase_60,
2274 }, {
2275 .eraseblocks = { {1024 * 1024, 1} },
2276 .block_erase = spi_block_erase_c7,
2277 }
2278 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002279 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002280 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002281 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002282 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002283 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002284 },
2285
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002286 {
2287 .vendor = "Atmel",
2288 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002289 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002290 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002291 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002292 .total_size = 2048,
2293 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002294 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002295 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002296 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002297 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002298 .block_erasers =
2299 {
2300 {
2301 .eraseblocks = { {4 * 1024, 512} },
2302 .block_erase = spi_block_erase_20,
2303 }, {
2304 .eraseblocks = { {32 * 1024, 64} },
2305 .block_erase = spi_block_erase_52,
2306 }, {
2307 .eraseblocks = { {64 * 1024, 32} },
2308 .block_erase = spi_block_erase_d8,
2309 }, {
2310 .eraseblocks = { {2 * 1024 * 1024, 1} },
2311 .block_erase = spi_block_erase_60,
2312 }, {
2313 .eraseblocks = { {2 * 1024 * 1024, 1} },
2314 .block_erase = spi_block_erase_c7,
2315 }
2316 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002317 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002318 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002319 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002320 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002321 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002322 },
2323
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002324 {
2325 .vendor = "Atmel",
2326 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002327 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002328 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002329 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002330 .total_size = 2048,
2331 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002332 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002333 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002334 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002335 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002336 .block_erasers =
2337 {
2338 {
2339 .eraseblocks = { {4 * 1024, 512} },
2340 .block_erase = spi_block_erase_20,
2341 }, {
2342 .eraseblocks = { {32 * 1024, 64} },
2343 .block_erase = spi_block_erase_52,
2344 }, {
2345 .eraseblocks = { {64 * 1024, 32} },
2346 .block_erase = spi_block_erase_d8,
2347 }, {
2348 .eraseblocks = { {2 * 1024 * 1024, 1} },
2349 .block_erase = spi_block_erase_60,
2350 }, {
2351 .eraseblocks = { {2 * 1024 * 1024, 1} },
2352 .block_erase = spi_block_erase_c7,
2353 }
2354 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002355 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002356 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002357 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002358 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002359 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002360 },
2361
2362 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002363 /*{
2364 .vendor = "Atmel",
2365 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002366 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002367 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002368 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002369 .total_size = 4096,
2370 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002371 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002372 .tested = TEST_UNTESTED,
2373 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002374 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002375 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002376 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002377 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002378 .read = spi_chip_read,
2379 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002380
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002381 {
2382 .vendor = "Atmel",
2383 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002384 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002385 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002386 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002387 .total_size = 512,
2388 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002389 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002390 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002391 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002392 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002393 .block_erasers =
2394 {
2395 {
2396 .eraseblocks = { {4 * 1024, 128} },
2397 .block_erase = spi_block_erase_20,
2398 }, {
2399 .eraseblocks = { {32 * 1024, 16} },
2400 .block_erase = spi_block_erase_52,
2401 }, {
2402 .eraseblocks = { {64 * 1024, 8} },
2403 .block_erase = spi_block_erase_d8,
2404 }, {
2405 .eraseblocks = { {512 * 1024, 1} },
2406 .block_erase = spi_block_erase_60,
2407 }, {
2408 .eraseblocks = { {512 * 1024, 1} },
2409 .block_erase = spi_block_erase_c7,
2410 }
2411 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002412 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002413 .write = NULL /* Incompatible Page write */,
2414 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002415 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002416 },
2417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002418 {
2419 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002420 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002421 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002422 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002423 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002424 .total_size = 64,
2425 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002426 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002427 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002428 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002429 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002430 .block_erasers =
2431 {
2432 {
2433 .eraseblocks = { {64 * 1024, 1} },
2434 .block_erase = erase_chip_block_jedec,
2435 }
2436 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002437 .write = write_jedec,
2438 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002439 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002440 },
2441
2442 {
2443 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002444 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002445 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002446 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002447 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002448 .total_size = 128,
2449 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002450 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002451 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002452 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002453 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002454 .block_erasers =
2455 {
2456 {
2457 .eraseblocks = { {128 * 1024, 1} },
2458 .block_erase = erase_chip_block_jedec,
2459 }
2460 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002461 .write = write_jedec, /* FIXME */
2462 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002463 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002464 },
2465
2466 {
2467 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002468 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002469 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002470 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002471 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002472 .total_size = 256,
2473 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002474 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002475 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002476 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002477 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002478 .block_erasers =
2479 {
2480 {
2481 .eraseblocks = { {256 * 1024, 1} },
2482 .block_erase = erase_chip_block_jedec,
2483 }
2484 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002485 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002486 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002487 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002488 },
2489
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002490 {
2491 .vendor = "Atmel",
2492 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002493 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002494 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002495 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002496 .total_size = 512,
2497 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002498 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002499 .tested = TEST_UNTESTED,
2500 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002501 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002502 .block_erasers =
2503 {
2504 {
2505 .eraseblocks = { {512 * 1024, 1} },
2506 .block_erase = erase_chip_block_jedec,
2507 }
2508 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002509 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002510 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002511 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002512 },
2513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002514 {
2515 .vendor = "Atmel",
2516 .name = "AT45CS1282",
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_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002520 .total_size = 16896 /* No power of two sizes */,
2521 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002522 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002523 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2524 .feature_bits = FEATURE_OTP,
2525 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002526 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002527 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002528 .block_erasers =
2529 {
2530 {
2531 .eraseblocks = {
2532 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2533 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2534 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2535 },
2536 .block_erase = spi_erase_at45cs_sector,
2537 }
2538 },
2539 .printlock = spi_prettyprint_status_register_plain,
2540 .gran = write_gran_1056bytes,
2541 .write = spi_write_at45db,
2542 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002543 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002544 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002545
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002546 {
2547 .vendor = "Atmel",
2548 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002549 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002550 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002551 .model_id = ATMEL_AT45DB011D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002552 .total_size = 128 /* or 132, determined from status register */,
2553 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002554 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002555 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2556 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002557 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002558 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002559 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002560 .block_erasers =
2561 {
2562 {
2563 .eraseblocks = { {256, 512} },
2564 .block_erase = spi_erase_at45db_page,
2565 }, {
2566 .eraseblocks = { {8 * 256, 512/8} },
2567 .block_erase = spi_erase_at45db_block,
2568 }, {
2569 .eraseblocks = {
2570 {8 * 256, 1},
2571 {120 * 256, 1},
2572 {128 * 256, 3},
2573 },
2574 .block_erase = spi_erase_at45db_sector
2575 }, {
2576 .eraseblocks = { {128 * 1024, 1} },
2577 .block_erase = spi_erase_at45db_chip,
2578 }
2579 },
2580 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2581 .printlock = spi_prettyprint_status_register_at45db,
2582 /* granularity will be set by the probing function. */
2583 .write = spi_write_at45db,
2584 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002585 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002586 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002587
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002588 {
2589 .vendor = "Atmel",
2590 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002591 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002592 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002593 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002594 .total_size = 256 /* or 264, determined from status register */,
2595 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002596 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002597 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2598 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002599 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002600 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002601 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002602 .block_erasers =
2603 {
2604 {
2605 .eraseblocks = { {256, 1024} },
2606 .block_erase = spi_erase_at45db_page,
2607 }, {
2608 .eraseblocks = { {8 * 256, 1024/8} },
2609 .block_erase = spi_erase_at45db_block,
2610 }, {
2611 .eraseblocks = {
2612 {8 * 256, 1},
2613 {120 * 256, 1},
2614 {128 * 256, 7},
2615 },
2616 .block_erase = spi_erase_at45db_sector
2617 }, {
2618 .eraseblocks = { {256 * 1024, 1} },
2619 .block_erase = spi_erase_at45db_chip,
2620 }
2621 },
2622 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2623 .printlock = spi_prettyprint_status_register_at45db,
2624 /* granularity will be set by the probing function. */
2625 .write = spi_write_at45db,
2626 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002627 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002628 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002629
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002630 {
2631 .vendor = "Atmel",
2632 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002633 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002634 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002635 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002636 .total_size = 512 /* or 528, determined from status register */,
2637 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002638 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002639 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2640 .feature_bits = FEATURE_OTP,
2641 .tested = TEST_OK_PREW,
2642 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002643 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002644 .block_erasers =
2645 {
2646 {
2647 .eraseblocks = { {256, 2048} },
2648 .block_erase = spi_erase_at45db_page,
2649 }, {
2650 .eraseblocks = { {8 * 256, 2048/8} },
2651 .block_erase = spi_erase_at45db_block,
2652 }, {
2653 .eraseblocks = {
2654 {8 * 256, 1},
2655 {248 * 256, 1},
2656 {256 * 256, 7},
2657 },
2658 .block_erase = spi_erase_at45db_sector
2659 }, {
2660 .eraseblocks = { {512 * 1024, 1} },
2661 .block_erase = spi_erase_at45db_chip,
2662 }
2663 },
2664 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2665 .printlock = spi_prettyprint_status_register_at45db,
2666 /* granularity will be set by the probing function. */
2667 .write = spi_write_at45db,
2668 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2669 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002670 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002672 {
2673 .vendor = "Atmel",
2674 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002676 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002677 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002678 .total_size = 1024 /* or 1056, determined from status register */,
2679 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002680 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002681 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2682 .feature_bits = FEATURE_OTP,
2683 .tested = TEST_UNTESTED,
2684 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002685 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002686 .block_erasers =
2687 {
2688 {
2689 .eraseblocks = { {256, 4096} },
2690 .block_erase = spi_erase_at45db_page,
2691 }, {
2692 .eraseblocks = { {8 * 256, 4096/8} },
2693 .block_erase = spi_erase_at45db_block,
2694 }, {
2695 .eraseblocks = {
2696 {8 * 256, 1},
2697 {248 * 256, 1},
2698 {256 * 256, 15},
2699 },
2700 .block_erase = spi_erase_at45db_sector
2701 }, {
2702 .eraseblocks = { {1024 * 1024, 1} },
2703 .block_erase = spi_erase_at45db_chip,
2704 }
2705 },
2706 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2707 .printlock = spi_prettyprint_status_register_at45db,
2708 /* granularity will be set by the probing function. */
2709 .write = spi_write_at45db,
2710 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002711 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002712 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002713
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002714 {
2715 .vendor = "Atmel",
2716 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002717 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002718 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002719 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002720 .total_size = 2048 /* or 2112, determined from status register */,
2721 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002722 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002723 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2724 .feature_bits = FEATURE_OTP,
2725 .tested = TEST_OK_PREW,
2726 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002727 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002728 .block_erasers =
2729 {
2730 {
2731 .eraseblocks = { {512, 4096} },
2732 .block_erase = spi_erase_at45db_page,
2733 }, {
2734 .eraseblocks = { {8 * 512, 4096/8} },
2735 .block_erase = spi_erase_at45db_block,
2736 }, {
2737 .eraseblocks = {
2738 {8 * 512, 1},
2739 {248 * 512, 1},
2740 {256 * 512, 15},
2741 },
2742 .block_erase = spi_erase_at45db_sector
2743 }, {
2744 .eraseblocks = { {2048 * 1024, 1} },
2745 .block_erase = spi_erase_at45db_chip,
2746 }
2747 },
2748 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2749 .printlock = spi_prettyprint_status_register_at45db,
2750 /* granularity will be set by the probing function. */
2751 .write = spi_write_at45db,
2752 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002753 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002754 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002755
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002756 {
2757 .vendor = "Atmel",
2758 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002759 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002760 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002761 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002762 .total_size = 4224 /* No power of two sizes */,
2763 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002764 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002765 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2766 .feature_bits = FEATURE_OTP,
2767 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002768 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002769 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002770 .block_erasers =
2771 {
2772 {
2773 .eraseblocks = { {528, 8192} },
2774 .block_erase = spi_erase_at45db_page,
2775 }, {
2776 .eraseblocks = { {8 * 528, 8192/8} },
2777 .block_erase = spi_erase_at45db_block,
2778 }, /* Although the datasheets describes sectors (which can be write protected)
2779 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00002780 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002781 .eraseblocks = {
2782 {8 * 528, 1},
2783 {120 * 528, 1},
2784 {128 * 528, 63},
2785 },
2786 .block_erase = spi_erase_at45db_sector
2787 }, */ {
2788 .eraseblocks = { {4224 * 1024, 1} },
2789 .block_erase = spi_erase_at45db_chip,
2790 }
2791 },
2792 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2793 .gran = write_gran_528bytes,
2794 .write = spi_write_at45db,
2795 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002796 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002797 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002798
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002799 {
2800 .vendor = "Atmel",
2801 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002802 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002803 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002804 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002805 .total_size = 4096 /* or 4224, determined from status register */,
2806 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002807 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002808 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002809 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00002810 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002811 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002812 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002813 .block_erasers =
2814 {
2815 {
2816 .eraseblocks = { {512, 8192} },
2817 .block_erase = spi_erase_at45db_page,
2818 }, {
2819 .eraseblocks = { {8 * 512, 8192/8} },
2820 .block_erase = spi_erase_at45db_block,
2821 }, {
2822 .eraseblocks = {
2823 {8 * 512, 1},
2824 {120 * 512, 1},
2825 {128 * 512, 63},
2826 },
2827 .block_erase = spi_erase_at45db_sector
2828 }, {
2829 .eraseblocks = { {4096 * 1024, 1} },
2830 .block_erase = spi_erase_at45db_chip,
2831 }
2832 },
2833 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2834 .printlock = spi_prettyprint_status_register_at45db,
2835 /* granularity will be set by the probing function. */
2836 .write = spi_write_at45db,
2837 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2838 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2839 },
2840
2841 {
2842 .vendor = "Atmel",
2843 .name = "AT45DB321E",
2844 .bustype = BUS_SPI,
2845 .manufacture_id = ATMEL_ID,
2846 .model_id = ATMEL_AT45DB321C,
2847 .total_size = 4096 /* or 4224, determined from status register */,
2848 .page_size = 512 /* or 528, determined from status register */,
2849 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2850 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2851 .feature_bits = FEATURE_OTP,
2852 .tested = TEST_UNTESTED,
2853 .probe = probe_spi_at45db,
2854 .probe_timing = TIMING_ZERO,
2855 .block_erasers =
2856 {
2857 {
2858 .eraseblocks = { {512, 8192} },
2859 .block_erase = spi_erase_at45db_page,
2860 }, {
2861 .eraseblocks = { {8 * 512, 8192/8} },
2862 .block_erase = spi_erase_at45db_block,
2863 }, {
2864 .eraseblocks = {
2865 {8 * 512, 1},
2866 {120 * 512, 1},
2867 {128 * 512, 63},
2868 },
2869 .block_erase = spi_erase_at45db_sector
2870 }, {
2871 .eraseblocks = { {4096 * 1024, 1} },
2872 .block_erase = spi_erase_at45db_chip,
2873 }
2874 },
2875 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2876 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2877 /* granularity will be set by the probing function. */
2878 .write = spi_write_at45db,
2879 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2880 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002881 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002882
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002883 {
2884 .vendor = "Atmel",
2885 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002886 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002887 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002888 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002889 .total_size = 8192 /* or 8448, determined from status register */,
2890 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002891 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002892 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2893 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002894 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002895 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002896 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002897 .block_erasers =
2898 {
2899 {
2900 .eraseblocks = { {1024, 8192} },
2901 .block_erase = spi_erase_at45db_page,
2902 }, {
2903 .eraseblocks = { {8 * 1024, 8192/8} },
2904 .block_erase = spi_erase_at45db_block,
2905 }, {
2906 .eraseblocks = {
2907 {8 * 1024, 1},
2908 {248 * 1024, 1},
2909 {256 * 1024, 31},
2910 },
2911 .block_erase = spi_erase_at45db_sector
2912 }, {
2913 .eraseblocks = { {8192 * 1024, 1} },
2914 .block_erase = spi_erase_at45db_chip,
2915 }
2916 },
2917 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2918 .printlock = spi_prettyprint_status_register_at45db,
2919 /* granularity will be set by the probing function. */
2920 .write = spi_write_at45db,
2921 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002922 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002923 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002924
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002925 {
2926 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002927 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002928 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002929 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002930 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002931 .total_size = 64,
2932 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002933 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002934 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002935 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002936 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002937 .block_erasers =
2938 {
2939 {
2940 .eraseblocks = { {64 * 1024, 1} },
2941 .block_erase = erase_chip_block_jedec,
2942 }
2943 },
Sean Nelson35727f72010-01-28 23:55:12 +00002944 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002945 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002946 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002947 },
2948
2949 {
2950 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002951 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002952 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002953 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002954 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002955 .total_size = 256,
2956 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002957 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002958 .tested = TEST_UNTESTED,
2959 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002960 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002961 .block_erasers =
2962 {
2963 {
2964 .eraseblocks = {
2965 {16 * 1024, 1},
2966 {8 * 1024, 2},
2967 {96 * 1024, 1},
2968 {128 * 1024, 1},
2969 },
2970 .block_erase = erase_sector_jedec,
2971 }, {
2972 .eraseblocks = { {256 * 1024, 1} },
2973 .block_erase = erase_chip_block_jedec,
2974 }
2975 },
Sean Nelson35727f72010-01-28 23:55:12 +00002976 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002977 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002978 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002979 },
2980
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002981 {
2982 .vendor = "Atmel",
2983 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002984 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002985 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002986 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002987 .total_size = 256,
2988 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002989 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002990 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002991 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002992 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002993 .block_erasers =
2994 {
2995 {
2996 .eraseblocks = {
2997 {128 * 1024, 1},
2998 {96 * 1024, 1},
2999 {8 * 1024, 2},
3000 {16 * 1024, 1},
3001 },
3002 .block_erase = erase_sector_jedec,
3003 }, {
3004 .eraseblocks = { {256 * 1024, 1} },
3005 .block_erase = erase_chip_block_jedec,
3006 }
3007 },
Sean Nelson35727f72010-01-28 23:55:12 +00003008 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003009 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003010 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003011 },
3012
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003013 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003014 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003015 .name = "AT49(H)F010",
3016 .bustype = BUS_PARALLEL,
3017 .manufacture_id = ATMEL_ID,
3018 .model_id = ATMEL_AT49F010,
3019 .total_size = 128,
3020 .page_size = 0, /* unused */
3021 .feature_bits = FEATURE_EITHER_RESET,
3022 .tested = TEST_OK_PREW,
3023 .probe = probe_jedec,
3024 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3025 .block_erasers =
3026 {
3027 {
3028 .eraseblocks = { {128 * 1024, 1} },
3029 .block_erase = erase_chip_block_jedec,
3030 }
3031 },
3032 .printlock = printlock_at49f,
3033 .write = write_jedec_1,
3034 .read = read_memmapped,
3035 .voltage = {4500, 5500},
3036 },
3037
3038 {
3039 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003040 .name = "AT49F020",
3041 .bustype = BUS_PARALLEL,
3042 .manufacture_id = ATMEL_ID,
3043 .model_id = ATMEL_AT49F020,
3044 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003045 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003046 .feature_bits = FEATURE_EITHER_RESET,
3047 .tested = TEST_OK_PRE,
3048 .probe = probe_jedec,
3049 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3050 .block_erasers =
3051 {
3052 {
3053 .eraseblocks = { {256 * 1024, 1} },
3054 .block_erase = erase_chip_block_jedec,
3055 }
3056 /* Chip features an optional permanent write protection
3057 * of the first 8 kB. The erase function is the same as
3058 * above, but 00000H to 01FFFH will not be erased.
3059 * FIXME: add another eraser when partial erasers are
3060 * supported.
3061 */
3062 },
3063 .printlock = printlock_at49f,
3064 .write = write_jedec_1,
3065 .read = read_memmapped,
3066 .voltage = {4500, 5500},
3067 },
3068
3069 {
3070 .vendor = "Atmel",
3071 .name = "AT49F040",
3072 .bustype = BUS_PARALLEL,
3073 .manufacture_id = ATMEL_ID,
3074 .model_id = ATMEL_AT49F040,
3075 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003076 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003077 .feature_bits = FEATURE_EITHER_RESET,
3078 .tested = TEST_UNTESTED,
3079 .probe = probe_jedec,
3080 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3081 .block_erasers =
3082 {
3083 {
3084 .eraseblocks = { {512 * 1024, 1} },
3085 .block_erase = erase_chip_block_jedec,
3086 }
3087 /* Chip features an optional permanent write protection
3088 * of the first 16 kB. The erase function is the same as
3089 * above, but 00000H to 03FFFH will not be erased.
3090 * FIXME: add another eraser when partial erasers are
3091 * supported.
3092 */
3093 },
3094 .printlock = printlock_at49f,
3095 .write = write_jedec_1,
3096 .read = read_memmapped,
3097 .voltage = {4500, 5500},
3098 },
3099
3100 {
3101 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003102 .name = "AT49F080",
3103 .bustype = BUS_PARALLEL,
3104 .manufacture_id = ATMEL_ID,
3105 .model_id = ATMEL_AT49F080,
3106 .total_size = 1024,
3107 .page_size = 0, /* unused */
3108 .feature_bits = FEATURE_EITHER_RESET,
3109 .tested = TEST_UNTESTED,
3110 .probe = probe_jedec,
3111 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3112 .block_erasers =
3113 {
3114 {
3115 .eraseblocks = { {1024 * 1024, 1} },
3116 .block_erase = erase_chip_block_jedec,
3117 }
3118 /* Chip features an optional permanent write protection
3119 * of the first 16 kB. The erase function is the same as
3120 * above, but 00000H to 03FFFH will not be erased.
3121 * FIXME: add another eraser when partial erasers are
3122 * supported.
3123 */
3124 },
3125 .printlock = printlock_at49f,
3126 .write = write_jedec_1,
3127 .read = read_memmapped,
3128 .voltage = {4500, 5500},
3129 },
3130
3131 {
3132 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3133 .vendor = "Atmel",
3134 .name = "AT49F080T",
3135 .bustype = BUS_PARALLEL,
3136 .manufacture_id = ATMEL_ID,
3137 .model_id = ATMEL_AT49F080T,
3138 .total_size = 1024,
3139 .page_size = 0, /* unused */
3140 .feature_bits = FEATURE_EITHER_RESET,
3141 .tested = TEST_UNTESTED,
3142 .probe = probe_jedec,
3143 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3144 .block_erasers =
3145 {
3146 {
3147 .eraseblocks = { {1024 * 1024, 1} },
3148 .block_erase = erase_chip_block_jedec,
3149 }
3150 /* Chip features an optional permanent write protection
3151 * of the first 16 kB. The erase function is the same as
3152 * above, but FC000H to FFFFFH will not be erased.
3153 * FIXME: add another eraser when partial erasers are
3154 * supported.
3155 */
3156 },
3157 .printlock = printlock_at49f,
3158 .write = write_jedec_1,
3159 .read = read_memmapped,
3160 .voltage = {4500, 5500},
3161 },
3162
3163 {
3164 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003165 .name = "AT49LH002",
3166 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3167 .manufacture_id = ATMEL_ID,
3168 .model_id = ATMEL_AT49LH002,
3169 .total_size = 256,
3170 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003171 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003172 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003173 .probe = probe_82802ab,
3174 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003175 .block_erasers =
3176 {
3177 {
3178 .eraseblocks = {
3179 {64 * 1024, 3},
3180 {32 * 1024, 1},
3181 {8 * 1024, 2},
3182 {16 * 1024, 1},
3183 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003184 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003185 }, {
3186 .eraseblocks = {
3187 {64 * 1024, 4},
3188 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003189 .block_erase = erase_block_82802ab,
3190 },
3191 },
3192 .printlock = printlock_regspace2_block_eraser_0,
3193 .unlock = unlock_regspace2_block_eraser_0,
3194 .write = write_82802ab,
3195 .read = read_memmapped,
3196 .voltage = {3000, 3600},
3197 },
3198
3199 {
3200 .vendor = "Atmel",
3201 .name = "AT49LH00B4",
3202 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3203 .manufacture_id = ATMEL_ID,
3204 .model_id = ATMEL_AT49LH00B4,
3205 .total_size = 512,
3206 .page_size = 0, /* unused */
3207 .feature_bits = FEATURE_REGISTERMAP,
3208 .tested = TEST_UNTESTED,
3209 .probe = probe_82802ab,
3210 .probe_timing = TIMING_ZERO,
3211 .block_erasers =
3212 {
3213 {
3214 .eraseblocks = {
3215 {8 * 1024, 2},
3216 {16 * 1024, 1},
3217 {32 * 1024, 1},
3218 {64 * 1024, 7},
3219 },
3220 .block_erase = NULL, /* TODO: Implement. */
3221 }, {
3222 .eraseblocks = {
3223 {64 * 1024, 8},
3224 },
3225 .block_erase = erase_block_82802ab,
3226 },
3227 },
3228 .printlock = printlock_regspace2_block_eraser_0,
3229 .unlock = unlock_regspace2_block_eraser_0,
3230 .write = write_82802ab,
3231 .read = read_memmapped,
3232 .voltage = {3000, 3600},
3233 },
3234
3235 {
3236 .vendor = "Atmel",
3237 .name = "AT49LH004",
3238 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3239 .manufacture_id = ATMEL_ID,
3240 .model_id = ATMEL_AT49LH004,
3241 .total_size = 512,
3242 .page_size = 0, /* unused */
3243 .feature_bits = FEATURE_REGISTERMAP,
3244 .tested = TEST_UNTESTED,
3245 .probe = probe_82802ab,
3246 .probe_timing = TIMING_ZERO,
3247 .block_erasers =
3248 {
3249 {
3250 .eraseblocks = {
3251 {64 * 1024, 7},
3252 {32 * 1024, 1},
3253 {8 * 1024, 2},
3254 {16 * 1024, 1},
3255 },
3256 .block_erase = erase_block_82802ab,
3257 }, {
3258 .eraseblocks = {
3259 {64 * 1024, 8},
3260 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003261 .block_erase = NULL, /* TODO: Implement. */
3262 },
3263 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003264 .printlock = printlock_regspace2_block_eraser_0,
3265 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003266 .write = write_82802ab,
3267 .read = read_memmapped,
3268 .voltage = {3000, 3600},
3269 },
3270
3271 {
Andrew Morganca081462011-09-13 22:05:44 +00003272 .vendor = "Catalyst",
3273 .name = "CAT28F512",
3274 .bustype = BUS_PARALLEL,
3275 .manufacture_id = CATALYST_ID,
3276 .model_id = CATALYST_CAT28F512,
3277 .total_size = 64,
3278 .page_size = 0, /* unused */
3279 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003280 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003281 .probe = probe_jedec, /* FIXME! */
3282 .probe_timing = TIMING_ZERO,
3283 .block_erasers =
3284 {
3285 {
3286 .eraseblocks = { {64 * 1024, 1} },
3287 .block_erase = NULL, /* TODO */
3288 },
3289 },
3290 .write = NULL, /* TODO */
3291 .read = read_memmapped,
3292 .voltage = {4500, 5500},
3293 },
3294
3295 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003296 .vendor = "Bright",
3297 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003298 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003299 .manufacture_id = BRIGHT_ID,
3300 .model_id = BRIGHT_BM29F040,
3301 .total_size = 512,
3302 .page_size = 64 * 1024,
3303 .feature_bits = FEATURE_EITHER_RESET,
3304 .tested = TEST_OK_PR,
3305 .probe = probe_jedec,
3306 .probe_timing = TIMING_ZERO,
3307 .block_erasers =
3308 {
3309 {
3310 .eraseblocks = { {64 * 1024, 8} },
3311 .block_erase = erase_sector_jedec,
3312 }, {
3313 .eraseblocks = { {512 * 1024, 1} },
3314 .block_erase = erase_chip_block_jedec,
3315 },
3316 },
3317 .write = write_jedec_1,
3318 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003319 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003320 },
3321
3322 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003323 .vendor = "ENE",
3324 .name = "KB9012 (EDI)",
3325 .bustype = BUS_SPI,
3326 .spi_cmd_set = SPI_EDI,
3327 .total_size = 128,
3328 .page_size = 128,
3329 .feature_bits = FEATURE_ERASED_ZERO,
3330 .tested = TEST_OK_PREW,
3331 .probe = edi_probe_kb9012,
3332 .probe_timing = TIMING_ZERO,
3333 .block_erasers =
3334 {
3335 {
3336 .eraseblocks = { {128, 1024} },
3337 .block_erase = edi_chip_block_erase,
3338 },
3339 },
3340 .gran = write_gran_128bytes,
3341 .write = edi_chip_write,
3342 .read = edi_chip_read,
3343 .voltage = {2700, 3600},
3344 },
3345
3346 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003347 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003348 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003349 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003350 .manufacture_id = ESMT_ID,
3351 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003352 .total_size = 256,
3353 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003354 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003355 .tested = TEST_UNTESTED,
3356 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003357 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003358 .block_erasers =
3359 {
3360 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003361 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003362 {128 * 1024, 1},
3363 {96 * 1024, 1},
3364 {8 * 1024, 2},
3365 {16 * 1024, 1},
3366 },
3367 .block_erase = erase_sector_jedec,
3368 }, {
3369 .eraseblocks = { {256 * 1024, 1} },
3370 .block_erase = erase_chip_block_jedec,
3371 }
3372 },
Sean Nelson35727f72010-01-28 23:55:12 +00003373 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003374 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003375 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003376 },
3377
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003378 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003379 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003380 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003381 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003382 .manufacture_id = ESMT_ID,
3383 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003384 .total_size = 1024,
3385 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003386 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003387 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003388 .probe = probe_spi_rdid,
3389 .probe_timing = TIMING_ZERO,
3390 .block_erasers =
3391 {
3392 {
3393 .eraseblocks = { {4 * 1024, 256} },
3394 .block_erase = spi_block_erase_20,
3395 }, {
3396 .eraseblocks = { {64 * 1024, 16} },
3397 .block_erase = spi_block_erase_d8,
3398 }, {
3399 .eraseblocks = { {1024 * 1024, 1} },
3400 .block_erase = spi_block_erase_60,
3401 }, {
3402 .eraseblocks = { {1024 * 1024, 1} },
3403 .block_erase = spi_block_erase_c7,
3404 }
3405 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003406 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003407 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003408 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003409 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003410 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003411 },
3412
3413 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003414 .vendor = "ESMT",
3415 .name = "F25L32PA",
3416 .bustype = BUS_SPI,
3417 .manufacture_id = ESMT_ID,
3418 .model_id = ESMT_F25L32PA,
3419 .total_size = 4096,
3420 .page_size = 256,
3421 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3422 .tested = TEST_UNTESTED,
3423 .probe = probe_spi_rdid,
3424 .probe_timing = TIMING_ZERO,
3425 .block_erasers =
3426 {
3427 {
3428 .eraseblocks = { {4 * 1024, 1024} },
3429 .block_erase = spi_block_erase_20,
3430 }, {
3431 .eraseblocks = { {64 * 1024, 64} },
3432 .block_erase = spi_block_erase_d8,
3433 }, {
3434 .eraseblocks = { {4 * 1024 * 1024, 1} },
3435 .block_erase = spi_block_erase_60,
3436 }, {
3437 .eraseblocks = { {4 * 1024 * 1024, 1} },
3438 .block_erase = spi_block_erase_c7,
3439 }
3440 },
3441 .printlock = spi_prettyprint_status_register_bp2_bpl,
3442 .unlock = spi_disable_blockprotect,
3443 .write = spi_chip_write_256,
3444 .read = spi_chip_read,
3445 .voltage = {2700, 3600},
3446 },
3447
3448 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003449 .vendor = "Eon",
3450 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003451 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003452 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003453 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003454 .total_size = 64,
3455 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003456 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003457 .tested = TEST_UNTESTED,
3458 .probe = probe_spi_rdid,
3459 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003460 .block_erasers =
3461 {
3462 {
3463 .eraseblocks = {
3464 {4 * 1024, 2},
3465 {8 * 1024, 1},
3466 {16 * 1024, 1},
3467 {32 * 1024, 1},
3468 },
3469 .block_erase = spi_block_erase_d8,
3470 }, {
3471 .eraseblocks = { {64 * 1024, 1} },
3472 .block_erase = spi_block_erase_c7,
3473 }
3474 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003475 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003476 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003477 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003478 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003479 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003480 },
3481
3482 {
3483 .vendor = "Eon",
3484 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003485 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003486 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003487 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003488 .total_size = 64,
3489 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003490 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003491 .tested = TEST_UNTESTED,
3492 .probe = probe_spi_rdid,
3493 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003494 .block_erasers =
3495 {
3496 {
3497 .eraseblocks = {
3498 {32 * 1024, 1},
3499 {16 * 1024, 1},
3500 {8 * 1024, 1},
3501 {4 * 1024, 2},
3502 },
3503 .block_erase = spi_block_erase_d8,
3504 }, {
3505 .eraseblocks = { {64 * 1024, 1} },
3506 .block_erase = spi_block_erase_c7,
3507 }
3508 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003509 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003510 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003511 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003512 .read = spi_chip_read, /* Fast read (0x0B) supported */
3513 .voltage = {2700, 3600},
3514 },
3515
3516 {
3517 .vendor = "Eon",
3518 .name = "EN25P05",
3519 .bustype = BUS_SPI,
3520 .manufacture_id = EON_ID_NOPREFIX,
3521 .model_id = EON_EN25B05,
3522 .total_size = 64,
3523 .page_size = 256,
3524 .feature_bits = FEATURE_WRSR_WREN,
3525 .tested = TEST_UNTESTED,
3526 .probe = probe_spi_rdid,
3527 .probe_timing = TIMING_ZERO,
3528 .block_erasers =
3529 {
3530 {
3531 .eraseblocks = {
3532 {32 * 1024, 2} },
3533 .block_erase = spi_block_erase_d8,
3534 }, {
3535 .eraseblocks = { {64 * 1024, 1} },
3536 .block_erase = spi_block_erase_c7,
3537 }
3538 },
3539 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3540 .unlock = spi_disable_blockprotect,
3541 .write = spi_chip_write_256,
3542 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003543 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003544 },
3545
3546 {
3547 .vendor = "Eon",
3548 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003549 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003550 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003551 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003552 .total_size = 128,
3553 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003554 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003555 .tested = TEST_UNTESTED,
3556 .probe = probe_spi_rdid,
3557 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003558 .block_erasers =
3559 {
3560 {
3561 .eraseblocks = {
3562 {4 * 1024, 2},
3563 {8 * 1024, 1},
3564 {16 * 1024, 1},
3565 {32 * 1024, 3},
3566 },
3567 .block_erase = spi_block_erase_d8,
3568 }, {
3569 .eraseblocks = { {128 * 1024, 1} },
3570 .block_erase = spi_block_erase_c7,
3571 }
3572 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003573 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003574 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003575 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003576 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003577 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003578 },
3579
3580 {
3581 .vendor = "Eon",
3582 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003583 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003584 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003585 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003586 .total_size = 128,
3587 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003588 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003589 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003590 .probe = probe_spi_rdid,
3591 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003592 .block_erasers =
3593 {
3594 {
3595 .eraseblocks = {
3596 {32 * 1024, 3},
3597 {16 * 1024, 1},
3598 {8 * 1024, 1},
3599 {4 * 1024, 2},
3600 },
3601 .block_erase = spi_block_erase_d8,
3602 }, {
3603 .eraseblocks = { {128 * 1024, 1} },
3604 .block_erase = spi_block_erase_c7,
3605 }
3606 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003607 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003608 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003609 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003610 .read = spi_chip_read, /* Fast read (0x0B) supported */
3611 .voltage = {2700, 3600},
3612 },
3613
3614 {
3615 .vendor = "Eon",
3616 .name = "EN25P10",
3617 .bustype = BUS_SPI,
3618 .manufacture_id = EON_ID_NOPREFIX,
3619 .model_id = EON_EN25B10,
3620 .total_size = 128,
3621 .page_size = 256,
3622 .feature_bits = FEATURE_WRSR_WREN,
3623 .tested = TEST_UNTESTED,
3624 .probe = probe_spi_rdid,
3625 .probe_timing = TIMING_ZERO,
3626 .block_erasers =
3627 {
3628 {
3629 .eraseblocks = { {32 * 1024, 4} },
3630 .block_erase = spi_block_erase_d8,
3631 }, {
3632 .eraseblocks = { {128 * 1024, 1} },
3633 .block_erase = spi_block_erase_c7,
3634 }
3635 },
3636 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3637 .unlock = spi_disable_blockprotect,
3638 .write = spi_chip_write_256,
3639 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003640 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003641 },
3642
3643 {
3644 .vendor = "Eon",
3645 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003646 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003647 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003648 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003649 .total_size = 256,
3650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003652 .tested = TEST_UNTESTED,
3653 .probe = probe_spi_rdid,
3654 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003655 .block_erasers =
3656 {
3657 {
3658 .eraseblocks = {
3659 {4 * 1024, 2},
3660 {8 * 1024, 1},
3661 {16 * 1024, 1},
3662 {32 * 1024, 1},
3663 {64 * 1024, 3}
3664 },
3665 .block_erase = spi_block_erase_d8,
3666 }, {
3667 .eraseblocks = { {256 * 1024, 1} },
3668 .block_erase = spi_block_erase_c7,
3669 }
3670 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003671 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003672 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003673 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003674 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003675 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003676 },
3677
3678 {
3679 .vendor = "Eon",
3680 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003681 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003682 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003683 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003684 .total_size = 256,
3685 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003686 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003687 .tested = TEST_UNTESTED,
3688 .probe = probe_spi_rdid,
3689 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003690 .block_erasers =
3691 {
3692 {
3693 .eraseblocks = {
3694 {64 * 1024, 3},
3695 {32 * 1024, 1},
3696 {16 * 1024, 1},
3697 {8 * 1024, 1},
3698 {4 * 1024, 2},
3699 },
3700 .block_erase = spi_block_erase_d8,
3701 }, {
3702 .eraseblocks = { {256 * 1024, 1} },
3703 .block_erase = spi_block_erase_c7,
3704 }
3705 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003706 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003707 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003708 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003709 .read = spi_chip_read, /* Fast read (0x0B) supported */
3710 .voltage = {2700, 3600},
3711 },
3712
3713 {
3714 .vendor = "Eon",
3715 .name = "EN25P20",
3716 .bustype = BUS_SPI,
3717 .manufacture_id = EON_ID_NOPREFIX,
3718 .model_id = EON_EN25B20,
3719 .total_size = 256,
3720 .page_size = 256,
3721 .feature_bits = FEATURE_WRSR_WREN,
3722 .tested = TEST_UNTESTED,
3723 .probe = probe_spi_rdid,
3724 .probe_timing = TIMING_ZERO,
3725 .block_erasers =
3726 {
3727 {
3728 .eraseblocks = { {64 * 1024, 4} },
3729 .block_erase = spi_block_erase_d8,
3730 }, {
3731 .eraseblocks = { {256 * 1024, 1} },
3732 .block_erase = spi_block_erase_c7,
3733 }
3734 },
3735 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3736 .unlock = spi_disable_blockprotect,
3737 .write = spi_chip_write_256,
3738 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003739 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003740 },
3741
3742 {
3743 .vendor = "Eon",
3744 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003745 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003746 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003747 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003748 .total_size = 512,
3749 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003750 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003751 .tested = TEST_UNTESTED,
3752 .probe = probe_spi_rdid,
3753 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003754 .block_erasers =
3755 {
3756 {
3757 .eraseblocks = {
3758 {4 * 1024, 2},
3759 {8 * 1024, 1},
3760 {16 * 1024, 1},
3761 {32 * 1024, 1},
3762 {64 * 1024, 7}
3763 },
3764 .block_erase = spi_block_erase_d8,
3765 }, {
3766 .eraseblocks = { {512 * 1024, 1} },
3767 .block_erase = spi_block_erase_c7,
3768 }
3769 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003770 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003771 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003772 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003773 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003774 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003775 },
3776
3777 {
3778 .vendor = "Eon",
3779 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003780 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003781 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003782 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003783 .total_size = 512,
3784 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003785 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003786 .tested = TEST_UNTESTED,
3787 .probe = probe_spi_rdid,
3788 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003789 .block_erasers =
3790 {
3791 {
3792 .eraseblocks = {
3793 {64 * 1024, 7},
3794 {32 * 1024, 1},
3795 {16 * 1024, 1},
3796 {8 * 1024, 1},
3797 {4 * 1024, 2},
3798 },
3799 .block_erase = spi_block_erase_d8,
3800 }, {
3801 .eraseblocks = { {512 * 1024, 1} },
3802 .block_erase = spi_block_erase_c7,
3803 }
3804 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003805 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003806 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003807 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003808 .read = spi_chip_read, /* Fast read (0x0B) supported */
3809 .voltage = {2700, 3600},
3810 },
3811
3812 {
3813 .vendor = "Eon",
3814 .name = "EN25P40",
3815 .bustype = BUS_SPI,
3816 .manufacture_id = EON_ID_NOPREFIX,
3817 .model_id = EON_EN25B40,
3818 .total_size = 512,
3819 .page_size = 256,
3820 .feature_bits = FEATURE_WRSR_WREN,
3821 .tested = TEST_UNTESTED,
3822 .probe = probe_spi_rdid,
3823 .probe_timing = TIMING_ZERO,
3824 .block_erasers =
3825 {
3826 {
3827 .eraseblocks = { {64 * 1024, 8} },
3828 .block_erase = spi_block_erase_d8,
3829 }, {
3830 .eraseblocks = { {512 * 1024, 1} },
3831 .block_erase = spi_block_erase_c7,
3832 }
3833 },
3834 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3835 .unlock = spi_disable_blockprotect,
3836 .write = spi_chip_write_256,
3837 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003838 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003839 },
3840
3841 {
3842 .vendor = "Eon",
3843 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003844 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003845 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003846 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003847 .total_size = 1024,
3848 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003849 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003850 .tested = TEST_UNTESTED,
3851 .probe = probe_spi_rdid,
3852 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003853 .block_erasers =
3854 {
3855 {
3856 .eraseblocks = {
3857 {4 * 1024, 2},
3858 {8 * 1024, 1},
3859 {16 * 1024, 1},
3860 {32 * 1024, 1},
3861 {64 * 1024, 15}
3862 },
3863 .block_erase = spi_block_erase_d8,
3864 }, {
3865 .eraseblocks = { {1024 * 1024, 1} },
3866 .block_erase = spi_block_erase_c7,
3867 }
3868 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003869 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003870 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003871 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003872 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003873 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003874 },
3875
3876 {
3877 .vendor = "Eon",
3878 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003879 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003880 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003881 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003882 .total_size = 1024,
3883 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003884 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003885 .tested = TEST_UNTESTED,
3886 .probe = probe_spi_rdid,
3887 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003888 .block_erasers =
3889 {
3890 {
3891 .eraseblocks = {
3892 {64 * 1024, 15},
3893 {32 * 1024, 1},
3894 {16 * 1024, 1},
3895 {8 * 1024, 1},
3896 {4 * 1024, 2},
3897 },
3898 .block_erase = spi_block_erase_d8,
3899 }, {
3900 .eraseblocks = { {1024 * 1024, 1} },
3901 .block_erase = spi_block_erase_c7,
3902 }
3903 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003904 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003905 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003906 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003907 .read = spi_chip_read, /* Fast read (0x0B) supported */
3908 .voltage = {2700, 3600},
3909 },
3910
3911 {
3912 .vendor = "Eon",
3913 .name = "EN25P80",
3914 .bustype = BUS_SPI,
3915 .manufacture_id = EON_ID_NOPREFIX,
3916 .model_id = EON_EN25B80,
3917 .total_size = 1024,
3918 .page_size = 256,
3919 .feature_bits = FEATURE_WRSR_WREN,
3920 .tested = TEST_UNTESTED,
3921 .probe = probe_spi_rdid,
3922 .probe_timing = TIMING_ZERO,
3923 .block_erasers =
3924 {
3925 {
3926 .eraseblocks = { {64 * 1024, 16} },
3927 .block_erase = spi_block_erase_d8,
3928 }, {
3929 .eraseblocks = { {1024 * 1024, 1} },
3930 .block_erase = spi_block_erase_c7,
3931 }
3932 },
3933 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3934 .unlock = spi_disable_blockprotect,
3935 .write = spi_chip_write_256,
3936 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003937 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003938 },
3939
3940 {
3941 .vendor = "Eon",
3942 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003943 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003944 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003945 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003946 .total_size = 2048,
3947 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003948 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003949 .tested = TEST_UNTESTED,
3950 .probe = probe_spi_rdid,
3951 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003952 .block_erasers =
3953 {
3954 {
3955 .eraseblocks = {
3956 {4 * 1024, 2},
3957 {8 * 1024, 1},
3958 {16 * 1024, 1},
3959 {32 * 1024, 1},
3960 {64 * 1024, 31},
3961 },
3962 .block_erase = spi_block_erase_d8,
3963 }, {
3964 .eraseblocks = { {2 * 1024 * 1024, 1} },
3965 .block_erase = spi_block_erase_c7,
3966 }
3967 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003968 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003969 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003970 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003971 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003972 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003973 },
3974
3975 {
3976 .vendor = "Eon",
3977 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003978 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003979 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003980 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003981 .total_size = 2048,
3982 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003983 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003984 .tested = TEST_UNTESTED,
3985 .probe = probe_spi_rdid,
3986 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003987 .block_erasers =
3988 {
3989 {
3990 .eraseblocks = {
3991 {64 * 1024, 31},
3992 {32 * 1024, 1},
3993 {16 * 1024, 1},
3994 {8 * 1024, 1},
3995 {4 * 1024, 2},
3996 },
3997 .block_erase = spi_block_erase_d8,
3998 }, {
3999 .eraseblocks = { {2 * 1024 * 1024, 1} },
4000 .block_erase = spi_block_erase_c7,
4001 }
4002 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004003 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004004 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004005 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004006 .read = spi_chip_read, /* Fast read (0x0B) supported */
4007 .voltage = {2700, 3600},
4008 },
4009
4010 {
4011 .vendor = "Eon",
4012 .name = "EN25P16",
4013 .bustype = BUS_SPI,
4014 .manufacture_id = EON_ID_NOPREFIX,
4015 .model_id = EON_EN25B16,
4016 .total_size = 2048,
4017 .page_size = 256,
4018 .feature_bits = FEATURE_WRSR_WREN,
4019 .tested = TEST_UNTESTED,
4020 .probe = probe_spi_rdid,
4021 .probe_timing = TIMING_ZERO,
4022 .block_erasers =
4023 {
4024 {
4025 .eraseblocks = { {64 * 1024, 32} },
4026 .block_erase = spi_block_erase_d8,
4027 }, {
4028 .eraseblocks = { {2 * 1024 * 1024, 1} },
4029 .block_erase = spi_block_erase_c7,
4030 }
4031 },
4032 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4033 .unlock = spi_disable_blockprotect,
4034 .write = spi_chip_write_256,
4035 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004036 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004037 },
4038
4039 {
4040 .vendor = "Eon",
4041 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004042 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004043 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004044 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004045 .total_size = 4096,
4046 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004047 /* OTP: 512B total; enter 0x3A */
4048 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004049 .tested = TEST_UNTESTED,
4050 .probe = probe_spi_rdid,
4051 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004052 .block_erasers =
4053 {
4054 {
4055 .eraseblocks = {
4056 {4 * 1024, 2},
4057 {8 * 1024, 1},
4058 {16 * 1024, 1},
4059 {32 * 1024, 1},
4060 {64 * 1024, 63},
4061 },
4062 .block_erase = spi_block_erase_d8,
4063 }, {
4064 .eraseblocks = { {4 * 1024 * 1024, 1} },
4065 .block_erase = spi_block_erase_c7,
4066 }
4067 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004068 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004069 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004070 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004071 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004072 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004073 },
4074
4075 {
4076 .vendor = "Eon",
4077 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004078 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004079 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004080 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004081 .total_size = 4096,
4082 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004083 /* OTP: 512B total; enter 0x3A */
4084 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004085 .tested = TEST_UNTESTED,
4086 .probe = probe_spi_rdid,
4087 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004088 .block_erasers =
4089 {
4090 {
4091 .eraseblocks = {
4092 {64 * 1024, 63},
4093 {32 * 1024, 1},
4094 {16 * 1024, 1},
4095 {8 * 1024, 1},
4096 {4 * 1024, 2},
4097 },
4098 .block_erase = spi_block_erase_d8,
4099 }, {
4100 .eraseblocks = { {4 * 1024 * 1024, 1} },
4101 .block_erase = spi_block_erase_c7,
4102 }
4103 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004104 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004105 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004106 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004107 .read = spi_chip_read, /* Fast read (0x0B) supported */
4108 .voltage = {2700, 3600},
4109 },
4110
4111 {
4112 .vendor = "Eon",
4113 .name = "EN25P32", /* Uniform version of EN25B32 */
4114 .bustype = BUS_SPI,
4115 .manufacture_id = EON_ID_NOPREFIX,
4116 .model_id = EON_EN25B32,
4117 .total_size = 4096,
4118 .page_size = 256,
4119 /* OTP: 512B total; enter 0x3A */
4120 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4121 .tested = TEST_UNTESTED,
4122 .probe = probe_spi_rdid,
4123 .probe_timing = TIMING_ZERO,
4124 .block_erasers =
4125 {
4126 {
4127 .eraseblocks = { {64 * 1024, 64} },
4128 .block_erase = spi_block_erase_d8,
4129 }, {
4130 .eraseblocks = { {4 * 1024 * 1024, 1} },
4131 .block_erase = spi_block_erase_c7,
4132 }
4133 },
4134 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4135 .unlock = spi_disable_blockprotect,
4136 .write = spi_chip_write_256,
4137 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004138 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004139 },
4140
4141 {
4142 .vendor = "Eon",
4143 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004144 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004145 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004146 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004147 .total_size = 8192,
4148 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004149 /* OTP: 512B total; enter 0x3A */
4150 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004151 .tested = TEST_UNTESTED,
4152 .probe = probe_spi_rdid,
4153 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004154 .block_erasers =
4155 {
4156 {
4157 .eraseblocks = {
4158 {4 * 1024, 2},
4159 {8 * 1024, 1},
4160 {16 * 1024, 1},
4161 {32 * 1024, 1},
4162 {64 * 1024, 127},
4163 },
4164 .block_erase = spi_block_erase_d8,
4165 }, {
4166 .eraseblocks = { {8 * 1024 * 1024, 1} },
4167 .block_erase = spi_block_erase_c7,
4168 }
4169 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004170 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004171 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004172 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004173 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004174 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004175 },
4176
4177 {
4178 .vendor = "Eon",
4179 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004180 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004181 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004182 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004183 .total_size = 8192,
4184 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004185 /* OTP: 512B total; enter 0x3A */
4186 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004187 .tested = TEST_UNTESTED,
4188 .probe = probe_spi_rdid,
4189 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004190 .block_erasers =
4191 {
4192 {
4193 .eraseblocks = {
4194 {64 * 1024, 127},
4195 {32 * 1024, 1},
4196 {16 * 1024, 1},
4197 {8 * 1024, 1},
4198 {4 * 1024, 2},
4199 },
4200 .block_erase = spi_block_erase_d8,
4201 }, {
4202 .eraseblocks = { {8 * 1024 * 1024, 1} },
4203 .block_erase = spi_block_erase_c7,
4204 }
4205 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004206 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004207 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004208 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004209 .read = spi_chip_read, /* Fast read (0x0B) supported */
4210 .voltage = {2700, 3600},
4211 },
4212
4213 {
4214 .vendor = "Eon",
4215 .name = "EN25P64",
4216 .bustype = BUS_SPI,
4217 .manufacture_id = EON_ID_NOPREFIX,
4218 .model_id = EON_EN25B64,
4219 .total_size = 8192,
4220 .page_size = 256,
4221 /* OTP: 512B total; enter 0x3A */
4222 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4223 .tested = TEST_UNTESTED,
4224 .probe = probe_spi_rdid,
4225 .probe_timing = TIMING_ZERO,
4226 .block_erasers =
4227 {
4228 {
4229 .eraseblocks = { {64 * 1024, 128} },
4230 .block_erase = spi_block_erase_d8,
4231 }, {
4232 .eraseblocks = { {8 * 1024 * 1024, 1} },
4233 .block_erase = spi_block_erase_c7,
4234 }
4235 },
4236 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4237 .unlock = spi_disable_blockprotect,
4238 .write = spi_chip_write_256,
4239 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004240 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004241 },
4242
4243 {
4244 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004245 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004246 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004247 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004248 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004249 .total_size = 64,
4250 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004251 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004252 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004253 .probe = probe_spi_rdid,
4254 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004255 .block_erasers =
4256 {
4257 {
4258 .eraseblocks = { {4 * 1024, 16} },
4259 .block_erase = spi_block_erase_20,
4260 }, {
4261 .eraseblocks = { {32 * 1024, 2} },
4262 .block_erase = spi_block_erase_d8,
4263 }, {
4264 .eraseblocks = { {32 * 1024, 2} },
4265 .block_erase = spi_block_erase_52,
4266 }, {
4267 .eraseblocks = { {64 * 1024, 1} },
4268 .block_erase = spi_block_erase_60,
4269 }, {
4270 .eraseblocks = { {64 * 1024, 1} },
4271 .block_erase = spi_block_erase_c7,
4272 }
4273 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004274 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004275 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004276 .write = spi_chip_write_256,
4277 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004278 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004279 },
4280
4281 {
4282 .vendor = "Eon",
4283 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004284 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004285 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004286 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004287 .total_size = 128,
4288 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004289 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004290 .tested = TEST_UNTESTED,
4291 .probe = probe_spi_rdid,
4292 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004293 .block_erasers =
4294 {
4295 {
4296 .eraseblocks = { {4 * 1024, 32} },
4297 .block_erase = spi_block_erase_20,
4298 }, {
4299 .eraseblocks = { {32 * 1024, 4} },
4300 .block_erase = spi_block_erase_d8,
4301 }, {
4302 .eraseblocks = { {32 * 1024, 4} },
4303 .block_erase = spi_block_erase_52,
4304 }, {
4305 .eraseblocks = { {128 * 1024, 1} },
4306 .block_erase = spi_block_erase_60,
4307 }, {
4308 .eraseblocks = { {128 * 1024, 1} },
4309 .block_erase = spi_block_erase_c7,
4310 }
4311 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004312 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004313 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004314 .write = spi_chip_write_256,
4315 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004316 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004317 },
4318
4319 {
4320 .vendor = "Eon",
4321 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004322 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004323 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004324 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004325 .total_size = 256,
4326 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004327 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004328 .tested = TEST_UNTESTED,
4329 .probe = probe_spi_rdid,
4330 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004331 .block_erasers =
4332 {
4333 {
4334 .eraseblocks = { {4 * 1024, 64} },
4335 .block_erase = spi_block_erase_20,
4336 }, {
4337 .eraseblocks = { {64 * 1024, 4} },
4338 .block_erase = spi_block_erase_d8,
4339 }, {
4340 .eraseblocks = { {64 * 1024, 4} },
4341 .block_erase = spi_block_erase_52,
4342 }, {
4343 .eraseblocks = { {256 * 1024, 1} },
4344 .block_erase = spi_block_erase_60,
4345 }, {
4346 .eraseblocks = { {256 * 1024, 1} },
4347 .block_erase = spi_block_erase_c7,
4348 }
4349 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004350 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004351 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004352 .write = spi_chip_write_256,
4353 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004354 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004355 },
4356
4357 {
4358 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004359 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004360 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004361 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004362 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004363 .total_size = 512,
4364 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004365 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004366 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004367 .probe = probe_spi_rdid,
4368 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004369 .block_erasers =
4370 {
4371 {
Sean Nelson54596372010-01-09 05:30:14 +00004372 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004373 .block_erase = spi_block_erase_20,
4374 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004375 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004376 .block_erase = spi_block_erase_d8,
4377 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004378 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004379 .block_erase = spi_block_erase_60,
4380 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004381 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004382 .block_erase = spi_block_erase_c7,
4383 },
4384 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004385 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004386 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004387 .write = spi_chip_write_256,
4388 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004389 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004390 },
4391
4392 {
4393 .vendor = "Eon",
4394 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004395 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004396 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004397 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004398 .total_size = 1024,
4399 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004400 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004401 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004402 .probe = probe_spi_rdid,
4403 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004404 .block_erasers =
4405 {
4406 {
4407 .eraseblocks = { {4 * 1024, 256} },
4408 .block_erase = spi_block_erase_20,
4409 }, {
4410 .eraseblocks = { {64 * 1024, 16} },
4411 .block_erase = spi_block_erase_d8,
4412 }, {
4413 .eraseblocks = { {1024 * 1024, 1} },
4414 .block_erase = spi_block_erase_60,
4415 }, {
4416 .eraseblocks = { {1024 * 1024, 1} },
4417 .block_erase = spi_block_erase_c7,
4418 }
4419 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004420 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004421 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004422 .write = spi_chip_write_256,
4423 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004424 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004425 },
4426
4427 {
4428 .vendor = "Eon",
4429 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004430 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004431 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004432 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004433 .total_size = 2048,
4434 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004435 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004436 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004437 .probe = probe_spi_rdid,
4438 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004439 .block_erasers =
4440 {
4441 {
4442 .eraseblocks = { {4 * 1024, 512} },
4443 .block_erase = spi_block_erase_20,
4444 }, {
4445 .eraseblocks = { {64 * 1024, 32} },
4446 .block_erase = spi_block_erase_d8,
4447 }, {
4448 .eraseblocks = { {2 * 1024 * 1024, 1} },
4449 .block_erase = spi_block_erase_60,
4450 }, {
4451 .eraseblocks = { {2 * 1024 * 1024, 1} },
4452 .block_erase = spi_block_erase_c7,
4453 }
4454 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004455 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004456 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004457 .write = spi_chip_write_256,
4458 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004459 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004460 },
4461
4462 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004463 .vendor = "Eon",
4464 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004465 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004466 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004467 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004468 .total_size = 4096,
4469 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004470 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004471 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004472 .probe = probe_spi_rdid,
4473 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004474 .block_erasers =
4475 {
4476 {
4477 .eraseblocks = { {4 * 1024, 1024} },
4478 .block_erase = spi_block_erase_20,
4479 }, {
4480 .eraseblocks = { {64 * 1024, 64} },
4481 .block_erase = spi_block_erase_d8,
4482 }, {
4483 .eraseblocks = { {4 * 1024 * 1024, 1} },
4484 .block_erase = spi_block_erase_60,
4485 }, {
4486 .eraseblocks = { {4 * 1024 * 1024, 1} },
4487 .block_erase = spi_block_erase_c7,
4488 }
4489 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004490 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004491 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004492 .write = spi_chip_write_256,
4493 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004494 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004495 },
4496
4497 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004498 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004499 .name = "EN25F64",
4500 .bustype = BUS_SPI,
4501 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004502 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004503 .total_size = 8192,
4504 .page_size = 256,
4505 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004506 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004507 .probe = probe_spi_rdid,
4508 .probe_timing = TIMING_ZERO,
4509 .block_erasers =
4510 {
4511 {
4512 .eraseblocks = { {4 * 1024, 2048} },
4513 .block_erase = spi_block_erase_20,
4514 }, {
4515 .eraseblocks = { {64 * 1024, 128} },
4516 .block_erase = spi_block_erase_d8,
4517 }, {
4518 .eraseblocks = { {8 * 1024 * 1024, 1} },
4519 .block_erase = spi_block_erase_60,
4520 }, {
4521 .eraseblocks = { {8 * 1024 * 1024, 1} },
4522 .block_erase = spi_block_erase_c7,
4523 }
4524 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004525 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004526 .unlock = spi_disable_blockprotect,
4527 .write = spi_chip_write_256,
4528 .read = spi_chip_read,
4529 .voltage = {2700, 3600},
4530 },
4531
4532 {
4533 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004534 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004535 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004536 .manufacture_id = EON_ID_NOPREFIX,
4537 .model_id = EON_EN25Q40,
4538 .total_size = 512,
4539 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004540 /* OTP: 256B total; enter 0x3A */
4541 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004542 .tested = TEST_UNTESTED,
4543 .probe = probe_spi_rdid,
4544 .probe_timing = TIMING_ZERO,
4545 .block_erasers =
4546 {
4547 {
4548 .eraseblocks = { {4 * 1024, 128} },
4549 .block_erase = spi_block_erase_20,
4550 }, {
4551 .eraseblocks = { {64 * 1024, 8} },
4552 .block_erase = spi_block_erase_d8,
4553 }, {
4554 .eraseblocks = { {512 * 1024, 1} },
4555 .block_erase = spi_block_erase_60,
4556 }, {
4557 .eraseblocks = { {512 * 1024, 1} },
4558 .block_erase = spi_block_erase_c7,
4559 }
4560 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004561 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004562 .unlock = spi_disable_blockprotect,
4563 .write = spi_chip_write_256,
4564 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004565 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004566 },
4567
4568 {
4569 .vendor = "Eon",
4570 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004571 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004572 .manufacture_id = EON_ID_NOPREFIX,
4573 .model_id = EON_EN25Q80,
4574 .total_size = 1024,
4575 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004576 /* OTP: 256B total; enter 0x3A */
4577 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004578 .tested = TEST_UNTESTED,
4579 .probe = probe_spi_rdid,
4580 .probe_timing = TIMING_ZERO,
4581 .block_erasers =
4582 {
4583 {
4584 .eraseblocks = { {4 * 1024, 256} },
4585 .block_erase = spi_block_erase_20,
4586 }, {
4587 .eraseblocks = { {64 * 1024, 16} },
4588 .block_erase = spi_block_erase_d8,
4589 }, {
4590 .eraseblocks = { {1024 * 1024, 1} },
4591 .block_erase = spi_block_erase_60,
4592 }, {
4593 .eraseblocks = { {1024 * 1024, 1} },
4594 .block_erase = spi_block_erase_c7,
4595 }
4596 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004597 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004598 .unlock = spi_disable_blockprotect,
4599 .write = spi_chip_write_256,
4600 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004601 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004602 },
4603
4604 {
4605 /* Note: EN25D16 is an evil twin which shares the model ID
4606 but has different write protection capabilities */
4607 .vendor = "Eon",
4608 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004609 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004610 .manufacture_id = EON_ID_NOPREFIX,
4611 .model_id = EON_EN25Q16,
4612 .total_size = 2048,
4613 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004614 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4615 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004616 .tested = TEST_UNTESTED,
4617 .probe = probe_spi_rdid,
4618 .probe_timing = TIMING_ZERO,
4619 .block_erasers =
4620 {
4621 {
4622 .eraseblocks = { {4 * 1024, 512} },
4623 .block_erase = spi_block_erase_20,
4624 }, {
4625 .eraseblocks = { {64 * 1024, 32} },
4626 .block_erase = spi_block_erase_d8,
4627 }, {
4628 /* not supported by Q16 version */
4629 .eraseblocks = { {64 * 1024, 32} },
4630 .block_erase = spi_block_erase_52,
4631 }, {
4632 .eraseblocks = { {2 * 1024 * 1024, 1} },
4633 .block_erase = spi_block_erase_60,
4634 }, {
4635 .eraseblocks = { {2 * 1024 * 1024, 1} },
4636 .block_erase = spi_block_erase_c7,
4637 }
4638 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004639 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004640 .unlock = spi_disable_blockprotect,
4641 .write = spi_chip_write_256,
4642 .read = spi_chip_read,
4643 .voltage = {2700, 3600},
4644 },
4645
4646 {
4647 .vendor = "Eon",
4648 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004649 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004650 .manufacture_id = EON_ID_NOPREFIX,
4651 .model_id = EON_EN25Q32,
4652 .total_size = 4096,
4653 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004654 /* OTP: 512B total; enter 0x3A */
4655 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004656 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004657 .probe = probe_spi_rdid,
4658 .probe_timing = TIMING_ZERO,
4659 .block_erasers =
4660 {
4661 {
4662 .eraseblocks = { {4 * 1024, 1024} },
4663 .block_erase = spi_block_erase_20,
4664 }, {
4665 .eraseblocks = { {64 * 1024, 64} },
4666 .block_erase = spi_block_erase_d8,
4667 }, {
4668 .eraseblocks = { {4 * 1024 * 1024, 1} },
4669 .block_erase = spi_block_erase_60,
4670 }, {
4671 .eraseblocks = { {4 * 1024 * 1024, 1} },
4672 .block_erase = spi_block_erase_c7,
4673 }
4674 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004675 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004676 .unlock = spi_disable_blockprotect,
4677 .write = spi_chip_write_256,
4678 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004679 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004680 },
4681
4682 {
4683 .vendor = "Eon",
4684 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004685 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004686 .manufacture_id = EON_ID_NOPREFIX,
4687 .model_id = EON_EN25Q64,
4688 .total_size = 8192,
4689 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004690 /* OTP: 512B total; enter 0x3A */
4691 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004692 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004693 .probe = probe_spi_rdid,
4694 .probe_timing = TIMING_ZERO,
4695 .block_erasers =
4696 {
4697 {
4698 .eraseblocks = { {4 * 1024, 2048} },
4699 .block_erase = spi_block_erase_20,
4700 }, {
4701 .eraseblocks = { {64 * 1024, 128} },
4702 .block_erase = spi_block_erase_d8,
4703 }, {
4704 .eraseblocks = { {8 * 1024 * 1024, 1} },
4705 .block_erase = spi_block_erase_60,
4706 }, {
4707 .eraseblocks = { {8 * 1024 * 1024, 1} },
4708 .block_erase = spi_block_erase_c7,
4709 }
4710 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004711 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004712 .unlock = spi_disable_blockprotect,
4713 .write = spi_chip_write_256,
4714 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004715 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004716 },
4717
4718 {
4719 .vendor = "Eon",
4720 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004721 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004722 .manufacture_id = EON_ID_NOPREFIX,
4723 .model_id = EON_EN25Q128,
4724 .total_size = 16384,
4725 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004726 /* OTP: 512B total; enter 0x3A */
4727 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0be072c2016-03-13 15:16:30 +00004728 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004729 .probe = probe_spi_rdid,
4730 .probe_timing = TIMING_ZERO,
4731 .block_erasers =
4732 {
4733 {
4734 .eraseblocks = { {4 * 1024, 4096} },
4735 .block_erase = spi_block_erase_20,
4736 }, {
4737 .eraseblocks = { {64 * 1024, 256} },
4738 .block_erase = spi_block_erase_d8,
4739 }, {
4740 .eraseblocks = { {16 * 1024 * 1024, 1} },
4741 .block_erase = spi_block_erase_60,
4742 }, {
4743 .eraseblocks = { {16 * 1024 * 1024, 1} },
4744 .block_erase = spi_block_erase_c7,
4745 }
4746 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004747 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004748 .unlock = spi_disable_blockprotect,
4749 .write = spi_chip_write_256,
4750 .read = spi_chip_read,
4751 },
4752
4753 {
4754 .vendor = "Eon",
4755 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004756 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004757 .manufacture_id = EON_ID_NOPREFIX,
4758 .model_id = EON_EN25QH16,
4759 .total_size = 2048,
4760 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004761 /* supports SFDP */
4762 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004763 /* QPI enable 0x38, disable 0xFF */
4764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004765 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004766 .probe = probe_spi_rdid,
4767 .probe_timing = TIMING_ZERO,
4768 .block_erasers =
4769 {
4770 {
4771 .eraseblocks = { {4 * 1024, 512} },
4772 .block_erase = spi_block_erase_20,
4773 }, {
4774 .eraseblocks = { {64 * 1024, 32} },
4775 .block_erase = spi_block_erase_d8,
4776 }, {
4777 .eraseblocks = { {1024 * 2048, 1} },
4778 .block_erase = spi_block_erase_60,
4779 }, {
4780 .eraseblocks = { {1024 * 2048, 1} },
4781 .block_erase = spi_block_erase_c7,
4782 }
4783 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004784 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004785 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004786 .write = spi_chip_write_256,
4787 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004788 .voltage = {2700, 3600},
4789 },
4790
4791 {
4792 .vendor = "Eon",
4793 .name = "EN25QH32",
4794 .bustype = BUS_SPI,
4795 .manufacture_id = EON_ID_NOPREFIX,
4796 .model_id = EON_EN25QH32,
4797 .total_size = 4096,
4798 .page_size = 256,
4799 /* supports SFDP */
4800 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004801 /* QPI enable 0x38, disable 0xFF */
4802 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004803 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004804 .probe = probe_spi_rdid,
4805 .probe_timing = TIMING_ZERO,
4806 .block_erasers =
4807 {
4808 {
4809 .eraseblocks = { {4 * 1024, 1024} },
4810 .block_erase = spi_block_erase_20,
4811 }, {
4812 .eraseblocks = { {64 * 1024, 64} },
4813 .block_erase = spi_block_erase_d8,
4814 }, {
4815 .eraseblocks = { {1024 * 4096, 1} },
4816 .block_erase = spi_block_erase_60,
4817 }, {
4818 .eraseblocks = { {1024 * 4096, 1} },
4819 .block_erase = spi_block_erase_c7,
4820 }
4821 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004822 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004823 .unlock = spi_disable_blockprotect_bp3_srwd,
4824 .write = spi_chip_write_256,
4825 .read = spi_chip_read,
4826 .voltage = {2700, 3600},
4827 },
4828
4829 {
4830 .vendor = "Eon",
4831 .name = "EN25QH64",
4832 .bustype = BUS_SPI,
4833 .manufacture_id = EON_ID_NOPREFIX,
4834 .model_id = EON_EN25QH64,
4835 .total_size = 8192,
4836 .page_size = 256,
4837 /* supports SFDP */
4838 /* OTP: 512B total; enter 0x3A */
4839 /* QPI enable 0x38, disable 0xFF */
4840 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00004841 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004842 .probe = probe_spi_rdid,
4843 .probe_timing = TIMING_ZERO,
4844 .block_erasers = {
4845 {
4846 .eraseblocks = { {4 * 1024, 2048} },
4847 .block_erase = spi_block_erase_20,
4848 }, {
4849 .eraseblocks = { {64 * 1024, 128} },
4850 .block_erase = spi_block_erase_d8,
4851 }, {
4852 .eraseblocks = { { 8192 * 1024, 1} },
4853 .block_erase = spi_block_erase_60,
4854 }, {
4855 .eraseblocks = { { 8192 * 1024, 1} },
4856 .block_erase = spi_block_erase_c7,
4857 }
4858 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004859 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004860 .unlock = spi_disable_blockprotect_bp3_srwd,
4861 .write = spi_chip_write_256,
4862 .read = spi_chip_read,
4863 .voltage = {2700, 3600},
4864 },
4865
4866 {
4867 .vendor = "Eon",
4868 .name = "EN25QH128",
4869 .bustype = BUS_SPI,
4870 .manufacture_id = EON_ID_NOPREFIX,
4871 .model_id = EON_EN25QH128,
4872 .total_size = 16384,
4873 .page_size = 256,
4874 /* supports SFDP */
4875 /* OTP: 512B total; enter 0x3A */
4876 /* QPI enable 0x38, disable 0xFF */
4877 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4878 .tested = TEST_UNTESTED,
4879 .probe = probe_spi_rdid,
4880 .probe_timing = TIMING_ZERO,
4881 .block_erasers = {
4882 {
4883 .eraseblocks = { {4 * 1024, 4096} },
4884 .block_erase = spi_block_erase_20,
4885 }, {
4886 .eraseblocks = { {64 * 1024, 256} },
4887 .block_erase = spi_block_erase_d8,
4888 }, {
4889 .eraseblocks = { { 16384 * 1024, 1} },
4890 .block_erase = spi_block_erase_60,
4891 }, {
4892 .eraseblocks = { { 16384 * 1024, 1} },
4893 .block_erase = spi_block_erase_c7,
4894 }
4895 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004896 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004897 .unlock = spi_disable_blockprotect_bp3_srwd,
4898 .write = spi_chip_write_256,
4899 .read = spi_chip_read,
4900 .voltage = {2700, 3600},
4901 },
4902
4903 {
4904 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004905 .name = "EN25S10",
4906 .bustype = BUS_SPI,
4907 .manufacture_id = EON_ID_NOPREFIX,
4908 .model_id = EON_EN25S10,
4909 .total_size = 128,
4910 .page_size = 256,
4911 /* OTP: 256B total; enter 0x3A */
4912 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4913 .tested = TEST_UNTESTED,
4914 .probe = probe_spi_rdid,
4915 .probe_timing = TIMING_ZERO,
4916 .block_erasers = {
4917 {
4918 .eraseblocks = { {4 * 1024, 32} },
4919 .block_erase = spi_block_erase_20,
4920 }, {
4921 .eraseblocks = { {32 * 1024, 4} },
4922 .block_erase = spi_block_erase_52,
4923 }, {
4924 .eraseblocks = { {128 * 1024, 1} },
4925 .block_erase = spi_block_erase_60,
4926 }, {
4927 .eraseblocks = { {128 * 1024, 1} },
4928 .block_erase = spi_block_erase_c7,
4929 }
4930 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004931 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004932 .unlock = spi_disable_blockprotect,
4933 .write = spi_chip_write_256,
4934 .read = spi_chip_read,
4935 .voltage = {1650, 1950},
4936 },
4937
4938 {
4939 .vendor = "Eon",
4940 .name = "EN25S20",
4941 .bustype = BUS_SPI,
4942 .manufacture_id = EON_ID_NOPREFIX,
4943 .model_id = EON_EN25S20,
4944 .total_size = 256,
4945 .page_size = 256,
4946 /* OTP: 256B total; enter 0x3A */
4947 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4948 .tested = TEST_UNTESTED,
4949 .probe = probe_spi_rdid,
4950 .probe_timing = TIMING_ZERO,
4951 .block_erasers = {
4952 {
4953 .eraseblocks = { {4 * 1024, 64} },
4954 .block_erase = spi_block_erase_20,
4955 }, {
4956 .eraseblocks = { {64 * 1024, 4} },
4957 .block_erase = spi_block_erase_d8,
4958 }, {
4959 .eraseblocks = { {256 * 1024, 1} },
4960 .block_erase = spi_block_erase_60,
4961 }, {
4962 .eraseblocks = { {256 * 1024, 1} },
4963 .block_erase = spi_block_erase_c7,
4964 }
4965 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004966 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004967 .unlock = spi_disable_blockprotect,
4968 .write = spi_chip_write_256,
4969 .read = spi_chip_read,
4970 .voltage = {1650, 1950},
4971 },
4972
4973 {
4974 .vendor = "Eon",
4975 .name = "EN25S40",
4976 .bustype = BUS_SPI,
4977 .manufacture_id = EON_ID_NOPREFIX,
4978 .model_id = EON_EN25S40,
4979 .total_size = 512,
4980 .page_size = 256,
4981 /* OTP: 256B total; enter 0x3A */
4982 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4983 .tested = TEST_UNTESTED,
4984 .probe = probe_spi_rdid,
4985 .probe_timing = TIMING_ZERO,
4986 .block_erasers = {
4987 {
4988 .eraseblocks = { {4 * 1024, 128} },
4989 .block_erase = spi_block_erase_20,
4990 }, {
4991 .eraseblocks = { {64 * 1024, 8} },
4992 .block_erase = spi_block_erase_d8,
4993 }, {
4994 .eraseblocks = { {512 * 1024, 1} },
4995 .block_erase = spi_block_erase_60,
4996 }, {
4997 .eraseblocks = { {512 * 1024, 1} },
4998 .block_erase = spi_block_erase_c7,
4999 }
5000 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005001 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005002 .unlock = spi_disable_blockprotect,
5003 .write = spi_chip_write_256,
5004 .read = spi_chip_read,
5005 .voltage = {1650, 1950},
5006 },
5007
5008 {
5009 .vendor = "Eon",
5010 .name = "EN25S80",
5011 .bustype = BUS_SPI,
5012 .manufacture_id = EON_ID_NOPREFIX,
5013 .model_id = EON_EN25S80,
5014 .total_size = 1024,
5015 .page_size = 256,
5016 /* OTP: 256B total; enter 0x3A */
5017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5018 .tested = TEST_UNTESTED,
5019 .probe = probe_spi_rdid,
5020 .probe_timing = TIMING_ZERO,
5021 .block_erasers = {
5022 {
5023 .eraseblocks = { {4 * 1024, 256} },
5024 .block_erase = spi_block_erase_20,
5025 }, {
5026 .eraseblocks = { {64 * 1024, 16} },
5027 .block_erase = spi_block_erase_d8,
5028 }, {
5029 .eraseblocks = { {1024 * 1024, 1} },
5030 .block_erase = spi_block_erase_60,
5031 }, {
5032 .eraseblocks = { {1024 * 1024, 1} },
5033 .block_erase = spi_block_erase_c7,
5034 }
5035 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005036 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005037 .unlock = spi_disable_blockprotect,
5038 .write = spi_chip_write_256,
5039 .read = spi_chip_read,
5040 .voltage = {1650, 1950},
5041 },
5042
5043 {
5044 .vendor = "Eon",
5045 .name = "EN25S16",
5046 .bustype = BUS_SPI,
5047 .manufacture_id = EON_ID_NOPREFIX,
5048 .model_id = EON_EN25S16,
5049 .total_size = 2048,
5050 .page_size = 256,
5051 /* OTP: 512B total; enter 0x3A */
5052 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5053 .tested = TEST_UNTESTED,
5054 .probe = probe_spi_rdid,
5055 .probe_timing = TIMING_ZERO,
5056 .block_erasers = {
5057 {
5058 .eraseblocks = { {4 * 1024, 512} },
5059 .block_erase = spi_block_erase_20,
5060 }, {
5061 .eraseblocks = { {64 * 1024, 32} },
5062 .block_erase = spi_block_erase_52,
5063 }, {
5064 .eraseblocks = { {32 * 1024, 64} },
5065 .block_erase = spi_block_erase_d8,
5066 }, {
5067 .eraseblocks = { {2048 * 1024, 1} },
5068 .block_erase = spi_block_erase_60,
5069 }, {
5070 .eraseblocks = { {2048 * 1024, 1} },
5071 .block_erase = spi_block_erase_c7,
5072 }
5073 },
5074 .printlock = spi_prettyprint_status_register_en25s_wp,
5075 .unlock = spi_disable_blockprotect_bp3_srwd,
5076 .write = spi_chip_write_256,
5077 .read = spi_chip_read,
5078 .voltage = {1650, 1950},
5079 },
5080
5081 {
5082 .vendor = "Eon",
5083 .name = "EN25S32",
5084 .bustype = BUS_SPI,
5085 .manufacture_id = EON_ID_NOPREFIX,
5086 .model_id = EON_EN25S32,
5087 .total_size = 4096,
5088 .page_size = 256,
5089 /* OTP: 512B total; enter 0x3A */
5090 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5091 .tested = TEST_UNTESTED,
5092 .probe = probe_spi_rdid,
5093 .probe_timing = TIMING_ZERO,
5094 .block_erasers = {
5095 {
5096 .eraseblocks = { {4 * 1024, 1024} },
5097 .block_erase = spi_block_erase_20,
5098 }, {
5099 .eraseblocks = { {32 * 1024, 128} },
5100 .block_erase = spi_block_erase_52,
5101 }, {
5102 .eraseblocks = { {64 * 1024, 64} },
5103 .block_erase = spi_block_erase_d8,
5104 }, {
5105 .eraseblocks = { {4096 * 1024, 1} },
5106 .block_erase = spi_block_erase_60,
5107 }, {
5108 .eraseblocks = { {4096 * 1024, 1} },
5109 .block_erase = spi_block_erase_c7,
5110 }
5111 },
5112 .printlock = spi_prettyprint_status_register_en25s_wp,
5113 .unlock = spi_disable_blockprotect_bp3_srwd,
5114 .write = spi_chip_write_256,
5115 .read = spi_chip_read,
5116 .voltage = {1650, 1950},
5117 },
5118
5119 {
5120 .vendor = "Eon",
5121 .name = "EN25S64",
5122 .bustype = BUS_SPI,
5123 .manufacture_id = EON_ID_NOPREFIX,
5124 .model_id = EON_EN25S64,
5125 .total_size = 8192,
5126 .page_size = 256,
5127 /* OTP: 512B total; enter 0x3A */
5128 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5129 .tested = TEST_UNTESTED,
5130 .probe = probe_spi_rdid,
5131 .probe_timing = TIMING_ZERO,
5132 .block_erasers = {
5133 {
5134 .eraseblocks = { {4 * 1024, 2048} },
5135 .block_erase = spi_block_erase_20,
5136 }, {
5137 .eraseblocks = { {64 * 1024, 128} },
5138 .block_erase = spi_block_erase_d8,
5139 }, {
5140 .eraseblocks = { {8192 * 1024, 1} },
5141 .block_erase = spi_block_erase_60,
5142 }, {
5143 .eraseblocks = { {8192 * 1024, 1} },
5144 .block_erase = spi_block_erase_c7,
5145 }
5146 },
5147 .printlock = spi_prettyprint_status_register_en25s_wp,
5148 .unlock = spi_disable_blockprotect_bp3_srwd,
5149 .write = spi_chip_write_256,
5150 .read = spi_chip_read,
5151 .voltage = {1650, 1950},
5152 },
5153
5154 {
5155 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00005156 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005157 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00005158 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005159 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00005160 .total_size = 128,
5161 .page_size = 128,
5162 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005163 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00005164 .probe = probe_jedec,
5165 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5166 .block_erasers =
5167 {
5168 {
5169 .eraseblocks = { {16 * 1024, 8} },
5170 .block_erase = erase_sector_jedec,
5171 },
5172 {
5173 .eraseblocks = { {128 * 1024, 1} },
5174 .block_erase = erase_chip_block_jedec,
5175 },
5176 },
5177 .write = write_jedec_1,
5178 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005179 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00005180 },
5181
5182 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005183 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005184 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005185 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005186 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005187 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005188 .total_size = 256,
5189 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005190 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005191 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005192 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005193 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005194 .block_erasers =
5195 {
5196 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005197 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005198 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005199 {8 * 1024, 2},
5200 {32 * 1024, 1},
5201 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005202 },
5203 .block_erase = erase_sector_jedec,
5204 }, {
5205 .eraseblocks = { {256 * 1024, 1} },
5206 .block_erase = erase_chip_block_jedec,
5207 },
5208 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005209 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005210 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005211 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005212 },
5213
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005214 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005215 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005216 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005217 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005218 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005219 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005220 .total_size = 256,
5221 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005222 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005223 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005224 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005225 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005226 .block_erasers =
5227 {
5228 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005229 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005230 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005231 {32 * 1024, 1},
5232 {8 * 1024, 2},
5233 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005234 },
5235 .block_erase = erase_sector_jedec,
5236 }, {
5237 .eraseblocks = { {256 * 1024, 1} },
5238 .block_erase = erase_chip_block_jedec,
5239 },
5240 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005241 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005242 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005243 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005244 },
5245
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005246 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005247 .vendor = "Eon",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005248 .name = "EN29LV040(A)",
5249 .bustype = BUS_PARALLEL,
5250 .manufacture_id = EON_ID,
5251 .model_id = EON_EN29LV040,
5252 .total_size = 512,
5253 .page_size = 4 * 1024,
5254 .tested = TEST_OK_PREW,
5255 .probe = probe_jedec,
5256 .probe_timing = TIMING_ZERO,
5257 .block_erasers =
5258 {
5259 {
5260 .eraseblocks = { {64 * 1024, 8} },
5261 .block_erase = erase_sector_jedec,
5262 },
5263 {
5264 .eraseblocks = { {512 * 1024, 1} },
5265 .block_erase = erase_chip_block_jedec,
5266 },
5267 },
5268 .write = write_jedec_1,
5269 .read = read_memmapped,
5270 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5271 },
5272
5273 {
5274 .vendor = "Eon",
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005275 .name = "EN29LV640B",
5276 .bustype = BUS_PARALLEL,
5277 .manufacture_id = EON_ID,
5278 .model_id = EON_EN29LV640B,
5279 .total_size = 8192,
5280 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005281 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005282 .tested = TEST_OK_PREW,
5283 .probe = probe_en29lv640b,
5284 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5285 .block_erasers =
5286 {
5287 {
5288 .eraseblocks = {
5289 {8 * 1024, 8},
5290 {64 * 1024, 127},
5291 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005292 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005293 }, {
5294 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005295 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005296 },
5297 },
5298 .write = write_en29lv640b,
5299 .read = read_memmapped,
5300 .voltage = {2700, 3600},
5301 },
5302
5303 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005304 .vendor = "Eon",
5305 .name = "EN29GL064(A)B",
5306 .bustype = BUS_PARALLEL,
5307 .manufacture_id = EON_ID,
5308 .model_id = EON_EN29GL064B,
5309 .total_size = 8192,
5310 .page_size = 128 * 1024, /* actual page size is 16 */
5311 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5312 .tested = TEST_UNTESTED,
5313 .probe = probe_jedec_29gl,
5314 .probe_timing = TIMING_ZERO,
5315 .block_erasers =
5316 {
5317 {
5318 .eraseblocks = {
5319 {8 * 1024, 8},
5320 {64 * 1024, 127},
5321 },
5322 .block_erase = erase_sector_jedec,
5323 }, {
5324 .eraseblocks = { {8 * 1024 * 1024, 1} },
5325 .block_erase = erase_chip_block_jedec,
5326 },
5327 },
5328 .write = write_jedec_1,
5329 .read = read_memmapped,
5330 .voltage = {2700, 3600},
5331 },
5332
5333 {
5334 .vendor = "Eon",
5335 .name = "EN29GL064(A)T",
5336 .bustype = BUS_PARALLEL,
5337 .manufacture_id = EON_ID,
5338 .model_id = EON_EN29GL064T,
5339 .total_size = 8192,
5340 .page_size = 128 * 1024, /* actual page size is 16 */
5341 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5342 .tested = TEST_UNTESTED,
5343 .probe = probe_jedec_29gl,
5344 .probe_timing = TIMING_ZERO,
5345 .block_erasers =
5346 {
5347 {
5348 .eraseblocks = {
5349 {64 * 1024, 127},
5350 {8 * 1024, 8},
5351 },
5352 .block_erase = erase_sector_jedec,
5353 }, {
5354 .eraseblocks = { {8 * 1024 * 1024, 1} },
5355 .block_erase = erase_chip_block_jedec,
5356 },
5357 },
5358 .write = write_jedec_1,
5359 .read = read_memmapped,
5360 .voltage = {2700, 3600},
5361 },
5362
5363 {
5364 .vendor = "Eon",
5365 .name = "EN29GL064H/L",
5366 .bustype = BUS_PARALLEL,
5367 .manufacture_id = EON_ID,
5368 .model_id = EON_EN29GL064HL,
5369 .total_size = 8192,
5370 .page_size = 128 * 1024, /* actual page size is 16 */
5371 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5372 .tested = TEST_UNTESTED,
5373 .probe = probe_jedec_29gl,
5374 .probe_timing = TIMING_ZERO,
5375 .block_erasers =
5376 {
5377 {
5378 .eraseblocks = { {64 * 1024, 128} },
5379 .block_erase = erase_sector_jedec,
5380 }, {
5381 .eraseblocks = { {8 * 1024 * 1024, 1} },
5382 .block_erase = erase_chip_block_jedec,
5383 },
5384 },
5385 .write = write_jedec_1,
5386 .read = read_memmapped,
5387 .voltage = {2700, 3600},
5388 },
5389
5390 {
5391 .vendor = "Eon",
5392 .name = "EN29GL128",
5393 .bustype = BUS_PARALLEL,
5394 .manufacture_id = EON_ID,
5395 .model_id = EON_EN29GL128HL,
5396 .total_size = 16384,
5397 .page_size = 128 * 1024, /* actual page size is 16 */
5398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5399 .tested = TEST_UNTESTED,
5400 .probe = probe_jedec_29gl,
5401 .probe_timing = TIMING_ZERO,
5402 .block_erasers =
5403 {
5404 {
5405 .eraseblocks = { {128 * 1024, 128} },
5406 .block_erase = erase_sector_jedec,
5407 }, {
5408 .eraseblocks = { {16 * 1024 * 1024, 1} },
5409 .block_erase = erase_chip_block_jedec,
5410 },
5411 },
5412 .write = write_jedec_1,
5413 .read = read_memmapped,
5414 .voltage = {2700, 3600},
5415 },
5416
5417 {
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005418 .vendor = "ESI",
5419 .name = "ES25P40",
5420 .bustype = BUS_SPI,
5421 .manufacture_id = EXCEL_ID_NOPREFIX,
5422 .model_id = EXCEL_ES25P40,
5423 .total_size = 512,
5424 .page_size = 256,
5425 /* 256-byte paramter page separate from memory array:
5426 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5427 .feature_bits = FEATURE_WRSR_WREN,
5428 .tested = TEST_UNTESTED,
5429 .probe = probe_spi_rdid,
5430 .probe_timing = TIMING_ZERO,
5431 .block_erasers =
5432 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005433 {
5434 .eraseblocks = { {64 * 1024, 8} },
5435 .block_erase = spi_block_erase_d8,
5436 }, {
5437 .eraseblocks = { {512 * 1024, 1} },
5438 .block_erase = spi_block_erase_c7,
5439 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005440 },
5441 .printlock = spi_prettyprint_status_register_bp2_srwd,
5442 .unlock = spi_disable_blockprotect_bp2_srwd,
5443 .write = spi_chip_write_256,
5444 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5445 .voltage = {2700, 3600},
5446 },
5447
5448 {
5449 .vendor = "ESI",
5450 .name = "ES25P80",
5451 .bustype = BUS_SPI,
5452 .manufacture_id = EXCEL_ID_NOPREFIX,
5453 .model_id = EXCEL_ES25P80,
5454 .total_size = 1024,
5455 .page_size = 256,
5456 /* 256-byte paramter page separate from memory array:
5457 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5458 .feature_bits = FEATURE_WRSR_WREN,
5459 .tested = TEST_UNTESTED,
5460 .probe = probe_spi_rdid,
5461 .probe_timing = TIMING_ZERO,
5462 .block_erasers =
5463 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005464 {
5465 .eraseblocks = { {64 * 1024, 16} },
5466 .block_erase = spi_block_erase_d8,
5467 }, {
5468 .eraseblocks = { {1024 * 1024, 1} },
5469 .block_erase = spi_block_erase_c7,
5470 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005471 },
5472 .printlock = spi_prettyprint_status_register_bp2_srwd,
5473 .unlock = spi_disable_blockprotect_bp2_srwd,
5474 .write = spi_chip_write_256,
5475 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5476 .voltage = {2700, 3600},
5477 },
5478
5479 {
5480 .vendor = "ESI",
5481 .name = "ES25P16",
5482 .bustype = BUS_SPI,
5483 .manufacture_id = EXCEL_ID_NOPREFIX,
5484 .model_id = EXCEL_ES25P16,
5485 .total_size = 2 * 1024,
5486 .page_size = 256,
5487 /* 256-byte paramter page separate from memory array:
5488 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5489 .feature_bits = FEATURE_WRSR_WREN,
5490 .tested = TEST_UNTESTED,
5491 .probe = probe_spi_rdid,
5492 .probe_timing = TIMING_ZERO,
5493 .block_erasers =
5494 {
5495 {
5496 .eraseblocks = { {64 * 1024, 32} },
5497 .block_erase = spi_block_erase_d8,
5498 }, {
5499 .eraseblocks = { {2 * 1024 * 1024, 1} },
5500 .block_erase = spi_block_erase_c7,
5501 }
5502 },
5503 .printlock = spi_prettyprint_status_register_bp2_srwd,
5504 .unlock = spi_disable_blockprotect_bp2_srwd,
5505 .write = spi_chip_write_256,
5506 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5507 .voltage = {2700, 3600},
5508 },
5509
5510 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005511 .vendor = "Fujitsu",
5512 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005513 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005514 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005515 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005516 .total_size = 512,
5517 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005518 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005519 .tested = TEST_UNTESTED,
5520 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005521 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005522 .block_erasers =
5523 {
5524 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005525 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005526 {16 * 1024, 1},
5527 {8 * 1024, 2},
5528 {32 * 1024, 1},
5529 {64 * 1024, 7},
5530 },
Sean Nelson35727f72010-01-28 23:55:12 +00005531 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005532 }, {
5533 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005534 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005535 },
5536 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005537 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005538 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005539 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005540 },
5541
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005542 {
5543 .vendor = "Fujitsu",
5544 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005545 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005546 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005547 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005548 .total_size = 512,
5549 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005550 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005551 .tested = TEST_UNTESTED,
5552 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005553 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005554 .block_erasers =
5555 {
5556 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005557 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005558 {64 * 1024, 7},
5559 {32 * 1024, 1},
5560 {8 * 1024, 2},
5561 {16 * 1024, 1},
5562 },
Sean Nelson35727f72010-01-28 23:55:12 +00005563 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005564 }, {
5565 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005566 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005567 },
5568 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005569 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005570 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005571 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005572 },
5573
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005574 {
Sean Nelson35727f72010-01-28 23:55:12 +00005575 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005576 .vendor = "Fujitsu",
5577 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005578 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005579 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005580 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005581 .total_size = 512,
5582 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005583 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005584 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005585 .probe = probe_jedec,
5586 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005587 .block_erasers =
5588 {
5589 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005590 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005591 {16 * 1024, 1},
5592 {8 * 1024, 2},
5593 {32 * 1024, 1},
5594 {64 * 1024, 7},
5595 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005596 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005597 }, {
5598 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005599 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005600 },
5601 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005602 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005603 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005604 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005605 },
5606
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005607 {
5608 .vendor = "Fujitsu",
5609 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005610 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005611 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005612 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005613 .total_size = 512,
5614 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005615 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005616 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005617 .probe = probe_jedec,
5618 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005619 .block_erasers =
5620 {
5621 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005622 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005623 {64 * 1024, 7},
5624 {32 * 1024, 1},
5625 {8 * 1024, 2},
5626 {16 * 1024, 1},
5627 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005628 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005629 }, {
5630 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005631 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005632 },
5633 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005634 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005635 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005636 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005637 },
5638
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005639 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005640 .vendor = "Fujitsu",
5641 .name = "MBM29LV160BE",
5642 .bustype = BUS_PARALLEL,
5643 .manufacture_id = FUJITSU_ID,
5644 .model_id = FUJITSU_MBM29LV160BE,
5645 .total_size = 2 * 1024,
5646 .page_size = 0,
5647 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5648 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005649 .probe = probe_jedec,
5650 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005651 .block_erasers =
5652 {
5653 {
5654 .eraseblocks = {
5655 {16 * 1024, 1},
5656 {8 * 1024, 2},
5657 {32 * 1024, 1},
5658 {64 * 1024, 31},
5659 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005660 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005661 }, {
5662 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005663 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005664 },
5665 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005666 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005667 .read = read_memmapped,
5668 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5669 },
5670
5671 {
5672 .vendor = "Fujitsu",
5673 .name = "MBM29LV160TE",
5674 .bustype = BUS_PARALLEL,
5675 .manufacture_id = FUJITSU_ID,
5676 .model_id = FUJITSU_MBM29LV160TE,
5677 .total_size = 2 * 1024,
5678 .page_size = 0,
5679 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5680 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005681 .probe = probe_jedec,
5682 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005683 .block_erasers =
5684 {
5685 {
5686 .eraseblocks = {
5687 {64 * 1024, 31},
5688 {32 * 1024, 1},
5689 {8 * 1024, 2},
5690 {16 * 1024, 1},
5691 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005692 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005693 }, {
5694 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005695 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005696 },
5697 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005698 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005699 .read = read_memmapped,
5700 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5701 },
5702
5703 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005704 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00005705 .name = "GD25LQ40",
5706 .bustype = BUS_SPI,
5707 .manufacture_id = GIGADEVICE_ID,
5708 .model_id = GIGADEVICE_GD25LQ40,
5709 .total_size = 512,
5710 .page_size = 256,
5711 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5712 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5713 .tested = TEST_UNTESTED,
5714 .probe = probe_spi_rdid,
5715 .probe_timing = TIMING_ZERO,
5716 .block_erasers =
5717 {
5718 {
5719 .eraseblocks = { {4 * 1024, 128} },
5720 .block_erase = spi_block_erase_20,
5721 }, {
5722 .eraseblocks = { {32 * 1024, 16} },
5723 .block_erase = spi_block_erase_52,
5724 }, {
5725 .eraseblocks = { {64 * 1024, 8} },
5726 .block_erase = spi_block_erase_d8,
5727 }, {
5728 .eraseblocks = { {512 * 1024, 1} },
5729 .block_erase = spi_block_erase_60,
5730 }, {
5731 .eraseblocks = { {512 * 1024, 1} },
5732 .block_erase = spi_block_erase_c7,
5733 }
5734 },
5735 .printlock = spi_prettyprint_status_register_bp4_srwd,
5736 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5737 .write = spi_chip_write_256,
5738 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5739 .voltage = {1695, 1950},
5740 },
5741
5742 {
5743 .vendor = "GigaDevice",
5744 .name = "GD25LQ80",
5745 .bustype = BUS_SPI,
5746 .manufacture_id = GIGADEVICE_ID,
5747 .model_id = GIGADEVICE_GD25LQ80,
5748 .total_size = 1024,
5749 .page_size = 256,
5750 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5751 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5752 .tested = TEST_UNTESTED,
5753 .probe = probe_spi_rdid,
5754 .probe_timing = TIMING_ZERO,
5755 .block_erasers =
5756 {
5757 {
5758 .eraseblocks = { {4 * 1024, 256} },
5759 .block_erase = spi_block_erase_20,
5760 }, {
5761 .eraseblocks = { {32 * 1024, 32} },
5762 .block_erase = spi_block_erase_52,
5763 }, {
5764 .eraseblocks = { {64 * 1024, 16} },
5765 .block_erase = spi_block_erase_d8,
5766 }, {
5767 .eraseblocks = { {1 * 1024 * 1024, 1} },
5768 .block_erase = spi_block_erase_60,
5769 }, {
5770 .eraseblocks = { {1 * 1024 * 1024, 1} },
5771 .block_erase = spi_block_erase_c7,
5772 }
5773 },
5774 .printlock = spi_prettyprint_status_register_bp4_srwd,
5775 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5776 .write = spi_chip_write_256,
5777 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5778 .voltage = {1695, 1950},
5779 },
5780
5781 {
5782 .vendor = "GigaDevice",
5783 .name = "GD25LQ16",
5784 .bustype = BUS_SPI,
5785 .manufacture_id = GIGADEVICE_ID,
5786 .model_id = GIGADEVICE_GD25LQ16,
5787 .total_size = 2048,
5788 .page_size = 256,
5789 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5790 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5791 .tested = TEST_UNTESTED,
5792 .probe = probe_spi_rdid,
5793 .probe_timing = TIMING_ZERO,
5794 .block_erasers =
5795 {
5796 {
5797 .eraseblocks = { {4 * 1024, 512} },
5798 .block_erase = spi_block_erase_20,
5799 }, {
5800 .eraseblocks = { {32 * 1024, 64} },
5801 .block_erase = spi_block_erase_52,
5802 }, {
5803 .eraseblocks = { {64 * 1024, 32} },
5804 .block_erase = spi_block_erase_d8,
5805 }, {
5806 .eraseblocks = { {2 * 1024 * 1024, 1} },
5807 .block_erase = spi_block_erase_60,
5808 }, {
5809 .eraseblocks = { {2 * 1024 * 1024, 1} },
5810 .block_erase = spi_block_erase_c7,
5811 }
5812 },
5813 .printlock = spi_prettyprint_status_register_bp4_srwd,
5814 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5815 .write = spi_chip_write_256,
5816 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5817 .voltage = {1695, 1950},
5818 },
5819
5820 {
5821 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005822 .name = "GD25LQ32",
5823 .bustype = BUS_SPI,
5824 .manufacture_id = GIGADEVICE_ID,
5825 .model_id = GIGADEVICE_GD25LQ32,
5826 .total_size = 4096,
5827 .page_size = 256,
5828 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5829 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5830 .tested = TEST_OK_PREW,
5831 .probe = probe_spi_rdid,
5832 .probe_timing = TIMING_ZERO,
5833 .block_erasers =
5834 {
5835 {
5836 .eraseblocks = { {4 * 1024, 1024} },
5837 .block_erase = spi_block_erase_20,
5838 }, {
5839 .eraseblocks = { {32 * 1024, 128} },
5840 .block_erase = spi_block_erase_52,
5841 }, {
5842 .eraseblocks = { {64 * 1024, 64} },
5843 .block_erase = spi_block_erase_d8,
5844 }, {
5845 .eraseblocks = { {4 * 1024 * 1024, 1} },
5846 .block_erase = spi_block_erase_60,
5847 }, {
5848 .eraseblocks = { {4 * 1024 * 1024, 1} },
5849 .block_erase = spi_block_erase_c7,
5850 }
5851 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005852 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005853 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5854 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00005855 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5856 .voltage = {1695, 1950},
5857 },
5858
5859 {
5860 .vendor = "GigaDevice",
5861 .name = "GD25LQ64(B)",
5862 .bustype = BUS_SPI,
5863 .manufacture_id = GIGADEVICE_ID,
5864 .model_id = GIGADEVICE_GD25LQ64,
5865 .total_size = 8192,
5866 .page_size = 256,
5867 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5868 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005869 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00005870 .probe = probe_spi_rdid,
5871 .probe_timing = TIMING_ZERO,
5872 .block_erasers =
5873 {
5874 {
5875 .eraseblocks = { {4 * 1024, 2048} },
5876 .block_erase = spi_block_erase_20,
5877 }, {
5878 .eraseblocks = { {32 * 1024, 256} },
5879 .block_erase = spi_block_erase_52,
5880 }, {
5881 .eraseblocks = { {64 * 1024, 128} },
5882 .block_erase = spi_block_erase_d8,
5883 }, {
5884 .eraseblocks = { {8 * 1024 * 1024, 1} },
5885 .block_erase = spi_block_erase_60,
5886 }, {
5887 .eraseblocks = { {8 * 1024 * 1024, 1} },
5888 .block_erase = spi_block_erase_c7,
5889 }
5890 },
5891 .printlock = spi_prettyprint_status_register_bp4_srwd,
5892 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5893 .write = spi_chip_write_256,
5894 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5895 .voltage = {1695, 1950},
5896 },
5897
5898 {
5899 .vendor = "GigaDevice",
5900 .name = "GD25LQ128",
5901 .bustype = BUS_SPI,
5902 .manufacture_id = GIGADEVICE_ID,
5903 .model_id = GIGADEVICE_GD25LQ128,
5904 .total_size = 16384,
5905 .page_size = 256,
5906 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5907 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5908 .tested = TEST_UNTESTED,
5909 .probe = probe_spi_rdid,
5910 .probe_timing = TIMING_ZERO,
5911 .block_erasers =
5912 {
5913 {
5914 .eraseblocks = { {4 * 1024, 4096} },
5915 .block_erase = spi_block_erase_20,
5916 }, {
5917 .eraseblocks = { {32 * 1024, 512} },
5918 .block_erase = spi_block_erase_52,
5919 }, {
5920 .eraseblocks = { {64 * 1024, 256} },
5921 .block_erase = spi_block_erase_d8,
5922 }, {
5923 .eraseblocks = { {16 * 1024 * 1024, 1} },
5924 .block_erase = spi_block_erase_60,
5925 }, {
5926 .eraseblocks = { {16 * 1024 * 1024, 1} },
5927 .block_erase = spi_block_erase_c7,
5928 }
5929 },
5930 .printlock = spi_prettyprint_status_register_bp4_srwd,
5931 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5932 .write = spi_chip_write_256,
5933 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5934 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005935 },
5936
5937 {
5938 .vendor = "GigaDevice",
5939 .name = "GD25Q512",
5940 .bustype = BUS_SPI,
5941 .manufacture_id = GIGADEVICE_ID,
5942 .model_id = GIGADEVICE_GD25Q512,
5943 .total_size = 64,
5944 .page_size = 256,
5945 .feature_bits = FEATURE_WRSR_WREN,
5946 .tested = TEST_UNTESTED,
5947 .probe = probe_spi_rdid,
5948 .probe_timing = TIMING_ZERO,
5949 .block_erasers = {
5950 {
5951 .eraseblocks = { {4 * 1024, 16} },
5952 .block_erase = spi_block_erase_20,
5953 }, {
5954 .eraseblocks = { {32 * 1024, 2} },
5955 .block_erase = spi_block_erase_52,
5956 }, {
5957 .eraseblocks = { {64 * 1024, 1} },
5958 .block_erase = spi_block_erase_60,
5959 }, {
5960 .eraseblocks = { {64 * 1024, 1} },
5961 .block_erase = spi_block_erase_c7,
5962 }
5963 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005964 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005965 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5966 .write = spi_chip_write_256,
5967 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5968 .voltage = {2700, 3600},
5969 },
5970
5971 {
5972 .vendor = "GigaDevice",
5973 .name = "GD25Q10",
5974 .bustype = BUS_SPI,
5975 .manufacture_id = GIGADEVICE_ID,
5976 .model_id = GIGADEVICE_GD25Q10,
5977 .total_size = 128,
5978 .page_size = 256,
5979 .feature_bits = FEATURE_WRSR_WREN,
5980 .tested = TEST_UNTESTED,
5981 .probe = probe_spi_rdid,
5982 .probe_timing = TIMING_ZERO,
5983 .block_erasers = {
5984 {
5985 .eraseblocks = { {4 * 1024, 32} },
5986 .block_erase = spi_block_erase_20,
5987 }, {
5988 .eraseblocks = { {32 * 1024, 4} },
5989 .block_erase = spi_block_erase_52,
5990 }, {
5991 .eraseblocks = { {64 * 1024, 2} },
5992 .block_erase = spi_block_erase_d8,
5993 }, {
5994 .eraseblocks = { {128 * 1024, 1} },
5995 .block_erase = spi_block_erase_60,
5996 }, {
5997 .eraseblocks = { {128 * 1024, 1} },
5998 .block_erase = spi_block_erase_c7,
5999 }
6000 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006001 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006002 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6003 .write = spi_chip_write_256,
6004 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6005 .voltage = {2700, 3600},
6006 },
6007
6008 {
6009 .vendor = "GigaDevice",
6010 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006011 .bustype = BUS_SPI,
6012 .manufacture_id = GIGADEVICE_ID,
6013 .model_id = GIGADEVICE_GD25Q20,
6014 .total_size = 256,
6015 .page_size = 256,
6016 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00006017 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006018 .probe = probe_spi_rdid,
6019 .probe_timing = TIMING_ZERO,
6020 .block_erasers =
6021 {
6022 {
6023 .eraseblocks = { {4 * 1024, 64} },
6024 .block_erase = spi_block_erase_20,
6025 }, {
6026 .eraseblocks = { {32 * 1024, 8} },
6027 .block_erase = spi_block_erase_52,
6028 }, {
6029 .eraseblocks = { {64 * 1024, 4} },
6030 .block_erase = spi_block_erase_d8,
6031 }, {
6032 .eraseblocks = { {256 * 1024, 1} },
6033 .block_erase = spi_block_erase_60,
6034 }, {
6035 .eraseblocks = { {256 * 1024, 1} },
6036 .block_erase = spi_block_erase_c7,
6037 }
6038 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006039 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006040 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006041 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006042 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006043 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006044 },
6045
6046 {
6047 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006048 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006049 .bustype = BUS_SPI,
6050 .manufacture_id = GIGADEVICE_ID,
6051 .model_id = GIGADEVICE_GD25Q40,
6052 .total_size = 512,
6053 .page_size = 256,
6054 .feature_bits = FEATURE_WRSR_WREN,
6055 .tested = TEST_UNTESTED,
6056 .probe = probe_spi_rdid,
6057 .probe_timing = TIMING_ZERO,
6058 .block_erasers =
6059 {
6060 {
6061 .eraseblocks = { {4 * 1024, 128} },
6062 .block_erase = spi_block_erase_20,
6063 }, {
6064 .eraseblocks = { {32 * 1024, 16} },
6065 .block_erase = spi_block_erase_52,
6066 }, {
6067 .eraseblocks = { {64 * 1024, 8} },
6068 .block_erase = spi_block_erase_d8,
6069 }, {
6070 .eraseblocks = { {512 * 1024, 1} },
6071 .block_erase = spi_block_erase_60,
6072 }, {
6073 .eraseblocks = { {512 * 1024, 1} },
6074 .block_erase = spi_block_erase_c7,
6075 }
6076 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006077 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006078 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006079 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006080 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006081 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006082 },
6083
6084 {
6085 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006086 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006087 .bustype = BUS_SPI,
6088 .manufacture_id = GIGADEVICE_ID,
6089 .model_id = GIGADEVICE_GD25Q80,
6090 .total_size = 1024,
6091 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006092 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006093 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6094 .tested = TEST_OK_PREW,
6095 .probe = probe_spi_rdid,
6096 .probe_timing = TIMING_ZERO,
6097 .block_erasers =
6098 {
6099 {
6100 .eraseblocks = { {4 * 1024, 256} },
6101 .block_erase = spi_block_erase_20,
6102 }, {
6103 .eraseblocks = { {32 * 1024, 32} },
6104 .block_erase = spi_block_erase_52,
6105 }, {
6106 .eraseblocks = { {64 * 1024, 16} },
6107 .block_erase = spi_block_erase_d8,
6108 }, {
6109 .eraseblocks = { {1024 * 1024, 1} },
6110 .block_erase = spi_block_erase_60,
6111 }, {
6112 .eraseblocks = { {1024 * 1024, 1} },
6113 .block_erase = spi_block_erase_c7,
6114 }
6115 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006116 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006117 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006118 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006119 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006120 .voltage = {2700, 3600},
6121 },
6122
6123 {
6124 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006125 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006126 .bustype = BUS_SPI,
6127 .manufacture_id = GIGADEVICE_ID,
6128 .model_id = GIGADEVICE_GD25Q16,
6129 .total_size = 2048,
6130 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006131 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006132 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00006133 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006134 .probe = probe_spi_rdid,
6135 .probe_timing = TIMING_ZERO,
6136 .block_erasers =
6137 {
6138 {
6139 .eraseblocks = { {4 * 1024, 512} },
6140 .block_erase = spi_block_erase_20,
6141 }, {
6142 .eraseblocks = { {32 * 1024, 64} },
6143 .block_erase = spi_block_erase_52,
6144 }, {
6145 .eraseblocks = { {64 * 1024, 32} },
6146 .block_erase = spi_block_erase_d8,
6147 }, {
6148 .eraseblocks = { {2 * 1024 * 1024, 1} },
6149 .block_erase = spi_block_erase_60,
6150 }, {
6151 .eraseblocks = { {2 * 1024 * 1024, 1} },
6152 .block_erase = spi_block_erase_c7,
6153 }
6154 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006155 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006156 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006157 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006158 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006159 .voltage = {2700, 3600},
6160 },
6161
6162 {
6163 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006164 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006165 .bustype = BUS_SPI,
6166 .manufacture_id = GIGADEVICE_ID,
6167 .model_id = GIGADEVICE_GD25Q32,
6168 .total_size = 4096,
6169 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006170 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006171 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006172 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006173 .probe = probe_spi_rdid,
6174 .probe_timing = TIMING_ZERO,
6175 .block_erasers =
6176 {
6177 {
6178 .eraseblocks = { {4 * 1024, 1024} },
6179 .block_erase = spi_block_erase_20,
6180 }, {
6181 .eraseblocks = { {32 * 1024, 128} },
6182 .block_erase = spi_block_erase_52,
6183 }, {
6184 .eraseblocks = { {64 * 1024, 64} },
6185 .block_erase = spi_block_erase_d8,
6186 }, {
6187 .eraseblocks = { {4 * 1024 * 1024, 1} },
6188 .block_erase = spi_block_erase_60,
6189 }, {
6190 .eraseblocks = { {4 * 1024 * 1024, 1} },
6191 .block_erase = spi_block_erase_c7,
6192 }
6193 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006194 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006195 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006196 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006197 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006198 .voltage = {2700, 3600},
6199 },
6200
6201 {
6202 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006203 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006204 .bustype = BUS_SPI,
6205 .manufacture_id = GIGADEVICE_ID,
6206 .model_id = GIGADEVICE_GD25Q64,
6207 .total_size = 8192,
6208 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006209 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00006211 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006212 .probe = probe_spi_rdid,
6213 .probe_timing = TIMING_ZERO,
6214 .block_erasers =
6215 {
6216 {
6217 .eraseblocks = { {4 * 1024, 2048} },
6218 .block_erase = spi_block_erase_20,
6219 }, {
6220 .eraseblocks = { {32 * 1024, 256} },
6221 .block_erase = spi_block_erase_52,
6222 }, {
6223 .eraseblocks = { {64 * 1024, 128} },
6224 .block_erase = spi_block_erase_d8,
6225 }, {
6226 .eraseblocks = { {8 * 1024 * 1024, 1} },
6227 .block_erase = spi_block_erase_60,
6228 }, {
6229 .eraseblocks = { {8 * 1024 * 1024, 1} },
6230 .block_erase = spi_block_erase_c7,
6231 }
6232 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006233 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006234 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006235 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006236 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00006237 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006238 },
6239
6240 {
6241 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006242 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006243 .bustype = BUS_SPI,
6244 .manufacture_id = GIGADEVICE_ID,
6245 .model_id = GIGADEVICE_GD25Q128,
6246 .total_size = 16384,
6247 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006248 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006249 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6250 .tested = TEST_UNTESTED,
6251 .probe = probe_spi_rdid,
6252 .probe_timing = TIMING_ZERO,
6253 .block_erasers =
6254 {
6255 {
6256 .eraseblocks = { {4 * 1024, 4096} },
6257 .block_erase = spi_block_erase_20,
6258 }, {
6259 .eraseblocks = { {32 * 1024, 512} },
6260 .block_erase = spi_block_erase_52,
6261 }, {
6262 .eraseblocks = { {64 * 1024, 256} },
6263 .block_erase = spi_block_erase_d8,
6264 }, {
6265 .eraseblocks = { {16 * 1024 * 1024, 1} },
6266 .block_erase = spi_block_erase_60,
6267 }, {
6268 .eraseblocks = { {16 * 1024 * 1024, 1} },
6269 .block_erase = spi_block_erase_c7,
6270 }
6271 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006272 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006273 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6274 .write = spi_chip_write_256,
6275 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6276 .voltage = {2700, 3600},
6277 },
6278
6279 {
6280 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006281 .name = "GD25Q128C",
6282 .bustype = BUS_SPI,
6283 .manufacture_id = GIGADEVICE_ID,
6284 .model_id = GIGADEVICE_GD25Q128,
6285 .total_size = 16384,
6286 .page_size = 256,
6287 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6288 /* QPI: enable 0x38, disable 0xFF */
6289 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6290 .tested = TEST_UNTESTED,
6291 .probe = probe_spi_rdid,
6292 .probe_timing = TIMING_ZERO,
6293 .block_erasers =
6294 {
6295 {
6296 .eraseblocks = { {4 * 1024, 4096} },
6297 .block_erase = spi_block_erase_20,
6298 }, {
6299 .eraseblocks = { {32 * 1024, 512} },
6300 .block_erase = spi_block_erase_52,
6301 }, {
6302 .eraseblocks = { {64 * 1024, 256} },
6303 .block_erase = spi_block_erase_d8,
6304 }, {
6305 .eraseblocks = { {16 * 1024 * 1024, 1} },
6306 .block_erase = spi_block_erase_60,
6307 }, {
6308 .eraseblocks = { {16 * 1024 * 1024, 1} },
6309 .block_erase = spi_block_erase_c7,
6310 }
6311 },
6312 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6313 .printlock = spi_prettyprint_status_register_bp4_srwd,
6314 .unlock = spi_disable_blockprotect_bp4_srwd,
6315 .write = spi_chip_write_256,
6316 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6317 .voltage = {2700, 3600},
6318 },
6319
6320 {
6321 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006322 .name = "GD25T80",
6323 .bustype = BUS_SPI,
6324 .manufacture_id = GIGADEVICE_ID,
6325 .model_id = GIGADEVICE_GD25T80,
6326 .total_size = 1024,
6327 .page_size = 256,
6328 /* OTP: 256B total; enter 0x3A */
6329 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6330 .tested = TEST_UNTESTED,
6331 .probe = probe_spi_rdid,
6332 .probe_timing = TIMING_ZERO,
6333 .block_erasers = {
6334 {
6335 .eraseblocks = { {4 * 1024, 256} },
6336 .block_erase = spi_block_erase_20,
6337 }, {
6338 .eraseblocks = { {64 * 1024, 16} },
6339 .block_erase = spi_block_erase_52,
6340 }, {
6341 .eraseblocks = { {64 * 1024, 16} },
6342 .block_erase = spi_block_erase_d8,
6343 }, {
6344 .eraseblocks = { {1024 * 1024, 1} },
6345 .block_erase = spi_block_erase_60,
6346 }, {
6347 .eraseblocks = { {1024 * 1024, 1} },
6348 .block_erase = spi_block_erase_c7,
6349 }
6350 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00006351 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006352 .unlock = spi_disable_blockprotect,
6353 .write = spi_chip_write_256,
6354 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006355 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006356 },
6357
6358 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006359 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006360 .name = "GD25VQ21B",
6361 .bustype = BUS_SPI,
6362 .manufacture_id = GIGADEVICE_ID,
6363 .model_id = GIGADEVICE_GD25VQ21B,
6364 .total_size = 256,
6365 .page_size = 256,
6366 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6367 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6368 .tested = TEST_UNTESTED,
6369 .probe = probe_spi_rdid,
6370 .probe_timing = TIMING_ZERO,
6371 .block_erasers =
6372 {
6373 {
6374 .eraseblocks = { { 4 * 1024, 64} },
6375 .block_erase = spi_block_erase_20,
6376 }, {
6377 .eraseblocks = { { 32 * 1024, 8} },
6378 .block_erase = spi_block_erase_52,
6379 }, {
6380 .eraseblocks = { { 64 * 1024, 4} },
6381 .block_erase = spi_block_erase_d8,
6382 }, {
6383 .eraseblocks = { {256 * 1024, 1} },
6384 .block_erase = spi_block_erase_60,
6385 }, {
6386 .eraseblocks = { {256 * 1024, 1} },
6387 .block_erase = spi_block_erase_c7,
6388 }
6389 },
6390 .printlock = spi_prettyprint_status_register_bp4_srwd,
6391 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6392 .write = spi_chip_write_256,
6393 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6394 .voltage = {2300, 3600},
6395 },
6396
6397 {
6398 .vendor = "GigaDevice",
6399 .name = "GD25VQ40C",
6400 .bustype = BUS_SPI,
6401 .manufacture_id = GIGADEVICE_ID,
6402 .model_id = GIGADEVICE_GD25VQ41B,
6403 .total_size = 512,
6404 .page_size = 256,
6405 /* Supports SFDP */
6406 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6407 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6408 .tested = TEST_UNTESTED,
6409 .probe = probe_spi_rdid,
6410 .probe_timing = TIMING_ZERO,
6411 .block_erasers =
6412 {
6413 {
6414 .eraseblocks = { { 4 * 1024, 128} },
6415 .block_erase = spi_block_erase_20,
6416 }, {
6417 .eraseblocks = { { 32 * 1024, 16} },
6418 .block_erase = spi_block_erase_52,
6419 }, {
6420 .eraseblocks = { { 64 * 1024, 8} },
6421 .block_erase = spi_block_erase_d8,
6422 }, {
6423 .eraseblocks = { {512 * 1024, 1} },
6424 .block_erase = spi_block_erase_60,
6425 }, {
6426 .eraseblocks = { {512 * 1024, 1} },
6427 .block_erase = spi_block_erase_c7,
6428 }
6429 },
6430 .printlock = spi_prettyprint_status_register_bp4_srwd,
6431 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6432 .write = spi_chip_write_256,
6433 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6434 .voltage = {2300, 3600},
6435 },
6436
6437 {
6438 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006439 .name = "GD25VQ41B",
6440 .bustype = BUS_SPI,
6441 .manufacture_id = GIGADEVICE_ID,
6442 .model_id = GIGADEVICE_GD25VQ41B,
6443 .total_size = 512,
6444 .page_size = 256,
6445 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6446 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006447 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006448 .probe = probe_spi_rdid,
6449 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006450 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006451 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006452 {
6453 .eraseblocks = { { 4 * 1024, 128} },
6454 .block_erase = spi_block_erase_20,
6455 }, {
6456 .eraseblocks = { { 32 * 1024, 16} },
6457 .block_erase = spi_block_erase_52,
6458 }, {
6459 .eraseblocks = { { 64 * 1024, 8} },
6460 .block_erase = spi_block_erase_d8,
6461 }, {
6462 .eraseblocks = { {512 * 1024, 1} },
6463 .block_erase = spi_block_erase_60,
6464 }, {
6465 .eraseblocks = { {512 * 1024, 1} },
6466 .block_erase = spi_block_erase_c7,
6467 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006468 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006469 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006470 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6471 .write = spi_chip_write_256,
6472 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6473 .voltage = {2300, 3600},
6474 },
6475
6476 {
6477 .vendor = "GigaDevice",
6478 .name = "GD25VQ80C",
6479 .bustype = BUS_SPI,
6480 .manufacture_id = GIGADEVICE_ID,
6481 .model_id = GIGADEVICE_GD25VQ80C,
6482 .total_size = 1024,
6483 .page_size = 256,
6484 /* Supports SFDP */
6485 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6487 .tested = TEST_UNTESTED,
6488 .probe = probe_spi_rdid,
6489 .probe_timing = TIMING_ZERO,
6490 .block_erasers =
6491 {
6492 {
6493 .eraseblocks = { { 4 * 1024, 256} },
6494 .block_erase = spi_block_erase_20,
6495 }, {
6496 .eraseblocks = { { 32 * 1024, 32} },
6497 .block_erase = spi_block_erase_52,
6498 }, {
6499 .eraseblocks = { { 64 * 1024, 16} },
6500 .block_erase = spi_block_erase_d8,
6501 }, {
6502 .eraseblocks = { {1024 * 1024, 1} },
6503 .block_erase = spi_block_erase_60,
6504 }, {
6505 .eraseblocks = { {1024 * 1024, 1} },
6506 .block_erase = spi_block_erase_c7,
6507 }
6508 },
6509 .printlock = spi_prettyprint_status_register_bp4_srwd,
6510 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6511 .write = spi_chip_write_256,
6512 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6513 .voltage = {2300, 3600},
6514 },
6515
6516 {
6517 .vendor = "GigaDevice",
6518 .name = "GD25VQ16C",
6519 .bustype = BUS_SPI,
6520 .manufacture_id = GIGADEVICE_ID,
6521 .model_id = GIGADEVICE_GD25VQ16C,
6522 .total_size = 2 * 1024,
6523 .page_size = 256,
6524 /* Supports SFDP */
6525 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6526 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6527 .tested = TEST_UNTESTED,
6528 .probe = probe_spi_rdid,
6529 .probe_timing = TIMING_ZERO,
6530 .block_erasers =
6531 {
6532 {
6533 .eraseblocks = { { 4 * 1024, 512} },
6534 .block_erase = spi_block_erase_20,
6535 }, {
6536 .eraseblocks = { { 32 * 1024, 64} },
6537 .block_erase = spi_block_erase_52,
6538 }, {
6539 .eraseblocks = { { 64 * 1024, 32} },
6540 .block_erase = spi_block_erase_d8,
6541 }, {
6542 .eraseblocks = { {2 * 1024 * 1024, 1} },
6543 .block_erase = spi_block_erase_60,
6544 }, {
6545 .eraseblocks = { {2 * 1024 * 1024, 1} },
6546 .block_erase = spi_block_erase_c7,
6547 }
6548 },
6549 .printlock = spi_prettyprint_status_register_bp4_srwd,
6550 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006551 .write = spi_chip_write_256,
6552 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6553 .voltage = {2300, 3600},
6554 },
6555
6556 {
David Borgc96a8bd2010-06-21 16:12:22 +00006557 .vendor = "Hyundai",
6558 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006559 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006560 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006561 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00006562 .total_size = 256,
6563 .page_size = 256 * 1024,
6564 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006565 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00006566 .probe = probe_jedec,
6567 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6568 .block_erasers =
6569 {
6570 {
6571 .eraseblocks = {
6572 {64 * 1024, 3},
6573 {32 * 1024, 1},
6574 {8 * 1024, 2},
6575 {16 * 1024, 1},
6576 },
6577 .block_erase = erase_sector_jedec,
6578 }, {
6579 .eraseblocks = { {256 * 1024, 1} },
6580 .block_erase = erase_chip_block_jedec,
6581 },
6582 },
6583 .write = write_jedec_1,
6584 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006585 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006586 },
6587
6588 {
6589 .vendor = "Hyundai",
6590 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006591 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006592 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006593 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00006594 .total_size = 256,
6595 .page_size = 256 * 1024,
6596 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6597 .tested = TEST_UNTESTED,
6598 .probe = probe_jedec,
6599 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6600 .block_erasers =
6601 {
6602 {
6603 .eraseblocks = {
6604 {16 * 1024, 1},
6605 {8 * 1024, 2},
6606 {32 * 1024, 1},
6607 {64 * 1024, 3},
6608 },
6609 .block_erase = erase_sector_jedec,
6610 }, {
6611 .eraseblocks = { {256 * 1024, 1} },
6612 .block_erase = erase_chip_block_jedec,
6613 },
6614 },
6615 .write = write_jedec_1,
6616 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006617 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006618 },
6619
6620 {
Joshua Roysf1324e02010-09-16 00:51:51 +00006621 .vendor = "Hyundai",
6622 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006623 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006624 .manufacture_id = HYUNDAI_ID,
6625 .model_id = HYUNDAI_HY29F040A,
6626 .total_size = 512,
6627 .page_size = 64 * 1024,
6628 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6629 .tested = TEST_UNTESTED,
6630 .probe = probe_jedec,
6631 .probe_timing = TIMING_ZERO,
6632 .block_erasers =
6633 {
6634 {
6635 .eraseblocks = { {64 * 1024, 8} },
6636 .block_erase = erase_sector_jedec,
6637 }, {
6638 .eraseblocks = { {512 * 1024, 1} },
6639 .block_erase = erase_chip_block_jedec,
6640 },
6641 },
6642 .write = write_jedec_1,
6643 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006644 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006645 },
6646
6647 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006648 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006649 .name = "25F160S33B8",
6650 .bustype = BUS_SPI,
6651 .manufacture_id = INTEL_ID,
6652 .model_id = INTEL_25F160S33B8,
6653 .total_size = 2048,
6654 .page_size = 256,
6655 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6656 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6657 .tested = TEST_UNTESTED,
6658 .probe = probe_spi_rdid,
6659 .probe_timing = TIMING_ZERO,
6660 .block_erasers =
6661 {
6662 {
6663 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6664 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6665 * have no effect on the memory contents, but sets a flag in the SR.
6666 .eraseblocks = {
6667 {8 * 1024, 8},
6668 {64 * 1024, 31} // inaccessible
6669 },
6670 .block_erase = spi_block_erase_40,
6671 }, { */
6672 .eraseblocks = { {64 * 1024, 32} },
6673 .block_erase = spi_block_erase_d8,
6674 }, {
6675 .eraseblocks = { {2 * 1024 * 1024, 1} },
6676 .block_erase = spi_block_erase_c7,
6677 }
6678 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006679 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6680 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006681 .write = spi_chip_write_256,
6682 .read = spi_chip_read, /* also fast read 0x0B */
6683 .voltage = {2700, 3600},
6684 },
6685
6686 {
6687 .vendor = "Intel",
6688 .name = "25F160S33T8",
6689 .bustype = BUS_SPI,
6690 .manufacture_id = INTEL_ID,
6691 .model_id = INTEL_25F160S33T8,
6692 .total_size = 2048,
6693 .page_size = 256,
6694 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6695 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6696 .tested = TEST_UNTESTED,
6697 .probe = probe_spi_rdid,
6698 .probe_timing = TIMING_ZERO,
6699 .block_erasers =
6700 {
6701 {
6702 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6703 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6704 * have no effect on the memory contents, but sets a flag in the SR.
6705 .eraseblocks = {
6706 {64 * 1024, 31}, // inaccessible
6707 {8 * 1024, 8}
6708 },
6709 .block_erase = spi_block_erase_40,
6710 }, { */
6711 .eraseblocks = { {64 * 1024, 32} },
6712 .block_erase = spi_block_erase_d8,
6713 }, {
6714 .eraseblocks = { {2 * 1024 * 1024, 1} },
6715 .block_erase = spi_block_erase_c7,
6716 }
6717 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006718 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6719 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006720 .write = spi_chip_write_256,
6721 .read = spi_chip_read, /* also fast read 0x0B */
6722 .voltage = {2700, 3600},
6723 },
6724
6725 {
6726 .vendor = "Intel",
6727 .name = "25F320S33B8",
6728 .bustype = BUS_SPI,
6729 .manufacture_id = INTEL_ID,
6730 .model_id = INTEL_25F320S33B8,
6731 .total_size = 4096,
6732 .page_size = 256,
6733 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6734 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6735 .tested = TEST_UNTESTED,
6736 .probe = probe_spi_rdid,
6737 .probe_timing = TIMING_ZERO,
6738 .block_erasers =
6739 {
6740 {
6741 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6742 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6743 * have no effect on the memory contents, but sets a flag in the SR.
6744 .eraseblocks = {
6745 {8 * 1024, 8},
6746 {64 * 1024, 63} // inaccessible
6747 },
6748 .block_erase = spi_block_erase_40,
6749 }, { */
6750 .eraseblocks = { {64 * 1024, 64} },
6751 .block_erase = spi_block_erase_d8,
6752 }, {
6753 .eraseblocks = { {4 * 1024 * 1024, 1} },
6754 .block_erase = spi_block_erase_c7,
6755 }
6756 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006757 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6758 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006759 .write = spi_chip_write_256,
6760 .read = spi_chip_read, /* also fast read 0x0B */
6761 .voltage = {2700, 3600},
6762 },
6763
6764 {
6765 .vendor = "Intel",
6766 .name = "25F320S33T8",
6767 .bustype = BUS_SPI,
6768 .manufacture_id = INTEL_ID,
6769 .model_id = INTEL_25F320S33T8,
6770 .total_size = 4096,
6771 .page_size = 256,
6772 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6773 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6774 .tested = TEST_UNTESTED,
6775 .probe = probe_spi_rdid,
6776 .probe_timing = TIMING_ZERO,
6777 .block_erasers =
6778 {
6779 {
6780 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6781 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6782 * have no effect on the memory contents, but sets a flag in the SR.
6783 .eraseblocks = {
6784 {64 * 1024, 63}, // inaccessible
6785 {8 * 1024, 8}
6786 },
6787 .block_erase = spi_block_erase_40,
6788 }, { */
6789 .eraseblocks = { {64 * 1024, 64} },
6790 .block_erase = spi_block_erase_d8,
6791 }, {
6792 .eraseblocks = { {4 * 1024 * 1024, 1} },
6793 .block_erase = spi_block_erase_c7,
6794 }
6795 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006796 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6797 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006798 .write = spi_chip_write_256,
6799 .read = spi_chip_read, /* also fast read 0x0B */
6800 .voltage = {2700, 3600},
6801 },
6802
6803 {
6804 .vendor = "Intel",
6805 .name = "25F640S33B8",
6806 .bustype = BUS_SPI,
6807 .manufacture_id = INTEL_ID,
6808 .model_id = INTEL_25F640S33B8,
6809 .total_size = 8192,
6810 .page_size = 256,
6811 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6813 .tested = TEST_UNTESTED,
6814 .probe = probe_spi_rdid,
6815 .probe_timing = TIMING_ZERO,
6816 .block_erasers =
6817 {
6818 {
6819 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6820 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6821 * have no effect on the memory contents, but sets a flag in the SR.
6822 .eraseblocks = {
6823 {8 * 1024, 8},
6824 {64 * 1024, 127} // inaccessible
6825 },
6826 .block_erase = spi_block_erase_40,
6827 }, { */
6828 .eraseblocks = { {64 * 1024, 128} },
6829 .block_erase = spi_block_erase_d8,
6830 }, {
6831 .eraseblocks = { {8 * 1024 * 1024, 1} },
6832 .block_erase = spi_block_erase_c7,
6833 }
6834 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006835 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6836 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006837 .write = spi_chip_write_256,
6838 .read = spi_chip_read, /* also fast read 0x0B */
6839 .voltage = {2700, 3600},
6840 },
6841
6842 {
6843 .vendor = "Intel",
6844 .name = "25F640S33T8",
6845 .bustype = BUS_SPI,
6846 .manufacture_id = INTEL_ID,
6847 .model_id = INTEL_25F640S33T8,
6848 .total_size = 8192,
6849 .page_size = 256,
6850 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6852 .tested = TEST_UNTESTED,
6853 .probe = probe_spi_rdid,
6854 .probe_timing = TIMING_ZERO,
6855 .block_erasers =
6856 {
6857 {
6858 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6859 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6860 * have no effect on the memory contents, but sets a flag in the SR.
6861 .eraseblocks = {
6862 {64 * 1024, 127}, // inaccessible
6863 {8 * 1024, 8}
6864 },
6865 .block_erase = spi_block_erase_40,
6866 }, { */
6867 .eraseblocks = { {64 * 1024, 128} },
6868 .block_erase = spi_block_erase_d8,
6869 }, {
6870 .eraseblocks = { {8 * 1024 * 1024, 1} },
6871 .block_erase = spi_block_erase_c7,
6872 }
6873 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006874 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6875 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006876 .write = spi_chip_write_256,
6877 .read = spi_chip_read, /* also fast read 0x0B */
6878 .voltage = {2700, 3600},
6879 },
6880
6881 {
6882 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006883 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006884 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006885 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006886 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006887 .total_size = 128,
6888 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00006889 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006890 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006891 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006892 .block_erasers =
6893 {
6894 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006895 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006896 {8 * 1024, 1},
6897 {4 * 1024, 2},
6898 {112 * 1024, 1},
6899 },
Sean Nelson28accc22010-03-19 18:47:06 +00006900 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006901 },
6902 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006903 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006904 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006905 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006906 },
6907
6908 {
6909 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006910 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006911 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006912 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006913 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006914 .total_size = 128,
6915 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Stefan Tauner23e10b82016-01-23 16:16:49 +00006916 .tested = TEST_OK_PREW,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006917 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006918 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006919 .block_erasers =
6920 {
6921 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006922 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006923 {112 * 1024, 1},
6924 {4 * 1024, 2},
6925 {8 * 1024, 1},
6926 },
Sean Nelson28accc22010-03-19 18:47:06 +00006927 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006928 },
6929 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006930 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006931 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006932 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006933 },
6934
6935 {
6936 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006937 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006938 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006939 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006940 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006941 .total_size = 256,
6942 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006943 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006944 .probe = probe_82802ab,
6945 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6946 .block_erasers =
6947 {
6948 {
6949 .eraseblocks = {
6950 {128 * 1024, 1},
6951 {96 * 1024, 1},
6952 {8 * 1024, 2},
6953 {16 * 1024, 1},
6954 },
6955 .block_erase = erase_block_82802ab,
6956 },
6957 },
6958 .write = write_82802ab,
6959 .read = read_memmapped,
6960 },
6961
6962 {
6963 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006964 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006965 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006966 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006967 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006968 .total_size = 512,
6969 .page_size = 256,
6970 .tested = TEST_UNTESTED,
6971 .probe = probe_82802ab,
6972 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006973 .block_erasers =
6974 {
6975 {
6976 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006977 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006978 },
6979 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006980 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006981 .write = write_82802ab,
6982 .read = read_memmapped,
6983 },
6984
6985 {
6986 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006987 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006988 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006989 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006990 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006991 .total_size = 512,
6992 .page_size = 128 * 1024, /* maximal block size */
6993 .tested = TEST_UNTESTED,
6994 .probe = probe_82802ab,
6995 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6996 .block_erasers =
6997 {
6998 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006999 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007000 {16 * 1024, 1},
7001 {8 * 1024, 2},
7002 {96 * 1024, 1},
7003 {128 * 1024, 3},
7004 },
7005 .block_erase = erase_block_82802ab,
7006 },
7007 },
7008 .write = write_82802ab,
7009 .read = read_memmapped,
7010 },
7011
7012 {
7013 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007014 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007015 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007016 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007017 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007018 .total_size = 512,
7019 .page_size = 128 * 1024, /* maximal block size */
7020 .tested = TEST_UNTESTED,
7021 .probe = probe_82802ab,
7022 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7023 .block_erasers =
7024 {
7025 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007026 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007027 {128 * 1024, 3},
7028 {96 * 1024, 1},
7029 {8 * 1024, 2},
7030 {16 * 1024, 1},
7031 },
7032 .block_erase = erase_block_82802ab,
7033 },
7034 },
7035 .write = write_82802ab,
7036 .read = read_memmapped,
7037 },
7038
7039 {
7040 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007041 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007042 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007043 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007044 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007045 .total_size = 512,
7046 .page_size = 128 * 1024, /* maximal block size */
7047 .feature_bits = FEATURE_ADDR_SHIFTED,
7048 .tested = TEST_UNTESTED,
7049 .probe = probe_82802ab,
7050 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7051 .block_erasers =
7052 {
7053 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007054 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007055 {16 * 1024, 1},
7056 {8 * 1024, 2},
7057 {96 * 1024, 1},
7058 {128 * 1024, 3},
7059 },
7060 .block_erase = erase_block_82802ab,
7061 },
7062 },
7063 .write = write_82802ab,
7064 .read = read_memmapped,
7065 },
7066
7067 {
7068 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007069 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007070 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007071 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007072 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007073 .total_size = 512,
7074 .page_size = 128 * 1024, /* maximal block size */
7075 .feature_bits = FEATURE_ADDR_SHIFTED,
7076 .tested = TEST_UNTESTED,
7077 .probe = probe_82802ab,
7078 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7079 .block_erasers =
7080 {
7081 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007082 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007083 {128 * 1024, 3},
7084 {96 * 1024, 1},
7085 {8 * 1024, 2},
7086 {16 * 1024, 1},
7087 },
7088 .block_erase = erase_block_82802ab,
7089 },
7090 },
7091 .write = write_82802ab,
7092 .read = read_memmapped,
7093 },
7094
7095 {
7096 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007097 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007098 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007099 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007100 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007101 .total_size = 512,
7102 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007103 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007104 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007105 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007106 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007107 .block_erasers =
7108 {
7109 {
7110 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007111 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007112 },
7113 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007114 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007115 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007116 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007117 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007118 },
7119
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007120 {
7121 .vendor = "Intel",
7122 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007123 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007124 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007125 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007126 .total_size = 1024,
7127 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007128 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00007129 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007130 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007131 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007132 .block_erasers =
7133 {
7134 {
7135 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00007136 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007137 },
7138 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007139 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007140 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007141 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007142 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007143 },
7144
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007145 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007146 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007147 .name = "IS25LP128",
7148 .bustype = BUS_SPI,
7149 .manufacture_id = ISSI_ID_SPI,
7150 .model_id = ISSI_IS25LP128,
7151 .total_size = 16384,
7152 .page_size = 256,
7153 /* OTP: 1024B total; read 0x48; write 0x42 */
7154 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7155 .tested = TEST_OK_PREW,
7156 .probe = probe_spi_rdid,
7157 .probe_timing = TIMING_ZERO,
7158 .block_erasers =
7159 {
7160 {
7161 .eraseblocks = { {4 * 1024, 4096} },
7162 .block_erase = spi_block_erase_20,
7163 }, {
7164 .eraseblocks = { {4 * 1024, 4096} },
7165 .block_erase = spi_block_erase_d7,
7166 }, {
7167 .eraseblocks = { {32 * 1024, 512} },
7168 .block_erase = spi_block_erase_52,
7169 }, {
7170 .eraseblocks = { {64 * 1024, 256} },
7171 .block_erase = spi_block_erase_d8,
7172 }, {
7173 .eraseblocks = { {16 * 1024 * 1024, 1} },
7174 .block_erase = spi_block_erase_60,
7175 }, {
7176 .eraseblocks = { {16 * 1024 * 1024, 1} },
7177 .block_erase = spi_block_erase_c7,
7178 }
7179 },
7180 .unlock = spi_disable_blockprotect,
7181 .write = spi_chip_write_256,
7182 .read = spi_chip_read,
7183 .voltage = {2300, 3600},
7184 },
7185
7186 {
7187 .vendor = "ISSI",
7188 .name = "IS25WP128",
7189 .bustype = BUS_SPI,
7190 .manufacture_id = ISSI_ID_SPI,
7191 .model_id = ISSI_IS25WP128,
7192 .total_size = 16384,
7193 .page_size = 256,
7194 /* OTP: 1024B total; read 0x48; write 0x42 */
7195 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7196 .tested = TEST_OK_PREW,
7197 .probe = probe_spi_rdid,
7198 .probe_timing = TIMING_ZERO,
7199 .block_erasers =
7200 {
7201 {
7202 .eraseblocks = { {4 * 1024, 4096} },
7203 .block_erase = spi_block_erase_20,
7204 }, {
7205 .eraseblocks = { {4 * 1024, 4096} },
7206 .block_erase = spi_block_erase_d7,
7207 }, {
7208 .eraseblocks = { {32 * 1024, 512} },
7209 .block_erase = spi_block_erase_52,
7210 }, {
7211 .eraseblocks = { {64 * 1024, 256} },
7212 .block_erase = spi_block_erase_d8,
7213 }, {
7214 .eraseblocks = { {16 * 1024 * 1024, 1} },
7215 .block_erase = spi_block_erase_60,
7216 }, {
7217 .eraseblocks = { {16 * 1024 * 1024, 1} },
7218 .block_erase = spi_block_erase_c7,
7219 }
7220 },
7221 .unlock = spi_disable_blockprotect,
7222 .write = spi_chip_write_256,
7223 .read = spi_chip_read,
7224 .voltage = {1650, 1950},
7225 },
7226
7227 {
7228 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007229 .name = "IS29GL064B",
7230 .bustype = BUS_PARALLEL,
7231 .manufacture_id = ISSI_ID,
7232 .model_id = ISSI_PMC_IS29GL064B,
7233 .total_size = 8192,
7234 .page_size = 128 * 1024, /* actual page size is 16 */
7235 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7236 .tested = TEST_UNTESTED,
7237 .probe = probe_jedec_29gl,
7238 .probe_timing = TIMING_ZERO,
7239 .block_erasers =
7240 {
7241 {
7242 .eraseblocks = {
7243 {8 * 1024, 8},
7244 {64 * 1024, 127},
7245 },
7246 .block_erase = erase_sector_jedec,
7247 }, {
7248 .eraseblocks = { {8 * 1024 * 1024, 1} },
7249 .block_erase = erase_chip_block_jedec,
7250 },
7251 },
7252 .write = write_jedec_1,
7253 .read = read_memmapped,
7254 .voltage = {2700, 3600},
7255 },
7256
7257 {
7258 .vendor = "ISSI",
7259 .name = "IS29GL064T",
7260 .bustype = BUS_PARALLEL,
7261 .manufacture_id = ISSI_ID,
7262 .model_id = ISSI_PMC_IS29GL064T,
7263 .total_size = 8192,
7264 .page_size = 128 * 1024, /* actual page size is 16 */
7265 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7266 .tested = TEST_UNTESTED,
7267 .probe = probe_jedec_29gl,
7268 .probe_timing = TIMING_ZERO,
7269 .block_erasers =
7270 {
7271 {
7272 .eraseblocks = {
7273 {64 * 1024, 127},
7274 {8 * 1024, 8},
7275 },
7276 .block_erase = erase_sector_jedec,
7277 }, {
7278 .eraseblocks = { {8 * 1024 * 1024, 1} },
7279 .block_erase = erase_chip_block_jedec,
7280 },
7281 },
7282 .write = write_jedec_1,
7283 .read = read_memmapped,
7284 .voltage = {2700, 3600},
7285 },
7286
7287 {
7288 .vendor = "ISSI",
7289 .name = "IS29GL064H/L",
7290 .bustype = BUS_PARALLEL,
7291 .manufacture_id = ISSI_ID,
7292 .model_id = ISSI_PMC_IS29GL064HL,
7293 .total_size = 8192,
7294 .page_size = 128 * 1024, /* actual page size is 16 */
7295 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7296 .tested = TEST_UNTESTED,
7297 .probe = probe_jedec_29gl,
7298 .probe_timing = TIMING_ZERO,
7299 .block_erasers =
7300 {
7301 {
7302 .eraseblocks = { {64 * 1024, 128} },
7303 .block_erase = erase_sector_jedec,
7304 }, {
7305 .eraseblocks = { {8 * 1024 * 1024, 1} },
7306 .block_erase = erase_chip_block_jedec,
7307 },
7308 },
7309 .write = write_jedec_1,
7310 .read = read_memmapped,
7311 .voltage = {2700, 3600},
7312 },
7313
7314 {
7315 .vendor = "ISSI",
7316 .name = "IS29GL128H/L",
7317 .bustype = BUS_PARALLEL,
7318 .manufacture_id = ISSI_ID,
7319 .model_id = ISSI_PMC_IS29GL128HL,
7320 .total_size = 16384,
7321 .page_size = 128 * 1024, /* actual page size is 16 */
7322 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7323 .tested = TEST_UNTESTED,
7324 .probe = probe_jedec_29gl,
7325 .probe_timing = TIMING_ZERO,
7326 .block_erasers =
7327 {
7328 {
7329 .eraseblocks = { {128 * 1024, 128} },
7330 .block_erase = erase_sector_jedec,
7331 }, {
7332 .eraseblocks = { {16 * 1024 * 1024, 1} },
7333 .block_erase = erase_chip_block_jedec,
7334 },
7335 },
7336 .write = write_jedec_1,
7337 .read = read_memmapped,
7338 .voltage = {2700, 3600},
7339 },
7340
7341 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007342 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007343 .name = "MX23L1654",
7344 .bustype = BUS_SPI,
7345 .manufacture_id = MACRONIX_ID,
7346 .model_id = MACRONIX_MX23L1654,
7347 .total_size = 2048,
7348 .page_size = 256,
7349 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7350 .probe = probe_spi_rdid,
7351 .probe_timing = TIMING_ZERO,
7352 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7353 .read = spi_chip_read, /* Fast read (0x0B) supported */
7354 .voltage = {3000, 3600},
7355 },
7356
7357 {
7358 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007359 .name = "MX23L3254",
7360 .bustype = BUS_SPI,
7361 .manufacture_id = MACRONIX_ID,
7362 .model_id = MACRONIX_MX23L3254,
7363 .total_size = 4096,
7364 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00007365 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007366 .probe = probe_spi_rdid,
7367 .probe_timing = TIMING_ZERO,
7368 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7369 .read = spi_chip_read, /* Fast read (0x0B) supported */
7370 .voltage = {3000, 3600},
7371 },
7372
7373 {
7374 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007375 .name = "MX23L6454",
7376 .bustype = BUS_SPI,
7377 .manufacture_id = MACRONIX_ID,
7378 .model_id = MACRONIX_MX23L6454,
7379 .total_size = 8192,
7380 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007381 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00007382 .probe = probe_spi_rdid,
7383 .probe_timing = TIMING_ZERO,
7384 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7385 .read = spi_chip_read, /* Fast read (0x0B) supported */
7386 .voltage = {3000, 3600},
7387 },
7388
7389 {
7390 .vendor = "Macronix",
7391 .name = "MX23L12854",
7392 .bustype = BUS_SPI,
7393 .manufacture_id = MACRONIX_ID,
7394 .model_id = MACRONIX_MX23L12854,
7395 .total_size = 16384,
7396 .page_size = 256,
7397 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7398 .probe = probe_spi_rdid,
7399 .probe_timing = TIMING_ZERO,
7400 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7401 .read = spi_chip_read, /* Fast read (0x0B) supported */
7402 .voltage = {3000, 3600},
7403 },
7404
7405 {
7406 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007407 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007408 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007409 .manufacture_id = MACRONIX_ID,
7410 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007411 .total_size = 64,
7412 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007413 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007414 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007415 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007416 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007417 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007418 .block_erasers =
7419 {
7420 {
7421 .eraseblocks = { {4 * 1024, 16} },
7422 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007423 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007424 .eraseblocks = { {64 * 1024, 1} },
7425 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007426 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007427 .eraseblocks = { {64 * 1024, 1} },
7428 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007429 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007430 .eraseblocks = { {64 * 1024, 1} },
7431 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007432 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007433 .eraseblocks = { {64 * 1024, 1} },
7434 .block_erase = spi_block_erase_c7,
7435 },
7436 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007437 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007438 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007439 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007440 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
7441 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00007442 },
7443
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007444 {
7445 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007446 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007447 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007448 .manufacture_id = MACRONIX_ID,
7449 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007450 .total_size = 128,
7451 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007452 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007453 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00007454 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007455 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007456 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007457 .block_erasers =
7458 {
7459 {
7460 .eraseblocks = { {4 * 1024, 32} },
7461 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007462 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007463 .eraseblocks = { {64 * 1024, 2} },
7464 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007465 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007466 .eraseblocks = { {128 * 1024, 1} },
7467 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007468 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007469 .eraseblocks = { {128 * 1024, 1} },
7470 .block_erase = spi_block_erase_c7,
7471 },
7472 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007473 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007474 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007475 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007476 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007477 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007478 },
7479
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007480 {
7481 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007482 .name = "MX25L2005(C)/MX25L2006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007483 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007484 .manufacture_id = MACRONIX_ID,
7485 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007486 .total_size = 256,
7487 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007488 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007489 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007490 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007491 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007492 .block_erasers =
7493 {
7494 {
7495 .eraseblocks = { {4 * 1024, 64} },
7496 .block_erase = spi_block_erase_20,
7497 }, {
7498 .eraseblocks = { {64 * 1024, 4} },
7499 .block_erase = spi_block_erase_52,
7500 }, {
7501 .eraseblocks = { {64 * 1024, 4} },
7502 .block_erase = spi_block_erase_d8,
7503 }, {
7504 .eraseblocks = { {256 * 1024, 1} },
7505 .block_erase = spi_block_erase_60,
7506 }, {
7507 .eraseblocks = { {256 * 1024, 1} },
7508 .block_erase = spi_block_erase_c7,
7509 },
7510 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007511 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007512 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007513 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007514 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007515 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007516 },
7517
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007518 {
7519 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007520 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007521 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007522 .manufacture_id = MACRONIX_ID,
7523 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007524 .total_size = 512,
7525 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007526 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00007527 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007528 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007529 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007530 .block_erasers =
7531 {
7532 {
7533 .eraseblocks = { {4 * 1024, 128} },
7534 .block_erase = spi_block_erase_20,
7535 }, {
7536 .eraseblocks = { {64 * 1024, 8} },
7537 .block_erase = spi_block_erase_52,
7538 }, {
7539 .eraseblocks = { {64 * 1024, 8} },
7540 .block_erase = spi_block_erase_d8,
7541 }, {
7542 .eraseblocks = { {512 * 1024, 1} },
7543 .block_erase = spi_block_erase_60,
7544 }, {
7545 .eraseblocks = { {512 * 1024, 1} },
7546 .block_erase = spi_block_erase_c7,
7547 },
7548 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007549 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007550 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007551 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007552 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007553 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007554 },
7555
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007556 {
7557 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007558 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007559 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007560 .manufacture_id = MACRONIX_ID,
7561 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007562 .total_size = 1024,
7563 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007564 /* MX25L8006E, MX25L8008E support SFDP */
7565 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
David Hendricks67db2eb2010-09-03 03:35:48 +00007566 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00007567 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007568 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007569 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007570 .block_erasers =
7571 {
7572 {
7573 .eraseblocks = { {4 * 1024, 256} },
7574 .block_erase = spi_block_erase_20,
7575 }, {
7576 .eraseblocks = { {64 * 1024, 16} },
7577 .block_erase = spi_block_erase_52,
7578 }, {
7579 .eraseblocks = { {64 * 1024, 16} },
7580 .block_erase = spi_block_erase_d8,
7581 }, {
7582 .eraseblocks = { {1024 * 1024, 1} },
7583 .block_erase = spi_block_erase_60,
7584 }, {
7585 .eraseblocks = { {1024 * 1024, 1} },
7586 .block_erase = spi_block_erase_c7,
7587 },
7588 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007589 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007590 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007591 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007592 .read = spi_chip_read, /* Fast read (0x0B) supported */
7593 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00007594 },
7595
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007596 {
7597 .vendor = "Macronix",
7598 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007599 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007600 .manufacture_id = MACRONIX_ID,
7601 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007602 .total_size = 2048,
7603 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007604 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00007605 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007606 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007607 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007608 .block_erasers =
7609 {
7610 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007611 .eraseblocks = { {64 * 1024, 32} },
7612 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007613 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007614 .eraseblocks = { {64 * 1024, 32} },
7615 .block_erase = spi_block_erase_d8,
7616 }, {
7617 .eraseblocks = { {2 * 1024 * 1024, 1} },
7618 .block_erase = spi_block_erase_60,
7619 }, {
7620 .eraseblocks = { {2 * 1024 * 1024, 1} },
7621 .block_erase = spi_block_erase_c7,
7622 },
7623 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007624 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00007625 .unlock = spi_disable_blockprotect,
7626 .write = spi_chip_write_256,
7627 .read = spi_chip_read, /* Fast read (0x0B) supported */
7628 .voltage = {2700, 3600},
7629 },
7630
7631 {
7632 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007633 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007634 .bustype = BUS_SPI,
7635 .manufacture_id = MACRONIX_ID,
7636 .model_id = MACRONIX_MX25L1605,
7637 .total_size = 2048,
7638 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007639 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00007640 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7641 .tested = TEST_OK_PREW,
7642 .probe = probe_spi_rdid,
7643 .probe_timing = TIMING_ZERO,
7644 .block_erasers =
7645 {
7646 {
7647 .eraseblocks = { {4 * 1024, 512} },
7648 .block_erase = spi_block_erase_20,
7649 }, {
7650 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007651 .block_erase = spi_block_erase_52,
7652 }, {
7653 .eraseblocks = { {64 * 1024, 32} },
7654 .block_erase = spi_block_erase_d8,
7655 }, {
7656 .eraseblocks = { {2 * 1024 * 1024, 1} },
7657 .block_erase = spi_block_erase_60,
7658 }, {
7659 .eraseblocks = { {2 * 1024 * 1024, 1} },
7660 .block_erase = spi_block_erase_c7,
7661 },
7662 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007663 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007664 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007665 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007666 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00007667 .voltage = {2700, 3600},
7668 },
7669
7670 {
7671 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007672 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007673 .bustype = BUS_SPI,
7674 .manufacture_id = MACRONIX_ID,
7675 .model_id = MACRONIX_MX25L1605,
7676 .total_size = 2048,
7677 .page_size = 256,
7678 .feature_bits = FEATURE_WRSR_WREN,
7679 .tested = TEST_OK_PREW,
7680 .probe = probe_spi_rdid,
7681 .probe_timing = TIMING_ZERO,
7682 .block_erasers =
7683 {
7684 {
7685 .eraseblocks = { {4 * 1024, 512} },
7686 .block_erase = spi_block_erase_20,
7687 }, {
7688 .eraseblocks = { {64 * 1024, 32} },
7689 .block_erase = spi_block_erase_d8,
7690 }, {
7691 .eraseblocks = { {2 * 1024 * 1024, 1} },
7692 .block_erase = spi_block_erase_60,
7693 }, {
7694 .eraseblocks = { {2 * 1024 * 1024, 1} },
7695 .block_erase = spi_block_erase_c7,
7696 },
7697 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007698 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007699 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007700 .write = spi_chip_write_256,
7701 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007702 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007703 },
7704
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007705 {
7706 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007707 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007708 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007709 .manufacture_id = MACRONIX_ID,
7710 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007711 .total_size = 2048,
7712 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007713 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7714 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007715 .tested = TEST_UNTESTED,
7716 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007717 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007718 .block_erasers =
7719 {
7720 {
7721 .eraseblocks = { {4 * 1024, 512} },
7722 .block_erase = spi_block_erase_20,
7723 }, {
7724 .eraseblocks = { {64 * 1024, 32} },
7725 .block_erase = spi_block_erase_d8,
7726 }, {
7727 .eraseblocks = { {2 * 1024 * 1024, 1} },
7728 .block_erase = spi_block_erase_60,
7729 }, {
7730 .eraseblocks = { {2 * 1024 * 1024, 1} },
7731 .block_erase = spi_block_erase_c7,
7732 }
7733 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007734 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007735 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007736 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007737 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007738 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007739 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00007740
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007741 {
7742 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00007743 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007744 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007745 .manufacture_id = MACRONIX_ID,
7746 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007747 .total_size = 2048,
7748 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007749 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7750 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007751 .tested = TEST_UNTESTED,
7752 .probe = probe_spi_rdid,
7753 .probe_timing = TIMING_ZERO,
7754 .block_erasers =
7755 {
7756 {
7757 .eraseblocks = { {4 * 1024, 512} },
7758 .block_erase = spi_block_erase_20,
7759 }, {
7760 .eraseblocks = { {64 * 1024, 32} },
7761 .block_erase = spi_block_erase_d8,
7762 }, {
7763 .eraseblocks = { {2 * 1024 * 1024, 1} },
7764 .block_erase = spi_block_erase_60,
7765 }, {
7766 .eraseblocks = { {2 * 1024 * 1024, 1} },
7767 .block_erase = spi_block_erase_c7,
7768 }
7769 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007770 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007771 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007772 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007773 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00007774 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00007775 },
7776
7777 {
7778 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00007779 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007780 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007781 .manufacture_id = MACRONIX_ID,
7782 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007783 .total_size = 4096,
7784 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007785 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00007786 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007787 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007788 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007789 .block_erasers =
7790 {
7791 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007792 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007793 .block_erase = spi_block_erase_20,
7794 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007795 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007796 .block_erase = spi_block_erase_d8,
7797 }, {
7798 .eraseblocks = { {4 * 1024 * 1024, 1} },
7799 .block_erase = spi_block_erase_60,
7800 }, {
7801 .eraseblocks = { {4 * 1024 * 1024, 1} },
7802 .block_erase = spi_block_erase_c7,
7803 },
7804 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007805 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007806 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007807 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007808 .read = spi_chip_read, /* Fast read (0x0B) supported */
7809 .voltage = {2700, 3600},
7810 },
7811
7812 {
7813 .vendor = "Macronix",
7814 .name = "MX25L3205D/MX25L3208D",
7815 .bustype = BUS_SPI,
7816 .manufacture_id = MACRONIX_ID,
7817 .model_id = MACRONIX_MX25L3205,
7818 .total_size = 4096,
7819 .page_size = 256,
7820 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7821 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7822 .tested = TEST_OK_PREW,
7823 .probe = probe_spi_rdid,
7824 .probe_timing = TIMING_ZERO,
7825 .block_erasers =
7826 {
7827 {
7828 .eraseblocks = { {4 * 1024, 1024} },
7829 .block_erase = spi_block_erase_20,
7830 }, {
7831 .eraseblocks = { {64 * 1024, 64} },
7832 .block_erase = spi_block_erase_d8,
7833 }, {
7834 .eraseblocks = { {4 * 1024 * 1024, 1} },
7835 .block_erase = spi_block_erase_60,
7836 }, {
7837 .eraseblocks = { {4 * 1024 * 1024, 1} },
7838 .block_erase = spi_block_erase_c7,
7839 },
7840 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007841 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007842 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007843 .write = spi_chip_write_256,
7844 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7845 .voltage = {2700, 3600},
7846 },
7847
7848 {
7849 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007850 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007851 .bustype = BUS_SPI,
7852 .manufacture_id = MACRONIX_ID,
7853 .model_id = MACRONIX_MX25L3205,
7854 .total_size = 4096,
7855 .page_size = 256,
7856 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7857 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7858 .tested = TEST_OK_PREW,
7859 .probe = probe_spi_rdid,
7860 .probe_timing = TIMING_ZERO,
7861 .block_erasers =
7862 {
7863 {
7864 .eraseblocks = { {4 * 1024, 1024} },
7865 .block_erase = spi_block_erase_20,
7866 }, {
7867 .eraseblocks = { {64 * 1024, 64} },
7868 .block_erase = spi_block_erase_d8,
7869 }, {
7870 .eraseblocks = { {64 * 1024, 64} },
7871 .block_erase = spi_block_erase_52,
7872 }, {
7873 .eraseblocks = { {4 * 1024 * 1024, 1} },
7874 .block_erase = spi_block_erase_60,
7875 }, {
7876 .eraseblocks = { {4 * 1024 * 1024, 1} },
7877 .block_erase = spi_block_erase_c7,
7878 },
7879 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007880 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007881 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007882 .write = spi_chip_write_256,
7883 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007884 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007885 },
7886
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007887 {
7888 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007889 .name = "MX25L3273E",
7890 .bustype = BUS_SPI,
7891 .manufacture_id = MACRONIX_ID,
7892 .model_id = MACRONIX_MX25L3205,
7893 .total_size = 4096,
7894 .page_size = 256,
7895 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7896 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007897 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007898 .probe = probe_spi_rdid,
7899 .probe_timing = TIMING_ZERO,
7900 .block_erasers =
7901 {
7902 {
7903 .eraseblocks = { {4 * 1024, 1024} },
7904 .block_erase = spi_block_erase_20,
7905 }, {
7906 .eraseblocks = { {32 * 1024, 128} },
7907 .block_erase = spi_block_erase_52,
7908 }, {
7909 .eraseblocks = { {64 * 1024, 64} },
7910 .block_erase = spi_block_erase_d8,
7911 }, {
7912 .eraseblocks = { {4 * 1024 * 1024, 1} },
7913 .block_erase = spi_block_erase_60,
7914 }, {
7915 .eraseblocks = { {4 * 1024 * 1024, 1} },
7916 .block_erase = spi_block_erase_c7,
7917 },
7918 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007919 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007920 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007921 .write = spi_chip_write_256,
7922 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7923 .voltage = {2700, 3600},
7924 },
7925
7926 {
7927 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007928 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007929 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007930 .manufacture_id = MACRONIX_ID,
7931 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007932 .total_size = 4096,
7933 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007934 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
7935 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007936 .tested = TEST_UNTESTED,
7937 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007938 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007939 .block_erasers =
7940 {
7941 {
7942 .eraseblocks = { {4 * 1024, 1024} },
7943 .block_erase = spi_block_erase_20,
7944 }, {
7945 .eraseblocks = { {64 * 1024, 64} },
7946 .block_erase = spi_block_erase_d8,
7947 }, {
7948 .eraseblocks = { {4 * 1024 * 1024, 1} },
7949 .block_erase = spi_block_erase_60,
7950 }, {
7951 .eraseblocks = { {4 * 1024 * 1024, 1} },
7952 .block_erase = spi_block_erase_c7,
7953 }
7954 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007955 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007956 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007957 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007958 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007959 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007960 },
7961
7962 {
7963 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007964 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007965 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007966 .manufacture_id = MACRONIX_ID,
7967 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007968 .total_size = 8192,
7969 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007970 /* Has an additional 512B EEPROM sector */
7971 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00007972 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007973 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007974 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007975 .block_erasers =
7976 {
7977 {
7978 .eraseblocks = { {64 * 1024, 128} },
7979 .block_erase = spi_block_erase_20,
7980 }, {
7981 .eraseblocks = { {64 * 1024, 128} },
7982 .block_erase = spi_block_erase_d8,
7983 }, {
7984 .eraseblocks = { {8 * 1024 * 1024, 1} },
7985 .block_erase = spi_block_erase_60,
7986 }, {
7987 .eraseblocks = { {8 * 1024 * 1024, 1} },
7988 .block_erase = spi_block_erase_c7,
7989 }
7990 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007991 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007992 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007993 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007994 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007995 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007996 },
7997
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007998 {
7999 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008000 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00008001 .bustype = BUS_SPI,
8002 .manufacture_id = MACRONIX_ID,
8003 .model_id = MACRONIX_MX25L6405,
8004 .total_size = 8192,
8005 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008006 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8008 .tested = TEST_OK_PREW,
8009 .probe = probe_spi_rdid,
8010 .probe_timing = TIMING_ZERO,
8011 .block_erasers =
8012 {
8013 {
8014 .eraseblocks = { {4 * 1024, 2048} },
8015 .block_erase = spi_block_erase_20,
8016 }, {
8017 .eraseblocks = { {64 * 1024, 128} },
8018 .block_erase = spi_block_erase_d8,
8019 }, {
8020 .eraseblocks = { {8 * 1024 * 1024, 1} },
8021 .block_erase = spi_block_erase_60,
8022 }, {
8023 .eraseblocks = { {8 * 1024 * 1024, 1} },
8024 .block_erase = spi_block_erase_c7,
8025 }
8026 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008027 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008028 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008029 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008030 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00008031 .voltage = {2700, 3600},
8032 },
8033
8034 {
8035 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008036 .name = "MX25L6406E/MX25L6408E",
8037 .bustype = BUS_SPI,
8038 .manufacture_id = MACRONIX_ID,
8039 .model_id = MACRONIX_MX25L6405,
8040 .total_size = 8192,
8041 .page_size = 256,
8042 /* MX25L6406E supports SFDP */
8043 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
8044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8045 .tested = TEST_OK_PREW,
8046 .probe = probe_spi_rdid,
8047 .probe_timing = TIMING_ZERO,
8048 .block_erasers =
8049 {
8050 {
8051 .eraseblocks = { {4 * 1024, 2048} },
8052 .block_erase = spi_block_erase_20,
8053 }, {
8054 .eraseblocks = { {64 * 1024, 128} },
8055 .block_erase = spi_block_erase_52,
8056 }, {
8057 .eraseblocks = { {64 * 1024, 128} },
8058 .block_erase = spi_block_erase_d8,
8059 }, {
8060 .eraseblocks = { {8 * 1024 * 1024, 1} },
8061 .block_erase = spi_block_erase_60,
8062 }, {
8063 .eraseblocks = { {8 * 1024 * 1024, 1} },
8064 .block_erase = spi_block_erase_c7,
8065 }
8066 },
8067 .printlock = spi_prettyprint_status_register_bp3_srwd,
8068 .unlock = spi_disable_blockprotect_bp3_srwd,
8069 .write = spi_chip_write_256,
8070 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
8071 .voltage = {2700, 3600},
8072 },
8073
8074 {
8075 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01008076 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00008077 .bustype = BUS_SPI,
8078 .manufacture_id = MACRONIX_ID,
8079 .model_id = MACRONIX_MX25L6405,
8080 .total_size = 8192,
8081 .page_size = 256,
8082 /* supports SFDP */
8083 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8084 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8085 .tested = TEST_OK_PREW,
8086 .probe = probe_spi_rdid,
8087 .probe_timing = TIMING_ZERO,
8088 .block_erasers =
8089 {
8090 {
8091 .eraseblocks = { {4 * 1024, 2048} },
8092 .block_erase = spi_block_erase_20,
8093 }, {
8094 .eraseblocks = { {32 * 1024, 256} },
8095 .block_erase = spi_block_erase_52,
8096 }, {
8097 .eraseblocks = { {64 * 1024, 128} },
8098 .block_erase = spi_block_erase_d8,
8099 }, {
8100 .eraseblocks = { {8 * 1024 * 1024, 1} },
8101 .block_erase = spi_block_erase_60,
8102 }, {
8103 .eraseblocks = { {8 * 1024 * 1024, 1} },
8104 .block_erase = spi_block_erase_c7,
8105 }
8106 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008107 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008108 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008109 .write = spi_chip_write_256,
8110 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8111 .voltage = {2700, 3600},
8112 },
8113
8114 {
8115 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00008116 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008117 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008118 .manufacture_id = MACRONIX_ID,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008119 .model_id = MACRONIX_MX25L12805D,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008120 .total_size = 16384,
8121 .page_size = 256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008122 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008123 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00008124 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008125 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008126 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008127 .block_erasers =
8128 {
8129 {
8130 .eraseblocks = { {4 * 1024, 4096} },
8131 .block_erase = spi_block_erase_20,
8132 }, {
8133 .eraseblocks = { {64 * 1024, 256} },
8134 .block_erase = spi_block_erase_d8,
8135 }, {
8136 .eraseblocks = { {16 * 1024 * 1024, 1} },
8137 .block_erase = spi_block_erase_60,
8138 }, {
8139 .eraseblocks = { {16 * 1024 * 1024, 1} },
8140 .block_erase = spi_block_erase_c7,
8141 }
8142 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008143 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008144 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008145 .write = spi_chip_write_256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008146 .read = spi_chip_read, /* Fast read (0x0B) supported */
8147 .voltage = {2700, 3600},
8148 },
8149
8150 {
8151 .vendor = "Macronix",
8152 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8153 .bustype = BUS_SPI,
8154 .manufacture_id = MACRONIX_ID,
8155 .model_id = MACRONIX_MX25L12805D,
8156 .total_size = 16384,
8157 .page_size = 256,
8158 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8160 .tested = TEST_OK_PREW,
8161 .probe = probe_spi_rdid,
8162 .probe_timing = TIMING_ZERO,
8163 .block_erasers =
8164 {
8165 {
8166 .eraseblocks = { {4 * 1024, 4096} },
8167 .block_erase = spi_block_erase_20,
8168 }, {
8169 .eraseblocks = { {32 * 1024, 512} },
8170 .block_erase = spi_block_erase_52,
8171 }, {
8172 .eraseblocks = { {64 * 1024, 256} },
8173 .block_erase = spi_block_erase_d8,
8174 }, {
8175 .eraseblocks = { {16 * 1024 * 1024, 1} },
8176 .block_erase = spi_block_erase_60,
8177 }, {
8178 .eraseblocks = { {16 * 1024 * 1024, 1} },
8179 .block_erase = spi_block_erase_c7,
8180 }
8181 },
8182 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8183 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8184 .unlock = spi_disable_blockprotect_bp3_srwd,
8185 .write = spi_chip_write_256,
8186 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008187 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008188 },
8189
8190 {
8191 .vendor = "Macronix",
Nico Huberaac81422017-11-10 22:54:13 +01008192 .name = "MX25L25635F",
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008193 .bustype = BUS_SPI,
8194 .manufacture_id = MACRONIX_ID,
8195 .model_id = MACRONIX_MX25L25635F,
8196 .total_size = 32768,
8197 .page_size = 256,
8198 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008199 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8200 .tested = TEST_UNTESTED,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008201 .probe = probe_spi_rdid,
8202 .probe_timing = TIMING_ZERO,
8203 .block_erasers =
8204 {
8205 {
8206 .eraseblocks = { {4 * 1024, 8192} },
Nico Huberaac81422017-11-10 22:54:13 +01008207 .block_erase = spi_block_erase_21,
8208 }, {
8209 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +02008210 .block_erase = spi_block_erase_20,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008211 }, {
8212 .eraseblocks = { {32 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008213 .block_erase = spi_block_erase_5c,
8214 }, {
8215 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008216 .block_erase = spi_block_erase_52,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008217 }, {
8218 .eraseblocks = { {64 * 1024, 512} },
Nico Huberaac81422017-11-10 22:54:13 +01008219 .block_erase = spi_block_erase_dc,
8220 }, {
8221 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +02008222 .block_erase = spi_block_erase_d8,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008223 }, {
8224 .eraseblocks = { {32 * 1024 * 1024, 1} },
8225 .block_erase = spi_block_erase_60,
8226 }, {
8227 .eraseblocks = { {32 * 1024 * 1024, 1} },
8228 .block_erase = spi_block_erase_c7,
8229 }
8230 },
8231 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8232 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8233 .unlock = spi_disable_blockprotect_bp3_srwd,
8234 .write = spi_chip_write_256,
8235 .read = spi_chip_read, /* Fast read (0x0B) supported */
8236 .voltage = {2700, 3600},
8237 },
8238
8239 {
8240 .vendor = "Macronix",
Timothy Pearsone29591d2016-08-27 15:43:00 -05008241 .name = "MX66L51235F",
8242 .bustype = BUS_SPI,
8243 .manufacture_id = MACRONIX_ID,
8244 .model_id = MACRONIX_MX66L51235F,
8245 .total_size = 65536,
8246 .page_size = 256,
8247 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008248 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8249 .tested = TEST_UNTESTED,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008250 .probe = probe_spi_rdid,
8251 .probe_timing = TIMING_ZERO,
8252 .block_erasers =
8253 {
8254 {
8255 .eraseblocks = { {4 * 1024, 16384} },
Nico Huberaac81422017-11-10 22:54:13 +01008256 .block_erase = spi_block_erase_21,
8257 }, {
8258 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7a077222017-10-14 18:18:30 +02008259 .block_erase = spi_block_erase_20,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008260 }, {
8261 .eraseblocks = { {32 * 1024, 2048} },
Nico Huberaac81422017-11-10 22:54:13 +01008262 .block_erase = spi_block_erase_5c,
8263 }, {
8264 .eraseblocks = { {32 * 1024, 2048} },
Nico Huber7a077222017-10-14 18:18:30 +02008265 .block_erase = spi_block_erase_52,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008266 }, {
8267 .eraseblocks = { {64 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008268 .block_erase = spi_block_erase_dc,
8269 }, {
8270 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008271 .block_erase = spi_block_erase_d8,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008272 }, {
8273 .eraseblocks = { {64 * 1024 * 1024, 1} },
8274 .block_erase = spi_block_erase_60,
8275 }, {
8276 .eraseblocks = { {64 * 1024 * 1024, 1} },
8277 .block_erase = spi_block_erase_c7,
8278 }
8279 },
8280 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8281 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8282 .unlock = spi_disable_blockprotect_bp3_srwd,
8283 .write = spi_chip_write_256,
8284 .read = spi_chip_read, /* Fast read (0x0B) supported */
8285 .voltage = {2700, 3600},
8286 },
8287
8288 {
8289 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00008290 .name = "MX25U1635E",
8291 .bustype = BUS_SPI,
8292 .manufacture_id = MACRONIX_ID,
8293 .model_id = MACRONIX_MX25U1635E,
8294 .total_size = 2048,
8295 .page_size = 256,
8296 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8297 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8298 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008299 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00008300 .probe = probe_spi_rdid,
8301 .probe_timing = TIMING_ZERO,
8302 .block_erasers =
8303 {
8304 {
8305 .eraseblocks = { {4 * 1024, 512} },
8306 .block_erase = spi_block_erase_20,
8307 }, {
8308 .eraseblocks = { {32 * 1024, 64} },
8309 .block_erase = spi_block_erase_52,
8310 }, {
8311 .eraseblocks = { {64 * 1024, 32} },
8312 .block_erase = spi_block_erase_d8,
8313 }, {
8314 .eraseblocks = { {2 * 1024 * 1024, 1} },
8315 .block_erase = spi_block_erase_60,
8316 }, {
8317 .eraseblocks = { {2 * 1024 * 1024, 1} },
8318 .block_erase = spi_block_erase_c7,
8319 }
8320 },
8321 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008322 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008323 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008324 .write = spi_chip_write_256,
8325 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8326 .voltage = {1650, 2000},
8327 },
8328
8329 {
8330 .vendor = "Macronix",
8331 .name = "MX25U3235E/F",
8332 .bustype = BUS_SPI,
8333 .manufacture_id = MACRONIX_ID,
8334 .model_id = MACRONIX_MX25U3235E,
8335 .total_size = 4096,
8336 .page_size = 256,
8337 /* F model supports SFDP */
8338 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8339 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8340 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8341 .tested = TEST_OK_PREW,
8342 .probe = probe_spi_rdid,
8343 .probe_timing = TIMING_ZERO,
8344 .block_erasers =
8345 {
8346 {
8347 .eraseblocks = { {4 * 1024, 1024} },
8348 .block_erase = spi_block_erase_20,
8349 }, {
8350 .eraseblocks = { {32 * 1024, 128} },
8351 .block_erase = spi_block_erase_52,
8352 }, {
8353 .eraseblocks = { {64 * 1024, 64} },
8354 .block_erase = spi_block_erase_d8,
8355 }, {
8356 .eraseblocks = { {4 * 1024 * 1024, 1} },
8357 .block_erase = spi_block_erase_60,
8358 }, {
8359 .eraseblocks = { {4 * 1024 * 1024, 1} },
8360 .block_erase = spi_block_erase_c7,
8361 }
8362 },
8363 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008364 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008365 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008366 .write = spi_chip_write_256,
8367 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8368 .voltage = {1650, 2000},
8369 },
8370
8371 {
8372 .vendor = "Macronix",
8373 .name = "MX25U6435E/F",
8374 .bustype = BUS_SPI,
8375 .manufacture_id = MACRONIX_ID,
8376 .model_id = MACRONIX_MX25U6435E,
8377 .total_size = 8192,
8378 .page_size = 256,
8379 /* F model supports SFDP */
8380 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8381 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008383 .tested = TEST_OK_PREW,
Vincent Palatinf800f552013-03-15 02:03:16 +00008384 .probe = probe_spi_rdid,
8385 .probe_timing = TIMING_ZERO,
8386 .block_erasers =
8387 {
8388 {
8389 .eraseblocks = { {4 * 1024, 2048} },
8390 .block_erase = spi_block_erase_20,
8391 }, {
8392 .eraseblocks = { {32 * 1024, 256} },
8393 .block_erase = spi_block_erase_52,
8394 }, {
8395 .eraseblocks = { {64 * 1024, 128} },
8396 .block_erase = spi_block_erase_d8,
8397 }, {
8398 .eraseblocks = { {8 * 1024 * 1024, 1} },
8399 .block_erase = spi_block_erase_60,
8400 }, {
8401 .eraseblocks = { {8 * 1024 * 1024, 1} },
8402 .block_erase = spi_block_erase_c7,
8403 }
8404 },
8405 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008406 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008407 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008408 .write = spi_chip_write_256,
8409 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8410 .voltage = {1650, 2000},
8411 },
8412
8413 {
8414 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00008415 .name = "MX25U12835F",
8416 .bustype = BUS_SPI,
8417 .manufacture_id = MACRONIX_ID,
8418 .model_id = MACRONIX_MX25U12835E,
8419 .total_size = 16384,
8420 .page_size = 256,
8421 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8422 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8423 .tested = TEST_UNTESTED,
8424 .probe = probe_spi_rdid,
8425 .probe_timing = TIMING_ZERO,
8426 .block_erasers =
8427 {
8428 {
8429 .eraseblocks = { {4 * 1024, 4096} },
8430 .block_erase = spi_block_erase_20,
8431 }, {
8432 .eraseblocks = { {32 * 1024, 512} },
8433 .block_erase = spi_block_erase_52,
8434 }, {
8435 .eraseblocks = { {64 * 1024, 256} },
8436 .block_erase = spi_block_erase_d8,
8437 }, {
8438 .eraseblocks = { {16 * 1024 * 1024, 1} },
8439 .block_erase = spi_block_erase_60,
8440 }, {
8441 .eraseblocks = { {16 * 1024 * 1024, 1} },
8442 .block_erase = spi_block_erase_c7,
8443 }
8444 },
8445 /* TODO: security register */
8446 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8447 .unlock = spi_disable_blockprotect_bp3_srwd,
8448 .write = spi_chip_write_256, /* Multi I/O supported */
8449 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8450 .voltage = {1650, 2000},
8451 },
8452
8453 {
Stefan Taunera4617f72015-01-10 15:59:54 +00008454 .vendor = "Macronix",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00008455 .name = "MX25L6495F",
8456 .bustype = BUS_SPI,
8457 .manufacture_id = MACRONIX_ID,
8458 .model_id = MACRONIX_MX25L6495F,
8459 .total_size = 8192,
8460 .page_size = 256,
8461 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8462 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8463 .tested = TEST_OK_PREW,
8464 .probe = probe_spi_rdid,
8465 .probe_timing = TIMING_ZERO,
8466 .block_erasers =
8467 {
8468 {
8469 .eraseblocks = { {4 * 1024, 2048} },
8470 .block_erase = spi_block_erase_20,
8471 }, {
8472 .eraseblocks = { {64 * 1024, 128} },
8473 .block_erase = spi_block_erase_d8,
8474 }, {
8475 .eraseblocks = { {32 * 1024, 256} },
8476 .block_erase = spi_block_erase_52,
8477 }, {
8478 .eraseblocks = { {8 * 1024 * 1024, 1} },
8479 .block_erase = spi_block_erase_60,
8480 }, {
8481 .eraseblocks = { {8 * 1024 * 1024, 1} },
8482 .block_erase = spi_block_erase_c7,
8483 }
8484 },
8485 .unlock = spi_disable_blockprotect,
8486 .write = spi_chip_write_256,
8487 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8488 .voltage = {2700, 3600},
8489 },
8490
8491 {
Martin Roth440057a2014-07-13 00:05:07 +00008492 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00008493 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008494 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008495 .manufacture_id = MACRONIX_ID,
8496 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008497 .total_size = 128,
8498 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008499 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8500 .tested = TEST_UNTESTED,
8501 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008502 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008503 .block_erasers =
8504 {
8505 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00008506 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00008507 {8 * 1024, 1},
8508 {4 * 1024, 2},
8509 {8 * 1024, 2},
8510 {32 * 1024, 1},
8511 {64 * 1024, 1},
8512 },
Sean Nelson35727f72010-01-28 23:55:12 +00008513 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008514 }, {
8515 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008516 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008517 }
8518 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008519 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008520 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008521 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00008522 },
8523
8524 {
8525 .vendor = "Macronix",
8526 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008527 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008528 .manufacture_id = MACRONIX_ID,
8529 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008530 .total_size = 128,
8531 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008532 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00008533 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008534 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008535 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008536 .block_erasers =
8537 {
8538 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00008539 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00008540 {64 * 1024, 1},
8541 {32 * 1024, 1},
8542 {8 * 1024, 2},
8543 {4 * 1024, 2},
8544 {8 * 1024, 1},
8545 },
Sean Nelson35727f72010-01-28 23:55:12 +00008546 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008547 }, {
8548 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008549 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008550 }
8551 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008552 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008553 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008554 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00008555 },
8556
8557 {
8558 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00008559 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008560 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008561 .manufacture_id = MACRONIX_ID,
8562 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008563 .total_size = 256,
8564 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008565 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008566 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00008567 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008568 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008569 .block_erasers =
8570 {
8571 {
8572 .eraseblocks = {
8573 {16 * 1024, 1},
8574 {8 * 1024, 2},
8575 {32 * 1024, 1},
8576 {64 * 1024, 3},
8577 },
Sean Nelson35727f72010-01-28 23:55:12 +00008578 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008579 }, {
8580 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008581 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008582 },
8583 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008584 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008585 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008586 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00008587 },
8588
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008589 {
8590 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00008591 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008592 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008593 .manufacture_id = MACRONIX_ID,
8594 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008595 .total_size = 256,
8596 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008597 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008598 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008599 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008600 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008601 .block_erasers =
8602 {
8603 {
8604 .eraseblocks = {
8605 {64 * 1024, 3},
8606 {32 * 1024, 1},
8607 {8 * 1024, 2},
8608 {16 * 1024, 1},
8609 },
Sean Nelson35727f72010-01-28 23:55:12 +00008610 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008611 }, {
8612 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008613 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008614 },
8615 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008616 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008617 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008618 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00008619 },
8620
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008621 {
8622 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00008623 .name = "MX29F022(N)B",
8624 .bustype = BUS_PARALLEL,
8625 .manufacture_id = MACRONIX_ID,
8626 .model_id = MACRONIX_MX29F022B,
8627 .total_size = 256,
8628 .page_size = 0, /* unused */
8629 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8630 .tested = TEST_UNTESTED,
8631 .probe = probe_jedec,
8632 .probe_timing = TIMING_ZERO,
8633 .block_erasers =
8634 {
8635 {
8636 .eraseblocks = {
8637 {16 * 1024, 1},
8638 {8 * 1024, 2},
8639 {32 * 1024, 1},
8640 {64 * 1024, 3},
8641 },
8642 .block_erase = erase_sector_jedec,
8643 }, {
8644 .eraseblocks = { {256 * 1024, 1} },
8645 .block_erase = erase_chip_block_jedec,
8646 }
8647 },
8648 .write = write_jedec_1,
8649 .read = read_memmapped,
8650 .voltage = {4500, 5500},
8651 },
8652
8653 {
8654 .vendor = "Macronix",
8655 .name = "MX29F022(N)T",
8656 .bustype = BUS_PARALLEL,
8657 .manufacture_id = MACRONIX_ID,
8658 .model_id = MACRONIX_MX29F022T,
8659 .total_size = 256,
8660 .page_size = 0, /* unused */
8661 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8662 .tested = TEST_OK_PREW,
8663 .probe = probe_jedec,
8664 .probe_timing = TIMING_ZERO,
8665 .block_erasers =
8666 {
8667 {
8668 .eraseblocks = {
8669 {64 * 1024, 3},
8670 {32 * 1024, 1},
8671 {8 * 1024, 2},
8672 {16 * 1024, 1},
8673 },
8674 .block_erase = erase_sector_jedec,
8675 }, {
8676 .eraseblocks = { {256 * 1024, 1} },
8677 .block_erase = erase_chip_block_jedec,
8678 }
8679 },
8680 .write = write_jedec_1,
8681 .read = read_memmapped,
8682 .voltage = {4500, 5500},
8683 },
8684
8685 {
8686 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00008687 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008688 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00008689 .manufacture_id = MACRONIX_ID,
8690 .model_id = MACRONIX_MX29F040,
8691 .total_size = 512,
8692 .page_size = 64 * 1024,
8693 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8694 .tested = TEST_UNTESTED,
8695 .probe = probe_jedec,
8696 .probe_timing = TIMING_ZERO,
8697 .block_erasers =
8698 {
8699 {
8700 .eraseblocks = { {64 * 1024, 8} },
8701 .block_erase = erase_sector_jedec,
8702 }, {
8703 .eraseblocks = { {512 * 1024, 1} },
8704 .block_erase = erase_chip_block_jedec,
8705 },
8706 },
8707 .write = write_jedec_1,
8708 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008709 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00008710 },
8711
8712 {
8713 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008714 .name = "MX29GL320EB",
8715 .bustype = BUS_PARALLEL,
8716 .manufacture_id = MACRONIX_ID,
8717 .model_id = MACRONIX_MX29GL320EB,
8718 .total_size = 4096,
8719 .page_size = 128 * 1024, /* actual page size is 16 */
8720 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8721 .tested = TEST_UNTESTED,
8722 .probe = probe_jedec_29gl,
8723 .probe_timing = TIMING_ZERO,
8724 .block_erasers =
8725 {
8726 {
8727 .eraseblocks = {
8728 {8 * 1024, 8},
8729 {64 * 1024, 63},
8730 },
8731 .block_erase = erase_sector_jedec,
8732 }, {
8733 .eraseblocks = { {4 * 1024 * 1024, 1} },
8734 .block_erase = erase_chip_block_jedec,
8735 },
8736 },
8737 .write = write_jedec_1,
8738 .read = read_memmapped,
8739 .voltage = {2700, 3600},
8740 },
8741
8742 {
8743 .vendor = "Macronix",
8744 .name = "MX29GL320ET",
8745 .bustype = BUS_PARALLEL,
8746 .manufacture_id = MACRONIX_ID,
8747 .model_id = MACRONIX_MX29GL320ET,
8748 .total_size = 4096,
8749 .page_size = 128 * 1024, /* actual page size is 16 */
8750 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8751 .tested = TEST_UNTESTED,
8752 .probe = probe_jedec_29gl,
8753 .probe_timing = TIMING_ZERO,
8754 .block_erasers =
8755 {
8756 {
8757 .eraseblocks = {
8758 {64 * 1024, 63},
8759 {8 * 1024, 8},
8760 },
8761 .block_erase = erase_sector_jedec,
8762 }, {
8763 .eraseblocks = { {4 * 1024 * 1024, 1} },
8764 .block_erase = erase_chip_block_jedec,
8765 },
8766 },
8767 .write = write_jedec_1,
8768 .read = read_memmapped,
8769 .voltage = {2700, 3600},
8770 },
8771
8772 {
8773 .vendor = "Macronix",
8774 .name = "MX29GL320EH/L",
8775 .bustype = BUS_PARALLEL,
8776 .manufacture_id = MACRONIX_ID,
8777 .model_id = MACRONIX_MX29GL320EHL,
8778 .total_size = 4096,
8779 .page_size = 128 * 1024, /* actual page size is 16 */
8780 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8781 .tested = TEST_UNTESTED,
8782 .probe = probe_jedec_29gl,
8783 .probe_timing = TIMING_ZERO,
8784 .block_erasers =
8785 {
8786 {
8787 .eraseblocks = { {64 * 1024, 64} },
8788 .block_erase = erase_sector_jedec,
8789 }, {
8790 .eraseblocks = { {4 * 1024 * 1024, 1} },
8791 .block_erase = erase_chip_block_jedec,
8792 },
8793 },
8794 .write = write_jedec_1,
8795 .read = read_memmapped,
8796 .voltage = {2700, 3600},
8797 },
8798
8799 {
8800 .vendor = "Macronix",
8801 .name = "MX29GL640EB",
8802 .bustype = BUS_PARALLEL,
8803 .manufacture_id = MACRONIX_ID,
8804 .model_id = MACRONIX_MX29GL640EB,
8805 .total_size = 8192,
8806 .page_size = 128 * 1024, /* actual page size is 16 */
8807 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8808 .tested = TEST_UNTESTED,
8809 .probe = probe_jedec_29gl,
8810 .probe_timing = TIMING_ZERO,
8811 .block_erasers =
8812 {
8813 {
8814 .eraseblocks = {
8815 {8 * 1024, 8},
8816 {64 * 1024, 127},
8817 },
8818 .block_erase = erase_sector_jedec,
8819 }, {
8820 .eraseblocks = { {8 * 1024 * 1024, 1} },
8821 .block_erase = erase_chip_block_jedec,
8822 },
8823 },
8824 .write = write_jedec_1,
8825 .read = read_memmapped,
8826 .voltage = {2700, 3600},
8827 },
8828
8829 {
8830 .vendor = "Macronix",
8831 .name = "MX29GL640ET",
8832 .bustype = BUS_PARALLEL,
8833 .manufacture_id = MACRONIX_ID,
8834 .model_id = MACRONIX_MX29GL640ET,
8835 .total_size = 8192,
8836 .page_size = 128 * 1024, /* actual page size is 16 */
8837 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8838 .tested = TEST_UNTESTED,
8839 .probe = probe_jedec_29gl,
8840 .probe_timing = TIMING_ZERO,
8841 .block_erasers =
8842 {
8843 {
8844 .eraseblocks = {
8845 {64 * 1024, 127},
8846 {8 * 1024, 8},
8847 },
8848 .block_erase = erase_sector_jedec,
8849 }, {
8850 .eraseblocks = { {8 * 1024 * 1024, 1} },
8851 .block_erase = erase_chip_block_jedec,
8852 },
8853 },
8854 .write = write_jedec_1,
8855 .read = read_memmapped,
8856 .voltage = {2700, 3600},
8857 },
8858
8859 {
8860 .vendor = "Macronix",
8861 .name = "MX29GL640EH/L",
8862 .bustype = BUS_PARALLEL,
8863 .manufacture_id = MACRONIX_ID,
8864 .model_id = MACRONIX_MX29GL640EHL,
8865 .total_size = 8192,
8866 .page_size = 128 * 1024, /* actual page size is 16 */
8867 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8868 .tested = TEST_UNTESTED,
8869 .probe = probe_jedec_29gl,
8870 .probe_timing = TIMING_ZERO,
8871 .block_erasers =
8872 {
8873 {
8874 .eraseblocks = { {64 * 1024, 128} },
8875 .block_erase = erase_sector_jedec,
8876 }, {
8877 .eraseblocks = { {8 * 1024 * 1024, 1} },
8878 .block_erase = erase_chip_block_jedec,
8879 },
8880 },
8881 .write = write_jedec_1,
8882 .read = read_memmapped,
8883 .voltage = {2700, 3600},
8884 },
8885
8886 {
8887 .vendor = "Macronix",
8888 .name = "MX29GL128F",
8889 .bustype = BUS_PARALLEL,
8890 .manufacture_id = MACRONIX_ID,
8891 .model_id = MACRONIX_MX29GL128F,
8892 .total_size = 16384,
8893 .page_size = 128 * 1024, /* actual page size is 16 */
8894 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8895 .tested = TEST_UNTESTED,
8896 .probe = probe_jedec_29gl,
8897 .probe_timing = TIMING_ZERO,
8898 .block_erasers =
8899 {
8900 {
8901 .eraseblocks = { {128 * 1024, 128} },
8902 .block_erase = erase_sector_jedec,
8903 }, {
8904 .eraseblocks = { {16 * 1024 * 1024, 1} },
8905 .block_erase = erase_chip_block_jedec,
8906 },
8907 },
8908 .write = write_jedec_1,
8909 .read = read_memmapped,
8910 .voltage = {2700, 3600},
8911 },
8912
8913 {
8914 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00008915 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008916 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008917 .manufacture_id = MACRONIX_ID,
8918 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008919 .total_size = 512,
8920 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008921 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8922 .tested = TEST_UNTESTED,
8923 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008924 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008925 .block_erasers =
8926 {
8927 {
Stefan Tauner6697f712014-08-06 15:09:15 +00008928 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00008929 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008930 }, {
8931 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008932 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008933 },
8934 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008935 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008936 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008937 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00008938 },
8939
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008940 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008941 .vendor = "Micron/Numonyx/ST",
8942 .name = "M25P05-A",
8943 .bustype = BUS_SPI,
8944 .manufacture_id = ST_ID,
8945 .model_id = ST_M25P05A,
8946 .total_size = 64,
8947 .page_size = 256,
8948 .feature_bits = FEATURE_WRSR_WREN,
8949 .tested = TEST_OK_PREW,
8950 .probe = probe_spi_rdid,
8951 .probe_timing = TIMING_ZERO,
8952 .block_erasers =
8953 {
8954 {
8955 .eraseblocks = { {32 * 1024, 2} },
8956 .block_erase = spi_block_erase_d8,
8957 }, {
8958 .eraseblocks = { {64 * 1024, 1} },
8959 .block_erase = spi_block_erase_c7,
8960 }
8961 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008962 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008963 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008964 .write = spi_chip_write_256,
8965 .read = spi_chip_read,
8966 .voltage = {2700, 3600},
8967 },
8968
8969 /* The ST M25P05 is a bit of a problem. It has the same ID as the
8970 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
8971 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
8972 * only is successful if RDID does not work.
8973 */
8974 {
8975 .vendor = "Micron/Numonyx/ST",
8976 .name = "M25P05",
8977 .bustype = BUS_SPI,
8978 .manufacture_id = 0, /* Not used. */
8979 .model_id = ST_M25P05_RES,
8980 .total_size = 64,
8981 .page_size = 256,
8982 .feature_bits = FEATURE_WRSR_WREN,
8983 .tested = TEST_UNTESTED,
8984 .probe = probe_spi_res1,
8985 .probe_timing = TIMING_ZERO,
8986 .block_erasers =
8987 {
8988 {
8989 .eraseblocks = { {32 * 1024, 2} },
8990 .block_erase = spi_block_erase_d8,
8991 }, {
8992 .eraseblocks = { {64 * 1024, 1} },
8993 .block_erase = spi_block_erase_c7,
8994 }
8995 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008996 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008997 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008998 .write = spi_chip_write_1, /* 128 */
8999 .read = spi_chip_read,
9000 .voltage = {2700, 3600},
9001 },
9002
9003 {
9004 .vendor = "Micron/Numonyx/ST",
9005 .name = "M25P10-A",
9006 .bustype = BUS_SPI,
9007 .manufacture_id = ST_ID,
9008 .model_id = ST_M25P10A,
9009 .total_size = 128,
9010 .page_size = 256,
9011 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009012 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009013 .probe = probe_spi_rdid,
9014 .probe_timing = TIMING_ZERO,
9015 .block_erasers =
9016 {
9017 {
9018 .eraseblocks = { {32 * 1024, 4} },
9019 .block_erase = spi_block_erase_d8,
9020 }, {
9021 .eraseblocks = { {128 * 1024, 1} },
9022 .block_erase = spi_block_erase_c7,
9023 }
9024 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009025 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009026 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009027 .write = spi_chip_write_256,
9028 .read = spi_chip_read,
9029 .voltage = {2700, 3600},
9030 },
9031
9032 /* The ST M25P10 has the same problem as the M25P05. */
9033 {
9034 .vendor = "Micron/Numonyx/ST",
9035 .name = "M25P10",
9036 .bustype = BUS_SPI,
9037 .manufacture_id = 0, /* Not used. */
9038 .model_id = ST_M25P10_RES,
9039 .total_size = 128,
9040 .page_size = 256,
9041 .feature_bits = FEATURE_WRSR_WREN,
9042 .tested = TEST_UNTESTED,
9043 .probe = probe_spi_res1,
9044 .probe_timing = TIMING_ZERO,
9045 .block_erasers =
9046 {
9047 {
9048 .eraseblocks = { {32 * 1024, 4} },
9049 .block_erase = spi_block_erase_d8,
9050 }, {
9051 .eraseblocks = { {128 * 1024, 1} },
9052 .block_erase = spi_block_erase_c7,
9053 }
9054 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009055 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009056 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009057 .write = spi_chip_write_1, /* 128 */
9058 .read = spi_chip_read,
9059 .voltage = {2700, 3600},
9060 },
9061
9062 {
9063 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9064 .name = "M25P20",
9065 .bustype = BUS_SPI,
9066 .manufacture_id = ST_ID,
9067 .model_id = ST_M25P20,
9068 .total_size = 256,
9069 .page_size = 256,
9070 .feature_bits = FEATURE_WRSR_WREN,
9071 .tested = TEST_UNTESTED,
9072 .probe = probe_spi_rdid,
9073 .probe_timing = TIMING_ZERO,
9074 .block_erasers =
9075 {
9076 {
9077 .eraseblocks = { {64 * 1024, 4} },
9078 .block_erase = spi_block_erase_d8,
9079 }, {
9080 .eraseblocks = { {256 * 1024, 1} },
9081 .block_erase = spi_block_erase_c7,
9082 }
9083 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009084 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009085 .unlock = spi_disable_blockprotect,
9086 .write = spi_chip_write_256,
9087 .read = spi_chip_read, /* Fast read (0x0B) supported */
9088 .voltage = {2700, 3600},
9089 },
9090
9091 {
9092 .vendor = "Micron/Numonyx/ST",
9093 .name = "M25P20-old",
9094 .bustype = BUS_SPI,
9095 .manufacture_id = 0, /* Not used. */
9096 .model_id = ST_M25P20_RES,
9097 .total_size = 256,
9098 .page_size = 256,
9099 .feature_bits = FEATURE_WRSR_WREN,
9100 .tested = TEST_OK_PREW,
9101 .probe = probe_spi_res1,
9102 .probe_timing = TIMING_ZERO,
9103 .block_erasers =
9104 {
9105 {
9106 .eraseblocks = { {64 * 1024, 4} },
9107 .block_erase = spi_block_erase_d8,
9108 }, {
9109 .eraseblocks = { {256 * 1024, 1} },
9110 .block_erase = spi_block_erase_c7,
9111 }
9112 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009113 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009114 .unlock = spi_disable_blockprotect,
9115 .write = spi_chip_write_256,
9116 .read = spi_chip_read, /* Fast read (0x0B) supported */
9117 .voltage = {2700, 3600},
9118 },
9119
9120 {
9121 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9122 .name = "M25P40",
9123 .bustype = BUS_SPI,
9124 .manufacture_id = ST_ID,
9125 .model_id = ST_M25P40,
9126 .total_size = 512,
9127 .page_size = 256,
9128 .feature_bits = FEATURE_WRSR_WREN,
9129 .tested = TEST_OK_PREW,
9130 .probe = probe_spi_rdid,
9131 .probe_timing = TIMING_ZERO,
9132 .block_erasers =
9133 {
9134 {
9135 .eraseblocks = { {64 * 1024, 8} },
9136 .block_erase = spi_block_erase_d8,
9137 }, {
9138 .eraseblocks = { {512 * 1024, 1} },
9139 .block_erase = spi_block_erase_c7,
9140 }
9141 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009142 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009143 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009144 .write = spi_chip_write_256,
9145 .read = spi_chip_read,
9146 .voltage = {2700, 3600},
9147 },
9148
9149 {
9150 .vendor = "Micron/Numonyx/ST",
9151 .name = "M25P40-old",
9152 .bustype = BUS_SPI,
9153 .manufacture_id = 0, /* Not used. */
9154 .model_id = ST_M25P40_RES,
9155 .total_size = 512,
9156 .page_size = 256,
9157 .feature_bits = FEATURE_WRSR_WREN,
9158 .tested = TEST_UNTESTED,
9159 .probe = probe_spi_res1,
9160 .probe_timing = TIMING_ZERO,
9161 .block_erasers =
9162 {
9163 {
9164 .eraseblocks = { {64 * 1024, 8} },
9165 .block_erase = spi_block_erase_d8,
9166 }, {
9167 .eraseblocks = { {512 * 1024, 1} },
9168 .block_erase = spi_block_erase_c7,
9169 }
9170 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009171 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009172 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009173 .write = spi_chip_write_256,
9174 .read = spi_chip_read,
9175 },
9176
9177 {
9178 .vendor = "Micron/Numonyx/ST",
9179 .name = "M25P80",
9180 .bustype = BUS_SPI,
9181 .manufacture_id = ST_ID,
9182 .model_id = ST_M25P80,
9183 .total_size = 1024,
9184 .page_size = 256,
9185 .feature_bits = FEATURE_WRSR_WREN,
9186 .tested = TEST_OK_PREW,
9187 .probe = probe_spi_rdid,
9188 .probe_timing = TIMING_ZERO,
9189 .block_erasers =
9190 {
9191 {
9192 .eraseblocks = { {64 * 1024, 16} },
9193 .block_erase = spi_block_erase_d8,
9194 }, {
9195 .eraseblocks = { {1024 * 1024, 1} },
9196 .block_erase = spi_block_erase_c7,
9197 }
9198 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009199 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009200 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009201 .write = spi_chip_write_256,
9202 .read = spi_chip_read,
9203 .voltage = {2700, 3600},
9204 },
9205
9206 {
9207 .vendor = "Micron/Numonyx/ST",
9208 .name = "M25P16",
9209 .bustype = BUS_SPI,
9210 .manufacture_id = ST_ID,
9211 .model_id = ST_M25P16,
9212 .total_size = 2048,
9213 .page_size = 256,
9214 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009215 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009216 .probe = probe_spi_rdid,
9217 .probe_timing = TIMING_ZERO,
9218 .block_erasers =
9219 {
9220 {
9221 .eraseblocks = { {64 * 1024, 32} },
9222 .block_erase = spi_block_erase_d8,
9223 }, {
9224 .eraseblocks = { {2 * 1024 * 1024, 1} },
9225 .block_erase = spi_block_erase_c7,
9226 }
9227 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009228 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009229 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009230 .write = spi_chip_write_256,
9231 .read = spi_chip_read,
9232 .voltage = {2700, 3600},
9233 },
9234
9235 {
9236 .vendor = "Micron/Numonyx/ST",
9237 .name = "M25P32",
9238 .bustype = BUS_SPI,
9239 .manufacture_id = ST_ID,
9240 .model_id = ST_M25P32,
9241 .total_size = 4096,
9242 .page_size = 256,
9243 .feature_bits = FEATURE_WRSR_WREN,
9244 .tested = TEST_OK_PREW,
9245 .probe = probe_spi_rdid,
9246 .probe_timing = TIMING_ZERO,
9247 .block_erasers =
9248 {
9249 {
9250 .eraseblocks = { {64 * 1024, 64} },
9251 .block_erase = spi_block_erase_d8,
9252 }, {
9253 .eraseblocks = { {4 * 1024 * 1024, 1} },
9254 .block_erase = spi_block_erase_c7,
9255 }
9256 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009257 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009258 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009259 .write = spi_chip_write_256,
9260 .read = spi_chip_read,
9261 .voltage = {2700, 3600},
9262 },
9263
9264 {
9265 .vendor = "Micron/Numonyx/ST",
9266 .name = "M25P64",
9267 .bustype = BUS_SPI,
9268 .manufacture_id = ST_ID,
9269 .model_id = ST_M25P64,
9270 .total_size = 8192,
9271 .page_size = 256,
9272 .feature_bits = FEATURE_WRSR_WREN,
9273 .tested = TEST_OK_PREW,
9274 .probe = probe_spi_rdid,
9275 .probe_timing = TIMING_ZERO,
9276 .block_erasers =
9277 {
9278 {
9279 .eraseblocks = { {64 * 1024, 128} },
9280 .block_erase = spi_block_erase_d8,
9281 }, {
9282 .eraseblocks = { {8 * 1024 * 1024, 1} },
9283 .block_erase = spi_block_erase_c7,
9284 }
9285 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009286 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009287 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009288 .write = spi_chip_write_256,
9289 .read = spi_chip_read,
9290 .voltage = {2700, 3600},
9291 },
9292
9293 {
9294 .vendor = "Micron/Numonyx/ST",
9295 .name = "M25P128",
9296 .bustype = BUS_SPI,
9297 .manufacture_id = ST_ID,
9298 .model_id = ST_M25P128,
9299 .total_size = 16384,
9300 .page_size = 256,
9301 .feature_bits = FEATURE_WRSR_WREN,
9302 .tested = TEST_OK_PREW,
9303 .probe = probe_spi_rdid,
9304 .probe_timing = TIMING_ZERO,
9305 .block_erasers =
9306 {
9307 {
9308 .eraseblocks = { {256 * 1024, 64} },
9309 .block_erase = spi_block_erase_d8,
9310 }, {
9311 .eraseblocks = { {16 * 1024 * 1024, 1} },
9312 .block_erase = spi_block_erase_c7,
9313 }
9314 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009315 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009316 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009317 .write = spi_chip_write_256,
9318 .read = spi_chip_read,
9319 .voltage = {2700, 3600},
9320 },
9321
9322 {
9323 .vendor = "Micron/Numonyx/ST",
9324 .name = "M25PE10",
9325 .bustype = BUS_SPI,
9326 .manufacture_id = ST_ID,
9327 .model_id = ST_M25PE10,
9328 .total_size = 128,
9329 .page_size = 256,
9330 .feature_bits = FEATURE_WRSR_WREN,
9331 .tested = TEST_UNTESTED,
9332 .probe = probe_spi_rdid,
9333 .probe_timing = TIMING_ZERO,
9334 .block_erasers =
9335 {
9336 {
9337 .eraseblocks = { {4 * 1024, 32} },
9338 .block_erase = spi_block_erase_20,
9339 }, {
9340 .eraseblocks = { {64 * 1024, 2} },
9341 .block_erase = spi_block_erase_d8,
9342 }, {
9343 .eraseblocks = { {128 * 1024, 1} },
9344 .block_erase = spi_block_erase_c7,
9345 }
9346 },
9347 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9348 .unlock = spi_disable_blockprotect,
9349 .write = spi_chip_write_256,
9350 .read = spi_chip_read,
9351 .voltage = {2700, 3600},
9352 },
9353
9354 {
9355 .vendor = "Micron/Numonyx/ST",
9356 .name = "M25PE20",
9357 .bustype = BUS_SPI,
9358 .manufacture_id = ST_ID,
9359 .model_id = ST_M25PE20,
9360 .total_size = 256,
9361 .page_size = 256,
9362 .feature_bits = FEATURE_WRSR_WREN,
9363 .tested = TEST_UNTESTED,
9364 .probe = probe_spi_rdid,
9365 .probe_timing = TIMING_ZERO,
9366 .block_erasers =
9367 {
9368 {
9369 .eraseblocks = { {4 * 1024, 64} },
9370 .block_erase = spi_block_erase_20,
9371 }, {
9372 .eraseblocks = { {64 * 1024, 4} },
9373 .block_erase = spi_block_erase_d8,
9374 }, {
9375 .eraseblocks = { {256 * 1024, 1} },
9376 .block_erase = spi_block_erase_c7,
9377 }
9378 },
9379 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9380 .unlock = spi_disable_blockprotect,
9381 .write = spi_chip_write_256,
9382 .read = spi_chip_read,
9383 .voltage = {2700, 3600},
9384 },
9385
9386 {
9387 .vendor = "Micron/Numonyx/ST",
9388 .name = "M25PE40",
9389 .bustype = BUS_SPI,
9390 .manufacture_id = ST_ID,
9391 .model_id = ST_M25PE40,
9392 .total_size = 512,
9393 .page_size = 256,
9394 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009395 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009396 .probe = probe_spi_rdid,
9397 .probe_timing = TIMING_ZERO,
9398 .block_erasers =
9399 {
9400 {
9401 .eraseblocks = { {4 * 1024, 128} },
9402 .block_erase = spi_block_erase_20,
9403 }, {
9404 .eraseblocks = { {64 * 1024, 8} },
9405 .block_erase = spi_block_erase_d8,
9406 }, {
9407 .eraseblocks = { {512 * 1024, 1} },
9408 .block_erase = spi_block_erase_c7,
9409 }
9410 },
9411 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9412 .unlock = spi_disable_blockprotect,
9413 .write = spi_chip_write_256,
9414 .read = spi_chip_read,
9415 .voltage = {2700, 3600},
9416 },
9417
9418 {
9419 .vendor = "Micron/Numonyx/ST",
9420 .name = "M25PE80",
9421 .bustype = BUS_SPI,
9422 .manufacture_id = ST_ID,
9423 .model_id = ST_M25PE80,
9424 .total_size = 1024,
9425 .page_size = 256,
9426 .feature_bits = FEATURE_WRSR_WREN,
9427 .tested = TEST_OK_PREW,
9428 .probe = probe_spi_rdid,
9429 .probe_timing = TIMING_ZERO,
9430 .block_erasers =
9431 {
9432 {
9433 .eraseblocks = { {4 * 1024, 256} },
9434 .block_erase = spi_block_erase_20,
9435 }, {
9436 .eraseblocks = { {64 * 1024, 16} },
9437 .block_erase = spi_block_erase_d8,
9438 }, {
9439 .eraseblocks = { {1024 * 1024, 1} },
9440 .block_erase = spi_block_erase_c7,
9441 }
9442 },
9443 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9444 .unlock = spi_disable_blockprotect,
9445 .write = spi_chip_write_256,
9446 .read = spi_chip_read,
9447 .voltage = {2700, 3600},
9448 },
9449
9450 {
9451 .vendor = "Micron/Numonyx/ST",
9452 .name = "M25PE16",
9453 .bustype = BUS_SPI,
9454 .manufacture_id = ST_ID,
9455 .model_id = ST_M25PE16,
9456 .total_size = 2048,
9457 .page_size = 256,
9458 .feature_bits = FEATURE_WRSR_WREN,
9459 .tested = TEST_UNTESTED,
9460 .probe = probe_spi_rdid,
9461 .probe_timing = TIMING_ZERO,
9462 .block_erasers =
9463 {
9464 {
9465 .eraseblocks = { {4 * 1024, 512} },
9466 .block_erase = spi_block_erase_20,
9467 }, {
9468 .eraseblocks = { {64 * 1024, 32} },
9469 .block_erase = spi_block_erase_d8,
9470 }, {
9471 .eraseblocks = { {2 * 1024 * 1024, 1} },
9472 .block_erase = spi_block_erase_c7,
9473 }
9474 },
9475 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9476 .unlock = spi_disable_blockprotect,
9477 .write = spi_chip_write_256,
9478 .read = spi_chip_read,
9479 .voltage = {2700, 3600},
9480 },
9481
9482 {
9483 .vendor = "Micron/Numonyx/ST",
9484 .name = "M25PX80",
9485 .bustype = BUS_SPI,
9486 .manufacture_id = ST_ID,
9487 .model_id = ST_M25PX80,
9488 .total_size = 1024,
9489 .page_size = 256,
9490 /* OTP: 64B total; read 0x4B, write 0x42 */
9491 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9492 .tested = TEST_OK_PREW,
9493 .probe = probe_spi_rdid,
9494 .probe_timing = TIMING_ZERO,
9495 .block_erasers = {
9496 {
9497 .eraseblocks = { { 4 * 1024, 256 } },
9498 .block_erase = spi_block_erase_20,
9499 }, {
9500 .eraseblocks = { {64 * 1024, 16} },
9501 .block_erase = spi_block_erase_d8,
9502 }, {
9503 .eraseblocks = { {1024 * 1024, 1} },
9504 .block_erase = spi_block_erase_c7,
9505 }
9506 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009507 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009508 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9509 .write = spi_chip_write_256,
9510 .read = spi_chip_read,
9511 .voltage = {2700, 3600},
9512 },
9513
9514 {
9515 .vendor = "Micron/Numonyx/ST",
9516 .name = "M25PX16",
9517 .bustype = BUS_SPI,
9518 .manufacture_id = ST_ID,
9519 .model_id = ST_M25PX16,
9520 .total_size = 2048,
9521 .page_size = 256,
9522 /* OTP: 64B total; read 0x4B; write 0x42 */
9523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9524 .tested = TEST_OK_PREW,
9525 .probe = probe_spi_rdid,
9526 .probe_timing = TIMING_ZERO,
9527 .block_erasers =
9528 {
9529 {
9530 .eraseblocks = { { 4 * 1024, 512 } },
9531 .block_erase = spi_block_erase_20,
9532 }, {
9533 .eraseblocks = { {64 * 1024, 32} },
9534 .block_erase = spi_block_erase_d8,
9535 }, {
9536 .eraseblocks = { {2 * 1024 * 1024, 1} },
9537 .block_erase = spi_block_erase_c7,
9538 }
9539 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009540 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009541 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9542 .write = spi_chip_write_256,
9543 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009544 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009545 },
9546
9547 {
9548 .vendor = "Micron/Numonyx/ST",
9549 .name = "M25PX32",
9550 .bustype = BUS_SPI,
9551 .manufacture_id = ST_ID,
9552 .model_id = ST_M25PX32,
9553 .total_size = 4096,
9554 .page_size = 256,
9555 /* OTP: 64B total; read 0x4B; write 0x42 */
9556 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9557 .tested = TEST_OK_PRE,
9558 .probe = probe_spi_rdid,
9559 .probe_timing = TIMING_ZERO,
9560 .block_erasers =
9561 {
9562 {
9563 .eraseblocks = { { 4 * 1024, 1024 } },
9564 .block_erase = spi_block_erase_20,
9565 }, {
9566 .eraseblocks = { {64 * 1024, 64} },
9567 .block_erase = spi_block_erase_d8,
9568 }, {
9569 .eraseblocks = { {4 * 1024 * 1024, 1} },
9570 .block_erase = spi_block_erase_c7,
9571 }
9572 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009573 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009574 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9575 .write = spi_chip_write_256,
9576 .read = spi_chip_read,
9577 .voltage = {2700, 3600},
9578 },
9579
9580 {
9581 .vendor = "Micron/Numonyx/ST",
9582 .name = "M25PX64",
9583 .bustype = BUS_SPI,
9584 .manufacture_id = ST_ID,
9585 .model_id = ST_M25PX64,
9586 .total_size = 8192,
9587 .page_size = 256,
9588 /* OTP: 64B total; read 0x4B; write 0x42 */
9589 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009590 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009591 .probe = probe_spi_rdid,
9592 .probe_timing = TIMING_ZERO,
9593 .block_erasers =
9594 {
9595 {
9596 .eraseblocks = { { 4 * 1024, 2048 } },
9597 .block_erase = spi_block_erase_20,
9598 }, {
9599 .eraseblocks = { {64 * 1024, 128} },
9600 .block_erase = spi_block_erase_d8,
9601 }, {
9602 .eraseblocks = { {8 * 1024 * 1024, 1} },
9603 .block_erase = spi_block_erase_c7,
9604 }
9605 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009606 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009607 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9608 .write = spi_chip_write_256,
9609 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009610 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009611 },
9612
9613 {
9614 .vendor = "Micron/Numonyx/ST",
9615 .name = "M45PE10",
9616 .bustype = BUS_SPI,
9617 .manufacture_id = ST_ID,
9618 .model_id = ST_M45PE10,
9619 .total_size = 128,
9620 .page_size = 256,
9621 .tested = TEST_UNTESTED,
9622 .probe = probe_spi_rdid,
9623 .probe_timing = TIMING_ZERO,
9624 .block_erasers = {
9625 {
9626 .eraseblocks = { {256, 512} },
9627 .block_erase = spi_block_erase_db,
9628 }, {
9629 .eraseblocks = { {64 * 1024, 2} },
9630 .block_erase = spi_block_erase_d8,
9631 }
9632 },
9633 .printlock = spi_prettyprint_status_register_default_welwip,
9634 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9635 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9636 .read = spi_chip_read, /* Fast read (0x0B) supported */
9637 .voltage = {2700, 3600},
9638 },
9639
9640 {
9641 .vendor = "Micron/Numonyx/ST",
9642 .name = "M45PE20",
9643 .bustype = BUS_SPI,
9644 .manufacture_id = ST_ID,
9645 .model_id = ST_M45PE20,
9646 .total_size = 256,
9647 .page_size = 256,
9648 .tested = TEST_UNTESTED,
9649 .probe = probe_spi_rdid,
9650 .probe_timing = TIMING_ZERO,
9651 .block_erasers = {
9652 {
9653 .eraseblocks = { {256, 1024} },
9654 .block_erase = spi_block_erase_db,
9655 }, {
9656 .eraseblocks = { {64 * 1024, 4} },
9657 .block_erase = spi_block_erase_d8,
9658 }
9659 },
9660 .printlock = spi_prettyprint_status_register_default_welwip,
9661 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9662 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9663 .read = spi_chip_read, /* Fast read (0x0B) supported */
9664 .voltage = {2700, 3600},
9665 },
9666
9667 {
9668 .vendor = "Micron/Numonyx/ST",
9669 .name = "M45PE40",
9670 .bustype = BUS_SPI,
9671 .manufacture_id = ST_ID,
9672 .model_id = ST_M45PE40,
9673 .total_size = 512,
9674 .page_size = 256,
9675 .tested = TEST_UNTESTED,
9676 .probe = probe_spi_rdid,
9677 .probe_timing = TIMING_ZERO,
9678 .block_erasers = {
9679 {
9680 .eraseblocks = { {256, 2048} },
9681 .block_erase = spi_block_erase_db,
9682 }, {
9683 .eraseblocks = { {64 * 1024, 8} },
9684 .block_erase = spi_block_erase_d8,
9685 }
9686 },
9687 .printlock = spi_prettyprint_status_register_default_welwip,
9688 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +00009689 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009690 .read = spi_chip_read, /* Fast read (0x0B) supported */
9691 .voltage = {2700, 3600},
9692 },
9693
9694 {
9695 .vendor = "Micron/Numonyx/ST",
9696 .name = "M45PE80",
9697 .bustype = BUS_SPI,
9698 .manufacture_id = ST_ID,
9699 .model_id = ST_M45PE80,
9700 .total_size = 1024,
9701 .page_size = 256,
9702 .tested = TEST_UNTESTED,
9703 .probe = probe_spi_rdid,
9704 .probe_timing = TIMING_ZERO,
9705 .block_erasers = {
9706 {
9707 .eraseblocks = { {256, 4096} },
9708 .block_erase = spi_block_erase_db,
9709 }, {
9710 .eraseblocks = { {64 * 1024, 16} },
9711 .block_erase = spi_block_erase_d8,
9712 }
9713 },
9714 .printlock = spi_prettyprint_status_register_default_welwip,
9715 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9716 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9717 .read = spi_chip_read, /* Fast read (0x0B) supported */
9718 .voltage = {2700, 3600},
9719 },
9720
9721 {
9722 .vendor = "Micron/Numonyx/ST",
9723 .name = "M45PE16",
9724 .bustype = BUS_SPI,
9725 .manufacture_id = ST_ID,
9726 .model_id = ST_M45PE16,
9727 .total_size = 2048,
9728 .page_size = 256,
9729 .tested = TEST_UNTESTED,
9730 .probe = probe_spi_rdid,
9731 .probe_timing = TIMING_ZERO,
9732 .block_erasers = {
9733 {
9734 .eraseblocks = { {256, 8192} },
9735 .block_erase = spi_block_erase_db,
9736 }, {
9737 .eraseblocks = { {64 * 1024, 32} },
9738 .block_erase = spi_block_erase_d8,
9739 }
9740 },
9741 .printlock = spi_prettyprint_status_register_default_welwip,
9742 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9743 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9744 .read = spi_chip_read, /* Fast read (0x0B) supported */
9745 .voltage = {2700, 3600},
9746 },
9747
9748 {
9749 .vendor = "Micron/Numonyx/ST",
9750 .name = "N25Q016",
9751 .bustype = BUS_SPI,
9752 .manufacture_id = ST_ID,
9753 .model_id = ST_N25Q016__1E,
9754 .total_size = 2048,
9755 .page_size = 256,
9756 /* supports SFDP */
9757 /* OTP: 64B total; read 0x4B, write 0x42 */
9758 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9759 .tested = TEST_UNTESTED,
9760 .probe = probe_spi_rdid,
9761 .probe_timing = TIMING_ZERO,
9762 .block_erasers =
9763 {
9764 {
9765 .eraseblocks = { {4 * 1024, 512} },
9766 .block_erase = spi_block_erase_20,
9767 }, {
9768 .eraseblocks = { {32 * 1024, 64} },
9769 .block_erase = spi_block_erase_52,
9770 }, {
9771 .eraseblocks = { {64 * 1024, 32} },
9772 .block_erase = spi_block_erase_d8,
9773 }, {
9774 .eraseblocks = { {2 * 1024 * 1024, 1} },
9775 .block_erase = spi_block_erase_c7,
9776 }
9777 },
9778 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9779 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9780 .write = spi_chip_write_256, /* Multi I/O supported */
9781 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9782 .voltage = {1700, 2000},
9783 },
9784
9785 {
9786 .vendor = "Micron/Numonyx/ST",
9787 .name = "N25Q032..1E",
9788 .bustype = BUS_SPI,
9789 .manufacture_id = ST_ID,
9790 .model_id = ST_N25Q032__1E,
9791 .total_size = 4096,
9792 .page_size = 256,
9793 /* supports SFDP */
9794 /* OTP: 64B total; read 0x4B, write 0x42 */
9795 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9796 .tested = TEST_UNTESTED,
9797 .probe = probe_spi_rdid,
9798 .probe_timing = TIMING_ZERO,
9799 .block_erasers =
9800 {
9801 {
9802 .eraseblocks = { {4 * 1024, 1024} },
9803 .block_erase = spi_block_erase_20,
9804 }, {
9805 .eraseblocks = { {64 * 1024, 64} },
9806 .block_erase = spi_block_erase_d8,
9807 }, {
9808 .eraseblocks = { {4 * 1024 * 1024, 1} },
9809 .block_erase = spi_block_erase_c7,
9810 }
9811 },
9812 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9813 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9814 .write = spi_chip_write_256, /* Multi I/O supported */
9815 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9816 .voltage = {1700, 2000},
9817 },
9818
9819 {
9820 .vendor = "Micron/Numonyx/ST",
9821 .name = "N25Q032..3E",
9822 .bustype = BUS_SPI,
9823 .manufacture_id = ST_ID,
9824 .model_id = ST_N25Q032__3E,
9825 .total_size = 4096,
9826 .page_size = 256,
9827 /* supports SFDP */
9828 /* OTP: 64B total; read 0x4B, write 0x42 */
9829 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9830 .tested = TEST_OK_PREW,
9831 .probe = probe_spi_rdid,
9832 .probe_timing = TIMING_ZERO,
9833 .block_erasers =
9834 {
9835 {
9836 .eraseblocks = { {4 * 1024, 1024} },
9837 .block_erase = spi_block_erase_20,
9838 }, {
9839 .eraseblocks = { {64 * 1024, 64} },
9840 .block_erase = spi_block_erase_d8,
9841 }, {
9842 .eraseblocks = { {4 * 1024 * 1024, 1} },
9843 .block_erase = spi_block_erase_c7,
9844 }
9845 },
9846 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9847 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9848 .write = spi_chip_write_256, /* Multi I/O supported */
9849 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9850 .voltage = {2700, 3600},
9851 },
9852
9853 {
9854 .vendor = "Micron/Numonyx/ST",
9855 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9856 .bustype = BUS_SPI,
9857 .manufacture_id = ST_ID,
9858 .model_id = ST_N25Q064__1E,
9859 .total_size = 8192,
9860 .page_size = 256,
9861 /* supports SFDP */
9862 /* OTP: 64B total; read 0x4B, write 0x42 */
9863 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009864 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009865 .probe = probe_spi_rdid,
9866 .probe_timing = TIMING_ZERO,
9867 .block_erasers =
9868 {
9869 {
9870 .eraseblocks = { {4 * 1024, 2048 } },
9871 .block_erase = spi_block_erase_20,
9872 }, {
9873 .eraseblocks = { {64 * 1024, 128} },
9874 .block_erase = spi_block_erase_d8,
9875 }, {
9876 .eraseblocks = { {8 * 1024 * 1024, 1} },
9877 .block_erase = spi_block_erase_c7,
9878 }
9879 },
9880 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9881 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9882 .write = spi_chip_write_256, /* Multi I/O supported */
9883 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9884 .voltage = {1700, 2000},
9885 },
9886
9887 {
9888 .vendor = "Micron/Numonyx/ST",
9889 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9890 .bustype = BUS_SPI,
9891 .manufacture_id = ST_ID,
9892 .model_id = ST_N25Q064__3E,
9893 .total_size = 8192,
9894 .page_size = 256,
9895 /* supports SFDP */
9896 /* OTP: 64B total; read 0x4B, write 0x42 */
9897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9898 .tested = TEST_OK_PREW,
9899 .probe = probe_spi_rdid,
9900 .probe_timing = TIMING_ZERO,
9901 .block_erasers =
9902 {
9903 {
9904 .eraseblocks = { {4 * 1024, 2048 } },
9905 .block_erase = spi_block_erase_20,
9906 }, {
9907 .eraseblocks = { {64 * 1024, 128} },
9908 .block_erase = spi_block_erase_d8,
9909 }, {
9910 .eraseblocks = { {8 * 1024 * 1024, 1} },
9911 .block_erase = spi_block_erase_c7,
9912 }
9913 },
9914 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9915 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9916 .write = spi_chip_write_256, /* Multi I/O supported */
9917 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9918 .voltage = {2700, 3600},
9919 },
9920
9921 {
9922 .vendor = "Micron/Numonyx/ST",
9923 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9924 .bustype = BUS_SPI,
9925 .manufacture_id = ST_ID,
9926 .model_id = ST_N25Q128__1E,
9927 .total_size = 16384,
9928 .page_size = 256,
9929 /* supports SFDP */
9930 /* OTP: 64B total; read 0x4B, write 0x42 */
9931 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009932 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009933 .probe = probe_spi_rdid,
9934 .probe_timing = TIMING_ZERO,
9935 .block_erasers = {
9936 {
9937 .eraseblocks = { {4 * 1024, 4096 } },
9938 .block_erase = spi_block_erase_20,
9939 }, {
9940 .eraseblocks = { {64 * 1024, 256} },
9941 .block_erase = spi_block_erase_d8,
9942 }, {
9943 .eraseblocks = { {16384 * 1024, 1} },
9944 .block_erase = spi_block_erase_c7,
9945 }
9946 },
9947 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9948 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9949 .write = spi_chip_write_256, /* Multi I/O supported */
9950 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9951 .voltage = {1700, 2000},
9952 },
9953
9954 {
9955 .vendor = "Micron/Numonyx/ST",
9956 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9957 .bustype = BUS_SPI,
9958 .manufacture_id = ST_ID,
9959 .model_id = ST_N25Q128__3E,
9960 .total_size = 16384,
9961 .page_size = 256,
9962 /* supports SFDP */
9963 /* OTP: 64B total; read 0x4B, write 0x42 */
9964 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9965 .tested = TEST_OK_PREW,
9966 .probe = probe_spi_rdid,
9967 .probe_timing = TIMING_ZERO,
9968 .block_erasers = {
9969 {
9970 .eraseblocks = { {4 * 1024, 4096 } },
9971 .block_erase = spi_block_erase_20,
9972 }, {
9973 .eraseblocks = { {64 * 1024, 256} },
9974 .block_erase = spi_block_erase_d8,
9975 }, {
9976 .eraseblocks = { {16384 * 1024, 1} },
9977 .block_erase = spi_block_erase_c7,
9978 }
9979 },
9980 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9981 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9982 .write = spi_chip_write_256, /* Multi I/O supported */
9983 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9984 .voltage = {2700, 3600},
9985 },
9986
9987 {
Ed Swierk199ab392017-07-03 13:33:44 -07009988 .vendor = "Micron",
9989 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
9990 .bustype = BUS_SPI,
9991 .manufacture_id = ST_ID,
9992 .model_id = ST_N25Q256__3E,
9993 .total_size = 32768,
9994 .page_size = 256,
9995 /* supports SFDP */
9996 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +01009997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
9998 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -07009999 .probe = probe_spi_rdid,
10000 .probe_timing = TIMING_ZERO,
10001 .block_erasers = {
10002 {
10003 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010004 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010005 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010006 .eraseblocks = { {4 * 1024, 8192} },
10007 .block_erase = spi_block_erase_20,
10008 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010009 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010010 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010011 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010012 .eraseblocks = { {64 * 1024, 512} },
10013 .block_erase = spi_block_erase_d8,
10014 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010015 .eraseblocks = { {32768 * 1024, 1} },
10016 .block_erase = spi_block_erase_c7,
10017 }
10018 },
10019 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10020 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10021 .write = spi_chip_write_256, /* Multi I/O supported */
10022 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10023 .voltage = {2700, 3600},
10024 },
10025
10026 {
10027 .vendor = "Micron",
10028 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
10029 .bustype = BUS_SPI,
10030 .manufacture_id = ST_ID,
10031 .model_id = ST_N25Q512__3E,
10032 .total_size = 65536,
10033 .page_size = 256,
10034 /* supports SFDP */
10035 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010010036 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10037 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -070010038 .probe = probe_spi_rdid,
10039 .probe_timing = TIMING_ZERO,
10040 .block_erasers = {
10041 {
10042 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010043 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010044 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010045 .eraseblocks = { {4 * 1024, 16384} },
10046 .block_erase = spi_block_erase_20,
10047 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010048 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010049 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010050 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010051 .eraseblocks = { {64 * 1024, 1024} },
10052 .block_erase = spi_block_erase_d8,
10053 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010054 .eraseblocks = { {65536 * 1024, 1} },
10055 .block_erase = spi_block_erase_c7,
10056 }
10057 },
10058 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10059 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10060 .write = spi_chip_write_256, /* Multi I/O supported */
10061 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10062 .voltage = {2700, 3600},
10063 },
10064
10065 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010066 .vendor = "MoselVitelic",
10067 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010068 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010069 .manufacture_id = SYNCMOS_MVC_ID,
10070 .model_id = MVC_V29C51000B,
10071 .total_size = 64,
10072 .page_size = 512,
10073 .feature_bits = FEATURE_EITHER_RESET,
10074 .tested = TEST_UNTESTED,
10075 .probe = probe_jedec,
10076 .probe_timing = TIMING_ZERO,
10077 .block_erasers =
10078 {
10079 {
10080 .eraseblocks = { {512, 128} },
10081 .block_erase = erase_sector_jedec,
10082 }, {
10083 .eraseblocks = { {64 * 1024, 1} },
10084 .block_erase = erase_chip_block_jedec,
10085 },
10086 },
10087 .write = write_jedec_1,
10088 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010089 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010090 },
10091
10092 {
10093 .vendor = "MoselVitelic",
10094 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010095 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010096 .manufacture_id = SYNCMOS_MVC_ID,
10097 .model_id = MVC_V29C51000T,
10098 .total_size = 64,
10099 .page_size = 512,
10100 .feature_bits = FEATURE_EITHER_RESET,
10101 .tested = TEST_UNTESTED,
10102 .probe = probe_jedec,
10103 .probe_timing = TIMING_ZERO,
10104 .block_erasers =
10105 {
10106 {
10107 .eraseblocks = { {512, 128} },
10108 .block_erase = erase_sector_jedec,
10109 }, {
10110 .eraseblocks = { {64 * 1024, 1} },
10111 .block_erase = erase_chip_block_jedec,
10112 },
10113 },
10114 .write = write_jedec_1,
10115 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010116 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010117 },
10118
10119 {
10120 .vendor = "MoselVitelic",
10121 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010122 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010123 .manufacture_id = SYNCMOS_MVC_ID,
10124 .model_id = MVC_V29C51400B,
10125 .total_size = 512,
10126 .page_size = 1024,
10127 .feature_bits = FEATURE_EITHER_RESET,
10128 .tested = TEST_UNTESTED,
10129 .probe = probe_jedec,
10130 .probe_timing = TIMING_ZERO,
10131 .block_erasers =
10132 {
10133 {
10134 .eraseblocks = { {1024, 512} },
10135 .block_erase = erase_sector_jedec,
10136 }, {
10137 .eraseblocks = { {512 * 1024, 1} },
10138 .block_erase = erase_chip_block_jedec,
10139 },
10140 },
10141 .write = write_jedec_1,
10142 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010143 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010144 },
10145
10146 {
10147 .vendor = "MoselVitelic",
10148 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010149 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010150 .manufacture_id = SYNCMOS_MVC_ID,
10151 .model_id = MVC_V29C51400T,
10152 .total_size = 512,
10153 .page_size = 1024,
10154 .feature_bits = FEATURE_EITHER_RESET,
10155 .tested = TEST_UNTESTED,
10156 .probe = probe_jedec,
10157 .probe_timing = TIMING_ZERO,
10158 .block_erasers =
10159 {
10160 {
10161 .eraseblocks = { {1024, 512} },
10162 .block_erase = erase_sector_jedec,
10163 }, {
10164 .eraseblocks = { {512 * 1024, 1} },
10165 .block_erase = erase_chip_block_jedec,
10166 },
10167 },
10168 .write = write_jedec_1,
10169 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010170 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010171 },
10172
10173 {
10174 .vendor = "MoselVitelic",
10175 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010176 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010177 .manufacture_id = SYNCMOS_MVC_ID,
10178 .model_id = MVC_V29LC51000,
10179 .total_size = 64,
10180 .page_size = 512,
10181 .feature_bits = FEATURE_EITHER_RESET,
10182 .tested = TEST_UNTESTED,
10183 .probe = probe_jedec,
10184 .probe_timing = TIMING_ZERO,
10185 .block_erasers =
10186 {
10187 {
10188 .eraseblocks = { {512, 128} },
10189 .block_erase = erase_sector_jedec,
10190 }, {
10191 .eraseblocks = { {64 * 1024, 1} },
10192 .block_erase = erase_chip_block_jedec,
10193 },
10194 },
10195 .write = write_jedec_1,
10196 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010197 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010198 },
10199
10200 {
10201 .vendor = "MoselVitelic",
10202 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010203 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010204 .manufacture_id = SYNCMOS_MVC_ID,
10205 .model_id = MVC_V29LC51001,
10206 .total_size = 128,
10207 .page_size = 512,
10208 .feature_bits = FEATURE_EITHER_RESET,
10209 .tested = TEST_UNTESTED,
10210 .probe = probe_jedec,
10211 .probe_timing = TIMING_ZERO,
10212 .block_erasers =
10213 {
10214 {
10215 .eraseblocks = { {512, 256} },
10216 .block_erase = erase_sector_jedec,
10217 }, {
10218 .eraseblocks = { {128 * 1024, 1} },
10219 .block_erase = erase_chip_block_jedec,
10220 },
10221 },
10222 .write = write_jedec_1,
10223 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010224 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010225 },
10226
10227 {
10228 .vendor = "MoselVitelic",
10229 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010230 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010231 .manufacture_id = SYNCMOS_MVC_ID,
10232 .model_id = MVC_V29LC51002,
10233 .total_size = 256,
10234 .page_size = 512,
10235 .feature_bits = FEATURE_EITHER_RESET,
10236 .tested = TEST_UNTESTED,
10237 .probe = probe_jedec,
10238 .probe_timing = TIMING_ZERO,
10239 .block_erasers =
10240 {
10241 {
10242 .eraseblocks = { {512, 512} },
10243 .block_erase = erase_sector_jedec,
10244 }, {
10245 .eraseblocks = { {256 * 1024, 1} },
10246 .block_erase = erase_chip_block_jedec,
10247 },
10248 },
10249 .write = write_jedec_1,
10250 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010251 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010252 },
10253
10254 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010255 .vendor = "Nantronics",
10256 .name = "N25S10",
10257 .bustype = BUS_SPI,
10258 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10259 .model_id = NANTRONICS_N25S10,
10260 .total_size = 128,
10261 .page_size = 256,
10262 .feature_bits = FEATURE_WRSR_WREN,
10263 .tested = TEST_UNTESTED,
10264 .probe = probe_spi_rdid,
10265 .probe_timing = TIMING_ZERO,
10266 .block_erasers =
10267 {
10268 {
10269 .eraseblocks = { {4 * 1024, 32} },
10270 .block_erase = spi_block_erase_20,
10271 }, {
10272 .eraseblocks = { {4 * 1024, 32} },
10273 .block_erase = spi_block_erase_d7,
10274 }, {
10275 .eraseblocks = { {32 * 1024, 4} },
10276 .block_erase = spi_block_erase_52,
10277 }, {
10278 .eraseblocks = { {64 * 1024, 2} },
10279 .block_erase = spi_block_erase_d8,
10280 }, {
10281 .eraseblocks = { {128 * 1024, 1} },
10282 .block_erase = spi_block_erase_60,
10283 }, {
10284 .eraseblocks = { {128 * 1024, 1} },
10285 .block_erase = spi_block_erase_c7,
10286 }
10287 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010288 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010289 .unlock = spi_disable_blockprotect_bp3_srwd,
10290 .write = spi_chip_write_256,
10291 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10292 .voltage = {2700, 3600},
10293 },
10294
10295 {
10296 .vendor = "Nantronics",
10297 .name = "N25S20",
10298 .bustype = BUS_SPI,
10299 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10300 .model_id = NANTRONICS_N25S20,
10301 .total_size = 256,
10302 .page_size = 256,
10303 .feature_bits = FEATURE_WRSR_WREN,
10304 .tested = TEST_UNTESTED,
10305 .probe = probe_spi_rdid,
10306 .probe_timing = TIMING_ZERO,
10307 .block_erasers =
10308 {
10309 {
10310 .eraseblocks = { {4 * 1024, 64} },
10311 .block_erase = spi_block_erase_20,
10312 }, {
10313 .eraseblocks = { {4 * 1024, 64} },
10314 .block_erase = spi_block_erase_d7,
10315 }, {
10316 .eraseblocks = { {32 * 1024, 8} },
10317 .block_erase = spi_block_erase_52,
10318 }, {
10319 .eraseblocks = { {64 * 1024, 4} },
10320 .block_erase = spi_block_erase_d8,
10321 }, {
10322 .eraseblocks = { {256 * 1024, 1} },
10323 .block_erase = spi_block_erase_60,
10324 }, {
10325 .eraseblocks = { {256 * 1024, 1} },
10326 .block_erase = spi_block_erase_c7,
10327 }
10328 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010329 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010330 .unlock = spi_disable_blockprotect_bp3_srwd,
10331 .write = spi_chip_write_256,
10332 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10333 .voltage = {2700, 3600},
10334 },
10335
10336 {
10337 .vendor = "Nantronics",
10338 .name = "N25S40",
10339 .bustype = BUS_SPI,
10340 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10341 .model_id = NANTRONICS_N25S40,
10342 .total_size = 512,
10343 .page_size = 256,
10344 .feature_bits = FEATURE_WRSR_WREN,
10345 .tested = TEST_UNTESTED,
10346 .probe = probe_spi_rdid,
10347 .probe_timing = TIMING_ZERO,
10348 .block_erasers =
10349 {
10350 {
10351 .eraseblocks = { {4 * 1024, 128} },
10352 .block_erase = spi_block_erase_20,
10353 }, {
10354 .eraseblocks = { {4 * 1024, 128} },
10355 .block_erase = spi_block_erase_d7,
10356 }, {
10357 .eraseblocks = { {32 * 1024, 16} },
10358 .block_erase = spi_block_erase_52,
10359 }, {
10360 .eraseblocks = { {64 * 1024, 8} },
10361 .block_erase = spi_block_erase_d8,
10362 }, {
10363 .eraseblocks = { {512 * 1024, 1} },
10364 .block_erase = spi_block_erase_60,
10365 }, {
10366 .eraseblocks = { {512 * 1024, 1} },
10367 .block_erase = spi_block_erase_c7,
10368 }
10369 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010370 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010371 .unlock = spi_disable_blockprotect_bp3_srwd,
10372 .write = spi_chip_write_256,
10373 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10374 .voltage = {2700, 3600},
10375 },
10376
10377 {
10378 .vendor = "Nantronics",
10379 .name = "N25S80",
10380 .bustype = BUS_SPI,
10381 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10382 .model_id = NANTRONICS_N25S80,
10383 .total_size = 1024,
10384 .page_size = 256,
10385 .feature_bits = FEATURE_WRSR_WREN,
10386 .tested = TEST_UNTESTED,
10387 .probe = probe_spi_rdid,
10388 .probe_timing = TIMING_ZERO,
10389 .block_erasers =
10390 {
10391 {
10392 .eraseblocks = { {4 * 1024, 256} },
10393 .block_erase = spi_block_erase_20,
10394 }, {
10395 .eraseblocks = { {32 * 1024, 32} },
10396 .block_erase = spi_block_erase_52,
10397 }, {
10398 .eraseblocks = { {64 * 1024, 16} },
10399 .block_erase = spi_block_erase_d8,
10400 }, {
10401 .eraseblocks = { {1024 * 1024, 1} },
10402 .block_erase = spi_block_erase_60,
10403 }, {
10404 .eraseblocks = { {1024 * 1024, 1} },
10405 .block_erase = spi_block_erase_c7,
10406 }
10407 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010408 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010409 .unlock = spi_disable_blockprotect_bp3_srwd,
10410 .write = spi_chip_write_256,
10411 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10412 .voltage = {2700, 3600},
10413 },
10414
10415 {
10416 .vendor = "Nantronics",
10417 .name = "N25S16",
10418 .bustype = BUS_SPI,
10419 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10420 .model_id = NANTRONICS_N25S16,
10421 .total_size = 2048,
10422 .page_size = 256,
10423 .feature_bits = FEATURE_WRSR_WREN,
10424 .tested = TEST_UNTESTED,
10425 .probe = probe_spi_rdid,
10426 .probe_timing = TIMING_ZERO,
10427 .block_erasers =
10428 {
10429 {
10430 .eraseblocks = { {4 * 1024, 512} },
10431 .block_erase = spi_block_erase_20,
10432 }, {
10433 .eraseblocks = { {64 * 1024, 32} },
10434 .block_erase = spi_block_erase_d8,
10435 }, {
10436 .eraseblocks = { {2048 * 1024, 1} },
10437 .block_erase = spi_block_erase_60,
10438 }, {
10439 .eraseblocks = { {2048 * 1024, 1} },
10440 .block_erase = spi_block_erase_c7,
10441 }
10442 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010443 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010444 .unlock = spi_disable_blockprotect_bp3_srwd,
10445 .write = spi_chip_write_256,
10446 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10447 .voltage = {2700, 3600},
10448 },
10449
10450 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010451 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +000010452 .name = "Pm25LD256C",
10453 .bustype = BUS_SPI,
10454 .manufacture_id = PMC_ID,
10455 .model_id = PMC_PM25LD256C,
10456 .total_size = 32,
10457 .page_size = 256,
10458 .feature_bits = FEATURE_WRSR_WREN,
10459 .tested = TEST_UNTESTED,
10460 .probe = probe_spi_rdid,
10461 .probe_timing = TIMING_ZERO,
10462 .block_erasers =
10463 {
10464 {
10465 .eraseblocks = { {4 * 1024, 8} },
10466 .block_erase = spi_block_erase_20,
10467 }, {
10468 .eraseblocks = { {4 * 1024, 8} },
10469 .block_erase = spi_block_erase_d7,
10470 }, {
10471 .eraseblocks = { {32 * 1024, 1} },
10472 .block_erase = spi_block_erase_d8,
10473 }, {
10474 .eraseblocks = { {32 * 1024, 1} },
10475 .block_erase = spi_block_erase_60,
10476 }, {
10477 .eraseblocks = { {32 * 1024, 1} },
10478 .block_erase = spi_block_erase_c7,
10479 }
10480 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010481 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010482 .unlock = spi_disable_blockprotect,
10483 .write = spi_chip_write_256,
10484 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10485 .voltage = {2700, 3600},
10486 },
10487 {
10488 .vendor = "PMC",
10489 .name = "Pm25LD512(C)",
10490 .bustype = BUS_SPI,
10491 .manufacture_id = PMC_ID,
10492 .model_id = PMC_PM25LD512,
10493 .total_size = 64,
10494 .page_size = 256,
10495 .feature_bits = FEATURE_WRSR_WREN,
10496 .tested = TEST_OK_PREW,
10497 .probe = probe_spi_rdid,
10498 .probe_timing = TIMING_ZERO,
10499 .block_erasers =
10500 {
10501 {
10502 .eraseblocks = { {4 * 1024, 16} },
10503 .block_erase = spi_block_erase_20,
10504 }, {
10505 .eraseblocks = { {4 * 1024, 16} },
10506 .block_erase = spi_block_erase_d7,
10507 }, {
10508 .eraseblocks = { {32 * 1024, 2} },
10509 .block_erase = spi_block_erase_d8,
10510 }, {
10511 .eraseblocks = { {64 * 1024, 1} },
10512 .block_erase = spi_block_erase_60,
10513 }, {
10514 .eraseblocks = { {64 * 1024, 1} },
10515 .block_erase = spi_block_erase_c7,
10516 }
10517 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010518 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010519 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
10520 .write = spi_chip_write_256,
10521 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10522 .voltage = {2300, 3600},
10523 },
10524
10525 {
10526 .vendor = "PMC",
10527 .name = "Pm25LD010(C)",
10528 .bustype = BUS_SPI,
10529 .manufacture_id = PMC_ID,
10530 .model_id = PMC_PM25LD010,
10531 .total_size = 128,
10532 .page_size = 256,
10533 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010534 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000010535 .probe = probe_spi_rdid,
10536 .probe_timing = TIMING_ZERO,
10537 .block_erasers =
10538 {
10539 {
10540 .eraseblocks = { {4 * 1024, 32} },
10541 .block_erase = spi_block_erase_20,
10542 }, {
10543 .eraseblocks = { {4 * 1024, 32} },
10544 .block_erase = spi_block_erase_d7,
10545 }, {
10546 .eraseblocks = { {32 * 1024, 4} },
10547 .block_erase = spi_block_erase_d8,
10548 }, {
10549 .eraseblocks = { {128 * 1024, 1} },
10550 .block_erase = spi_block_erase_60,
10551 }, {
10552 .eraseblocks = { {128 * 1024, 1} },
10553 .block_erase = spi_block_erase_c7,
10554 }
10555 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010556 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010557 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
10558 .write = spi_chip_write_256,
10559 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10560 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
10561 },
10562
10563 {
10564 .vendor = "PMC",
10565 .name = "Pm25LD020(C)",
10566 .bustype = BUS_SPI,
10567 .manufacture_id = PMC_ID,
10568 .model_id = PMC_PM25LD020,
10569 .total_size = 256,
10570 .page_size = 256,
10571 .feature_bits = FEATURE_WRSR_WREN,
10572 .tested = TEST_UNTESTED,
10573 .probe = probe_spi_rdid,
10574 .probe_timing = TIMING_ZERO,
10575 .block_erasers =
10576 {
10577 {
10578 .eraseblocks = { {4 * 1024, 64} },
10579 .block_erase = spi_block_erase_20,
10580 }, {
10581 .eraseblocks = { {4 * 1024, 64} },
10582 .block_erase = spi_block_erase_d7,
10583 }, {
10584 .eraseblocks = { {64 * 1024, 4} },
10585 .block_erase = spi_block_erase_d8,
10586 }, {
10587 .eraseblocks = { {256 * 1024, 1} },
10588 .block_erase = spi_block_erase_60,
10589 }, {
10590 .eraseblocks = { {256 * 1024, 1} },
10591 .block_erase = spi_block_erase_c7,
10592 }
10593 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010594 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010595 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
10596 .write = spi_chip_write_256,
10597 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10598 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
10599 },
10600
10601 {
10602 .vendor = "PMC",
10603 .name = "Pm25LD040(C)",
10604 .bustype = BUS_SPI,
10605 .manufacture_id = PMC_ID,
10606 .model_id = PMC_PM25LV040,
10607 .total_size = 512,
10608 .page_size = 256,
10609 .feature_bits = FEATURE_WRSR_WREN,
10610 .tested = TEST_UNTESTED,
10611 .probe = probe_spi_rdid,
10612 .probe_timing = TIMING_ZERO,
10613 .block_erasers =
10614 {
10615 {
10616 .eraseblocks = { {4 * 1024, 128} },
10617 .block_erase = spi_block_erase_20,
10618 }, {
10619 .eraseblocks = { {4 * 1024, 128} },
10620 .block_erase = spi_block_erase_d7,
10621 }, {
10622 .eraseblocks = { {64 * 1024, 8} },
10623 .block_erase = spi_block_erase_d8,
10624 }, {
10625 .eraseblocks = { {512 * 1024, 1} },
10626 .block_erase = spi_block_erase_60,
10627 }, {
10628 .eraseblocks = { {512 * 1024, 1} },
10629 .block_erase = spi_block_erase_c7,
10630 }
10631 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010632 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010633 .unlock = spi_disable_blockprotect,
10634 .write = spi_chip_write_256,
10635 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10636 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
10637 },
10638
Steven Honeyman81a8fb72015-06-02 22:32:24 +000010639 {
10640 .vendor = "PMC",
10641 .name = "Pm25LQ020",
10642 .bustype = BUS_SPI,
10643 .manufacture_id = PMC_ID,
10644 .model_id = PMC_PM25LQ020,
10645 .total_size = 256,
10646 .page_size = 256,
10647 /* OTP: 256B total; read 0x4B, write 0xB1 */
10648 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10649 .tested = TEST_UNTESTED,
10650 .probe = probe_spi_rdid,
10651 .probe_timing = TIMING_ZERO,
10652 .block_erasers =
10653 {
10654 {
10655 .eraseblocks = { {4 * 1024, 64} },
10656 .block_erase = spi_block_erase_20,
10657 }, {
10658 .eraseblocks = { {4 * 1024, 64} },
10659 .block_erase = spi_block_erase_d7,
10660 }, {
10661 .eraseblocks = { {64 * 1024, 4} },
10662 .block_erase = spi_block_erase_d8,
10663 }, {
10664 .eraseblocks = { {256 * 1024, 1} },
10665 .block_erase = spi_block_erase_60,
10666 }, {
10667 .eraseblocks = { {256 * 1024, 1} },
10668 .block_erase = spi_block_erase_c7,
10669 }
10670 },
10671 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10672 .unlock = spi_disable_blockprotect_bp3_srwd,
10673 .write = spi_chip_write_256,
10674 .read = spi_chip_read,
10675 .voltage = {2300, 3600},
10676 },
10677
10678 {
10679 .vendor = "PMC",
10680 .name = "Pm25LQ040",
10681 .bustype = BUS_SPI,
10682 .manufacture_id = PMC_ID,
10683 .model_id = PMC_PM25LQ040,
10684 .total_size = 512,
10685 .page_size = 256,
10686 /* OTP: 256B total; read 0x4B, write 0xB1 */
10687 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10688 .tested = TEST_UNTESTED,
10689 .probe = probe_spi_rdid,
10690 .probe_timing = TIMING_ZERO,
10691 .block_erasers =
10692 {
10693 {
10694 .eraseblocks = { {4 * 1024, 128} },
10695 .block_erase = spi_block_erase_20,
10696 }, {
10697 .eraseblocks = { {4 * 1024, 128} },
10698 .block_erase = spi_block_erase_d7,
10699 }, {
10700 .eraseblocks = { {64 * 1024, 8} },
10701 .block_erase = spi_block_erase_d8,
10702 }, {
10703 .eraseblocks = { {512 * 1024, 1} },
10704 .block_erase = spi_block_erase_60,
10705 }, {
10706 .eraseblocks = { {512 * 1024, 1} },
10707 .block_erase = spi_block_erase_c7,
10708 }
10709 },
10710 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10711 .unlock = spi_disable_blockprotect_bp3_srwd,
10712 .write = spi_chip_write_256,
10713 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10714 .voltage = {2300, 3600},
10715 },
10716
10717 {
10718 .vendor = "PMC",
10719 .name = "Pm25LQ080",
10720 .bustype = BUS_SPI,
10721 .manufacture_id = PMC_ID,
10722 .model_id = PMC_PM25LQ080,
10723 .total_size = 1024,
10724 .page_size = 256,
10725 /* OTP: 64B total; read 0x4B, write 0xB1 */
10726 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10727 .tested = TEST_UNTESTED,
10728 .probe = probe_spi_rdid,
10729 .probe_timing = TIMING_ZERO,
10730 .block_erasers =
10731 {
10732 {
10733 .eraseblocks = { {4 * 1024, 256} },
10734 .block_erase = spi_block_erase_20,
10735 }, {
10736 .eraseblocks = { {4 * 1024, 256} },
10737 .block_erase = spi_block_erase_d7,
10738 }, {
10739 .eraseblocks = { {64 * 1024, 16} },
10740 .block_erase = spi_block_erase_d8,
10741 }, {
10742 .eraseblocks = { {1024 * 1024, 1} },
10743 .block_erase = spi_block_erase_60,
10744 }, {
10745 .eraseblocks = { {1024 * 1024, 1} },
10746 .block_erase = spi_block_erase_c7,
10747 }
10748 },
10749 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10750 .unlock = spi_disable_blockprotect_bp3_srwd,
10751 .write = spi_chip_write_256,
10752 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10753 .voltage = {2300, 3600},
10754 },
10755
10756 {
10757 .vendor = "PMC",
10758 .name = "Pm25LQ016",
10759 .bustype = BUS_SPI,
10760 .manufacture_id = PMC_ID,
10761 .model_id = PMC_PM25LQ016,
10762 .total_size = 2048,
10763 .page_size = 256,
10764 /* OTP: 256B total; read 0x4B, write 0xB1 */
10765 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10766 .tested = TEST_UNTESTED,
10767 .probe = probe_spi_rdid,
10768 .probe_timing = TIMING_ZERO,
10769 .block_erasers =
10770 {
10771 {
10772 .eraseblocks = { {4 * 1024, 512} },
10773 .block_erase = spi_block_erase_20,
10774 }, {
10775 .eraseblocks = { {4 * 1024, 512} },
10776 .block_erase = spi_block_erase_d7,
10777 }, {
10778 .eraseblocks = { {64 * 1024, 32} },
10779 .block_erase = spi_block_erase_d8,
10780 }, {
10781 .eraseblocks = { {2048 * 1024, 1} },
10782 .block_erase = spi_block_erase_60,
10783 }, {
10784 .eraseblocks = { {2048 * 1024, 1} },
10785 .block_erase = spi_block_erase_c7,
10786 }
10787 },
10788 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10789 .unlock = spi_disable_blockprotect_bp3_srwd,
10790 .write = spi_chip_write_256,
10791 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10792 .voltage = {2300, 3600},
10793 },
10794
10795 {
10796 .vendor = "PMC",
10797 .name = "Pm25LQ032C",
10798 .bustype = BUS_SPI,
10799 .manufacture_id = PMC_ID,
10800 .model_id = PMC_PM25LQ032C,
10801 .total_size = 4096,
10802 .page_size = 256,
10803 /* OTP: 64B total; read 0x4B, write 0xB1 */
10804 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010805 .tested = TEST_OK_PREW,
Steven Honeyman81a8fb72015-06-02 22:32:24 +000010806 .probe = probe_spi_rdid,
10807 .probe_timing = TIMING_ZERO,
10808 .block_erasers =
10809 {
10810 {
10811 .eraseblocks = { {4 * 1024, 1024} },
10812 .block_erase = spi_block_erase_20,
10813 }, {
10814 .eraseblocks = { {4 * 1024, 1024} },
10815 .block_erase = spi_block_erase_d7,
10816 }, {
10817 .eraseblocks = { {64 * 1024, 64} },
10818 .block_erase = spi_block_erase_d8,
10819 }, {
10820 .eraseblocks = { {4096 * 1024, 1} },
10821 .block_erase = spi_block_erase_60,
10822 }, {
10823 .eraseblocks = { {4096 * 1024, 1} },
10824 .block_erase = spi_block_erase_c7,
10825 }
10826 },
10827 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10828 .unlock = spi_disable_blockprotect_bp3_srwd,
10829 .write = spi_chip_write_256,
10830 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10831 .voltage = {2700, 3600},
10832 },
10833
10834 {
Stefan Taunerf4451612013-04-19 01:59:15 +000010835 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010836 .name = "Pm25LV512(A)",
10837 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000010838 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010839 .model_id = PMC_PM25LV512,
10840 .total_size = 64,
10841 .page_size = 256,
10842 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010843 .tested = TEST_OK_PREW,
Stefan Taunerbecda742014-05-30 19:34:00 +000010844 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010845 .probe_timing = TIMING_ZERO,
10846 .block_erasers =
10847 {
10848 {
10849 .eraseblocks = { {4 * 1024, 16} },
10850 .block_erase = spi_block_erase_d7,
10851 }, {
10852 .eraseblocks = { {32 * 1024, 2} },
10853 .block_erase = spi_block_erase_d8,
10854 }, {
10855 .eraseblocks = { {64 * 1024, 1} },
10856 .block_erase = spi_block_erase_c7,
10857 }
10858 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010859 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010860 .unlock = spi_disable_blockprotect,
10861 .write = spi_chip_write_256,
10862 .read = spi_chip_read, /* Fast read (0x0B) supported */
10863 .voltage = {2700, 3600},
10864 },
10865
10866 {
10867 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010868 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010869 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000010870 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010871 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010872 .total_size = 128,
10873 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010874 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000010875 .tested = TEST_OK_PREW,
10876 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010877 .probe_timing = TIMING_ZERO,
10878 .block_erasers =
10879 {
10880 {
10881 .eraseblocks = { {4 * 1024, 32} },
10882 .block_erase = spi_block_erase_d7,
10883 }, {
10884 .eraseblocks = { {32 * 1024, 4} },
10885 .block_erase = spi_block_erase_d8,
10886 }, {
10887 .eraseblocks = { {128 * 1024, 1} },
10888 .block_erase = spi_block_erase_c7,
10889 }
10890 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010891 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010892 .unlock = spi_disable_blockprotect,
10893 .write = spi_chip_write_256,
10894 .read = spi_chip_read, /* Fast read (0x0B) supported */
10895 .voltage = {2700, 3600},
10896 },
10897
10898 {
10899 .vendor = "PMC",
10900 .name = "Pm25LV010A",
10901 .bustype = BUS_SPI,
10902 .manufacture_id = PMC_ID,
10903 .model_id = PMC_PM25LV010,
10904 .total_size = 128,
10905 .page_size = 256,
10906 .feature_bits = FEATURE_WRSR_WREN,
10907 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010908 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010909 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010910 .block_erasers =
10911 {
10912 {
10913 .eraseblocks = { {4 * 1024, 32} },
10914 .block_erase = spi_block_erase_d7,
10915 }, {
10916 .eraseblocks = { {32 * 1024, 4} },
10917 .block_erase = spi_block_erase_d8,
10918 }, {
10919 .eraseblocks = { {128 * 1024, 1} },
10920 .block_erase = spi_block_erase_c7,
10921 }
10922 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010923 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010924 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010925 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010926 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000010927 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010928 },
10929
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010930 {
10931 .vendor = "PMC",
10932 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010933 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010934 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010935 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010936 .total_size = 256,
10937 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010938 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010939 .tested = TEST_UNTESTED,
10940 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010941 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010942 .block_erasers =
10943 {
10944 {
10945 .eraseblocks = { {4 * 1024, 64} },
10946 .block_erase = spi_block_erase_d7,
10947 }, {
10948 .eraseblocks = { {64 * 1024, 4} },
10949 .block_erase = spi_block_erase_d8,
10950 }, {
10951 .eraseblocks = { {256 * 1024, 1} },
10952 .block_erase = spi_block_erase_c7,
10953 }
10954 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010955 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010956 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010957 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010958 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010959 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010960 },
10961
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010962 {
10963 .vendor = "PMC",
10964 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010965 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010966 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010967 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010968 .total_size = 512,
10969 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010970 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000010971 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010972 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010973 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010974 .block_erasers =
10975 {
10976 {
10977 .eraseblocks = { {4 * 1024, 128} },
10978 .block_erase = spi_block_erase_d7,
10979 }, {
10980 .eraseblocks = { {64 * 1024, 8} },
10981 .block_erase = spi_block_erase_d8,
10982 }, {
10983 .eraseblocks = { {512 * 1024, 1} },
10984 .block_erase = spi_block_erase_c7,
10985 }
10986 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010987 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010988 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010989 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010990 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010991 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010992 },
10993
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010994 {
10995 .vendor = "PMC",
10996 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010997 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010998 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010999 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011000 .total_size = 1024,
11001 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011002 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011003 .tested = TEST_UNTESTED,
11004 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011005 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011006 .block_erasers =
11007 {
11008 {
11009 .eraseblocks = { {4 * 1024, 256} },
11010 .block_erase = spi_block_erase_d7,
11011 }, {
11012 .eraseblocks = { {4 * 1024, 256} },
11013 .block_erase = spi_block_erase_20,
11014 }, {
11015 .eraseblocks = { {64 * 1024, 16} },
11016 .block_erase = spi_block_erase_d8,
11017 }, {
11018 .eraseblocks = { {1024 * 1024, 1} },
11019 .block_erase = spi_block_erase_60,
11020 }, {
11021 .eraseblocks = { {1024 * 1024, 1} },
11022 .block_erase = spi_block_erase_c7,
11023 }
11024 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011025 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011026 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011027 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011028 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011029 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011030 },
11031
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011032 {
11033 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011034 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011035 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011036 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011037 .model_id = PMC_PM25LV016B,
11038 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011039 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011040 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011041 .tested = TEST_UNTESTED,
11042 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011043 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011044 .block_erasers =
11045 {
11046 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011047 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +000011048 .block_erase = spi_block_erase_d7,
11049 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011050 .eraseblocks = { {4 * 1024, 512} },
11051 .block_erase = spi_block_erase_20,
11052 }, {
11053 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +000011054 .block_erase = spi_block_erase_d8,
11055 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011056 .eraseblocks = { {2 * 1024 * 1024, 1} },
11057 .block_erase = spi_block_erase_60,
11058 }, {
11059 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011060 .block_erase = spi_block_erase_c7,
11061 }
11062 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011063 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011064 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011065 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011066 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000011067 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011068 },
11069
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011070 {
11071 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011072 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011073 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011074 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011075 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011076 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011077 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011078 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011079 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000011080 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011081 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011082 .block_erasers =
11083 {
11084 {
11085 .eraseblocks = {
11086 {128 * 1024, 1},
11087 {96 * 1024, 1},
11088 {8 * 1024, 2},
11089 {16 * 1024, 1},
11090 },
Sean Nelson35727f72010-01-28 23:55:12 +000011091 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011092 }, {
11093 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011094 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011095 },
11096 },
Sean Nelson35727f72010-01-28 23:55:12 +000011097 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011098 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011099 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011100 },
11101
11102 {
11103 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011104 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011105 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011106 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011107 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011108 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011109 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011110 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011111 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011112 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011113 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011114 .block_erasers =
11115 {
11116 {
11117 .eraseblocks = {
11118 {16 * 1024, 1},
11119 {8 * 1024, 2},
11120 {96 * 1024, 1},
11121 {128 * 1024, 1},
11122 },
Sean Nelson35727f72010-01-28 23:55:12 +000011123 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011124 }, {
11125 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011126 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011127 },
11128 },
Sean Nelson35727f72010-01-28 23:55:12 +000011129 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011130 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011131 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011132 },
11133
11134 {
11135 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011136 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011137 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011138 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011139 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011140 .total_size = 128,
11141 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011142 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011143 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011144 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011145 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000011146 .block_erasers =
11147 {
11148 {
11149 .eraseblocks = { {4 * 1024, 32} },
11150 .block_erase = erase_sector_jedec,
11151 }, {
11152 .eraseblocks = { {64 * 1024, 2} },
11153 .block_erase = erase_block_jedec,
11154 }, {
11155 .eraseblocks = { {128 * 1024, 1} },
11156 .block_erase = erase_chip_block_jedec,
11157 }
11158 },
Sean Nelson35727f72010-01-28 23:55:12 +000011159 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011160 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011161 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011162 },
11163
11164 {
11165 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011166 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011167 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011168 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011169 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011170 .total_size = 256,
11171 .page_size = 4096,
11172 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11173 .tested = TEST_UNTESTED,
11174 .probe = probe_jedec,
11175 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11176 .block_erasers =
11177 {
11178 {
11179 .eraseblocks = { {4 * 1024, 64} },
11180 .block_erase = erase_sector_jedec,
11181 }, {
11182 .eraseblocks = { {64 * 1024, 4} },
11183 .block_erase = erase_block_jedec,
11184 }, {
11185 .eraseblocks = { {256 * 1024, 1} },
11186 .block_erase = erase_chip_block_jedec,
11187 }
11188 },
11189 .write = write_jedec_1,
11190 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011191 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011192 },
11193
11194 {
11195 .vendor = "PMC",
11196 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011197 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011198 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011199 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011200 .total_size = 512,
11201 .page_size = 4096,
11202 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011203 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011204 .probe = probe_jedec,
11205 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11206 .block_erasers =
11207 {
11208 {
11209 .eraseblocks = { {4 * 1024, 128} },
11210 .block_erase = erase_sector_jedec,
11211 }, {
11212 .eraseblocks = { {64 * 1024, 8} },
11213 .block_erase = erase_block_jedec,
11214 }, {
11215 .eraseblocks = { {512 * 1024, 1} },
11216 .block_erase = erase_chip_block_jedec,
11217 }
11218 },
11219 .write = write_jedec_1,
11220 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011221 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011222 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000011223
11224 {
11225 .vendor = "PMC",
11226 .name = "Pm39LV512",
11227 .bustype = BUS_PARALLEL,
11228 .manufacture_id = PMC_ID_NOPREFIX,
11229 .model_id = PMC_PM39LV512,
11230 .total_size = 64,
11231 .page_size = 4096,
11232 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11233 .tested = TEST_OK_PREW,
11234 .probe = probe_jedec,
11235 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11236 .block_erasers =
11237 {
11238 {
11239 .eraseblocks = { {4 * 1024, 16} },
11240 .block_erase = erase_sector_jedec,
11241 }, {
11242 .eraseblocks = { {64 * 1024, 1} },
11243 .block_erase = erase_block_jedec,
11244 }, {
11245 .eraseblocks = { {64 * 1024, 1} },
11246 .block_erase = erase_chip_block_jedec,
11247 }
11248 },
11249 .write = write_jedec_1,
11250 .read = read_memmapped,
11251 .voltage = {2700, 3600},
11252 },
11253
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011254 {
11255 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011256 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011257 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011258 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011259 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011260 .total_size = 256,
11261 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011262 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011263 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011264 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011265 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000011266 .block_erasers =
11267 {
11268 {
11269 .eraseblocks = { {4 * 1024, 64} },
11270 .block_erase = erase_sector_jedec,
11271 }, {
11272 .eraseblocks = { {16 * 1024, 16} },
11273 .block_erase = erase_block_jedec,
11274 }, {
11275 .eraseblocks = { {256 * 1024, 1} },
11276 .block_erase = erase_chip_block_jedec,
11277 }
11278 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011279 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000011280 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011281 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011282 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011283 },
11284
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011285 {
11286 .vendor = "PMC",
11287 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011288 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011289 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011290 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011291 .total_size = 512,
11292 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011293 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011294 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011295 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011296 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011297 .block_erasers =
11298 {
11299 {
11300 .eraseblocks = { {4 * 1024, 128} },
11301 .block_erase = erase_sector_jedec,
11302 }, {
11303 .eraseblocks = { {64 * 1024, 8} },
11304 .block_erase = erase_block_jedec,
11305 }, {
11306 .eraseblocks = { {512 * 1024, 1} },
11307 .block_erase = erase_chip_block_jedec,
11308 }
11309 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011310 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000011311 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011312 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011313 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011314 },
11315
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011316 {
Sean Nelsond70b09c2009-11-24 02:11:08 +000011317 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +000011318 .name = "LE25FW106",
11319 .bustype = BUS_SPI,
11320 .manufacture_id = SANYO_ID,
11321 .model_id = SANYO_LE25FW106,
11322 .total_size = 128,
11323 .page_size = 256,
11324 .feature_bits = FEATURE_WRSR_WREN,
11325 .tested = TEST_OK_PREW,
11326 .probe = probe_spi_res2,
11327 .probe_timing = TIMING_ZERO,
11328 .block_erasers = {
11329 {
11330 .eraseblocks = { {2 * 1024, 64} },
11331 .block_erase = spi_block_erase_d7,
11332 }, {
11333 .eraseblocks = { {32 * 1024, 4} },
11334 .block_erase = spi_block_erase_d8,
11335 }, {
11336 .eraseblocks = { {128 * 1024, 1} },
11337 .block_erase = spi_block_erase_c7,
11338 }
11339 },
11340 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
11341 .unlock = spi_disable_blockprotect_bp1_srwd,
11342 .write = spi_chip_write_256,
11343 .read = spi_chip_read,
11344 .voltage = {2700, 3600},
11345 },
11346
11347 {
11348 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +000011349 .name = "LE25FW406A",
11350 .bustype = BUS_SPI,
11351 .manufacture_id = SANYO_ID,
11352 .model_id = SANYO_LE25FW406A,
11353 .total_size = 512,
11354 .page_size = 256,
11355 .feature_bits = FEATURE_WRSR_WREN,
11356 .tested = TEST_OK_PREW,
11357 .probe = probe_spi_res2,
11358 .probe_timing = TIMING_ZERO,
11359 .block_erasers = {
11360 {
11361 .eraseblocks = { {4 * 1024, 128} },
11362 .block_erase = spi_block_erase_d7,
11363 }, {
11364 .eraseblocks = { {64 * 1024, 8} },
11365 .block_erase = spi_block_erase_d8,
11366 }, {
11367 .eraseblocks = { {512 * 1024, 1} },
11368 .block_erase = spi_block_erase_c7,
11369 }
11370 },
11371 .printlock = spi_prettyprint_status_register_plain,
11372 .unlock = spi_disable_blockprotect,
11373 .write = spi_chip_write_256,
11374 .read = spi_chip_read,
11375 .voltage = {2700, 3600},
11376 },
11377
11378 {
11379 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +000011380 .name = "LE25FU406B",
11381 .bustype = BUS_SPI,
11382 .manufacture_id = SANYO_ID,
11383 .model_id = SANYO_LE25FU406B,
11384 .total_size = 512,
11385 .page_size = 256,
11386 .feature_bits = FEATURE_WRSR_WREN,
11387 .tested = TEST_OK_PREW,
11388 .probe = probe_spi_res2,
11389 .probe_timing = TIMING_ZERO,
11390 .block_erasers = {
11391 {
11392 .eraseblocks = { {4 * 1024, 128} },
11393 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011394 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000011395 .eraseblocks = { {64 * 1024, 8} },
11396 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011397 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000011398 .eraseblocks = { {512 * 1024, 1} },
11399 .block_erase = spi_block_erase_c7,
11400 }
11401 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011402 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +000011403 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11404 .write = spi_chip_write_256,
11405 .read = spi_chip_read,
11406 .voltage = {2300, 3600},
11407 },
11408
11409 {
11410 .vendor = "Sanyo",
Stefan Tauner2f055df2015-12-25 22:13:15 +000011411 .name = "LE25FU406C/LE25U40CMC",
11412 .bustype = BUS_SPI,
11413 .manufacture_id = SANYO_ID,
11414 .model_id = SANYO_LE25FU406C,
11415 .total_size = 512,
11416 .page_size = 256,
11417 .feature_bits = FEATURE_WRSR_WREN,
11418 .tested = TEST_OK_PR,
11419 .probe = probe_spi_rdid,
11420 .probe_timing = TIMING_ZERO,
11421 .block_erasers = {
11422 {
11423 .eraseblocks = { {4 * 1024, 128} },
11424 .block_erase = spi_block_erase_20,
11425 }, {
11426 .eraseblocks = { {4 * 1024, 128} },
11427 .block_erase = spi_block_erase_d7,
11428 }, {
11429 .eraseblocks = { {64 * 1024, 8} },
11430 .block_erase = spi_block_erase_d8,
11431 }, {
11432 .eraseblocks = { {512 * 1024, 1} },
11433 .block_erase = spi_block_erase_60,
11434 }, {
11435 .eraseblocks = { {512 * 1024, 1} },
11436 .block_erase = spi_block_erase_c7,
11437 }
11438 },
11439 .printlock = spi_prettyprint_status_register_bp2_srwd,
11440 .unlock = spi_disable_blockprotect_bp2_srwd,
11441 .write = spi_chip_write_256,
11442 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
11443 .voltage = {2300, 3600},
11444 },
11445
11446 {
11447 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011448 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011449 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +000011450 .manufacture_id = SANYO_ID,
11451 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011452 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +000011453 .page_size = 256,
11454 .tested = TEST_UNTESTED,
11455 .probe = probe_spi_rdid,
11456 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011457 .block_erasers =
11458 {
11459 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011460 .eraseblocks = { {256, 1024} },
11461 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011462 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011463 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +000011464 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011465 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011466 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011467 .block_erase = spi_block_erase_c7,
11468 }
11469 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011470 .printlock = spi_prettyprint_status_register_default_welwip,
11471 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +000011472 .write = spi_chip_write_256,
11473 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011474 .voltage = {2700, 3600},
11475 },
11476
11477 {
11478 .vendor = "Sanyo",
11479 .name = "LE25FW403A",
11480 .bustype = BUS_SPI,
11481 .manufacture_id = SANYO_ID,
11482 .model_id = SANYO_LE25FW403A,
11483 .total_size = 512,
11484 .page_size = 256,
11485 .tested = TEST_UNTESTED,
11486 .probe = probe_spi_rdid,
11487 .probe_timing = TIMING_ZERO,
11488 .block_erasers = {
11489 {
11490 .eraseblocks = { {256, 2 * 1024} },
11491 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011492 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011493 .eraseblocks = { {64 * 1024, 8} },
11494 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011495 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011496 .eraseblocks = { {512 * 1024, 1} },
11497 .block_erase = spi_block_erase_c7,
11498 }
11499 },
11500 .printlock = spi_prettyprint_status_register_default_welwip,
11501 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11502 .write = spi_chip_write_256,
11503 .read = spi_chip_read,
11504 .voltage = {2700, 3600},
11505 },
11506
11507 {
11508 .vendor = "Sanyo",
11509 .name = "LE25FW418A",
11510 .bustype = BUS_SPI,
11511 .manufacture_id = SANYO_ID,
11512 .model_id = SANYO_LE25FW418A,
11513 .total_size = 512,
11514 .page_size = 256,
11515 .feature_bits = FEATURE_WRSR_WREN,
11516 .tested = TEST_UNTESTED,
11517 .probe = probe_spi_res2,
11518 .probe_timing = TIMING_ZERO,
11519 .block_erasers = {
11520 {
11521 .eraseblocks = { {4 * 1024, 128} },
11522 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011523 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011524 .eraseblocks = { {64 * 1024, 8} },
11525 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011526 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011527 .eraseblocks = { {512 * 1024, 1} },
11528 .block_erase = spi_block_erase_c7,
11529 }
11530 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011531 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011532 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11533 .write = spi_chip_write_256,
11534 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
11535 .voltage = {2700, 3600},
11536 },
11537
11538 {
11539 .vendor = "Sanyo",
11540 .name = "LE25FW806",
11541 .bustype = BUS_SPI,
11542 .manufacture_id = SANYO_ID,
11543 .model_id = SANYO_LE25FW806,
11544 .total_size = 1024,
11545 .page_size = 256,
11546 .feature_bits = FEATURE_WRSR_WREN,
11547 .tested = TEST_UNTESTED,
11548 .probe = probe_spi_res2,
11549 .probe_timing = TIMING_ZERO,
11550 .block_erasers = {
11551 {
11552 .eraseblocks = { {4 * 1024, 256} },
11553 .block_erase = spi_block_erase_20,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011554 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011555 .eraseblocks = { {4 * 1024, 256} },
11556 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011557 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011558 .eraseblocks = { {64 * 1024, 16} },
11559 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011560 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011561 .eraseblocks = { {1024 * 1024, 1} },
11562 .block_erase = spi_block_erase_c7,
11563 }
11564 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011565 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011566 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11567 .write = spi_chip_write_256,
11568 .read = spi_chip_read,
11569 .voltage = {2700, 3600},
11570 },
11571
11572 {
11573 .vendor = "Sanyo",
11574 .name = "LE25FW808",
11575 .bustype = BUS_SPI,
11576 .manufacture_id = SANYO_ID,
11577 .model_id = SANYO_LE25FW808,
11578 .total_size = 1024,
11579 .page_size = 256,
11580 .feature_bits = FEATURE_WRSR_WREN,
11581 .tested = TEST_UNTESTED,
11582 .probe = probe_spi_res2,
11583 .probe_timing = TIMING_ZERO,
11584 .block_erasers = {
11585 {
11586 .eraseblocks = { {8 * 1024, 128} },
11587 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011588 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011589 .eraseblocks = { {64 * 1024, 16} },
11590 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011591 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011592 .eraseblocks = { {1024 * 1024, 1} },
11593 .block_erase = spi_block_erase_c7,
11594 }
11595 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011596 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011597 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11598 .write = spi_chip_write_256,
11599 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
11600 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000011601 },
11602
11603 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011604 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000011605 .name = "LH28F008BJT-BTLZ1",
11606 .bustype = BUS_PARALLEL,
11607 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000011608 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000011609 .total_size = 1024,
11610 .page_size = 64 * 1024,
11611 .tested = TEST_OK_PREW,
11612 .probe = probe_82802ab,
11613 .probe_timing = TIMING_ZERO,
11614 .block_erasers =
11615 {
11616 {
11617 .eraseblocks = {
11618 {8 * 1024, 8},
11619 {64 * 1024, 15}
11620 },
11621 .block_erase = erase_block_82802ab,
11622 }, {
11623 .eraseblocks = { {1024 * 1024, 1} },
11624 .block_erase = erase_sector_49lfxxxc,
11625 }
11626 },
11627 .unlock = unlock_lh28f008bjt,
11628 .write = write_82802ab,
11629 .read = read_memmapped,
11630 .voltage = {2700, 3600},
11631 },
11632
11633 {
11634 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011635 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011636 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011637 .manufacture_id = SHARP_ID,
11638 .model_id = SHARP_LHF00L04,
11639 .total_size = 1024,
11640 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011641 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011642 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011643 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011644 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011645 .block_erasers =
11646 {
11647 {
11648 .eraseblocks = {
11649 {64 * 1024, 15},
11650 {8 * 1024, 8}
11651 },
Sean Nelson28accc22010-03-19 18:47:06 +000011652 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011653 }, {
11654 .eraseblocks = {
11655 {1024 * 1024, 1}
11656 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000011657 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011658 },
11659 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011660 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000011661 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011662 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011663 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011664 },
11665
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011666 {
11667 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000011668 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011669 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011670 .manufacture_id = SPANSION_ID,
11671 .model_id = SPANSION_S25FL004A,
11672 .total_size = 512,
11673 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011674 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000011675 .tested = TEST_UNTESTED,
11676 .probe = probe_spi_rdid,
11677 .probe_timing = TIMING_ZERO,
11678 .block_erasers =
11679 {
11680 {
11681 .eraseblocks = { {64 * 1024, 8} },
11682 .block_erase = spi_block_erase_d8,
11683 }, {
11684 .eraseblocks = { {512 * 1024, 1} },
11685 .block_erase = spi_block_erase_c7,
11686 }
11687 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011688 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011689 .unlock = spi_disable_blockprotect,
11690 .write = spi_chip_write_256,
11691 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011692 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011693 },
11694
11695 {
11696 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000011697 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011698 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000011699 .manufacture_id = SPANSION_ID,
11700 .model_id = SPANSION_S25FL008A,
11701 .total_size = 1024,
11702 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011703 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011704 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000011705 .probe = probe_spi_rdid,
11706 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000011707 .block_erasers =
11708 {
11709 {
11710 .eraseblocks = { {64 * 1024, 16} },
11711 .block_erase = spi_block_erase_d8,
11712 }, {
11713 .eraseblocks = { {1024 * 1024, 1} },
11714 .block_erase = spi_block_erase_c7,
11715 }
11716 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011717 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011718 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000011719 .write = spi_chip_write_256,
11720 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011721 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000011722 },
11723
11724 {
11725 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011726 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011727 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011728 .manufacture_id = SPANSION_ID,
11729 .model_id = SPANSION_S25FL016A,
11730 .total_size = 2048,
11731 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011732 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011733 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011734 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011735 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011736 .block_erasers =
11737 {
11738 {
11739 .eraseblocks = { {64 * 1024, 32} },
11740 .block_erase = spi_block_erase_d8,
11741 }, {
11742 .eraseblocks = { {2 * 1024 * 1024, 1} },
11743 .block_erase = spi_block_erase_c7,
11744 }
11745 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011746 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011747 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011748 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011749 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011750 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011751 },
11752
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011753 {
Rudy Hostf4e57772010-11-29 00:37:49 +000011754 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000011755 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011756 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011757 .manufacture_id = SPANSION_ID,
11758 .model_id = SPANSION_S25FL032A,
11759 .total_size = 4096,
11760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011761 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011762 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000011763 .probe = probe_spi_rdid,
11764 .probe_timing = TIMING_ZERO,
11765 .block_erasers =
11766 {
11767 {
11768 .eraseblocks = { {64 * 1024, 64} },
11769 .block_erase = spi_block_erase_d8,
11770 }, {
11771 .eraseblocks = { {4 * 1024 * 1024, 1} },
11772 .block_erase = spi_block_erase_c7,
11773 }
11774 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011775 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011776 .unlock = spi_disable_blockprotect,
11777 .write = spi_chip_write_256,
11778 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011779 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011780 },
11781
11782 {
11783 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000011784 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011785 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011786 .manufacture_id = SPANSION_ID,
11787 .model_id = SPANSION_S25FL064A,
11788 .total_size = 8192,
11789 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011790 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000011791 .tested = TEST_OK_PREW,
11792 .probe = probe_spi_rdid,
11793 .probe_timing = TIMING_ZERO,
11794 .block_erasers =
11795 {
11796 {
11797 .eraseblocks = { {64 * 1024, 128} },
11798 .block_erase = spi_block_erase_d8,
11799 }, {
11800 .eraseblocks = { {8 * 1024 * 1024, 1} },
11801 .block_erase = spi_block_erase_c7,
11802 }
11803 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011804 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011805 .unlock = spi_disable_blockprotect,
11806 .write = spi_chip_write_256,
11807 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011808 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011809 },
11810
11811 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011812 .vendor = "Spansion",
11813 .name = "S25FL204K",
11814 .bustype = BUS_SPI,
11815 .manufacture_id = SPANSION_ID,
11816 .model_id = SPANSION_S25FL204,
11817 .total_size = 512,
11818 .page_size = 256,
11819 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011820 .tested = TEST_OK_PR,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011821 .probe = probe_spi_rdid,
11822 .probe_timing = TIMING_ZERO,
11823 .block_erasers = {
11824 {
11825 .eraseblocks = { {4 * 1024, 128} },
11826 .block_erase = spi_block_erase_20,
11827 }, {
11828 .eraseblocks = { {64 * 1024, 8} },
11829 .block_erase = spi_block_erase_d8,
11830 }, {
11831 .eraseblocks = { { 512 * 1024, 1} },
11832 .block_erase = spi_block_erase_60,
11833 }, {
11834 .eraseblocks = { { 512 * 1024, 1} },
11835 .block_erase = spi_block_erase_c7,
11836 }
11837 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011838 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011839 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011840 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011841 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011842 .voltage = {2700, 3600},
11843 },
11844
11845 {
11846 .vendor = "Spansion",
11847 .name = "S25FL208K",
11848 .bustype = BUS_SPI,
11849 .manufacture_id = SPANSION_ID,
11850 .model_id = SPANSION_S25FL208,
11851 .total_size = 1024,
11852 .page_size = 256,
11853 .feature_bits = FEATURE_WRSR_WREN,
11854 .tested = TEST_UNTESTED,
11855 .probe = probe_spi_rdid,
11856 .probe_timing = TIMING_ZERO,
11857 .block_erasers = {
11858 {
11859 .eraseblocks = { {4 * 1024, 256} },
11860 .block_erase = spi_block_erase_20,
11861 }, {
11862 .eraseblocks = { {64 * 1024, 16} },
11863 .block_erase = spi_block_erase_d8,
11864 }, {
11865 .eraseblocks = { { 1024 * 1024, 1} },
11866 .block_erase = spi_block_erase_60,
11867 }, {
11868 .eraseblocks = { { 1024 * 1024, 1} },
11869 .block_erase = spi_block_erase_c7,
11870 }
11871 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011872 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011873 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011874 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011875 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011876 .voltage = {2700, 3600},
11877 },
11878
11879 {
11880 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000011881 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011882 .bustype = BUS_SPI,
11883 .manufacture_id = SPANSION_ID,
11884 .model_id = SPANSION_S25FL216,
11885 .total_size = 2048,
11886 .page_size = 256,
11887 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
11888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11889 .tested = TEST_UNTESTED,
11890 .probe = probe_spi_rdid,
11891 .probe_timing = TIMING_ZERO,
11892 .block_erasers = {
11893 {
11894 .eraseblocks = { {4 * 1024, 512} },
11895 .block_erase = spi_block_erase_20,
11896 }, {
11897 .eraseblocks = { {64 * 1024, 32} },
11898 .block_erase = spi_block_erase_d8,
11899 }, {
11900 .eraseblocks = { { 2048 * 1024, 1} },
11901 .block_erase = spi_block_erase_60,
11902 }, {
11903 .eraseblocks = { { 2048 * 1024, 1} },
11904 .block_erase = spi_block_erase_c7,
11905 }
11906 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011907 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011908 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011909 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011910 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011911 .voltage = {2700, 3600},
11912 },
11913
11914 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000011915 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000011916 .name = "S25FL132K",
11917 .bustype = BUS_SPI,
11918 .manufacture_id = SPANSION_ID,
11919 .model_id = SPANSION_S25FL132K,
11920 .total_size = 4096,
11921 .page_size = 256,
11922 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
11923 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11924 .tested = TEST_UNTESTED,
11925 .probe = probe_spi_rdid,
11926 .probe_timing = TIMING_ZERO,
11927 .block_erasers = {
11928 {
11929 .eraseblocks = { {4 * 1024, 1024} },
11930 .block_erase = spi_block_erase_20,
11931 }, {
11932 .eraseblocks = { {64 * 1024, 64} },
11933 .block_erase = spi_block_erase_d8,
11934 }, {
11935 .eraseblocks = { { 4096 * 1024, 1} },
11936 .block_erase = spi_block_erase_60,
11937 }, {
11938 .eraseblocks = { { 4096 * 1024, 1} },
11939 .block_erase = spi_block_erase_c7,
11940 }
11941 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011942 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000011943 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
11944 .write = spi_chip_write_256,
11945 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11946 .voltage = {2700, 3600},
11947 },
11948
11949 {
11950 .vendor = "Spansion",
11951 .name = "S25FL164K",
11952 .bustype = BUS_SPI,
11953 .manufacture_id = SPANSION_ID,
11954 .model_id = SPANSION_S25FL164K,
11955 .total_size = 8192,
11956 .page_size = 256,
11957 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
11958 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11959 .tested = TEST_OK_PREW,
11960 .probe = probe_spi_rdid,
11961 .probe_timing = TIMING_ZERO,
11962 .block_erasers = {
11963 {
11964 .eraseblocks = { {4 * 1024, 2048} },
11965 .block_erase = spi_block_erase_20,
11966 }, {
11967 .eraseblocks = { {64 * 1024, 128} },
11968 .block_erase = spi_block_erase_d8,
11969 }, {
11970 .eraseblocks = { { 8192 * 1024, 1} },
11971 .block_erase = spi_block_erase_60,
11972 }, {
11973 .eraseblocks = { { 8192 * 1024, 1} },
11974 .block_erase = spi_block_erase_c7,
11975 }
11976 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011977 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000011978 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
11979 .write = spi_chip_write_256,
11980 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11981 .voltage = {2700, 3600},
11982 },
11983
11984 {
11985 .vendor = "Spansion",
Jernej Å krabece814a9b2014-12-12 00:32:03 +000011986 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
11987 .bustype = BUS_SPI,
11988 .manufacture_id = SPANSION_ID,
11989 .model_id = SPANSION_S25FL128,
11990 .total_size = 16384,
11991 .page_size = 256,
11992 /* supports 4B addressing */
11993 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
11994 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11995 .tested = TEST_OK_PREW,
11996 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
11997 .probe = probe_spi_rdid,
11998 .probe_timing = TIMING_ZERO,
11999 .block_erasers = {
12000 {
12001 /* This chip supports erasing of 32 so-called "parameter sectors" with
12002 * opcode 0x20 which may be configured to be on top or bottom of the address
12003 * space. Trying to access an address outside these 4kB blocks does have no
12004 * effect on the memory contents, e.g.
12005 .eraseblocks = {
12006 {4 * 1024, 32},
12007 {64 * 1024, 254} // inaccessible
12008 },
12009 .block_erase = spi_block_erase_20,
12010 }, { */
12011 .eraseblocks = { { 64 * 1024, 256} },
12012 .block_erase = spi_block_erase_d8,
12013 }, {
12014 .eraseblocks = { { 16384 * 1024, 1} },
12015 .block_erase = spi_block_erase_60,
12016 }, {
12017 .eraseblocks = { { 16384 * 1024, 1} },
12018 .block_erase = spi_block_erase_c7,
12019 }
12020 },
12021 .printlock = spi_prettyprint_status_register_bp2_srwd,
12022 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12023 .write = spi_chip_write_256, /* Multi I/O supported */
12024 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12025 .voltage = {2700, 3600},
12026 },
12027
12028 {
12029 .vendor = "Spansion",
12030 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
12031 .bustype = BUS_SPI,
12032 .manufacture_id = SPANSION_ID,
12033 .model_id = SPANSION_S25FL128,
12034 .total_size = 16384,
12035 .page_size = 512,
12036 /* supports 4B addressing */
12037 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12038 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12039 .tested = TEST_UNTESTED,
12040 .probe = probe_spi_rdid,
12041 .probe_timing = TIMING_ZERO,
12042 .block_erasers = {
12043 {
12044 .eraseblocks = { {256 * 1024, 64} },
12045 .block_erase = spi_block_erase_d8,
12046 }, {
12047 .eraseblocks = { { 16384 * 1024, 1} },
12048 .block_erase = spi_block_erase_60,
12049 }, {
12050 .eraseblocks = { { 16384 * 1024, 1} },
12051 .block_erase = spi_block_erase_c7,
12052 }
12053 },
12054 .printlock = spi_prettyprint_status_register_bp2_srwd,
12055 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12056 .write = spi_chip_write_256, /* Multi I/O supported */
12057 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12058 .voltage = {2700, 3600},
12059 },
12060
12061 {
12062 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000012063 .name = "S25FL128P......0", /* uniform 64 kB sectors */
12064 .bustype = BUS_SPI,
12065 .manufacture_id = SPANSION_ID,
12066 .model_id = SPANSION_S25FL128,
12067 .total_size = 16384,
12068 .page_size = 256,
12069 .feature_bits = FEATURE_WRSR_WREN,
12070 .tested = TEST_UNTESTED,
12071 .probe = probe_spi_rdid,
12072 .probe_timing = TIMING_ZERO,
12073 .block_erasers = {
12074 {
12075 .eraseblocks = { {64 * 1024, 256} },
12076 .block_erase = spi_block_erase_20,
12077 }, {
12078 .eraseblocks = { {64 * 1024, 256} },
12079 .block_erase = spi_block_erase_d8,
12080 }, {
12081 .eraseblocks = { { 16384 * 1024, 1} },
12082 .block_erase = spi_block_erase_60,
12083 }, {
12084 .eraseblocks = { { 16384 * 1024, 1} },
12085 .block_erase = spi_block_erase_c7,
12086 }
12087 },
12088 .printlock = spi_prettyprint_status_register_bp3_srwd,
12089 .unlock = spi_disable_blockprotect_bp3_srwd,
12090 .write = spi_chip_write_256,
12091 .read = spi_chip_read, /* Fast read (0x0B) supported */
12092 .voltage = {2700, 3600},
12093 },
12094
12095 {
12096 .vendor = "Spansion",
12097 .name = "S25FL128P......1", /* uniform 256kB sectors */
12098 .bustype = BUS_SPI,
12099 .manufacture_id = SPANSION_ID,
12100 .model_id = SPANSION_S25FL128,
12101 .total_size = 16384,
12102 .page_size = 256,
12103 .feature_bits = FEATURE_WRSR_WREN,
12104 .tested = TEST_UNTESTED,
12105 .probe = probe_spi_rdid,
12106 .probe_timing = TIMING_ZERO,
12107 .block_erasers = {
12108 {
12109 .eraseblocks = { {256 * 1024, 64} },
12110 .block_erase = spi_block_erase_d8,
12111 }, {
12112 .eraseblocks = { { 16384 * 1024, 1} },
12113 .block_erase = spi_block_erase_c7,
12114 }
12115 },
12116 .printlock = spi_prettyprint_status_register_bp2_srwd,
12117 .unlock = spi_disable_blockprotect_bp2_srwd,
12118 .write = spi_chip_write_256,
12119 .read = spi_chip_read, /* Fast read (0x0B) supported */
12120 .voltage = {2700, 3600},
12121 },
12122
12123 {
12124 .vendor = "Spansion",
12125 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012126 .bustype = BUS_SPI,
12127 .manufacture_id = SPANSION_ID,
12128 .model_id = SPANSION_S25FL128,
12129 .total_size = 16384,
12130 .page_size = 256,
12131 /* supports 4B addressing */
12132 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12133 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012134 .tested = TEST_OK_PREW,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012135 .probe = probe_spi_rdid,
12136 .probe_timing = TIMING_ZERO,
12137 .block_erasers = {
12138 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012139 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12140 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12141 * have no effect on the memory contents, but sets a flag in the SR.
12142 .eraseblocks = {
12143 {4 * 1024, 32},
12144 {64 * 1024, 254} // inaccessible
12145 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012146 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000012147 }, { */
12148 .eraseblocks = { { 64 * 1024, 256} },
12149 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012150 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000012151 .eraseblocks = { { 16384 * 1024, 1} },
12152 .block_erase = spi_block_erase_60,
12153 }, {
12154 .eraseblocks = { { 16384 * 1024, 1} },
12155 .block_erase = spi_block_erase_c7,
12156 }
12157 },
12158 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12159 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12160 .write = spi_chip_write_256, /* Multi I/O supported */
12161 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12162 .voltage = {2700, 3600},
12163 },
12164
12165 {
12166 .vendor = "Spansion",
12167 .name = "S25FL128S......1", /* uniform 256 kB sectors */
12168 .bustype = BUS_SPI,
12169 .manufacture_id = SPANSION_ID,
12170 .model_id = SPANSION_S25FL128,
12171 .total_size = 16384,
12172 .page_size = 512,
12173 /* supports 4B addressing */
12174 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12176 .tested = TEST_UNTESTED,
12177 .probe = probe_spi_rdid,
12178 .probe_timing = TIMING_ZERO,
12179 .block_erasers = {
12180 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012181 .eraseblocks = { {256 * 1024, 64} },
12182 .block_erase = spi_block_erase_d8,
12183 }, {
12184 .eraseblocks = { { 16384 * 1024, 1} },
12185 .block_erase = spi_block_erase_60,
12186 }, {
12187 .eraseblocks = { { 16384 * 1024, 1} },
12188 .block_erase = spi_block_erase_c7,
12189 }
12190 },
12191 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12192 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12193 .write = spi_chip_write_256, /* Multi I/O supported */
12194 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12195 .voltage = {2700, 3600},
12196 },
12197
12198 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012199 .vendor = "Spansion",
12200 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12201 .bustype = BUS_SPI,
12202 .manufacture_id = SPANSION_ID,
12203 .model_id = SPANSION_S25FL128,
12204 .total_size = 16384,
12205 .page_size = 256,
12206 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12207 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12208 .tested = TEST_OK_PREW,
12209 .probe = probe_spi_rdid,
12210 .probe_timing = TIMING_ZERO,
12211 .block_erasers = {
12212 {
12213 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
12214 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
12215 * effect on the memory contents, but sets a flag in the SR.
12216 .eraseblocks = {
12217 {4 * 1024, 32},
12218 {64 * 1024, 254} // inaccessible
12219 },
12220 .block_erase = spi_block_erase_20,
12221 }, { */
12222 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
12223 .eraseblocks = {
12224 {8 * 1024, 16},
12225 {64 * 1024, 254} // inaccessible
12226 },
12227 .block_erase = spi_block_erase_40,
12228 }, { */
12229 .eraseblocks = { { 64 * 1024, 256} },
12230 .block_erase = spi_block_erase_d8,
12231 }, {
12232 .eraseblocks = { { 16384 * 1024, 1} },
12233 .block_erase = spi_block_erase_60,
12234 }, {
12235 .eraseblocks = { { 16384 * 1024, 1} },
12236 .block_erase = spi_block_erase_c7,
12237 }
12238 },
12239 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12240 .unlock = spi_disable_blockprotect_bp2_srwd,
12241 .write = spi_chip_write_256, /* Multi I/O supported */
12242 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12243 .voltage = {2700, 3600},
12244 },
12245
12246 {
12247 .vendor = "Spansion",
12248 .name = "S25FL129P......1", /* uniform 256 kB sectors */
12249 .bustype = BUS_SPI,
12250 .manufacture_id = SPANSION_ID,
12251 .model_id = SPANSION_S25FL128,
12252 .total_size = 16384,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012253 .page_size = 256,
Stefan Tauner88b19252014-08-06 14:36:27 +000012254 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12256 .tested = TEST_UNTESTED,
12257 .probe = probe_spi_rdid,
12258 .probe_timing = TIMING_ZERO,
12259 .block_erasers = {
12260 {
12261 .eraseblocks = { {256 * 1024, 64} },
12262 .block_erase = spi_block_erase_d8,
12263 }, {
12264 .eraseblocks = { { 16384 * 1024, 1} },
12265 .block_erase = spi_block_erase_60,
12266 }, {
12267 .eraseblocks = { { 16384 * 1024, 1} },
12268 .block_erase = spi_block_erase_c7,
12269 }
12270 },
12271 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12272 .unlock = spi_disable_blockprotect_bp2_srwd,
12273 .write = spi_chip_write_256, /* Multi I/O supported */
12274 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12275 .voltage = {2700, 3600},
12276 },
12277
12278 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012279 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000012280 .name = "SST25LF020A",
12281 .bustype = BUS_SPI,
12282 .manufacture_id = SST_ID,
12283 .model_id = SST_SST25VF020_REMS,
12284 .total_size = 256,
12285 .page_size = 256,
12286 .feature_bits = FEATURE_WRSR_EWSR,
12287 .tested = TEST_OK_PREW,
12288 .probe = probe_spi_rems,
12289 .probe_timing = TIMING_ZERO,
12290 .block_erasers =
12291 {
12292 {
12293 .eraseblocks = { {4 * 1024, 64} },
12294 .block_erase = spi_block_erase_20,
12295 }, {
12296 .eraseblocks = { {32 * 1024, 8} },
12297 .block_erase = spi_block_erase_52,
12298 }, {
12299 .eraseblocks = { {256 * 1024, 1} },
12300 .block_erase = spi_block_erase_60,
12301 },
12302 },
12303 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12304 .unlock = spi_disable_blockprotect,
12305 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12306 .read = spi_chip_read, /* Fast read (0x0B) supported */
12307 .voltage = {2700, 3600},
12308 },
12309
12310 {
12311 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000012312 .name = "SST25LF040A",
12313 .bustype = BUS_SPI,
12314 .manufacture_id = SST_ID,
12315 .model_id = SST_SST25VF040_REMS,
12316 .total_size = 512,
12317 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012318 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000012319 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000012320 .probe = probe_spi_res2,
12321 .probe_timing = TIMING_ZERO,
12322 .block_erasers =
12323 {
12324 {
12325 .eraseblocks = { {4 * 1024, 128} },
12326 .block_erase = spi_block_erase_20,
12327 }, {
12328 .eraseblocks = { {32 * 1024, 16} },
12329 .block_erase = spi_block_erase_52,
12330 }, {
12331 .eraseblocks = { {512 * 1024, 1} },
12332 .block_erase = spi_block_erase_60,
12333 },
12334 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012335 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000012336 .unlock = spi_disable_blockprotect,
12337 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12338 .read = spi_chip_read,
12339 .voltage = {3000, 3600},
12340 },
12341
12342 {
12343 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012344 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000012345 .bustype = BUS_SPI,
12346 .manufacture_id = SST_ID,
12347 .model_id = SST_SST25VF080_REMS,
12348 .total_size = 1024,
12349 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012350 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000012351 .tested = TEST_UNTESTED,
12352 .probe = probe_spi_res2,
12353 .probe_timing = TIMING_ZERO,
12354 .block_erasers =
12355 {
12356 {
12357 .eraseblocks = { {4 * 1024, 256} },
12358 .block_erase = spi_block_erase_20,
12359 }, {
12360 .eraseblocks = { {32 * 1024, 32} },
12361 .block_erase = spi_block_erase_52,
12362 }, {
12363 .eraseblocks = { {1024 * 1024, 1} },
12364 .block_erase = spi_block_erase_60,
12365 },
12366 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012367 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000012368 .unlock = spi_disable_blockprotect,
12369 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12370 .read = spi_chip_read,
12371 .voltage = {3000, 3600},
12372 },
12373
12374 {
12375 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000012376 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000012377 .bustype = BUS_SPI,
12378 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000012379 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000012380 .total_size = 64,
12381 .page_size = 256,
12382 .feature_bits = FEATURE_WRSR_EWSR,
12383 .tested = TEST_OK_PREW,
12384 .probe = probe_spi_rems,
12385 .probe_timing = TIMING_ZERO,
12386 .block_erasers =
12387 {
12388 {
12389 .eraseblocks = { {4 * 1024, 16} },
12390 .block_erase = spi_block_erase_20,
12391 }, {
12392 .eraseblocks = { {32 * 1024, 2} },
12393 .block_erase = spi_block_erase_52,
12394 }, {
12395 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012396 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012397 }, {
12398 .eraseblocks = { {64 * 1024, 1} },
12399 .block_erase = spi_block_erase_60,
12400 }, {
12401 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012402 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012403 },
12404 },
12405 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12406 .unlock = spi_disable_blockprotect,
12407 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000012408 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012409 .voltage = {2700, 3600},
12410 },
12411
12412 {
12413 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000012414 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012415 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000012416 .manufacture_id = SST_ID,
12417 .model_id = SST_SST25VF010_REMS,
12418 .total_size = 128,
12419 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012420 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000012421 .tested = TEST_OK_PREW,
12422 .probe = probe_spi_rems,
12423 .probe_timing = TIMING_ZERO,
12424 .block_erasers =
12425 {
12426 {
12427 .eraseblocks = { {4 * 1024, 32} },
12428 .block_erase = spi_block_erase_20,
12429 }, {
12430 .eraseblocks = { {32 * 1024, 4} },
12431 .block_erase = spi_block_erase_52,
12432 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000012433 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012434 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012435 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000012436 .eraseblocks = { {128 * 1024, 1} },
12437 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000012438 }, {
12439 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012440 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012441 },
12442 },
12443 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12444 .unlock = spi_disable_blockprotect,
12445 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000012446 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012447 .voltage = {2700, 3600},
12448 },
12449
12450 {
12451 .vendor = "SST",
12452 .name = "SST25VF020",
12453 .bustype = BUS_SPI,
12454 .manufacture_id = SST_ID,
12455 .model_id = SST_SST25VF020_REMS,
12456 .total_size = 256,
12457 .page_size = 256,
12458 .feature_bits = FEATURE_WRSR_EWSR,
12459 .tested = TEST_UNTESTED,
12460 .probe = probe_spi_rems,
12461 .probe_timing = TIMING_ZERO,
12462 .block_erasers =
12463 {
12464 {
12465 .eraseblocks = { {4 * 1024, 64} },
12466 .block_erase = spi_block_erase_20,
12467 }, {
12468 .eraseblocks = { {32 * 1024, 8} },
12469 .block_erase = spi_block_erase_52,
12470 }, {
12471 .eraseblocks = { {256 * 1024, 1} },
12472 .block_erase = spi_block_erase_60,
12473 },
12474 },
12475 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12476 .unlock = spi_disable_blockprotect,
12477 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12478 .read = spi_chip_read, /* only */
12479 .voltage = {2700, 3600},
12480 },
12481
12482 {
12483 .vendor = "SST",
12484 .name = "SST25VF020B",
12485 .bustype = BUS_SPI,
12486 .manufacture_id = SST_ID,
12487 .model_id = SST_SST25VF020B,
12488 .total_size = 256,
12489 .page_size = 256,
12490 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012491 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000012492 .probe = probe_spi_rdid,
12493 .probe_timing = TIMING_ZERO,
12494 .block_erasers =
12495 {
12496 {
12497 .eraseblocks = { {4 * 1024, 64} },
12498 .block_erase = spi_block_erase_20,
12499 }, {
12500 .eraseblocks = { {32 * 1024, 8} },
12501 .block_erase = spi_block_erase_52,
12502 }, {
12503 .eraseblocks = { {64 * 1024, 4} },
12504 .block_erase = spi_block_erase_d8,
12505 }, {
12506 .eraseblocks = { {256 * 1024, 1} },
12507 .block_erase = spi_block_erase_60,
12508 }, {
12509 .eraseblocks = { {256 * 1024, 1} },
12510 .block_erase = spi_block_erase_c7,
12511 },
12512 },
12513 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
12514 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
12515 .write = spi_aai_write, /* AAI supported (0xAD) */
12516 .read = spi_chip_read, /* Fast read (0x0B) supported */
12517 .voltage = {2700, 3600},
12518 },
12519
12520 {
12521 .vendor = "SST",
12522 .name = "SST25VF040",
12523 .bustype = BUS_SPI,
12524 .manufacture_id = SST_ID,
12525 .model_id = SST_SST25VF040_REMS,
12526 .total_size = 512,
12527 .page_size = 256,
12528 .feature_bits = FEATURE_WRSR_EWSR,
12529 .tested = TEST_OK_PR,
12530 .probe = probe_spi_rems,
12531 .probe_timing = TIMING_ZERO,
12532 .block_erasers =
12533 {
12534 {
12535 .eraseblocks = { {4 * 1024, 128} },
12536 .block_erase = spi_block_erase_20,
12537 }, {
12538 .eraseblocks = { {32 * 1024, 16} },
12539 .block_erase = spi_block_erase_52,
12540 }, {
12541 .eraseblocks = { {512 * 1024, 1} },
12542 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000012543 },
12544 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012545 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000012546 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000012547 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12548 .read = spi_chip_read,
12549 .voltage = {2700, 3600},
12550 },
12551
12552 {
12553 .vendor = "SST",
12554 .name = "SST25VF040B",
12555 .bustype = BUS_SPI,
12556 .manufacture_id = SST_ID,
12557 .model_id = SST_SST25VF040B,
12558 .total_size = 512,
12559 .page_size = 256,
12560 .feature_bits = FEATURE_WRSR_EWSR,
12561 .tested = TEST_OK_PREW,
12562 .probe = probe_spi_rdid,
12563 .probe_timing = TIMING_ZERO,
12564 .block_erasers =
12565 {
12566 {
12567 .eraseblocks = { {4 * 1024, 128} },
12568 .block_erase = spi_block_erase_20,
12569 }, {
12570 .eraseblocks = { {32 * 1024, 16} },
12571 .block_erase = spi_block_erase_52,
12572 }, {
12573 .eraseblocks = { {64 * 1024, 8} },
12574 .block_erase = spi_block_erase_d8,
12575 }, {
12576 .eraseblocks = { {512 * 1024, 1} },
12577 .block_erase = spi_block_erase_60,
12578 }, {
12579 .eraseblocks = { {512 * 1024, 1} },
12580 .block_erase = spi_block_erase_c7,
12581 },
12582 },
12583 .printlock = spi_prettyprint_status_register_sst25vf040b,
12584 .unlock = spi_disable_blockprotect,
12585 .write = spi_aai_write, /* AAI supported (0xAD) */
12586 .read = spi_chip_read, /* Fast read (0x0B) supported */
12587 .voltage = {2700, 3600},
12588 },
12589
12590 {
12591 .vendor = "SST",
12592 .name = "SST25VF040B.REMS",
12593 .bustype = BUS_SPI,
12594 .manufacture_id = SST_ID,
12595 .model_id = SST_SST25VF040B_REMS,
12596 .total_size = 512,
12597 .page_size = 256,
12598 .feature_bits = FEATURE_WRSR_EWSR,
12599 .tested = TEST_OK_PREW,
12600 .probe = probe_spi_rems,
12601 .probe_timing = TIMING_ZERO,
12602 .block_erasers =
12603 {
12604 {
12605 .eraseblocks = { {4 * 1024, 128} },
12606 .block_erase = spi_block_erase_20,
12607 }, {
12608 .eraseblocks = { {32 * 1024, 16} },
12609 .block_erase = spi_block_erase_52,
12610 }, {
12611 .eraseblocks = { {64 * 1024, 8} },
12612 .block_erase = spi_block_erase_d8,
12613 }, {
12614 .eraseblocks = { {512 * 1024, 1} },
12615 .block_erase = spi_block_erase_60,
12616 }, {
12617 .eraseblocks = { {512 * 1024, 1} },
12618 .block_erase = spi_block_erase_c7,
12619 },
12620 },
12621 .printlock = spi_prettyprint_status_register_sst25vf040b,
12622 .unlock = spi_disable_blockprotect,
12623 .write = spi_aai_write,
12624 .read = spi_chip_read,
12625 .voltage = {2700, 3600},
12626 },
12627
12628 {
12629 .vendor = "SST",
Ben Gardnerbcf61092015-11-22 02:23:31 +000012630 .name = "SST25WF020A",
12631 .bustype = BUS_SPI,
12632 .manufacture_id = SANYO_ID, /* See flashchips.h */
12633 .model_id = SST_SST25WF020A,
12634 .total_size = 256,
12635 .page_size = 256,
12636 .feature_bits = FEATURE_WRSR_WREN,
12637 .tested = TEST_UNTESTED,
12638 .probe = probe_spi_rdid,
12639 .probe_timing = TIMING_ZERO,
12640 .block_erasers =
12641 {
12642 {
12643 .eraseblocks = { {4 * 1024, 64} },
12644 .block_erase = spi_block_erase_20,
12645 }, {
12646 .eraseblocks = { {64 * 1024, 4} },
12647 .block_erase = spi_block_erase_d8,
12648 }, {
12649 .eraseblocks = { {256 * 1024, 1} },
12650 .block_erase = spi_block_erase_60,
12651 }, {
12652 .eraseblocks = { {256 * 1024, 1} },
12653 .block_erase = spi_block_erase_c7,
12654 },
12655 },
12656 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12657 .unlock = spi_disable_blockprotect_bp2_srwd,
12658 .write = spi_chip_write_256,
12659 .read = spi_chip_read, /* Fast read (0x0B) supported */
12660 .voltage = {1650, 1950},
12661 },
12662
12663 {
12664 .vendor = "SST",
12665 .name = "SST25WF040B",
12666 .bustype = BUS_SPI,
12667 .manufacture_id = SANYO_ID, /* See flashchips.h */
12668 .model_id = SST_SST25WF040B,
12669 .total_size = 512,
12670 .page_size = 256,
12671 .feature_bits = FEATURE_WRSR_WREN,
12672 .tested = TEST_UNTESTED,
12673 .probe = probe_spi_rdid,
12674 .probe_timing = TIMING_ZERO,
12675 .block_erasers =
12676 {
12677 {
12678 .eraseblocks = { {4 * 1024, 128} },
12679 .block_erase = spi_block_erase_20,
12680 }, {
12681 .eraseblocks = { {64 * 1024, 8} },
12682 .block_erase = spi_block_erase_d8,
12683 }, {
12684 .eraseblocks = { {512 * 1024, 1} },
12685 .block_erase = spi_block_erase_60,
12686 }, {
12687 .eraseblocks = { {512 * 1024, 1} },
12688 .block_erase = spi_block_erase_c7,
12689 },
12690 },
12691 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12692 .unlock = spi_disable_blockprotect_bp2_srwd,
12693 .write = spi_chip_write_256,
12694 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
12695 .voltage = {1650, 1950},
12696 },
12697
12698 {
12699 .vendor = "SST",
12700 .name = "SST25WF080B",
12701 .bustype = BUS_SPI,
12702 .manufacture_id = SANYO_ID, /* See flashchips.h */
12703 .model_id = SST_SST25WF080B,
12704 .total_size = 1024,
12705 .page_size = 256,
12706 .feature_bits = FEATURE_WRSR_WREN,
12707 .tested = TEST_OK_PREW,
12708 .probe = probe_spi_rdid,
12709 .probe_timing = TIMING_ZERO,
12710 .block_erasers =
12711 {
12712 {
12713 .eraseblocks = { {4 * 1024, 256} },
12714 .block_erase = spi_block_erase_20,
12715 }, {
12716 .eraseblocks = { {64 * 1024, 16} },
12717 .block_erase = spi_block_erase_d8,
12718 }, {
12719 .eraseblocks = { {1024 * 1024, 1} },
12720 .block_erase = spi_block_erase_60,
12721 }, {
12722 .eraseblocks = { {1024 * 1024, 1} },
12723 .block_erase = spi_block_erase_c7,
12724 },
12725 },
12726 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12727 .unlock = spi_disable_blockprotect_bp2_srwd,
12728 .write = spi_chip_write_256,
12729 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
12730 .voltage = {1650, 1950},
12731 },
12732
12733 {
12734 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000012735 .name = "SST25VF080B",
12736 .bustype = BUS_SPI,
12737 .manufacture_id = SST_ID,
12738 .model_id = SST_SST25VF080B,
12739 .total_size = 1024,
12740 .page_size = 256,
12741 .feature_bits = FEATURE_WRSR_EWSR,
12742 .tested = TEST_OK_PREW,
12743 .probe = probe_spi_rdid,
12744 .probe_timing = TIMING_ZERO,
12745 .block_erasers =
12746 {
12747 {
12748 .eraseblocks = { {4 * 1024, 256} },
12749 .block_erase = spi_block_erase_20,
12750 }, {
12751 .eraseblocks = { {32 * 1024, 32} },
12752 .block_erase = spi_block_erase_52,
12753 }, {
12754 .eraseblocks = { {64 * 1024, 16} },
12755 .block_erase = spi_block_erase_d8,
12756 }, {
12757 .eraseblocks = { {1024 * 1024, 1} },
12758 .block_erase = spi_block_erase_60,
12759 }, {
12760 .eraseblocks = { {1024 * 1024, 1} },
12761 .block_erase = spi_block_erase_c7,
12762 },
12763 },
12764 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
12765 .unlock = spi_disable_blockprotect,
12766 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000012767 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012768 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000012769 },
12770
12771 {
12772 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012773 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012774 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012775 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012776 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012777 .total_size = 2048,
12778 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012779 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000012780 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012781 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012782 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012783 .block_erasers =
12784 {
12785 {
12786 .eraseblocks = { {4 * 1024, 512} },
12787 .block_erase = spi_block_erase_20,
12788 }, {
12789 .eraseblocks = { {32 * 1024, 64} },
12790 .block_erase = spi_block_erase_52,
12791 }, {
12792 .eraseblocks = { {64 * 1024, 32} },
12793 .block_erase = spi_block_erase_d8,
12794 }, {
12795 .eraseblocks = { {2 * 1024 * 1024, 1} },
12796 .block_erase = spi_block_erase_60,
12797 }, {
12798 .eraseblocks = { {2 * 1024 * 1024, 1} },
12799 .block_erase = spi_block_erase_c7,
12800 },
12801 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012802 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012803 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000012804 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012805 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012806 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012807 },
12808
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012809 {
12810 .vendor = "SST",
12811 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012812 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012813 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012814 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012815 .total_size = 4096,
12816 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012817 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000012818 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012819 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012820 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012821 .block_erasers =
12822 {
12823 {
12824 .eraseblocks = { {4 * 1024, 1024} },
12825 .block_erase = spi_block_erase_20,
12826 }, {
12827 .eraseblocks = { {32 * 1024, 128} },
12828 .block_erase = spi_block_erase_52,
12829 }, {
12830 .eraseblocks = { {64 * 1024, 64} },
12831 .block_erase = spi_block_erase_d8,
12832 }, {
12833 .eraseblocks = { {4 * 1024 * 1024, 1} },
12834 .block_erase = spi_block_erase_60,
12835 }, {
12836 .eraseblocks = { {4 * 1024 * 1024, 1} },
12837 .block_erase = spi_block_erase_c7,
12838 },
12839 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012840 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012841 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000012842 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012843 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012844 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012845 },
12846
12847 {
12848 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012849 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012850 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012851 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012852 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012853 .total_size = 8192,
12854 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012855 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000012856 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012857 .probe = probe_spi_rdid,
12858 .probe_timing = TIMING_ZERO,
12859 .block_erasers =
12860 {
12861 {
12862 .eraseblocks = { {4 * 1024, 2048} },
12863 .block_erase = spi_block_erase_20,
12864 }, {
12865 .eraseblocks = { {32 * 1024, 256} },
12866 .block_erase = spi_block_erase_52,
12867 }, {
12868 .eraseblocks = { {64 * 1024, 128} },
12869 .block_erase = spi_block_erase_d8,
12870 }, {
12871 .eraseblocks = { {8 * 1024 * 1024, 1} },
12872 .block_erase = spi_block_erase_60,
12873 }, {
12874 .eraseblocks = { {8 * 1024 * 1024, 1} },
12875 .block_erase = spi_block_erase_c7,
12876 },
12877 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012878 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012879 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000012880 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012881 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012882 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012883 },
12884
12885 {
12886 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000012887 .name = "SST25WF512",
12888 .bustype = BUS_SPI,
12889 .manufacture_id = SST_ID,
12890 .model_id = SST_SST25WF512,
12891 .total_size = 64,
12892 .page_size = 256,
12893 .feature_bits = FEATURE_WRSR_EITHER,
12894 .tested = TEST_UNTESTED,
12895 .probe = probe_spi_rdid,
12896 .probe_timing = TIMING_ZERO,
12897 .block_erasers =
12898 {
12899 {
12900 .eraseblocks = { {4 * 1024, 16} },
12901 .block_erase = spi_block_erase_20,
12902 }, {
12903 .eraseblocks = { {32 * 1024, 2} },
12904 .block_erase = spi_block_erase_52,
12905 }, {
12906 .eraseblocks = { {1024 * 64, 1} },
12907 .block_erase = spi_block_erase_60,
12908 }, {
12909 .eraseblocks = { {1024 * 64, 1} },
12910 .block_erase = spi_block_erase_c7,
12911 },
12912 },
Jason Harper43ddef02014-05-04 00:55:24 +000012913 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
12914 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000012915 .write = spi_aai_write,
12916 .read = spi_chip_read, /* Fast read (0x0B) supported */
12917 .voltage = {1650, 1950},
12918 },
12919
12920 {
12921 .vendor = "SST",
12922 .name = "SST25WF010",
12923 .bustype = BUS_SPI,
12924 .manufacture_id = SST_ID,
12925 .model_id = SST_SST25WF010,
12926 .total_size = 128,
12927 .page_size = 256,
12928 .feature_bits = FEATURE_WRSR_EITHER,
12929 .tested = TEST_UNTESTED,
12930 .probe = probe_spi_rdid,
12931 .probe_timing = TIMING_ZERO,
12932 .block_erasers =
12933 {
12934 {
12935 .eraseblocks = { {4 * 1024, 32} },
12936 .block_erase = spi_block_erase_20,
12937 }, {
12938 .eraseblocks = { {32 * 1024, 4} },
12939 .block_erase = spi_block_erase_52,
12940 }, {
12941 .eraseblocks = { {1024 * 128, 1} },
12942 .block_erase = spi_block_erase_60,
12943 }, {
12944 .eraseblocks = { {1024 * 128, 1} },
12945 .block_erase = spi_block_erase_c7,
12946 },
12947 },
Jason Harper43ddef02014-05-04 00:55:24 +000012948 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
12949 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000012950 .write = spi_aai_write,
12951 .read = spi_chip_read, /* Fast read (0x0B) supported */
12952 .voltage = {1650, 1950},
12953 },
12954
12955 {
12956 .vendor = "SST",
12957 .name = "SST25WF020",
12958 .bustype = BUS_SPI,
12959 .manufacture_id = SST_ID,
12960 .model_id = SST_SST25WF020,
12961 .total_size = 256,
12962 .page_size = 256,
12963 .feature_bits = FEATURE_WRSR_EITHER,
12964 .tested = TEST_UNTESTED,
12965 .probe = probe_spi_rdid,
12966 .probe_timing = TIMING_ZERO,
12967 .block_erasers =
12968 {
12969 {
12970 .eraseblocks = { {4 * 1024, 64} },
12971 .block_erase = spi_block_erase_20,
12972 }, {
12973 .eraseblocks = { {32 * 1024, 8} },
12974 .block_erase = spi_block_erase_52,
12975 }, {
12976 .eraseblocks = { {64 * 1024, 4} },
12977 .block_erase = spi_block_erase_d8,
12978 }, {
12979 .eraseblocks = { {1024 * 256, 1} },
12980 .block_erase = spi_block_erase_60,
12981 }, {
12982 .eraseblocks = { {1024 * 256, 1} },
12983 .block_erase = spi_block_erase_c7,
12984 },
12985 },
Jason Harper43ddef02014-05-04 00:55:24 +000012986 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
12987 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000012988 .write = spi_aai_write,
12989 .read = spi_chip_read, /* Fast read (0x0B) supported */
12990 .voltage = {1650, 1950},
12991 },
12992
12993 {
12994 .vendor = "SST",
12995 .name = "SST25WF040",
12996 .bustype = BUS_SPI,
12997 .manufacture_id = SST_ID,
12998 .model_id = SST_SST25WF040,
12999 .total_size = 512,
13000 .page_size = 256,
13001 .feature_bits = FEATURE_WRSR_EITHER,
13002 .tested = TEST_UNTESTED,
13003 .probe = probe_spi_rdid,
13004 .probe_timing = TIMING_ZERO,
13005 .block_erasers =
13006 {
13007 {
13008 .eraseblocks = { {4 * 1024, 128} },
13009 .block_erase = spi_block_erase_20,
13010 }, {
13011 .eraseblocks = { {32 * 1024, 16} },
13012 .block_erase = spi_block_erase_52,
13013 }, {
13014 .eraseblocks = { {64 * 1024, 8} },
13015 .block_erase = spi_block_erase_d8,
13016 }, {
13017 .eraseblocks = { {1024 * 512, 1} },
13018 .block_erase = spi_block_erase_60,
13019 }, {
13020 .eraseblocks = { {1024 * 512, 1} },
13021 .block_erase = spi_block_erase_c7,
13022 },
13023 },
Jason Harper43ddef02014-05-04 00:55:24 +000013024 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13025 .unlock = spi_disable_blockprotect_bp2_srwd,
13026 .write = spi_aai_write,
13027 .read = spi_chip_read, /* Fast read (0x0B) supported */
13028 .voltage = {1650, 1950},
13029 },
13030
13031 {
13032 .vendor = "SST",
13033 .name = "SST25WF080",
13034 .bustype = BUS_SPI,
13035 .manufacture_id = SST_ID,
13036 .model_id = SST_SST25WF080,
13037 .total_size = 1024,
13038 .page_size = 256,
13039 .feature_bits = FEATURE_WRSR_EITHER,
13040 .tested = TEST_OK_PREW,
13041 .probe = probe_spi_rdid,
13042 .probe_timing = TIMING_ZERO,
13043 .block_erasers =
13044 {
13045 {
13046 .eraseblocks = { {4 * 1024, 256} },
13047 .block_erase = spi_block_erase_20,
13048 }, {
13049 .eraseblocks = { {32 * 1024, 32} },
13050 .block_erase = spi_block_erase_52,
13051 }, {
13052 .eraseblocks = { {64 * 1024, 16} },
13053 .block_erase = spi_block_erase_d8,
13054 }, {
13055 .eraseblocks = { {1024 * 1024, 1} },
13056 .block_erase = spi_block_erase_60,
13057 }, {
13058 .eraseblocks = { {1024 * 1024, 1} },
13059 .block_erase = spi_block_erase_c7,
13060 },
13061 },
13062 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13063 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013064 .write = spi_aai_write,
13065 .read = spi_chip_read, /* Fast read (0x0B) supported */
13066 .voltage = {1650, 1950},
13067 },
13068
13069 {
13070 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013071 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013072 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013073 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013074 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013075 .total_size = 512,
13076 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013077 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013078 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013079 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013080 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013081 .block_erasers =
13082 {
13083 {
13084 .eraseblocks = { {128, 4096} },
13085 .block_erase = erase_sector_28sf040,
13086 }, {
13087 .eraseblocks = { {512 * 1024, 1} },
13088 .block_erase = erase_chip_28sf040,
13089 }
13090 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013091 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013092 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013093 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013094 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013095 },
13096
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013097 {
13098 .vendor = "SST",
13099 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013100 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013101 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013102 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013103 .total_size = 128,
13104 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013105 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013106 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013107 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013108 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013109 .block_erasers =
13110 {
13111 {
13112 .eraseblocks = { {128 * 1024, 1} },
13113 .block_erase = erase_chip_block_jedec,
13114 }
13115 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013116 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013117 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013118 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013119 },
13120
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013121 {
13122 .vendor = "SST",
13123 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013124 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013125 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013126 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013127 .total_size = 128,
13128 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013129 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013130 .tested = TEST_UNTESTED,
13131 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013132 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013133 .block_erasers =
13134 {
13135 {
13136 .eraseblocks = { {128 * 1024, 1} },
13137 .block_erase = erase_chip_block_jedec,
13138 }
13139 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013140 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013141 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013142 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013143 },
13144
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013145 {
13146 .vendor = "SST",
13147 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013148 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013149 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013150 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013151 .total_size = 256,
13152 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013153 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013154 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013155 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013156 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013157 .block_erasers =
13158 {
13159 {
13160 .eraseblocks = { {256 * 1024, 1} },
13161 .block_erase = erase_chip_block_jedec,
13162 }
13163 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013164 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013165 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013166 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013167 },
13168
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013169 {
13170 .vendor = "SST",
13171 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013172 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013173 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013174 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013175 .total_size = 256,
13176 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013177 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013178 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013179 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013180 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013181 .block_erasers =
13182 {
13183 {
13184 .eraseblocks = { {256 * 1024, 1} },
13185 .block_erase = erase_chip_block_jedec,
13186 }
13187 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013188 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013189 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013190 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013191 },
13192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013193 {
13194 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000013195 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013196 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013197 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013198 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013199 .total_size = 64,
13200 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013201 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000013202 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013203 .probe = probe_jedec,
13204 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000013205 .block_erasers =
13206 {
13207 {
13208 .eraseblocks = { {4 * 1024, 16} },
13209 .block_erase = erase_sector_jedec,
13210 }, {
13211 .eraseblocks = { {64 * 1024, 1} },
13212 .block_erase = erase_chip_block_jedec,
13213 }
13214 },
Sean Nelson35727f72010-01-28 23:55:12 +000013215 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013216 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013217 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000013218 },
13219
13220 {
13221 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013222 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013223 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013224 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013225 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013226 .total_size = 128,
13227 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013228 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013229 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013230 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000013231 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013232 .block_erasers =
13233 {
13234 {
13235 .eraseblocks = { {4 * 1024, 32} },
13236 .block_erase = erase_sector_jedec,
13237 }, {
13238 .eraseblocks = { {128 * 1024, 1} },
13239 .block_erase = erase_chip_block_jedec,
13240 }
13241 },
Sean Nelson35727f72010-01-28 23:55:12 +000013242 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013243 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013244 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013245 },
13246
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013247 {
13248 .vendor = "SST",
13249 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013250 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013251 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013252 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013253 .total_size = 256,
13254 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013255 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000013256 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013257 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013258 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013259 .block_erasers =
13260 {
13261 {
13262 .eraseblocks = { {4 * 1024, 64} },
13263 .block_erase = erase_sector_jedec,
13264 }, {
13265 .eraseblocks = { {256 * 1024, 1} },
13266 .block_erase = erase_chip_block_jedec,
13267 }
13268 },
Sean Nelson35727f72010-01-28 23:55:12 +000013269 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013270 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013271 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013272 },
13273
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013274 {
13275 .vendor = "SST",
13276 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013277 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013278 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013279 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013280 .total_size = 512,
13281 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013282 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000013283 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013284 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013285 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013286 .block_erasers =
13287 {
13288 {
13289 .eraseblocks = { {4 * 1024, 128} },
13290 .block_erase = erase_sector_jedec,
13291 }, {
13292 .eraseblocks = { {512 * 1024, 1} },
13293 .block_erase = erase_chip_block_jedec,
13294 }
13295 },
Sean Nelson35727f72010-01-28 23:55:12 +000013296 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013297 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013298 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013299 },
13300
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013301 {
13302 .vendor = "SST",
13303 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013304 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013305 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013306 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013307 .total_size = 64,
13308 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013309 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000013310 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013311 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013312 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013313 .block_erasers =
13314 {
13315 {
13316 .eraseblocks = { {4 * 1024, 16} },
13317 .block_erase = erase_sector_jedec,
13318 }, {
13319 .eraseblocks = { {64 * 1024, 1} },
13320 .block_erase = erase_chip_block_jedec,
13321 }
13322 },
Sean Nelson35727f72010-01-28 23:55:12 +000013323 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013324 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013325 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013326 },
13327
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013328 {
13329 .vendor = "SST",
13330 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013331 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013332 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013333 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013334 .total_size = 128,
13335 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013336 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000013337 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013338 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013339 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013340 .block_erasers =
13341 {
13342 {
13343 .eraseblocks = { {4 * 1024, 32} },
13344 .block_erase = erase_sector_jedec,
13345 }, {
13346 .eraseblocks = { {128 * 1024, 1} },
13347 .block_erase = erase_chip_block_jedec,
13348 }
13349 },
Sean Nelson35727f72010-01-28 23:55:12 +000013350 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013351 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013352 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013353 },
13354
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013355 {
13356 .vendor = "SST",
13357 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013358 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013359 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013360 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013361 .total_size = 256,
13362 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013363 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000013364 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013365 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013366 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013367 .block_erasers =
13368 {
13369 {
13370 .eraseblocks = { {4 * 1024, 64} },
13371 .block_erase = erase_sector_jedec,
13372 }, {
13373 .eraseblocks = { {256 * 1024, 1} },
13374 .block_erase = erase_chip_block_jedec,
13375 }
13376 },
Sean Nelson35727f72010-01-28 23:55:12 +000013377 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013378 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013379 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013380 },
13381
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013382 {
13383 .vendor = "SST",
13384 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013385 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013386 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013387 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013388 .total_size = 512,
13389 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013390 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013391 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013392 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013393 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013394 .block_erasers =
13395 {
13396 {
13397 .eraseblocks = { {4 * 1024, 128} },
13398 .block_erase = erase_sector_jedec,
13399 }, {
13400 .eraseblocks = { {512 * 1024, 1} },
13401 .block_erase = erase_chip_block_jedec,
13402 }
13403 },
Sean Nelson35727f72010-01-28 23:55:12 +000013404 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013405 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013406 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000013407 },
FENG yu ningff692fb2008-12-08 18:15:10 +000013408
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013409 {
13410 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000013411 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013412 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000013413 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013414 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000013415 .total_size = 1024,
13416 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013417 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000013418 .tested = TEST_UNTESTED,
13419 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013420 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013421 .block_erasers =
13422 {
13423 {
13424 .eraseblocks = { {4 * 1024, 256} },
13425 .block_erase = erase_sector_jedec,
13426 }, {
13427 .eraseblocks = { {64 * 1024, 16} },
13428 .block_erase = erase_block_jedec,
13429 }, {
13430 .eraseblocks = { {1024 * 1024, 1} },
13431 .block_erase = erase_chip_block_jedec,
13432 }
13433 },
Sean Nelson35727f72010-01-28 23:55:12 +000013434 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013435 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013436 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000013437 },
13438
13439 {
13440 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013441 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013442 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013443 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013444 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013445 .total_size = 256,
13446 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013447 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000013448 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013449 .probe = probe_jedec,
13450 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013451 .block_erasers =
13452 {
13453 {
13454 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013455 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013456 }, {
13457 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013458 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013459 }, {
13460 .eraseblocks = { {256 * 1024, 1} },
13461 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13462 }
13463 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013464 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013465 .unlock = unlock_sst_fwhub,
13466 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013467 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013468 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013469 },
13470
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013471 {
13472 .vendor = "SST",
13473 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013474 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013475 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013476 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013477 .total_size = 384,
13478 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013479 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000013480 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013481 .probe = probe_jedec,
13482 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013483 .block_erasers =
13484 {
13485 {
13486 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013487 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013488 }, {
13489 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013490 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013491 }, {
13492 .eraseblocks = { {384 * 1024, 1} },
13493 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13494 }
13495 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013496 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013497 .unlock = unlock_sst_fwhub,
13498 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013499 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013500 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013501 },
13502
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013503 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013504 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
13505 * and is only honored for 64k block erase, but not 4k sector erase.
13506 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013507 .vendor = "SST",
13508 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013509 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013510 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013511 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013512 .total_size = 512,
13513 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013514 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000013515 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013516 .probe = probe_jedec,
13517 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013518 .block_erasers =
13519 {
13520 {
13521 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013522 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013523 }, {
13524 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013525 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013526 }, {
13527 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000013528 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013529 },
13530 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013531 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013532 .unlock = unlock_sst_fwhub,
13533 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013534 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013535 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013536 },
13537
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013538 {
13539 .vendor = "SST",
13540 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013541 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013542 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013543 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013544 .total_size = 512,
13545 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013546 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013547 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013548 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013549 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013550 .block_erasers =
13551 {
13552 {
13553 .eraseblocks = { {4 * 1024, 128} },
13554 .block_erase = erase_sector_49lfxxxc,
13555 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013556 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013557 {64 * 1024, 7},
13558 {32 * 1024, 1},
13559 {8 * 1024, 2},
13560 {16 * 1024, 1},
13561 },
Sean Nelson69e58112010-03-23 17:10:28 +000013562 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013563 }
13564 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013565 .printlock = printlock_regspace2_block_eraser_1,
13566 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013567 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013568 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013569 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013570 },
13571
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013572 {
13573 .vendor = "SST",
13574 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013575 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013576 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013577 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013578 .total_size = 1024,
13579 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013580 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013581 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013582 .probe = probe_jedec,
13583 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013584 .block_erasers =
13585 {
13586 {
13587 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013588 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013589 }, {
13590 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013591 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013592 }, {
13593 .eraseblocks = { {1024 * 1024, 1} },
13594 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13595 }
13596 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013597 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013598 .unlock = unlock_sst_fwhub,
13599 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013600 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013601 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013602 },
13603
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013604 {
13605 .vendor = "SST",
13606 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013607 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013608 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013609 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013610 .total_size = 1024,
13611 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013612 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013613 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013614 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013615 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013616 .block_erasers =
13617 {
13618 {
13619 .eraseblocks = { {4 * 1024, 256} },
13620 .block_erase = erase_sector_49lfxxxc,
13621 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013622 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013623 {64 * 1024, 15},
13624 {32 * 1024, 1},
13625 {8 * 1024, 2},
13626 {16 * 1024, 1},
13627 },
Sean Nelson69e58112010-03-23 17:10:28 +000013628 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013629 }
13630 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013631 .printlock = printlock_regspace2_block_eraser_1,
13632 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013633 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013634 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013635 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013636 },
13637
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013638 {
13639 .vendor = "SST",
13640 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013641 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013642 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013643 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013644 .total_size = 2048,
13645 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013646 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013647 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013648 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013649 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013650 .block_erasers =
13651 {
13652 {
13653 .eraseblocks = { {4 * 1024, 512} },
13654 .block_erase = erase_sector_49lfxxxc,
13655 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013656 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013657 {64 * 1024, 31},
13658 {32 * 1024, 1},
13659 {8 * 1024, 2},
13660 {16 * 1024, 1},
13661 },
Sean Nelson69e58112010-03-23 17:10:28 +000013662 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013663 }
13664 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013665 .printlock = printlock_regspace2_block_eraser_1,
13666 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013667 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013668 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013669 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013670 },
13671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013672 {
13673 .vendor = "SST",
13674 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013675 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013676 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013677 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013678 .total_size = 256,
13679 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013680 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000013681 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013682 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013683 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013684 .block_erasers =
13685 {
13686 {
13687 .eraseblocks = { {4 * 1024, 64} },
13688 .block_erase = erase_sector_jedec,
13689 }, {
13690 .eraseblocks = { {16 * 1024, 16} },
13691 .block_erase = erase_block_jedec,
13692 }, {
13693 .eraseblocks = { {256 * 1024, 1} },
13694 .block_erase = NULL,
13695 }
13696 },
Sean Nelson35727f72010-01-28 23:55:12 +000013697 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013698 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013699 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000013700 },
13701
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013702 {
13703 .vendor = "SST",
13704 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013705 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013706 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013707 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013708 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000013709 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013710 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013711 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013712 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013713 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013714 .block_erasers =
13715 {
13716 {
13717 .eraseblocks = { {4 * 1024, 64} },
13718 .block_erase = erase_sector_jedec,
13719 }, {
13720 .eraseblocks = { {16 * 1024, 16} },
13721 .block_erase = erase_block_jedec,
13722 }, {
13723 .eraseblocks = { {256 * 1024, 1} },
13724 .block_erase = NULL,
13725 }
13726 },
Sean Nelson35727f72010-01-28 23:55:12 +000013727 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013728 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013729 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013730 },
13731
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013732 {
13733 .vendor = "SST",
13734 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013735 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013736 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013737 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013738 .total_size = 512,
13739 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013740 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013741 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013742 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013743 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013744 .block_erasers =
13745 {
13746 {
13747 .eraseblocks = { {4 * 1024, 128} },
13748 .block_erase = erase_sector_jedec,
13749 }, {
13750 .eraseblocks = { {64 * 1024, 8} },
13751 .block_erase = erase_block_jedec,
13752 }, {
13753 .eraseblocks = { {512 * 1024, 1} },
13754 .block_erase = NULL,
13755 }
13756 },
Sean Nelson35727f72010-01-28 23:55:12 +000013757 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013758 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013759 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013760 },
13761
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013762 {
13763 .vendor = "SST",
13764 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013765 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013766 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013767 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013768 .total_size = 512,
13769 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000013770 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013771 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013772 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013773 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013774 .block_erasers =
13775 {
13776 {
13777 .eraseblocks = { {4 * 1024, 128} },
13778 .block_erase = erase_sector_jedec,
13779 }, {
13780 .eraseblocks = { {64 * 1024, 8} },
13781 .block_erase = erase_block_jedec,
13782 }, {
13783 .eraseblocks = { {512 * 1024, 1} },
13784 .block_erase = NULL,
13785 }
13786 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013787 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000013788 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013789 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013790 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013791 },
13792
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013793 {
13794 .vendor = "SST",
13795 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013796 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013797 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013798 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013799 .total_size = 1024,
13800 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013801 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000013802 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013803 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013804 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013805 .block_erasers =
13806 {
13807 {
13808 .eraseblocks = { {4 * 1024, 256} },
13809 .block_erase = erase_sector_jedec,
13810 }, {
13811 .eraseblocks = { {64 * 1024, 16} },
13812 .block_erase = erase_block_jedec,
13813 }, {
13814 .eraseblocks = { {1024 * 1024, 1} },
13815 .block_erase = NULL,
13816 }
13817 },
Sean Nelson35727f72010-01-28 23:55:12 +000013818 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013819 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013820 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013821 },
13822
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013823 {
13824 .vendor = "SST",
13825 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013826 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013827 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013828 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013829 .total_size = 2048,
13830 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013831 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013832 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013833 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013834 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013835 .block_erasers =
13836 {
13837 {
13838 .eraseblocks = { {4 * 1024, 512} },
13839 .block_erase = erase_sector_49lfxxxc,
13840 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013841 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013842 {64 * 1024, 31},
13843 {32 * 1024, 1},
13844 {8 * 1024, 2},
13845 {16 * 1024, 1},
13846 },
Sean Nelson69e58112010-03-23 17:10:28 +000013847 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013848 }
13849 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013850 .printlock = printlock_regspace2_block_eraser_1,
13851 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013852 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013853 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013854 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013855 },
13856
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013857 {
13858 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013859 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013860 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013861 .manufacture_id = ST_ID,
13862 .model_id = ST_M29F002B,
13863 .total_size = 256,
13864 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013865 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013866 .tested = TEST_UNTESTED,
13867 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013868 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013869 .block_erasers =
13870 {
13871 {
13872 .eraseblocks = {
13873 {16 * 1024, 1},
13874 {8 * 1024, 2},
13875 {32 * 1024, 1},
13876 {64 * 1024, 3},
13877 },
13878 .block_erase = erase_sector_jedec,
13879 }, {
13880 .eraseblocks = { {256 * 1024, 1} },
13881 .block_erase = erase_chip_block_jedec,
13882 }
13883 },
Sean Nelson35727f72010-01-28 23:55:12 +000013884 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013885 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013886 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000013887 },
13888
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013889 {
13890 .vendor = "ST",
13891 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013892 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013893 .manufacture_id = ST_ID,
13894 .model_id = ST_M29F002T,
13895 .total_size = 256,
13896 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013897 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013898 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013899 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013900 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013901 .block_erasers =
13902 {
13903 {
13904 .eraseblocks = {
13905 {64 * 1024, 3},
13906 {32 * 1024, 1},
13907 {8 * 1024, 2},
13908 {16 * 1024, 1},
13909 },
13910 .block_erase = erase_sector_jedec,
13911 }, {
13912 .eraseblocks = { {256 * 1024, 1} },
13913 .block_erase = erase_chip_block_jedec,
13914 }
13915 },
Sean Nelson35727f72010-01-28 23:55:12 +000013916 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013917 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013918 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000013919 },
13920
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013921 {
13922 .vendor = "ST",
13923 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013924 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013925 .manufacture_id = ST_ID,
13926 .model_id = ST_M29F040B,
13927 .total_size = 512,
13928 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013929 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13930 .tested = TEST_UNTESTED,
13931 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000013932 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000013933 .block_erasers =
13934 {
13935 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013936 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000013937 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013938 }, {
13939 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000013940 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013941 }
13942 },
Sean Nelson35727f72010-01-28 23:55:12 +000013943 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013944 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013945 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013946 },
13947
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013948 {
Sean Nelson35727f72010-01-28 23:55:12 +000013949 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013950 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013951 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013952 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013953 .manufacture_id = ST_ID,
13954 .model_id = ST_M29F400BB,
13955 .total_size = 512,
13956 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013957 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013958 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013959 .probe = probe_jedec,
13960 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013961 .block_erasers =
13962 {
13963 {
13964 .eraseblocks = {
13965 {16 * 1024, 1},
13966 {8 * 1024, 2},
13967 {32 * 1024, 1},
13968 {64 * 1024, 7},
13969 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013970 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013971 }, {
13972 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013973 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013974 }
13975 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013976 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013977 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013978 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013979 },
13980 {
13981 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
13982 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013983 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013984 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013985 .manufacture_id = ST_ID,
13986 .model_id = ST_M29F400BT,
13987 .total_size = 512,
13988 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013989 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013990 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013991 .probe = probe_jedec,
13992 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000013993 .block_erasers =
13994 {
13995 {
13996 .eraseblocks = {
13997 {64 * 1024, 7},
13998 {32 * 1024, 1},
13999 {8 * 1024, 2},
14000 {16 * 1024, 1},
14001 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014002 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014003 }, {
14004 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014005 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014006 }
14007 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014008 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014009 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014010 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014011 },
14012
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014013 {
14014 .vendor = "ST",
14015 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014016 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014017 .manufacture_id = ST_ID,
14018 .model_id = ST_M29W010B,
14019 .total_size = 128,
14020 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014021 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014022 .tested = TEST_UNTESTED,
14023 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014024 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014025 .block_erasers =
14026 {
14027 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014028 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014029 .block_erase = erase_sector_jedec,
14030 }, {
14031 .eraseblocks = { {128 * 1024, 1} },
14032 .block_erase = erase_chip_block_jedec,
14033 }
14034 },
Sean Nelson35727f72010-01-28 23:55:12 +000014035 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014036 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014037 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014038 },
14039
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014040 {
14041 .vendor = "ST",
14042 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014043 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014044 .manufacture_id = ST_ID,
14045 .model_id = ST_M29W040B,
14046 .total_size = 512,
14047 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014048 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014049 .tested = TEST_UNTESTED,
14050 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014051 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014052 .block_erasers =
14053 {
14054 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014055 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014056 .block_erase = erase_sector_jedec,
14057 }, {
14058 .eraseblocks = { {512 * 1024, 1} },
14059 .block_erase = erase_chip_block_jedec,
14060 }
14061 },
Sean Nelson35727f72010-01-28 23:55:12 +000014062 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014063 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014064 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014065 },
14066
Stefan Taunereb582572012-09-21 12:52:50 +000014067 {
14068 .vendor = "ST",
14069 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014070 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000014071 .manufacture_id = ST_ID,
14072 .model_id = ST_M29W512B,
14073 .total_size = 64,
14074 .page_size = 64 * 1024,
14075 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014076 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000014077 .probe = probe_jedec,
14078 .probe_timing = TIMING_ZERO,
14079 .block_erasers =
14080 {
14081 {
14082 .eraseblocks = { {64 * 1024, 1} },
14083 .block_erase = erase_chip_block_jedec,
14084 }
14085 },
14086 .write = write_jedec_1,
14087 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014088 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000014089 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000014090
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014091 {
14092 .vendor = "ST",
14093 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014094 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014095 .manufacture_id = ST_ID,
14096 .model_id = ST_M50FLW040A,
14097 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014098 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014099 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014100 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014101 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014102 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014103 .block_erasers =
14104 {
14105 {
Sean Nelson329bde72010-01-19 16:39:19 +000014106 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014107 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014108 {64 * 1024, 5}, /* block */
14109 {4 * 1024, 16}, /* sector */
14110 {4 * 1024, 16}, /* sector */
14111 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014112 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014113 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014114 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014115 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014116 }
14117 },
Sean Nelson28accc22010-03-19 18:47:06 +000014118 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014119 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014120 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014121 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014122 },
14123
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014124 {
14125 .vendor = "ST",
14126 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014127 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014128 .manufacture_id = ST_ID,
14129 .model_id = ST_M50FLW040B,
14130 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014131 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014132 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014133 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014134 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014135 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014136 .block_erasers =
14137 {
14138 {
Sean Nelson329bde72010-01-19 16:39:19 +000014139 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014140 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014141 {4 * 1024, 16}, /* sector */
14142 {64 * 1024, 5}, /* block */
14143 {4 * 1024, 16}, /* sector */
14144 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014145 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014146 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014147 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014148 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014149 }
14150 },
Sean Nelson28accc22010-03-19 18:47:06 +000014151 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014152 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014153 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014154 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014155 },
14156
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014157 {
14158 .vendor = "ST",
14159 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014160 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014161 .manufacture_id = ST_ID,
14162 .model_id = ST_M50FLW080A,
14163 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014164 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014165 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014166 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000014167 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014168 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014169 .block_erasers =
14170 {
14171 {
Sean Nelson329bde72010-01-19 16:39:19 +000014172 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014173 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014174 {64 * 1024, 13}, /* block */
14175 {4 * 1024, 16}, /* sector */
14176 {4 * 1024, 16}, /* sector */
14177 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014178 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014179 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014180 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014181 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014182 }
14183 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014184 .printlock = printlock_regspace2_block_eraser_0,
14185 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014186 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014187 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014188 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014189 },
14190
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014191 {
14192 .vendor = "ST",
14193 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014194 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014195 .manufacture_id = ST_ID,
14196 .model_id = ST_M50FLW080B,
14197 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014198 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014199 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014200 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014201 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014202 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014203 .block_erasers =
14204 {
14205 {
Sean Nelson329bde72010-01-19 16:39:19 +000014206 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014207 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014208 {4 * 1024, 16}, /* sector */
14209 {64 * 1024, 13}, /* block */
14210 {4 * 1024, 16}, /* sector */
14211 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014212 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014213 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014214 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014215 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014216 }
14217 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014218 .printlock = printlock_regspace2_block_eraser_0,
14219 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014220 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014221 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014222 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014223 },
14224
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014225 {
14226 .vendor = "ST",
14227 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014228 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014229 .manufacture_id = ST_ID,
14230 .model_id = ST_M50FW002,
14231 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000014232 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014233 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014234 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000014235 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014236 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014237 .block_erasers =
14238 {
14239 {
14240 .eraseblocks = {
14241 {64 * 1024, 3},
14242 {32 * 1024, 1},
14243 {8 * 1024, 2},
14244 {16 * 1024, 1},
14245 },
Sean Nelson28accc22010-03-19 18:47:06 +000014246 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014247 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000014248 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014249 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000014250 }
14251 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014252 .printlock = printlock_regspace2_block_eraser_0,
14253 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014254 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014255 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014256 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014257 },
14258
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014259 {
14260 .vendor = "ST",
14261 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014262 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014263 .manufacture_id = ST_ID,
14264 .model_id = ST_M50FW016,
14265 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000014266 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014267 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014268 .tested = TEST_UNTESTED,
14269 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014270 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014271 .block_erasers =
14272 {
14273 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014274 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000014275 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014276 }
14277 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014278 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014279 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014280 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014281 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014282 },
14283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014284 {
14285 .vendor = "ST",
14286 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014287 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014288 .manufacture_id = ST_ID,
14289 .model_id = ST_M50FW040,
14290 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014291 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014292 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000014293 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014294 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014295 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014296 .block_erasers =
14297 {
14298 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014299 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014300 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014301 }
14302 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014303 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014304 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014305 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014306 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014307 },
14308
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014309 {
14310 .vendor = "ST",
14311 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014312 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014313 .manufacture_id = ST_ID,
14314 .model_id = ST_M50FW080,
14315 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014316 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014317 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014318 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014319 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014320 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014321 .block_erasers =
14322 {
14323 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014324 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014325 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014326 }
14327 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014328 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014329 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014330 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014331 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014332 },
14333
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014334 {
14335 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014336 .name = "M50LPW080",
14337 .bustype = BUS_LPC, /* A/A Mux */
14338 .manufacture_id = ST_ID,
14339 .model_id = ST_M50LPW080,
14340 .total_size = 1024,
14341 .page_size = 0,
14342 .feature_bits = FEATURE_REGISTERMAP,
14343 .tested = TEST_UNTESTED,
14344 .probe = probe_82802ab,
14345 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14346 .block_erasers =
14347 {
14348 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014349 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014350 .block_erase = erase_block_82802ab,
14351 }
14352 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014353 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014354 .write = write_82802ab,
14355 .read = read_memmapped,
14356 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
14357 },
14358
14359 {
14360 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014361 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014362 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014363 .manufacture_id = ST_ID,
14364 .model_id = ST_M50LPW116,
14365 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000014366 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014367 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014368 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014369 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000014370 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014371 .block_erasers =
14372 {
14373 {
14374 .eraseblocks = {
14375 {4 * 1024, 16},
14376 {64 * 1024, 30},
14377 {32 * 1024, 1},
14378 {8 * 1024, 2},
14379 {16 * 1024, 1},
14380 },
Sean Nelson28accc22010-03-19 18:47:06 +000014381 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014382 }
14383 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014384 .printlock = printlock_regspace2_block_eraser_0,
14385 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014386 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014387 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014388 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014389 },
14390
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014391 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014392 .vendor = "SyncMOS/MoselVitelic",
14393 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014394 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014395 .manufacture_id = SYNCMOS_MVC_ID,
14396 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014397 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014398 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000014399 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014400 .tested = TEST_UNTESTED,
14401 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014402 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014403 .block_erasers =
14404 {
14405 {
14406 .eraseblocks = { {512, 256} },
14407 .block_erase = erase_sector_jedec,
14408 }, {
14409 .eraseblocks = { {128 * 1024, 1} },
14410 .block_erase = erase_chip_block_jedec,
14411 },
14412 },
Sean Nelson35727f72010-01-28 23:55:12 +000014413 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014414 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014415 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014416 },
14417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014418 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014419 .vendor = "SyncMOS/MoselVitelic",
14420 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014421 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014422 .manufacture_id = SYNCMOS_MVC_ID,
14423 .model_id = SM_MVC_29C51001T,
14424 .total_size = 128,
14425 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000014426 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014427 .tested = TEST_UNTESTED,
14428 .probe = probe_jedec,
14429 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14430 .block_erasers =
14431 {
14432 {
14433 .eraseblocks = { {512, 256} },
14434 .block_erase = erase_sector_jedec,
14435 }, {
14436 .eraseblocks = { {128 * 1024, 1} },
14437 .block_erase = erase_chip_block_jedec,
14438 },
14439 },
14440 .write = write_jedec_1,
14441 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014442 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014443 },
14444
14445 {
14446 .vendor = "SyncMOS/MoselVitelic",
14447 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014448 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014449 .manufacture_id = SYNCMOS_MVC_ID,
14450 .model_id = SM_MVC_29C51002B,
14451 .total_size = 256,
14452 .page_size = 512,
14453 .feature_bits = FEATURE_EITHER_RESET,
14454 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014455 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014456 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014457 .block_erasers =
14458 {
14459 {
14460 .eraseblocks = { {512, 512} },
14461 .block_erase = erase_sector_jedec,
14462 }, {
14463 .eraseblocks = { {256 * 1024, 1} },
14464 .block_erase = erase_chip_block_jedec,
14465 },
14466 },
Sean Nelson35727f72010-01-28 23:55:12 +000014467 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014468 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000014469 },
14470
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014471 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014472 .vendor = "SyncMOS/MoselVitelic",
14473 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014474 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014475 .manufacture_id = SYNCMOS_MVC_ID,
14476 .model_id = SM_MVC_29C51002T,
14477 .total_size = 256,
14478 .page_size = 512,
14479 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014480 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014481 .probe = probe_jedec,
14482 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14483 .block_erasers =
14484 {
14485 {
14486 .eraseblocks = { {512, 512} },
14487 .block_erase = erase_sector_jedec,
14488 }, {
14489 .eraseblocks = { {256 * 1024, 1} },
14490 .block_erase = erase_chip_block_jedec,
14491 },
14492 },
14493 .write = write_jedec_1,
14494 .read = read_memmapped,
14495 },
14496
14497 {
14498 .vendor = "SyncMOS/MoselVitelic",
14499 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014500 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014501 .manufacture_id = SYNCMOS_MVC_ID,
14502 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014503 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014504 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014505 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014506 .tested = TEST_UNTESTED,
14507 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014508 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000014509 .block_erasers =
14510 {
14511 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014512 .eraseblocks = { {1024, 512} },
14513 .block_erase = erase_sector_jedec,
14514 }, {
14515 .eraseblocks = { {512 * 1024, 1} },
14516 .block_erase = erase_chip_block_jedec,
14517 },
14518 },
14519 .write = write_jedec_1,
14520 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014521 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014522 },
14523
14524 {
14525 .vendor = "SyncMOS/MoselVitelic",
14526 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014527 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014528 .manufacture_id = SYNCMOS_MVC_ID,
14529 .model_id = SM_MVC_29C51004T,
14530 .total_size = 512,
14531 .page_size = 1024,
14532 .feature_bits = FEATURE_EITHER_RESET,
14533 .tested = TEST_UNTESTED,
14534 .probe = probe_jedec,
14535 .probe_timing = TIMING_ZERO,
14536 .block_erasers =
14537 {
14538 {
14539 .eraseblocks = { {1024, 512} },
14540 .block_erase = erase_sector_jedec,
14541 }, {
14542 .eraseblocks = { {512 * 1024, 1} },
14543 .block_erase = erase_chip_block_jedec,
14544 },
14545 },
14546 .write = write_jedec_1,
14547 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014548 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014549 },
14550
14551 {
14552 .vendor = "SyncMOS/MoselVitelic",
14553 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014554 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014555 .manufacture_id = SYNCMOS_MVC_ID,
14556 .model_id = SM_MVC_29C31004B,
14557 .total_size = 512,
14558 .page_size = 1024,
14559 .feature_bits = FEATURE_EITHER_RESET,
14560 .tested = TEST_UNTESTED,
14561 .probe = probe_jedec,
14562 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14563 .block_erasers =
14564 {
14565 {
14566 .eraseblocks = { {1024, 512} },
14567 .block_erase = erase_sector_jedec,
14568 }, {
14569 .eraseblocks = { {512 * 1024, 1} },
14570 .block_erase = erase_chip_block_jedec,
14571 },
14572 },
14573 .write = write_jedec_1,
14574 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014575 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014576 },
14577
14578 {
14579 .vendor = "SyncMOS/MoselVitelic",
14580 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014581 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014582 .manufacture_id = SYNCMOS_MVC_ID,
14583 .model_id = SM_MVC_29C31004T,
14584 .total_size = 512,
14585 .page_size = 1024,
14586 .feature_bits = FEATURE_EITHER_RESET,
14587 .tested = TEST_UNTESTED,
14588 .probe = probe_jedec,
14589 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14590 .block_erasers =
14591 {
14592 {
14593 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014594 .block_erase = erase_sector_jedec,
14595 }, {
14596 .eraseblocks = { {512 * 1024, 1} },
14597 .block_erase = erase_chip_block_jedec,
14598 },
14599 },
Sean Nelson35727f72010-01-28 23:55:12 +000014600 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014601 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014602 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014603 },
14604
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014605 {
Uwe Hermanna106d152009-05-27 23:17:40 +000014606 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014607 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014608 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014609 .manufacture_id = TI_OLD_ID,
14610 .model_id = TI_TMS29F002RB,
14611 .total_size = 256,
14612 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000014613 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014614 .tested = TEST_UNTESTED,
14615 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014616 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014617 .block_erasers =
14618 {
14619 {
14620 .eraseblocks = {
14621 {16 * 1024, 1},
14622 {8 * 1024, 2},
14623 {32 * 1024, 1},
14624 {64 * 1024, 3},
14625 },
14626 .block_erase = erase_sector_jedec,
14627 }, {
14628 .eraseblocks = { {256 * 1024, 1} },
14629 .block_erase = erase_chip_block_jedec,
14630 },
14631 },
Sean Nelson35727f72010-01-28 23:55:12 +000014632 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014633 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014634 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014635 },
14636
14637 {
Uwe Hermanna106d152009-05-27 23:17:40 +000014638 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014639 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014640 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014641 .manufacture_id = TI_OLD_ID,
14642 .model_id = TI_TMS29F002RT,
14643 .total_size = 256,
14644 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000014645 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014646 .tested = TEST_UNTESTED,
14647 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014648 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014649 .block_erasers =
14650 {
14651 {
14652 .eraseblocks = {
14653 {64 * 1024, 3},
14654 {32 * 1024, 1},
14655 {8 * 1024, 2},
14656 {16 * 1024, 1},
14657 },
14658 .block_erase = erase_sector_jedec,
14659 }, {
14660 .eraseblocks = { {256 * 1024, 1} },
14661 .block_erase = erase_chip_block_jedec,
14662 },
14663 },
Sean Nelson35727f72010-01-28 23:55:12 +000014664 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014665 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014666 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014667 },
14668
14669 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014670 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000014671 .name = "W25Q40.V",
14672 .bustype = BUS_SPI,
14673 .manufacture_id = WINBOND_NEX_ID,
14674 .model_id = WINBOND_NEX_W25Q40_V,
14675 .total_size = 512,
14676 .page_size = 256,
14677 /* supports SFDP */
14678 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14679 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014680 .tested = TEST_OK_PREW,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000014681 .probe = probe_spi_rdid,
14682 .probe_timing = TIMING_ZERO,
14683 .block_erasers =
14684 {
14685 {
14686 .eraseblocks = { {4 * 1024, 128} },
14687 .block_erase = spi_block_erase_20,
14688 }, {
14689 .eraseblocks = { {32 * 1024, 16} },
14690 .block_erase = spi_block_erase_52,
14691 }, {
14692 .eraseblocks = { {64 * 1024, 8} },
14693 .block_erase = spi_block_erase_d8,
14694 }, {
14695 .eraseblocks = { {512 * 1024, 1} },
14696 .block_erase = spi_block_erase_60,
14697 }, {
14698 .eraseblocks = { {512 * 1024, 1} },
14699 .block_erase = spi_block_erase_c7,
14700 }
14701 },
14702 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14703 .unlock = spi_disable_blockprotect,
14704 .write = spi_chip_write_256, /* Multi I/O supported */
14705 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14706 .voltage = {2700, 3600},
14707 },
14708
14709 {
14710 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014711 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014712 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014713 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014714 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014715 .total_size = 1024,
14716 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014717 /* supports SFDP */
14718 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014720 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014721 .probe = probe_spi_rdid,
14722 .probe_timing = TIMING_ZERO,
14723 .block_erasers =
14724 {
14725 {
14726 .eraseblocks = { {4 * 1024, 256} },
14727 .block_erase = spi_block_erase_20,
14728 }, {
14729 .eraseblocks = { {32 * 1024, 32} },
14730 .block_erase = spi_block_erase_52,
14731 }, {
14732 .eraseblocks = { {64 * 1024, 16} },
14733 .block_erase = spi_block_erase_d8,
14734 }, {
14735 .eraseblocks = { {1024 * 1024, 1} },
14736 .block_erase = spi_block_erase_60,
14737 }, {
14738 .eraseblocks = { {1024 * 1024, 1} },
14739 .block_erase = spi_block_erase_c7,
14740 }
14741 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014742 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014743 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014744 .write = spi_chip_write_256,
14745 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014746 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014747 },
14748
14749 {
14750 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014751 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014752 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014753 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014754 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014755 .total_size = 2048,
14756 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014757 /* supports SFDP */
14758 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000014760 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014761 .probe = probe_spi_rdid,
14762 .probe_timing = TIMING_ZERO,
14763 .block_erasers =
14764 {
14765 {
14766 .eraseblocks = { {4 * 1024, 512} },
14767 .block_erase = spi_block_erase_20,
14768 }, {
14769 .eraseblocks = { {32 * 1024, 64} },
14770 .block_erase = spi_block_erase_52,
14771 }, {
14772 .eraseblocks = { {64 * 1024, 32} },
14773 .block_erase = spi_block_erase_d8,
14774 }, {
14775 .eraseblocks = { {2 * 1024 * 1024, 1} },
14776 .block_erase = spi_block_erase_60,
14777 }, {
14778 .eraseblocks = { {2 * 1024 * 1024, 1} },
14779 .block_erase = spi_block_erase_c7,
14780 }
14781 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014782 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014783 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014784 .write = spi_chip_write_256,
14785 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014786 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014787 },
14788
14789 {
14790 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014791 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014792 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014793 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014794 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014795 .total_size = 4096,
14796 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014797 /* supports SFDP */
14798 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014799 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014800 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014801 .probe = probe_spi_rdid,
14802 .probe_timing = TIMING_ZERO,
14803 .block_erasers =
14804 {
14805 {
14806 .eraseblocks = { {4 * 1024, 1024} },
14807 .block_erase = spi_block_erase_20,
14808 }, {
14809 .eraseblocks = { {32 * 1024, 128} },
14810 .block_erase = spi_block_erase_52,
14811 }, {
14812 .eraseblocks = { {64 * 1024, 64} },
14813 .block_erase = spi_block_erase_d8,
14814 }, {
14815 .eraseblocks = { {4 * 1024 * 1024, 1} },
14816 .block_erase = spi_block_erase_60,
14817 }, {
14818 .eraseblocks = { {4 * 1024 * 1024, 1} },
14819 .block_erase = spi_block_erase_c7,
14820 }
14821 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014822 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014823 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014824 .write = spi_chip_write_256,
14825 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014826 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014827 },
14828
14829 {
14830 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014831 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014832 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000014833 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014834 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000014835 .total_size = 8192,
14836 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014837 /* supports SFDP */
14838 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014839 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014840 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000014841 .probe = probe_spi_rdid,
14842 .probe_timing = TIMING_ZERO,
14843 .block_erasers =
14844 {
14845 {
14846 .eraseblocks = { {4 * 1024, 2048} },
14847 .block_erase = spi_block_erase_20,
14848 }, {
14849 .eraseblocks = { {32 * 1024, 256} },
14850 .block_erase = spi_block_erase_52,
14851 }, {
14852 .eraseblocks = { {64 * 1024, 128} },
14853 .block_erase = spi_block_erase_d8,
14854 }, {
14855 .eraseblocks = { {8 * 1024 * 1024, 1} },
14856 .block_erase = spi_block_erase_60,
14857 }, {
14858 .eraseblocks = { {8 * 1024 * 1024, 1} },
14859 .block_erase = spi_block_erase_c7,
14860 }
14861 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014862 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014863 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000014864 .write = spi_chip_write_256,
14865 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014866 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000014867 },
14868
14869 {
14870 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014871 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014872 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014873 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014874 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014875 .total_size = 16384,
14876 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014877 /* supports SFDP */
14878 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014880 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014881 .probe = probe_spi_rdid,
14882 .probe_timing = TIMING_ZERO,
14883 .block_erasers =
14884 {
14885 {
14886 .eraseblocks = { {4 * 1024, 4096} },
14887 .block_erase = spi_block_erase_20,
14888 }, {
14889 .eraseblocks = { {32 * 1024, 512} },
14890 .block_erase = spi_block_erase_52,
14891 }, {
14892 .eraseblocks = { {64 * 1024, 256} },
14893 .block_erase = spi_block_erase_d8,
14894 }, {
14895 .eraseblocks = { {16 * 1024 * 1024, 1} },
14896 .block_erase = spi_block_erase_60,
14897 }, {
14898 .eraseblocks = { {16 * 1024 * 1024, 1} },
14899 .block_erase = spi_block_erase_c7,
14900 }
14901 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014902 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000014903 .unlock = spi_disable_blockprotect,
14904 .write = spi_chip_write_256,
14905 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014906 .voltage = {2700, 3600},
14907 },
14908
14909 {
14910 .vendor = "Winbond",
Boris Baykovaa6c3742016-06-11 18:29:01 +020014911 .name = "W25Q256.V",
14912 .bustype = BUS_SPI,
14913 .manufacture_id = WINBOND_NEX_ID,
14914 .model_id = WINBOND_NEX_W25Q256_V,
14915 .total_size = 32768,
14916 .page_size = 256,
14917 /* supports SFDP */
14918 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14919 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nico Huberaac81422017-11-10 22:54:13 +010014920 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
14921 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
14922 .tested = TEST_UNTESTED,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014923 .probe = probe_spi_rdid,
14924 .probe_timing = TIMING_ZERO,
14925 .block_erasers =
14926 {
14927 {
14928 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020014929 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014930 }, {
14931 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020014932 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014933 }, {
14934 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020014935 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014936 }, {
14937 .eraseblocks = { {32 * 1024 * 1024, 1} },
14938 .block_erase = spi_block_erase_60,
14939 }, {
14940 .eraseblocks = { {32 * 1024 * 1024, 1} },
14941 .block_erase = spi_block_erase_c7,
14942 }
14943 },
14944 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14945 .unlock = spi_disable_blockprotect,
14946 .write = spi_chip_write_256,
14947 .read = spi_chip_read,
14948 .voltage = {2700, 3600},
14949 },
14950
14951 {
14952 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014953 .name = "W25Q20.W",
14954 .bustype = BUS_SPI,
14955 .manufacture_id = WINBOND_NEX_ID,
14956 .model_id = WINBOND_NEX_W25Q20_W,
14957 .total_size = 256,
14958 .page_size = 256,
14959 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14960 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14961 .tested = TEST_UNTESTED,
14962 .probe = probe_spi_rdid,
14963 .probe_timing = TIMING_ZERO,
14964 .block_erasers =
14965 {
14966 {
14967 .eraseblocks = { {4 * 1024, 64} },
14968 .block_erase = spi_block_erase_20,
14969 }, {
14970 .eraseblocks = { {32 * 1024, 8} },
14971 .block_erase = spi_block_erase_52,
14972 }, {
14973 .eraseblocks = { {64 * 1024, 4} },
14974 .block_erase = spi_block_erase_d8,
14975 }, {
14976 .eraseblocks = { {256 * 1024, 1} },
14977 .block_erase = spi_block_erase_60,
14978 }, {
14979 .eraseblocks = { {256 * 1024, 1} },
14980 .block_erase = spi_block_erase_c7,
14981 }
14982 },
14983 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14984 .unlock = spi_disable_blockprotect,
14985 .write = spi_chip_write_256,
14986 .read = spi_chip_read,
14987 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
14988 },
14989
14990 {
14991 .vendor = "Winbond",
14992 .name = "W25Q40.W",
14993 .bustype = BUS_SPI,
14994 .manufacture_id = WINBOND_NEX_ID,
14995 .model_id = WINBOND_NEX_W25Q40_W,
14996 .total_size = 512,
14997 .page_size = 256,
14998 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14999 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15000 .tested = TEST_UNTESTED,
15001 .probe = probe_spi_rdid,
15002 .probe_timing = TIMING_ZERO,
15003 .block_erasers =
15004 {
15005 {
15006 .eraseblocks = { {4 * 1024, 128} },
15007 .block_erase = spi_block_erase_20,
15008 }, {
15009 .eraseblocks = { {32 * 1024, 16} },
15010 .block_erase = spi_block_erase_52,
15011 }, {
15012 .eraseblocks = { {64 * 1024, 8} },
15013 .block_erase = spi_block_erase_d8,
15014 }, {
15015 .eraseblocks = { {512 * 1024, 1} },
15016 .block_erase = spi_block_erase_60,
15017 }, {
15018 .eraseblocks = { {512 * 1024, 1} },
15019 .block_erase = spi_block_erase_c7,
15020 }
15021 },
15022 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15023 .unlock = spi_disable_blockprotect,
15024 .write = spi_chip_write_256,
15025 .read = spi_chip_read,
15026 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15027 },
15028
15029 {
15030 .vendor = "Winbond",
15031 .name = "W25Q80.W",
15032 .bustype = BUS_SPI,
15033 .manufacture_id = WINBOND_NEX_ID,
15034 .model_id = WINBOND_NEX_W25Q80_W,
15035 .total_size = 1024,
15036 .page_size = 256,
15037 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15038 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015039 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015040 .probe = probe_spi_rdid,
15041 .probe_timing = TIMING_ZERO,
15042 .block_erasers =
15043 {
15044 {
15045 .eraseblocks = { {4 * 1024, 256} },
15046 .block_erase = spi_block_erase_20,
15047 }, {
15048 .eraseblocks = { {32 * 1024, 32} },
15049 .block_erase = spi_block_erase_52,
15050 }, {
15051 .eraseblocks = { {64 * 1024, 16} },
15052 .block_erase = spi_block_erase_d8,
15053 }, {
15054 .eraseblocks = { {1 * 1024 * 1024, 1} },
15055 .block_erase = spi_block_erase_60,
15056 }, {
15057 .eraseblocks = { {1 * 1024 * 1024, 1} },
15058 .block_erase = spi_block_erase_c7,
15059 }
15060 },
15061 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15062 .unlock = spi_disable_blockprotect,
15063 .write = spi_chip_write_256,
15064 .read = spi_chip_read,
15065 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15066 },
15067
15068 {
15069 .vendor = "Winbond",
15070 .name = "W25Q16.W",
15071 .bustype = BUS_SPI,
15072 .manufacture_id = WINBOND_NEX_ID,
15073 .model_id = WINBOND_NEX_W25Q16_W,
15074 .total_size = 2048,
15075 .page_size = 256,
15076 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15077 /* QPI enable 0x38, disable 0xFF */
15078 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15079 .tested = TEST_UNTESTED,
15080 .probe = probe_spi_rdid,
15081 .probe_timing = TIMING_ZERO,
15082 .block_erasers =
15083 {
15084 {
15085 .eraseblocks = { {4 * 1024, 512} },
15086 .block_erase = spi_block_erase_20,
15087 }, {
15088 .eraseblocks = { {32 * 1024, 64} },
15089 .block_erase = spi_block_erase_52,
15090 }, {
15091 .eraseblocks = { {64 * 1024, 32} },
15092 .block_erase = spi_block_erase_d8,
15093 }, {
15094 .eraseblocks = { {2 * 1024 * 1024, 1} },
15095 .block_erase = spi_block_erase_60,
15096 }, {
15097 .eraseblocks = { {2 * 1024 * 1024, 1} },
15098 .block_erase = spi_block_erase_c7,
15099 }
15100 },
15101 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15102 .unlock = spi_disable_blockprotect,
15103 .write = spi_chip_write_256,
15104 .read = spi_chip_read,
15105 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15106 },
15107
15108 {
15109 .vendor = "Winbond",
15110 .name = "W25Q32.W",
15111 .bustype = BUS_SPI,
15112 .manufacture_id = WINBOND_NEX_ID,
15113 .model_id = WINBOND_NEX_W25Q32_W,
15114 .total_size = 4096,
15115 .page_size = 256,
15116 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15117 /* QPI enable 0x38, disable 0xFF */
15118 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15119 .tested = TEST_OK_PREW,
15120 .probe = probe_spi_rdid,
15121 .probe_timing = TIMING_ZERO,
15122 .block_erasers =
15123 {
15124 {
15125 .eraseblocks = { {4 * 1024, 1024} },
15126 .block_erase = spi_block_erase_20,
15127 }, {
15128 .eraseblocks = { {32 * 1024, 128} },
15129 .block_erase = spi_block_erase_52,
15130 }, {
15131 .eraseblocks = { {64 * 1024, 64} },
15132 .block_erase = spi_block_erase_d8,
15133 }, {
15134 .eraseblocks = { {4 * 1024 * 1024, 1} },
15135 .block_erase = spi_block_erase_60,
15136 }, {
15137 .eraseblocks = { {4 * 1024 * 1024, 1} },
15138 .block_erase = spi_block_erase_c7,
15139 }
15140 },
15141 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15142 .unlock = spi_disable_blockprotect,
15143 .write = spi_chip_write_256,
15144 .read = spi_chip_read,
15145 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15146 },
15147
15148 {
15149 .vendor = "Winbond",
15150 .name = "W25Q64.W",
15151 .bustype = BUS_SPI,
15152 .manufacture_id = WINBOND_NEX_ID,
15153 .model_id = WINBOND_NEX_W25Q64_W,
15154 .total_size = 8192,
15155 .page_size = 256,
15156 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15157 /* QPI enable 0x38, disable 0xFF */
15158 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015159 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015160 .probe = probe_spi_rdid,
15161 .probe_timing = TIMING_ZERO,
15162 .block_erasers =
15163 {
15164 {
15165 .eraseblocks = { {4 * 1024, 2048} },
15166 .block_erase = spi_block_erase_20,
15167 }, {
15168 .eraseblocks = { {32 * 1024, 256} },
15169 .block_erase = spi_block_erase_52,
15170 }, {
15171 .eraseblocks = { {64 * 1024, 128} },
15172 .block_erase = spi_block_erase_d8,
15173 }, {
15174 .eraseblocks = { {8 * 1024 * 1024, 1} },
15175 .block_erase = spi_block_erase_60,
15176 }, {
15177 .eraseblocks = { {8 * 1024 * 1024, 1} },
15178 .block_erase = spi_block_erase_c7,
15179 }
15180 },
15181 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15182 .unlock = spi_disable_blockprotect,
15183 .write = spi_chip_write_256,
15184 .read = spi_chip_read,
15185 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000015186 },
15187
15188 {
15189 .vendor = "Winbond",
Nico Huber70eed9f2017-04-24 22:19:27 +020015190 .name = "W25Q128.W",
15191 .bustype = BUS_SPI,
15192 .manufacture_id = WINBOND_NEX_ID,
15193 .model_id = WINBOND_NEX_W25Q128_W,
15194 .total_size = 16384,
15195 .page_size = 256,
15196 /* supports SFDP */
15197 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15198 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks48729d32017-12-08 14:44:07 -080015199 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020015200 .probe = probe_spi_rdid,
15201 .probe_timing = TIMING_ZERO,
15202 .block_erasers =
15203 {
15204 {
15205 .eraseblocks = { {4 * 1024, 4096} },
15206 .block_erase = spi_block_erase_20,
15207 }, {
15208 .eraseblocks = { {32 * 1024, 512} },
15209 .block_erase = spi_block_erase_52,
15210 }, {
15211 .eraseblocks = { {64 * 1024, 256} },
15212 .block_erase = spi_block_erase_d8,
15213 }, {
15214 .eraseblocks = { {16 * 1024 * 1024, 1} },
15215 .block_erase = spi_block_erase_60,
15216 }, {
15217 .eraseblocks = { {16 * 1024 * 1024, 1} },
15218 .block_erase = spi_block_erase_c7,
15219 }
15220 },
15221 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15222 .unlock = spi_disable_blockprotect,
15223 .write = spi_chip_write_256,
15224 .read = spi_chip_read,
15225 .voltage = {1650, 1950},
15226 },
15227
15228 {
15229 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015230 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015231 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015232 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015233 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015234 .total_size = 128,
15235 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015236 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015237 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015238 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015239 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015240 .block_erasers =
15241 {
15242 {
15243 .eraseblocks = { {4 * 1024, 32} },
15244 .block_erase = spi_block_erase_20,
15245 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015246 .eraseblocks = { {64 * 1024, 2} },
15247 .block_erase = spi_block_erase_d8,
15248 }, {
15249 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015250 .block_erase = spi_block_erase_c7,
15251 }
15252 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015253 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015254 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015255 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015256 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015257 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015258 },
15259
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015260 {
15261 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015262 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015263 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015264 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015265 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015266 .total_size = 256,
15267 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015268 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015269 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015270 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015271 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015272 .block_erasers =
15273 {
15274 {
15275 .eraseblocks = { {4 * 1024, 64} },
15276 .block_erase = spi_block_erase_20,
15277 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015278 .eraseblocks = { {64 * 1024, 4} },
15279 .block_erase = spi_block_erase_d8,
15280 }, {
15281 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015282 .block_erase = spi_block_erase_c7,
15283 }
15284 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015285 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015286 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015287 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015288 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015289 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015290 },
15291
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015292 {
15293 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015294 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015295 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015296 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015297 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015298 .total_size = 512,
15299 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015300 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000015301 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015302 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015303 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015304 .block_erasers =
15305 {
15306 {
15307 .eraseblocks = { {4 * 1024, 128} },
15308 .block_erase = spi_block_erase_20,
15309 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015310 .eraseblocks = { {64 * 1024, 8} },
15311 .block_erase = spi_block_erase_d8,
15312 }, {
15313 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015314 .block_erase = spi_block_erase_c7,
15315 }
15316 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015317 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015318 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015319 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015320 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015321 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015322 },
15323
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015324 {
15325 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015326 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015327 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015328 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015329 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015330 .total_size = 1024,
15331 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015332 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000015333 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015334 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015335 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015336 .block_erasers =
15337 {
15338 {
15339 .eraseblocks = { {4 * 1024, 256} },
15340 .block_erase = spi_block_erase_20,
15341 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015342 .eraseblocks = { {64 * 1024, 16} },
15343 .block_erase = spi_block_erase_d8,
15344 }, {
15345 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015346 .block_erase = spi_block_erase_c7,
15347 }
15348 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015349 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015350 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015351 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015352 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015353 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015354 },
15355
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015356 {
15357 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015358 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015359 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000015360 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015361 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000015362 .total_size = 2048,
15363 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015364 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000015365 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000015366 .probe = probe_spi_rdid,
15367 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015368 .block_erasers =
15369 {
15370 {
15371 .eraseblocks = { {4 * 1024, 512} },
15372 .block_erase = spi_block_erase_20,
15373 }, {
15374 .eraseblocks = { {32 * 1024, 64} },
15375 .block_erase = spi_block_erase_52,
15376 }, {
15377 .eraseblocks = { {64 * 1024, 32} },
15378 .block_erase = spi_block_erase_d8,
15379 }, {
15380 .eraseblocks = { {2 * 1024 * 1024, 1} },
15381 .block_erase = spi_block_erase_60,
15382 }, {
15383 .eraseblocks = { {2 * 1024 * 1024, 1} },
15384 .block_erase = spi_block_erase_c7,
15385 }
15386 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015387 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015388 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000015389 .write = spi_chip_write_256,
15390 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015391 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000015392 },
15393
15394 {
15395 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015396 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015397 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000015398 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015399 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000015400 .total_size = 4096,
15401 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015402 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015403 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000015404 .probe = probe_spi_rdid,
15405 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015406 .block_erasers =
15407 {
15408 {
15409 .eraseblocks = { {4 * 1024, 1024} },
15410 .block_erase = spi_block_erase_20,
15411 }, {
15412 .eraseblocks = { {32 * 1024, 128} },
15413 .block_erase = spi_block_erase_52,
15414 }, {
15415 .eraseblocks = { {64 * 1024, 64} },
15416 .block_erase = spi_block_erase_d8,
15417 }, {
15418 .eraseblocks = { {4 * 1024 * 1024, 1} },
15419 .block_erase = spi_block_erase_60,
15420 }, {
15421 .eraseblocks = { {4 * 1024 * 1024, 1} },
15422 .block_erase = spi_block_erase_c7,
15423 }
15424 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015425 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015426 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000015427 .write = spi_chip_write_256,
15428 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015429 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000015430 },
15431
15432 {
15433 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015434 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015435 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000015436 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015437 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000015438 .total_size = 8192,
15439 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015440 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015441 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000015442 .probe = probe_spi_rdid,
15443 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015444 .block_erasers =
15445 {
15446 {
15447 .eraseblocks = { {4 * 1024, 2048} },
15448 .block_erase = spi_block_erase_20,
15449 }, {
15450 .eraseblocks = { {32 * 1024, 256} },
15451 .block_erase = spi_block_erase_52,
15452 }, {
15453 .eraseblocks = { {64 * 1024, 128} },
15454 .block_erase = spi_block_erase_d8,
15455 }, {
15456 .eraseblocks = { {8 * 1024 * 1024, 1} },
15457 .block_erase = spi_block_erase_60,
15458 }, {
15459 .eraseblocks = { {8 * 1024 * 1024, 1} },
15460 .block_erase = spi_block_erase_c7,
15461 }
15462 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015463 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015464 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000015465 .write = spi_chip_write_256,
15466 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015467 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000015468 },
15469
15470 {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080015471 .vendor = "Winbond",
15472 .name = "W25P80",
15473 .bustype = BUS_SPI,
15474 .manufacture_id = WINBOND_NEX_ID,
15475 .model_id = WINBOND_NEX_W25P80,
15476 .total_size = 1024,
15477 .page_size = 256,
15478 .feature_bits = FEATURE_WRSR_WREN,
15479 .tested = TEST_UNTESTED,
15480 .probe = probe_spi_rdid,
15481 .probe_timing = TIMING_ZERO,
15482 .block_erasers =
15483 {
15484 {
15485 .eraseblocks = { {64 * 1024, 16} },
15486 .block_erase = spi_block_erase_d8,
15487 }, {
15488 .eraseblocks = { {1024 * 1024, 1} },
15489 .block_erase = spi_block_erase_c7,
15490 }
15491 },
15492 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15493 .unlock = spi_disable_blockprotect,
15494 .write = spi_chip_write_256,
15495 .read = spi_chip_read, /* Fast read (0x0B) supported */
15496 .voltage = {2700, 3600},
15497 },
15498
15499 {
15500 .vendor = "Winbond",
15501 .name = "W25P16",
15502 .bustype = BUS_SPI,
15503 .manufacture_id = WINBOND_NEX_ID,
15504 .model_id = WINBOND_NEX_W25P16,
15505 .total_size = 2048,
15506 .page_size = 256,
15507 .feature_bits = FEATURE_WRSR_WREN,
15508 .tested = TEST_UNTESTED,
15509 .probe = probe_spi_rdid,
15510 .probe_timing = TIMING_ZERO,
15511 .block_erasers =
15512 {
15513 {
15514 .eraseblocks = { {64 * 1024, 32} },
15515 .block_erase = spi_block_erase_d8,
15516 }, {
15517 .eraseblocks = { {2048 * 1024, 1} },
15518 .block_erase = spi_block_erase_c7,
15519 }
15520 },
15521 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15522 .unlock = spi_disable_blockprotect,
15523 .write = spi_chip_write_256,
15524 .read = spi_chip_read, /* Fast read (0x0B) supported */
15525 .voltage = {2700, 3600},
15526 },
15527
15528 {
15529 .vendor = "Winbond",
15530 .name = "W25P32",
15531 .bustype = BUS_SPI,
15532 .manufacture_id = WINBOND_NEX_ID,
15533 .model_id = WINBOND_NEX_W25P32,
15534 .total_size = 4096,
15535 .page_size = 256,
15536 .feature_bits = FEATURE_WRSR_WREN,
15537 .tested = TEST_UNTESTED,
15538 .probe = probe_spi_rdid,
15539 .probe_timing = TIMING_ZERO,
15540 .block_erasers =
15541 {
15542 {
15543 .eraseblocks = { {64 * 1024, 64} },
15544 .block_erase = spi_block_erase_d8,
15545 }, {
15546 .eraseblocks = { {4096 * 1024, 1} },
15547 .block_erase = spi_block_erase_c7,
15548 }
15549 },
15550 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15551 .unlock = spi_disable_blockprotect,
15552 .write = spi_chip_write_256,
15553 .read = spi_chip_read, /* Fast read (0x0B) supported */
15554 .voltage = {2700, 3600},
15555 },
15556 {
Zheng Bao1db2b752009-11-26 11:05:01 +000015557 .vendor = "Winbond",
Urja Rannikko2a1aaba2015-06-20 11:53:10 +000015558 .name = "W29C512A/W29EE512",
15559 .bustype = BUS_PARALLEL,
15560 .manufacture_id = WINBOND_ID,
15561 .model_id = WINBOND_W29C512A,
15562 .total_size = 64,
15563 .page_size = 128,
15564 .feature_bits = FEATURE_LONG_RESET,
15565 .tested = TEST_OK_PREW,
15566 .probe = probe_jedec,
15567 .probe_timing = 10,
15568 .block_erasers =
15569 {
15570 {
15571 .eraseblocks = { {64 * 1024, 1} },
15572 .block_erase = erase_chip_block_jedec,
15573 }
15574 },
15575 .write = write_jedec,
15576 .read = read_memmapped,
15577 .voltage = {4500, 5500},
15578 },
15579
15580 {
15581 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015582 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015583 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015584 .manufacture_id = WINBOND_ID,
15585 .model_id = WINBOND_W29C010,
15586 .total_size = 128,
15587 .page_size = 128,
15588 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015589 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015590 .probe = probe_w29ee011,
15591 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
15592 .block_erasers =
15593 {
15594 {
15595 .eraseblocks = { {128 * 1024, 1} },
15596 .block_erase = erase_chip_block_jedec,
15597 }
15598 },
15599 .write = write_jedec,
15600 .read = read_memmapped,
15601 },
15602
15603 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
15604 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015605 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015606 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015607 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015608 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015609 .total_size = 128,
15610 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015611 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000015612 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015613 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015614 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015615 .block_erasers =
15616 {
15617 {
15618 .eraseblocks = { {128 * 1024, 1} },
15619 .block_erase = erase_chip_block_jedec,
15620 }
15621 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015622 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015623 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000015624 },
15625
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015626 {
15627 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015628 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015629 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015630 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015631 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015632 .total_size = 256,
15633 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015634 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015635 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015636 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015637 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015638 .block_erasers =
15639 {
15640 {
15641 .eraseblocks = { {256 * 1024, 1} },
15642 .block_erase = erase_chip_block_jedec,
15643 }
15644 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015645 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015646 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015647 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015648 },
15649
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015650 {
15651 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015652 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015653 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015654 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015655 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015656 .total_size = 512,
15657 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000015658 .feature_bits = FEATURE_LONG_RESET,
15659 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015660 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015661 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015662 .block_erasers =
15663 {
15664 {
15665 .eraseblocks = { {512 * 1024, 1} },
15666 .block_erase = erase_chip_block_jedec,
15667 }
15668 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015669 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015670 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015671 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015672 },
15673
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015674 {
15675 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000015676 .name = "W29GL032CB",
15677 .bustype = BUS_PARALLEL,
15678 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15679 .model_id = WINBOND_W29GL032CB,
15680 .total_size = 4096,
15681 .page_size = 128 * 1024, /* actual page size is 16 */
15682 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15683 .tested = TEST_UNTESTED,
15684 .probe = probe_jedec_29gl,
15685 .probe_timing = TIMING_ZERO,
15686 .block_erasers =
15687 {
15688 {
15689 .eraseblocks = {
15690 {8 * 1024, 8},
15691 {64 * 1024, 63},
15692 },
15693 .block_erase = erase_sector_jedec,
15694 }, {
15695 .eraseblocks = { {4 * 1024 * 1024, 1} },
15696 .block_erase = erase_chip_block_jedec,
15697 },
15698 },
15699 .write = write_jedec_1,
15700 .read = read_memmapped,
15701 .voltage = {2700, 3600},
15702 },
15703
15704 {
15705 .vendor = "Winbond",
15706 .name = "W29GL032CT",
15707 .bustype = BUS_PARALLEL,
15708 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15709 .model_id = WINBOND_W29GL032CT,
15710 .total_size = 4096,
15711 .page_size = 128 * 1024, /* actual page size is 16 */
15712 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15713 .tested = TEST_UNTESTED,
15714 .probe = probe_jedec_29gl,
15715 .probe_timing = TIMING_ZERO,
15716 .block_erasers =
15717 {
15718 {
15719 .eraseblocks = {
15720 {64 * 1024, 63},
15721 {8 * 1024, 8},
15722 },
15723 .block_erase = erase_sector_jedec,
15724 }, {
15725 .eraseblocks = { {4 * 1024 * 1024, 1} },
15726 .block_erase = erase_chip_block_jedec,
15727 },
15728 },
15729 .write = write_jedec_1,
15730 .read = read_memmapped,
15731 .voltage = {2700, 3600},
15732 },
15733
15734 {
15735 .vendor = "Winbond",
15736 .name = "W29GL032CH/L",
15737 .bustype = BUS_PARALLEL,
15738 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15739 .model_id = WINBOND_W29GL032CHL,
15740 .total_size = 4096,
15741 .page_size = 128 * 1024, /* actual page size is 16 */
15742 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15743 .tested = TEST_UNTESTED,
15744 .probe = probe_jedec_29gl,
15745 .probe_timing = TIMING_ZERO,
15746 .block_erasers =
15747 {
15748 {
15749 .eraseblocks = { {64 * 1024, 64} },
15750 .block_erase = erase_sector_jedec,
15751 }, {
15752 .eraseblocks = { {4 * 1024 * 1024, 1} },
15753 .block_erase = erase_chip_block_jedec,
15754 },
15755 },
15756 .write = write_jedec_1,
15757 .read = read_memmapped,
15758 .voltage = {2700, 3600},
15759 },
15760
15761 {
15762 .vendor = "Winbond",
15763 .name = "W29GL064CB",
15764 .bustype = BUS_PARALLEL,
15765 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15766 .model_id = WINBOND_W29GL064CB,
15767 .total_size = 8192,
15768 .page_size = 128 * 1024, /* actual page size is 16 */
15769 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15770 .tested = TEST_UNTESTED,
15771 .probe = probe_jedec_29gl,
15772 .probe_timing = TIMING_ZERO,
15773 .block_erasers =
15774 {
15775 {
15776 .eraseblocks = {
15777 {8 * 1024, 8},
15778 {64 * 1024, 127},
15779 },
15780 .block_erase = erase_sector_jedec,
15781 }, {
15782 .eraseblocks = { {8 * 1024 * 1024, 1} },
15783 .block_erase = erase_chip_block_jedec,
15784 },
15785 },
15786 .write = write_jedec_1,
15787 .read = read_memmapped,
15788 .voltage = {2700, 3600},
15789 },
15790
15791 {
15792 .vendor = "Winbond",
15793 .name = "W29GL064CT",
15794 .bustype = BUS_PARALLEL,
15795 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15796 .model_id = WINBOND_W29GL064CT,
15797 .total_size = 8192,
15798 .page_size = 128 * 1024, /* actual page size is 16 */
15799 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15800 .tested = TEST_UNTESTED,
15801 .probe = probe_jedec_29gl,
15802 .probe_timing = TIMING_ZERO,
15803 .block_erasers =
15804 {
15805 {
15806 .eraseblocks = {
15807 {64 * 1024, 127},
15808 {8 * 1024, 8},
15809 },
15810 .block_erase = erase_sector_jedec,
15811 }, {
15812 .eraseblocks = { {8 * 1024 * 1024, 1} },
15813 .block_erase = erase_chip_block_jedec,
15814 },
15815 },
15816 .write = write_jedec_1,
15817 .read = read_memmapped,
15818 .voltage = {2700, 3600},
15819 },
15820
15821 {
15822 .vendor = "Winbond",
15823 .name = "W29GL064CH/L",
15824 .bustype = BUS_PARALLEL,
15825 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15826 .model_id = WINBOND_W29GL064CHL,
15827 .total_size = 8192,
15828 .page_size = 128 * 1024, /* actual page size is 16 */
15829 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15830 .tested = TEST_UNTESTED,
15831 .probe = probe_jedec_29gl,
15832 .probe_timing = TIMING_ZERO,
15833 .block_erasers =
15834 {
15835 {
15836 .eraseblocks = { {64 * 1024, 128} },
15837 .block_erase = erase_sector_jedec,
15838 }, {
15839 .eraseblocks = { {8 * 1024 * 1024, 1} },
15840 .block_erase = erase_chip_block_jedec,
15841 },
15842 },
15843 .write = write_jedec_1,
15844 .read = read_memmapped,
15845 .voltage = {2700, 3600},
15846 },
15847
15848 {
15849 .vendor = "Winbond",
15850 .name = "W29GL128C",
15851 .bustype = BUS_PARALLEL,
15852 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15853 .model_id = WINBOND_W29GL128CHL,
15854 .total_size = 16384,
15855 .page_size = 128 * 1024, /* actual page size is 16 */
15856 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15857 .tested = TEST_UNTESTED,
15858 .probe = probe_jedec_29gl,
15859 .probe_timing = TIMING_ZERO,
15860 .block_erasers =
15861 {
15862 {
15863 .eraseblocks = { {128 * 1024, 128} },
15864 .block_erase = erase_sector_jedec,
15865 }, {
15866 .eraseblocks = { {16 * 1024 * 1024, 1} },
15867 .block_erase = erase_chip_block_jedec,
15868 },
15869 },
15870 .write = write_jedec_1,
15871 .read = read_memmapped,
15872 .voltage = {2700, 3600},
15873 },
15874
15875 {
15876 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000015877 .name = "W39F010",
15878 .bustype = BUS_PARALLEL,
15879 .manufacture_id = WINBOND_ID,
15880 .model_id = WINBOND_W39F010,
15881 .total_size = 128,
15882 .page_size = 4 * 1024,
15883 .feature_bits = FEATURE_EITHER_RESET,
15884 .tested = TEST_OK_PREW,
15885 .probe = probe_jedec,
15886 .probe_timing = 10,
15887 .block_erasers =
15888 {
15889 {
15890 .eraseblocks = { {4 * 1024, 32} },
15891 .block_erase = erase_block_jedec,
15892 }, {
15893 .eraseblocks = { {128 * 1024, 1} },
15894 .block_erase = erase_chip_block_jedec,
15895 }
15896 },
15897 .printlock = printlock_w39f010,
15898 .write = write_jedec_1,
15899 .read = read_memmapped,
15900 .voltage = {4500, 5500},
15901 },
15902
15903 {
15904 .vendor = "Winbond",
15905 .name = "W39L010",
15906 .bustype = BUS_PARALLEL,
15907 .manufacture_id = WINBOND_ID,
15908 .model_id = WINBOND_W39L010,
15909 .total_size = 128,
15910 .page_size = 4 * 1024,
15911 .feature_bits = FEATURE_EITHER_RESET,
15912 .tested = TEST_UNTESTED,
15913 .probe = probe_jedec,
15914 .probe_timing = 10,
15915 .block_erasers =
15916 {
15917 {
15918 .eraseblocks = { {4 * 1024, 32} },
15919 .block_erase = erase_block_jedec,
15920 }, {
15921 .eraseblocks = { {128 * 1024, 1} },
15922 .block_erase = erase_chip_block_jedec,
15923 }
15924 },
15925 .printlock = printlock_w39l010,
15926 .write = write_jedec_1,
15927 .read = read_memmapped,
15928 .voltage = {3000, 3600},
15929 },
15930
15931 {
15932 .vendor = "Winbond",
15933 .name = "W39L020",
15934 .bustype = BUS_PARALLEL,
15935 .manufacture_id = WINBOND_ID,
15936 .model_id = WINBOND_W39L020,
15937 .total_size = 256,
15938 .page_size = 4 * 1024,
15939 .feature_bits = FEATURE_EITHER_RESET,
15940 .tested = TEST_UNTESTED,
15941 .probe = probe_jedec,
15942 .probe_timing = 10,
15943 .block_erasers =
15944 {
15945 {
15946 .eraseblocks = { {4 * 1024, 64} },
15947 .block_erase = erase_block_jedec,
15948 }, {
15949 .eraseblocks = { {64 * 1024, 4} },
15950 .block_erase = erase_sector_jedec,
15951 }, {
15952 .eraseblocks = { {256 * 1024, 1} },
15953 .block_erase = erase_chip_block_jedec,
15954 }
15955 },
15956 .printlock = printlock_w39l020,
15957 .write = write_jedec_1,
15958 .read = read_memmapped,
15959 .voltage = {3000, 3600},
15960 },
15961
15962 {
15963 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000015964 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015965 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000015966 .manufacture_id = WINBOND_ID,
15967 .model_id = WINBOND_W39L040,
15968 .total_size = 512,
15969 .page_size = 64 * 1024,
15970 .feature_bits = FEATURE_EITHER_RESET,
15971 .tested = TEST_OK_PR,
15972 .probe = probe_jedec,
15973 .probe_timing = 10,
15974 .block_erasers =
15975 {
15976 {
15977 .eraseblocks = { {4 * 1024, 128} },
15978 .block_erase = erase_block_jedec,
15979 }, {
15980 .eraseblocks = { {64 * 1024, 8} },
15981 .block_erase = erase_sector_jedec,
15982 }, {
15983 .eraseblocks = { {512 * 1024, 1} },
15984 .block_erase = erase_chip_block_jedec,
15985 }
15986 },
15987 .printlock = printlock_w39l040,
15988 .write = write_jedec_1,
15989 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015990 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000015991 },
15992
15993 {
15994 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015995 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015996 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015997 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015998 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015999 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016000 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016001 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000016002 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016003 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000016004 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016005 .block_erasers =
16006 {
16007 {
16008 .eraseblocks = { {64 * 1024, 8} },
16009 .block_erase = erase_sector_jedec,
16010 }, {
16011 .eraseblocks = { {512 * 1024, 1} },
16012 .block_erase = erase_chip_block_jedec,
16013 }
16014 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016015 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000016016 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016017 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016018 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016019 },
16020
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016021 {
16022 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016023 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016024 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016025 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016026 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016027 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016028 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016029 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016030 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016031 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000016032 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016033 .block_erasers =
16034 {
16035 {
16036 .eraseblocks = { {64 * 1024, 8} },
16037 .block_erase = erase_sector_jedec,
16038 }, {
16039 .eraseblocks = { {512 * 1024, 1} },
16040 .block_erase = erase_chip_block_jedec,
16041 }
16042 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016043 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000016044 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016045 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016046 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016047 },
16048
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016049 {
16050 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016051 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016052 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016053 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016054 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016055 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016056 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016057 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016058 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000016059 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016060 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016061 .block_erasers =
16062 {
16063 {
16064 .eraseblocks = { {64 * 1024, 8} },
16065 .block_erase = erase_sector_jedec,
16066 }, {
16067 .eraseblocks = { {512 * 1024, 1} },
16068 .block_erase = erase_chip_block_jedec,
16069 }
16070 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000016071 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000016072 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016073 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016074 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016075 },
16076
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016077 {
16078 .vendor = "Winbond",
16079 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016080 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016081 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016082 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016083 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016084 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000016085 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016086 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016087 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000016088 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016089 .block_erasers =
16090 {
16091 {
16092 .eraseblocks = { {4 * 1024, 128} },
16093 .block_erase = erase_block_jedec,
16094 }, {
16095 .eraseblocks = { {64 * 1024, 8} },
16096 .block_erase = erase_sector_jedec,
16097 }, {
16098 .eraseblocks = { {512 * 1024, 1} },
16099 .block_erase = erase_chip_block_jedec,
16100 }
16101 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016102 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016103 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000016104 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016105 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016106 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016107 },
16108
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016109 {
16110 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016111 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016112 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016113 .manufacture_id = WINBOND_ID,
16114 .model_id = WINBOND_W39V040B,
16115 .total_size = 512,
16116 .page_size = 64 * 1024,
16117 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000016118 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016119 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016120 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016121 .block_erasers =
16122 {
16123 {
16124 .eraseblocks = { {64 * 1024, 8} },
16125 .block_erase = erase_sector_jedec,
16126 }, {
16127 .eraseblocks = { {512 * 1024, 1} },
16128 .block_erase = erase_chip_block_jedec,
16129 }
16130 },
16131 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016132 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016133 .write = write_jedec_1,
16134 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016135 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016136 },
16137
16138 {
16139 .vendor = "Winbond",
16140 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016141 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016142 .manufacture_id = WINBOND_ID,
16143 .model_id = WINBOND_W39V040C,
16144 .total_size = 512,
16145 .page_size = 64 * 1024,
16146 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000016147 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016148 .probe = probe_jedec,
16149 .probe_timing = 10,
16150 .block_erasers =
16151 {
16152 {
16153 .eraseblocks = { {64 * 1024, 8} },
16154 .block_erase = erase_sector_jedec,
16155 }, {
16156 .eraseblocks = { {512 * 1024, 1} },
16157 .block_erase = erase_chip_block_jedec,
16158 }
16159 },
16160 .printlock = printlock_w39v040fc,
16161 .write = write_jedec_1,
16162 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016163 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016164 },
16165
16166 {
16167 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016168 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016169 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016170 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016171 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016172 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000016173 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016174 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000016175 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016176 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000016177 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016178 .block_erasers =
16179 {
16180 {
16181 .eraseblocks = { {64 * 1024, 16} },
16182 .block_erase = erase_sector_jedec,
16183 }, {
16184 .eraseblocks = { {1024 * 1024, 1} },
16185 .block_erase = erase_chip_block_jedec,
16186 }
16187 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016188 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000016189 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016190 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016191 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016192 },
16193
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016194 {
16195 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016196 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016197 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016198 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016199 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016200 .total_size = 256,
16201 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016202 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000016203 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016204 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016205 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016206 .block_erasers =
16207 {
16208 {
16209 .eraseblocks = {
16210 {128 * 1024, 1},
16211 {96 * 1024, 1},
16212 {8 * 1024, 2},
16213 {16 * 1024, 1},
16214 },
16215 .block_erase = erase_sector_jedec,
16216 }, {
16217 .eraseblocks = { {256 * 1024, 1} },
16218 .block_erase = erase_chip_block_jedec,
16219 }
16220 },
Sean Nelson35727f72010-01-28 23:55:12 +000016221 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016222 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016223 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016224 },
16225
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016226 {
16227 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016228 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016229 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016230 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016231 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016232 .total_size = 256,
16233 .page_size = 128,
16234 .feature_bits = FEATURE_EITHER_RESET,
16235 .tested = TEST_OK_PROBE,
16236 .probe = probe_jedec,
16237 .probe_timing = 10,
16238 .block_erasers =
16239 {
16240 {
16241 .eraseblocks = { {256 * 1024, 1} },
16242 .block_erase = erase_chip_block_jedec,
16243 }
16244 },
16245 .write = write_jedec_1,
16246 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016247 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016248 },
16249
16250 {
16251 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016252 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016253 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016254 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016255 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016256 .total_size = 256,
16257 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016258 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016259 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016260 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016261 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016262 .block_erasers =
16263 {
16264 {
16265 .eraseblocks = {
16266 {64 * 1024, 3},
16267 {32 * 1024, 1},
16268 {8 * 1024, 2},
16269 {16 * 1024, 1},
16270 },
16271 .block_erase = erase_sector_jedec,
16272 }, {
16273 .eraseblocks = { {256 * 1024, 1} },
16274 .block_erase = erase_chip_block_jedec,
16275 }
16276 },
Sean Nelson35727f72010-01-28 23:55:12 +000016277 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016278 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016279 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016280 },
16281
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016282 {
16283 .vendor = "Winbond",
16284 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016285 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016286 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016287 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016288 .total_size = 256,
16289 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016290 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000016291 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016292 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016293 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016294 .block_erasers =
16295 {
16296 {
16297 .eraseblocks = {
16298 {64 * 1024, 3},
16299 {32 * 1024, 1},
16300 {8 * 1024, 2},
16301 {16 * 1024, 1},
16302 },
16303 .block_erase = erase_sector_jedec,
16304 }, {
16305 .eraseblocks = { {256 * 1024, 1} },
16306 .block_erase = erase_chip_block_jedec,
16307 }
16308 },
Sean Nelson35727f72010-01-28 23:55:12 +000016309 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016310 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016311 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016312 },
16313
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016314 {
16315 .vendor = "Winbond",
16316 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016317 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016318 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016319 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016320 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000016321 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016322 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016323 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000016324 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016325 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016326 .block_erasers =
16327 {
16328 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016329 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016330 .block_erase = erase_sector_jedec,
16331 }, {
16332 .eraseblocks = { {1024 * 1024, 1} },
16333 .block_erase = erase_chip_block_jedec,
16334 }
16335 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016336 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016337 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000016338 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016339 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016340 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000016341 },
16342
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016343 {
16344 .vendor = "Winbond",
16345 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016346 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016347 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016348 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016349 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016350 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016351 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016352 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000016353 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016354 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016355 .block_erasers =
16356 {
16357 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016358 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016359 .block_erase = erase_sector_jedec,
16360 }, {
16361 .eraseblocks = { {512 * 1024, 1} },
16362 .block_erase = erase_chip_block_jedec,
16363 }
16364 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016365 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000016366 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016367 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016368 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000016369 },
nybashcbb46e22018-02-11 17:53:49 -080016370
16371 {
16372 .vendor = "Zetta Device",
David Hendricksa72d5a92018-02-11 17:58:44 -080016373 .name = "ZD25D20",
16374 .bustype = BUS_SPI,
16375 .manufacture_id = ZETTADEVICE_ID,
16376 .model_id = ZETTADEVICE_ZD25D20,
16377 .total_size = 256,
16378 .page_size = 256,
16379 .feature_bits = FEATURE_WRSR_WREN,
16380 .tested = TEST_UNTESTED,
16381 .probe = probe_spi_rdid,
16382 .probe_timing = TIMING_ZERO,
16383 .block_erasers =
16384 {
16385 {
16386 .eraseblocks = { {4 * 1024, 64} },
16387 .block_erase = spi_block_erase_20,
16388 }, {
16389 .eraseblocks = { {32 * 1024, 8} },
16390 .block_erase = spi_block_erase_52,
16391 }, {
16392 .eraseblocks = { {64 * 1024, 4} },
16393 .block_erase = spi_block_erase_d8,
16394 }, {
16395 .eraseblocks = { {256 * 1024, 1} },
16396 .block_erase = spi_block_erase_60,
16397 }, {
16398 .eraseblocks = { {256 * 1024, 1} },
16399 .block_erase = spi_block_erase_c7,
16400 }
16401 },
16402 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16403 .unlock = spi_disable_blockprotect,
16404 .write = spi_chip_write_256,
16405 .read = spi_chip_read,
16406 .voltage = {2700, 3600},
16407 },
16408
16409 {
16410 .vendor = "Zetta Device",
nybashcbb46e22018-02-11 17:53:49 -080016411 .name = "ZD25D40",
16412 .bustype = BUS_SPI,
16413 .manufacture_id = ZETTADEVICE_ID,
16414 .model_id = ZETTADEVICE_ZD25D40,
16415 .total_size = 512,
16416 .page_size = 256,
16417 .feature_bits = FEATURE_WRSR_WREN,
16418 .tested = TEST_UNTESTED,
16419 .probe = probe_spi_rdid,
16420 .probe_timing = TIMING_ZERO,
16421 .block_erasers =
16422 {
16423 {
16424 .eraseblocks = { {4 * 1024, 128} },
16425 .block_erase = spi_block_erase_20,
16426 }, {
16427 .eraseblocks = { {32 * 1024, 16} },
16428 .block_erase = spi_block_erase_52,
16429 }, {
16430 .eraseblocks = { {64 * 1024, 8} },
16431 .block_erase = spi_block_erase_d8,
16432 }, {
16433 .eraseblocks = { {512 * 1024, 1} },
16434 .block_erase = spi_block_erase_60,
16435 }, {
16436 .eraseblocks = { {512 * 1024, 1} },
16437 .block_erase = spi_block_erase_c7,
16438 }
16439 },
16440 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16441 .unlock = spi_disable_blockprotect,
16442 .write = spi_chip_write_256,
16443 .read = spi_chip_read,
16444 .voltage = {2700, 3600},
16445 },
16446
Stefan Taunerac1b4c82012-02-17 14:51:04 +000016447 {
16448 .vendor = "Unknown",
16449 .name = "SFDP-capable chip",
16450 .bustype = BUS_SPI,
16451 .manufacture_id = GENERIC_MANUF_ID,
16452 .model_id = SFDP_DEVICE_ID,
16453 /* We present our own "report this" text hence we do not
16454 * want the default "This flash part has status UNTESTED..."
16455 * text to be printed. */
16456 .tested = TEST_OK_PREW,
16457 .probe = probe_spi_sfdp,
16458 .unlock = spi_disable_blockprotect, /* is this safe? */
16459 .read = spi_chip_read,
16460 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000016461 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000016462 /* Everything below will be set by the probing function. */
16463 .write = NULL,
16464 .total_size = 0,
16465 .page_size = 0,
16466 .feature_bits = 0,
16467 .block_erasers = {},
16468 },
FENG yu ningff692fb2008-12-08 18:15:10 +000016469
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016470 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000016471 .vendor = "Programmer",
16472 .name = "Opaque flash chip",
16473 .bustype = BUS_PROG,
16474 .manufacture_id = PROGMANUF_ID,
16475 .model_id = PROGDEV_ID,
16476 .total_size = 0,
16477 .page_size = 256,
16478 /* probe is assumed to work, rest will be filled in by probe */
16479 .tested = TEST_OK_PROBE,
16480 .probe = probe_opaque,
16481 /* eraseblock sizes will be set by the probing function */
16482 .block_erasers =
16483 {
16484 {
16485 .block_erase = erase_opaque,
16486 }
16487 },
16488 .write = write_opaque,
16489 .read = read_opaque,
16490 },
16491
16492 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000016493 .vendor = "AMIC",
16494 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016495 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000016496 .manufacture_id = AMIC_ID,
16497 .model_id = GENERIC_DEVICE_ID,
16498 .total_size = 0,
16499 .page_size = 256,
16500 .tested = TEST_BAD_PREW,
16501 .probe = probe_spi_rdid4,
16502 .probe_timing = TIMING_ZERO,
16503 .write = NULL,
16504 .read = NULL,
16505 },
16506
16507 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016508 .vendor = "Atmel",
16509 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016510 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016511 .manufacture_id = ATMEL_ID,
16512 .model_id = GENERIC_DEVICE_ID,
16513 .total_size = 0,
16514 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016515 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016516 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016517 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016518 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016519 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016520 },
16521
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016522 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000016523 .vendor = "Eon",
16524 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016525 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016526 .manufacture_id = EON_ID_NOPREFIX,
16527 .model_id = GENERIC_DEVICE_ID,
16528 .total_size = 0,
16529 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016530 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016531 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016532 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016533 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016534 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016535 },
16536
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016537 {
16538 .vendor = "Macronix",
16539 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016540 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016541 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016542 .model_id = GENERIC_DEVICE_ID,
16543 .total_size = 0,
16544 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016545 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016546 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016547 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016548 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016549 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016550 },
16551
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016552 {
16553 .vendor = "PMC",
16554 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016555 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016556 .manufacture_id = PMC_ID,
16557 .model_id = GENERIC_DEVICE_ID,
16558 .total_size = 0,
16559 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016560 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016561 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016562 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016563 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016564 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016565 },
16566
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016567 {
16568 .vendor = "SST",
16569 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016570 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016571 .manufacture_id = SST_ID,
16572 .model_id = GENERIC_DEVICE_ID,
16573 .total_size = 0,
16574 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016575 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016576 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016577 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016578 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016579 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016580 },
16581
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016582 {
16583 .vendor = "ST",
16584 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016585 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016586 .manufacture_id = ST_ID,
16587 .model_id = GENERIC_DEVICE_ID,
16588 .total_size = 0,
16589 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016590 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016591 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016592 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016593 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016594 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016595 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000016596
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016597 {
Sean Nelson118e1d62009-11-24 02:08:11 +000016598 .vendor = "Sanyo",
16599 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016600 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000016601 .manufacture_id = SANYO_ID,
16602 .model_id = GENERIC_DEVICE_ID,
16603 .total_size = 0,
16604 .page_size = 256,
16605 .tested = TEST_BAD_PREW,
16606 .probe = probe_spi_rdid,
16607 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000016608 .write = NULL,
16609 .read = NULL,
16610 },
16611
16612 {
Stefan Taunereb582572012-09-21 12:52:50 +000016613 .vendor = "Winbond",
16614 .name = "unknown Winbond (ex Nexcom) SPI chip",
16615 .bustype = BUS_SPI,
16616 .manufacture_id = WINBOND_NEX_ID,
16617 .model_id = GENERIC_DEVICE_ID,
16618 .total_size = 0,
16619 .page_size = 256,
16620 .tested = TEST_BAD_PREW,
16621 .probe = probe_spi_rdid,
16622 .probe_timing = TIMING_ZERO,
16623 .write = NULL,
16624 .read = NULL,
16625 },
16626
16627 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016628 .vendor = "Generic",
16629 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016630 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016631 .manufacture_id = GENERIC_MANUF_ID,
16632 .model_id = GENERIC_DEVICE_ID,
16633 .total_size = 0,
16634 .page_size = 256,
16635 .tested = TEST_BAD_PREW,
16636 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016637 .write = NULL,
16638 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000016639
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016640 {
16641 .vendor = "Generic",
16642 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016643 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016644 .manufacture_id = GENERIC_MANUF_ID,
16645 .model_id = GENERIC_DEVICE_ID,
16646 .total_size = 0,
16647 .page_size = 256,
16648 .tested = TEST_BAD_PREW,
16649 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016650 .write = NULL,
16651 },
16652
Stefan Tauner96658be2014-05-26 22:05:31 +000016653 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000016654};
Stefan Tauner96658be2014-05-26 22:05:31 +000016655
16656const unsigned int flashchips_size = ARRAY_SIZE(flashchips);