blob: 1ab4986fd3ce43457fe97a4785882ce51a6d4e72 [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",
2180 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002181 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002182 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002183 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002184 .total_size = 512,
2185 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002186 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002187 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002188 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002189 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002190 .block_erasers =
2191 {
2192 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002193 .eraseblocks = { {256, 2048} },
2194 .block_erase = spi_block_erase_81,
2195 }, {
2196 .eraseblocks = { {2 * 1024, 256} },
2197 .block_erase = spi_block_erase_50,
2198 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002199 .eraseblocks = { {4 * 1024, 128} },
2200 .block_erase = spi_block_erase_20,
2201 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002202 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002203 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002204 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002205 .write = spi_chip_write_1,
2206 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002207 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002208 },
2209
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002210 {
2211 .vendor = "Atmel",
2212 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002213 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002214 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002215 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002216 .total_size = 1024,
2217 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002218 .feature_bits = FEATURE_WRSR_WREN,
2219 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002220 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002221 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002222 .block_erasers =
2223 {
2224 {
2225 .eraseblocks = { {4 * 1024, 256} },
2226 .block_erase = spi_block_erase_20,
2227 }, {
2228 .eraseblocks = { {32 * 1024, 32} },
2229 .block_erase = spi_block_erase_52,
2230 }, {
2231 .eraseblocks = { {64 * 1024, 16} },
2232 .block_erase = spi_block_erase_d8,
2233 }, {
2234 .eraseblocks = { {1024 * 1024, 1} },
2235 .block_erase = spi_block_erase_60,
2236 }, {
2237 .eraseblocks = { {1024 * 1024, 1} },
2238 .block_erase = spi_block_erase_c7,
2239 }
2240 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002241 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002242 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002243 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002244 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002245 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002246 },
2247
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002248 {
2249 .vendor = "Atmel",
2250 .name = "AT26DF161",
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_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002254 .total_size = 2048,
2255 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002256 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002257 .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, 512} },
2264 .block_erase = spi_block_erase_20,
2265 }, {
2266 .eraseblocks = { {32 * 1024, 64} },
2267 .block_erase = spi_block_erase_52,
2268 }, {
2269 .eraseblocks = { {64 * 1024, 32} },
2270 .block_erase = spi_block_erase_d8,
2271 }, {
2272 .eraseblocks = { {2 * 1024 * 1024, 1} },
2273 .block_erase = spi_block_erase_60,
2274 }, {
2275 .eraseblocks = { {2 * 1024 * 1024, 1} },
2276 .block_erase = spi_block_erase_c7,
2277 }
2278 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002279 .printlock = spi_prettyprint_status_register_at25df,
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 = "AT26DF161A",
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_AT26DF161A,
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 Taunercecb2c52013-06-20 22:55:41 +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 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002317 .printlock = spi_prettyprint_status_register_at26df081a,
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
2324 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002325 /*{
2326 .vendor = "Atmel",
2327 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002328 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002329 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002330 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002331 .total_size = 4096,
2332 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002333 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002334 .tested = TEST_UNTESTED,
2335 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002336 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002337 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002338 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002339 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002340 .read = spi_chip_read,
2341 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002342
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002343 {
2344 .vendor = "Atmel",
2345 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002346 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002347 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002348 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002349 .total_size = 512,
2350 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002351 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002352 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002353 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002354 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002355 .block_erasers =
2356 {
2357 {
2358 .eraseblocks = { {4 * 1024, 128} },
2359 .block_erase = spi_block_erase_20,
2360 }, {
2361 .eraseblocks = { {32 * 1024, 16} },
2362 .block_erase = spi_block_erase_52,
2363 }, {
2364 .eraseblocks = { {64 * 1024, 8} },
2365 .block_erase = spi_block_erase_d8,
2366 }, {
2367 .eraseblocks = { {512 * 1024, 1} },
2368 .block_erase = spi_block_erase_60,
2369 }, {
2370 .eraseblocks = { {512 * 1024, 1} },
2371 .block_erase = spi_block_erase_c7,
2372 }
2373 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002374 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002375 .write = NULL /* Incompatible Page write */,
2376 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002377 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002378 },
2379
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 {
2381 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002382 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002383 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002384 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002385 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002386 .total_size = 64,
2387 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002388 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002389 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002390 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002391 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002392 .block_erasers =
2393 {
2394 {
2395 .eraseblocks = { {64 * 1024, 1} },
2396 .block_erase = erase_chip_block_jedec,
2397 }
2398 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002399 .write = write_jedec,
2400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002401 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002402 },
2403
2404 {
2405 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002406 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002407 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002408 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002409 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002410 .total_size = 128,
2411 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002412 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002413 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002414 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002415 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002416 .block_erasers =
2417 {
2418 {
2419 .eraseblocks = { {128 * 1024, 1} },
2420 .block_erase = erase_chip_block_jedec,
2421 }
2422 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002423 .write = write_jedec, /* FIXME */
2424 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002425 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002426 },
2427
2428 {
2429 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002430 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002431 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002432 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002433 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002434 .total_size = 256,
2435 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002436 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002437 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002438 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002439 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002440 .block_erasers =
2441 {
2442 {
2443 .eraseblocks = { {256 * 1024, 1} },
2444 .block_erase = erase_chip_block_jedec,
2445 }
2446 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002447 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002448 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002449 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002450 },
2451
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002452 {
2453 .vendor = "Atmel",
2454 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002455 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002456 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002457 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002458 .total_size = 512,
2459 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002460 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002461 .tested = TEST_UNTESTED,
2462 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002463 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002464 .block_erasers =
2465 {
2466 {
2467 .eraseblocks = { {512 * 1024, 1} },
2468 .block_erase = erase_chip_block_jedec,
2469 }
2470 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002471 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002472 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002473 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002474 },
2475
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002476 {
2477 .vendor = "Atmel",
2478 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002479 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002480 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002481 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002482 .total_size = 16896 /* No power of two sizes */,
2483 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002484 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002485 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2486 .feature_bits = FEATURE_OTP,
2487 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002488 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002489 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002490 .block_erasers =
2491 {
2492 {
2493 .eraseblocks = {
2494 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2495 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2496 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2497 },
2498 .block_erase = spi_erase_at45cs_sector,
2499 }
2500 },
2501 .printlock = spi_prettyprint_status_register_plain,
2502 .gran = write_gran_1056bytes,
2503 .write = spi_write_at45db,
2504 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002505 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002506 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002507
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002508 {
2509 .vendor = "Atmel",
2510 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002511 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002512 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002513 .model_id = ATMEL_AT45DB011D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002514 .total_size = 128 /* or 132, determined from status register */,
2515 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002516 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002517 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2518 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002519 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002520 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002521 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002522 .block_erasers =
2523 {
2524 {
2525 .eraseblocks = { {256, 512} },
2526 .block_erase = spi_erase_at45db_page,
2527 }, {
2528 .eraseblocks = { {8 * 256, 512/8} },
2529 .block_erase = spi_erase_at45db_block,
2530 }, {
2531 .eraseblocks = {
2532 {8 * 256, 1},
2533 {120 * 256, 1},
2534 {128 * 256, 3},
2535 },
2536 .block_erase = spi_erase_at45db_sector
2537 }, {
2538 .eraseblocks = { {128 * 1024, 1} },
2539 .block_erase = spi_erase_at45db_chip,
2540 }
2541 },
2542 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2543 .printlock = spi_prettyprint_status_register_at45db,
2544 /* granularity will be set by the probing function. */
2545 .write = spi_write_at45db,
2546 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002547 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002548 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002549
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002550 {
2551 .vendor = "Atmel",
2552 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002553 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002554 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002555 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002556 .total_size = 256 /* or 264, determined from status register */,
2557 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002558 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002559 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2560 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002561 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002562 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002563 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002564 .block_erasers =
2565 {
2566 {
2567 .eraseblocks = { {256, 1024} },
2568 .block_erase = spi_erase_at45db_page,
2569 }, {
2570 .eraseblocks = { {8 * 256, 1024/8} },
2571 .block_erase = spi_erase_at45db_block,
2572 }, {
2573 .eraseblocks = {
2574 {8 * 256, 1},
2575 {120 * 256, 1},
2576 {128 * 256, 7},
2577 },
2578 .block_erase = spi_erase_at45db_sector
2579 }, {
2580 .eraseblocks = { {256 * 1024, 1} },
2581 .block_erase = spi_erase_at45db_chip,
2582 }
2583 },
2584 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2585 .printlock = spi_prettyprint_status_register_at45db,
2586 /* granularity will be set by the probing function. */
2587 .write = spi_write_at45db,
2588 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002589 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002590 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002591
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002592 {
2593 .vendor = "Atmel",
2594 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002595 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002596 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002597 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002598 .total_size = 512 /* or 528, determined from status register */,
2599 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002600 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002601 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2602 .feature_bits = FEATURE_OTP,
2603 .tested = TEST_OK_PREW,
2604 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002605 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002606 .block_erasers =
2607 {
2608 {
2609 .eraseblocks = { {256, 2048} },
2610 .block_erase = spi_erase_at45db_page,
2611 }, {
2612 .eraseblocks = { {8 * 256, 2048/8} },
2613 .block_erase = spi_erase_at45db_block,
2614 }, {
2615 .eraseblocks = {
2616 {8 * 256, 1},
2617 {248 * 256, 1},
2618 {256 * 256, 7},
2619 },
2620 .block_erase = spi_erase_at45db_sector
2621 }, {
2622 .eraseblocks = { {512 * 1024, 1} },
2623 .block_erase = spi_erase_at45db_chip,
2624 }
2625 },
2626 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2627 .printlock = spi_prettyprint_status_register_at45db,
2628 /* granularity will be set by the probing function. */
2629 .write = spi_write_at45db,
2630 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2631 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002632 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002633
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002634 {
2635 .vendor = "Atmel",
2636 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002637 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002638 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002639 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002640 .total_size = 1024 /* or 1056, determined from status register */,
2641 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002642 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002643 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2644 .feature_bits = FEATURE_OTP,
2645 .tested = TEST_UNTESTED,
2646 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002647 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002648 .block_erasers =
2649 {
2650 {
2651 .eraseblocks = { {256, 4096} },
2652 .block_erase = spi_erase_at45db_page,
2653 }, {
2654 .eraseblocks = { {8 * 256, 4096/8} },
2655 .block_erase = spi_erase_at45db_block,
2656 }, {
2657 .eraseblocks = {
2658 {8 * 256, 1},
2659 {248 * 256, 1},
2660 {256 * 256, 15},
2661 },
2662 .block_erase = spi_erase_at45db_sector
2663 }, {
2664 .eraseblocks = { {1024 * 1024, 1} },
2665 .block_erase = spi_erase_at45db_chip,
2666 }
2667 },
2668 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2669 .printlock = spi_prettyprint_status_register_at45db,
2670 /* granularity will be set by the probing function. */
2671 .write = spi_write_at45db,
2672 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002673 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002674 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002675
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002676 {
2677 .vendor = "Atmel",
2678 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002679 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002680 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002681 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002682 .total_size = 2048 /* or 2112, determined from status register */,
2683 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002684 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002685 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2686 .feature_bits = FEATURE_OTP,
2687 .tested = TEST_OK_PREW,
2688 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002689 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002690 .block_erasers =
2691 {
2692 {
2693 .eraseblocks = { {512, 4096} },
2694 .block_erase = spi_erase_at45db_page,
2695 }, {
2696 .eraseblocks = { {8 * 512, 4096/8} },
2697 .block_erase = spi_erase_at45db_block,
2698 }, {
2699 .eraseblocks = {
2700 {8 * 512, 1},
2701 {248 * 512, 1},
2702 {256 * 512, 15},
2703 },
2704 .block_erase = spi_erase_at45db_sector
2705 }, {
2706 .eraseblocks = { {2048 * 1024, 1} },
2707 .block_erase = spi_erase_at45db_chip,
2708 }
2709 },
2710 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2711 .printlock = spi_prettyprint_status_register_at45db,
2712 /* granularity will be set by the probing function. */
2713 .write = spi_write_at45db,
2714 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002715 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002716 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002717
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002718 {
2719 .vendor = "Atmel",
2720 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002721 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002722 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002723 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002724 .total_size = 4224 /* No power of two sizes */,
2725 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002726 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002727 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2728 .feature_bits = FEATURE_OTP,
2729 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002730 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002731 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002732 .block_erasers =
2733 {
2734 {
2735 .eraseblocks = { {528, 8192} },
2736 .block_erase = spi_erase_at45db_page,
2737 }, {
2738 .eraseblocks = { {8 * 528, 8192/8} },
2739 .block_erase = spi_erase_at45db_block,
2740 }, /* Although the datasheets describes sectors (which can be write protected)
2741 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00002742 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002743 .eraseblocks = {
2744 {8 * 528, 1},
2745 {120 * 528, 1},
2746 {128 * 528, 63},
2747 },
2748 .block_erase = spi_erase_at45db_sector
2749 }, */ {
2750 .eraseblocks = { {4224 * 1024, 1} },
2751 .block_erase = spi_erase_at45db_chip,
2752 }
2753 },
2754 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2755 .gran = write_gran_528bytes,
2756 .write = spi_write_at45db,
2757 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002758 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002759 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002760
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002761 {
2762 .vendor = "Atmel",
2763 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002764 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002765 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002766 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002767 .total_size = 4096 /* or 4224, determined from status register */,
2768 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002769 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002770 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002771 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00002772 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002773 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002774 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002775 .block_erasers =
2776 {
2777 {
2778 .eraseblocks = { {512, 8192} },
2779 .block_erase = spi_erase_at45db_page,
2780 }, {
2781 .eraseblocks = { {8 * 512, 8192/8} },
2782 .block_erase = spi_erase_at45db_block,
2783 }, {
2784 .eraseblocks = {
2785 {8 * 512, 1},
2786 {120 * 512, 1},
2787 {128 * 512, 63},
2788 },
2789 .block_erase = spi_erase_at45db_sector
2790 }, {
2791 .eraseblocks = { {4096 * 1024, 1} },
2792 .block_erase = spi_erase_at45db_chip,
2793 }
2794 },
2795 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2796 .printlock = spi_prettyprint_status_register_at45db,
2797 /* granularity will be set by the probing function. */
2798 .write = spi_write_at45db,
2799 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2800 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2801 },
2802
2803 {
2804 .vendor = "Atmel",
2805 .name = "AT45DB321E",
2806 .bustype = BUS_SPI,
2807 .manufacture_id = ATMEL_ID,
2808 .model_id = ATMEL_AT45DB321C,
2809 .total_size = 4096 /* or 4224, determined from status register */,
2810 .page_size = 512 /* or 528, determined from status register */,
2811 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2812 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2813 .feature_bits = FEATURE_OTP,
2814 .tested = TEST_UNTESTED,
2815 .probe = probe_spi_at45db,
2816 .probe_timing = TIMING_ZERO,
2817 .block_erasers =
2818 {
2819 {
2820 .eraseblocks = { {512, 8192} },
2821 .block_erase = spi_erase_at45db_page,
2822 }, {
2823 .eraseblocks = { {8 * 512, 8192/8} },
2824 .block_erase = spi_erase_at45db_block,
2825 }, {
2826 .eraseblocks = {
2827 {8 * 512, 1},
2828 {120 * 512, 1},
2829 {128 * 512, 63},
2830 },
2831 .block_erase = spi_erase_at45db_sector
2832 }, {
2833 .eraseblocks = { {4096 * 1024, 1} },
2834 .block_erase = spi_erase_at45db_chip,
2835 }
2836 },
2837 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2838 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2839 /* granularity will be set by the probing function. */
2840 .write = spi_write_at45db,
2841 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2842 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002843 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002844
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002845 {
2846 .vendor = "Atmel",
2847 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002848 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002849 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002850 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002851 .total_size = 8192 /* or 8448, determined from status register */,
2852 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002853 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002854 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2855 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002856 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002857 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002858 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002859 .block_erasers =
2860 {
2861 {
2862 .eraseblocks = { {1024, 8192} },
2863 .block_erase = spi_erase_at45db_page,
2864 }, {
2865 .eraseblocks = { {8 * 1024, 8192/8} },
2866 .block_erase = spi_erase_at45db_block,
2867 }, {
2868 .eraseblocks = {
2869 {8 * 1024, 1},
2870 {248 * 1024, 1},
2871 {256 * 1024, 31},
2872 },
2873 .block_erase = spi_erase_at45db_sector
2874 }, {
2875 .eraseblocks = { {8192 * 1024, 1} },
2876 .block_erase = spi_erase_at45db_chip,
2877 }
2878 },
2879 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2880 .printlock = spi_prettyprint_status_register_at45db,
2881 /* granularity will be set by the probing function. */
2882 .write = spi_write_at45db,
2883 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002884 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002885 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002886
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002887 {
2888 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002889 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002890 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002891 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002892 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002893 .total_size = 64,
2894 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002895 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002896 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002897 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002898 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002899 .block_erasers =
2900 {
2901 {
2902 .eraseblocks = { {64 * 1024, 1} },
2903 .block_erase = erase_chip_block_jedec,
2904 }
2905 },
Sean Nelson35727f72010-01-28 23:55:12 +00002906 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002907 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002908 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002909 },
2910
2911 {
2912 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002913 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002914 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002915 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002916 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002917 .total_size = 256,
2918 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002919 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002920 .tested = TEST_UNTESTED,
2921 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002922 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002923 .block_erasers =
2924 {
2925 {
2926 .eraseblocks = {
2927 {16 * 1024, 1},
2928 {8 * 1024, 2},
2929 {96 * 1024, 1},
2930 {128 * 1024, 1},
2931 },
2932 .block_erase = erase_sector_jedec,
2933 }, {
2934 .eraseblocks = { {256 * 1024, 1} },
2935 .block_erase = erase_chip_block_jedec,
2936 }
2937 },
Sean Nelson35727f72010-01-28 23:55:12 +00002938 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002939 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002940 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002941 },
2942
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002943 {
2944 .vendor = "Atmel",
2945 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002946 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002947 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002948 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002949 .total_size = 256,
2950 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002951 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002952 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002953 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002954 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002955 .block_erasers =
2956 {
2957 {
2958 .eraseblocks = {
2959 {128 * 1024, 1},
2960 {96 * 1024, 1},
2961 {8 * 1024, 2},
2962 {16 * 1024, 1},
2963 },
2964 .block_erase = erase_sector_jedec,
2965 }, {
2966 .eraseblocks = { {256 * 1024, 1} },
2967 .block_erase = erase_chip_block_jedec,
2968 }
2969 },
Sean Nelson35727f72010-01-28 23:55:12 +00002970 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002971 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002972 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002973 },
2974
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002975 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002976 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002977 .name = "AT49(H)F010",
2978 .bustype = BUS_PARALLEL,
2979 .manufacture_id = ATMEL_ID,
2980 .model_id = ATMEL_AT49F010,
2981 .total_size = 128,
2982 .page_size = 0, /* unused */
2983 .feature_bits = FEATURE_EITHER_RESET,
2984 .tested = TEST_OK_PREW,
2985 .probe = probe_jedec,
2986 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2987 .block_erasers =
2988 {
2989 {
2990 .eraseblocks = { {128 * 1024, 1} },
2991 .block_erase = erase_chip_block_jedec,
2992 }
2993 },
2994 .printlock = printlock_at49f,
2995 .write = write_jedec_1,
2996 .read = read_memmapped,
2997 .voltage = {4500, 5500},
2998 },
2999
3000 {
3001 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003002 .name = "AT49F020",
3003 .bustype = BUS_PARALLEL,
3004 .manufacture_id = ATMEL_ID,
3005 .model_id = ATMEL_AT49F020,
3006 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003007 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003008 .feature_bits = FEATURE_EITHER_RESET,
3009 .tested = TEST_OK_PRE,
3010 .probe = probe_jedec,
3011 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3012 .block_erasers =
3013 {
3014 {
3015 .eraseblocks = { {256 * 1024, 1} },
3016 .block_erase = erase_chip_block_jedec,
3017 }
3018 /* Chip features an optional permanent write protection
3019 * of the first 8 kB. The erase function is the same as
3020 * above, but 00000H to 01FFFH will not be erased.
3021 * FIXME: add another eraser when partial erasers are
3022 * supported.
3023 */
3024 },
3025 .printlock = printlock_at49f,
3026 .write = write_jedec_1,
3027 .read = read_memmapped,
3028 .voltage = {4500, 5500},
3029 },
3030
3031 {
3032 .vendor = "Atmel",
3033 .name = "AT49F040",
3034 .bustype = BUS_PARALLEL,
3035 .manufacture_id = ATMEL_ID,
3036 .model_id = ATMEL_AT49F040,
3037 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003038 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003039 .feature_bits = FEATURE_EITHER_RESET,
3040 .tested = TEST_UNTESTED,
3041 .probe = probe_jedec,
3042 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3043 .block_erasers =
3044 {
3045 {
3046 .eraseblocks = { {512 * 1024, 1} },
3047 .block_erase = erase_chip_block_jedec,
3048 }
3049 /* Chip features an optional permanent write protection
3050 * of the first 16 kB. The erase function is the same as
3051 * above, but 00000H to 03FFFH will not be erased.
3052 * FIXME: add another eraser when partial erasers are
3053 * supported.
3054 */
3055 },
3056 .printlock = printlock_at49f,
3057 .write = write_jedec_1,
3058 .read = read_memmapped,
3059 .voltage = {4500, 5500},
3060 },
3061
3062 {
3063 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003064 .name = "AT49F080",
3065 .bustype = BUS_PARALLEL,
3066 .manufacture_id = ATMEL_ID,
3067 .model_id = ATMEL_AT49F080,
3068 .total_size = 1024,
3069 .page_size = 0, /* unused */
3070 .feature_bits = FEATURE_EITHER_RESET,
3071 .tested = TEST_UNTESTED,
3072 .probe = probe_jedec,
3073 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3074 .block_erasers =
3075 {
3076 {
3077 .eraseblocks = { {1024 * 1024, 1} },
3078 .block_erase = erase_chip_block_jedec,
3079 }
3080 /* Chip features an optional permanent write protection
3081 * of the first 16 kB. The erase function is the same as
3082 * above, but 00000H to 03FFFH will not be erased.
3083 * FIXME: add another eraser when partial erasers are
3084 * supported.
3085 */
3086 },
3087 .printlock = printlock_at49f,
3088 .write = write_jedec_1,
3089 .read = read_memmapped,
3090 .voltage = {4500, 5500},
3091 },
3092
3093 {
3094 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3095 .vendor = "Atmel",
3096 .name = "AT49F080T",
3097 .bustype = BUS_PARALLEL,
3098 .manufacture_id = ATMEL_ID,
3099 .model_id = ATMEL_AT49F080T,
3100 .total_size = 1024,
3101 .page_size = 0, /* unused */
3102 .feature_bits = FEATURE_EITHER_RESET,
3103 .tested = TEST_UNTESTED,
3104 .probe = probe_jedec,
3105 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3106 .block_erasers =
3107 {
3108 {
3109 .eraseblocks = { {1024 * 1024, 1} },
3110 .block_erase = erase_chip_block_jedec,
3111 }
3112 /* Chip features an optional permanent write protection
3113 * of the first 16 kB. The erase function is the same as
3114 * above, but FC000H to FFFFFH will not be erased.
3115 * FIXME: add another eraser when partial erasers are
3116 * supported.
3117 */
3118 },
3119 .printlock = printlock_at49f,
3120 .write = write_jedec_1,
3121 .read = read_memmapped,
3122 .voltage = {4500, 5500},
3123 },
3124
3125 {
3126 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003127 .name = "AT49LH002",
3128 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3129 .manufacture_id = ATMEL_ID,
3130 .model_id = ATMEL_AT49LH002,
3131 .total_size = 256,
3132 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003133 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003134 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003135 .probe = probe_82802ab,
3136 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003137 .block_erasers =
3138 {
3139 {
3140 .eraseblocks = {
3141 {64 * 1024, 3},
3142 {32 * 1024, 1},
3143 {8 * 1024, 2},
3144 {16 * 1024, 1},
3145 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003146 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003147 }, {
3148 .eraseblocks = {
3149 {64 * 1024, 4},
3150 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003151 .block_erase = erase_block_82802ab,
3152 },
3153 },
3154 .printlock = printlock_regspace2_block_eraser_0,
3155 .unlock = unlock_regspace2_block_eraser_0,
3156 .write = write_82802ab,
3157 .read = read_memmapped,
3158 .voltage = {3000, 3600},
3159 },
3160
3161 {
3162 .vendor = "Atmel",
3163 .name = "AT49LH00B4",
3164 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3165 .manufacture_id = ATMEL_ID,
3166 .model_id = ATMEL_AT49LH00B4,
3167 .total_size = 512,
3168 .page_size = 0, /* unused */
3169 .feature_bits = FEATURE_REGISTERMAP,
3170 .tested = TEST_UNTESTED,
3171 .probe = probe_82802ab,
3172 .probe_timing = TIMING_ZERO,
3173 .block_erasers =
3174 {
3175 {
3176 .eraseblocks = {
3177 {8 * 1024, 2},
3178 {16 * 1024, 1},
3179 {32 * 1024, 1},
3180 {64 * 1024, 7},
3181 },
3182 .block_erase = NULL, /* TODO: Implement. */
3183 }, {
3184 .eraseblocks = {
3185 {64 * 1024, 8},
3186 },
3187 .block_erase = erase_block_82802ab,
3188 },
3189 },
3190 .printlock = printlock_regspace2_block_eraser_0,
3191 .unlock = unlock_regspace2_block_eraser_0,
3192 .write = write_82802ab,
3193 .read = read_memmapped,
3194 .voltage = {3000, 3600},
3195 },
3196
3197 {
3198 .vendor = "Atmel",
3199 .name = "AT49LH004",
3200 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3201 .manufacture_id = ATMEL_ID,
3202 .model_id = ATMEL_AT49LH004,
3203 .total_size = 512,
3204 .page_size = 0, /* unused */
3205 .feature_bits = FEATURE_REGISTERMAP,
3206 .tested = TEST_UNTESTED,
3207 .probe = probe_82802ab,
3208 .probe_timing = TIMING_ZERO,
3209 .block_erasers =
3210 {
3211 {
3212 .eraseblocks = {
3213 {64 * 1024, 7},
3214 {32 * 1024, 1},
3215 {8 * 1024, 2},
3216 {16 * 1024, 1},
3217 },
3218 .block_erase = erase_block_82802ab,
3219 }, {
3220 .eraseblocks = {
3221 {64 * 1024, 8},
3222 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003223 .block_erase = NULL, /* TODO: Implement. */
3224 },
3225 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003226 .printlock = printlock_regspace2_block_eraser_0,
3227 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003228 .write = write_82802ab,
3229 .read = read_memmapped,
3230 .voltage = {3000, 3600},
3231 },
3232
3233 {
Andrew Morganca081462011-09-13 22:05:44 +00003234 .vendor = "Catalyst",
3235 .name = "CAT28F512",
3236 .bustype = BUS_PARALLEL,
3237 .manufacture_id = CATALYST_ID,
3238 .model_id = CATALYST_CAT28F512,
3239 .total_size = 64,
3240 .page_size = 0, /* unused */
3241 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003242 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003243 .probe = probe_jedec, /* FIXME! */
3244 .probe_timing = TIMING_ZERO,
3245 .block_erasers =
3246 {
3247 {
3248 .eraseblocks = { {64 * 1024, 1} },
3249 .block_erase = NULL, /* TODO */
3250 },
3251 },
3252 .write = NULL, /* TODO */
3253 .read = read_memmapped,
3254 .voltage = {4500, 5500},
3255 },
3256
3257 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003258 .vendor = "Bright",
3259 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003260 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003261 .manufacture_id = BRIGHT_ID,
3262 .model_id = BRIGHT_BM29F040,
3263 .total_size = 512,
3264 .page_size = 64 * 1024,
3265 .feature_bits = FEATURE_EITHER_RESET,
3266 .tested = TEST_OK_PR,
3267 .probe = probe_jedec,
3268 .probe_timing = TIMING_ZERO,
3269 .block_erasers =
3270 {
3271 {
3272 .eraseblocks = { {64 * 1024, 8} },
3273 .block_erase = erase_sector_jedec,
3274 }, {
3275 .eraseblocks = { {512 * 1024, 1} },
3276 .block_erase = erase_chip_block_jedec,
3277 },
3278 },
3279 .write = write_jedec_1,
3280 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003281 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003282 },
3283
3284 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003285 .vendor = "ENE",
3286 .name = "KB9012 (EDI)",
3287 .bustype = BUS_SPI,
3288 .spi_cmd_set = SPI_EDI,
3289 .total_size = 128,
3290 .page_size = 128,
3291 .feature_bits = FEATURE_ERASED_ZERO,
3292 .tested = TEST_OK_PREW,
3293 .probe = edi_probe_kb9012,
3294 .probe_timing = TIMING_ZERO,
3295 .block_erasers =
3296 {
3297 {
3298 .eraseblocks = { {128, 1024} },
3299 .block_erase = edi_chip_block_erase,
3300 },
3301 },
3302 .gran = write_gran_128bytes,
3303 .write = edi_chip_write,
3304 .read = edi_chip_read,
3305 .voltage = {2700, 3600},
3306 },
3307
3308 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003309 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003310 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003311 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003312 .manufacture_id = ESMT_ID,
3313 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003314 .total_size = 256,
3315 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003316 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003317 .tested = TEST_UNTESTED,
3318 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003319 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003320 .block_erasers =
3321 {
3322 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003323 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003324 {128 * 1024, 1},
3325 {96 * 1024, 1},
3326 {8 * 1024, 2},
3327 {16 * 1024, 1},
3328 },
3329 .block_erase = erase_sector_jedec,
3330 }, {
3331 .eraseblocks = { {256 * 1024, 1} },
3332 .block_erase = erase_chip_block_jedec,
3333 }
3334 },
Sean Nelson35727f72010-01-28 23:55:12 +00003335 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003336 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003337 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003338 },
3339
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003340 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003341 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003342 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003343 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003344 .manufacture_id = ESMT_ID,
3345 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003346 .total_size = 1024,
3347 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003348 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003349 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003350 .probe = probe_spi_rdid,
3351 .probe_timing = TIMING_ZERO,
3352 .block_erasers =
3353 {
3354 {
3355 .eraseblocks = { {4 * 1024, 256} },
3356 .block_erase = spi_block_erase_20,
3357 }, {
3358 .eraseblocks = { {64 * 1024, 16} },
3359 .block_erase = spi_block_erase_d8,
3360 }, {
3361 .eraseblocks = { {1024 * 1024, 1} },
3362 .block_erase = spi_block_erase_60,
3363 }, {
3364 .eraseblocks = { {1024 * 1024, 1} },
3365 .block_erase = spi_block_erase_c7,
3366 }
3367 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003368 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003369 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003370 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003371 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003372 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003373 },
3374
3375 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003376 .vendor = "ESMT",
3377 .name = "F25L32PA",
3378 .bustype = BUS_SPI,
3379 .manufacture_id = ESMT_ID,
3380 .model_id = ESMT_F25L32PA,
3381 .total_size = 4096,
3382 .page_size = 256,
3383 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3384 .tested = TEST_UNTESTED,
3385 .probe = probe_spi_rdid,
3386 .probe_timing = TIMING_ZERO,
3387 .block_erasers =
3388 {
3389 {
3390 .eraseblocks = { {4 * 1024, 1024} },
3391 .block_erase = spi_block_erase_20,
3392 }, {
3393 .eraseblocks = { {64 * 1024, 64} },
3394 .block_erase = spi_block_erase_d8,
3395 }, {
3396 .eraseblocks = { {4 * 1024 * 1024, 1} },
3397 .block_erase = spi_block_erase_60,
3398 }, {
3399 .eraseblocks = { {4 * 1024 * 1024, 1} },
3400 .block_erase = spi_block_erase_c7,
3401 }
3402 },
3403 .printlock = spi_prettyprint_status_register_bp2_bpl,
3404 .unlock = spi_disable_blockprotect,
3405 .write = spi_chip_write_256,
3406 .read = spi_chip_read,
3407 .voltage = {2700, 3600},
3408 },
3409
3410 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003411 .vendor = "Eon",
3412 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003413 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003414 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003415 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003416 .total_size = 64,
3417 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003418 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003419 .tested = TEST_UNTESTED,
3420 .probe = probe_spi_rdid,
3421 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003422 .block_erasers =
3423 {
3424 {
3425 .eraseblocks = {
3426 {4 * 1024, 2},
3427 {8 * 1024, 1},
3428 {16 * 1024, 1},
3429 {32 * 1024, 1},
3430 },
3431 .block_erase = spi_block_erase_d8,
3432 }, {
3433 .eraseblocks = { {64 * 1024, 1} },
3434 .block_erase = spi_block_erase_c7,
3435 }
3436 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003438 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003439 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003440 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003441 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003442 },
3443
3444 {
3445 .vendor = "Eon",
3446 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003447 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003448 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003449 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003450 .total_size = 64,
3451 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003452 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003453 .tested = TEST_UNTESTED,
3454 .probe = probe_spi_rdid,
3455 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003456 .block_erasers =
3457 {
3458 {
3459 .eraseblocks = {
3460 {32 * 1024, 1},
3461 {16 * 1024, 1},
3462 {8 * 1024, 1},
3463 {4 * 1024, 2},
3464 },
3465 .block_erase = spi_block_erase_d8,
3466 }, {
3467 .eraseblocks = { {64 * 1024, 1} },
3468 .block_erase = spi_block_erase_c7,
3469 }
3470 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003471 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003472 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003473 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003474 .read = spi_chip_read, /* Fast read (0x0B) supported */
3475 .voltage = {2700, 3600},
3476 },
3477
3478 {
3479 .vendor = "Eon",
3480 .name = "EN25P05",
3481 .bustype = BUS_SPI,
3482 .manufacture_id = EON_ID_NOPREFIX,
3483 .model_id = EON_EN25B05,
3484 .total_size = 64,
3485 .page_size = 256,
3486 .feature_bits = FEATURE_WRSR_WREN,
3487 .tested = TEST_UNTESTED,
3488 .probe = probe_spi_rdid,
3489 .probe_timing = TIMING_ZERO,
3490 .block_erasers =
3491 {
3492 {
3493 .eraseblocks = {
3494 {32 * 1024, 2} },
3495 .block_erase = spi_block_erase_d8,
3496 }, {
3497 .eraseblocks = { {64 * 1024, 1} },
3498 .block_erase = spi_block_erase_c7,
3499 }
3500 },
3501 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3502 .unlock = spi_disable_blockprotect,
3503 .write = spi_chip_write_256,
3504 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003505 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003506 },
3507
3508 {
3509 .vendor = "Eon",
3510 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003511 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003512 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003513 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003514 .total_size = 128,
3515 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003516 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003517 .tested = TEST_UNTESTED,
3518 .probe = probe_spi_rdid,
3519 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003520 .block_erasers =
3521 {
3522 {
3523 .eraseblocks = {
3524 {4 * 1024, 2},
3525 {8 * 1024, 1},
3526 {16 * 1024, 1},
3527 {32 * 1024, 3},
3528 },
3529 .block_erase = spi_block_erase_d8,
3530 }, {
3531 .eraseblocks = { {128 * 1024, 1} },
3532 .block_erase = spi_block_erase_c7,
3533 }
3534 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003535 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003536 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003537 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003538 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003539 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003540 },
3541
3542 {
3543 .vendor = "Eon",
3544 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003545 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003546 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003547 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003548 .total_size = 128,
3549 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003550 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003551 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003552 .probe = probe_spi_rdid,
3553 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003554 .block_erasers =
3555 {
3556 {
3557 .eraseblocks = {
3558 {32 * 1024, 3},
3559 {16 * 1024, 1},
3560 {8 * 1024, 1},
3561 {4 * 1024, 2},
3562 },
3563 .block_erase = spi_block_erase_d8,
3564 }, {
3565 .eraseblocks = { {128 * 1024, 1} },
3566 .block_erase = spi_block_erase_c7,
3567 }
3568 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003569 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003570 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003571 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003572 .read = spi_chip_read, /* Fast read (0x0B) supported */
3573 .voltage = {2700, 3600},
3574 },
3575
3576 {
3577 .vendor = "Eon",
3578 .name = "EN25P10",
3579 .bustype = BUS_SPI,
3580 .manufacture_id = EON_ID_NOPREFIX,
3581 .model_id = EON_EN25B10,
3582 .total_size = 128,
3583 .page_size = 256,
3584 .feature_bits = FEATURE_WRSR_WREN,
3585 .tested = TEST_UNTESTED,
3586 .probe = probe_spi_rdid,
3587 .probe_timing = TIMING_ZERO,
3588 .block_erasers =
3589 {
3590 {
3591 .eraseblocks = { {32 * 1024, 4} },
3592 .block_erase = spi_block_erase_d8,
3593 }, {
3594 .eraseblocks = { {128 * 1024, 1} },
3595 .block_erase = spi_block_erase_c7,
3596 }
3597 },
3598 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3599 .unlock = spi_disable_blockprotect,
3600 .write = spi_chip_write_256,
3601 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003602 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003603 },
3604
3605 {
3606 .vendor = "Eon",
3607 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003608 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003609 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003610 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003611 .total_size = 256,
3612 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003613 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003614 .tested = TEST_UNTESTED,
3615 .probe = probe_spi_rdid,
3616 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003617 .block_erasers =
3618 {
3619 {
3620 .eraseblocks = {
3621 {4 * 1024, 2},
3622 {8 * 1024, 1},
3623 {16 * 1024, 1},
3624 {32 * 1024, 1},
3625 {64 * 1024, 3}
3626 },
3627 .block_erase = spi_block_erase_d8,
3628 }, {
3629 .eraseblocks = { {256 * 1024, 1} },
3630 .block_erase = spi_block_erase_c7,
3631 }
3632 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003633 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003634 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003635 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003636 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003637 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003638 },
3639
3640 {
3641 .vendor = "Eon",
3642 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003643 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003644 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003645 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003646 .total_size = 256,
3647 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003648 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003649 .tested = TEST_UNTESTED,
3650 .probe = probe_spi_rdid,
3651 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003652 .block_erasers =
3653 {
3654 {
3655 .eraseblocks = {
3656 {64 * 1024, 3},
3657 {32 * 1024, 1},
3658 {16 * 1024, 1},
3659 {8 * 1024, 1},
3660 {4 * 1024, 2},
3661 },
3662 .block_erase = spi_block_erase_d8,
3663 }, {
3664 .eraseblocks = { {256 * 1024, 1} },
3665 .block_erase = spi_block_erase_c7,
3666 }
3667 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003668 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003669 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003670 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003671 .read = spi_chip_read, /* Fast read (0x0B) supported */
3672 .voltage = {2700, 3600},
3673 },
3674
3675 {
3676 .vendor = "Eon",
3677 .name = "EN25P20",
3678 .bustype = BUS_SPI,
3679 .manufacture_id = EON_ID_NOPREFIX,
3680 .model_id = EON_EN25B20,
3681 .total_size = 256,
3682 .page_size = 256,
3683 .feature_bits = FEATURE_WRSR_WREN,
3684 .tested = TEST_UNTESTED,
3685 .probe = probe_spi_rdid,
3686 .probe_timing = TIMING_ZERO,
3687 .block_erasers =
3688 {
3689 {
3690 .eraseblocks = { {64 * 1024, 4} },
3691 .block_erase = spi_block_erase_d8,
3692 }, {
3693 .eraseblocks = { {256 * 1024, 1} },
3694 .block_erase = spi_block_erase_c7,
3695 }
3696 },
3697 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3698 .unlock = spi_disable_blockprotect,
3699 .write = spi_chip_write_256,
3700 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003701 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003702 },
3703
3704 {
3705 .vendor = "Eon",
3706 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003707 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003708 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003709 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003710 .total_size = 512,
3711 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003712 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003713 .tested = TEST_UNTESTED,
3714 .probe = probe_spi_rdid,
3715 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003716 .block_erasers =
3717 {
3718 {
3719 .eraseblocks = {
3720 {4 * 1024, 2},
3721 {8 * 1024, 1},
3722 {16 * 1024, 1},
3723 {32 * 1024, 1},
3724 {64 * 1024, 7}
3725 },
3726 .block_erase = spi_block_erase_d8,
3727 }, {
3728 .eraseblocks = { {512 * 1024, 1} },
3729 .block_erase = spi_block_erase_c7,
3730 }
3731 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003732 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003733 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003734 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003735 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003736 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003737 },
3738
3739 {
3740 .vendor = "Eon",
3741 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003742 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003743 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003744 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003745 .total_size = 512,
3746 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003747 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003748 .tested = TEST_UNTESTED,
3749 .probe = probe_spi_rdid,
3750 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003751 .block_erasers =
3752 {
3753 {
3754 .eraseblocks = {
3755 {64 * 1024, 7},
3756 {32 * 1024, 1},
3757 {16 * 1024, 1},
3758 {8 * 1024, 1},
3759 {4 * 1024, 2},
3760 },
3761 .block_erase = spi_block_erase_d8,
3762 }, {
3763 .eraseblocks = { {512 * 1024, 1} },
3764 .block_erase = spi_block_erase_c7,
3765 }
3766 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003767 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003768 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003769 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003770 .read = spi_chip_read, /* Fast read (0x0B) supported */
3771 .voltage = {2700, 3600},
3772 },
3773
3774 {
3775 .vendor = "Eon",
3776 .name = "EN25P40",
3777 .bustype = BUS_SPI,
3778 .manufacture_id = EON_ID_NOPREFIX,
3779 .model_id = EON_EN25B40,
3780 .total_size = 512,
3781 .page_size = 256,
3782 .feature_bits = FEATURE_WRSR_WREN,
3783 .tested = TEST_UNTESTED,
3784 .probe = probe_spi_rdid,
3785 .probe_timing = TIMING_ZERO,
3786 .block_erasers =
3787 {
3788 {
3789 .eraseblocks = { {64 * 1024, 8} },
3790 .block_erase = spi_block_erase_d8,
3791 }, {
3792 .eraseblocks = { {512 * 1024, 1} },
3793 .block_erase = spi_block_erase_c7,
3794 }
3795 },
3796 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3797 .unlock = spi_disable_blockprotect,
3798 .write = spi_chip_write_256,
3799 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003800 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003801 },
3802
3803 {
3804 .vendor = "Eon",
3805 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003806 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003807 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003808 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003809 .total_size = 1024,
3810 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003811 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003812 .tested = TEST_UNTESTED,
3813 .probe = probe_spi_rdid,
3814 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003815 .block_erasers =
3816 {
3817 {
3818 .eraseblocks = {
3819 {4 * 1024, 2},
3820 {8 * 1024, 1},
3821 {16 * 1024, 1},
3822 {32 * 1024, 1},
3823 {64 * 1024, 15}
3824 },
3825 .block_erase = spi_block_erase_d8,
3826 }, {
3827 .eraseblocks = { {1024 * 1024, 1} },
3828 .block_erase = spi_block_erase_c7,
3829 }
3830 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003831 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003832 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003833 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003834 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003835 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003836 },
3837
3838 {
3839 .vendor = "Eon",
3840 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003841 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003842 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003843 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003844 .total_size = 1024,
3845 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003846 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003847 .tested = TEST_UNTESTED,
3848 .probe = probe_spi_rdid,
3849 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003850 .block_erasers =
3851 {
3852 {
3853 .eraseblocks = {
3854 {64 * 1024, 15},
3855 {32 * 1024, 1},
3856 {16 * 1024, 1},
3857 {8 * 1024, 1},
3858 {4 * 1024, 2},
3859 },
3860 .block_erase = spi_block_erase_d8,
3861 }, {
3862 .eraseblocks = { {1024 * 1024, 1} },
3863 .block_erase = spi_block_erase_c7,
3864 }
3865 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003866 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003867 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003868 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003869 .read = spi_chip_read, /* Fast read (0x0B) supported */
3870 .voltage = {2700, 3600},
3871 },
3872
3873 {
3874 .vendor = "Eon",
3875 .name = "EN25P80",
3876 .bustype = BUS_SPI,
3877 .manufacture_id = EON_ID_NOPREFIX,
3878 .model_id = EON_EN25B80,
3879 .total_size = 1024,
3880 .page_size = 256,
3881 .feature_bits = FEATURE_WRSR_WREN,
3882 .tested = TEST_UNTESTED,
3883 .probe = probe_spi_rdid,
3884 .probe_timing = TIMING_ZERO,
3885 .block_erasers =
3886 {
3887 {
3888 .eraseblocks = { {64 * 1024, 16} },
3889 .block_erase = spi_block_erase_d8,
3890 }, {
3891 .eraseblocks = { {1024 * 1024, 1} },
3892 .block_erase = spi_block_erase_c7,
3893 }
3894 },
3895 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3896 .unlock = spi_disable_blockprotect,
3897 .write = spi_chip_write_256,
3898 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003899 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003900 },
3901
3902 {
3903 .vendor = "Eon",
3904 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003905 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003906 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003907 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003908 .total_size = 2048,
3909 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003910 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003911 .tested = TEST_UNTESTED,
3912 .probe = probe_spi_rdid,
3913 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003914 .block_erasers =
3915 {
3916 {
3917 .eraseblocks = {
3918 {4 * 1024, 2},
3919 {8 * 1024, 1},
3920 {16 * 1024, 1},
3921 {32 * 1024, 1},
3922 {64 * 1024, 31},
3923 },
3924 .block_erase = spi_block_erase_d8,
3925 }, {
3926 .eraseblocks = { {2 * 1024 * 1024, 1} },
3927 .block_erase = spi_block_erase_c7,
3928 }
3929 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003930 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003931 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003932 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003933 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003934 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003935 },
3936
3937 {
3938 .vendor = "Eon",
3939 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003940 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003941 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003942 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003943 .total_size = 2048,
3944 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003945 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003946 .tested = TEST_UNTESTED,
3947 .probe = probe_spi_rdid,
3948 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003949 .block_erasers =
3950 {
3951 {
3952 .eraseblocks = {
3953 {64 * 1024, 31},
3954 {32 * 1024, 1},
3955 {16 * 1024, 1},
3956 {8 * 1024, 1},
3957 {4 * 1024, 2},
3958 },
3959 .block_erase = spi_block_erase_d8,
3960 }, {
3961 .eraseblocks = { {2 * 1024 * 1024, 1} },
3962 .block_erase = spi_block_erase_c7,
3963 }
3964 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003965 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003966 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003967 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003968 .read = spi_chip_read, /* Fast read (0x0B) supported */
3969 .voltage = {2700, 3600},
3970 },
3971
3972 {
3973 .vendor = "Eon",
3974 .name = "EN25P16",
3975 .bustype = BUS_SPI,
3976 .manufacture_id = EON_ID_NOPREFIX,
3977 .model_id = EON_EN25B16,
3978 .total_size = 2048,
3979 .page_size = 256,
3980 .feature_bits = FEATURE_WRSR_WREN,
3981 .tested = TEST_UNTESTED,
3982 .probe = probe_spi_rdid,
3983 .probe_timing = TIMING_ZERO,
3984 .block_erasers =
3985 {
3986 {
3987 .eraseblocks = { {64 * 1024, 32} },
3988 .block_erase = spi_block_erase_d8,
3989 }, {
3990 .eraseblocks = { {2 * 1024 * 1024, 1} },
3991 .block_erase = spi_block_erase_c7,
3992 }
3993 },
3994 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3995 .unlock = spi_disable_blockprotect,
3996 .write = spi_chip_write_256,
3997 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003998 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003999 },
4000
4001 {
4002 .vendor = "Eon",
4003 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004004 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004005 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004006 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004007 .total_size = 4096,
4008 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004009 /* OTP: 512B total; enter 0x3A */
4010 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004011 .tested = TEST_UNTESTED,
4012 .probe = probe_spi_rdid,
4013 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004014 .block_erasers =
4015 {
4016 {
4017 .eraseblocks = {
4018 {4 * 1024, 2},
4019 {8 * 1024, 1},
4020 {16 * 1024, 1},
4021 {32 * 1024, 1},
4022 {64 * 1024, 63},
4023 },
4024 .block_erase = spi_block_erase_d8,
4025 }, {
4026 .eraseblocks = { {4 * 1024 * 1024, 1} },
4027 .block_erase = spi_block_erase_c7,
4028 }
4029 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004030 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004031 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004032 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004033 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004034 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004035 },
4036
4037 {
4038 .vendor = "Eon",
4039 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004040 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004041 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004042 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004043 .total_size = 4096,
4044 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004045 /* OTP: 512B total; enter 0x3A */
4046 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004047 .tested = TEST_UNTESTED,
4048 .probe = probe_spi_rdid,
4049 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004050 .block_erasers =
4051 {
4052 {
4053 .eraseblocks = {
4054 {64 * 1024, 63},
4055 {32 * 1024, 1},
4056 {16 * 1024, 1},
4057 {8 * 1024, 1},
4058 {4 * 1024, 2},
4059 },
4060 .block_erase = spi_block_erase_d8,
4061 }, {
4062 .eraseblocks = { {4 * 1024 * 1024, 1} },
4063 .block_erase = spi_block_erase_c7,
4064 }
4065 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004066 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004067 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004068 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004069 .read = spi_chip_read, /* Fast read (0x0B) supported */
4070 .voltage = {2700, 3600},
4071 },
4072
4073 {
4074 .vendor = "Eon",
4075 .name = "EN25P32", /* Uniform version of EN25B32 */
4076 .bustype = BUS_SPI,
4077 .manufacture_id = EON_ID_NOPREFIX,
4078 .model_id = EON_EN25B32,
4079 .total_size = 4096,
4080 .page_size = 256,
4081 /* OTP: 512B total; enter 0x3A */
4082 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4083 .tested = TEST_UNTESTED,
4084 .probe = probe_spi_rdid,
4085 .probe_timing = TIMING_ZERO,
4086 .block_erasers =
4087 {
4088 {
4089 .eraseblocks = { {64 * 1024, 64} },
4090 .block_erase = spi_block_erase_d8,
4091 }, {
4092 .eraseblocks = { {4 * 1024 * 1024, 1} },
4093 .block_erase = spi_block_erase_c7,
4094 }
4095 },
4096 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4097 .unlock = spi_disable_blockprotect,
4098 .write = spi_chip_write_256,
4099 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004100 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004101 },
4102
4103 {
4104 .vendor = "Eon",
4105 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004106 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004107 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004108 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004109 .total_size = 8192,
4110 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004111 /* OTP: 512B total; enter 0x3A */
4112 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004113 .tested = TEST_UNTESTED,
4114 .probe = probe_spi_rdid,
4115 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004116 .block_erasers =
4117 {
4118 {
4119 .eraseblocks = {
4120 {4 * 1024, 2},
4121 {8 * 1024, 1},
4122 {16 * 1024, 1},
4123 {32 * 1024, 1},
4124 {64 * 1024, 127},
4125 },
4126 .block_erase = spi_block_erase_d8,
4127 }, {
4128 .eraseblocks = { {8 * 1024 * 1024, 1} },
4129 .block_erase = spi_block_erase_c7,
4130 }
4131 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004132 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004133 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004134 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004135 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004136 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004137 },
4138
4139 {
4140 .vendor = "Eon",
4141 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004142 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004143 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004144 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004145 .total_size = 8192,
4146 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004147 /* OTP: 512B total; enter 0x3A */
4148 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004149 .tested = TEST_UNTESTED,
4150 .probe = probe_spi_rdid,
4151 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004152 .block_erasers =
4153 {
4154 {
4155 .eraseblocks = {
4156 {64 * 1024, 127},
4157 {32 * 1024, 1},
4158 {16 * 1024, 1},
4159 {8 * 1024, 1},
4160 {4 * 1024, 2},
4161 },
4162 .block_erase = spi_block_erase_d8,
4163 }, {
4164 .eraseblocks = { {8 * 1024 * 1024, 1} },
4165 .block_erase = spi_block_erase_c7,
4166 }
4167 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004168 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004169 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004170 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004171 .read = spi_chip_read, /* Fast read (0x0B) supported */
4172 .voltage = {2700, 3600},
4173 },
4174
4175 {
4176 .vendor = "Eon",
4177 .name = "EN25P64",
4178 .bustype = BUS_SPI,
4179 .manufacture_id = EON_ID_NOPREFIX,
4180 .model_id = EON_EN25B64,
4181 .total_size = 8192,
4182 .page_size = 256,
4183 /* OTP: 512B total; enter 0x3A */
4184 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4185 .tested = TEST_UNTESTED,
4186 .probe = probe_spi_rdid,
4187 .probe_timing = TIMING_ZERO,
4188 .block_erasers =
4189 {
4190 {
4191 .eraseblocks = { {64 * 1024, 128} },
4192 .block_erase = spi_block_erase_d8,
4193 }, {
4194 .eraseblocks = { {8 * 1024 * 1024, 1} },
4195 .block_erase = spi_block_erase_c7,
4196 }
4197 },
4198 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4199 .unlock = spi_disable_blockprotect,
4200 .write = spi_chip_write_256,
4201 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004202 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004203 },
4204
4205 {
4206 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004207 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004208 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004209 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004210 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004211 .total_size = 64,
4212 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004213 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004214 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004215 .probe = probe_spi_rdid,
4216 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004217 .block_erasers =
4218 {
4219 {
4220 .eraseblocks = { {4 * 1024, 16} },
4221 .block_erase = spi_block_erase_20,
4222 }, {
4223 .eraseblocks = { {32 * 1024, 2} },
4224 .block_erase = spi_block_erase_d8,
4225 }, {
4226 .eraseblocks = { {32 * 1024, 2} },
4227 .block_erase = spi_block_erase_52,
4228 }, {
4229 .eraseblocks = { {64 * 1024, 1} },
4230 .block_erase = spi_block_erase_60,
4231 }, {
4232 .eraseblocks = { {64 * 1024, 1} },
4233 .block_erase = spi_block_erase_c7,
4234 }
4235 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004236 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004237 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004238 .write = spi_chip_write_256,
4239 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004240 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004241 },
4242
4243 {
4244 .vendor = "Eon",
4245 .name = "EN25F10",
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_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004249 .total_size = 128,
4250 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004251 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004252 .tested = TEST_UNTESTED,
4253 .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, 32} },
4259 .block_erase = spi_block_erase_20,
4260 }, {
4261 .eraseblocks = { {32 * 1024, 4} },
4262 .block_erase = spi_block_erase_d8,
4263 }, {
4264 .eraseblocks = { {32 * 1024, 4} },
4265 .block_erase = spi_block_erase_52,
4266 }, {
4267 .eraseblocks = { {128 * 1024, 1} },
4268 .block_erase = spi_block_erase_60,
4269 }, {
4270 .eraseblocks = { {128 * 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 = "EN25F20",
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_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004287 .total_size = 256,
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, 64} },
4297 .block_erase = spi_block_erase_20,
4298 }, {
4299 .eraseblocks = { {64 * 1024, 4} },
4300 .block_erase = spi_block_erase_d8,
4301 }, {
4302 .eraseblocks = { {64 * 1024, 4} },
4303 .block_erase = spi_block_erase_52,
4304 }, {
4305 .eraseblocks = { {256 * 1024, 1} },
4306 .block_erase = spi_block_erase_60,
4307 }, {
4308 .eraseblocks = { {256 * 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",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004321 .name = "EN25F40",
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_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004325 .total_size = 512,
4326 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004327 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004328 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004329 .probe = probe_spi_rdid,
4330 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004331 .block_erasers =
4332 {
4333 {
Sean Nelson54596372010-01-09 05:30:14 +00004334 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004335 .block_erase = spi_block_erase_20,
4336 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004337 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004338 .block_erase = spi_block_erase_d8,
4339 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004340 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004341 .block_erase = spi_block_erase_60,
4342 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004343 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004344 .block_erase = spi_block_erase_c7,
4345 },
4346 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004347 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004348 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004349 .write = spi_chip_write_256,
4350 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004351 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004352 },
4353
4354 {
4355 .vendor = "Eon",
4356 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004357 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004358 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004359 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004360 .total_size = 1024,
4361 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004362 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004363 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004364 .probe = probe_spi_rdid,
4365 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004366 .block_erasers =
4367 {
4368 {
4369 .eraseblocks = { {4 * 1024, 256} },
4370 .block_erase = spi_block_erase_20,
4371 }, {
4372 .eraseblocks = { {64 * 1024, 16} },
4373 .block_erase = spi_block_erase_d8,
4374 }, {
4375 .eraseblocks = { {1024 * 1024, 1} },
4376 .block_erase = spi_block_erase_60,
4377 }, {
4378 .eraseblocks = { {1024 * 1024, 1} },
4379 .block_erase = spi_block_erase_c7,
4380 }
4381 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004382 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004383 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004384 .write = spi_chip_write_256,
4385 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004386 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004387 },
4388
4389 {
4390 .vendor = "Eon",
4391 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004392 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004393 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004394 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004395 .total_size = 2048,
4396 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004397 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004398 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004399 .probe = probe_spi_rdid,
4400 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004401 .block_erasers =
4402 {
4403 {
4404 .eraseblocks = { {4 * 1024, 512} },
4405 .block_erase = spi_block_erase_20,
4406 }, {
4407 .eraseblocks = { {64 * 1024, 32} },
4408 .block_erase = spi_block_erase_d8,
4409 }, {
4410 .eraseblocks = { {2 * 1024 * 1024, 1} },
4411 .block_erase = spi_block_erase_60,
4412 }, {
4413 .eraseblocks = { {2 * 1024 * 1024, 1} },
4414 .block_erase = spi_block_erase_c7,
4415 }
4416 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004417 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004418 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004419 .write = spi_chip_write_256,
4420 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004421 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004422 },
4423
4424 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004425 .vendor = "Eon",
4426 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004427 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004428 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004429 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004430 .total_size = 4096,
4431 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004432 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004433 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004434 .probe = probe_spi_rdid,
4435 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004436 .block_erasers =
4437 {
4438 {
4439 .eraseblocks = { {4 * 1024, 1024} },
4440 .block_erase = spi_block_erase_20,
4441 }, {
4442 .eraseblocks = { {64 * 1024, 64} },
4443 .block_erase = spi_block_erase_d8,
4444 }, {
4445 .eraseblocks = { {4 * 1024 * 1024, 1} },
4446 .block_erase = spi_block_erase_60,
4447 }, {
4448 .eraseblocks = { {4 * 1024 * 1024, 1} },
4449 .block_erase = spi_block_erase_c7,
4450 }
4451 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004452 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004453 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004454 .write = spi_chip_write_256,
4455 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004456 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004457 },
4458
4459 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004460 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004461 .name = "EN25F64",
4462 .bustype = BUS_SPI,
4463 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004464 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004465 .total_size = 8192,
4466 .page_size = 256,
4467 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004468 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004469 .probe = probe_spi_rdid,
4470 .probe_timing = TIMING_ZERO,
4471 .block_erasers =
4472 {
4473 {
4474 .eraseblocks = { {4 * 1024, 2048} },
4475 .block_erase = spi_block_erase_20,
4476 }, {
4477 .eraseblocks = { {64 * 1024, 128} },
4478 .block_erase = spi_block_erase_d8,
4479 }, {
4480 .eraseblocks = { {8 * 1024 * 1024, 1} },
4481 .block_erase = spi_block_erase_60,
4482 }, {
4483 .eraseblocks = { {8 * 1024 * 1024, 1} },
4484 .block_erase = spi_block_erase_c7,
4485 }
4486 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004487 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004488 .unlock = spi_disable_blockprotect,
4489 .write = spi_chip_write_256,
4490 .read = spi_chip_read,
4491 .voltage = {2700, 3600},
4492 },
4493
4494 {
4495 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004496 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004497 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004498 .manufacture_id = EON_ID_NOPREFIX,
4499 .model_id = EON_EN25Q40,
4500 .total_size = 512,
4501 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004502 /* OTP: 256B total; enter 0x3A */
4503 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004504 .tested = TEST_UNTESTED,
4505 .probe = probe_spi_rdid,
4506 .probe_timing = TIMING_ZERO,
4507 .block_erasers =
4508 {
4509 {
4510 .eraseblocks = { {4 * 1024, 128} },
4511 .block_erase = spi_block_erase_20,
4512 }, {
4513 .eraseblocks = { {64 * 1024, 8} },
4514 .block_erase = spi_block_erase_d8,
4515 }, {
4516 .eraseblocks = { {512 * 1024, 1} },
4517 .block_erase = spi_block_erase_60,
4518 }, {
4519 .eraseblocks = { {512 * 1024, 1} },
4520 .block_erase = spi_block_erase_c7,
4521 }
4522 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004523 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004524 .unlock = spi_disable_blockprotect,
4525 .write = spi_chip_write_256,
4526 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004527 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004528 },
4529
4530 {
4531 .vendor = "Eon",
4532 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004533 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004534 .manufacture_id = EON_ID_NOPREFIX,
4535 .model_id = EON_EN25Q80,
4536 .total_size = 1024,
4537 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004538 /* OTP: 256B total; enter 0x3A */
4539 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004540 .tested = TEST_UNTESTED,
4541 .probe = probe_spi_rdid,
4542 .probe_timing = TIMING_ZERO,
4543 .block_erasers =
4544 {
4545 {
4546 .eraseblocks = { {4 * 1024, 256} },
4547 .block_erase = spi_block_erase_20,
4548 }, {
4549 .eraseblocks = { {64 * 1024, 16} },
4550 .block_erase = spi_block_erase_d8,
4551 }, {
4552 .eraseblocks = { {1024 * 1024, 1} },
4553 .block_erase = spi_block_erase_60,
4554 }, {
4555 .eraseblocks = { {1024 * 1024, 1} },
4556 .block_erase = spi_block_erase_c7,
4557 }
4558 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004559 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004560 .unlock = spi_disable_blockprotect,
4561 .write = spi_chip_write_256,
4562 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004563 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004564 },
4565
4566 {
4567 /* Note: EN25D16 is an evil twin which shares the model ID
4568 but has different write protection capabilities */
4569 .vendor = "Eon",
4570 .name = "EN25Q16",
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_EN25Q16,
4574 .total_size = 2048,
4575 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004576 /* OTP: D16 512B/Q16 128B 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, 512} },
4585 .block_erase = spi_block_erase_20,
4586 }, {
4587 .eraseblocks = { {64 * 1024, 32} },
4588 .block_erase = spi_block_erase_d8,
4589 }, {
4590 /* not supported by Q16 version */
4591 .eraseblocks = { {64 * 1024, 32} },
4592 .block_erase = spi_block_erase_52,
4593 }, {
4594 .eraseblocks = { {2 * 1024 * 1024, 1} },
4595 .block_erase = spi_block_erase_60,
4596 }, {
4597 .eraseblocks = { {2 * 1024 * 1024, 1} },
4598 .block_erase = spi_block_erase_c7,
4599 }
4600 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004601 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004602 .unlock = spi_disable_blockprotect,
4603 .write = spi_chip_write_256,
4604 .read = spi_chip_read,
4605 .voltage = {2700, 3600},
4606 },
4607
4608 {
4609 .vendor = "Eon",
4610 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004611 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004612 .manufacture_id = EON_ID_NOPREFIX,
4613 .model_id = EON_EN25Q32,
4614 .total_size = 4096,
4615 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004616 /* OTP: 512B total; enter 0x3A */
4617 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004618 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004619 .probe = probe_spi_rdid,
4620 .probe_timing = TIMING_ZERO,
4621 .block_erasers =
4622 {
4623 {
4624 .eraseblocks = { {4 * 1024, 1024} },
4625 .block_erase = spi_block_erase_20,
4626 }, {
4627 .eraseblocks = { {64 * 1024, 64} },
4628 .block_erase = spi_block_erase_d8,
4629 }, {
4630 .eraseblocks = { {4 * 1024 * 1024, 1} },
4631 .block_erase = spi_block_erase_60,
4632 }, {
4633 .eraseblocks = { {4 * 1024 * 1024, 1} },
4634 .block_erase = spi_block_erase_c7,
4635 }
4636 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004637 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004638 .unlock = spi_disable_blockprotect,
4639 .write = spi_chip_write_256,
4640 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004641 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004642 },
4643
4644 {
4645 .vendor = "Eon",
4646 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004647 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004648 .manufacture_id = EON_ID_NOPREFIX,
4649 .model_id = EON_EN25Q64,
4650 .total_size = 8192,
4651 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004652 /* OTP: 512B total; enter 0x3A */
4653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004654 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004655 .probe = probe_spi_rdid,
4656 .probe_timing = TIMING_ZERO,
4657 .block_erasers =
4658 {
4659 {
4660 .eraseblocks = { {4 * 1024, 2048} },
4661 .block_erase = spi_block_erase_20,
4662 }, {
4663 .eraseblocks = { {64 * 1024, 128} },
4664 .block_erase = spi_block_erase_d8,
4665 }, {
4666 .eraseblocks = { {8 * 1024 * 1024, 1} },
4667 .block_erase = spi_block_erase_60,
4668 }, {
4669 .eraseblocks = { {8 * 1024 * 1024, 1} },
4670 .block_erase = spi_block_erase_c7,
4671 }
4672 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004673 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004674 .unlock = spi_disable_blockprotect,
4675 .write = spi_chip_write_256,
4676 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004677 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004678 },
4679
4680 {
4681 .vendor = "Eon",
4682 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004683 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004684 .manufacture_id = EON_ID_NOPREFIX,
4685 .model_id = EON_EN25Q128,
4686 .total_size = 16384,
4687 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004688 /* OTP: 512B total; enter 0x3A */
4689 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0be072c2016-03-13 15:16:30 +00004690 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004691 .probe = probe_spi_rdid,
4692 .probe_timing = TIMING_ZERO,
4693 .block_erasers =
4694 {
4695 {
4696 .eraseblocks = { {4 * 1024, 4096} },
4697 .block_erase = spi_block_erase_20,
4698 }, {
4699 .eraseblocks = { {64 * 1024, 256} },
4700 .block_erase = spi_block_erase_d8,
4701 }, {
4702 .eraseblocks = { {16 * 1024 * 1024, 1} },
4703 .block_erase = spi_block_erase_60,
4704 }, {
4705 .eraseblocks = { {16 * 1024 * 1024, 1} },
4706 .block_erase = spi_block_erase_c7,
4707 }
4708 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004709 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004710 .unlock = spi_disable_blockprotect,
4711 .write = spi_chip_write_256,
4712 .read = spi_chip_read,
4713 },
4714
4715 {
4716 .vendor = "Eon",
4717 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004718 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004719 .manufacture_id = EON_ID_NOPREFIX,
4720 .model_id = EON_EN25QH16,
4721 .total_size = 2048,
4722 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004723 /* supports SFDP */
4724 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004725 /* QPI enable 0x38, disable 0xFF */
4726 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004727 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004728 .probe = probe_spi_rdid,
4729 .probe_timing = TIMING_ZERO,
4730 .block_erasers =
4731 {
4732 {
4733 .eraseblocks = { {4 * 1024, 512} },
4734 .block_erase = spi_block_erase_20,
4735 }, {
4736 .eraseblocks = { {64 * 1024, 32} },
4737 .block_erase = spi_block_erase_d8,
4738 }, {
4739 .eraseblocks = { {1024 * 2048, 1} },
4740 .block_erase = spi_block_erase_60,
4741 }, {
4742 .eraseblocks = { {1024 * 2048, 1} },
4743 .block_erase = spi_block_erase_c7,
4744 }
4745 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004746 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004747 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004748 .write = spi_chip_write_256,
4749 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004750 .voltage = {2700, 3600},
4751 },
4752
4753 {
4754 .vendor = "Eon",
4755 .name = "EN25QH32",
4756 .bustype = BUS_SPI,
4757 .manufacture_id = EON_ID_NOPREFIX,
4758 .model_id = EON_EN25QH32,
4759 .total_size = 4096,
4760 .page_size = 256,
4761 /* 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 Tauner23e10b82016-01-23 16:16:49 +00004765 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004766 .probe = probe_spi_rdid,
4767 .probe_timing = TIMING_ZERO,
4768 .block_erasers =
4769 {
4770 {
4771 .eraseblocks = { {4 * 1024, 1024} },
4772 .block_erase = spi_block_erase_20,
4773 }, {
4774 .eraseblocks = { {64 * 1024, 64} },
4775 .block_erase = spi_block_erase_d8,
4776 }, {
4777 .eraseblocks = { {1024 * 4096, 1} },
4778 .block_erase = spi_block_erase_60,
4779 }, {
4780 .eraseblocks = { {1024 * 4096, 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,
4786 .write = spi_chip_write_256,
4787 .read = spi_chip_read,
4788 .voltage = {2700, 3600},
4789 },
4790
4791 {
4792 .vendor = "Eon",
4793 .name = "EN25QH64",
4794 .bustype = BUS_SPI,
4795 .manufacture_id = EON_ID_NOPREFIX,
4796 .model_id = EON_EN25QH64,
4797 .total_size = 8192,
4798 .page_size = 256,
4799 /* supports SFDP */
4800 /* OTP: 512B total; enter 0x3A */
4801 /* 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,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004804 .probe = probe_spi_rdid,
4805 .probe_timing = TIMING_ZERO,
4806 .block_erasers = {
4807 {
4808 .eraseblocks = { {4 * 1024, 2048} },
4809 .block_erase = spi_block_erase_20,
4810 }, {
4811 .eraseblocks = { {64 * 1024, 128} },
4812 .block_erase = spi_block_erase_d8,
4813 }, {
4814 .eraseblocks = { { 8192 * 1024, 1} },
4815 .block_erase = spi_block_erase_60,
4816 }, {
4817 .eraseblocks = { { 8192 * 1024, 1} },
4818 .block_erase = spi_block_erase_c7,
4819 }
4820 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004821 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004822 .unlock = spi_disable_blockprotect_bp3_srwd,
4823 .write = spi_chip_write_256,
4824 .read = spi_chip_read,
4825 .voltage = {2700, 3600},
4826 },
4827
4828 {
4829 .vendor = "Eon",
4830 .name = "EN25QH128",
4831 .bustype = BUS_SPI,
4832 .manufacture_id = EON_ID_NOPREFIX,
4833 .model_id = EON_EN25QH128,
4834 .total_size = 16384,
4835 .page_size = 256,
4836 /* supports SFDP */
4837 /* OTP: 512B total; enter 0x3A */
4838 /* QPI enable 0x38, disable 0xFF */
4839 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4840 .tested = TEST_UNTESTED,
4841 .probe = probe_spi_rdid,
4842 .probe_timing = TIMING_ZERO,
4843 .block_erasers = {
4844 {
4845 .eraseblocks = { {4 * 1024, 4096} },
4846 .block_erase = spi_block_erase_20,
4847 }, {
4848 .eraseblocks = { {64 * 1024, 256} },
4849 .block_erase = spi_block_erase_d8,
4850 }, {
4851 .eraseblocks = { { 16384 * 1024, 1} },
4852 .block_erase = spi_block_erase_60,
4853 }, {
4854 .eraseblocks = { { 16384 * 1024, 1} },
4855 .block_erase = spi_block_erase_c7,
4856 }
4857 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004858 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004859 .unlock = spi_disable_blockprotect_bp3_srwd,
4860 .write = spi_chip_write_256,
4861 .read = spi_chip_read,
4862 .voltage = {2700, 3600},
4863 },
4864
4865 {
4866 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004867 .name = "EN25S10",
4868 .bustype = BUS_SPI,
4869 .manufacture_id = EON_ID_NOPREFIX,
4870 .model_id = EON_EN25S10,
4871 .total_size = 128,
4872 .page_size = 256,
4873 /* OTP: 256B total; enter 0x3A */
4874 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4875 .tested = TEST_UNTESTED,
4876 .probe = probe_spi_rdid,
4877 .probe_timing = TIMING_ZERO,
4878 .block_erasers = {
4879 {
4880 .eraseblocks = { {4 * 1024, 32} },
4881 .block_erase = spi_block_erase_20,
4882 }, {
4883 .eraseblocks = { {32 * 1024, 4} },
4884 .block_erase = spi_block_erase_52,
4885 }, {
4886 .eraseblocks = { {128 * 1024, 1} },
4887 .block_erase = spi_block_erase_60,
4888 }, {
4889 .eraseblocks = { {128 * 1024, 1} },
4890 .block_erase = spi_block_erase_c7,
4891 }
4892 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004893 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004894 .unlock = spi_disable_blockprotect,
4895 .write = spi_chip_write_256,
4896 .read = spi_chip_read,
4897 .voltage = {1650, 1950},
4898 },
4899
4900 {
4901 .vendor = "Eon",
4902 .name = "EN25S20",
4903 .bustype = BUS_SPI,
4904 .manufacture_id = EON_ID_NOPREFIX,
4905 .model_id = EON_EN25S20,
4906 .total_size = 256,
4907 .page_size = 256,
4908 /* OTP: 256B total; enter 0x3A */
4909 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4910 .tested = TEST_UNTESTED,
4911 .probe = probe_spi_rdid,
4912 .probe_timing = TIMING_ZERO,
4913 .block_erasers = {
4914 {
4915 .eraseblocks = { {4 * 1024, 64} },
4916 .block_erase = spi_block_erase_20,
4917 }, {
4918 .eraseblocks = { {64 * 1024, 4} },
4919 .block_erase = spi_block_erase_d8,
4920 }, {
4921 .eraseblocks = { {256 * 1024, 1} },
4922 .block_erase = spi_block_erase_60,
4923 }, {
4924 .eraseblocks = { {256 * 1024, 1} },
4925 .block_erase = spi_block_erase_c7,
4926 }
4927 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004928 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004929 .unlock = spi_disable_blockprotect,
4930 .write = spi_chip_write_256,
4931 .read = spi_chip_read,
4932 .voltage = {1650, 1950},
4933 },
4934
4935 {
4936 .vendor = "Eon",
4937 .name = "EN25S40",
4938 .bustype = BUS_SPI,
4939 .manufacture_id = EON_ID_NOPREFIX,
4940 .model_id = EON_EN25S40,
4941 .total_size = 512,
4942 .page_size = 256,
4943 /* OTP: 256B total; enter 0x3A */
4944 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4945 .tested = TEST_UNTESTED,
4946 .probe = probe_spi_rdid,
4947 .probe_timing = TIMING_ZERO,
4948 .block_erasers = {
4949 {
4950 .eraseblocks = { {4 * 1024, 128} },
4951 .block_erase = spi_block_erase_20,
4952 }, {
4953 .eraseblocks = { {64 * 1024, 8} },
4954 .block_erase = spi_block_erase_d8,
4955 }, {
4956 .eraseblocks = { {512 * 1024, 1} },
4957 .block_erase = spi_block_erase_60,
4958 }, {
4959 .eraseblocks = { {512 * 1024, 1} },
4960 .block_erase = spi_block_erase_c7,
4961 }
4962 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004963 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004964 .unlock = spi_disable_blockprotect,
4965 .write = spi_chip_write_256,
4966 .read = spi_chip_read,
4967 .voltage = {1650, 1950},
4968 },
4969
4970 {
4971 .vendor = "Eon",
4972 .name = "EN25S80",
4973 .bustype = BUS_SPI,
4974 .manufacture_id = EON_ID_NOPREFIX,
4975 .model_id = EON_EN25S80,
4976 .total_size = 1024,
4977 .page_size = 256,
4978 /* OTP: 256B total; enter 0x3A */
4979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4980 .tested = TEST_UNTESTED,
4981 .probe = probe_spi_rdid,
4982 .probe_timing = TIMING_ZERO,
4983 .block_erasers = {
4984 {
4985 .eraseblocks = { {4 * 1024, 256} },
4986 .block_erase = spi_block_erase_20,
4987 }, {
4988 .eraseblocks = { {64 * 1024, 16} },
4989 .block_erase = spi_block_erase_d8,
4990 }, {
4991 .eraseblocks = { {1024 * 1024, 1} },
4992 .block_erase = spi_block_erase_60,
4993 }, {
4994 .eraseblocks = { {1024 * 1024, 1} },
4995 .block_erase = spi_block_erase_c7,
4996 }
4997 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004998 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004999 .unlock = spi_disable_blockprotect,
5000 .write = spi_chip_write_256,
5001 .read = spi_chip_read,
5002 .voltage = {1650, 1950},
5003 },
5004
5005 {
5006 .vendor = "Eon",
5007 .name = "EN25S16",
5008 .bustype = BUS_SPI,
5009 .manufacture_id = EON_ID_NOPREFIX,
5010 .model_id = EON_EN25S16,
5011 .total_size = 2048,
5012 .page_size = 256,
5013 /* OTP: 512B total; enter 0x3A */
5014 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5015 .tested = TEST_UNTESTED,
5016 .probe = probe_spi_rdid,
5017 .probe_timing = TIMING_ZERO,
5018 .block_erasers = {
5019 {
5020 .eraseblocks = { {4 * 1024, 512} },
5021 .block_erase = spi_block_erase_20,
5022 }, {
5023 .eraseblocks = { {64 * 1024, 32} },
5024 .block_erase = spi_block_erase_52,
5025 }, {
5026 .eraseblocks = { {32 * 1024, 64} },
5027 .block_erase = spi_block_erase_d8,
5028 }, {
5029 .eraseblocks = { {2048 * 1024, 1} },
5030 .block_erase = spi_block_erase_60,
5031 }, {
5032 .eraseblocks = { {2048 * 1024, 1} },
5033 .block_erase = spi_block_erase_c7,
5034 }
5035 },
5036 .printlock = spi_prettyprint_status_register_en25s_wp,
5037 .unlock = spi_disable_blockprotect_bp3_srwd,
5038 .write = spi_chip_write_256,
5039 .read = spi_chip_read,
5040 .voltage = {1650, 1950},
5041 },
5042
5043 {
5044 .vendor = "Eon",
5045 .name = "EN25S32",
5046 .bustype = BUS_SPI,
5047 .manufacture_id = EON_ID_NOPREFIX,
5048 .model_id = EON_EN25S32,
5049 .total_size = 4096,
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, 1024} },
5059 .block_erase = spi_block_erase_20,
5060 }, {
5061 .eraseblocks = { {32 * 1024, 128} },
5062 .block_erase = spi_block_erase_52,
5063 }, {
5064 .eraseblocks = { {64 * 1024, 64} },
5065 .block_erase = spi_block_erase_d8,
5066 }, {
5067 .eraseblocks = { {4096 * 1024, 1} },
5068 .block_erase = spi_block_erase_60,
5069 }, {
5070 .eraseblocks = { {4096 * 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 = "EN25S64",
5084 .bustype = BUS_SPI,
5085 .manufacture_id = EON_ID_NOPREFIX,
5086 .model_id = EON_EN25S64,
5087 .total_size = 8192,
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, 2048} },
5097 .block_erase = spi_block_erase_20,
5098 }, {
5099 .eraseblocks = { {64 * 1024, 128} },
5100 .block_erase = spi_block_erase_d8,
5101 }, {
5102 .eraseblocks = { {8192 * 1024, 1} },
5103 .block_erase = spi_block_erase_60,
5104 }, {
5105 .eraseblocks = { {8192 * 1024, 1} },
5106 .block_erase = spi_block_erase_c7,
5107 }
5108 },
5109 .printlock = spi_prettyprint_status_register_en25s_wp,
5110 .unlock = spi_disable_blockprotect_bp3_srwd,
5111 .write = spi_chip_write_256,
5112 .read = spi_chip_read,
5113 .voltage = {1650, 1950},
5114 },
5115
5116 {
5117 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00005118 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005119 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00005120 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005121 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00005122 .total_size = 128,
5123 .page_size = 128,
5124 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005125 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00005126 .probe = probe_jedec,
5127 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5128 .block_erasers =
5129 {
5130 {
5131 .eraseblocks = { {16 * 1024, 8} },
5132 .block_erase = erase_sector_jedec,
5133 },
5134 {
5135 .eraseblocks = { {128 * 1024, 1} },
5136 .block_erase = erase_chip_block_jedec,
5137 },
5138 },
5139 .write = write_jedec_1,
5140 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005141 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00005142 },
5143
5144 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005145 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005146 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005147 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005148 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005149 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005150 .total_size = 256,
5151 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005152 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005153 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005154 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005155 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005156 .block_erasers =
5157 {
5158 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005159 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005160 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005161 {8 * 1024, 2},
5162 {32 * 1024, 1},
5163 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005164 },
5165 .block_erase = erase_sector_jedec,
5166 }, {
5167 .eraseblocks = { {256 * 1024, 1} },
5168 .block_erase = erase_chip_block_jedec,
5169 },
5170 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005171 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005172 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005173 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005174 },
5175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005176 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005177 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005178 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005179 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005180 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005181 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005182 .total_size = 256,
5183 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005184 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005185 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005186 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005187 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005188 .block_erasers =
5189 {
5190 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005191 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005192 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005193 {32 * 1024, 1},
5194 {8 * 1024, 2},
5195 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005196 },
5197 .block_erase = erase_sector_jedec,
5198 }, {
5199 .eraseblocks = { {256 * 1024, 1} },
5200 .block_erase = erase_chip_block_jedec,
5201 },
5202 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005203 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005204 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005205 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005206 },
5207
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005208 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005209 .vendor = "Eon",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005210 .name = "EN29LV040(A)",
5211 .bustype = BUS_PARALLEL,
5212 .manufacture_id = EON_ID,
5213 .model_id = EON_EN29LV040,
5214 .total_size = 512,
5215 .page_size = 4 * 1024,
5216 .tested = TEST_OK_PREW,
5217 .probe = probe_jedec,
5218 .probe_timing = TIMING_ZERO,
5219 .block_erasers =
5220 {
5221 {
5222 .eraseblocks = { {64 * 1024, 8} },
5223 .block_erase = erase_sector_jedec,
5224 },
5225 {
5226 .eraseblocks = { {512 * 1024, 1} },
5227 .block_erase = erase_chip_block_jedec,
5228 },
5229 },
5230 .write = write_jedec_1,
5231 .read = read_memmapped,
5232 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5233 },
5234
5235 {
5236 .vendor = "Eon",
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005237 .name = "EN29LV640B",
5238 .bustype = BUS_PARALLEL,
5239 .manufacture_id = EON_ID,
5240 .model_id = EON_EN29LV640B,
5241 .total_size = 8192,
5242 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005243 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005244 .tested = TEST_OK_PREW,
5245 .probe = probe_en29lv640b,
5246 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5247 .block_erasers =
5248 {
5249 {
5250 .eraseblocks = {
5251 {8 * 1024, 8},
5252 {64 * 1024, 127},
5253 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005254 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005255 }, {
5256 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005257 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005258 },
5259 },
5260 .write = write_en29lv640b,
5261 .read = read_memmapped,
5262 .voltage = {2700, 3600},
5263 },
5264
5265 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005266 .vendor = "Eon",
5267 .name = "EN29GL064(A)B",
5268 .bustype = BUS_PARALLEL,
5269 .manufacture_id = EON_ID,
5270 .model_id = EON_EN29GL064B,
5271 .total_size = 8192,
5272 .page_size = 128 * 1024, /* actual page size is 16 */
5273 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5274 .tested = TEST_UNTESTED,
5275 .probe = probe_jedec_29gl,
5276 .probe_timing = TIMING_ZERO,
5277 .block_erasers =
5278 {
5279 {
5280 .eraseblocks = {
5281 {8 * 1024, 8},
5282 {64 * 1024, 127},
5283 },
5284 .block_erase = erase_sector_jedec,
5285 }, {
5286 .eraseblocks = { {8 * 1024 * 1024, 1} },
5287 .block_erase = erase_chip_block_jedec,
5288 },
5289 },
5290 .write = write_jedec_1,
5291 .read = read_memmapped,
5292 .voltage = {2700, 3600},
5293 },
5294
5295 {
5296 .vendor = "Eon",
5297 .name = "EN29GL064(A)T",
5298 .bustype = BUS_PARALLEL,
5299 .manufacture_id = EON_ID,
5300 .model_id = EON_EN29GL064T,
5301 .total_size = 8192,
5302 .page_size = 128 * 1024, /* actual page size is 16 */
5303 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5304 .tested = TEST_UNTESTED,
5305 .probe = probe_jedec_29gl,
5306 .probe_timing = TIMING_ZERO,
5307 .block_erasers =
5308 {
5309 {
5310 .eraseblocks = {
5311 {64 * 1024, 127},
5312 {8 * 1024, 8},
5313 },
5314 .block_erase = erase_sector_jedec,
5315 }, {
5316 .eraseblocks = { {8 * 1024 * 1024, 1} },
5317 .block_erase = erase_chip_block_jedec,
5318 },
5319 },
5320 .write = write_jedec_1,
5321 .read = read_memmapped,
5322 .voltage = {2700, 3600},
5323 },
5324
5325 {
5326 .vendor = "Eon",
5327 .name = "EN29GL064H/L",
5328 .bustype = BUS_PARALLEL,
5329 .manufacture_id = EON_ID,
5330 .model_id = EON_EN29GL064HL,
5331 .total_size = 8192,
5332 .page_size = 128 * 1024, /* actual page size is 16 */
5333 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5334 .tested = TEST_UNTESTED,
5335 .probe = probe_jedec_29gl,
5336 .probe_timing = TIMING_ZERO,
5337 .block_erasers =
5338 {
5339 {
5340 .eraseblocks = { {64 * 1024, 128} },
5341 .block_erase = erase_sector_jedec,
5342 }, {
5343 .eraseblocks = { {8 * 1024 * 1024, 1} },
5344 .block_erase = erase_chip_block_jedec,
5345 },
5346 },
5347 .write = write_jedec_1,
5348 .read = read_memmapped,
5349 .voltage = {2700, 3600},
5350 },
5351
5352 {
5353 .vendor = "Eon",
5354 .name = "EN29GL128",
5355 .bustype = BUS_PARALLEL,
5356 .manufacture_id = EON_ID,
5357 .model_id = EON_EN29GL128HL,
5358 .total_size = 16384,
5359 .page_size = 128 * 1024, /* actual page size is 16 */
5360 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5361 .tested = TEST_UNTESTED,
5362 .probe = probe_jedec_29gl,
5363 .probe_timing = TIMING_ZERO,
5364 .block_erasers =
5365 {
5366 {
5367 .eraseblocks = { {128 * 1024, 128} },
5368 .block_erase = erase_sector_jedec,
5369 }, {
5370 .eraseblocks = { {16 * 1024 * 1024, 1} },
5371 .block_erase = erase_chip_block_jedec,
5372 },
5373 },
5374 .write = write_jedec_1,
5375 .read = read_memmapped,
5376 .voltage = {2700, 3600},
5377 },
5378
5379 {
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005380 .vendor = "ESI",
5381 .name = "ES25P40",
5382 .bustype = BUS_SPI,
5383 .manufacture_id = EXCEL_ID_NOPREFIX,
5384 .model_id = EXCEL_ES25P40,
5385 .total_size = 512,
5386 .page_size = 256,
5387 /* 256-byte paramter page separate from memory array:
5388 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5389 .feature_bits = FEATURE_WRSR_WREN,
5390 .tested = TEST_UNTESTED,
5391 .probe = probe_spi_rdid,
5392 .probe_timing = TIMING_ZERO,
5393 .block_erasers =
5394 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005395 {
5396 .eraseblocks = { {64 * 1024, 8} },
5397 .block_erase = spi_block_erase_d8,
5398 }, {
5399 .eraseblocks = { {512 * 1024, 1} },
5400 .block_erase = spi_block_erase_c7,
5401 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005402 },
5403 .printlock = spi_prettyprint_status_register_bp2_srwd,
5404 .unlock = spi_disable_blockprotect_bp2_srwd,
5405 .write = spi_chip_write_256,
5406 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5407 .voltage = {2700, 3600},
5408 },
5409
5410 {
5411 .vendor = "ESI",
5412 .name = "ES25P80",
5413 .bustype = BUS_SPI,
5414 .manufacture_id = EXCEL_ID_NOPREFIX,
5415 .model_id = EXCEL_ES25P80,
5416 .total_size = 1024,
5417 .page_size = 256,
5418 /* 256-byte paramter page separate from memory array:
5419 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5420 .feature_bits = FEATURE_WRSR_WREN,
5421 .tested = TEST_UNTESTED,
5422 .probe = probe_spi_rdid,
5423 .probe_timing = TIMING_ZERO,
5424 .block_erasers =
5425 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005426 {
5427 .eraseblocks = { {64 * 1024, 16} },
5428 .block_erase = spi_block_erase_d8,
5429 }, {
5430 .eraseblocks = { {1024 * 1024, 1} },
5431 .block_erase = spi_block_erase_c7,
5432 }
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005433 },
5434 .printlock = spi_prettyprint_status_register_bp2_srwd,
5435 .unlock = spi_disable_blockprotect_bp2_srwd,
5436 .write = spi_chip_write_256,
5437 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5438 .voltage = {2700, 3600},
5439 },
5440
5441 {
5442 .vendor = "ESI",
5443 .name = "ES25P16",
5444 .bustype = BUS_SPI,
5445 .manufacture_id = EXCEL_ID_NOPREFIX,
5446 .model_id = EXCEL_ES25P16,
5447 .total_size = 2 * 1024,
5448 .page_size = 256,
5449 /* 256-byte paramter page separate from memory array:
5450 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
5451 .feature_bits = FEATURE_WRSR_WREN,
5452 .tested = TEST_UNTESTED,
5453 .probe = probe_spi_rdid,
5454 .probe_timing = TIMING_ZERO,
5455 .block_erasers =
5456 {
5457 {
5458 .eraseblocks = { {64 * 1024, 32} },
5459 .block_erase = spi_block_erase_d8,
5460 }, {
5461 .eraseblocks = { {2 * 1024 * 1024, 1} },
5462 .block_erase = spi_block_erase_c7,
5463 }
5464 },
5465 .printlock = spi_prettyprint_status_register_bp2_srwd,
5466 .unlock = spi_disable_blockprotect_bp2_srwd,
5467 .write = spi_chip_write_256,
5468 .read = spi_chip_read, /* Fast Read (0x0B) supported */
5469 .voltage = {2700, 3600},
5470 },
5471
5472 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005473 .vendor = "Fujitsu",
5474 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005475 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005476 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005477 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005478 .total_size = 512,
5479 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005480 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005481 .tested = TEST_UNTESTED,
5482 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005483 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005484 .block_erasers =
5485 {
5486 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005487 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005488 {16 * 1024, 1},
5489 {8 * 1024, 2},
5490 {32 * 1024, 1},
5491 {64 * 1024, 7},
5492 },
Sean Nelson35727f72010-01-28 23:55:12 +00005493 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005494 }, {
5495 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005496 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005497 },
5498 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005499 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005500 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005501 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005502 },
5503
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005504 {
5505 .vendor = "Fujitsu",
5506 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005507 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005508 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005509 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005510 .total_size = 512,
5511 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005512 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005513 .tested = TEST_UNTESTED,
5514 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005515 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005516 .block_erasers =
5517 {
5518 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005519 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005520 {64 * 1024, 7},
5521 {32 * 1024, 1},
5522 {8 * 1024, 2},
5523 {16 * 1024, 1},
5524 },
Sean Nelson35727f72010-01-28 23:55:12 +00005525 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005526 }, {
5527 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005528 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005529 },
5530 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005531 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005532 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005533 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005534 },
5535
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005536 {
Sean Nelson35727f72010-01-28 23:55:12 +00005537 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005538 .vendor = "Fujitsu",
5539 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005540 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005541 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005542 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005543 .total_size = 512,
5544 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005545 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005546 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005547 .probe = probe_jedec,
5548 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005549 .block_erasers =
5550 {
5551 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005552 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005553 {16 * 1024, 1},
5554 {8 * 1024, 2},
5555 {32 * 1024, 1},
5556 {64 * 1024, 7},
5557 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005558 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005559 }, {
5560 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005561 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005562 },
5563 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005564 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005565 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005566 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005567 },
5568
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005569 {
5570 .vendor = "Fujitsu",
5571 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005572 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005573 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005574 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005575 .total_size = 512,
5576 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005577 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005578 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005579 .probe = probe_jedec,
5580 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005581 .block_erasers =
5582 {
5583 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005584 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005585 {64 * 1024, 7},
5586 {32 * 1024, 1},
5587 {8 * 1024, 2},
5588 {16 * 1024, 1},
5589 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005590 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005591 }, {
5592 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005593 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005594 },
5595 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005596 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005597 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005598 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005599 },
5600
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005601 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005602 .vendor = "Fujitsu",
5603 .name = "MBM29LV160BE",
5604 .bustype = BUS_PARALLEL,
5605 .manufacture_id = FUJITSU_ID,
5606 .model_id = FUJITSU_MBM29LV160BE,
5607 .total_size = 2 * 1024,
5608 .page_size = 0,
5609 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5610 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005611 .probe = probe_jedec,
5612 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005613 .block_erasers =
5614 {
5615 {
5616 .eraseblocks = {
5617 {16 * 1024, 1},
5618 {8 * 1024, 2},
5619 {32 * 1024, 1},
5620 {64 * 1024, 31},
5621 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005622 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005623 }, {
5624 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005625 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005626 },
5627 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005628 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005629 .read = read_memmapped,
5630 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5631 },
5632
5633 {
5634 .vendor = "Fujitsu",
5635 .name = "MBM29LV160TE",
5636 .bustype = BUS_PARALLEL,
5637 .manufacture_id = FUJITSU_ID,
5638 .model_id = FUJITSU_MBM29LV160TE,
5639 .total_size = 2 * 1024,
5640 .page_size = 0,
5641 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5642 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005643 .probe = probe_jedec,
5644 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005645 .block_erasers =
5646 {
5647 {
5648 .eraseblocks = {
5649 {64 * 1024, 31},
5650 {32 * 1024, 1},
5651 {8 * 1024, 2},
5652 {16 * 1024, 1},
5653 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005654 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005655 }, {
5656 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005657 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005658 },
5659 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005660 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005661 .read = read_memmapped,
5662 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5663 },
5664
5665 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005666 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00005667 .name = "GD25LQ40",
5668 .bustype = BUS_SPI,
5669 .manufacture_id = GIGADEVICE_ID,
5670 .model_id = GIGADEVICE_GD25LQ40,
5671 .total_size = 512,
5672 .page_size = 256,
5673 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5674 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5675 .tested = TEST_UNTESTED,
5676 .probe = probe_spi_rdid,
5677 .probe_timing = TIMING_ZERO,
5678 .block_erasers =
5679 {
5680 {
5681 .eraseblocks = { {4 * 1024, 128} },
5682 .block_erase = spi_block_erase_20,
5683 }, {
5684 .eraseblocks = { {32 * 1024, 16} },
5685 .block_erase = spi_block_erase_52,
5686 }, {
5687 .eraseblocks = { {64 * 1024, 8} },
5688 .block_erase = spi_block_erase_d8,
5689 }, {
5690 .eraseblocks = { {512 * 1024, 1} },
5691 .block_erase = spi_block_erase_60,
5692 }, {
5693 .eraseblocks = { {512 * 1024, 1} },
5694 .block_erase = spi_block_erase_c7,
5695 }
5696 },
5697 .printlock = spi_prettyprint_status_register_bp4_srwd,
5698 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5699 .write = spi_chip_write_256,
5700 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5701 .voltage = {1695, 1950},
5702 },
5703
5704 {
5705 .vendor = "GigaDevice",
5706 .name = "GD25LQ80",
5707 .bustype = BUS_SPI,
5708 .manufacture_id = GIGADEVICE_ID,
5709 .model_id = GIGADEVICE_GD25LQ80,
5710 .total_size = 1024,
5711 .page_size = 256,
5712 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5713 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5714 .tested = TEST_UNTESTED,
5715 .probe = probe_spi_rdid,
5716 .probe_timing = TIMING_ZERO,
5717 .block_erasers =
5718 {
5719 {
5720 .eraseblocks = { {4 * 1024, 256} },
5721 .block_erase = spi_block_erase_20,
5722 }, {
5723 .eraseblocks = { {32 * 1024, 32} },
5724 .block_erase = spi_block_erase_52,
5725 }, {
5726 .eraseblocks = { {64 * 1024, 16} },
5727 .block_erase = spi_block_erase_d8,
5728 }, {
5729 .eraseblocks = { {1 * 1024 * 1024, 1} },
5730 .block_erase = spi_block_erase_60,
5731 }, {
5732 .eraseblocks = { {1 * 1024 * 1024, 1} },
5733 .block_erase = spi_block_erase_c7,
5734 }
5735 },
5736 .printlock = spi_prettyprint_status_register_bp4_srwd,
5737 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5738 .write = spi_chip_write_256,
5739 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5740 .voltage = {1695, 1950},
5741 },
5742
5743 {
5744 .vendor = "GigaDevice",
5745 .name = "GD25LQ16",
5746 .bustype = BUS_SPI,
5747 .manufacture_id = GIGADEVICE_ID,
5748 .model_id = GIGADEVICE_GD25LQ16,
5749 .total_size = 2048,
5750 .page_size = 256,
5751 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5752 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5753 .tested = TEST_UNTESTED,
5754 .probe = probe_spi_rdid,
5755 .probe_timing = TIMING_ZERO,
5756 .block_erasers =
5757 {
5758 {
5759 .eraseblocks = { {4 * 1024, 512} },
5760 .block_erase = spi_block_erase_20,
5761 }, {
5762 .eraseblocks = { {32 * 1024, 64} },
5763 .block_erase = spi_block_erase_52,
5764 }, {
5765 .eraseblocks = { {64 * 1024, 32} },
5766 .block_erase = spi_block_erase_d8,
5767 }, {
5768 .eraseblocks = { {2 * 1024 * 1024, 1} },
5769 .block_erase = spi_block_erase_60,
5770 }, {
5771 .eraseblocks = { {2 * 1024 * 1024, 1} },
5772 .block_erase = spi_block_erase_c7,
5773 }
5774 },
5775 .printlock = spi_prettyprint_status_register_bp4_srwd,
5776 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5777 .write = spi_chip_write_256,
5778 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5779 .voltage = {1695, 1950},
5780 },
5781
5782 {
5783 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005784 .name = "GD25LQ32",
5785 .bustype = BUS_SPI,
5786 .manufacture_id = GIGADEVICE_ID,
5787 .model_id = GIGADEVICE_GD25LQ32,
5788 .total_size = 4096,
5789 .page_size = 256,
5790 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5791 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5792 .tested = TEST_OK_PREW,
5793 .probe = probe_spi_rdid,
5794 .probe_timing = TIMING_ZERO,
5795 .block_erasers =
5796 {
5797 {
5798 .eraseblocks = { {4 * 1024, 1024} },
5799 .block_erase = spi_block_erase_20,
5800 }, {
5801 .eraseblocks = { {32 * 1024, 128} },
5802 .block_erase = spi_block_erase_52,
5803 }, {
5804 .eraseblocks = { {64 * 1024, 64} },
5805 .block_erase = spi_block_erase_d8,
5806 }, {
5807 .eraseblocks = { {4 * 1024 * 1024, 1} },
5808 .block_erase = spi_block_erase_60,
5809 }, {
5810 .eraseblocks = { {4 * 1024 * 1024, 1} },
5811 .block_erase = spi_block_erase_c7,
5812 }
5813 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005814 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005815 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5816 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00005817 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5818 .voltage = {1695, 1950},
5819 },
5820
5821 {
5822 .vendor = "GigaDevice",
5823 .name = "GD25LQ64(B)",
5824 .bustype = BUS_SPI,
5825 .manufacture_id = GIGADEVICE_ID,
5826 .model_id = GIGADEVICE_GD25LQ64,
5827 .total_size = 8192,
5828 .page_size = 256,
5829 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5830 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005831 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00005832 .probe = probe_spi_rdid,
5833 .probe_timing = TIMING_ZERO,
5834 .block_erasers =
5835 {
5836 {
5837 .eraseblocks = { {4 * 1024, 2048} },
5838 .block_erase = spi_block_erase_20,
5839 }, {
5840 .eraseblocks = { {32 * 1024, 256} },
5841 .block_erase = spi_block_erase_52,
5842 }, {
5843 .eraseblocks = { {64 * 1024, 128} },
5844 .block_erase = spi_block_erase_d8,
5845 }, {
5846 .eraseblocks = { {8 * 1024 * 1024, 1} },
5847 .block_erase = spi_block_erase_60,
5848 }, {
5849 .eraseblocks = { {8 * 1024 * 1024, 1} },
5850 .block_erase = spi_block_erase_c7,
5851 }
5852 },
5853 .printlock = spi_prettyprint_status_register_bp4_srwd,
5854 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5855 .write = spi_chip_write_256,
5856 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5857 .voltage = {1695, 1950},
5858 },
5859
5860 {
5861 .vendor = "GigaDevice",
5862 .name = "GD25LQ128",
5863 .bustype = BUS_SPI,
5864 .manufacture_id = GIGADEVICE_ID,
5865 .model_id = GIGADEVICE_GD25LQ128,
5866 .total_size = 16384,
5867 .page_size = 256,
5868 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5869 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5870 .tested = TEST_UNTESTED,
5871 .probe = probe_spi_rdid,
5872 .probe_timing = TIMING_ZERO,
5873 .block_erasers =
5874 {
5875 {
5876 .eraseblocks = { {4 * 1024, 4096} },
5877 .block_erase = spi_block_erase_20,
5878 }, {
5879 .eraseblocks = { {32 * 1024, 512} },
5880 .block_erase = spi_block_erase_52,
5881 }, {
5882 .eraseblocks = { {64 * 1024, 256} },
5883 .block_erase = spi_block_erase_d8,
5884 }, {
5885 .eraseblocks = { {16 * 1024 * 1024, 1} },
5886 .block_erase = spi_block_erase_60,
5887 }, {
5888 .eraseblocks = { {16 * 1024 * 1024, 1} },
5889 .block_erase = spi_block_erase_c7,
5890 }
5891 },
5892 .printlock = spi_prettyprint_status_register_bp4_srwd,
5893 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5894 .write = spi_chip_write_256,
5895 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5896 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005897 },
5898
5899 {
5900 .vendor = "GigaDevice",
5901 .name = "GD25Q512",
5902 .bustype = BUS_SPI,
5903 .manufacture_id = GIGADEVICE_ID,
5904 .model_id = GIGADEVICE_GD25Q512,
5905 .total_size = 64,
5906 .page_size = 256,
5907 .feature_bits = FEATURE_WRSR_WREN,
5908 .tested = TEST_UNTESTED,
5909 .probe = probe_spi_rdid,
5910 .probe_timing = TIMING_ZERO,
5911 .block_erasers = {
5912 {
5913 .eraseblocks = { {4 * 1024, 16} },
5914 .block_erase = spi_block_erase_20,
5915 }, {
5916 .eraseblocks = { {32 * 1024, 2} },
5917 .block_erase = spi_block_erase_52,
5918 }, {
5919 .eraseblocks = { {64 * 1024, 1} },
5920 .block_erase = spi_block_erase_60,
5921 }, {
5922 .eraseblocks = { {64 * 1024, 1} },
5923 .block_erase = spi_block_erase_c7,
5924 }
5925 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005926 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005927 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5928 .write = spi_chip_write_256,
5929 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5930 .voltage = {2700, 3600},
5931 },
5932
5933 {
5934 .vendor = "GigaDevice",
5935 .name = "GD25Q10",
5936 .bustype = BUS_SPI,
5937 .manufacture_id = GIGADEVICE_ID,
5938 .model_id = GIGADEVICE_GD25Q10,
5939 .total_size = 128,
5940 .page_size = 256,
5941 .feature_bits = FEATURE_WRSR_WREN,
5942 .tested = TEST_UNTESTED,
5943 .probe = probe_spi_rdid,
5944 .probe_timing = TIMING_ZERO,
5945 .block_erasers = {
5946 {
5947 .eraseblocks = { {4 * 1024, 32} },
5948 .block_erase = spi_block_erase_20,
5949 }, {
5950 .eraseblocks = { {32 * 1024, 4} },
5951 .block_erase = spi_block_erase_52,
5952 }, {
5953 .eraseblocks = { {64 * 1024, 2} },
5954 .block_erase = spi_block_erase_d8,
5955 }, {
5956 .eraseblocks = { {128 * 1024, 1} },
5957 .block_erase = spi_block_erase_60,
5958 }, {
5959 .eraseblocks = { {128 * 1024, 1} },
5960 .block_erase = spi_block_erase_c7,
5961 }
5962 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005963 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005964 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5965 .write = spi_chip_write_256,
5966 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5967 .voltage = {2700, 3600},
5968 },
5969
5970 {
5971 .vendor = "GigaDevice",
5972 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005973 .bustype = BUS_SPI,
5974 .manufacture_id = GIGADEVICE_ID,
5975 .model_id = GIGADEVICE_GD25Q20,
5976 .total_size = 256,
5977 .page_size = 256,
5978 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00005979 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005980 .probe = probe_spi_rdid,
5981 .probe_timing = TIMING_ZERO,
5982 .block_erasers =
5983 {
5984 {
5985 .eraseblocks = { {4 * 1024, 64} },
5986 .block_erase = spi_block_erase_20,
5987 }, {
5988 .eraseblocks = { {32 * 1024, 8} },
5989 .block_erase = spi_block_erase_52,
5990 }, {
5991 .eraseblocks = { {64 * 1024, 4} },
5992 .block_erase = spi_block_erase_d8,
5993 }, {
5994 .eraseblocks = { {256 * 1024, 1} },
5995 .block_erase = spi_block_erase_60,
5996 }, {
5997 .eraseblocks = { {256 * 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) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006003 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006004 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00006005 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006006 },
6007
6008 {
6009 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006010 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006011 .bustype = BUS_SPI,
6012 .manufacture_id = GIGADEVICE_ID,
6013 .model_id = GIGADEVICE_GD25Q40,
6014 .total_size = 512,
6015 .page_size = 256,
6016 .feature_bits = FEATURE_WRSR_WREN,
6017 .tested = TEST_UNTESTED,
6018 .probe = probe_spi_rdid,
6019 .probe_timing = TIMING_ZERO,
6020 .block_erasers =
6021 {
6022 {
6023 .eraseblocks = { {4 * 1024, 128} },
6024 .block_erase = spi_block_erase_20,
6025 }, {
6026 .eraseblocks = { {32 * 1024, 16} },
6027 .block_erase = spi_block_erase_52,
6028 }, {
6029 .eraseblocks = { {64 * 1024, 8} },
6030 .block_erase = spi_block_erase_d8,
6031 }, {
6032 .eraseblocks = { {512 * 1024, 1} },
6033 .block_erase = spi_block_erase_60,
6034 }, {
6035 .eraseblocks = { {512 * 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",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006048 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006049 .bustype = BUS_SPI,
6050 .manufacture_id = GIGADEVICE_ID,
6051 .model_id = GIGADEVICE_GD25Q80,
6052 .total_size = 1024,
6053 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006054 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006055 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6056 .tested = TEST_OK_PREW,
6057 .probe = probe_spi_rdid,
6058 .probe_timing = TIMING_ZERO,
6059 .block_erasers =
6060 {
6061 {
6062 .eraseblocks = { {4 * 1024, 256} },
6063 .block_erase = spi_block_erase_20,
6064 }, {
6065 .eraseblocks = { {32 * 1024, 32} },
6066 .block_erase = spi_block_erase_52,
6067 }, {
6068 .eraseblocks = { {64 * 1024, 16} },
6069 .block_erase = spi_block_erase_d8,
6070 }, {
6071 .eraseblocks = { {1024 * 1024, 1} },
6072 .block_erase = spi_block_erase_60,
6073 }, {
6074 .eraseblocks = { {1024 * 1024, 1} },
6075 .block_erase = spi_block_erase_c7,
6076 }
6077 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006078 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006079 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006080 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006081 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006082 .voltage = {2700, 3600},
6083 },
6084
6085 {
6086 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006087 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006088 .bustype = BUS_SPI,
6089 .manufacture_id = GIGADEVICE_ID,
6090 .model_id = GIGADEVICE_GD25Q16,
6091 .total_size = 2048,
6092 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006093 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006094 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00006095 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006096 .probe = probe_spi_rdid,
6097 .probe_timing = TIMING_ZERO,
6098 .block_erasers =
6099 {
6100 {
6101 .eraseblocks = { {4 * 1024, 512} },
6102 .block_erase = spi_block_erase_20,
6103 }, {
6104 .eraseblocks = { {32 * 1024, 64} },
6105 .block_erase = spi_block_erase_52,
6106 }, {
6107 .eraseblocks = { {64 * 1024, 32} },
6108 .block_erase = spi_block_erase_d8,
6109 }, {
6110 .eraseblocks = { {2 * 1024 * 1024, 1} },
6111 .block_erase = spi_block_erase_60,
6112 }, {
6113 .eraseblocks = { {2 * 1024 * 1024, 1} },
6114 .block_erase = spi_block_erase_c7,
6115 }
6116 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006117 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006118 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006119 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006120 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006121 .voltage = {2700, 3600},
6122 },
6123
6124 {
6125 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006126 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006127 .bustype = BUS_SPI,
6128 .manufacture_id = GIGADEVICE_ID,
6129 .model_id = GIGADEVICE_GD25Q32,
6130 .total_size = 4096,
6131 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006132 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006133 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006134 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006135 .probe = probe_spi_rdid,
6136 .probe_timing = TIMING_ZERO,
6137 .block_erasers =
6138 {
6139 {
6140 .eraseblocks = { {4 * 1024, 1024} },
6141 .block_erase = spi_block_erase_20,
6142 }, {
6143 .eraseblocks = { {32 * 1024, 128} },
6144 .block_erase = spi_block_erase_52,
6145 }, {
6146 .eraseblocks = { {64 * 1024, 64} },
6147 .block_erase = spi_block_erase_d8,
6148 }, {
6149 .eraseblocks = { {4 * 1024 * 1024, 1} },
6150 .block_erase = spi_block_erase_60,
6151 }, {
6152 .eraseblocks = { {4 * 1024 * 1024, 1} },
6153 .block_erase = spi_block_erase_c7,
6154 }
6155 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006156 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006157 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006158 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006159 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006160 .voltage = {2700, 3600},
6161 },
6162
6163 {
6164 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006165 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006166 .bustype = BUS_SPI,
6167 .manufacture_id = GIGADEVICE_ID,
6168 .model_id = GIGADEVICE_GD25Q64,
6169 .total_size = 8192,
6170 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006171 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006172 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00006173 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006174 .probe = probe_spi_rdid,
6175 .probe_timing = TIMING_ZERO,
6176 .block_erasers =
6177 {
6178 {
6179 .eraseblocks = { {4 * 1024, 2048} },
6180 .block_erase = spi_block_erase_20,
6181 }, {
6182 .eraseblocks = { {32 * 1024, 256} },
6183 .block_erase = spi_block_erase_52,
6184 }, {
6185 .eraseblocks = { {64 * 1024, 128} },
6186 .block_erase = spi_block_erase_d8,
6187 }, {
6188 .eraseblocks = { {8 * 1024 * 1024, 1} },
6189 .block_erase = spi_block_erase_60,
6190 }, {
6191 .eraseblocks = { {8 * 1024 * 1024, 1} },
6192 .block_erase = spi_block_erase_c7,
6193 }
6194 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006195 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006196 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006197 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006198 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00006199 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006200 },
6201
6202 {
6203 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00006204 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006205 .bustype = BUS_SPI,
6206 .manufacture_id = GIGADEVICE_ID,
6207 .model_id = GIGADEVICE_GD25Q128,
6208 .total_size = 16384,
6209 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006210 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006211 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6212 .tested = TEST_UNTESTED,
6213 .probe = probe_spi_rdid,
6214 .probe_timing = TIMING_ZERO,
6215 .block_erasers =
6216 {
6217 {
6218 .eraseblocks = { {4 * 1024, 4096} },
6219 .block_erase = spi_block_erase_20,
6220 }, {
6221 .eraseblocks = { {32 * 1024, 512} },
6222 .block_erase = spi_block_erase_52,
6223 }, {
6224 .eraseblocks = { {64 * 1024, 256} },
6225 .block_erase = spi_block_erase_d8,
6226 }, {
6227 .eraseblocks = { {16 * 1024 * 1024, 1} },
6228 .block_erase = spi_block_erase_60,
6229 }, {
6230 .eraseblocks = { {16 * 1024 * 1024, 1} },
6231 .block_erase = spi_block_erase_c7,
6232 }
6233 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006234 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006235 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6236 .write = spi_chip_write_256,
6237 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6238 .voltage = {2700, 3600},
6239 },
6240
6241 {
6242 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006243 .name = "GD25Q128C",
6244 .bustype = BUS_SPI,
6245 .manufacture_id = GIGADEVICE_ID,
6246 .model_id = GIGADEVICE_GD25Q128,
6247 .total_size = 16384,
6248 .page_size = 256,
6249 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6250 /* QPI: enable 0x38, disable 0xFF */
6251 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6252 .tested = TEST_UNTESTED,
6253 .probe = probe_spi_rdid,
6254 .probe_timing = TIMING_ZERO,
6255 .block_erasers =
6256 {
6257 {
6258 .eraseblocks = { {4 * 1024, 4096} },
6259 .block_erase = spi_block_erase_20,
6260 }, {
6261 .eraseblocks = { {32 * 1024, 512} },
6262 .block_erase = spi_block_erase_52,
6263 }, {
6264 .eraseblocks = { {64 * 1024, 256} },
6265 .block_erase = spi_block_erase_d8,
6266 }, {
6267 .eraseblocks = { {16 * 1024 * 1024, 1} },
6268 .block_erase = spi_block_erase_60,
6269 }, {
6270 .eraseblocks = { {16 * 1024 * 1024, 1} },
6271 .block_erase = spi_block_erase_c7,
6272 }
6273 },
6274 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6275 .printlock = spi_prettyprint_status_register_bp4_srwd,
6276 .unlock = spi_disable_blockprotect_bp4_srwd,
6277 .write = spi_chip_write_256,
6278 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6279 .voltage = {2700, 3600},
6280 },
6281
6282 {
6283 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006284 .name = "GD25T80",
6285 .bustype = BUS_SPI,
6286 .manufacture_id = GIGADEVICE_ID,
6287 .model_id = GIGADEVICE_GD25T80,
6288 .total_size = 1024,
6289 .page_size = 256,
6290 /* OTP: 256B total; enter 0x3A */
6291 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6292 .tested = TEST_UNTESTED,
6293 .probe = probe_spi_rdid,
6294 .probe_timing = TIMING_ZERO,
6295 .block_erasers = {
6296 {
6297 .eraseblocks = { {4 * 1024, 256} },
6298 .block_erase = spi_block_erase_20,
6299 }, {
6300 .eraseblocks = { {64 * 1024, 16} },
6301 .block_erase = spi_block_erase_52,
6302 }, {
6303 .eraseblocks = { {64 * 1024, 16} },
6304 .block_erase = spi_block_erase_d8,
6305 }, {
6306 .eraseblocks = { {1024 * 1024, 1} },
6307 .block_erase = spi_block_erase_60,
6308 }, {
6309 .eraseblocks = { {1024 * 1024, 1} },
6310 .block_erase = spi_block_erase_c7,
6311 }
6312 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00006313 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006314 .unlock = spi_disable_blockprotect,
6315 .write = spi_chip_write_256,
6316 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00006317 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006318 },
6319
6320 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006321 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006322 .name = "GD25VQ21B",
6323 .bustype = BUS_SPI,
6324 .manufacture_id = GIGADEVICE_ID,
6325 .model_id = GIGADEVICE_GD25VQ21B,
6326 .total_size = 256,
6327 .page_size = 256,
6328 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6329 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6330 .tested = TEST_UNTESTED,
6331 .probe = probe_spi_rdid,
6332 .probe_timing = TIMING_ZERO,
6333 .block_erasers =
6334 {
6335 {
6336 .eraseblocks = { { 4 * 1024, 64} },
6337 .block_erase = spi_block_erase_20,
6338 }, {
6339 .eraseblocks = { { 32 * 1024, 8} },
6340 .block_erase = spi_block_erase_52,
6341 }, {
6342 .eraseblocks = { { 64 * 1024, 4} },
6343 .block_erase = spi_block_erase_d8,
6344 }, {
6345 .eraseblocks = { {256 * 1024, 1} },
6346 .block_erase = spi_block_erase_60,
6347 }, {
6348 .eraseblocks = { {256 * 1024, 1} },
6349 .block_erase = spi_block_erase_c7,
6350 }
6351 },
6352 .printlock = spi_prettyprint_status_register_bp4_srwd,
6353 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6354 .write = spi_chip_write_256,
6355 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6356 .voltage = {2300, 3600},
6357 },
6358
6359 {
6360 .vendor = "GigaDevice",
6361 .name = "GD25VQ40C",
6362 .bustype = BUS_SPI,
6363 .manufacture_id = GIGADEVICE_ID,
6364 .model_id = GIGADEVICE_GD25VQ41B,
6365 .total_size = 512,
6366 .page_size = 256,
6367 /* Supports SFDP */
6368 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6369 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6370 .tested = TEST_UNTESTED,
6371 .probe = probe_spi_rdid,
6372 .probe_timing = TIMING_ZERO,
6373 .block_erasers =
6374 {
6375 {
6376 .eraseblocks = { { 4 * 1024, 128} },
6377 .block_erase = spi_block_erase_20,
6378 }, {
6379 .eraseblocks = { { 32 * 1024, 16} },
6380 .block_erase = spi_block_erase_52,
6381 }, {
6382 .eraseblocks = { { 64 * 1024, 8} },
6383 .block_erase = spi_block_erase_d8,
6384 }, {
6385 .eraseblocks = { {512 * 1024, 1} },
6386 .block_erase = spi_block_erase_60,
6387 }, {
6388 .eraseblocks = { {512 * 1024, 1} },
6389 .block_erase = spi_block_erase_c7,
6390 }
6391 },
6392 .printlock = spi_prettyprint_status_register_bp4_srwd,
6393 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6394 .write = spi_chip_write_256,
6395 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6396 .voltage = {2300, 3600},
6397 },
6398
6399 {
6400 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006401 .name = "GD25VQ41B",
6402 .bustype = BUS_SPI,
6403 .manufacture_id = GIGADEVICE_ID,
6404 .model_id = GIGADEVICE_GD25VQ41B,
6405 .total_size = 512,
6406 .page_size = 256,
6407 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6408 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006409 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006410 .probe = probe_spi_rdid,
6411 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006412 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006413 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006414 {
6415 .eraseblocks = { { 4 * 1024, 128} },
6416 .block_erase = spi_block_erase_20,
6417 }, {
6418 .eraseblocks = { { 32 * 1024, 16} },
6419 .block_erase = spi_block_erase_52,
6420 }, {
6421 .eraseblocks = { { 64 * 1024, 8} },
6422 .block_erase = spi_block_erase_d8,
6423 }, {
6424 .eraseblocks = { {512 * 1024, 1} },
6425 .block_erase = spi_block_erase_60,
6426 }, {
6427 .eraseblocks = { {512 * 1024, 1} },
6428 .block_erase = spi_block_erase_c7,
6429 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006430 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006431 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00006432 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6433 .write = spi_chip_write_256,
6434 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6435 .voltage = {2300, 3600},
6436 },
6437
6438 {
6439 .vendor = "GigaDevice",
6440 .name = "GD25VQ80C",
6441 .bustype = BUS_SPI,
6442 .manufacture_id = GIGADEVICE_ID,
6443 .model_id = GIGADEVICE_GD25VQ80C,
6444 .total_size = 1024,
6445 .page_size = 256,
6446 /* Supports SFDP */
6447 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6448 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6449 .tested = TEST_UNTESTED,
6450 .probe = probe_spi_rdid,
6451 .probe_timing = TIMING_ZERO,
6452 .block_erasers =
6453 {
6454 {
6455 .eraseblocks = { { 4 * 1024, 256} },
6456 .block_erase = spi_block_erase_20,
6457 }, {
6458 .eraseblocks = { { 32 * 1024, 32} },
6459 .block_erase = spi_block_erase_52,
6460 }, {
6461 .eraseblocks = { { 64 * 1024, 16} },
6462 .block_erase = spi_block_erase_d8,
6463 }, {
6464 .eraseblocks = { {1024 * 1024, 1} },
6465 .block_erase = spi_block_erase_60,
6466 }, {
6467 .eraseblocks = { {1024 * 1024, 1} },
6468 .block_erase = spi_block_erase_c7,
6469 }
6470 },
6471 .printlock = spi_prettyprint_status_register_bp4_srwd,
6472 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6473 .write = spi_chip_write_256,
6474 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6475 .voltage = {2300, 3600},
6476 },
6477
6478 {
6479 .vendor = "GigaDevice",
6480 .name = "GD25VQ16C",
6481 .bustype = BUS_SPI,
6482 .manufacture_id = GIGADEVICE_ID,
6483 .model_id = GIGADEVICE_GD25VQ16C,
6484 .total_size = 2 * 1024,
6485 .page_size = 256,
6486 /* Supports SFDP */
6487 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6488 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6489 .tested = TEST_UNTESTED,
6490 .probe = probe_spi_rdid,
6491 .probe_timing = TIMING_ZERO,
6492 .block_erasers =
6493 {
6494 {
6495 .eraseblocks = { { 4 * 1024, 512} },
6496 .block_erase = spi_block_erase_20,
6497 }, {
6498 .eraseblocks = { { 32 * 1024, 64} },
6499 .block_erase = spi_block_erase_52,
6500 }, {
6501 .eraseblocks = { { 64 * 1024, 32} },
6502 .block_erase = spi_block_erase_d8,
6503 }, {
6504 .eraseblocks = { {2 * 1024 * 1024, 1} },
6505 .block_erase = spi_block_erase_60,
6506 }, {
6507 .eraseblocks = { {2 * 1024 * 1024, 1} },
6508 .block_erase = spi_block_erase_c7,
6509 }
6510 },
6511 .printlock = spi_prettyprint_status_register_bp4_srwd,
6512 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006513 .write = spi_chip_write_256,
6514 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6515 .voltage = {2300, 3600},
6516 },
6517
6518 {
David Borgc96a8bd2010-06-21 16:12:22 +00006519 .vendor = "Hyundai",
6520 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006521 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006522 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006523 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00006524 .total_size = 256,
6525 .page_size = 256 * 1024,
6526 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006527 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00006528 .probe = probe_jedec,
6529 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6530 .block_erasers =
6531 {
6532 {
6533 .eraseblocks = {
6534 {64 * 1024, 3},
6535 {32 * 1024, 1},
6536 {8 * 1024, 2},
6537 {16 * 1024, 1},
6538 },
6539 .block_erase = erase_sector_jedec,
6540 }, {
6541 .eraseblocks = { {256 * 1024, 1} },
6542 .block_erase = erase_chip_block_jedec,
6543 },
6544 },
6545 .write = write_jedec_1,
6546 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006547 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006548 },
6549
6550 {
6551 .vendor = "Hyundai",
6552 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006553 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00006554 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006555 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00006556 .total_size = 256,
6557 .page_size = 256 * 1024,
6558 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6559 .tested = TEST_UNTESTED,
6560 .probe = probe_jedec,
6561 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6562 .block_erasers =
6563 {
6564 {
6565 .eraseblocks = {
6566 {16 * 1024, 1},
6567 {8 * 1024, 2},
6568 {32 * 1024, 1},
6569 {64 * 1024, 3},
6570 },
6571 .block_erase = erase_sector_jedec,
6572 }, {
6573 .eraseblocks = { {256 * 1024, 1} },
6574 .block_erase = erase_chip_block_jedec,
6575 },
6576 },
6577 .write = write_jedec_1,
6578 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006579 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00006580 },
6581
6582 {
Joshua Roysf1324e02010-09-16 00:51:51 +00006583 .vendor = "Hyundai",
6584 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006585 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006586 .manufacture_id = HYUNDAI_ID,
6587 .model_id = HYUNDAI_HY29F040A,
6588 .total_size = 512,
6589 .page_size = 64 * 1024,
6590 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6591 .tested = TEST_UNTESTED,
6592 .probe = probe_jedec,
6593 .probe_timing = TIMING_ZERO,
6594 .block_erasers =
6595 {
6596 {
6597 .eraseblocks = { {64 * 1024, 8} },
6598 .block_erase = erase_sector_jedec,
6599 }, {
6600 .eraseblocks = { {512 * 1024, 1} },
6601 .block_erase = erase_chip_block_jedec,
6602 },
6603 },
6604 .write = write_jedec_1,
6605 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006606 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006607 },
6608
6609 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006610 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006611 .name = "25F160S33B8",
6612 .bustype = BUS_SPI,
6613 .manufacture_id = INTEL_ID,
6614 .model_id = INTEL_25F160S33B8,
6615 .total_size = 2048,
6616 .page_size = 256,
6617 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6618 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6619 .tested = TEST_UNTESTED,
6620 .probe = probe_spi_rdid,
6621 .probe_timing = TIMING_ZERO,
6622 .block_erasers =
6623 {
6624 {
6625 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6626 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6627 * have no effect on the memory contents, but sets a flag in the SR.
6628 .eraseblocks = {
6629 {8 * 1024, 8},
6630 {64 * 1024, 31} // inaccessible
6631 },
6632 .block_erase = spi_block_erase_40,
6633 }, { */
6634 .eraseblocks = { {64 * 1024, 32} },
6635 .block_erase = spi_block_erase_d8,
6636 }, {
6637 .eraseblocks = { {2 * 1024 * 1024, 1} },
6638 .block_erase = spi_block_erase_c7,
6639 }
6640 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006641 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6642 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006643 .write = spi_chip_write_256,
6644 .read = spi_chip_read, /* also fast read 0x0B */
6645 .voltage = {2700, 3600},
6646 },
6647
6648 {
6649 .vendor = "Intel",
6650 .name = "25F160S33T8",
6651 .bustype = BUS_SPI,
6652 .manufacture_id = INTEL_ID,
6653 .model_id = INTEL_25F160S33T8,
6654 .total_size = 2048,
6655 .page_size = 256,
6656 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6657 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6658 .tested = TEST_UNTESTED,
6659 .probe = probe_spi_rdid,
6660 .probe_timing = TIMING_ZERO,
6661 .block_erasers =
6662 {
6663 {
6664 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6665 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6666 * have no effect on the memory contents, but sets a flag in the SR.
6667 .eraseblocks = {
6668 {64 * 1024, 31}, // inaccessible
6669 {8 * 1024, 8}
6670 },
6671 .block_erase = spi_block_erase_40,
6672 }, { */
6673 .eraseblocks = { {64 * 1024, 32} },
6674 .block_erase = spi_block_erase_d8,
6675 }, {
6676 .eraseblocks = { {2 * 1024 * 1024, 1} },
6677 .block_erase = spi_block_erase_c7,
6678 }
6679 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006680 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6681 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006682 .write = spi_chip_write_256,
6683 .read = spi_chip_read, /* also fast read 0x0B */
6684 .voltage = {2700, 3600},
6685 },
6686
6687 {
6688 .vendor = "Intel",
6689 .name = "25F320S33B8",
6690 .bustype = BUS_SPI,
6691 .manufacture_id = INTEL_ID,
6692 .model_id = INTEL_25F320S33B8,
6693 .total_size = 4096,
6694 .page_size = 256,
6695 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6696 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6697 .tested = TEST_UNTESTED,
6698 .probe = probe_spi_rdid,
6699 .probe_timing = TIMING_ZERO,
6700 .block_erasers =
6701 {
6702 {
6703 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6704 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6705 * have no effect on the memory contents, but sets a flag in the SR.
6706 .eraseblocks = {
6707 {8 * 1024, 8},
6708 {64 * 1024, 63} // inaccessible
6709 },
6710 .block_erase = spi_block_erase_40,
6711 }, { */
6712 .eraseblocks = { {64 * 1024, 64} },
6713 .block_erase = spi_block_erase_d8,
6714 }, {
6715 .eraseblocks = { {4 * 1024 * 1024, 1} },
6716 .block_erase = spi_block_erase_c7,
6717 }
6718 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006719 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6720 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006721 .write = spi_chip_write_256,
6722 .read = spi_chip_read, /* also fast read 0x0B */
6723 .voltage = {2700, 3600},
6724 },
6725
6726 {
6727 .vendor = "Intel",
6728 .name = "25F320S33T8",
6729 .bustype = BUS_SPI,
6730 .manufacture_id = INTEL_ID,
6731 .model_id = INTEL_25F320S33T8,
6732 .total_size = 4096,
6733 .page_size = 256,
6734 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6735 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6736 .tested = TEST_UNTESTED,
6737 .probe = probe_spi_rdid,
6738 .probe_timing = TIMING_ZERO,
6739 .block_erasers =
6740 {
6741 {
6742 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6743 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6744 * have no effect on the memory contents, but sets a flag in the SR.
6745 .eraseblocks = {
6746 {64 * 1024, 63}, // inaccessible
6747 {8 * 1024, 8}
6748 },
6749 .block_erase = spi_block_erase_40,
6750 }, { */
6751 .eraseblocks = { {64 * 1024, 64} },
6752 .block_erase = spi_block_erase_d8,
6753 }, {
6754 .eraseblocks = { {4 * 1024 * 1024, 1} },
6755 .block_erase = spi_block_erase_c7,
6756 }
6757 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006758 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6759 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006760 .write = spi_chip_write_256,
6761 .read = spi_chip_read, /* also fast read 0x0B */
6762 .voltage = {2700, 3600},
6763 },
6764
6765 {
6766 .vendor = "Intel",
6767 .name = "25F640S33B8",
6768 .bustype = BUS_SPI,
6769 .manufacture_id = INTEL_ID,
6770 .model_id = INTEL_25F640S33B8,
6771 .total_size = 8192,
6772 .page_size = 256,
6773 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6774 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6775 .tested = TEST_UNTESTED,
6776 .probe = probe_spi_rdid,
6777 .probe_timing = TIMING_ZERO,
6778 .block_erasers =
6779 {
6780 {
6781 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6782 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6783 * have no effect on the memory contents, but sets a flag in the SR.
6784 .eraseblocks = {
6785 {8 * 1024, 8},
6786 {64 * 1024, 127} // inaccessible
6787 },
6788 .block_erase = spi_block_erase_40,
6789 }, { */
6790 .eraseblocks = { {64 * 1024, 128} },
6791 .block_erase = spi_block_erase_d8,
6792 }, {
6793 .eraseblocks = { {8 * 1024 * 1024, 1} },
6794 .block_erase = spi_block_erase_c7,
6795 }
6796 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006797 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6798 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006799 .write = spi_chip_write_256,
6800 .read = spi_chip_read, /* also fast read 0x0B */
6801 .voltage = {2700, 3600},
6802 },
6803
6804 {
6805 .vendor = "Intel",
6806 .name = "25F640S33T8",
6807 .bustype = BUS_SPI,
6808 .manufacture_id = INTEL_ID,
6809 .model_id = INTEL_25F640S33T8,
6810 .total_size = 8192,
6811 .page_size = 256,
6812 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6813 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6814 .tested = TEST_UNTESTED,
6815 .probe = probe_spi_rdid,
6816 .probe_timing = TIMING_ZERO,
6817 .block_erasers =
6818 {
6819 {
6820 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6821 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6822 * have no effect on the memory contents, but sets a flag in the SR.
6823 .eraseblocks = {
6824 {64 * 1024, 127}, // inaccessible
6825 {8 * 1024, 8}
6826 },
6827 .block_erase = spi_block_erase_40,
6828 }, { */
6829 .eraseblocks = { {64 * 1024, 128} },
6830 .block_erase = spi_block_erase_d8,
6831 }, {
6832 .eraseblocks = { {8 * 1024 * 1024, 1} },
6833 .block_erase = spi_block_erase_c7,
6834 }
6835 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006836 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6837 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006838 .write = spi_chip_write_256,
6839 .read = spi_chip_read, /* also fast read 0x0B */
6840 .voltage = {2700, 3600},
6841 },
6842
6843 {
6844 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006845 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006846 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006847 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006848 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006849 .total_size = 128,
6850 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00006851 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006852 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006853 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006854 .block_erasers =
6855 {
6856 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006857 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006858 {8 * 1024, 1},
6859 {4 * 1024, 2},
6860 {112 * 1024, 1},
6861 },
Sean Nelson28accc22010-03-19 18:47:06 +00006862 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006863 },
6864 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006865 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006866 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006867 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006868 },
6869
6870 {
6871 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006872 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006873 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006874 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006875 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006876 .total_size = 128,
6877 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Stefan Tauner23e10b82016-01-23 16:16:49 +00006878 .tested = TEST_OK_PREW,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006879 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006880 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006881 .block_erasers =
6882 {
6883 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006884 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006885 {112 * 1024, 1},
6886 {4 * 1024, 2},
6887 {8 * 1024, 1},
6888 },
Sean Nelson28accc22010-03-19 18:47:06 +00006889 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006890 },
6891 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006892 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006893 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006894 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006895 },
6896
6897 {
6898 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006899 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006900 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006901 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006902 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006903 .total_size = 256,
6904 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006905 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006906 .probe = probe_82802ab,
6907 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6908 .block_erasers =
6909 {
6910 {
6911 .eraseblocks = {
6912 {128 * 1024, 1},
6913 {96 * 1024, 1},
6914 {8 * 1024, 2},
6915 {16 * 1024, 1},
6916 },
6917 .block_erase = erase_block_82802ab,
6918 },
6919 },
6920 .write = write_82802ab,
6921 .read = read_memmapped,
6922 },
6923
6924 {
6925 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006926 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006927 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006928 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006929 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006930 .total_size = 512,
6931 .page_size = 256,
6932 .tested = TEST_UNTESTED,
6933 .probe = probe_82802ab,
6934 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006935 .block_erasers =
6936 {
6937 {
6938 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006939 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006940 },
6941 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006942 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006943 .write = write_82802ab,
6944 .read = read_memmapped,
6945 },
6946
6947 {
6948 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006949 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006950 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006951 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006952 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006953 .total_size = 512,
6954 .page_size = 128 * 1024, /* maximal block size */
6955 .tested = TEST_UNTESTED,
6956 .probe = probe_82802ab,
6957 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6958 .block_erasers =
6959 {
6960 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006961 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006962 {16 * 1024, 1},
6963 {8 * 1024, 2},
6964 {96 * 1024, 1},
6965 {128 * 1024, 3},
6966 },
6967 .block_erase = erase_block_82802ab,
6968 },
6969 },
6970 .write = write_82802ab,
6971 .read = read_memmapped,
6972 },
6973
6974 {
6975 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006976 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006977 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006978 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006979 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006980 .total_size = 512,
6981 .page_size = 128 * 1024, /* maximal block size */
6982 .tested = TEST_UNTESTED,
6983 .probe = probe_82802ab,
6984 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6985 .block_erasers =
6986 {
6987 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006988 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006989 {128 * 1024, 3},
6990 {96 * 1024, 1},
6991 {8 * 1024, 2},
6992 {16 * 1024, 1},
6993 },
6994 .block_erase = erase_block_82802ab,
6995 },
6996 },
6997 .write = write_82802ab,
6998 .read = read_memmapped,
6999 },
7000
7001 {
7002 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007003 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007004 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007005 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007006 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00007007 .total_size = 512,
7008 .page_size = 128 * 1024, /* maximal block size */
7009 .feature_bits = FEATURE_ADDR_SHIFTED,
7010 .tested = TEST_UNTESTED,
7011 .probe = probe_82802ab,
7012 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7013 .block_erasers =
7014 {
7015 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007016 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007017 {16 * 1024, 1},
7018 {8 * 1024, 2},
7019 {96 * 1024, 1},
7020 {128 * 1024, 3},
7021 },
7022 .block_erase = erase_block_82802ab,
7023 },
7024 },
7025 .write = write_82802ab,
7026 .read = read_memmapped,
7027 },
7028
7029 {
7030 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007031 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007032 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00007033 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007034 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00007035 .total_size = 512,
7036 .page_size = 128 * 1024, /* maximal block size */
7037 .feature_bits = FEATURE_ADDR_SHIFTED,
7038 .tested = TEST_UNTESTED,
7039 .probe = probe_82802ab,
7040 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7041 .block_erasers =
7042 {
7043 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007044 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00007045 {128 * 1024, 3},
7046 {96 * 1024, 1},
7047 {8 * 1024, 2},
7048 {16 * 1024, 1},
7049 },
7050 .block_erase = erase_block_82802ab,
7051 },
7052 },
7053 .write = write_82802ab,
7054 .read = read_memmapped,
7055 },
7056
7057 {
7058 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007059 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007060 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007061 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007062 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007063 .total_size = 512,
7064 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007065 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007066 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007067 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007068 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007069 .block_erasers =
7070 {
7071 {
7072 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00007073 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007074 },
7075 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007076 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007077 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007078 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007079 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007080 },
7081
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007082 {
7083 .vendor = "Intel",
7084 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007085 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007086 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00007087 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007088 .total_size = 1024,
7089 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00007090 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00007091 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007092 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007093 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00007094 .block_erasers =
7095 {
7096 {
7097 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00007098 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00007099 },
7100 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00007101 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007102 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007103 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007104 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007105 },
7106
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007107 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007108 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007109 .name = "IS25LP128",
7110 .bustype = BUS_SPI,
7111 .manufacture_id = ISSI_ID_SPI,
7112 .model_id = ISSI_IS25LP128,
7113 .total_size = 16384,
7114 .page_size = 256,
7115 /* OTP: 1024B total; read 0x48; write 0x42 */
7116 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7117 .tested = TEST_OK_PREW,
7118 .probe = probe_spi_rdid,
7119 .probe_timing = TIMING_ZERO,
7120 .block_erasers =
7121 {
7122 {
7123 .eraseblocks = { {4 * 1024, 4096} },
7124 .block_erase = spi_block_erase_20,
7125 }, {
7126 .eraseblocks = { {4 * 1024, 4096} },
7127 .block_erase = spi_block_erase_d7,
7128 }, {
7129 .eraseblocks = { {32 * 1024, 512} },
7130 .block_erase = spi_block_erase_52,
7131 }, {
7132 .eraseblocks = { {64 * 1024, 256} },
7133 .block_erase = spi_block_erase_d8,
7134 }, {
7135 .eraseblocks = { {16 * 1024 * 1024, 1} },
7136 .block_erase = spi_block_erase_60,
7137 }, {
7138 .eraseblocks = { {16 * 1024 * 1024, 1} },
7139 .block_erase = spi_block_erase_c7,
7140 }
7141 },
7142 .unlock = spi_disable_blockprotect,
7143 .write = spi_chip_write_256,
7144 .read = spi_chip_read,
7145 .voltage = {2300, 3600},
7146 },
7147
7148 {
7149 .vendor = "ISSI",
7150 .name = "IS25WP128",
7151 .bustype = BUS_SPI,
7152 .manufacture_id = ISSI_ID_SPI,
7153 .model_id = ISSI_IS25WP128,
7154 .total_size = 16384,
7155 .page_size = 256,
7156 /* OTP: 1024B total; read 0x48; write 0x42 */
7157 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7158 .tested = TEST_OK_PREW,
7159 .probe = probe_spi_rdid,
7160 .probe_timing = TIMING_ZERO,
7161 .block_erasers =
7162 {
7163 {
7164 .eraseblocks = { {4 * 1024, 4096} },
7165 .block_erase = spi_block_erase_20,
7166 }, {
7167 .eraseblocks = { {4 * 1024, 4096} },
7168 .block_erase = spi_block_erase_d7,
7169 }, {
7170 .eraseblocks = { {32 * 1024, 512} },
7171 .block_erase = spi_block_erase_52,
7172 }, {
7173 .eraseblocks = { {64 * 1024, 256} },
7174 .block_erase = spi_block_erase_d8,
7175 }, {
7176 .eraseblocks = { {16 * 1024 * 1024, 1} },
7177 .block_erase = spi_block_erase_60,
7178 }, {
7179 .eraseblocks = { {16 * 1024 * 1024, 1} },
7180 .block_erase = spi_block_erase_c7,
7181 }
7182 },
7183 .unlock = spi_disable_blockprotect,
7184 .write = spi_chip_write_256,
7185 .read = spi_chip_read,
7186 .voltage = {1650, 1950},
7187 },
7188
7189 {
7190 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007191 .name = "IS29GL064B",
7192 .bustype = BUS_PARALLEL,
7193 .manufacture_id = ISSI_ID,
7194 .model_id = ISSI_PMC_IS29GL064B,
7195 .total_size = 8192,
7196 .page_size = 128 * 1024, /* actual page size is 16 */
7197 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7198 .tested = TEST_UNTESTED,
7199 .probe = probe_jedec_29gl,
7200 .probe_timing = TIMING_ZERO,
7201 .block_erasers =
7202 {
7203 {
7204 .eraseblocks = {
7205 {8 * 1024, 8},
7206 {64 * 1024, 127},
7207 },
7208 .block_erase = erase_sector_jedec,
7209 }, {
7210 .eraseblocks = { {8 * 1024 * 1024, 1} },
7211 .block_erase = erase_chip_block_jedec,
7212 },
7213 },
7214 .write = write_jedec_1,
7215 .read = read_memmapped,
7216 .voltage = {2700, 3600},
7217 },
7218
7219 {
7220 .vendor = "ISSI",
7221 .name = "IS29GL064T",
7222 .bustype = BUS_PARALLEL,
7223 .manufacture_id = ISSI_ID,
7224 .model_id = ISSI_PMC_IS29GL064T,
7225 .total_size = 8192,
7226 .page_size = 128 * 1024, /* actual page size is 16 */
7227 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7228 .tested = TEST_UNTESTED,
7229 .probe = probe_jedec_29gl,
7230 .probe_timing = TIMING_ZERO,
7231 .block_erasers =
7232 {
7233 {
7234 .eraseblocks = {
7235 {64 * 1024, 127},
7236 {8 * 1024, 8},
7237 },
7238 .block_erase = erase_sector_jedec,
7239 }, {
7240 .eraseblocks = { {8 * 1024 * 1024, 1} },
7241 .block_erase = erase_chip_block_jedec,
7242 },
7243 },
7244 .write = write_jedec_1,
7245 .read = read_memmapped,
7246 .voltage = {2700, 3600},
7247 },
7248
7249 {
7250 .vendor = "ISSI",
7251 .name = "IS29GL064H/L",
7252 .bustype = BUS_PARALLEL,
7253 .manufacture_id = ISSI_ID,
7254 .model_id = ISSI_PMC_IS29GL064HL,
7255 .total_size = 8192,
7256 .page_size = 128 * 1024, /* actual page size is 16 */
7257 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7258 .tested = TEST_UNTESTED,
7259 .probe = probe_jedec_29gl,
7260 .probe_timing = TIMING_ZERO,
7261 .block_erasers =
7262 {
7263 {
7264 .eraseblocks = { {64 * 1024, 128} },
7265 .block_erase = erase_sector_jedec,
7266 }, {
7267 .eraseblocks = { {8 * 1024 * 1024, 1} },
7268 .block_erase = erase_chip_block_jedec,
7269 },
7270 },
7271 .write = write_jedec_1,
7272 .read = read_memmapped,
7273 .voltage = {2700, 3600},
7274 },
7275
7276 {
7277 .vendor = "ISSI",
7278 .name = "IS29GL128H/L",
7279 .bustype = BUS_PARALLEL,
7280 .manufacture_id = ISSI_ID,
7281 .model_id = ISSI_PMC_IS29GL128HL,
7282 .total_size = 16384,
7283 .page_size = 128 * 1024, /* actual page size is 16 */
7284 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7285 .tested = TEST_UNTESTED,
7286 .probe = probe_jedec_29gl,
7287 .probe_timing = TIMING_ZERO,
7288 .block_erasers =
7289 {
7290 {
7291 .eraseblocks = { {128 * 1024, 128} },
7292 .block_erase = erase_sector_jedec,
7293 }, {
7294 .eraseblocks = { {16 * 1024 * 1024, 1} },
7295 .block_erase = erase_chip_block_jedec,
7296 },
7297 },
7298 .write = write_jedec_1,
7299 .read = read_memmapped,
7300 .voltage = {2700, 3600},
7301 },
7302
7303 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007304 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007305 .name = "MX23L1654",
7306 .bustype = BUS_SPI,
7307 .manufacture_id = MACRONIX_ID,
7308 .model_id = MACRONIX_MX23L1654,
7309 .total_size = 2048,
7310 .page_size = 256,
7311 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7312 .probe = probe_spi_rdid,
7313 .probe_timing = TIMING_ZERO,
7314 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7315 .read = spi_chip_read, /* Fast read (0x0B) supported */
7316 .voltage = {3000, 3600},
7317 },
7318
7319 {
7320 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007321 .name = "MX23L3254",
7322 .bustype = BUS_SPI,
7323 .manufacture_id = MACRONIX_ID,
7324 .model_id = MACRONIX_MX23L3254,
7325 .total_size = 4096,
7326 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00007327 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00007328 .probe = probe_spi_rdid,
7329 .probe_timing = TIMING_ZERO,
7330 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7331 .read = spi_chip_read, /* Fast read (0x0B) supported */
7332 .voltage = {3000, 3600},
7333 },
7334
7335 {
7336 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00007337 .name = "MX23L6454",
7338 .bustype = BUS_SPI,
7339 .manufacture_id = MACRONIX_ID,
7340 .model_id = MACRONIX_MX23L6454,
7341 .total_size = 8192,
7342 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007343 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00007344 .probe = probe_spi_rdid,
7345 .probe_timing = TIMING_ZERO,
7346 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7347 .read = spi_chip_read, /* Fast read (0x0B) supported */
7348 .voltage = {3000, 3600},
7349 },
7350
7351 {
7352 .vendor = "Macronix",
7353 .name = "MX23L12854",
7354 .bustype = BUS_SPI,
7355 .manufacture_id = MACRONIX_ID,
7356 .model_id = MACRONIX_MX23L12854,
7357 .total_size = 16384,
7358 .page_size = 256,
7359 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7360 .probe = probe_spi_rdid,
7361 .probe_timing = TIMING_ZERO,
7362 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7363 .read = spi_chip_read, /* Fast read (0x0B) supported */
7364 .voltage = {3000, 3600},
7365 },
7366
7367 {
7368 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007369 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007370 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007371 .manufacture_id = MACRONIX_ID,
7372 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007373 .total_size = 64,
7374 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007375 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007376 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007377 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007378 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007379 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007380 .block_erasers =
7381 {
7382 {
7383 .eraseblocks = { {4 * 1024, 16} },
7384 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007385 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007386 .eraseblocks = { {64 * 1024, 1} },
7387 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007388 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007389 .eraseblocks = { {64 * 1024, 1} },
7390 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007391 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007392 .eraseblocks = { {64 * 1024, 1} },
7393 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007394 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007395 .eraseblocks = { {64 * 1024, 1} },
7396 .block_erase = spi_block_erase_c7,
7397 },
7398 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007399 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007400 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007401 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007402 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
7403 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00007404 },
7405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007406 {
7407 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00007408 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007409 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007410 .manufacture_id = MACRONIX_ID,
7411 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007412 .total_size = 128,
7413 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007414 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00007415 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00007416 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007417 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007418 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007419 .block_erasers =
7420 {
7421 {
7422 .eraseblocks = { {4 * 1024, 32} },
7423 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007424 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007425 .eraseblocks = { {64 * 1024, 2} },
7426 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007427 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007428 .eraseblocks = { {128 * 1024, 1} },
7429 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007430 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00007431 .eraseblocks = { {128 * 1024, 1} },
7432 .block_erase = spi_block_erase_c7,
7433 },
7434 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007435 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007436 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007437 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007438 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007439 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007440 },
7441
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007442 {
7443 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007444 .name = "MX25L2005(C)/MX25L2006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007445 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007446 .manufacture_id = MACRONIX_ID,
7447 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007448 .total_size = 256,
7449 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007450 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007451 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007452 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007453 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007454 .block_erasers =
7455 {
7456 {
7457 .eraseblocks = { {4 * 1024, 64} },
7458 .block_erase = spi_block_erase_20,
7459 }, {
7460 .eraseblocks = { {64 * 1024, 4} },
7461 .block_erase = spi_block_erase_52,
7462 }, {
7463 .eraseblocks = { {64 * 1024, 4} },
7464 .block_erase = spi_block_erase_d8,
7465 }, {
7466 .eraseblocks = { {256 * 1024, 1} },
7467 .block_erase = spi_block_erase_60,
7468 }, {
7469 .eraseblocks = { {256 * 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 */
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 = "MX25L4005(A/C)/MX25L4006E",
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_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007486 .total_size = 512,
7487 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007488 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +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, 128} },
7496 .block_erase = spi_block_erase_20,
7497 }, {
7498 .eraseblocks = { {64 * 1024, 8} },
7499 .block_erase = spi_block_erase_52,
7500 }, {
7501 .eraseblocks = { {64 * 1024, 8} },
7502 .block_erase = spi_block_erase_d8,
7503 }, {
7504 .eraseblocks = { {512 * 1024, 1} },
7505 .block_erase = spi_block_erase_60,
7506 }, {
7507 .eraseblocks = { {512 * 1024, 1} },
7508 .block_erase = spi_block_erase_c7,
7509 },
7510 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007511 .printlock = spi_prettyprint_status_register_bp2_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 Tauner74dc73f2015-03-01 22:04:38 +00007520 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
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_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007524 .total_size = 1024,
7525 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007526 /* MX25L8006E, MX25L8008E support SFDP */
7527 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
David Hendricks67db2eb2010-09-03 03:35:48 +00007528 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00007529 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007530 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007531 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007532 .block_erasers =
7533 {
7534 {
7535 .eraseblocks = { {4 * 1024, 256} },
7536 .block_erase = spi_block_erase_20,
7537 }, {
7538 .eraseblocks = { {64 * 1024, 16} },
7539 .block_erase = spi_block_erase_52,
7540 }, {
7541 .eraseblocks = { {64 * 1024, 16} },
7542 .block_erase = spi_block_erase_d8,
7543 }, {
7544 .eraseblocks = { {1024 * 1024, 1} },
7545 .block_erase = spi_block_erase_60,
7546 }, {
7547 .eraseblocks = { {1024 * 1024, 1} },
7548 .block_erase = spi_block_erase_c7,
7549 },
7550 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007551 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007552 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007553 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00007554 .read = spi_chip_read, /* Fast read (0x0B) supported */
7555 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00007556 },
7557
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007558 {
7559 .vendor = "Macronix",
7560 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007561 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007562 .manufacture_id = MACRONIX_ID,
7563 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007564 .total_size = 2048,
7565 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007566 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +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 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007573 .eraseblocks = { {64 * 1024, 32} },
7574 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007575 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007576 .eraseblocks = { {64 * 1024, 32} },
7577 .block_erase = spi_block_erase_d8,
7578 }, {
7579 .eraseblocks = { {2 * 1024 * 1024, 1} },
7580 .block_erase = spi_block_erase_60,
7581 }, {
7582 .eraseblocks = { {2 * 1024 * 1024, 1} },
7583 .block_erase = spi_block_erase_c7,
7584 },
7585 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007586 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00007587 .unlock = spi_disable_blockprotect,
7588 .write = spi_chip_write_256,
7589 .read = spi_chip_read, /* Fast read (0x0B) supported */
7590 .voltage = {2700, 3600},
7591 },
7592
7593 {
7594 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007595 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007596 .bustype = BUS_SPI,
7597 .manufacture_id = MACRONIX_ID,
7598 .model_id = MACRONIX_MX25L1605,
7599 .total_size = 2048,
7600 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007601 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00007602 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7603 .tested = TEST_OK_PREW,
7604 .probe = probe_spi_rdid,
7605 .probe_timing = TIMING_ZERO,
7606 .block_erasers =
7607 {
7608 {
7609 .eraseblocks = { {4 * 1024, 512} },
7610 .block_erase = spi_block_erase_20,
7611 }, {
7612 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00007613 .block_erase = spi_block_erase_52,
7614 }, {
7615 .eraseblocks = { {64 * 1024, 32} },
7616 .block_erase = spi_block_erase_d8,
7617 }, {
7618 .eraseblocks = { {2 * 1024 * 1024, 1} },
7619 .block_erase = spi_block_erase_60,
7620 }, {
7621 .eraseblocks = { {2 * 1024 * 1024, 1} },
7622 .block_erase = spi_block_erase_c7,
7623 },
7624 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007625 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007626 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007627 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007628 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00007629 .voltage = {2700, 3600},
7630 },
7631
7632 {
7633 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007634 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007635 .bustype = BUS_SPI,
7636 .manufacture_id = MACRONIX_ID,
7637 .model_id = MACRONIX_MX25L1605,
7638 .total_size = 2048,
7639 .page_size = 256,
7640 .feature_bits = FEATURE_WRSR_WREN,
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} },
7651 .block_erase = spi_block_erase_d8,
7652 }, {
7653 .eraseblocks = { {2 * 1024 * 1024, 1} },
7654 .block_erase = spi_block_erase_60,
7655 }, {
7656 .eraseblocks = { {2 * 1024 * 1024, 1} },
7657 .block_erase = spi_block_erase_c7,
7658 },
7659 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007660 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007661 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007662 .write = spi_chip_write_256,
7663 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007664 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007665 },
7666
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007667 {
7668 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007669 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007670 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007671 .manufacture_id = MACRONIX_ID,
7672 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007673 .total_size = 2048,
7674 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007675 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7676 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007677 .tested = TEST_UNTESTED,
7678 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007679 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007680 .block_erasers =
7681 {
7682 {
7683 .eraseblocks = { {4 * 1024, 512} },
7684 .block_erase = spi_block_erase_20,
7685 }, {
7686 .eraseblocks = { {64 * 1024, 32} },
7687 .block_erase = spi_block_erase_d8,
7688 }, {
7689 .eraseblocks = { {2 * 1024 * 1024, 1} },
7690 .block_erase = spi_block_erase_60,
7691 }, {
7692 .eraseblocks = { {2 * 1024 * 1024, 1} },
7693 .block_erase = spi_block_erase_c7,
7694 }
7695 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007696 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007697 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007698 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007699 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007700 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007701 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00007702
Stephan Guillouxf5c70902009-04-19 23:04:00 +00007703 {
7704 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00007705 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007706 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007707 .manufacture_id = MACRONIX_ID,
7708 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007709 .total_size = 2048,
7710 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007711 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7712 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007713 .tested = TEST_UNTESTED,
7714 .probe = probe_spi_rdid,
7715 .probe_timing = TIMING_ZERO,
7716 .block_erasers =
7717 {
7718 {
7719 .eraseblocks = { {4 * 1024, 512} },
7720 .block_erase = spi_block_erase_20,
7721 }, {
7722 .eraseblocks = { {64 * 1024, 32} },
7723 .block_erase = spi_block_erase_d8,
7724 }, {
7725 .eraseblocks = { {2 * 1024 * 1024, 1} },
7726 .block_erase = spi_block_erase_60,
7727 }, {
7728 .eraseblocks = { {2 * 1024 * 1024, 1} },
7729 .block_erase = spi_block_erase_c7,
7730 }
7731 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007732 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007733 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007734 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007735 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00007736 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00007737 },
7738
7739 {
7740 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00007741 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007742 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007743 .manufacture_id = MACRONIX_ID,
7744 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007745 .total_size = 4096,
7746 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007747 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00007748 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007749 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007750 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007751 .block_erasers =
7752 {
7753 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007754 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007755 .block_erase = spi_block_erase_20,
7756 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007757 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007758 .block_erase = spi_block_erase_d8,
7759 }, {
7760 .eraseblocks = { {4 * 1024 * 1024, 1} },
7761 .block_erase = spi_block_erase_60,
7762 }, {
7763 .eraseblocks = { {4 * 1024 * 1024, 1} },
7764 .block_erase = spi_block_erase_c7,
7765 },
7766 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007767 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007768 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007769 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007770 .read = spi_chip_read, /* Fast read (0x0B) supported */
7771 .voltage = {2700, 3600},
7772 },
7773
7774 {
7775 .vendor = "Macronix",
7776 .name = "MX25L3205D/MX25L3208D",
7777 .bustype = BUS_SPI,
7778 .manufacture_id = MACRONIX_ID,
7779 .model_id = MACRONIX_MX25L3205,
7780 .total_size = 4096,
7781 .page_size = 256,
7782 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7783 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7784 .tested = TEST_OK_PREW,
7785 .probe = probe_spi_rdid,
7786 .probe_timing = TIMING_ZERO,
7787 .block_erasers =
7788 {
7789 {
7790 .eraseblocks = { {4 * 1024, 1024} },
7791 .block_erase = spi_block_erase_20,
7792 }, {
7793 .eraseblocks = { {64 * 1024, 64} },
7794 .block_erase = spi_block_erase_d8,
7795 }, {
7796 .eraseblocks = { {4 * 1024 * 1024, 1} },
7797 .block_erase = spi_block_erase_60,
7798 }, {
7799 .eraseblocks = { {4 * 1024 * 1024, 1} },
7800 .block_erase = spi_block_erase_c7,
7801 },
7802 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007803 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007804 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007805 .write = spi_chip_write_256,
7806 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7807 .voltage = {2700, 3600},
7808 },
7809
7810 {
7811 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007812 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007813 .bustype = BUS_SPI,
7814 .manufacture_id = MACRONIX_ID,
7815 .model_id = MACRONIX_MX25L3205,
7816 .total_size = 4096,
7817 .page_size = 256,
7818 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7819 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7820 .tested = TEST_OK_PREW,
7821 .probe = probe_spi_rdid,
7822 .probe_timing = TIMING_ZERO,
7823 .block_erasers =
7824 {
7825 {
7826 .eraseblocks = { {4 * 1024, 1024} },
7827 .block_erase = spi_block_erase_20,
7828 }, {
7829 .eraseblocks = { {64 * 1024, 64} },
7830 .block_erase = spi_block_erase_d8,
7831 }, {
7832 .eraseblocks = { {64 * 1024, 64} },
7833 .block_erase = spi_block_erase_52,
7834 }, {
7835 .eraseblocks = { {4 * 1024 * 1024, 1} },
7836 .block_erase = spi_block_erase_60,
7837 }, {
7838 .eraseblocks = { {4 * 1024 * 1024, 1} },
7839 .block_erase = spi_block_erase_c7,
7840 },
7841 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007842 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007843 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007844 .write = spi_chip_write_256,
7845 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007846 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007847 },
7848
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007849 {
7850 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007851 .name = "MX25L3273E",
7852 .bustype = BUS_SPI,
7853 .manufacture_id = MACRONIX_ID,
7854 .model_id = MACRONIX_MX25L3205,
7855 .total_size = 4096,
7856 .page_size = 256,
7857 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7858 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00007859 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007860 .probe = probe_spi_rdid,
7861 .probe_timing = TIMING_ZERO,
7862 .block_erasers =
7863 {
7864 {
7865 .eraseblocks = { {4 * 1024, 1024} },
7866 .block_erase = spi_block_erase_20,
7867 }, {
7868 .eraseblocks = { {32 * 1024, 128} },
7869 .block_erase = spi_block_erase_52,
7870 }, {
7871 .eraseblocks = { {64 * 1024, 64} },
7872 .block_erase = spi_block_erase_d8,
7873 }, {
7874 .eraseblocks = { {4 * 1024 * 1024, 1} },
7875 .block_erase = spi_block_erase_60,
7876 }, {
7877 .eraseblocks = { {4 * 1024 * 1024, 1} },
7878 .block_erase = spi_block_erase_c7,
7879 },
7880 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007881 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007882 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007883 .write = spi_chip_write_256,
7884 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7885 .voltage = {2700, 3600},
7886 },
7887
7888 {
7889 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007890 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007891 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007892 .manufacture_id = MACRONIX_ID,
7893 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007894 .total_size = 4096,
7895 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007896 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
7897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007898 .tested = TEST_UNTESTED,
7899 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007900 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007901 .block_erasers =
7902 {
7903 {
7904 .eraseblocks = { {4 * 1024, 1024} },
7905 .block_erase = spi_block_erase_20,
7906 }, {
7907 .eraseblocks = { {64 * 1024, 64} },
7908 .block_erase = spi_block_erase_d8,
7909 }, {
7910 .eraseblocks = { {4 * 1024 * 1024, 1} },
7911 .block_erase = spi_block_erase_60,
7912 }, {
7913 .eraseblocks = { {4 * 1024 * 1024, 1} },
7914 .block_erase = spi_block_erase_c7,
7915 }
7916 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007917 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007918 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007919 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007920 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007921 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007922 },
7923
7924 {
7925 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007926 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007927 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007928 .manufacture_id = MACRONIX_ID,
7929 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007930 .total_size = 8192,
7931 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007932 /* Has an additional 512B EEPROM sector */
7933 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00007934 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007935 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007936 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007937 .block_erasers =
7938 {
7939 {
7940 .eraseblocks = { {64 * 1024, 128} },
7941 .block_erase = spi_block_erase_20,
7942 }, {
7943 .eraseblocks = { {64 * 1024, 128} },
7944 .block_erase = spi_block_erase_d8,
7945 }, {
7946 .eraseblocks = { {8 * 1024 * 1024, 1} },
7947 .block_erase = spi_block_erase_60,
7948 }, {
7949 .eraseblocks = { {8 * 1024 * 1024, 1} },
7950 .block_erase = spi_block_erase_c7,
7951 }
7952 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007953 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007954 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007955 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007956 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007957 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007958 },
7959
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007960 {
7961 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007962 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00007963 .bustype = BUS_SPI,
7964 .manufacture_id = MACRONIX_ID,
7965 .model_id = MACRONIX_MX25L6405,
7966 .total_size = 8192,
7967 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007968 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00007969 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7970 .tested = TEST_OK_PREW,
7971 .probe = probe_spi_rdid,
7972 .probe_timing = TIMING_ZERO,
7973 .block_erasers =
7974 {
7975 {
7976 .eraseblocks = { {4 * 1024, 2048} },
7977 .block_erase = spi_block_erase_20,
7978 }, {
7979 .eraseblocks = { {64 * 1024, 128} },
7980 .block_erase = spi_block_erase_d8,
7981 }, {
7982 .eraseblocks = { {8 * 1024 * 1024, 1} },
7983 .block_erase = spi_block_erase_60,
7984 }, {
7985 .eraseblocks = { {8 * 1024 * 1024, 1} },
7986 .block_erase = spi_block_erase_c7,
7987 }
7988 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007989 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007990 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007991 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007992 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00007993 .voltage = {2700, 3600},
7994 },
7995
7996 {
7997 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007998 .name = "MX25L6406E/MX25L6408E",
7999 .bustype = BUS_SPI,
8000 .manufacture_id = MACRONIX_ID,
8001 .model_id = MACRONIX_MX25L6405,
8002 .total_size = 8192,
8003 .page_size = 256,
8004 /* MX25L6406E supports SFDP */
8005 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
8006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8007 .tested = TEST_OK_PREW,
8008 .probe = probe_spi_rdid,
8009 .probe_timing = TIMING_ZERO,
8010 .block_erasers =
8011 {
8012 {
8013 .eraseblocks = { {4 * 1024, 2048} },
8014 .block_erase = spi_block_erase_20,
8015 }, {
8016 .eraseblocks = { {64 * 1024, 128} },
8017 .block_erase = spi_block_erase_52,
8018 }, {
8019 .eraseblocks = { {64 * 1024, 128} },
8020 .block_erase = spi_block_erase_d8,
8021 }, {
8022 .eraseblocks = { {8 * 1024 * 1024, 1} },
8023 .block_erase = spi_block_erase_60,
8024 }, {
8025 .eraseblocks = { {8 * 1024 * 1024, 1} },
8026 .block_erase = spi_block_erase_c7,
8027 }
8028 },
8029 .printlock = spi_prettyprint_status_register_bp3_srwd,
8030 .unlock = spi_disable_blockprotect_bp3_srwd,
8031 .write = spi_chip_write_256,
8032 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
8033 .voltage = {2700, 3600},
8034 },
8035
8036 {
8037 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01008038 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00008039 .bustype = BUS_SPI,
8040 .manufacture_id = MACRONIX_ID,
8041 .model_id = MACRONIX_MX25L6405,
8042 .total_size = 8192,
8043 .page_size = 256,
8044 /* supports SFDP */
8045 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8046 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8047 .tested = TEST_OK_PREW,
8048 .probe = probe_spi_rdid,
8049 .probe_timing = TIMING_ZERO,
8050 .block_erasers =
8051 {
8052 {
8053 .eraseblocks = { {4 * 1024, 2048} },
8054 .block_erase = spi_block_erase_20,
8055 }, {
8056 .eraseblocks = { {32 * 1024, 256} },
8057 .block_erase = spi_block_erase_52,
8058 }, {
8059 .eraseblocks = { {64 * 1024, 128} },
8060 .block_erase = spi_block_erase_d8,
8061 }, {
8062 .eraseblocks = { {8 * 1024 * 1024, 1} },
8063 .block_erase = spi_block_erase_60,
8064 }, {
8065 .eraseblocks = { {8 * 1024 * 1024, 1} },
8066 .block_erase = spi_block_erase_c7,
8067 }
8068 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008069 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008070 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008071 .write = spi_chip_write_256,
8072 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8073 .voltage = {2700, 3600},
8074 },
8075
8076 {
8077 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00008078 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008079 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008080 .manufacture_id = MACRONIX_ID,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008081 .model_id = MACRONIX_MX25L12805D,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008082 .total_size = 16384,
8083 .page_size = 256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008084 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00008085 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00008086 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008087 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008088 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008089 .block_erasers =
8090 {
8091 {
8092 .eraseblocks = { {4 * 1024, 4096} },
8093 .block_erase = spi_block_erase_20,
8094 }, {
8095 .eraseblocks = { {64 * 1024, 256} },
8096 .block_erase = spi_block_erase_d8,
8097 }, {
8098 .eraseblocks = { {16 * 1024 * 1024, 1} },
8099 .block_erase = spi_block_erase_60,
8100 }, {
8101 .eraseblocks = { {16 * 1024 * 1024, 1} },
8102 .block_erase = spi_block_erase_c7,
8103 }
8104 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008105 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008106 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008107 .write = spi_chip_write_256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008108 .read = spi_chip_read, /* Fast read (0x0B) supported */
8109 .voltage = {2700, 3600},
8110 },
8111
8112 {
8113 .vendor = "Macronix",
8114 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8115 .bustype = BUS_SPI,
8116 .manufacture_id = MACRONIX_ID,
8117 .model_id = MACRONIX_MX25L12805D,
8118 .total_size = 16384,
8119 .page_size = 256,
8120 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8121 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8122 .tested = TEST_OK_PREW,
8123 .probe = probe_spi_rdid,
8124 .probe_timing = TIMING_ZERO,
8125 .block_erasers =
8126 {
8127 {
8128 .eraseblocks = { {4 * 1024, 4096} },
8129 .block_erase = spi_block_erase_20,
8130 }, {
8131 .eraseblocks = { {32 * 1024, 512} },
8132 .block_erase = spi_block_erase_52,
8133 }, {
8134 .eraseblocks = { {64 * 1024, 256} },
8135 .block_erase = spi_block_erase_d8,
8136 }, {
8137 .eraseblocks = { {16 * 1024 * 1024, 1} },
8138 .block_erase = spi_block_erase_60,
8139 }, {
8140 .eraseblocks = { {16 * 1024 * 1024, 1} },
8141 .block_erase = spi_block_erase_c7,
8142 }
8143 },
8144 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8145 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8146 .unlock = spi_disable_blockprotect_bp3_srwd,
8147 .write = spi_chip_write_256,
8148 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008149 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00008150 },
8151
8152 {
8153 .vendor = "Macronix",
Nico Huberaac81422017-11-10 22:54:13 +01008154 .name = "MX25L25635F",
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008155 .bustype = BUS_SPI,
8156 .manufacture_id = MACRONIX_ID,
8157 .model_id = MACRONIX_MX25L25635F,
8158 .total_size = 32768,
8159 .page_size = 256,
8160 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008161 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8162 .tested = TEST_UNTESTED,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008163 .probe = probe_spi_rdid,
8164 .probe_timing = TIMING_ZERO,
8165 .block_erasers =
8166 {
8167 {
8168 .eraseblocks = { {4 * 1024, 8192} },
Nico Huberaac81422017-11-10 22:54:13 +01008169 .block_erase = spi_block_erase_21,
8170 }, {
8171 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +02008172 .block_erase = spi_block_erase_20,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008173 }, {
8174 .eraseblocks = { {32 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008175 .block_erase = spi_block_erase_5c,
8176 }, {
8177 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008178 .block_erase = spi_block_erase_52,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008179 }, {
8180 .eraseblocks = { {64 * 1024, 512} },
Nico Huberaac81422017-11-10 22:54:13 +01008181 .block_erase = spi_block_erase_dc,
8182 }, {
8183 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +02008184 .block_erase = spi_block_erase_d8,
Timothy Pearson5bdb87e2016-08-27 14:02:50 -05008185 }, {
8186 .eraseblocks = { {32 * 1024 * 1024, 1} },
8187 .block_erase = spi_block_erase_60,
8188 }, {
8189 .eraseblocks = { {32 * 1024 * 1024, 1} },
8190 .block_erase = spi_block_erase_c7,
8191 }
8192 },
8193 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8194 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8195 .unlock = spi_disable_blockprotect_bp3_srwd,
8196 .write = spi_chip_write_256,
8197 .read = spi_chip_read, /* Fast read (0x0B) supported */
8198 .voltage = {2700, 3600},
8199 },
8200
8201 {
8202 .vendor = "Macronix",
Timothy Pearsone29591d2016-08-27 15:43:00 -05008203 .name = "MX66L51235F",
8204 .bustype = BUS_SPI,
8205 .manufacture_id = MACRONIX_ID,
8206 .model_id = MACRONIX_MX66L51235F,
8207 .total_size = 65536,
8208 .page_size = 256,
8209 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huberaac81422017-11-10 22:54:13 +01008210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8211 .tested = TEST_UNTESTED,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008212 .probe = probe_spi_rdid,
8213 .probe_timing = TIMING_ZERO,
8214 .block_erasers =
8215 {
8216 {
8217 .eraseblocks = { {4 * 1024, 16384} },
Nico Huberaac81422017-11-10 22:54:13 +01008218 .block_erase = spi_block_erase_21,
8219 }, {
8220 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7a077222017-10-14 18:18:30 +02008221 .block_erase = spi_block_erase_20,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008222 }, {
8223 .eraseblocks = { {32 * 1024, 2048} },
Nico Huberaac81422017-11-10 22:54:13 +01008224 .block_erase = spi_block_erase_5c,
8225 }, {
8226 .eraseblocks = { {32 * 1024, 2048} },
Nico Huber7a077222017-10-14 18:18:30 +02008227 .block_erase = spi_block_erase_52,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008228 }, {
8229 .eraseblocks = { {64 * 1024, 1024} },
Nico Huberaac81422017-11-10 22:54:13 +01008230 .block_erase = spi_block_erase_dc,
8231 }, {
8232 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +02008233 .block_erase = spi_block_erase_d8,
Timothy Pearsone29591d2016-08-27 15:43:00 -05008234 }, {
8235 .eraseblocks = { {64 * 1024 * 1024, 1} },
8236 .block_erase = spi_block_erase_60,
8237 }, {
8238 .eraseblocks = { {64 * 1024 * 1024, 1} },
8239 .block_erase = spi_block_erase_c7,
8240 }
8241 },
8242 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8243 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8244 .unlock = spi_disable_blockprotect_bp3_srwd,
8245 .write = spi_chip_write_256,
8246 .read = spi_chip_read, /* Fast read (0x0B) supported */
8247 .voltage = {2700, 3600},
8248 },
8249
8250 {
8251 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00008252 .name = "MX25U1635E",
8253 .bustype = BUS_SPI,
8254 .manufacture_id = MACRONIX_ID,
8255 .model_id = MACRONIX_MX25U1635E,
8256 .total_size = 2048,
8257 .page_size = 256,
8258 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8259 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8260 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008261 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00008262 .probe = probe_spi_rdid,
8263 .probe_timing = TIMING_ZERO,
8264 .block_erasers =
8265 {
8266 {
8267 .eraseblocks = { {4 * 1024, 512} },
8268 .block_erase = spi_block_erase_20,
8269 }, {
8270 .eraseblocks = { {32 * 1024, 64} },
8271 .block_erase = spi_block_erase_52,
8272 }, {
8273 .eraseblocks = { {64 * 1024, 32} },
8274 .block_erase = spi_block_erase_d8,
8275 }, {
8276 .eraseblocks = { {2 * 1024 * 1024, 1} },
8277 .block_erase = spi_block_erase_60,
8278 }, {
8279 .eraseblocks = { {2 * 1024 * 1024, 1} },
8280 .block_erase = spi_block_erase_c7,
8281 }
8282 },
8283 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008284 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008285 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008286 .write = spi_chip_write_256,
8287 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8288 .voltage = {1650, 2000},
8289 },
8290
8291 {
8292 .vendor = "Macronix",
8293 .name = "MX25U3235E/F",
8294 .bustype = BUS_SPI,
8295 .manufacture_id = MACRONIX_ID,
8296 .model_id = MACRONIX_MX25U3235E,
8297 .total_size = 4096,
8298 .page_size = 256,
8299 /* F model supports SFDP */
8300 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8301 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8302 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8303 .tested = TEST_OK_PREW,
8304 .probe = probe_spi_rdid,
8305 .probe_timing = TIMING_ZERO,
8306 .block_erasers =
8307 {
8308 {
8309 .eraseblocks = { {4 * 1024, 1024} },
8310 .block_erase = spi_block_erase_20,
8311 }, {
8312 .eraseblocks = { {32 * 1024, 128} },
8313 .block_erase = spi_block_erase_52,
8314 }, {
8315 .eraseblocks = { {64 * 1024, 64} },
8316 .block_erase = spi_block_erase_d8,
8317 }, {
8318 .eraseblocks = { {4 * 1024 * 1024, 1} },
8319 .block_erase = spi_block_erase_60,
8320 }, {
8321 .eraseblocks = { {4 * 1024 * 1024, 1} },
8322 .block_erase = spi_block_erase_c7,
8323 }
8324 },
8325 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008326 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008327 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008328 .write = spi_chip_write_256,
8329 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8330 .voltage = {1650, 2000},
8331 },
8332
8333 {
8334 .vendor = "Macronix",
8335 .name = "MX25U6435E/F",
8336 .bustype = BUS_SPI,
8337 .manufacture_id = MACRONIX_ID,
8338 .model_id = MACRONIX_MX25U6435E,
8339 .total_size = 8192,
8340 .page_size = 256,
8341 /* F model supports SFDP */
8342 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8343 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8344 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008345 .tested = TEST_OK_PREW,
Vincent Palatinf800f552013-03-15 02:03:16 +00008346 .probe = probe_spi_rdid,
8347 .probe_timing = TIMING_ZERO,
8348 .block_erasers =
8349 {
8350 {
8351 .eraseblocks = { {4 * 1024, 2048} },
8352 .block_erase = spi_block_erase_20,
8353 }, {
8354 .eraseblocks = { {32 * 1024, 256} },
8355 .block_erase = spi_block_erase_52,
8356 }, {
8357 .eraseblocks = { {64 * 1024, 128} },
8358 .block_erase = spi_block_erase_d8,
8359 }, {
8360 .eraseblocks = { {8 * 1024 * 1024, 1} },
8361 .block_erase = spi_block_erase_60,
8362 }, {
8363 .eraseblocks = { {8 * 1024 * 1024, 1} },
8364 .block_erase = spi_block_erase_c7,
8365 }
8366 },
8367 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00008368 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008369 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00008370 .write = spi_chip_write_256,
8371 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8372 .voltage = {1650, 2000},
8373 },
8374
8375 {
8376 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00008377 .name = "MX25U12835F",
8378 .bustype = BUS_SPI,
8379 .manufacture_id = MACRONIX_ID,
8380 .model_id = MACRONIX_MX25U12835E,
8381 .total_size = 16384,
8382 .page_size = 256,
8383 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8384 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8385 .tested = TEST_UNTESTED,
8386 .probe = probe_spi_rdid,
8387 .probe_timing = TIMING_ZERO,
8388 .block_erasers =
8389 {
8390 {
8391 .eraseblocks = { {4 * 1024, 4096} },
8392 .block_erase = spi_block_erase_20,
8393 }, {
8394 .eraseblocks = { {32 * 1024, 512} },
8395 .block_erase = spi_block_erase_52,
8396 }, {
8397 .eraseblocks = { {64 * 1024, 256} },
8398 .block_erase = spi_block_erase_d8,
8399 }, {
8400 .eraseblocks = { {16 * 1024 * 1024, 1} },
8401 .block_erase = spi_block_erase_60,
8402 }, {
8403 .eraseblocks = { {16 * 1024 * 1024, 1} },
8404 .block_erase = spi_block_erase_c7,
8405 }
8406 },
8407 /* TODO: security register */
8408 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8409 .unlock = spi_disable_blockprotect_bp3_srwd,
8410 .write = spi_chip_write_256, /* Multi I/O supported */
8411 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8412 .voltage = {1650, 2000},
8413 },
8414
8415 {
Stefan Taunera4617f72015-01-10 15:59:54 +00008416 .vendor = "Macronix",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00008417 .name = "MX25L6495F",
8418 .bustype = BUS_SPI,
8419 .manufacture_id = MACRONIX_ID,
8420 .model_id = MACRONIX_MX25L6495F,
8421 .total_size = 8192,
8422 .page_size = 256,
8423 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8424 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8425 .tested = TEST_OK_PREW,
8426 .probe = probe_spi_rdid,
8427 .probe_timing = TIMING_ZERO,
8428 .block_erasers =
8429 {
8430 {
8431 .eraseblocks = { {4 * 1024, 2048} },
8432 .block_erase = spi_block_erase_20,
8433 }, {
8434 .eraseblocks = { {64 * 1024, 128} },
8435 .block_erase = spi_block_erase_d8,
8436 }, {
8437 .eraseblocks = { {32 * 1024, 256} },
8438 .block_erase = spi_block_erase_52,
8439 }, {
8440 .eraseblocks = { {8 * 1024 * 1024, 1} },
8441 .block_erase = spi_block_erase_60,
8442 }, {
8443 .eraseblocks = { {8 * 1024 * 1024, 1} },
8444 .block_erase = spi_block_erase_c7,
8445 }
8446 },
8447 .unlock = spi_disable_blockprotect,
8448 .write = spi_chip_write_256,
8449 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8450 .voltage = {2700, 3600},
8451 },
8452
8453 {
Martin Roth440057a2014-07-13 00:05:07 +00008454 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00008455 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008456 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008457 .manufacture_id = MACRONIX_ID,
8458 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008459 .total_size = 128,
8460 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008461 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8462 .tested = TEST_UNTESTED,
8463 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008464 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008465 .block_erasers =
8466 {
8467 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00008468 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00008469 {8 * 1024, 1},
8470 {4 * 1024, 2},
8471 {8 * 1024, 2},
8472 {32 * 1024, 1},
8473 {64 * 1024, 1},
8474 },
Sean Nelson35727f72010-01-28 23:55:12 +00008475 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008476 }, {
8477 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008478 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008479 }
8480 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008481 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008482 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008483 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00008484 },
8485
8486 {
8487 .vendor = "Macronix",
8488 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008489 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008490 .manufacture_id = MACRONIX_ID,
8491 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008492 .total_size = 128,
8493 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00008495 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008496 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008497 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008498 .block_erasers =
8499 {
8500 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00008501 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00008502 {64 * 1024, 1},
8503 {32 * 1024, 1},
8504 {8 * 1024, 2},
8505 {4 * 1024, 2},
8506 {8 * 1024, 1},
8507 },
Sean Nelson35727f72010-01-28 23:55:12 +00008508 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008509 }, {
8510 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008511 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008512 }
8513 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008514 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00008515 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008516 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00008517 },
8518
8519 {
8520 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00008521 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008522 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008523 .manufacture_id = MACRONIX_ID,
8524 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008525 .total_size = 256,
8526 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008527 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008528 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00008529 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008530 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008531 .block_erasers =
8532 {
8533 {
8534 .eraseblocks = {
8535 {16 * 1024, 1},
8536 {8 * 1024, 2},
8537 {32 * 1024, 1},
8538 {64 * 1024, 3},
8539 },
Sean Nelson35727f72010-01-28 23:55:12 +00008540 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008541 }, {
8542 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008543 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008544 },
8545 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008546 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008547 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008548 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00008549 },
8550
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008551 {
8552 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00008553 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008554 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008555 .manufacture_id = MACRONIX_ID,
8556 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008557 .total_size = 256,
8558 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008559 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008560 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008561 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008562 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008563 .block_erasers =
8564 {
8565 {
8566 .eraseblocks = {
8567 {64 * 1024, 3},
8568 {32 * 1024, 1},
8569 {8 * 1024, 2},
8570 {16 * 1024, 1},
8571 },
Sean Nelson35727f72010-01-28 23:55:12 +00008572 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008573 }, {
8574 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008575 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008576 },
8577 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008578 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008579 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008580 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00008581 },
8582
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008583 {
8584 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00008585 .name = "MX29F022(N)B",
8586 .bustype = BUS_PARALLEL,
8587 .manufacture_id = MACRONIX_ID,
8588 .model_id = MACRONIX_MX29F022B,
8589 .total_size = 256,
8590 .page_size = 0, /* unused */
8591 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8592 .tested = TEST_UNTESTED,
8593 .probe = probe_jedec,
8594 .probe_timing = TIMING_ZERO,
8595 .block_erasers =
8596 {
8597 {
8598 .eraseblocks = {
8599 {16 * 1024, 1},
8600 {8 * 1024, 2},
8601 {32 * 1024, 1},
8602 {64 * 1024, 3},
8603 },
8604 .block_erase = erase_sector_jedec,
8605 }, {
8606 .eraseblocks = { {256 * 1024, 1} },
8607 .block_erase = erase_chip_block_jedec,
8608 }
8609 },
8610 .write = write_jedec_1,
8611 .read = read_memmapped,
8612 .voltage = {4500, 5500},
8613 },
8614
8615 {
8616 .vendor = "Macronix",
8617 .name = "MX29F022(N)T",
8618 .bustype = BUS_PARALLEL,
8619 .manufacture_id = MACRONIX_ID,
8620 .model_id = MACRONIX_MX29F022T,
8621 .total_size = 256,
8622 .page_size = 0, /* unused */
8623 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8624 .tested = TEST_OK_PREW,
8625 .probe = probe_jedec,
8626 .probe_timing = TIMING_ZERO,
8627 .block_erasers =
8628 {
8629 {
8630 .eraseblocks = {
8631 {64 * 1024, 3},
8632 {32 * 1024, 1},
8633 {8 * 1024, 2},
8634 {16 * 1024, 1},
8635 },
8636 .block_erase = erase_sector_jedec,
8637 }, {
8638 .eraseblocks = { {256 * 1024, 1} },
8639 .block_erase = erase_chip_block_jedec,
8640 }
8641 },
8642 .write = write_jedec_1,
8643 .read = read_memmapped,
8644 .voltage = {4500, 5500},
8645 },
8646
8647 {
8648 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00008649 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008650 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00008651 .manufacture_id = MACRONIX_ID,
8652 .model_id = MACRONIX_MX29F040,
8653 .total_size = 512,
8654 .page_size = 64 * 1024,
8655 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8656 .tested = TEST_UNTESTED,
8657 .probe = probe_jedec,
8658 .probe_timing = TIMING_ZERO,
8659 .block_erasers =
8660 {
8661 {
8662 .eraseblocks = { {64 * 1024, 8} },
8663 .block_erase = erase_sector_jedec,
8664 }, {
8665 .eraseblocks = { {512 * 1024, 1} },
8666 .block_erase = erase_chip_block_jedec,
8667 },
8668 },
8669 .write = write_jedec_1,
8670 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008671 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00008672 },
8673
8674 {
8675 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008676 .name = "MX29GL320EB",
8677 .bustype = BUS_PARALLEL,
8678 .manufacture_id = MACRONIX_ID,
8679 .model_id = MACRONIX_MX29GL320EB,
8680 .total_size = 4096,
8681 .page_size = 128 * 1024, /* actual page size is 16 */
8682 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8683 .tested = TEST_UNTESTED,
8684 .probe = probe_jedec_29gl,
8685 .probe_timing = TIMING_ZERO,
8686 .block_erasers =
8687 {
8688 {
8689 .eraseblocks = {
8690 {8 * 1024, 8},
8691 {64 * 1024, 63},
8692 },
8693 .block_erase = erase_sector_jedec,
8694 }, {
8695 .eraseblocks = { {4 * 1024 * 1024, 1} },
8696 .block_erase = erase_chip_block_jedec,
8697 },
8698 },
8699 .write = write_jedec_1,
8700 .read = read_memmapped,
8701 .voltage = {2700, 3600},
8702 },
8703
8704 {
8705 .vendor = "Macronix",
8706 .name = "MX29GL320ET",
8707 .bustype = BUS_PARALLEL,
8708 .manufacture_id = MACRONIX_ID,
8709 .model_id = MACRONIX_MX29GL320ET,
8710 .total_size = 4096,
8711 .page_size = 128 * 1024, /* actual page size is 16 */
8712 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8713 .tested = TEST_UNTESTED,
8714 .probe = probe_jedec_29gl,
8715 .probe_timing = TIMING_ZERO,
8716 .block_erasers =
8717 {
8718 {
8719 .eraseblocks = {
8720 {64 * 1024, 63},
8721 {8 * 1024, 8},
8722 },
8723 .block_erase = erase_sector_jedec,
8724 }, {
8725 .eraseblocks = { {4 * 1024 * 1024, 1} },
8726 .block_erase = erase_chip_block_jedec,
8727 },
8728 },
8729 .write = write_jedec_1,
8730 .read = read_memmapped,
8731 .voltage = {2700, 3600},
8732 },
8733
8734 {
8735 .vendor = "Macronix",
8736 .name = "MX29GL320EH/L",
8737 .bustype = BUS_PARALLEL,
8738 .manufacture_id = MACRONIX_ID,
8739 .model_id = MACRONIX_MX29GL320EHL,
8740 .total_size = 4096,
8741 .page_size = 128 * 1024, /* actual page size is 16 */
8742 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8743 .tested = TEST_UNTESTED,
8744 .probe = probe_jedec_29gl,
8745 .probe_timing = TIMING_ZERO,
8746 .block_erasers =
8747 {
8748 {
8749 .eraseblocks = { {64 * 1024, 64} },
8750 .block_erase = erase_sector_jedec,
8751 }, {
8752 .eraseblocks = { {4 * 1024 * 1024, 1} },
8753 .block_erase = erase_chip_block_jedec,
8754 },
8755 },
8756 .write = write_jedec_1,
8757 .read = read_memmapped,
8758 .voltage = {2700, 3600},
8759 },
8760
8761 {
8762 .vendor = "Macronix",
8763 .name = "MX29GL640EB",
8764 .bustype = BUS_PARALLEL,
8765 .manufacture_id = MACRONIX_ID,
8766 .model_id = MACRONIX_MX29GL640EB,
8767 .total_size = 8192,
8768 .page_size = 128 * 1024, /* actual page size is 16 */
8769 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8770 .tested = TEST_UNTESTED,
8771 .probe = probe_jedec_29gl,
8772 .probe_timing = TIMING_ZERO,
8773 .block_erasers =
8774 {
8775 {
8776 .eraseblocks = {
8777 {8 * 1024, 8},
8778 {64 * 1024, 127},
8779 },
8780 .block_erase = erase_sector_jedec,
8781 }, {
8782 .eraseblocks = { {8 * 1024 * 1024, 1} },
8783 .block_erase = erase_chip_block_jedec,
8784 },
8785 },
8786 .write = write_jedec_1,
8787 .read = read_memmapped,
8788 .voltage = {2700, 3600},
8789 },
8790
8791 {
8792 .vendor = "Macronix",
8793 .name = "MX29GL640ET",
8794 .bustype = BUS_PARALLEL,
8795 .manufacture_id = MACRONIX_ID,
8796 .model_id = MACRONIX_MX29GL640ET,
8797 .total_size = 8192,
8798 .page_size = 128 * 1024, /* actual page size is 16 */
8799 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8800 .tested = TEST_UNTESTED,
8801 .probe = probe_jedec_29gl,
8802 .probe_timing = TIMING_ZERO,
8803 .block_erasers =
8804 {
8805 {
8806 .eraseblocks = {
8807 {64 * 1024, 127},
8808 {8 * 1024, 8},
8809 },
8810 .block_erase = erase_sector_jedec,
8811 }, {
8812 .eraseblocks = { {8 * 1024 * 1024, 1} },
8813 .block_erase = erase_chip_block_jedec,
8814 },
8815 },
8816 .write = write_jedec_1,
8817 .read = read_memmapped,
8818 .voltage = {2700, 3600},
8819 },
8820
8821 {
8822 .vendor = "Macronix",
8823 .name = "MX29GL640EH/L",
8824 .bustype = BUS_PARALLEL,
8825 .manufacture_id = MACRONIX_ID,
8826 .model_id = MACRONIX_MX29GL640EHL,
8827 .total_size = 8192,
8828 .page_size = 128 * 1024, /* actual page size is 16 */
8829 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8830 .tested = TEST_UNTESTED,
8831 .probe = probe_jedec_29gl,
8832 .probe_timing = TIMING_ZERO,
8833 .block_erasers =
8834 {
8835 {
8836 .eraseblocks = { {64 * 1024, 128} },
8837 .block_erase = erase_sector_jedec,
8838 }, {
8839 .eraseblocks = { {8 * 1024 * 1024, 1} },
8840 .block_erase = erase_chip_block_jedec,
8841 },
8842 },
8843 .write = write_jedec_1,
8844 .read = read_memmapped,
8845 .voltage = {2700, 3600},
8846 },
8847
8848 {
8849 .vendor = "Macronix",
8850 .name = "MX29GL128F",
8851 .bustype = BUS_PARALLEL,
8852 .manufacture_id = MACRONIX_ID,
8853 .model_id = MACRONIX_MX29GL128F,
8854 .total_size = 16384,
8855 .page_size = 128 * 1024, /* actual page size is 16 */
8856 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8857 .tested = TEST_UNTESTED,
8858 .probe = probe_jedec_29gl,
8859 .probe_timing = TIMING_ZERO,
8860 .block_erasers =
8861 {
8862 {
8863 .eraseblocks = { {128 * 1024, 128} },
8864 .block_erase = erase_sector_jedec,
8865 }, {
8866 .eraseblocks = { {16 * 1024 * 1024, 1} },
8867 .block_erase = erase_chip_block_jedec,
8868 },
8869 },
8870 .write = write_jedec_1,
8871 .read = read_memmapped,
8872 .voltage = {2700, 3600},
8873 },
8874
8875 {
8876 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00008877 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008878 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008879 .manufacture_id = MACRONIX_ID,
8880 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008881 .total_size = 512,
8882 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008883 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8884 .tested = TEST_UNTESTED,
8885 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008886 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008887 .block_erasers =
8888 {
8889 {
Stefan Tauner6697f712014-08-06 15:09:15 +00008890 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00008891 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008892 }, {
8893 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008894 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008895 },
8896 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008897 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008898 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008899 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00008900 },
8901
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008902 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008903 .vendor = "Micron/Numonyx/ST",
8904 .name = "M25P05-A",
8905 .bustype = BUS_SPI,
8906 .manufacture_id = ST_ID,
8907 .model_id = ST_M25P05A,
8908 .total_size = 64,
8909 .page_size = 256,
8910 .feature_bits = FEATURE_WRSR_WREN,
8911 .tested = TEST_OK_PREW,
8912 .probe = probe_spi_rdid,
8913 .probe_timing = TIMING_ZERO,
8914 .block_erasers =
8915 {
8916 {
8917 .eraseblocks = { {32 * 1024, 2} },
8918 .block_erase = spi_block_erase_d8,
8919 }, {
8920 .eraseblocks = { {64 * 1024, 1} },
8921 .block_erase = spi_block_erase_c7,
8922 }
8923 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008924 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008925 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008926 .write = spi_chip_write_256,
8927 .read = spi_chip_read,
8928 .voltage = {2700, 3600},
8929 },
8930
8931 /* The ST M25P05 is a bit of a problem. It has the same ID as the
8932 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
8933 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
8934 * only is successful if RDID does not work.
8935 */
8936 {
8937 .vendor = "Micron/Numonyx/ST",
8938 .name = "M25P05",
8939 .bustype = BUS_SPI,
8940 .manufacture_id = 0, /* Not used. */
8941 .model_id = ST_M25P05_RES,
8942 .total_size = 64,
8943 .page_size = 256,
8944 .feature_bits = FEATURE_WRSR_WREN,
8945 .tested = TEST_UNTESTED,
8946 .probe = probe_spi_res1,
8947 .probe_timing = TIMING_ZERO,
8948 .block_erasers =
8949 {
8950 {
8951 .eraseblocks = { {32 * 1024, 2} },
8952 .block_erase = spi_block_erase_d8,
8953 }, {
8954 .eraseblocks = { {64 * 1024, 1} },
8955 .block_erase = spi_block_erase_c7,
8956 }
8957 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008958 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008959 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008960 .write = spi_chip_write_1, /* 128 */
8961 .read = spi_chip_read,
8962 .voltage = {2700, 3600},
8963 },
8964
8965 {
8966 .vendor = "Micron/Numonyx/ST",
8967 .name = "M25P10-A",
8968 .bustype = BUS_SPI,
8969 .manufacture_id = ST_ID,
8970 .model_id = ST_M25P10A,
8971 .total_size = 128,
8972 .page_size = 256,
8973 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008974 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008975 .probe = probe_spi_rdid,
8976 .probe_timing = TIMING_ZERO,
8977 .block_erasers =
8978 {
8979 {
8980 .eraseblocks = { {32 * 1024, 4} },
8981 .block_erase = spi_block_erase_d8,
8982 }, {
8983 .eraseblocks = { {128 * 1024, 1} },
8984 .block_erase = spi_block_erase_c7,
8985 }
8986 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008987 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008988 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008989 .write = spi_chip_write_256,
8990 .read = spi_chip_read,
8991 .voltage = {2700, 3600},
8992 },
8993
8994 /* The ST M25P10 has the same problem as the M25P05. */
8995 {
8996 .vendor = "Micron/Numonyx/ST",
8997 .name = "M25P10",
8998 .bustype = BUS_SPI,
8999 .manufacture_id = 0, /* Not used. */
9000 .model_id = ST_M25P10_RES,
9001 .total_size = 128,
9002 .page_size = 256,
9003 .feature_bits = FEATURE_WRSR_WREN,
9004 .tested = TEST_UNTESTED,
9005 .probe = probe_spi_res1,
9006 .probe_timing = TIMING_ZERO,
9007 .block_erasers =
9008 {
9009 {
9010 .eraseblocks = { {32 * 1024, 4} },
9011 .block_erase = spi_block_erase_d8,
9012 }, {
9013 .eraseblocks = { {128 * 1024, 1} },
9014 .block_erase = spi_block_erase_c7,
9015 }
9016 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009017 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009018 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009019 .write = spi_chip_write_1, /* 128 */
9020 .read = spi_chip_read,
9021 .voltage = {2700, 3600},
9022 },
9023
9024 {
9025 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9026 .name = "M25P20",
9027 .bustype = BUS_SPI,
9028 .manufacture_id = ST_ID,
9029 .model_id = ST_M25P20,
9030 .total_size = 256,
9031 .page_size = 256,
9032 .feature_bits = FEATURE_WRSR_WREN,
9033 .tested = TEST_UNTESTED,
9034 .probe = probe_spi_rdid,
9035 .probe_timing = TIMING_ZERO,
9036 .block_erasers =
9037 {
9038 {
9039 .eraseblocks = { {64 * 1024, 4} },
9040 .block_erase = spi_block_erase_d8,
9041 }, {
9042 .eraseblocks = { {256 * 1024, 1} },
9043 .block_erase = spi_block_erase_c7,
9044 }
9045 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009046 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009047 .unlock = spi_disable_blockprotect,
9048 .write = spi_chip_write_256,
9049 .read = spi_chip_read, /* Fast read (0x0B) supported */
9050 .voltage = {2700, 3600},
9051 },
9052
9053 {
9054 .vendor = "Micron/Numonyx/ST",
9055 .name = "M25P20-old",
9056 .bustype = BUS_SPI,
9057 .manufacture_id = 0, /* Not used. */
9058 .model_id = ST_M25P20_RES,
9059 .total_size = 256,
9060 .page_size = 256,
9061 .feature_bits = FEATURE_WRSR_WREN,
9062 .tested = TEST_OK_PREW,
9063 .probe = probe_spi_res1,
9064 .probe_timing = TIMING_ZERO,
9065 .block_erasers =
9066 {
9067 {
9068 .eraseblocks = { {64 * 1024, 4} },
9069 .block_erase = spi_block_erase_d8,
9070 }, {
9071 .eraseblocks = { {256 * 1024, 1} },
9072 .block_erase = spi_block_erase_c7,
9073 }
9074 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009075 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009076 .unlock = spi_disable_blockprotect,
9077 .write = spi_chip_write_256,
9078 .read = spi_chip_read, /* Fast read (0x0B) supported */
9079 .voltage = {2700, 3600},
9080 },
9081
9082 {
9083 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9084 .name = "M25P40",
9085 .bustype = BUS_SPI,
9086 .manufacture_id = ST_ID,
9087 .model_id = ST_M25P40,
9088 .total_size = 512,
9089 .page_size = 256,
9090 .feature_bits = FEATURE_WRSR_WREN,
9091 .tested = TEST_OK_PREW,
9092 .probe = probe_spi_rdid,
9093 .probe_timing = TIMING_ZERO,
9094 .block_erasers =
9095 {
9096 {
9097 .eraseblocks = { {64 * 1024, 8} },
9098 .block_erase = spi_block_erase_d8,
9099 }, {
9100 .eraseblocks = { {512 * 1024, 1} },
9101 .block_erase = spi_block_erase_c7,
9102 }
9103 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009104 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009105 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009106 .write = spi_chip_write_256,
9107 .read = spi_chip_read,
9108 .voltage = {2700, 3600},
9109 },
9110
9111 {
9112 .vendor = "Micron/Numonyx/ST",
9113 .name = "M25P40-old",
9114 .bustype = BUS_SPI,
9115 .manufacture_id = 0, /* Not used. */
9116 .model_id = ST_M25P40_RES,
9117 .total_size = 512,
9118 .page_size = 256,
9119 .feature_bits = FEATURE_WRSR_WREN,
9120 .tested = TEST_UNTESTED,
9121 .probe = probe_spi_res1,
9122 .probe_timing = TIMING_ZERO,
9123 .block_erasers =
9124 {
9125 {
9126 .eraseblocks = { {64 * 1024, 8} },
9127 .block_erase = spi_block_erase_d8,
9128 }, {
9129 .eraseblocks = { {512 * 1024, 1} },
9130 .block_erase = spi_block_erase_c7,
9131 }
9132 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009133 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009134 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009135 .write = spi_chip_write_256,
9136 .read = spi_chip_read,
9137 },
9138
9139 {
9140 .vendor = "Micron/Numonyx/ST",
9141 .name = "M25P80",
9142 .bustype = BUS_SPI,
9143 .manufacture_id = ST_ID,
9144 .model_id = ST_M25P80,
9145 .total_size = 1024,
9146 .page_size = 256,
9147 .feature_bits = FEATURE_WRSR_WREN,
9148 .tested = TEST_OK_PREW,
9149 .probe = probe_spi_rdid,
9150 .probe_timing = TIMING_ZERO,
9151 .block_erasers =
9152 {
9153 {
9154 .eraseblocks = { {64 * 1024, 16} },
9155 .block_erase = spi_block_erase_d8,
9156 }, {
9157 .eraseblocks = { {1024 * 1024, 1} },
9158 .block_erase = spi_block_erase_c7,
9159 }
9160 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009161 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009162 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009163 .write = spi_chip_write_256,
9164 .read = spi_chip_read,
9165 .voltage = {2700, 3600},
9166 },
9167
9168 {
9169 .vendor = "Micron/Numonyx/ST",
9170 .name = "M25P16",
9171 .bustype = BUS_SPI,
9172 .manufacture_id = ST_ID,
9173 .model_id = ST_M25P16,
9174 .total_size = 2048,
9175 .page_size = 256,
9176 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009177 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009178 .probe = probe_spi_rdid,
9179 .probe_timing = TIMING_ZERO,
9180 .block_erasers =
9181 {
9182 {
9183 .eraseblocks = { {64 * 1024, 32} },
9184 .block_erase = spi_block_erase_d8,
9185 }, {
9186 .eraseblocks = { {2 * 1024 * 1024, 1} },
9187 .block_erase = spi_block_erase_c7,
9188 }
9189 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009190 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009191 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009192 .write = spi_chip_write_256,
9193 .read = spi_chip_read,
9194 .voltage = {2700, 3600},
9195 },
9196
9197 {
9198 .vendor = "Micron/Numonyx/ST",
9199 .name = "M25P32",
9200 .bustype = BUS_SPI,
9201 .manufacture_id = ST_ID,
9202 .model_id = ST_M25P32,
9203 .total_size = 4096,
9204 .page_size = 256,
9205 .feature_bits = FEATURE_WRSR_WREN,
9206 .tested = TEST_OK_PREW,
9207 .probe = probe_spi_rdid,
9208 .probe_timing = TIMING_ZERO,
9209 .block_erasers =
9210 {
9211 {
9212 .eraseblocks = { {64 * 1024, 64} },
9213 .block_erase = spi_block_erase_d8,
9214 }, {
9215 .eraseblocks = { {4 * 1024 * 1024, 1} },
9216 .block_erase = spi_block_erase_c7,
9217 }
9218 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009219 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009220 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009221 .write = spi_chip_write_256,
9222 .read = spi_chip_read,
9223 .voltage = {2700, 3600},
9224 },
9225
9226 {
9227 .vendor = "Micron/Numonyx/ST",
9228 .name = "M25P64",
9229 .bustype = BUS_SPI,
9230 .manufacture_id = ST_ID,
9231 .model_id = ST_M25P64,
9232 .total_size = 8192,
9233 .page_size = 256,
9234 .feature_bits = FEATURE_WRSR_WREN,
9235 .tested = TEST_OK_PREW,
9236 .probe = probe_spi_rdid,
9237 .probe_timing = TIMING_ZERO,
9238 .block_erasers =
9239 {
9240 {
9241 .eraseblocks = { {64 * 1024, 128} },
9242 .block_erase = spi_block_erase_d8,
9243 }, {
9244 .eraseblocks = { {8 * 1024 * 1024, 1} },
9245 .block_erase = spi_block_erase_c7,
9246 }
9247 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009248 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009249 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009250 .write = spi_chip_write_256,
9251 .read = spi_chip_read,
9252 .voltage = {2700, 3600},
9253 },
9254
9255 {
9256 .vendor = "Micron/Numonyx/ST",
9257 .name = "M25P128",
9258 .bustype = BUS_SPI,
9259 .manufacture_id = ST_ID,
9260 .model_id = ST_M25P128,
9261 .total_size = 16384,
9262 .page_size = 256,
9263 .feature_bits = FEATURE_WRSR_WREN,
9264 .tested = TEST_OK_PREW,
9265 .probe = probe_spi_rdid,
9266 .probe_timing = TIMING_ZERO,
9267 .block_erasers =
9268 {
9269 {
9270 .eraseblocks = { {256 * 1024, 64} },
9271 .block_erase = spi_block_erase_d8,
9272 }, {
9273 .eraseblocks = { {16 * 1024 * 1024, 1} },
9274 .block_erase = spi_block_erase_c7,
9275 }
9276 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009277 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009278 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009279 .write = spi_chip_write_256,
9280 .read = spi_chip_read,
9281 .voltage = {2700, 3600},
9282 },
9283
9284 {
9285 .vendor = "Micron/Numonyx/ST",
9286 .name = "M25PE10",
9287 .bustype = BUS_SPI,
9288 .manufacture_id = ST_ID,
9289 .model_id = ST_M25PE10,
9290 .total_size = 128,
9291 .page_size = 256,
9292 .feature_bits = FEATURE_WRSR_WREN,
9293 .tested = TEST_UNTESTED,
9294 .probe = probe_spi_rdid,
9295 .probe_timing = TIMING_ZERO,
9296 .block_erasers =
9297 {
9298 {
9299 .eraseblocks = { {4 * 1024, 32} },
9300 .block_erase = spi_block_erase_20,
9301 }, {
9302 .eraseblocks = { {64 * 1024, 2} },
9303 .block_erase = spi_block_erase_d8,
9304 }, {
9305 .eraseblocks = { {128 * 1024, 1} },
9306 .block_erase = spi_block_erase_c7,
9307 }
9308 },
9309 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9310 .unlock = spi_disable_blockprotect,
9311 .write = spi_chip_write_256,
9312 .read = spi_chip_read,
9313 .voltage = {2700, 3600},
9314 },
9315
9316 {
9317 .vendor = "Micron/Numonyx/ST",
9318 .name = "M25PE20",
9319 .bustype = BUS_SPI,
9320 .manufacture_id = ST_ID,
9321 .model_id = ST_M25PE20,
9322 .total_size = 256,
9323 .page_size = 256,
9324 .feature_bits = FEATURE_WRSR_WREN,
9325 .tested = TEST_UNTESTED,
9326 .probe = probe_spi_rdid,
9327 .probe_timing = TIMING_ZERO,
9328 .block_erasers =
9329 {
9330 {
9331 .eraseblocks = { {4 * 1024, 64} },
9332 .block_erase = spi_block_erase_20,
9333 }, {
9334 .eraseblocks = { {64 * 1024, 4} },
9335 .block_erase = spi_block_erase_d8,
9336 }, {
9337 .eraseblocks = { {256 * 1024, 1} },
9338 .block_erase = spi_block_erase_c7,
9339 }
9340 },
9341 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9342 .unlock = spi_disable_blockprotect,
9343 .write = spi_chip_write_256,
9344 .read = spi_chip_read,
9345 .voltage = {2700, 3600},
9346 },
9347
9348 {
9349 .vendor = "Micron/Numonyx/ST",
9350 .name = "M25PE40",
9351 .bustype = BUS_SPI,
9352 .manufacture_id = ST_ID,
9353 .model_id = ST_M25PE40,
9354 .total_size = 512,
9355 .page_size = 256,
9356 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009357 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009358 .probe = probe_spi_rdid,
9359 .probe_timing = TIMING_ZERO,
9360 .block_erasers =
9361 {
9362 {
9363 .eraseblocks = { {4 * 1024, 128} },
9364 .block_erase = spi_block_erase_20,
9365 }, {
9366 .eraseblocks = { {64 * 1024, 8} },
9367 .block_erase = spi_block_erase_d8,
9368 }, {
9369 .eraseblocks = { {512 * 1024, 1} },
9370 .block_erase = spi_block_erase_c7,
9371 }
9372 },
9373 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9374 .unlock = spi_disable_blockprotect,
9375 .write = spi_chip_write_256,
9376 .read = spi_chip_read,
9377 .voltage = {2700, 3600},
9378 },
9379
9380 {
9381 .vendor = "Micron/Numonyx/ST",
9382 .name = "M25PE80",
9383 .bustype = BUS_SPI,
9384 .manufacture_id = ST_ID,
9385 .model_id = ST_M25PE80,
9386 .total_size = 1024,
9387 .page_size = 256,
9388 .feature_bits = FEATURE_WRSR_WREN,
9389 .tested = TEST_OK_PREW,
9390 .probe = probe_spi_rdid,
9391 .probe_timing = TIMING_ZERO,
9392 .block_erasers =
9393 {
9394 {
9395 .eraseblocks = { {4 * 1024, 256} },
9396 .block_erase = spi_block_erase_20,
9397 }, {
9398 .eraseblocks = { {64 * 1024, 16} },
9399 .block_erase = spi_block_erase_d8,
9400 }, {
9401 .eraseblocks = { {1024 * 1024, 1} },
9402 .block_erase = spi_block_erase_c7,
9403 }
9404 },
9405 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9406 .unlock = spi_disable_blockprotect,
9407 .write = spi_chip_write_256,
9408 .read = spi_chip_read,
9409 .voltage = {2700, 3600},
9410 },
9411
9412 {
9413 .vendor = "Micron/Numonyx/ST",
9414 .name = "M25PE16",
9415 .bustype = BUS_SPI,
9416 .manufacture_id = ST_ID,
9417 .model_id = ST_M25PE16,
9418 .total_size = 2048,
9419 .page_size = 256,
9420 .feature_bits = FEATURE_WRSR_WREN,
9421 .tested = TEST_UNTESTED,
9422 .probe = probe_spi_rdid,
9423 .probe_timing = TIMING_ZERO,
9424 .block_erasers =
9425 {
9426 {
9427 .eraseblocks = { {4 * 1024, 512} },
9428 .block_erase = spi_block_erase_20,
9429 }, {
9430 .eraseblocks = { {64 * 1024, 32} },
9431 .block_erase = spi_block_erase_d8,
9432 }, {
9433 .eraseblocks = { {2 * 1024 * 1024, 1} },
9434 .block_erase = spi_block_erase_c7,
9435 }
9436 },
9437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9438 .unlock = spi_disable_blockprotect,
9439 .write = spi_chip_write_256,
9440 .read = spi_chip_read,
9441 .voltage = {2700, 3600},
9442 },
9443
9444 {
9445 .vendor = "Micron/Numonyx/ST",
9446 .name = "M25PX80",
9447 .bustype = BUS_SPI,
9448 .manufacture_id = ST_ID,
9449 .model_id = ST_M25PX80,
9450 .total_size = 1024,
9451 .page_size = 256,
9452 /* OTP: 64B total; read 0x4B, write 0x42 */
9453 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9454 .tested = TEST_OK_PREW,
9455 .probe = probe_spi_rdid,
9456 .probe_timing = TIMING_ZERO,
9457 .block_erasers = {
9458 {
9459 .eraseblocks = { { 4 * 1024, 256 } },
9460 .block_erase = spi_block_erase_20,
9461 }, {
9462 .eraseblocks = { {64 * 1024, 16} },
9463 .block_erase = spi_block_erase_d8,
9464 }, {
9465 .eraseblocks = { {1024 * 1024, 1} },
9466 .block_erase = spi_block_erase_c7,
9467 }
9468 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009469 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009470 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9471 .write = spi_chip_write_256,
9472 .read = spi_chip_read,
9473 .voltage = {2700, 3600},
9474 },
9475
9476 {
9477 .vendor = "Micron/Numonyx/ST",
9478 .name = "M25PX16",
9479 .bustype = BUS_SPI,
9480 .manufacture_id = ST_ID,
9481 .model_id = ST_M25PX16,
9482 .total_size = 2048,
9483 .page_size = 256,
9484 /* OTP: 64B total; read 0x4B; write 0x42 */
9485 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9486 .tested = TEST_OK_PREW,
9487 .probe = probe_spi_rdid,
9488 .probe_timing = TIMING_ZERO,
9489 .block_erasers =
9490 {
9491 {
9492 .eraseblocks = { { 4 * 1024, 512 } },
9493 .block_erase = spi_block_erase_20,
9494 }, {
9495 .eraseblocks = { {64 * 1024, 32} },
9496 .block_erase = spi_block_erase_d8,
9497 }, {
9498 .eraseblocks = { {2 * 1024 * 1024, 1} },
9499 .block_erase = spi_block_erase_c7,
9500 }
9501 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009502 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009503 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9504 .write = spi_chip_write_256,
9505 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009506 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009507 },
9508
9509 {
9510 .vendor = "Micron/Numonyx/ST",
9511 .name = "M25PX32",
9512 .bustype = BUS_SPI,
9513 .manufacture_id = ST_ID,
9514 .model_id = ST_M25PX32,
9515 .total_size = 4096,
9516 .page_size = 256,
9517 /* OTP: 64B total; read 0x4B; write 0x42 */
9518 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9519 .tested = TEST_OK_PRE,
9520 .probe = probe_spi_rdid,
9521 .probe_timing = TIMING_ZERO,
9522 .block_erasers =
9523 {
9524 {
9525 .eraseblocks = { { 4 * 1024, 1024 } },
9526 .block_erase = spi_block_erase_20,
9527 }, {
9528 .eraseblocks = { {64 * 1024, 64} },
9529 .block_erase = spi_block_erase_d8,
9530 }, {
9531 .eraseblocks = { {4 * 1024 * 1024, 1} },
9532 .block_erase = spi_block_erase_c7,
9533 }
9534 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009535 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009536 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9537 .write = spi_chip_write_256,
9538 .read = spi_chip_read,
9539 .voltage = {2700, 3600},
9540 },
9541
9542 {
9543 .vendor = "Micron/Numonyx/ST",
9544 .name = "M25PX64",
9545 .bustype = BUS_SPI,
9546 .manufacture_id = ST_ID,
9547 .model_id = ST_M25PX64,
9548 .total_size = 8192,
9549 .page_size = 256,
9550 /* OTP: 64B total; read 0x4B; write 0x42 */
9551 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009552 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009553 .probe = probe_spi_rdid,
9554 .probe_timing = TIMING_ZERO,
9555 .block_erasers =
9556 {
9557 {
9558 .eraseblocks = { { 4 * 1024, 2048 } },
9559 .block_erase = spi_block_erase_20,
9560 }, {
9561 .eraseblocks = { {64 * 1024, 128} },
9562 .block_erase = spi_block_erase_d8,
9563 }, {
9564 .eraseblocks = { {8 * 1024 * 1024, 1} },
9565 .block_erase = spi_block_erase_c7,
9566 }
9567 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009568 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009569 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
9570 .write = spi_chip_write_256,
9571 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009572 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009573 },
9574
9575 {
9576 .vendor = "Micron/Numonyx/ST",
9577 .name = "M45PE10",
9578 .bustype = BUS_SPI,
9579 .manufacture_id = ST_ID,
9580 .model_id = ST_M45PE10,
9581 .total_size = 128,
9582 .page_size = 256,
9583 .tested = TEST_UNTESTED,
9584 .probe = probe_spi_rdid,
9585 .probe_timing = TIMING_ZERO,
9586 .block_erasers = {
9587 {
9588 .eraseblocks = { {256, 512} },
9589 .block_erase = spi_block_erase_db,
9590 }, {
9591 .eraseblocks = { {64 * 1024, 2} },
9592 .block_erase = spi_block_erase_d8,
9593 }
9594 },
9595 .printlock = spi_prettyprint_status_register_default_welwip,
9596 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9597 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9598 .read = spi_chip_read, /* Fast read (0x0B) supported */
9599 .voltage = {2700, 3600},
9600 },
9601
9602 {
9603 .vendor = "Micron/Numonyx/ST",
9604 .name = "M45PE20",
9605 .bustype = BUS_SPI,
9606 .manufacture_id = ST_ID,
9607 .model_id = ST_M45PE20,
9608 .total_size = 256,
9609 .page_size = 256,
9610 .tested = TEST_UNTESTED,
9611 .probe = probe_spi_rdid,
9612 .probe_timing = TIMING_ZERO,
9613 .block_erasers = {
9614 {
9615 .eraseblocks = { {256, 1024} },
9616 .block_erase = spi_block_erase_db,
9617 }, {
9618 .eraseblocks = { {64 * 1024, 4} },
9619 .block_erase = spi_block_erase_d8,
9620 }
9621 },
9622 .printlock = spi_prettyprint_status_register_default_welwip,
9623 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9624 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9625 .read = spi_chip_read, /* Fast read (0x0B) supported */
9626 .voltage = {2700, 3600},
9627 },
9628
9629 {
9630 .vendor = "Micron/Numonyx/ST",
9631 .name = "M45PE40",
9632 .bustype = BUS_SPI,
9633 .manufacture_id = ST_ID,
9634 .model_id = ST_M45PE40,
9635 .total_size = 512,
9636 .page_size = 256,
9637 .tested = TEST_UNTESTED,
9638 .probe = probe_spi_rdid,
9639 .probe_timing = TIMING_ZERO,
9640 .block_erasers = {
9641 {
9642 .eraseblocks = { {256, 2048} },
9643 .block_erase = spi_block_erase_db,
9644 }, {
9645 .eraseblocks = { {64 * 1024, 8} },
9646 .block_erase = spi_block_erase_d8,
9647 }
9648 },
9649 .printlock = spi_prettyprint_status_register_default_welwip,
9650 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +00009651 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009652 .read = spi_chip_read, /* Fast read (0x0B) supported */
9653 .voltage = {2700, 3600},
9654 },
9655
9656 {
9657 .vendor = "Micron/Numonyx/ST",
9658 .name = "M45PE80",
9659 .bustype = BUS_SPI,
9660 .manufacture_id = ST_ID,
9661 .model_id = ST_M45PE80,
9662 .total_size = 1024,
9663 .page_size = 256,
9664 .tested = TEST_UNTESTED,
9665 .probe = probe_spi_rdid,
9666 .probe_timing = TIMING_ZERO,
9667 .block_erasers = {
9668 {
9669 .eraseblocks = { {256, 4096} },
9670 .block_erase = spi_block_erase_db,
9671 }, {
9672 .eraseblocks = { {64 * 1024, 16} },
9673 .block_erase = spi_block_erase_d8,
9674 }
9675 },
9676 .printlock = spi_prettyprint_status_register_default_welwip,
9677 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9678 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9679 .read = spi_chip_read, /* Fast read (0x0B) supported */
9680 .voltage = {2700, 3600},
9681 },
9682
9683 {
9684 .vendor = "Micron/Numonyx/ST",
9685 .name = "M45PE16",
9686 .bustype = BUS_SPI,
9687 .manufacture_id = ST_ID,
9688 .model_id = ST_M45PE16,
9689 .total_size = 2048,
9690 .page_size = 256,
9691 .tested = TEST_UNTESTED,
9692 .probe = probe_spi_rdid,
9693 .probe_timing = TIMING_ZERO,
9694 .block_erasers = {
9695 {
9696 .eraseblocks = { {256, 8192} },
9697 .block_erase = spi_block_erase_db,
9698 }, {
9699 .eraseblocks = { {64 * 1024, 32} },
9700 .block_erase = spi_block_erase_d8,
9701 }
9702 },
9703 .printlock = spi_prettyprint_status_register_default_welwip,
9704 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9705 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
9706 .read = spi_chip_read, /* Fast read (0x0B) supported */
9707 .voltage = {2700, 3600},
9708 },
9709
9710 {
9711 .vendor = "Micron/Numonyx/ST",
9712 .name = "N25Q016",
9713 .bustype = BUS_SPI,
9714 .manufacture_id = ST_ID,
9715 .model_id = ST_N25Q016__1E,
9716 .total_size = 2048,
9717 .page_size = 256,
9718 /* supports SFDP */
9719 /* OTP: 64B total; read 0x4B, write 0x42 */
9720 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9721 .tested = TEST_UNTESTED,
9722 .probe = probe_spi_rdid,
9723 .probe_timing = TIMING_ZERO,
9724 .block_erasers =
9725 {
9726 {
9727 .eraseblocks = { {4 * 1024, 512} },
9728 .block_erase = spi_block_erase_20,
9729 }, {
9730 .eraseblocks = { {32 * 1024, 64} },
9731 .block_erase = spi_block_erase_52,
9732 }, {
9733 .eraseblocks = { {64 * 1024, 32} },
9734 .block_erase = spi_block_erase_d8,
9735 }, {
9736 .eraseblocks = { {2 * 1024 * 1024, 1} },
9737 .block_erase = spi_block_erase_c7,
9738 }
9739 },
9740 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9741 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9742 .write = spi_chip_write_256, /* Multi I/O supported */
9743 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9744 .voltage = {1700, 2000},
9745 },
9746
9747 {
9748 .vendor = "Micron/Numonyx/ST",
9749 .name = "N25Q032..1E",
9750 .bustype = BUS_SPI,
9751 .manufacture_id = ST_ID,
9752 .model_id = ST_N25Q032__1E,
9753 .total_size = 4096,
9754 .page_size = 256,
9755 /* supports SFDP */
9756 /* OTP: 64B total; read 0x4B, write 0x42 */
9757 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9758 .tested = TEST_UNTESTED,
9759 .probe = probe_spi_rdid,
9760 .probe_timing = TIMING_ZERO,
9761 .block_erasers =
9762 {
9763 {
9764 .eraseblocks = { {4 * 1024, 1024} },
9765 .block_erase = spi_block_erase_20,
9766 }, {
9767 .eraseblocks = { {64 * 1024, 64} },
9768 .block_erase = spi_block_erase_d8,
9769 }, {
9770 .eraseblocks = { {4 * 1024 * 1024, 1} },
9771 .block_erase = spi_block_erase_c7,
9772 }
9773 },
9774 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9775 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9776 .write = spi_chip_write_256, /* Multi I/O supported */
9777 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9778 .voltage = {1700, 2000},
9779 },
9780
9781 {
9782 .vendor = "Micron/Numonyx/ST",
9783 .name = "N25Q032..3E",
9784 .bustype = BUS_SPI,
9785 .manufacture_id = ST_ID,
9786 .model_id = ST_N25Q032__3E,
9787 .total_size = 4096,
9788 .page_size = 256,
9789 /* supports SFDP */
9790 /* OTP: 64B total; read 0x4B, write 0x42 */
9791 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9792 .tested = TEST_OK_PREW,
9793 .probe = probe_spi_rdid,
9794 .probe_timing = TIMING_ZERO,
9795 .block_erasers =
9796 {
9797 {
9798 .eraseblocks = { {4 * 1024, 1024} },
9799 .block_erase = spi_block_erase_20,
9800 }, {
9801 .eraseblocks = { {64 * 1024, 64} },
9802 .block_erase = spi_block_erase_d8,
9803 }, {
9804 .eraseblocks = { {4 * 1024 * 1024, 1} },
9805 .block_erase = spi_block_erase_c7,
9806 }
9807 },
9808 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9809 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9810 .write = spi_chip_write_256, /* Multi I/O supported */
9811 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9812 .voltage = {2700, 3600},
9813 },
9814
9815 {
9816 .vendor = "Micron/Numonyx/ST",
9817 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9818 .bustype = BUS_SPI,
9819 .manufacture_id = ST_ID,
9820 .model_id = ST_N25Q064__1E,
9821 .total_size = 8192,
9822 .page_size = 256,
9823 /* supports SFDP */
9824 /* OTP: 64B total; read 0x4B, write 0x42 */
9825 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009826 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009827 .probe = probe_spi_rdid,
9828 .probe_timing = TIMING_ZERO,
9829 .block_erasers =
9830 {
9831 {
9832 .eraseblocks = { {4 * 1024, 2048 } },
9833 .block_erase = spi_block_erase_20,
9834 }, {
9835 .eraseblocks = { {64 * 1024, 128} },
9836 .block_erase = spi_block_erase_d8,
9837 }, {
9838 .eraseblocks = { {8 * 1024 * 1024, 1} },
9839 .block_erase = spi_block_erase_c7,
9840 }
9841 },
9842 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9843 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9844 .write = spi_chip_write_256, /* Multi I/O supported */
9845 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9846 .voltage = {1700, 2000},
9847 },
9848
9849 {
9850 .vendor = "Micron/Numonyx/ST",
9851 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9852 .bustype = BUS_SPI,
9853 .manufacture_id = ST_ID,
9854 .model_id = ST_N25Q064__3E,
9855 .total_size = 8192,
9856 .page_size = 256,
9857 /* supports SFDP */
9858 /* OTP: 64B total; read 0x4B, write 0x42 */
9859 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9860 .tested = TEST_OK_PREW,
9861 .probe = probe_spi_rdid,
9862 .probe_timing = TIMING_ZERO,
9863 .block_erasers =
9864 {
9865 {
9866 .eraseblocks = { {4 * 1024, 2048 } },
9867 .block_erase = spi_block_erase_20,
9868 }, {
9869 .eraseblocks = { {64 * 1024, 128} },
9870 .block_erase = spi_block_erase_d8,
9871 }, {
9872 .eraseblocks = { {8 * 1024 * 1024, 1} },
9873 .block_erase = spi_block_erase_c7,
9874 }
9875 },
9876 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9877 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9878 .write = spi_chip_write_256, /* Multi I/O supported */
9879 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9880 .voltage = {2700, 3600},
9881 },
9882
9883 {
9884 .vendor = "Micron/Numonyx/ST",
9885 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9886 .bustype = BUS_SPI,
9887 .manufacture_id = ST_ID,
9888 .model_id = ST_N25Q128__1E,
9889 .total_size = 16384,
9890 .page_size = 256,
9891 /* supports SFDP */
9892 /* OTP: 64B total; read 0x4B, write 0x42 */
9893 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009894 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009895 .probe = probe_spi_rdid,
9896 .probe_timing = TIMING_ZERO,
9897 .block_erasers = {
9898 {
9899 .eraseblocks = { {4 * 1024, 4096 } },
9900 .block_erase = spi_block_erase_20,
9901 }, {
9902 .eraseblocks = { {64 * 1024, 256} },
9903 .block_erase = spi_block_erase_d8,
9904 }, {
9905 .eraseblocks = { {16384 * 1024, 1} },
9906 .block_erase = spi_block_erase_c7,
9907 }
9908 },
9909 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9910 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9911 .write = spi_chip_write_256, /* Multi I/O supported */
9912 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9913 .voltage = {1700, 2000},
9914 },
9915
9916 {
9917 .vendor = "Micron/Numonyx/ST",
9918 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9919 .bustype = BUS_SPI,
9920 .manufacture_id = ST_ID,
9921 .model_id = ST_N25Q128__3E,
9922 .total_size = 16384,
9923 .page_size = 256,
9924 /* supports SFDP */
9925 /* OTP: 64B total; read 0x4B, write 0x42 */
9926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9927 .tested = TEST_OK_PREW,
9928 .probe = probe_spi_rdid,
9929 .probe_timing = TIMING_ZERO,
9930 .block_erasers = {
9931 {
9932 .eraseblocks = { {4 * 1024, 4096 } },
9933 .block_erase = spi_block_erase_20,
9934 }, {
9935 .eraseblocks = { {64 * 1024, 256} },
9936 .block_erase = spi_block_erase_d8,
9937 }, {
9938 .eraseblocks = { {16384 * 1024, 1} },
9939 .block_erase = spi_block_erase_c7,
9940 }
9941 },
9942 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9943 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9944 .write = spi_chip_write_256, /* Multi I/O supported */
9945 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9946 .voltage = {2700, 3600},
9947 },
9948
9949 {
Ed Swierk199ab392017-07-03 13:33:44 -07009950 .vendor = "Micron",
9951 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
9952 .bustype = BUS_SPI,
9953 .manufacture_id = ST_ID,
9954 .model_id = ST_N25Q256__3E,
9955 .total_size = 32768,
9956 .page_size = 256,
9957 /* supports SFDP */
9958 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +01009959 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
9960 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -07009961 .probe = probe_spi_rdid,
9962 .probe_timing = TIMING_ZERO,
9963 .block_erasers = {
9964 {
9965 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +02009966 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -07009967 }, {
Nico Huberaac81422017-11-10 22:54:13 +01009968 .eraseblocks = { {4 * 1024, 8192} },
9969 .block_erase = spi_block_erase_20,
9970 }, {
Ed Swierk199ab392017-07-03 13:33:44 -07009971 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +02009972 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -07009973 }, {
Nico Huberaac81422017-11-10 22:54:13 +01009974 .eraseblocks = { {64 * 1024, 512} },
9975 .block_erase = spi_block_erase_d8,
9976 }, {
Ed Swierk199ab392017-07-03 13:33:44 -07009977 .eraseblocks = { {32768 * 1024, 1} },
9978 .block_erase = spi_block_erase_c7,
9979 }
9980 },
9981 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9982 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9983 .write = spi_chip_write_256, /* Multi I/O supported */
9984 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9985 .voltage = {2700, 3600},
9986 },
9987
9988 {
9989 .vendor = "Micron",
9990 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
9991 .bustype = BUS_SPI,
9992 .manufacture_id = ST_ID,
9993 .model_id = ST_N25Q512__3E,
9994 .total_size = 65536,
9995 .page_size = 256,
9996 /* supports SFDP */
9997 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +01009998 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
9999 .tested = TEST_UNTESTED,
Ed Swierk199ab392017-07-03 13:33:44 -070010000 .probe = probe_spi_rdid,
10001 .probe_timing = TIMING_ZERO,
10002 .block_erasers = {
10003 {
10004 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010005 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070010006 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010007 .eraseblocks = { {4 * 1024, 16384} },
10008 .block_erase = spi_block_erase_20,
10009 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010010 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020010011 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070010012 }, {
Nico Huberaac81422017-11-10 22:54:13 +010010013 .eraseblocks = { {64 * 1024, 1024} },
10014 .block_erase = spi_block_erase_d8,
10015 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070010016 .eraseblocks = { {65536 * 1024, 1} },
10017 .block_erase = spi_block_erase_c7,
10018 }
10019 },
10020 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10021 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10022 .write = spi_chip_write_256, /* Multi I/O supported */
10023 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10024 .voltage = {2700, 3600},
10025 },
10026
10027 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010028 .vendor = "MoselVitelic",
10029 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010030 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010031 .manufacture_id = SYNCMOS_MVC_ID,
10032 .model_id = MVC_V29C51000B,
10033 .total_size = 64,
10034 .page_size = 512,
10035 .feature_bits = FEATURE_EITHER_RESET,
10036 .tested = TEST_UNTESTED,
10037 .probe = probe_jedec,
10038 .probe_timing = TIMING_ZERO,
10039 .block_erasers =
10040 {
10041 {
10042 .eraseblocks = { {512, 128} },
10043 .block_erase = erase_sector_jedec,
10044 }, {
10045 .eraseblocks = { {64 * 1024, 1} },
10046 .block_erase = erase_chip_block_jedec,
10047 },
10048 },
10049 .write = write_jedec_1,
10050 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010051 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010052 },
10053
10054 {
10055 .vendor = "MoselVitelic",
10056 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010057 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010058 .manufacture_id = SYNCMOS_MVC_ID,
10059 .model_id = MVC_V29C51000T,
10060 .total_size = 64,
10061 .page_size = 512,
10062 .feature_bits = FEATURE_EITHER_RESET,
10063 .tested = TEST_UNTESTED,
10064 .probe = probe_jedec,
10065 .probe_timing = TIMING_ZERO,
10066 .block_erasers =
10067 {
10068 {
10069 .eraseblocks = { {512, 128} },
10070 .block_erase = erase_sector_jedec,
10071 }, {
10072 .eraseblocks = { {64 * 1024, 1} },
10073 .block_erase = erase_chip_block_jedec,
10074 },
10075 },
10076 .write = write_jedec_1,
10077 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010078 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010079 },
10080
10081 {
10082 .vendor = "MoselVitelic",
10083 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010084 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010085 .manufacture_id = SYNCMOS_MVC_ID,
10086 .model_id = MVC_V29C51400B,
10087 .total_size = 512,
10088 .page_size = 1024,
10089 .feature_bits = FEATURE_EITHER_RESET,
10090 .tested = TEST_UNTESTED,
10091 .probe = probe_jedec,
10092 .probe_timing = TIMING_ZERO,
10093 .block_erasers =
10094 {
10095 {
10096 .eraseblocks = { {1024, 512} },
10097 .block_erase = erase_sector_jedec,
10098 }, {
10099 .eraseblocks = { {512 * 1024, 1} },
10100 .block_erase = erase_chip_block_jedec,
10101 },
10102 },
10103 .write = write_jedec_1,
10104 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010105 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010106 },
10107
10108 {
10109 .vendor = "MoselVitelic",
10110 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010111 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010112 .manufacture_id = SYNCMOS_MVC_ID,
10113 .model_id = MVC_V29C51400T,
10114 .total_size = 512,
10115 .page_size = 1024,
10116 .feature_bits = FEATURE_EITHER_RESET,
10117 .tested = TEST_UNTESTED,
10118 .probe = probe_jedec,
10119 .probe_timing = TIMING_ZERO,
10120 .block_erasers =
10121 {
10122 {
10123 .eraseblocks = { {1024, 512} },
10124 .block_erase = erase_sector_jedec,
10125 }, {
10126 .eraseblocks = { {512 * 1024, 1} },
10127 .block_erase = erase_chip_block_jedec,
10128 },
10129 },
10130 .write = write_jedec_1,
10131 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010132 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010133 },
10134
10135 {
10136 .vendor = "MoselVitelic",
10137 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010138 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010139 .manufacture_id = SYNCMOS_MVC_ID,
10140 .model_id = MVC_V29LC51000,
10141 .total_size = 64,
10142 .page_size = 512,
10143 .feature_bits = FEATURE_EITHER_RESET,
10144 .tested = TEST_UNTESTED,
10145 .probe = probe_jedec,
10146 .probe_timing = TIMING_ZERO,
10147 .block_erasers =
10148 {
10149 {
10150 .eraseblocks = { {512, 128} },
10151 .block_erase = erase_sector_jedec,
10152 }, {
10153 .eraseblocks = { {64 * 1024, 1} },
10154 .block_erase = erase_chip_block_jedec,
10155 },
10156 },
10157 .write = write_jedec_1,
10158 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010159 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010160 },
10161
10162 {
10163 .vendor = "MoselVitelic",
10164 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010165 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010166 .manufacture_id = SYNCMOS_MVC_ID,
10167 .model_id = MVC_V29LC51001,
10168 .total_size = 128,
10169 .page_size = 512,
10170 .feature_bits = FEATURE_EITHER_RESET,
10171 .tested = TEST_UNTESTED,
10172 .probe = probe_jedec,
10173 .probe_timing = TIMING_ZERO,
10174 .block_erasers =
10175 {
10176 {
10177 .eraseblocks = { {512, 256} },
10178 .block_erase = erase_sector_jedec,
10179 }, {
10180 .eraseblocks = { {128 * 1024, 1} },
10181 .block_erase = erase_chip_block_jedec,
10182 },
10183 },
10184 .write = write_jedec_1,
10185 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010186 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010187 },
10188
10189 {
10190 .vendor = "MoselVitelic",
10191 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010192 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010193 .manufacture_id = SYNCMOS_MVC_ID,
10194 .model_id = MVC_V29LC51002,
10195 .total_size = 256,
10196 .page_size = 512,
10197 .feature_bits = FEATURE_EITHER_RESET,
10198 .tested = TEST_UNTESTED,
10199 .probe = probe_jedec,
10200 .probe_timing = TIMING_ZERO,
10201 .block_erasers =
10202 {
10203 {
10204 .eraseblocks = { {512, 512} },
10205 .block_erase = erase_sector_jedec,
10206 }, {
10207 .eraseblocks = { {256 * 1024, 1} },
10208 .block_erase = erase_chip_block_jedec,
10209 },
10210 },
10211 .write = write_jedec_1,
10212 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010213 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000010214 },
10215
10216 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010217 .vendor = "Nantronics",
10218 .name = "N25S10",
10219 .bustype = BUS_SPI,
10220 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10221 .model_id = NANTRONICS_N25S10,
10222 .total_size = 128,
10223 .page_size = 256,
10224 .feature_bits = FEATURE_WRSR_WREN,
10225 .tested = TEST_UNTESTED,
10226 .probe = probe_spi_rdid,
10227 .probe_timing = TIMING_ZERO,
10228 .block_erasers =
10229 {
10230 {
10231 .eraseblocks = { {4 * 1024, 32} },
10232 .block_erase = spi_block_erase_20,
10233 }, {
10234 .eraseblocks = { {4 * 1024, 32} },
10235 .block_erase = spi_block_erase_d7,
10236 }, {
10237 .eraseblocks = { {32 * 1024, 4} },
10238 .block_erase = spi_block_erase_52,
10239 }, {
10240 .eraseblocks = { {64 * 1024, 2} },
10241 .block_erase = spi_block_erase_d8,
10242 }, {
10243 .eraseblocks = { {128 * 1024, 1} },
10244 .block_erase = spi_block_erase_60,
10245 }, {
10246 .eraseblocks = { {128 * 1024, 1} },
10247 .block_erase = spi_block_erase_c7,
10248 }
10249 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010250 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010251 .unlock = spi_disable_blockprotect_bp3_srwd,
10252 .write = spi_chip_write_256,
10253 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10254 .voltage = {2700, 3600},
10255 },
10256
10257 {
10258 .vendor = "Nantronics",
10259 .name = "N25S20",
10260 .bustype = BUS_SPI,
10261 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10262 .model_id = NANTRONICS_N25S20,
10263 .total_size = 256,
10264 .page_size = 256,
10265 .feature_bits = FEATURE_WRSR_WREN,
10266 .tested = TEST_UNTESTED,
10267 .probe = probe_spi_rdid,
10268 .probe_timing = TIMING_ZERO,
10269 .block_erasers =
10270 {
10271 {
10272 .eraseblocks = { {4 * 1024, 64} },
10273 .block_erase = spi_block_erase_20,
10274 }, {
10275 .eraseblocks = { {4 * 1024, 64} },
10276 .block_erase = spi_block_erase_d7,
10277 }, {
10278 .eraseblocks = { {32 * 1024, 8} },
10279 .block_erase = spi_block_erase_52,
10280 }, {
10281 .eraseblocks = { {64 * 1024, 4} },
10282 .block_erase = spi_block_erase_d8,
10283 }, {
10284 .eraseblocks = { {256 * 1024, 1} },
10285 .block_erase = spi_block_erase_60,
10286 }, {
10287 .eraseblocks = { {256 * 1024, 1} },
10288 .block_erase = spi_block_erase_c7,
10289 }
10290 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010291 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010292 .unlock = spi_disable_blockprotect_bp3_srwd,
10293 .write = spi_chip_write_256,
10294 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10295 .voltage = {2700, 3600},
10296 },
10297
10298 {
10299 .vendor = "Nantronics",
10300 .name = "N25S40",
10301 .bustype = BUS_SPI,
10302 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10303 .model_id = NANTRONICS_N25S40,
10304 .total_size = 512,
10305 .page_size = 256,
10306 .feature_bits = FEATURE_WRSR_WREN,
10307 .tested = TEST_UNTESTED,
10308 .probe = probe_spi_rdid,
10309 .probe_timing = TIMING_ZERO,
10310 .block_erasers =
10311 {
10312 {
10313 .eraseblocks = { {4 * 1024, 128} },
10314 .block_erase = spi_block_erase_20,
10315 }, {
10316 .eraseblocks = { {4 * 1024, 128} },
10317 .block_erase = spi_block_erase_d7,
10318 }, {
10319 .eraseblocks = { {32 * 1024, 16} },
10320 .block_erase = spi_block_erase_52,
10321 }, {
10322 .eraseblocks = { {64 * 1024, 8} },
10323 .block_erase = spi_block_erase_d8,
10324 }, {
10325 .eraseblocks = { {512 * 1024, 1} },
10326 .block_erase = spi_block_erase_60,
10327 }, {
10328 .eraseblocks = { {512 * 1024, 1} },
10329 .block_erase = spi_block_erase_c7,
10330 }
10331 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010332 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010333 .unlock = spi_disable_blockprotect_bp3_srwd,
10334 .write = spi_chip_write_256,
10335 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10336 .voltage = {2700, 3600},
10337 },
10338
10339 {
10340 .vendor = "Nantronics",
10341 .name = "N25S80",
10342 .bustype = BUS_SPI,
10343 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10344 .model_id = NANTRONICS_N25S80,
10345 .total_size = 1024,
10346 .page_size = 256,
10347 .feature_bits = FEATURE_WRSR_WREN,
10348 .tested = TEST_UNTESTED,
10349 .probe = probe_spi_rdid,
10350 .probe_timing = TIMING_ZERO,
10351 .block_erasers =
10352 {
10353 {
10354 .eraseblocks = { {4 * 1024, 256} },
10355 .block_erase = spi_block_erase_20,
10356 }, {
10357 .eraseblocks = { {32 * 1024, 32} },
10358 .block_erase = spi_block_erase_52,
10359 }, {
10360 .eraseblocks = { {64 * 1024, 16} },
10361 .block_erase = spi_block_erase_d8,
10362 }, {
10363 .eraseblocks = { {1024 * 1024, 1} },
10364 .block_erase = spi_block_erase_60,
10365 }, {
10366 .eraseblocks = { {1024 * 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 = "N25S16",
10380 .bustype = BUS_SPI,
10381 .manufacture_id = NANTRONICS_ID_NOPREFIX,
10382 .model_id = NANTRONICS_N25S16,
10383 .total_size = 2048,
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, 512} },
10393 .block_erase = spi_block_erase_20,
10394 }, {
10395 .eraseblocks = { {64 * 1024, 32} },
10396 .block_erase = spi_block_erase_d8,
10397 }, {
10398 .eraseblocks = { {2048 * 1024, 1} },
10399 .block_erase = spi_block_erase_60,
10400 }, {
10401 .eraseblocks = { {2048 * 1024, 1} },
10402 .block_erase = spi_block_erase_c7,
10403 }
10404 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010405 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000010406 .unlock = spi_disable_blockprotect_bp3_srwd,
10407 .write = spi_chip_write_256,
10408 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
10409 .voltage = {2700, 3600},
10410 },
10411
10412 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010413 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +000010414 .name = "Pm25LD256C",
10415 .bustype = BUS_SPI,
10416 .manufacture_id = PMC_ID,
10417 .model_id = PMC_PM25LD256C,
10418 .total_size = 32,
10419 .page_size = 256,
10420 .feature_bits = FEATURE_WRSR_WREN,
10421 .tested = TEST_UNTESTED,
10422 .probe = probe_spi_rdid,
10423 .probe_timing = TIMING_ZERO,
10424 .block_erasers =
10425 {
10426 {
10427 .eraseblocks = { {4 * 1024, 8} },
10428 .block_erase = spi_block_erase_20,
10429 }, {
10430 .eraseblocks = { {4 * 1024, 8} },
10431 .block_erase = spi_block_erase_d7,
10432 }, {
10433 .eraseblocks = { {32 * 1024, 1} },
10434 .block_erase = spi_block_erase_d8,
10435 }, {
10436 .eraseblocks = { {32 * 1024, 1} },
10437 .block_erase = spi_block_erase_60,
10438 }, {
10439 .eraseblocks = { {32 * 1024, 1} },
10440 .block_erase = spi_block_erase_c7,
10441 }
10442 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010443 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010444 .unlock = spi_disable_blockprotect,
10445 .write = spi_chip_write_256,
10446 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10447 .voltage = {2700, 3600},
10448 },
10449 {
10450 .vendor = "PMC",
10451 .name = "Pm25LD512(C)",
10452 .bustype = BUS_SPI,
10453 .manufacture_id = PMC_ID,
10454 .model_id = PMC_PM25LD512,
10455 .total_size = 64,
10456 .page_size = 256,
10457 .feature_bits = FEATURE_WRSR_WREN,
10458 .tested = TEST_OK_PREW,
10459 .probe = probe_spi_rdid,
10460 .probe_timing = TIMING_ZERO,
10461 .block_erasers =
10462 {
10463 {
10464 .eraseblocks = { {4 * 1024, 16} },
10465 .block_erase = spi_block_erase_20,
10466 }, {
10467 .eraseblocks = { {4 * 1024, 16} },
10468 .block_erase = spi_block_erase_d7,
10469 }, {
10470 .eraseblocks = { {32 * 1024, 2} },
10471 .block_erase = spi_block_erase_d8,
10472 }, {
10473 .eraseblocks = { {64 * 1024, 1} },
10474 .block_erase = spi_block_erase_60,
10475 }, {
10476 .eraseblocks = { {64 * 1024, 1} },
10477 .block_erase = spi_block_erase_c7,
10478 }
10479 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010480 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000010481 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
10482 .write = spi_chip_write_256,
10483 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
10484 .voltage = {2300, 3600},
10485 },
10486
10487 {
10488 .vendor = "PMC",
10489 .name = "Pm25LD010(C)",
10490 .bustype = BUS_SPI,
10491 .manufacture_id = PMC_ID,
10492 .model_id = PMC_PM25LD010,
10493 .total_size = 128,
10494 .page_size = 256,
10495 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010496 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000010497 .probe = probe_spi_rdid,
10498 .probe_timing = TIMING_ZERO,
10499 .block_erasers =
10500 {
10501 {
10502 .eraseblocks = { {4 * 1024, 32} },
10503 .block_erase = spi_block_erase_20,
10504 }, {
10505 .eraseblocks = { {4 * 1024, 32} },
10506 .block_erase = spi_block_erase_d7,
10507 }, {
10508 .eraseblocks = { {32 * 1024, 4} },
10509 .block_erase = spi_block_erase_d8,
10510 }, {
10511 .eraseblocks = { {128 * 1024, 1} },
10512 .block_erase = spi_block_erase_60,
10513 }, {
10514 .eraseblocks = { {128 * 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 = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
10523 },
10524
10525 {
10526 .vendor = "PMC",
10527 .name = "Pm25LD020(C)",
10528 .bustype = BUS_SPI,
10529 .manufacture_id = PMC_ID,
10530 .model_id = PMC_PM25LD020,
10531 .total_size = 256,
10532 .page_size = 256,
10533 .feature_bits = FEATURE_WRSR_WREN,
10534 .tested = TEST_UNTESTED,
10535 .probe = probe_spi_rdid,
10536 .probe_timing = TIMING_ZERO,
10537 .block_erasers =
10538 {
10539 {
10540 .eraseblocks = { {4 * 1024, 64} },
10541 .block_erase = spi_block_erase_20,
10542 }, {
10543 .eraseblocks = { {4 * 1024, 64} },
10544 .block_erase = spi_block_erase_d7,
10545 }, {
10546 .eraseblocks = { {64 * 1024, 4} },
10547 .block_erase = spi_block_erase_d8,
10548 }, {
10549 .eraseblocks = { {256 * 1024, 1} },
10550 .block_erase = spi_block_erase_60,
10551 }, {
10552 .eraseblocks = { {256 * 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 Pm25LD020 */
10561 },
10562
10563 {
10564 .vendor = "PMC",
10565 .name = "Pm25LD040(C)",
10566 .bustype = BUS_SPI,
10567 .manufacture_id = PMC_ID,
10568 .model_id = PMC_PM25LV040,
10569 .total_size = 512,
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, 128} },
10579 .block_erase = spi_block_erase_20,
10580 }, {
10581 .eraseblocks = { {4 * 1024, 128} },
10582 .block_erase = spi_block_erase_d7,
10583 }, {
10584 .eraseblocks = { {64 * 1024, 8} },
10585 .block_erase = spi_block_erase_d8,
10586 }, {
10587 .eraseblocks = { {512 * 1024, 1} },
10588 .block_erase = spi_block_erase_60,
10589 }, {
10590 .eraseblocks = { {512 * 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,
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 Pm25LD040 */
10599 },
10600
Steven Honeyman81a8fb72015-06-02 22:32:24 +000010601 {
10602 .vendor = "PMC",
10603 .name = "Pm25LQ020",
10604 .bustype = BUS_SPI,
10605 .manufacture_id = PMC_ID,
10606 .model_id = PMC_PM25LQ020,
10607 .total_size = 256,
10608 .page_size = 256,
10609 /* OTP: 256B total; read 0x4B, write 0xB1 */
10610 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10611 .tested = TEST_UNTESTED,
10612 .probe = probe_spi_rdid,
10613 .probe_timing = TIMING_ZERO,
10614 .block_erasers =
10615 {
10616 {
10617 .eraseblocks = { {4 * 1024, 64} },
10618 .block_erase = spi_block_erase_20,
10619 }, {
10620 .eraseblocks = { {4 * 1024, 64} },
10621 .block_erase = spi_block_erase_d7,
10622 }, {
10623 .eraseblocks = { {64 * 1024, 4} },
10624 .block_erase = spi_block_erase_d8,
10625 }, {
10626 .eraseblocks = { {256 * 1024, 1} },
10627 .block_erase = spi_block_erase_60,
10628 }, {
10629 .eraseblocks = { {256 * 1024, 1} },
10630 .block_erase = spi_block_erase_c7,
10631 }
10632 },
10633 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10634 .unlock = spi_disable_blockprotect_bp3_srwd,
10635 .write = spi_chip_write_256,
10636 .read = spi_chip_read,
10637 .voltage = {2300, 3600},
10638 },
10639
10640 {
10641 .vendor = "PMC",
10642 .name = "Pm25LQ040",
10643 .bustype = BUS_SPI,
10644 .manufacture_id = PMC_ID,
10645 .model_id = PMC_PM25LQ040,
10646 .total_size = 512,
10647 .page_size = 256,
10648 /* OTP: 256B total; read 0x4B, write 0xB1 */
10649 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10650 .tested = TEST_UNTESTED,
10651 .probe = probe_spi_rdid,
10652 .probe_timing = TIMING_ZERO,
10653 .block_erasers =
10654 {
10655 {
10656 .eraseblocks = { {4 * 1024, 128} },
10657 .block_erase = spi_block_erase_20,
10658 }, {
10659 .eraseblocks = { {4 * 1024, 128} },
10660 .block_erase = spi_block_erase_d7,
10661 }, {
10662 .eraseblocks = { {64 * 1024, 8} },
10663 .block_erase = spi_block_erase_d8,
10664 }, {
10665 .eraseblocks = { {512 * 1024, 1} },
10666 .block_erase = spi_block_erase_60,
10667 }, {
10668 .eraseblocks = { {512 * 1024, 1} },
10669 .block_erase = spi_block_erase_c7,
10670 }
10671 },
10672 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10673 .unlock = spi_disable_blockprotect_bp3_srwd,
10674 .write = spi_chip_write_256,
10675 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10676 .voltage = {2300, 3600},
10677 },
10678
10679 {
10680 .vendor = "PMC",
10681 .name = "Pm25LQ080",
10682 .bustype = BUS_SPI,
10683 .manufacture_id = PMC_ID,
10684 .model_id = PMC_PM25LQ080,
10685 .total_size = 1024,
10686 .page_size = 256,
10687 /* OTP: 64B total; read 0x4B, write 0xB1 */
10688 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10689 .tested = TEST_UNTESTED,
10690 .probe = probe_spi_rdid,
10691 .probe_timing = TIMING_ZERO,
10692 .block_erasers =
10693 {
10694 {
10695 .eraseblocks = { {4 * 1024, 256} },
10696 .block_erase = spi_block_erase_20,
10697 }, {
10698 .eraseblocks = { {4 * 1024, 256} },
10699 .block_erase = spi_block_erase_d7,
10700 }, {
10701 .eraseblocks = { {64 * 1024, 16} },
10702 .block_erase = spi_block_erase_d8,
10703 }, {
10704 .eraseblocks = { {1024 * 1024, 1} },
10705 .block_erase = spi_block_erase_60,
10706 }, {
10707 .eraseblocks = { {1024 * 1024, 1} },
10708 .block_erase = spi_block_erase_c7,
10709 }
10710 },
10711 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10712 .unlock = spi_disable_blockprotect_bp3_srwd,
10713 .write = spi_chip_write_256,
10714 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10715 .voltage = {2300, 3600},
10716 },
10717
10718 {
10719 .vendor = "PMC",
10720 .name = "Pm25LQ016",
10721 .bustype = BUS_SPI,
10722 .manufacture_id = PMC_ID,
10723 .model_id = PMC_PM25LQ016,
10724 .total_size = 2048,
10725 .page_size = 256,
10726 /* OTP: 256B total; read 0x4B, write 0xB1 */
10727 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10728 .tested = TEST_UNTESTED,
10729 .probe = probe_spi_rdid,
10730 .probe_timing = TIMING_ZERO,
10731 .block_erasers =
10732 {
10733 {
10734 .eraseblocks = { {4 * 1024, 512} },
10735 .block_erase = spi_block_erase_20,
10736 }, {
10737 .eraseblocks = { {4 * 1024, 512} },
10738 .block_erase = spi_block_erase_d7,
10739 }, {
10740 .eraseblocks = { {64 * 1024, 32} },
10741 .block_erase = spi_block_erase_d8,
10742 }, {
10743 .eraseblocks = { {2048 * 1024, 1} },
10744 .block_erase = spi_block_erase_60,
10745 }, {
10746 .eraseblocks = { {2048 * 1024, 1} },
10747 .block_erase = spi_block_erase_c7,
10748 }
10749 },
10750 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10751 .unlock = spi_disable_blockprotect_bp3_srwd,
10752 .write = spi_chip_write_256,
10753 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10754 .voltage = {2300, 3600},
10755 },
10756
10757 {
10758 .vendor = "PMC",
10759 .name = "Pm25LQ032C",
10760 .bustype = BUS_SPI,
10761 .manufacture_id = PMC_ID,
10762 .model_id = PMC_PM25LQ032C,
10763 .total_size = 4096,
10764 .page_size = 256,
10765 /* OTP: 64B total; read 0x4B, write 0xB1 */
10766 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010767 .tested = TEST_OK_PREW,
Steven Honeyman81a8fb72015-06-02 22:32:24 +000010768 .probe = probe_spi_rdid,
10769 .probe_timing = TIMING_ZERO,
10770 .block_erasers =
10771 {
10772 {
10773 .eraseblocks = { {4 * 1024, 1024} },
10774 .block_erase = spi_block_erase_20,
10775 }, {
10776 .eraseblocks = { {4 * 1024, 1024} },
10777 .block_erase = spi_block_erase_d7,
10778 }, {
10779 .eraseblocks = { {64 * 1024, 64} },
10780 .block_erase = spi_block_erase_d8,
10781 }, {
10782 .eraseblocks = { {4096 * 1024, 1} },
10783 .block_erase = spi_block_erase_60,
10784 }, {
10785 .eraseblocks = { {4096 * 1024, 1} },
10786 .block_erase = spi_block_erase_c7,
10787 }
10788 },
10789 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10790 .unlock = spi_disable_blockprotect_bp3_srwd,
10791 .write = spi_chip_write_256,
10792 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10793 .voltage = {2700, 3600},
10794 },
10795
10796 {
Stefan Taunerf4451612013-04-19 01:59:15 +000010797 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010798 .name = "Pm25LV512(A)",
10799 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000010800 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010801 .model_id = PMC_PM25LV512,
10802 .total_size = 64,
10803 .page_size = 256,
10804 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +000010805 .tested = TEST_OK_PREW,
Stefan Taunerbecda742014-05-30 19:34:00 +000010806 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010807 .probe_timing = TIMING_ZERO,
10808 .block_erasers =
10809 {
10810 {
10811 .eraseblocks = { {4 * 1024, 16} },
10812 .block_erase = spi_block_erase_d7,
10813 }, {
10814 .eraseblocks = { {32 * 1024, 2} },
10815 .block_erase = spi_block_erase_d8,
10816 }, {
10817 .eraseblocks = { {64 * 1024, 1} },
10818 .block_erase = spi_block_erase_c7,
10819 }
10820 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010821 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010822 .unlock = spi_disable_blockprotect,
10823 .write = spi_chip_write_256,
10824 .read = spi_chip_read, /* Fast read (0x0B) supported */
10825 .voltage = {2700, 3600},
10826 },
10827
10828 {
10829 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010830 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010831 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000010832 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010833 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010834 .total_size = 128,
10835 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010836 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000010837 .tested = TEST_OK_PREW,
10838 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010839 .probe_timing = TIMING_ZERO,
10840 .block_erasers =
10841 {
10842 {
10843 .eraseblocks = { {4 * 1024, 32} },
10844 .block_erase = spi_block_erase_d7,
10845 }, {
10846 .eraseblocks = { {32 * 1024, 4} },
10847 .block_erase = spi_block_erase_d8,
10848 }, {
10849 .eraseblocks = { {128 * 1024, 1} },
10850 .block_erase = spi_block_erase_c7,
10851 }
10852 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010853 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010854 .unlock = spi_disable_blockprotect,
10855 .write = spi_chip_write_256,
10856 .read = spi_chip_read, /* Fast read (0x0B) supported */
10857 .voltage = {2700, 3600},
10858 },
10859
10860 {
10861 .vendor = "PMC",
10862 .name = "Pm25LV010A",
10863 .bustype = BUS_SPI,
10864 .manufacture_id = PMC_ID,
10865 .model_id = PMC_PM25LV010,
10866 .total_size = 128,
10867 .page_size = 256,
10868 .feature_bits = FEATURE_WRSR_WREN,
10869 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010870 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010871 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010872 .block_erasers =
10873 {
10874 {
10875 .eraseblocks = { {4 * 1024, 32} },
10876 .block_erase = spi_block_erase_d7,
10877 }, {
10878 .eraseblocks = { {32 * 1024, 4} },
10879 .block_erase = spi_block_erase_d8,
10880 }, {
10881 .eraseblocks = { {128 * 1024, 1} },
10882 .block_erase = spi_block_erase_c7,
10883 }
10884 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010885 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010886 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010887 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010888 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000010889 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010890 },
10891
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010892 {
10893 .vendor = "PMC",
10894 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010895 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010896 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010897 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010898 .total_size = 256,
10899 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010900 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010901 .tested = TEST_UNTESTED,
10902 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010903 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010904 .block_erasers =
10905 {
10906 {
10907 .eraseblocks = { {4 * 1024, 64} },
10908 .block_erase = spi_block_erase_d7,
10909 }, {
10910 .eraseblocks = { {64 * 1024, 4} },
10911 .block_erase = spi_block_erase_d8,
10912 }, {
10913 .eraseblocks = { {256 * 1024, 1} },
10914 .block_erase = spi_block_erase_c7,
10915 }
10916 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010917 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010918 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010919 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010920 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010921 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010922 },
10923
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010924 {
10925 .vendor = "PMC",
10926 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010927 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010928 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010929 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010930 .total_size = 512,
10931 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010932 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000010933 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010934 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010935 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010936 .block_erasers =
10937 {
10938 {
10939 .eraseblocks = { {4 * 1024, 128} },
10940 .block_erase = spi_block_erase_d7,
10941 }, {
10942 .eraseblocks = { {64 * 1024, 8} },
10943 .block_erase = spi_block_erase_d8,
10944 }, {
10945 .eraseblocks = { {512 * 1024, 1} },
10946 .block_erase = spi_block_erase_c7,
10947 }
10948 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010949 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010950 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010951 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010952 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010953 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010954 },
10955
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010956 {
10957 .vendor = "PMC",
10958 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010959 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010960 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010961 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010962 .total_size = 1024,
10963 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010964 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010965 .tested = TEST_UNTESTED,
10966 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010967 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010968 .block_erasers =
10969 {
10970 {
10971 .eraseblocks = { {4 * 1024, 256} },
10972 .block_erase = spi_block_erase_d7,
10973 }, {
10974 .eraseblocks = { {4 * 1024, 256} },
10975 .block_erase = spi_block_erase_20,
10976 }, {
10977 .eraseblocks = { {64 * 1024, 16} },
10978 .block_erase = spi_block_erase_d8,
10979 }, {
10980 .eraseblocks = { {1024 * 1024, 1} },
10981 .block_erase = spi_block_erase_60,
10982 }, {
10983 .eraseblocks = { {1024 * 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",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010996 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010997 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010998 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000010999 .model_id = PMC_PM25LV016B,
11000 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011001 .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 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011009 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +000011010 .block_erase = spi_block_erase_d7,
11011 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011012 .eraseblocks = { {4 * 1024, 512} },
11013 .block_erase = spi_block_erase_20,
11014 }, {
11015 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +000011016 .block_erase = spi_block_erase_d8,
11017 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000011018 .eraseblocks = { {2 * 1024 * 1024, 1} },
11019 .block_erase = spi_block_erase_60,
11020 }, {
11021 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011022 .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 Zakulec7d257b42011-07-19 08:50:18 +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",
Sean Nelson72a9a022009-12-22 22:15:33 +000011034 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011035 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011036 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011037 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011038 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011039 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011040 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011041 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000011042 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +000011043 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011044 .block_erasers =
11045 {
11046 {
11047 .eraseblocks = {
11048 {128 * 1024, 1},
11049 {96 * 1024, 1},
11050 {8 * 1024, 2},
11051 {16 * 1024, 1},
11052 },
Sean Nelson35727f72010-01-28 23:55:12 +000011053 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011054 }, {
11055 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011056 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011057 },
11058 },
Sean Nelson35727f72010-01-28 23:55:12 +000011059 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011060 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011061 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011062 },
11063
11064 {
11065 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000011066 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011067 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011068 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011069 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011070 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000011071 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011072 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011073 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011074 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011075 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000011076 .block_erasers =
11077 {
11078 {
11079 .eraseblocks = {
11080 {16 * 1024, 1},
11081 {8 * 1024, 2},
11082 {96 * 1024, 1},
11083 {128 * 1024, 1},
11084 },
Sean Nelson35727f72010-01-28 23:55:12 +000011085 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011086 }, {
11087 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011088 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000011089 },
11090 },
Sean Nelson35727f72010-01-28 23:55:12 +000011091 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011092 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011093 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000011094 },
11095
11096 {
11097 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011098 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011099 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011100 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011101 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011102 .total_size = 128,
11103 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011104 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011105 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011106 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011107 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000011108 .block_erasers =
11109 {
11110 {
11111 .eraseblocks = { {4 * 1024, 32} },
11112 .block_erase = erase_sector_jedec,
11113 }, {
11114 .eraseblocks = { {64 * 1024, 2} },
11115 .block_erase = erase_block_jedec,
11116 }, {
11117 .eraseblocks = { {128 * 1024, 1} },
11118 .block_erase = erase_chip_block_jedec,
11119 }
11120 },
Sean Nelson35727f72010-01-28 23:55:12 +000011121 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011122 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011123 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000011124 },
11125
11126 {
11127 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011128 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011129 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011130 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011131 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011132 .total_size = 256,
11133 .page_size = 4096,
11134 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11135 .tested = TEST_UNTESTED,
11136 .probe = probe_jedec,
11137 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11138 .block_erasers =
11139 {
11140 {
11141 .eraseblocks = { {4 * 1024, 64} },
11142 .block_erase = erase_sector_jedec,
11143 }, {
11144 .eraseblocks = { {64 * 1024, 4} },
11145 .block_erase = erase_block_jedec,
11146 }, {
11147 .eraseblocks = { {256 * 1024, 1} },
11148 .block_erase = erase_chip_block_jedec,
11149 }
11150 },
11151 .write = write_jedec_1,
11152 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011153 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011154 },
11155
11156 {
11157 .vendor = "PMC",
11158 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011159 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011160 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011161 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011162 .total_size = 512,
11163 .page_size = 4096,
11164 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011165 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011166 .probe = probe_jedec,
11167 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11168 .block_erasers =
11169 {
11170 {
11171 .eraseblocks = { {4 * 1024, 128} },
11172 .block_erase = erase_sector_jedec,
11173 }, {
11174 .eraseblocks = { {64 * 1024, 8} },
11175 .block_erase = erase_block_jedec,
11176 }, {
11177 .eraseblocks = { {512 * 1024, 1} },
11178 .block_erase = erase_chip_block_jedec,
11179 }
11180 },
11181 .write = write_jedec_1,
11182 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011183 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011184 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000011185
11186 {
11187 .vendor = "PMC",
11188 .name = "Pm39LV512",
11189 .bustype = BUS_PARALLEL,
11190 .manufacture_id = PMC_ID_NOPREFIX,
11191 .model_id = PMC_PM39LV512,
11192 .total_size = 64,
11193 .page_size = 4096,
11194 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11195 .tested = TEST_OK_PREW,
11196 .probe = probe_jedec,
11197 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11198 .block_erasers =
11199 {
11200 {
11201 .eraseblocks = { {4 * 1024, 16} },
11202 .block_erase = erase_sector_jedec,
11203 }, {
11204 .eraseblocks = { {64 * 1024, 1} },
11205 .block_erase = erase_block_jedec,
11206 }, {
11207 .eraseblocks = { {64 * 1024, 1} },
11208 .block_erase = erase_chip_block_jedec,
11209 }
11210 },
11211 .write = write_jedec_1,
11212 .read = read_memmapped,
11213 .voltage = {2700, 3600},
11214 },
11215
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000011216 {
11217 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011218 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011219 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011220 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011221 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011222 .total_size = 256,
11223 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011224 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011225 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011226 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011227 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000011228 .block_erasers =
11229 {
11230 {
11231 .eraseblocks = { {4 * 1024, 64} },
11232 .block_erase = erase_sector_jedec,
11233 }, {
11234 .eraseblocks = { {16 * 1024, 16} },
11235 .block_erase = erase_block_jedec,
11236 }, {
11237 .eraseblocks = { {256 * 1024, 1} },
11238 .block_erase = erase_chip_block_jedec,
11239 }
11240 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011241 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000011242 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011243 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011244 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011245 },
11246
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011247 {
11248 .vendor = "PMC",
11249 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011250 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011251 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011252 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011253 .total_size = 512,
11254 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011255 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011256 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000011257 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000011258 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011259 .block_erasers =
11260 {
11261 {
11262 .eraseblocks = { {4 * 1024, 128} },
11263 .block_erase = erase_sector_jedec,
11264 }, {
11265 .eraseblocks = { {64 * 1024, 8} },
11266 .block_erase = erase_block_jedec,
11267 }, {
11268 .eraseblocks = { {512 * 1024, 1} },
11269 .block_erase = erase_chip_block_jedec,
11270 }
11271 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011272 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000011273 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011274 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011275 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011276 },
11277
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011278 {
Sean Nelsond70b09c2009-11-24 02:11:08 +000011279 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +000011280 .name = "LE25FW106",
11281 .bustype = BUS_SPI,
11282 .manufacture_id = SANYO_ID,
11283 .model_id = SANYO_LE25FW106,
11284 .total_size = 128,
11285 .page_size = 256,
11286 .feature_bits = FEATURE_WRSR_WREN,
11287 .tested = TEST_OK_PREW,
11288 .probe = probe_spi_res2,
11289 .probe_timing = TIMING_ZERO,
11290 .block_erasers = {
11291 {
11292 .eraseblocks = { {2 * 1024, 64} },
11293 .block_erase = spi_block_erase_d7,
11294 }, {
11295 .eraseblocks = { {32 * 1024, 4} },
11296 .block_erase = spi_block_erase_d8,
11297 }, {
11298 .eraseblocks = { {128 * 1024, 1} },
11299 .block_erase = spi_block_erase_c7,
11300 }
11301 },
11302 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
11303 .unlock = spi_disable_blockprotect_bp1_srwd,
11304 .write = spi_chip_write_256,
11305 .read = spi_chip_read,
11306 .voltage = {2700, 3600},
11307 },
11308
11309 {
11310 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +000011311 .name = "LE25FW406A",
11312 .bustype = BUS_SPI,
11313 .manufacture_id = SANYO_ID,
11314 .model_id = SANYO_LE25FW406A,
11315 .total_size = 512,
11316 .page_size = 256,
11317 .feature_bits = FEATURE_WRSR_WREN,
11318 .tested = TEST_OK_PREW,
11319 .probe = probe_spi_res2,
11320 .probe_timing = TIMING_ZERO,
11321 .block_erasers = {
11322 {
11323 .eraseblocks = { {4 * 1024, 128} },
11324 .block_erase = spi_block_erase_d7,
11325 }, {
11326 .eraseblocks = { {64 * 1024, 8} },
11327 .block_erase = spi_block_erase_d8,
11328 }, {
11329 .eraseblocks = { {512 * 1024, 1} },
11330 .block_erase = spi_block_erase_c7,
11331 }
11332 },
11333 .printlock = spi_prettyprint_status_register_plain,
11334 .unlock = spi_disable_blockprotect,
11335 .write = spi_chip_write_256,
11336 .read = spi_chip_read,
11337 .voltage = {2700, 3600},
11338 },
11339
11340 {
11341 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +000011342 .name = "LE25FU406B",
11343 .bustype = BUS_SPI,
11344 .manufacture_id = SANYO_ID,
11345 .model_id = SANYO_LE25FU406B,
11346 .total_size = 512,
11347 .page_size = 256,
11348 .feature_bits = FEATURE_WRSR_WREN,
11349 .tested = TEST_OK_PREW,
11350 .probe = probe_spi_res2,
11351 .probe_timing = TIMING_ZERO,
11352 .block_erasers = {
11353 {
11354 .eraseblocks = { {4 * 1024, 128} },
11355 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011356 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000011357 .eraseblocks = { {64 * 1024, 8} },
11358 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011359 }, {
Jurij Mundaa1e53742014-05-14 13:19:50 +000011360 .eraseblocks = { {512 * 1024, 1} },
11361 .block_erase = spi_block_erase_c7,
11362 }
11363 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011364 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +000011365 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11366 .write = spi_chip_write_256,
11367 .read = spi_chip_read,
11368 .voltage = {2300, 3600},
11369 },
11370
11371 {
11372 .vendor = "Sanyo",
Stefan Tauner2f055df2015-12-25 22:13:15 +000011373 .name = "LE25FU406C/LE25U40CMC",
11374 .bustype = BUS_SPI,
11375 .manufacture_id = SANYO_ID,
11376 .model_id = SANYO_LE25FU406C,
11377 .total_size = 512,
11378 .page_size = 256,
11379 .feature_bits = FEATURE_WRSR_WREN,
11380 .tested = TEST_OK_PR,
11381 .probe = probe_spi_rdid,
11382 .probe_timing = TIMING_ZERO,
11383 .block_erasers = {
11384 {
11385 .eraseblocks = { {4 * 1024, 128} },
11386 .block_erase = spi_block_erase_20,
11387 }, {
11388 .eraseblocks = { {4 * 1024, 128} },
11389 .block_erase = spi_block_erase_d7,
11390 }, {
11391 .eraseblocks = { {64 * 1024, 8} },
11392 .block_erase = spi_block_erase_d8,
11393 }, {
11394 .eraseblocks = { {512 * 1024, 1} },
11395 .block_erase = spi_block_erase_60,
11396 }, {
11397 .eraseblocks = { {512 * 1024, 1} },
11398 .block_erase = spi_block_erase_c7,
11399 }
11400 },
11401 .printlock = spi_prettyprint_status_register_bp2_srwd,
11402 .unlock = spi_disable_blockprotect_bp2_srwd,
11403 .write = spi_chip_write_256,
11404 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
11405 .voltage = {2300, 3600},
11406 },
11407
11408 {
11409 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011410 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011411 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +000011412 .manufacture_id = SANYO_ID,
11413 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011414 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +000011415 .page_size = 256,
11416 .tested = TEST_UNTESTED,
11417 .probe = probe_spi_rdid,
11418 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011419 .block_erasers =
11420 {
11421 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011422 .eraseblocks = { {256, 1024} },
11423 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011424 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011425 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +000011426 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011427 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011428 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000011429 .block_erase = spi_block_erase_c7,
11430 }
11431 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011432 .printlock = spi_prettyprint_status_register_default_welwip,
11433 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +000011434 .write = spi_chip_write_256,
11435 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011436 .voltage = {2700, 3600},
11437 },
11438
11439 {
11440 .vendor = "Sanyo",
11441 .name = "LE25FW403A",
11442 .bustype = BUS_SPI,
11443 .manufacture_id = SANYO_ID,
11444 .model_id = SANYO_LE25FW403A,
11445 .total_size = 512,
11446 .page_size = 256,
11447 .tested = TEST_UNTESTED,
11448 .probe = probe_spi_rdid,
11449 .probe_timing = TIMING_ZERO,
11450 .block_erasers = {
11451 {
11452 .eraseblocks = { {256, 2 * 1024} },
11453 .block_erase = spi_block_erase_db,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011454 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011455 .eraseblocks = { {64 * 1024, 8} },
11456 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011457 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011458 .eraseblocks = { {512 * 1024, 1} },
11459 .block_erase = spi_block_erase_c7,
11460 }
11461 },
11462 .printlock = spi_prettyprint_status_register_default_welwip,
11463 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11464 .write = spi_chip_write_256,
11465 .read = spi_chip_read,
11466 .voltage = {2700, 3600},
11467 },
11468
11469 {
11470 .vendor = "Sanyo",
11471 .name = "LE25FW418A",
11472 .bustype = BUS_SPI,
11473 .manufacture_id = SANYO_ID,
11474 .model_id = SANYO_LE25FW418A,
11475 .total_size = 512,
11476 .page_size = 256,
11477 .feature_bits = FEATURE_WRSR_WREN,
11478 .tested = TEST_UNTESTED,
11479 .probe = probe_spi_res2,
11480 .probe_timing = TIMING_ZERO,
11481 .block_erasers = {
11482 {
11483 .eraseblocks = { {4 * 1024, 128} },
11484 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011485 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011486 .eraseblocks = { {64 * 1024, 8} },
11487 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011488 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011489 .eraseblocks = { {512 * 1024, 1} },
11490 .block_erase = spi_block_erase_c7,
11491 }
11492 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011493 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011494 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11495 .write = spi_chip_write_256,
11496 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
11497 .voltage = {2700, 3600},
11498 },
11499
11500 {
11501 .vendor = "Sanyo",
11502 .name = "LE25FW806",
11503 .bustype = BUS_SPI,
11504 .manufacture_id = SANYO_ID,
11505 .model_id = SANYO_LE25FW806,
11506 .total_size = 1024,
11507 .page_size = 256,
11508 .feature_bits = FEATURE_WRSR_WREN,
11509 .tested = TEST_UNTESTED,
11510 .probe = probe_spi_res2,
11511 .probe_timing = TIMING_ZERO,
11512 .block_erasers = {
11513 {
11514 .eraseblocks = { {4 * 1024, 256} },
11515 .block_erase = spi_block_erase_20,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011516 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011517 .eraseblocks = { {4 * 1024, 256} },
11518 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011519 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011520 .eraseblocks = { {64 * 1024, 16} },
11521 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011522 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011523 .eraseblocks = { {1024 * 1024, 1} },
11524 .block_erase = spi_block_erase_c7,
11525 }
11526 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011527 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011528 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11529 .write = spi_chip_write_256,
11530 .read = spi_chip_read,
11531 .voltage = {2700, 3600},
11532 },
11533
11534 {
11535 .vendor = "Sanyo",
11536 .name = "LE25FW808",
11537 .bustype = BUS_SPI,
11538 .manufacture_id = SANYO_ID,
11539 .model_id = SANYO_LE25FW808,
11540 .total_size = 1024,
11541 .page_size = 256,
11542 .feature_bits = FEATURE_WRSR_WREN,
11543 .tested = TEST_UNTESTED,
11544 .probe = probe_spi_res2,
11545 .probe_timing = TIMING_ZERO,
11546 .block_erasers = {
11547 {
11548 .eraseblocks = { {8 * 1024, 128} },
11549 .block_erase = spi_block_erase_d7,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011550 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011551 .eraseblocks = { {64 * 1024, 16} },
11552 .block_erase = spi_block_erase_d8,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011553 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011554 .eraseblocks = { {1024 * 1024, 1} },
11555 .block_erase = spi_block_erase_c7,
11556 }
11557 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011558 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000011559 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
11560 .write = spi_chip_write_256,
11561 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
11562 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000011563 },
11564
11565 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011566 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000011567 .name = "LH28F008BJT-BTLZ1",
11568 .bustype = BUS_PARALLEL,
11569 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000011570 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000011571 .total_size = 1024,
11572 .page_size = 64 * 1024,
11573 .tested = TEST_OK_PREW,
11574 .probe = probe_82802ab,
11575 .probe_timing = TIMING_ZERO,
11576 .block_erasers =
11577 {
11578 {
11579 .eraseblocks = {
11580 {8 * 1024, 8},
11581 {64 * 1024, 15}
11582 },
11583 .block_erase = erase_block_82802ab,
11584 }, {
11585 .eraseblocks = { {1024 * 1024, 1} },
11586 .block_erase = erase_sector_49lfxxxc,
11587 }
11588 },
11589 .unlock = unlock_lh28f008bjt,
11590 .write = write_82802ab,
11591 .read = read_memmapped,
11592 .voltage = {2700, 3600},
11593 },
11594
11595 {
11596 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011597 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011598 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011599 .manufacture_id = SHARP_ID,
11600 .model_id = SHARP_LHF00L04,
11601 .total_size = 1024,
11602 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011603 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011604 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011605 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011606 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011607 .block_erasers =
11608 {
11609 {
11610 .eraseblocks = {
11611 {64 * 1024, 15},
11612 {8 * 1024, 8}
11613 },
Sean Nelson28accc22010-03-19 18:47:06 +000011614 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011615 }, {
11616 .eraseblocks = {
11617 {1024 * 1024, 1}
11618 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000011619 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000011620 },
11621 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011622 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000011623 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011624 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011625 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011626 },
11627
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011628 {
11629 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000011630 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011631 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011632 .manufacture_id = SPANSION_ID,
11633 .model_id = SPANSION_S25FL004A,
11634 .total_size = 512,
11635 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011636 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000011637 .tested = TEST_UNTESTED,
11638 .probe = probe_spi_rdid,
11639 .probe_timing = TIMING_ZERO,
11640 .block_erasers =
11641 {
11642 {
11643 .eraseblocks = { {64 * 1024, 8} },
11644 .block_erase = spi_block_erase_d8,
11645 }, {
11646 .eraseblocks = { {512 * 1024, 1} },
11647 .block_erase = spi_block_erase_c7,
11648 }
11649 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011650 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011651 .unlock = spi_disable_blockprotect,
11652 .write = spi_chip_write_256,
11653 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011654 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011655 },
11656
11657 {
11658 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000011659 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011660 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000011661 .manufacture_id = SPANSION_ID,
11662 .model_id = SPANSION_S25FL008A,
11663 .total_size = 1024,
11664 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011665 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011666 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000011667 .probe = probe_spi_rdid,
11668 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000011669 .block_erasers =
11670 {
11671 {
11672 .eraseblocks = { {64 * 1024, 16} },
11673 .block_erase = spi_block_erase_d8,
11674 }, {
11675 .eraseblocks = { {1024 * 1024, 1} },
11676 .block_erase = spi_block_erase_c7,
11677 }
11678 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011679 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011680 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000011681 .write = spi_chip_write_256,
11682 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011683 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000011684 },
11685
11686 {
11687 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011688 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011689 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011690 .manufacture_id = SPANSION_ID,
11691 .model_id = SPANSION_S25FL016A,
11692 .total_size = 2048,
11693 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011694 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011695 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011696 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011697 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000011698 .block_erasers =
11699 {
11700 {
11701 .eraseblocks = { {64 * 1024, 32} },
11702 .block_erase = spi_block_erase_d8,
11703 }, {
11704 .eraseblocks = { {2 * 1024 * 1024, 1} },
11705 .block_erase = spi_block_erase_c7,
11706 }
11707 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011708 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011709 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011710 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011711 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011712 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011713 },
11714
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011715 {
Rudy Hostf4e57772010-11-29 00:37:49 +000011716 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000011717 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011718 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011719 .manufacture_id = SPANSION_ID,
11720 .model_id = SPANSION_S25FL032A,
11721 .total_size = 4096,
11722 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011723 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011724 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000011725 .probe = probe_spi_rdid,
11726 .probe_timing = TIMING_ZERO,
11727 .block_erasers =
11728 {
11729 {
11730 .eraseblocks = { {64 * 1024, 64} },
11731 .block_erase = spi_block_erase_d8,
11732 }, {
11733 .eraseblocks = { {4 * 1024 * 1024, 1} },
11734 .block_erase = spi_block_erase_c7,
11735 }
11736 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011737 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011738 .unlock = spi_disable_blockprotect,
11739 .write = spi_chip_write_256,
11740 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011741 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011742 },
11743
11744 {
11745 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000011746 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011747 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000011748 .manufacture_id = SPANSION_ID,
11749 .model_id = SPANSION_S25FL064A,
11750 .total_size = 8192,
11751 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011752 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000011753 .tested = TEST_OK_PREW,
11754 .probe = probe_spi_rdid,
11755 .probe_timing = TIMING_ZERO,
11756 .block_erasers =
11757 {
11758 {
11759 .eraseblocks = { {64 * 1024, 128} },
11760 .block_erase = spi_block_erase_d8,
11761 }, {
11762 .eraseblocks = { {8 * 1024 * 1024, 1} },
11763 .block_erase = spi_block_erase_c7,
11764 }
11765 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011766 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000011767 .unlock = spi_disable_blockprotect,
11768 .write = spi_chip_write_256,
11769 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011770 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000011771 },
11772
11773 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011774 .vendor = "Spansion",
11775 .name = "S25FL204K",
11776 .bustype = BUS_SPI,
11777 .manufacture_id = SPANSION_ID,
11778 .model_id = SPANSION_S25FL204,
11779 .total_size = 512,
11780 .page_size = 256,
11781 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011782 .tested = TEST_OK_PR,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011783 .probe = probe_spi_rdid,
11784 .probe_timing = TIMING_ZERO,
11785 .block_erasers = {
11786 {
11787 .eraseblocks = { {4 * 1024, 128} },
11788 .block_erase = spi_block_erase_20,
11789 }, {
11790 .eraseblocks = { {64 * 1024, 8} },
11791 .block_erase = spi_block_erase_d8,
11792 }, {
11793 .eraseblocks = { { 512 * 1024, 1} },
11794 .block_erase = spi_block_erase_60,
11795 }, {
11796 .eraseblocks = { { 512 * 1024, 1} },
11797 .block_erase = spi_block_erase_c7,
11798 }
11799 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011800 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011801 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011802 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011803 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011804 .voltage = {2700, 3600},
11805 },
11806
11807 {
11808 .vendor = "Spansion",
11809 .name = "S25FL208K",
11810 .bustype = BUS_SPI,
11811 .manufacture_id = SPANSION_ID,
11812 .model_id = SPANSION_S25FL208,
11813 .total_size = 1024,
11814 .page_size = 256,
11815 .feature_bits = FEATURE_WRSR_WREN,
11816 .tested = TEST_UNTESTED,
11817 .probe = probe_spi_rdid,
11818 .probe_timing = TIMING_ZERO,
11819 .block_erasers = {
11820 {
11821 .eraseblocks = { {4 * 1024, 256} },
11822 .block_erase = spi_block_erase_20,
11823 }, {
11824 .eraseblocks = { {64 * 1024, 16} },
11825 .block_erase = spi_block_erase_d8,
11826 }, {
11827 .eraseblocks = { { 1024 * 1024, 1} },
11828 .block_erase = spi_block_erase_60,
11829 }, {
11830 .eraseblocks = { { 1024 * 1024, 1} },
11831 .block_erase = spi_block_erase_c7,
11832 }
11833 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011834 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011835 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011836 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011837 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011838 .voltage = {2700, 3600},
11839 },
11840
11841 {
11842 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000011843 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011844 .bustype = BUS_SPI,
11845 .manufacture_id = SPANSION_ID,
11846 .model_id = SPANSION_S25FL216,
11847 .total_size = 2048,
11848 .page_size = 256,
11849 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
11850 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11851 .tested = TEST_UNTESTED,
11852 .probe = probe_spi_rdid,
11853 .probe_timing = TIMING_ZERO,
11854 .block_erasers = {
11855 {
11856 .eraseblocks = { {4 * 1024, 512} },
11857 .block_erase = spi_block_erase_20,
11858 }, {
11859 .eraseblocks = { {64 * 1024, 32} },
11860 .block_erase = spi_block_erase_d8,
11861 }, {
11862 .eraseblocks = { { 2048 * 1024, 1} },
11863 .block_erase = spi_block_erase_60,
11864 }, {
11865 .eraseblocks = { { 2048 * 1024, 1} },
11866 .block_erase = spi_block_erase_c7,
11867 }
11868 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011869 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000011870 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011871 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000011872 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000011873 .voltage = {2700, 3600},
11874 },
11875
11876 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000011877 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000011878 .name = "S25FL132K",
11879 .bustype = BUS_SPI,
11880 .manufacture_id = SPANSION_ID,
11881 .model_id = SPANSION_S25FL132K,
11882 .total_size = 4096,
11883 .page_size = 256,
11884 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
11885 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11886 .tested = TEST_UNTESTED,
11887 .probe = probe_spi_rdid,
11888 .probe_timing = TIMING_ZERO,
11889 .block_erasers = {
11890 {
11891 .eraseblocks = { {4 * 1024, 1024} },
11892 .block_erase = spi_block_erase_20,
11893 }, {
11894 .eraseblocks = { {64 * 1024, 64} },
11895 .block_erase = spi_block_erase_d8,
11896 }, {
11897 .eraseblocks = { { 4096 * 1024, 1} },
11898 .block_erase = spi_block_erase_60,
11899 }, {
11900 .eraseblocks = { { 4096 * 1024, 1} },
11901 .block_erase = spi_block_erase_c7,
11902 }
11903 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011904 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000011905 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
11906 .write = spi_chip_write_256,
11907 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11908 .voltage = {2700, 3600},
11909 },
11910
11911 {
11912 .vendor = "Spansion",
11913 .name = "S25FL164K",
11914 .bustype = BUS_SPI,
11915 .manufacture_id = SPANSION_ID,
11916 .model_id = SPANSION_S25FL164K,
11917 .total_size = 8192,
11918 .page_size = 256,
11919 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
11920 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11921 .tested = TEST_OK_PREW,
11922 .probe = probe_spi_rdid,
11923 .probe_timing = TIMING_ZERO,
11924 .block_erasers = {
11925 {
11926 .eraseblocks = { {4 * 1024, 2048} },
11927 .block_erase = spi_block_erase_20,
11928 }, {
11929 .eraseblocks = { {64 * 1024, 128} },
11930 .block_erase = spi_block_erase_d8,
11931 }, {
11932 .eraseblocks = { { 8192 * 1024, 1} },
11933 .block_erase = spi_block_erase_60,
11934 }, {
11935 .eraseblocks = { { 8192 * 1024, 1} },
11936 .block_erase = spi_block_erase_c7,
11937 }
11938 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011939 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000011940 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
11941 .write = spi_chip_write_256,
11942 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11943 .voltage = {2700, 3600},
11944 },
11945
11946 {
11947 .vendor = "Spansion",
Jernej Å krabece814a9b2014-12-12 00:32:03 +000011948 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
11949 .bustype = BUS_SPI,
11950 .manufacture_id = SPANSION_ID,
11951 .model_id = SPANSION_S25FL128,
11952 .total_size = 16384,
11953 .page_size = 256,
11954 /* supports 4B addressing */
11955 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
11956 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11957 .tested = TEST_OK_PREW,
11958 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
11959 .probe = probe_spi_rdid,
11960 .probe_timing = TIMING_ZERO,
11961 .block_erasers = {
11962 {
11963 /* This chip supports erasing of 32 so-called "parameter sectors" with
11964 * opcode 0x20 which may be configured to be on top or bottom of the address
11965 * space. Trying to access an address outside these 4kB blocks does have no
11966 * effect on the memory contents, e.g.
11967 .eraseblocks = {
11968 {4 * 1024, 32},
11969 {64 * 1024, 254} // inaccessible
11970 },
11971 .block_erase = spi_block_erase_20,
11972 }, { */
11973 .eraseblocks = { { 64 * 1024, 256} },
11974 .block_erase = spi_block_erase_d8,
11975 }, {
11976 .eraseblocks = { { 16384 * 1024, 1} },
11977 .block_erase = spi_block_erase_60,
11978 }, {
11979 .eraseblocks = { { 16384 * 1024, 1} },
11980 .block_erase = spi_block_erase_c7,
11981 }
11982 },
11983 .printlock = spi_prettyprint_status_register_bp2_srwd,
11984 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
11985 .write = spi_chip_write_256, /* Multi I/O supported */
11986 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11987 .voltage = {2700, 3600},
11988 },
11989
11990 {
11991 .vendor = "Spansion",
11992 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
11993 .bustype = BUS_SPI,
11994 .manufacture_id = SPANSION_ID,
11995 .model_id = SPANSION_S25FL128,
11996 .total_size = 16384,
11997 .page_size = 512,
11998 /* supports 4B addressing */
11999 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12000 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12001 .tested = TEST_UNTESTED,
12002 .probe = probe_spi_rdid,
12003 .probe_timing = TIMING_ZERO,
12004 .block_erasers = {
12005 {
12006 .eraseblocks = { {256 * 1024, 64} },
12007 .block_erase = spi_block_erase_d8,
12008 }, {
12009 .eraseblocks = { { 16384 * 1024, 1} },
12010 .block_erase = spi_block_erase_60,
12011 }, {
12012 .eraseblocks = { { 16384 * 1024, 1} },
12013 .block_erase = spi_block_erase_c7,
12014 }
12015 },
12016 .printlock = spi_prettyprint_status_register_bp2_srwd,
12017 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
12018 .write = spi_chip_write_256, /* Multi I/O supported */
12019 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12020 .voltage = {2700, 3600},
12021 },
12022
12023 {
12024 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000012025 .name = "S25FL128P......0", /* uniform 64 kB sectors */
12026 .bustype = BUS_SPI,
12027 .manufacture_id = SPANSION_ID,
12028 .model_id = SPANSION_S25FL128,
12029 .total_size = 16384,
12030 .page_size = 256,
12031 .feature_bits = FEATURE_WRSR_WREN,
12032 .tested = TEST_UNTESTED,
12033 .probe = probe_spi_rdid,
12034 .probe_timing = TIMING_ZERO,
12035 .block_erasers = {
12036 {
12037 .eraseblocks = { {64 * 1024, 256} },
12038 .block_erase = spi_block_erase_20,
12039 }, {
12040 .eraseblocks = { {64 * 1024, 256} },
12041 .block_erase = spi_block_erase_d8,
12042 }, {
12043 .eraseblocks = { { 16384 * 1024, 1} },
12044 .block_erase = spi_block_erase_60,
12045 }, {
12046 .eraseblocks = { { 16384 * 1024, 1} },
12047 .block_erase = spi_block_erase_c7,
12048 }
12049 },
12050 .printlock = spi_prettyprint_status_register_bp3_srwd,
12051 .unlock = spi_disable_blockprotect_bp3_srwd,
12052 .write = spi_chip_write_256,
12053 .read = spi_chip_read, /* Fast read (0x0B) supported */
12054 .voltage = {2700, 3600},
12055 },
12056
12057 {
12058 .vendor = "Spansion",
12059 .name = "S25FL128P......1", /* uniform 256kB sectors */
12060 .bustype = BUS_SPI,
12061 .manufacture_id = SPANSION_ID,
12062 .model_id = SPANSION_S25FL128,
12063 .total_size = 16384,
12064 .page_size = 256,
12065 .feature_bits = FEATURE_WRSR_WREN,
12066 .tested = TEST_UNTESTED,
12067 .probe = probe_spi_rdid,
12068 .probe_timing = TIMING_ZERO,
12069 .block_erasers = {
12070 {
12071 .eraseblocks = { {256 * 1024, 64} },
12072 .block_erase = spi_block_erase_d8,
12073 }, {
12074 .eraseblocks = { { 16384 * 1024, 1} },
12075 .block_erase = spi_block_erase_c7,
12076 }
12077 },
12078 .printlock = spi_prettyprint_status_register_bp2_srwd,
12079 .unlock = spi_disable_blockprotect_bp2_srwd,
12080 .write = spi_chip_write_256,
12081 .read = spi_chip_read, /* Fast read (0x0B) supported */
12082 .voltage = {2700, 3600},
12083 },
12084
12085 {
12086 .vendor = "Spansion",
12087 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012088 .bustype = BUS_SPI,
12089 .manufacture_id = SPANSION_ID,
12090 .model_id = SPANSION_S25FL128,
12091 .total_size = 16384,
12092 .page_size = 256,
12093 /* supports 4B addressing */
12094 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12095 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012096 .tested = TEST_OK_PREW,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012097 .probe = probe_spi_rdid,
12098 .probe_timing = TIMING_ZERO,
12099 .block_erasers = {
12100 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012101 /* This chip supports erasing of the 32 so-called "parameter sectors" with
12102 * opcode 0x20. Trying to access an address outside these 4kB blocks does
12103 * have no effect on the memory contents, but sets a flag in the SR.
12104 .eraseblocks = {
12105 {4 * 1024, 32},
12106 {64 * 1024, 254} // inaccessible
12107 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012108 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000012109 }, { */
12110 .eraseblocks = { { 64 * 1024, 256} },
12111 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012112 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000012113 .eraseblocks = { { 16384 * 1024, 1} },
12114 .block_erase = spi_block_erase_60,
12115 }, {
12116 .eraseblocks = { { 16384 * 1024, 1} },
12117 .block_erase = spi_block_erase_c7,
12118 }
12119 },
12120 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12121 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12122 .write = spi_chip_write_256, /* Multi I/O supported */
12123 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12124 .voltage = {2700, 3600},
12125 },
12126
12127 {
12128 .vendor = "Spansion",
12129 .name = "S25FL128S......1", /* uniform 256 kB sectors */
12130 .bustype = BUS_SPI,
12131 .manufacture_id = SPANSION_ID,
12132 .model_id = SPANSION_S25FL128,
12133 .total_size = 16384,
12134 .page_size = 512,
12135 /* supports 4B addressing */
12136 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
12137 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12138 .tested = TEST_UNTESTED,
12139 .probe = probe_spi_rdid,
12140 .probe_timing = TIMING_ZERO,
12141 .block_erasers = {
12142 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000012143 .eraseblocks = { {256 * 1024, 64} },
12144 .block_erase = spi_block_erase_d8,
12145 }, {
12146 .eraseblocks = { { 16384 * 1024, 1} },
12147 .block_erase = spi_block_erase_60,
12148 }, {
12149 .eraseblocks = { { 16384 * 1024, 1} },
12150 .block_erase = spi_block_erase_c7,
12151 }
12152 },
12153 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
12154 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
12155 .write = spi_chip_write_256, /* Multi I/O supported */
12156 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12157 .voltage = {2700, 3600},
12158 },
12159
12160 {
Stefan Tauner88b19252014-08-06 14:36:27 +000012161 .vendor = "Spansion",
12162 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
12163 .bustype = BUS_SPI,
12164 .manufacture_id = SPANSION_ID,
12165 .model_id = SPANSION_S25FL128,
12166 .total_size = 16384,
12167 .page_size = 256,
12168 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12169 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12170 .tested = TEST_OK_PREW,
12171 .probe = probe_spi_rdid,
12172 .probe_timing = TIMING_ZERO,
12173 .block_erasers = {
12174 {
12175 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
12176 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
12177 * effect on the memory contents, but sets a flag in the SR.
12178 .eraseblocks = {
12179 {4 * 1024, 32},
12180 {64 * 1024, 254} // inaccessible
12181 },
12182 .block_erase = spi_block_erase_20,
12183 }, { */
12184 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
12185 .eraseblocks = {
12186 {8 * 1024, 16},
12187 {64 * 1024, 254} // inaccessible
12188 },
12189 .block_erase = spi_block_erase_40,
12190 }, { */
12191 .eraseblocks = { { 64 * 1024, 256} },
12192 .block_erase = spi_block_erase_d8,
12193 }, {
12194 .eraseblocks = { { 16384 * 1024, 1} },
12195 .block_erase = spi_block_erase_60,
12196 }, {
12197 .eraseblocks = { { 16384 * 1024, 1} },
12198 .block_erase = spi_block_erase_c7,
12199 }
12200 },
12201 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12202 .unlock = spi_disable_blockprotect_bp2_srwd,
12203 .write = spi_chip_write_256, /* Multi I/O supported */
12204 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12205 .voltage = {2700, 3600},
12206 },
12207
12208 {
12209 .vendor = "Spansion",
12210 .name = "S25FL129P......1", /* uniform 256 kB sectors */
12211 .bustype = BUS_SPI,
12212 .manufacture_id = SPANSION_ID,
12213 .model_id = SPANSION_S25FL128,
12214 .total_size = 16384,
Stefan Tauner23e10b82016-01-23 16:16:49 +000012215 .page_size = 256,
Stefan Tauner88b19252014-08-06 14:36:27 +000012216 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
12217 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12218 .tested = TEST_UNTESTED,
12219 .probe = probe_spi_rdid,
12220 .probe_timing = TIMING_ZERO,
12221 .block_erasers = {
12222 {
12223 .eraseblocks = { {256 * 1024, 64} },
12224 .block_erase = spi_block_erase_d8,
12225 }, {
12226 .eraseblocks = { { 16384 * 1024, 1} },
12227 .block_erase = spi_block_erase_60,
12228 }, {
12229 .eraseblocks = { { 16384 * 1024, 1} },
12230 .block_erase = spi_block_erase_c7,
12231 }
12232 },
12233 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
12234 .unlock = spi_disable_blockprotect_bp2_srwd,
12235 .write = spi_chip_write_256, /* Multi I/O supported */
12236 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12237 .voltage = {2700, 3600},
12238 },
12239
12240 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012241 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000012242 .name = "SST25LF020A",
12243 .bustype = BUS_SPI,
12244 .manufacture_id = SST_ID,
12245 .model_id = SST_SST25VF020_REMS,
12246 .total_size = 256,
12247 .page_size = 256,
12248 .feature_bits = FEATURE_WRSR_EWSR,
12249 .tested = TEST_OK_PREW,
12250 .probe = probe_spi_rems,
12251 .probe_timing = TIMING_ZERO,
12252 .block_erasers =
12253 {
12254 {
12255 .eraseblocks = { {4 * 1024, 64} },
12256 .block_erase = spi_block_erase_20,
12257 }, {
12258 .eraseblocks = { {32 * 1024, 8} },
12259 .block_erase = spi_block_erase_52,
12260 }, {
12261 .eraseblocks = { {256 * 1024, 1} },
12262 .block_erase = spi_block_erase_60,
12263 },
12264 },
12265 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12266 .unlock = spi_disable_blockprotect,
12267 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12268 .read = spi_chip_read, /* Fast read (0x0B) supported */
12269 .voltage = {2700, 3600},
12270 },
12271
12272 {
12273 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000012274 .name = "SST25LF040A",
12275 .bustype = BUS_SPI,
12276 .manufacture_id = SST_ID,
12277 .model_id = SST_SST25VF040_REMS,
12278 .total_size = 512,
12279 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012280 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000012281 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000012282 .probe = probe_spi_res2,
12283 .probe_timing = TIMING_ZERO,
12284 .block_erasers =
12285 {
12286 {
12287 .eraseblocks = { {4 * 1024, 128} },
12288 .block_erase = spi_block_erase_20,
12289 }, {
12290 .eraseblocks = { {32 * 1024, 16} },
12291 .block_erase = spi_block_erase_52,
12292 }, {
12293 .eraseblocks = { {512 * 1024, 1} },
12294 .block_erase = spi_block_erase_60,
12295 },
12296 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012297 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000012298 .unlock = spi_disable_blockprotect,
12299 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12300 .read = spi_chip_read,
12301 .voltage = {3000, 3600},
12302 },
12303
12304 {
12305 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000012306 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000012307 .bustype = BUS_SPI,
12308 .manufacture_id = SST_ID,
12309 .model_id = SST_SST25VF080_REMS,
12310 .total_size = 1024,
12311 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012312 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000012313 .tested = TEST_UNTESTED,
12314 .probe = probe_spi_res2,
12315 .probe_timing = TIMING_ZERO,
12316 .block_erasers =
12317 {
12318 {
12319 .eraseblocks = { {4 * 1024, 256} },
12320 .block_erase = spi_block_erase_20,
12321 }, {
12322 .eraseblocks = { {32 * 1024, 32} },
12323 .block_erase = spi_block_erase_52,
12324 }, {
12325 .eraseblocks = { {1024 * 1024, 1} },
12326 .block_erase = spi_block_erase_60,
12327 },
12328 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012329 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000012330 .unlock = spi_disable_blockprotect,
12331 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12332 .read = spi_chip_read,
12333 .voltage = {3000, 3600},
12334 },
12335
12336 {
12337 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000012338 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000012339 .bustype = BUS_SPI,
12340 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000012341 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000012342 .total_size = 64,
12343 .page_size = 256,
12344 .feature_bits = FEATURE_WRSR_EWSR,
12345 .tested = TEST_OK_PREW,
12346 .probe = probe_spi_rems,
12347 .probe_timing = TIMING_ZERO,
12348 .block_erasers =
12349 {
12350 {
12351 .eraseblocks = { {4 * 1024, 16} },
12352 .block_erase = spi_block_erase_20,
12353 }, {
12354 .eraseblocks = { {32 * 1024, 2} },
12355 .block_erase = spi_block_erase_52,
12356 }, {
12357 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012358 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012359 }, {
12360 .eraseblocks = { {64 * 1024, 1} },
12361 .block_erase = spi_block_erase_60,
12362 }, {
12363 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012364 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012365 },
12366 },
12367 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12368 .unlock = spi_disable_blockprotect,
12369 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000012370 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012371 .voltage = {2700, 3600},
12372 },
12373
12374 {
12375 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000012376 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012377 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000012378 .manufacture_id = SST_ID,
12379 .model_id = SST_SST25VF010_REMS,
12380 .total_size = 128,
12381 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012382 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000012383 .tested = TEST_OK_PREW,
12384 .probe = probe_spi_rems,
12385 .probe_timing = TIMING_ZERO,
12386 .block_erasers =
12387 {
12388 {
12389 .eraseblocks = { {4 * 1024, 32} },
12390 .block_erase = spi_block_erase_20,
12391 }, {
12392 .eraseblocks = { {32 * 1024, 4} },
12393 .block_erase = spi_block_erase_52,
12394 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000012395 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012396 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012397 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000012398 .eraseblocks = { {128 * 1024, 1} },
12399 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000012400 }, {
12401 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000012402 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A 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 SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000012409 .voltage = {2700, 3600},
12410 },
12411
12412 {
12413 .vendor = "SST",
12414 .name = "SST25VF020",
12415 .bustype = BUS_SPI,
12416 .manufacture_id = SST_ID,
12417 .model_id = SST_SST25VF020_REMS,
12418 .total_size = 256,
12419 .page_size = 256,
12420 .feature_bits = FEATURE_WRSR_EWSR,
12421 .tested = TEST_UNTESTED,
12422 .probe = probe_spi_rems,
12423 .probe_timing = TIMING_ZERO,
12424 .block_erasers =
12425 {
12426 {
12427 .eraseblocks = { {4 * 1024, 64} },
12428 .block_erase = spi_block_erase_20,
12429 }, {
12430 .eraseblocks = { {32 * 1024, 8} },
12431 .block_erase = spi_block_erase_52,
12432 }, {
12433 .eraseblocks = { {256 * 1024, 1} },
12434 .block_erase = spi_block_erase_60,
12435 },
12436 },
12437 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12438 .unlock = spi_disable_blockprotect,
12439 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12440 .read = spi_chip_read, /* only */
12441 .voltage = {2700, 3600},
12442 },
12443
12444 {
12445 .vendor = "SST",
12446 .name = "SST25VF020B",
12447 .bustype = BUS_SPI,
12448 .manufacture_id = SST_ID,
12449 .model_id = SST_SST25VF020B,
12450 .total_size = 256,
12451 .page_size = 256,
12452 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012453 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000012454 .probe = probe_spi_rdid,
12455 .probe_timing = TIMING_ZERO,
12456 .block_erasers =
12457 {
12458 {
12459 .eraseblocks = { {4 * 1024, 64} },
12460 .block_erase = spi_block_erase_20,
12461 }, {
12462 .eraseblocks = { {32 * 1024, 8} },
12463 .block_erase = spi_block_erase_52,
12464 }, {
12465 .eraseblocks = { {64 * 1024, 4} },
12466 .block_erase = spi_block_erase_d8,
12467 }, {
12468 .eraseblocks = { {256 * 1024, 1} },
12469 .block_erase = spi_block_erase_60,
12470 }, {
12471 .eraseblocks = { {256 * 1024, 1} },
12472 .block_erase = spi_block_erase_c7,
12473 },
12474 },
12475 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
12476 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
12477 .write = spi_aai_write, /* AAI supported (0xAD) */
12478 .read = spi_chip_read, /* Fast read (0x0B) supported */
12479 .voltage = {2700, 3600},
12480 },
12481
12482 {
12483 .vendor = "SST",
12484 .name = "SST25VF040",
12485 .bustype = BUS_SPI,
12486 .manufacture_id = SST_ID,
12487 .model_id = SST_SST25VF040_REMS,
12488 .total_size = 512,
12489 .page_size = 256,
12490 .feature_bits = FEATURE_WRSR_EWSR,
12491 .tested = TEST_OK_PR,
12492 .probe = probe_spi_rems,
12493 .probe_timing = TIMING_ZERO,
12494 .block_erasers =
12495 {
12496 {
12497 .eraseblocks = { {4 * 1024, 128} },
12498 .block_erase = spi_block_erase_20,
12499 }, {
12500 .eraseblocks = { {32 * 1024, 16} },
12501 .block_erase = spi_block_erase_52,
12502 }, {
12503 .eraseblocks = { {512 * 1024, 1} },
12504 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000012505 },
12506 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012507 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000012508 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000012509 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12510 .read = spi_chip_read,
12511 .voltage = {2700, 3600},
12512 },
12513
12514 {
12515 .vendor = "SST",
12516 .name = "SST25VF040B",
12517 .bustype = BUS_SPI,
12518 .manufacture_id = SST_ID,
12519 .model_id = SST_SST25VF040B,
12520 .total_size = 512,
12521 .page_size = 256,
12522 .feature_bits = FEATURE_WRSR_EWSR,
12523 .tested = TEST_OK_PREW,
12524 .probe = probe_spi_rdid,
12525 .probe_timing = TIMING_ZERO,
12526 .block_erasers =
12527 {
12528 {
12529 .eraseblocks = { {4 * 1024, 128} },
12530 .block_erase = spi_block_erase_20,
12531 }, {
12532 .eraseblocks = { {32 * 1024, 16} },
12533 .block_erase = spi_block_erase_52,
12534 }, {
12535 .eraseblocks = { {64 * 1024, 8} },
12536 .block_erase = spi_block_erase_d8,
12537 }, {
12538 .eraseblocks = { {512 * 1024, 1} },
12539 .block_erase = spi_block_erase_60,
12540 }, {
12541 .eraseblocks = { {512 * 1024, 1} },
12542 .block_erase = spi_block_erase_c7,
12543 },
12544 },
12545 .printlock = spi_prettyprint_status_register_sst25vf040b,
12546 .unlock = spi_disable_blockprotect,
12547 .write = spi_aai_write, /* AAI supported (0xAD) */
12548 .read = spi_chip_read, /* Fast read (0x0B) supported */
12549 .voltage = {2700, 3600},
12550 },
12551
12552 {
12553 .vendor = "SST",
12554 .name = "SST25VF040B.REMS",
12555 .bustype = BUS_SPI,
12556 .manufacture_id = SST_ID,
12557 .model_id = SST_SST25VF040B_REMS,
12558 .total_size = 512,
12559 .page_size = 256,
12560 .feature_bits = FEATURE_WRSR_EWSR,
12561 .tested = TEST_OK_PREW,
12562 .probe = probe_spi_rems,
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,
12586 .read = spi_chip_read,
12587 .voltage = {2700, 3600},
12588 },
12589
12590 {
12591 .vendor = "SST",
Ben Gardnerbcf61092015-11-22 02:23:31 +000012592 .name = "SST25WF020A",
12593 .bustype = BUS_SPI,
12594 .manufacture_id = SANYO_ID, /* See flashchips.h */
12595 .model_id = SST_SST25WF020A,
12596 .total_size = 256,
12597 .page_size = 256,
12598 .feature_bits = FEATURE_WRSR_WREN,
12599 .tested = TEST_UNTESTED,
12600 .probe = probe_spi_rdid,
12601 .probe_timing = TIMING_ZERO,
12602 .block_erasers =
12603 {
12604 {
12605 .eraseblocks = { {4 * 1024, 64} },
12606 .block_erase = spi_block_erase_20,
12607 }, {
12608 .eraseblocks = { {64 * 1024, 4} },
12609 .block_erase = spi_block_erase_d8,
12610 }, {
12611 .eraseblocks = { {256 * 1024, 1} },
12612 .block_erase = spi_block_erase_60,
12613 }, {
12614 .eraseblocks = { {256 * 1024, 1} },
12615 .block_erase = spi_block_erase_c7,
12616 },
12617 },
12618 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12619 .unlock = spi_disable_blockprotect_bp2_srwd,
12620 .write = spi_chip_write_256,
12621 .read = spi_chip_read, /* Fast read (0x0B) supported */
12622 .voltage = {1650, 1950},
12623 },
12624
12625 {
12626 .vendor = "SST",
12627 .name = "SST25WF040B",
12628 .bustype = BUS_SPI,
12629 .manufacture_id = SANYO_ID, /* See flashchips.h */
12630 .model_id = SST_SST25WF040B,
12631 .total_size = 512,
12632 .page_size = 256,
12633 .feature_bits = FEATURE_WRSR_WREN,
12634 .tested = TEST_UNTESTED,
12635 .probe = probe_spi_rdid,
12636 .probe_timing = TIMING_ZERO,
12637 .block_erasers =
12638 {
12639 {
12640 .eraseblocks = { {4 * 1024, 128} },
12641 .block_erase = spi_block_erase_20,
12642 }, {
12643 .eraseblocks = { {64 * 1024, 8} },
12644 .block_erase = spi_block_erase_d8,
12645 }, {
12646 .eraseblocks = { {512 * 1024, 1} },
12647 .block_erase = spi_block_erase_60,
12648 }, {
12649 .eraseblocks = { {512 * 1024, 1} },
12650 .block_erase = spi_block_erase_c7,
12651 },
12652 },
12653 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12654 .unlock = spi_disable_blockprotect_bp2_srwd,
12655 .write = spi_chip_write_256,
12656 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
12657 .voltage = {1650, 1950},
12658 },
12659
12660 {
12661 .vendor = "SST",
12662 .name = "SST25WF080B",
12663 .bustype = BUS_SPI,
12664 .manufacture_id = SANYO_ID, /* See flashchips.h */
12665 .model_id = SST_SST25WF080B,
12666 .total_size = 1024,
12667 .page_size = 256,
12668 .feature_bits = FEATURE_WRSR_WREN,
12669 .tested = TEST_OK_PREW,
12670 .probe = probe_spi_rdid,
12671 .probe_timing = TIMING_ZERO,
12672 .block_erasers =
12673 {
12674 {
12675 .eraseblocks = { {4 * 1024, 256} },
12676 .block_erase = spi_block_erase_20,
12677 }, {
12678 .eraseblocks = { {64 * 1024, 16} },
12679 .block_erase = spi_block_erase_d8,
12680 }, {
12681 .eraseblocks = { {1024 * 1024, 1} },
12682 .block_erase = spi_block_erase_60,
12683 }, {
12684 .eraseblocks = { {1024 * 1024, 1} },
12685 .block_erase = spi_block_erase_c7,
12686 },
12687 },
12688 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
12689 .unlock = spi_disable_blockprotect_bp2_srwd,
12690 .write = spi_chip_write_256,
12691 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
12692 .voltage = {1650, 1950},
12693 },
12694
12695 {
12696 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000012697 .name = "SST25VF080B",
12698 .bustype = BUS_SPI,
12699 .manufacture_id = SST_ID,
12700 .model_id = SST_SST25VF080B,
12701 .total_size = 1024,
12702 .page_size = 256,
12703 .feature_bits = FEATURE_WRSR_EWSR,
12704 .tested = TEST_OK_PREW,
12705 .probe = probe_spi_rdid,
12706 .probe_timing = TIMING_ZERO,
12707 .block_erasers =
12708 {
12709 {
12710 .eraseblocks = { {4 * 1024, 256} },
12711 .block_erase = spi_block_erase_20,
12712 }, {
12713 .eraseblocks = { {32 * 1024, 32} },
12714 .block_erase = spi_block_erase_52,
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_sst25, /* TODO: check */
12727 .unlock = spi_disable_blockprotect,
12728 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000012729 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012730 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000012731 },
12732
12733 {
12734 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012735 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012736 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012737 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012738 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012739 .total_size = 2048,
12740 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012741 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000012742 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012743 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012744 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012745 .block_erasers =
12746 {
12747 {
12748 .eraseblocks = { {4 * 1024, 512} },
12749 .block_erase = spi_block_erase_20,
12750 }, {
12751 .eraseblocks = { {32 * 1024, 64} },
12752 .block_erase = spi_block_erase_52,
12753 }, {
12754 .eraseblocks = { {64 * 1024, 32} },
12755 .block_erase = spi_block_erase_d8,
12756 }, {
12757 .eraseblocks = { {2 * 1024 * 1024, 1} },
12758 .block_erase = spi_block_erase_60,
12759 }, {
12760 .eraseblocks = { {2 * 1024 * 1024, 1} },
12761 .block_erase = spi_block_erase_c7,
12762 },
12763 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012764 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012765 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000012766 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012767 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012768 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012769 },
12770
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012771 {
12772 .vendor = "SST",
12773 .name = "SST25VF032B",
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_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012777 .total_size = 4096,
12778 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012779 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +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, 1024} },
12787 .block_erase = spi_block_erase_20,
12788 }, {
12789 .eraseblocks = { {32 * 1024, 128} },
12790 .block_erase = spi_block_erase_52,
12791 }, {
12792 .eraseblocks = { {64 * 1024, 64} },
12793 .block_erase = spi_block_erase_d8,
12794 }, {
12795 .eraseblocks = { {4 * 1024 * 1024, 1} },
12796 .block_erase = spi_block_erase_60,
12797 }, {
12798 .eraseblocks = { {4 * 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_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012803 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000012804 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012805 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012806 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000012807 },
12808
12809 {
12810 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012811 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012812 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012813 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012814 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012815 .total_size = 8192,
12816 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012817 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000012818 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012819 .probe = probe_spi_rdid,
12820 .probe_timing = TIMING_ZERO,
12821 .block_erasers =
12822 {
12823 {
12824 .eraseblocks = { {4 * 1024, 2048} },
12825 .block_erase = spi_block_erase_20,
12826 }, {
12827 .eraseblocks = { {32 * 1024, 256} },
12828 .block_erase = spi_block_erase_52,
12829 }, {
12830 .eraseblocks = { {64 * 1024, 128} },
12831 .block_erase = spi_block_erase_d8,
12832 }, {
12833 .eraseblocks = { {8 * 1024 * 1024, 1} },
12834 .block_erase = spi_block_erase_60,
12835 }, {
12836 .eraseblocks = { {8 * 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 */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012841 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000012842 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012843 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012844 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000012845 },
12846
12847 {
12848 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000012849 .name = "SST25WF512",
12850 .bustype = BUS_SPI,
12851 .manufacture_id = SST_ID,
12852 .model_id = SST_SST25WF512,
12853 .total_size = 64,
12854 .page_size = 256,
12855 .feature_bits = FEATURE_WRSR_EITHER,
12856 .tested = TEST_UNTESTED,
12857 .probe = probe_spi_rdid,
12858 .probe_timing = TIMING_ZERO,
12859 .block_erasers =
12860 {
12861 {
12862 .eraseblocks = { {4 * 1024, 16} },
12863 .block_erase = spi_block_erase_20,
12864 }, {
12865 .eraseblocks = { {32 * 1024, 2} },
12866 .block_erase = spi_block_erase_52,
12867 }, {
12868 .eraseblocks = { {1024 * 64, 1} },
12869 .block_erase = spi_block_erase_60,
12870 }, {
12871 .eraseblocks = { {1024 * 64, 1} },
12872 .block_erase = spi_block_erase_c7,
12873 },
12874 },
Jason Harper43ddef02014-05-04 00:55:24 +000012875 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
12876 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000012877 .write = spi_aai_write,
12878 .read = spi_chip_read, /* Fast read (0x0B) supported */
12879 .voltage = {1650, 1950},
12880 },
12881
12882 {
12883 .vendor = "SST",
12884 .name = "SST25WF010",
12885 .bustype = BUS_SPI,
12886 .manufacture_id = SST_ID,
12887 .model_id = SST_SST25WF010,
12888 .total_size = 128,
12889 .page_size = 256,
12890 .feature_bits = FEATURE_WRSR_EITHER,
12891 .tested = TEST_UNTESTED,
12892 .probe = probe_spi_rdid,
12893 .probe_timing = TIMING_ZERO,
12894 .block_erasers =
12895 {
12896 {
12897 .eraseblocks = { {4 * 1024, 32} },
12898 .block_erase = spi_block_erase_20,
12899 }, {
12900 .eraseblocks = { {32 * 1024, 4} },
12901 .block_erase = spi_block_erase_52,
12902 }, {
12903 .eraseblocks = { {1024 * 128, 1} },
12904 .block_erase = spi_block_erase_60,
12905 }, {
12906 .eraseblocks = { {1024 * 128, 1} },
12907 .block_erase = spi_block_erase_c7,
12908 },
12909 },
Jason Harper43ddef02014-05-04 00:55:24 +000012910 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
12911 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000012912 .write = spi_aai_write,
12913 .read = spi_chip_read, /* Fast read (0x0B) supported */
12914 .voltage = {1650, 1950},
12915 },
12916
12917 {
12918 .vendor = "SST",
12919 .name = "SST25WF020",
12920 .bustype = BUS_SPI,
12921 .manufacture_id = SST_ID,
12922 .model_id = SST_SST25WF020,
12923 .total_size = 256,
12924 .page_size = 256,
12925 .feature_bits = FEATURE_WRSR_EITHER,
12926 .tested = TEST_UNTESTED,
12927 .probe = probe_spi_rdid,
12928 .probe_timing = TIMING_ZERO,
12929 .block_erasers =
12930 {
12931 {
12932 .eraseblocks = { {4 * 1024, 64} },
12933 .block_erase = spi_block_erase_20,
12934 }, {
12935 .eraseblocks = { {32 * 1024, 8} },
12936 .block_erase = spi_block_erase_52,
12937 }, {
12938 .eraseblocks = { {64 * 1024, 4} },
12939 .block_erase = spi_block_erase_d8,
12940 }, {
12941 .eraseblocks = { {1024 * 256, 1} },
12942 .block_erase = spi_block_erase_60,
12943 }, {
12944 .eraseblocks = { {1024 * 256, 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 = "SST25WF040",
12958 .bustype = BUS_SPI,
12959 .manufacture_id = SST_ID,
12960 .model_id = SST_SST25WF040,
12961 .total_size = 512,
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, 128} },
12971 .block_erase = spi_block_erase_20,
12972 }, {
12973 .eraseblocks = { {32 * 1024, 16} },
12974 .block_erase = spi_block_erase_52,
12975 }, {
12976 .eraseblocks = { {64 * 1024, 8} },
12977 .block_erase = spi_block_erase_d8,
12978 }, {
12979 .eraseblocks = { {1024 * 512, 1} },
12980 .block_erase = spi_block_erase_60,
12981 }, {
12982 .eraseblocks = { {1024 * 512, 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,
12988 .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 = "SST25WF080",
12996 .bustype = BUS_SPI,
12997 .manufacture_id = SST_ID,
12998 .model_id = SST_SST25WF080,
12999 .total_size = 1024,
13000 .page_size = 256,
13001 .feature_bits = FEATURE_WRSR_EITHER,
13002 .tested = TEST_OK_PREW,
13003 .probe = probe_spi_rdid,
13004 .probe_timing = TIMING_ZERO,
13005 .block_erasers =
13006 {
13007 {
13008 .eraseblocks = { {4 * 1024, 256} },
13009 .block_erase = spi_block_erase_20,
13010 }, {
13011 .eraseblocks = { {32 * 1024, 32} },
13012 .block_erase = spi_block_erase_52,
13013 }, {
13014 .eraseblocks = { {64 * 1024, 16} },
13015 .block_erase = spi_block_erase_d8,
13016 }, {
13017 .eraseblocks = { {1024 * 1024, 1} },
13018 .block_erase = spi_block_erase_60,
13019 }, {
13020 .eraseblocks = { {1024 * 1024, 1} },
13021 .block_erase = spi_block_erase_c7,
13022 },
13023 },
13024 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13025 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000013026 .write = spi_aai_write,
13027 .read = spi_chip_read, /* Fast read (0x0B) supported */
13028 .voltage = {1650, 1950},
13029 },
13030
13031 {
13032 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013033 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013034 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013035 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013036 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013037 .total_size = 512,
13038 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013039 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013040 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013041 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013042 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013043 .block_erasers =
13044 {
13045 {
13046 .eraseblocks = { {128, 4096} },
13047 .block_erase = erase_sector_28sf040,
13048 }, {
13049 .eraseblocks = { {512 * 1024, 1} },
13050 .block_erase = erase_chip_28sf040,
13051 }
13052 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013053 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013054 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013055 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013056 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013057 },
13058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013059 {
13060 .vendor = "SST",
13061 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013062 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013063 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013064 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013065 .total_size = 128,
13066 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013067 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013068 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013069 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013070 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013071 .block_erasers =
13072 {
13073 {
13074 .eraseblocks = { {128 * 1024, 1} },
13075 .block_erase = erase_chip_block_jedec,
13076 }
13077 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013078 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013079 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013080 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013081 },
13082
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013083 {
13084 .vendor = "SST",
13085 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013086 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013087 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013088 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013089 .total_size = 128,
13090 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013091 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013092 .tested = TEST_UNTESTED,
13093 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013094 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013095 .block_erasers =
13096 {
13097 {
13098 .eraseblocks = { {128 * 1024, 1} },
13099 .block_erase = erase_chip_block_jedec,
13100 }
13101 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013102 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013103 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013104 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013105 },
13106
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013107 {
13108 .vendor = "SST",
13109 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013110 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013111 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013112 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013113 .total_size = 256,
13114 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013115 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013116 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013117 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013118 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013119 .block_erasers =
13120 {
13121 {
13122 .eraseblocks = { {256 * 1024, 1} },
13123 .block_erase = erase_chip_block_jedec,
13124 }
13125 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013126 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013127 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013128 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013129 },
13130
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013131 {
13132 .vendor = "SST",
13133 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013134 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013135 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013136 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013137 .total_size = 256,
13138 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013139 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013140 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013141 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013142 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013143 .block_erasers =
13144 {
13145 {
13146 .eraseblocks = { {256 * 1024, 1} },
13147 .block_erase = erase_chip_block_jedec,
13148 }
13149 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013150 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013151 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013152 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013153 },
13154
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013155 {
13156 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000013157 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013158 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013159 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013160 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013161 .total_size = 64,
13162 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013163 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000013164 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013165 .probe = probe_jedec,
13166 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000013167 .block_erasers =
13168 {
13169 {
13170 .eraseblocks = { {4 * 1024, 16} },
13171 .block_erase = erase_sector_jedec,
13172 }, {
13173 .eraseblocks = { {64 * 1024, 1} },
13174 .block_erase = erase_chip_block_jedec,
13175 }
13176 },
Sean Nelson35727f72010-01-28 23:55:12 +000013177 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000013178 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013179 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000013180 },
13181
13182 {
13183 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013184 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013185 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013186 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013187 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013188 .total_size = 128,
13189 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013190 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013191 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013192 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000013193 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013194 .block_erasers =
13195 {
13196 {
13197 .eraseblocks = { {4 * 1024, 32} },
13198 .block_erase = erase_sector_jedec,
13199 }, {
13200 .eraseblocks = { {128 * 1024, 1} },
13201 .block_erase = erase_chip_block_jedec,
13202 }
13203 },
Sean Nelson35727f72010-01-28 23:55:12 +000013204 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013205 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013206 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013207 },
13208
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013209 {
13210 .vendor = "SST",
13211 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013212 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013213 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013214 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013215 .total_size = 256,
13216 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013217 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000013218 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013219 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013220 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013221 .block_erasers =
13222 {
13223 {
13224 .eraseblocks = { {4 * 1024, 64} },
13225 .block_erase = erase_sector_jedec,
13226 }, {
13227 .eraseblocks = { {256 * 1024, 1} },
13228 .block_erase = erase_chip_block_jedec,
13229 }
13230 },
Sean Nelson35727f72010-01-28 23:55:12 +000013231 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013232 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013233 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013234 },
13235
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013236 {
13237 .vendor = "SST",
13238 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013239 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013240 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013241 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013242 .total_size = 512,
13243 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013244 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000013245 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013246 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013247 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013248 .block_erasers =
13249 {
13250 {
13251 .eraseblocks = { {4 * 1024, 128} },
13252 .block_erase = erase_sector_jedec,
13253 }, {
13254 .eraseblocks = { {512 * 1024, 1} },
13255 .block_erase = erase_chip_block_jedec,
13256 }
13257 },
Sean Nelson35727f72010-01-28 23:55:12 +000013258 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013259 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013260 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013261 },
13262
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013263 {
13264 .vendor = "SST",
13265 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013266 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013267 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013268 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013269 .total_size = 64,
13270 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013271 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000013272 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013273 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013274 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013275 .block_erasers =
13276 {
13277 {
13278 .eraseblocks = { {4 * 1024, 16} },
13279 .block_erase = erase_sector_jedec,
13280 }, {
13281 .eraseblocks = { {64 * 1024, 1} },
13282 .block_erase = erase_chip_block_jedec,
13283 }
13284 },
Sean Nelson35727f72010-01-28 23:55:12 +000013285 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013286 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013287 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013288 },
13289
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013290 {
13291 .vendor = "SST",
13292 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013293 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013294 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013295 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013296 .total_size = 128,
13297 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013298 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000013299 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013300 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013301 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013302 .block_erasers =
13303 {
13304 {
13305 .eraseblocks = { {4 * 1024, 32} },
13306 .block_erase = erase_sector_jedec,
13307 }, {
13308 .eraseblocks = { {128 * 1024, 1} },
13309 .block_erase = erase_chip_block_jedec,
13310 }
13311 },
Sean Nelson35727f72010-01-28 23:55:12 +000013312 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013314 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013315 },
13316
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013317 {
13318 .vendor = "SST",
13319 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013320 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013321 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013322 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013323 .total_size = 256,
13324 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013325 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000013326 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013327 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013328 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013329 .block_erasers =
13330 {
13331 {
13332 .eraseblocks = { {4 * 1024, 64} },
13333 .block_erase = erase_sector_jedec,
13334 }, {
13335 .eraseblocks = { {256 * 1024, 1} },
13336 .block_erase = erase_chip_block_jedec,
13337 }
13338 },
Sean Nelson35727f72010-01-28 23:55:12 +000013339 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013340 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013341 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013342 },
13343
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013344 {
13345 .vendor = "SST",
13346 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013347 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013348 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013349 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013350 .total_size = 512,
13351 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013352 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013353 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013354 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013355 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013356 .block_erasers =
13357 {
13358 {
13359 .eraseblocks = { {4 * 1024, 128} },
13360 .block_erase = erase_sector_jedec,
13361 }, {
13362 .eraseblocks = { {512 * 1024, 1} },
13363 .block_erase = erase_chip_block_jedec,
13364 }
13365 },
Sean Nelson35727f72010-01-28 23:55:12 +000013366 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013367 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013368 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000013369 },
FENG yu ningff692fb2008-12-08 18:15:10 +000013370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013371 {
13372 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000013373 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013374 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000013375 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013376 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000013377 .total_size = 1024,
13378 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013379 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000013380 .tested = TEST_UNTESTED,
13381 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013382 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013383 .block_erasers =
13384 {
13385 {
13386 .eraseblocks = { {4 * 1024, 256} },
13387 .block_erase = erase_sector_jedec,
13388 }, {
13389 .eraseblocks = { {64 * 1024, 16} },
13390 .block_erase = erase_block_jedec,
13391 }, {
13392 .eraseblocks = { {1024 * 1024, 1} },
13393 .block_erase = erase_chip_block_jedec,
13394 }
13395 },
Sean Nelson35727f72010-01-28 23:55:12 +000013396 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013397 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013398 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000013399 },
13400
13401 {
13402 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013403 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013404 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013405 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013406 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013407 .total_size = 256,
13408 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013409 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000013410 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013411 .probe = probe_jedec,
13412 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013413 .block_erasers =
13414 {
13415 {
13416 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013417 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013418 }, {
13419 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013420 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013421 }, {
13422 .eraseblocks = { {256 * 1024, 1} },
13423 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13424 }
13425 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013426 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013427 .unlock = unlock_sst_fwhub,
13428 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013429 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013430 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013431 },
13432
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013433 {
13434 .vendor = "SST",
13435 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013436 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013437 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013438 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013439 .total_size = 384,
13440 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013441 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000013442 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013443 .probe = probe_jedec,
13444 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013445 .block_erasers =
13446 {
13447 {
13448 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013449 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013450 }, {
13451 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013452 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013453 }, {
13454 .eraseblocks = { {384 * 1024, 1} },
13455 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13456 }
13457 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013458 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013459 .unlock = unlock_sst_fwhub,
13460 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013461 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013462 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013463 },
13464
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013465 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013466 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
13467 * and is only honored for 64k block erase, but not 4k sector erase.
13468 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013469 .vendor = "SST",
13470 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013471 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013472 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013473 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013474 .total_size = 512,
13475 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013476 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000013477 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013478 .probe = probe_jedec,
13479 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013480 .block_erasers =
13481 {
13482 {
13483 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013484 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013485 }, {
13486 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013487 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013488 }, {
13489 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000013490 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000013491 },
13492 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013493 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013494 .unlock = unlock_sst_fwhub,
13495 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013496 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013497 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013498 },
13499
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013500 {
13501 .vendor = "SST",
13502 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013503 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013504 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013505 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013506 .total_size = 512,
13507 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013508 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013509 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013510 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013511 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013512 .block_erasers =
13513 {
13514 {
13515 .eraseblocks = { {4 * 1024, 128} },
13516 .block_erase = erase_sector_49lfxxxc,
13517 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013518 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013519 {64 * 1024, 7},
13520 {32 * 1024, 1},
13521 {8 * 1024, 2},
13522 {16 * 1024, 1},
13523 },
Sean Nelson69e58112010-03-23 17:10:28 +000013524 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013525 }
13526 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013527 .printlock = printlock_regspace2_block_eraser_1,
13528 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013529 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013530 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013531 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013532 },
13533
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013534 {
13535 .vendor = "SST",
13536 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013537 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013538 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013539 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013540 .total_size = 1024,
13541 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013542 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013543 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013544 .probe = probe_jedec,
13545 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013546 .block_erasers =
13547 {
13548 {
13549 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013550 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013551 }, {
13552 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013553 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013554 }, {
13555 .eraseblocks = { {1024 * 1024, 1} },
13556 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13557 }
13558 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013559 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000013560 .unlock = unlock_sst_fwhub,
13561 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013562 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013563 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013564 },
13565
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013566 {
13567 .vendor = "SST",
13568 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013569 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013570 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013571 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013572 .total_size = 1024,
13573 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013574 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013575 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013576 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013577 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013578 .block_erasers =
13579 {
13580 {
13581 .eraseblocks = { {4 * 1024, 256} },
13582 .block_erase = erase_sector_49lfxxxc,
13583 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013584 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013585 {64 * 1024, 15},
13586 {32 * 1024, 1},
13587 {8 * 1024, 2},
13588 {16 * 1024, 1},
13589 },
Sean Nelson69e58112010-03-23 17:10:28 +000013590 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013591 }
13592 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013593 .printlock = printlock_regspace2_block_eraser_1,
13594 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013595 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013596 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013597 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013598 },
13599
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013600 {
13601 .vendor = "SST",
13602 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013603 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013604 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013605 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013606 .total_size = 2048,
13607 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013608 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013609 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013610 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013611 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013612 .block_erasers =
13613 {
13614 {
13615 .eraseblocks = { {4 * 1024, 512} },
13616 .block_erase = erase_sector_49lfxxxc,
13617 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013618 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013619 {64 * 1024, 31},
13620 {32 * 1024, 1},
13621 {8 * 1024, 2},
13622 {16 * 1024, 1},
13623 },
Sean Nelson69e58112010-03-23 17:10:28 +000013624 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013625 }
13626 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013627 .printlock = printlock_regspace2_block_eraser_1,
13628 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013629 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013630 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013631 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013632 },
13633
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013634 {
13635 .vendor = "SST",
13636 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013637 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013638 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013639 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013640 .total_size = 256,
13641 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013642 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000013643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013644 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013645 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013646 .block_erasers =
13647 {
13648 {
13649 .eraseblocks = { {4 * 1024, 64} },
13650 .block_erase = erase_sector_jedec,
13651 }, {
13652 .eraseblocks = { {16 * 1024, 16} },
13653 .block_erase = erase_block_jedec,
13654 }, {
13655 .eraseblocks = { {256 * 1024, 1} },
13656 .block_erase = NULL,
13657 }
13658 },
Sean Nelson35727f72010-01-28 23:55:12 +000013659 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013660 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013661 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000013662 },
13663
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013664 {
13665 .vendor = "SST",
13666 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013667 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013668 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013669 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013670 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000013671 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013672 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000013673 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013674 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013675 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013676 .block_erasers =
13677 {
13678 {
13679 .eraseblocks = { {4 * 1024, 64} },
13680 .block_erase = erase_sector_jedec,
13681 }, {
13682 .eraseblocks = { {16 * 1024, 16} },
13683 .block_erase = erase_block_jedec,
13684 }, {
13685 .eraseblocks = { {256 * 1024, 1} },
13686 .block_erase = NULL,
13687 }
13688 },
Sean Nelson35727f72010-01-28 23:55:12 +000013689 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013690 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013691 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013692 },
13693
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013694 {
13695 .vendor = "SST",
13696 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013697 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013698 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013699 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013700 .total_size = 512,
13701 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013702 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013703 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013704 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000013705 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013706 .block_erasers =
13707 {
13708 {
13709 .eraseblocks = { {4 * 1024, 128} },
13710 .block_erase = erase_sector_jedec,
13711 }, {
13712 .eraseblocks = { {64 * 1024, 8} },
13713 .block_erase = erase_block_jedec,
13714 }, {
13715 .eraseblocks = { {512 * 1024, 1} },
13716 .block_erase = NULL,
13717 }
13718 },
Sean Nelson35727f72010-01-28 23:55:12 +000013719 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013720 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013721 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013722 },
13723
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013724 {
13725 .vendor = "SST",
13726 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013727 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013728 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013729 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013730 .total_size = 512,
13731 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000013732 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000013733 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013734 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013735 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013736 .block_erasers =
13737 {
13738 {
13739 .eraseblocks = { {4 * 1024, 128} },
13740 .block_erase = erase_sector_jedec,
13741 }, {
13742 .eraseblocks = { {64 * 1024, 8} },
13743 .block_erase = erase_block_jedec,
13744 }, {
13745 .eraseblocks = { {512 * 1024, 1} },
13746 .block_erase = NULL,
13747 }
13748 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013749 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000013750 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013751 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013752 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013753 },
13754
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013755 {
13756 .vendor = "SST",
13757 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013758 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013759 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013760 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013761 .total_size = 1024,
13762 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013763 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000013764 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013765 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013766 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013767 .block_erasers =
13768 {
13769 {
13770 .eraseblocks = { {4 * 1024, 256} },
13771 .block_erase = erase_sector_jedec,
13772 }, {
13773 .eraseblocks = { {64 * 1024, 16} },
13774 .block_erase = erase_block_jedec,
13775 }, {
13776 .eraseblocks = { {1024 * 1024, 1} },
13777 .block_erase = NULL,
13778 }
13779 },
Sean Nelson35727f72010-01-28 23:55:12 +000013780 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013781 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013782 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013783 },
13784
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013785 {
13786 .vendor = "SST",
13787 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013788 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013789 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013790 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013791 .total_size = 2048,
13792 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013793 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013794 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013795 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013796 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000013797 .block_erasers =
13798 {
13799 {
13800 .eraseblocks = { {4 * 1024, 512} },
13801 .block_erase = erase_sector_49lfxxxc,
13802 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000013803 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000013804 {64 * 1024, 31},
13805 {32 * 1024, 1},
13806 {8 * 1024, 2},
13807 {16 * 1024, 1},
13808 },
Sean Nelson69e58112010-03-23 17:10:28 +000013809 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000013810 }
13811 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013812 .printlock = printlock_regspace2_block_eraser_1,
13813 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013814 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013815 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013816 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013817 },
13818
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013819 {
13820 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013821 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013822 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013823 .manufacture_id = ST_ID,
13824 .model_id = ST_M29F002B,
13825 .total_size = 256,
13826 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013827 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013828 .tested = TEST_UNTESTED,
13829 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013830 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013831 .block_erasers =
13832 {
13833 {
13834 .eraseblocks = {
13835 {16 * 1024, 1},
13836 {8 * 1024, 2},
13837 {32 * 1024, 1},
13838 {64 * 1024, 3},
13839 },
13840 .block_erase = erase_sector_jedec,
13841 }, {
13842 .eraseblocks = { {256 * 1024, 1} },
13843 .block_erase = erase_chip_block_jedec,
13844 }
13845 },
Sean Nelson35727f72010-01-28 23:55:12 +000013846 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013847 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013848 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000013849 },
13850
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013851 {
13852 .vendor = "ST",
13853 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013854 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013855 .manufacture_id = ST_ID,
13856 .model_id = ST_M29F002T,
13857 .total_size = 256,
13858 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013859 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013860 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013861 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013862 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013863 .block_erasers =
13864 {
13865 {
13866 .eraseblocks = {
13867 {64 * 1024, 3},
13868 {32 * 1024, 1},
13869 {8 * 1024, 2},
13870 {16 * 1024, 1},
13871 },
13872 .block_erase = erase_sector_jedec,
13873 }, {
13874 .eraseblocks = { {256 * 1024, 1} },
13875 .block_erase = erase_chip_block_jedec,
13876 }
13877 },
Sean Nelson35727f72010-01-28 23:55:12 +000013878 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013879 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013880 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000013881 },
13882
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013883 {
13884 .vendor = "ST",
13885 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013886 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013887 .manufacture_id = ST_ID,
13888 .model_id = ST_M29F040B,
13889 .total_size = 512,
13890 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013891 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13892 .tested = TEST_UNTESTED,
13893 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000013894 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000013895 .block_erasers =
13896 {
13897 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013898 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000013899 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013900 }, {
13901 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000013902 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013903 }
13904 },
Sean Nelson35727f72010-01-28 23:55:12 +000013905 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013906 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013907 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013908 },
13909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013910 {
Sean Nelson35727f72010-01-28 23:55:12 +000013911 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013912 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013913 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013914 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013915 .manufacture_id = ST_ID,
13916 .model_id = ST_M29F400BB,
13917 .total_size = 512,
13918 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013919 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000013920 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013921 .probe = probe_jedec,
13922 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013923 .block_erasers =
13924 {
13925 {
13926 .eraseblocks = {
13927 {16 * 1024, 1},
13928 {8 * 1024, 2},
13929 {32 * 1024, 1},
13930 {64 * 1024, 7},
13931 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013932 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013933 }, {
13934 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013935 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013936 }
13937 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013938 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013939 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013940 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000013941 },
13942 {
13943 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
13944 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013945 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013946 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013947 .manufacture_id = ST_ID,
13948 .model_id = ST_M29F400BT,
13949 .total_size = 512,
13950 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013951 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013952 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013953 .probe = probe_jedec,
13954 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000013955 .block_erasers =
13956 {
13957 {
13958 .eraseblocks = {
13959 {64 * 1024, 7},
13960 {32 * 1024, 1},
13961 {8 * 1024, 2},
13962 {16 * 1024, 1},
13963 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013964 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013965 }, {
13966 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013967 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000013968 }
13969 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000013970 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013971 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013972 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013973 },
13974
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013975 {
13976 .vendor = "ST",
13977 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013978 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013979 .manufacture_id = ST_ID,
13980 .model_id = ST_M29W010B,
13981 .total_size = 128,
13982 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013983 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013984 .tested = TEST_UNTESTED,
13985 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013986 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013987 .block_erasers =
13988 {
13989 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013990 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000013991 .block_erase = erase_sector_jedec,
13992 }, {
13993 .eraseblocks = { {128 * 1024, 1} },
13994 .block_erase = erase_chip_block_jedec,
13995 }
13996 },
Sean Nelson35727f72010-01-28 23:55:12 +000013997 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013998 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013999 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014000 },
14001
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014002 {
14003 .vendor = "ST",
14004 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014005 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014006 .manufacture_id = ST_ID,
14007 .model_id = ST_M29W040B,
14008 .total_size = 512,
14009 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014010 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014011 .tested = TEST_UNTESTED,
14012 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014013 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014014 .block_erasers =
14015 {
14016 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014017 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014018 .block_erase = erase_sector_jedec,
14019 }, {
14020 .eraseblocks = { {512 * 1024, 1} },
14021 .block_erase = erase_chip_block_jedec,
14022 }
14023 },
Sean Nelson35727f72010-01-28 23:55:12 +000014024 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014025 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014026 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014027 },
14028
Stefan Taunereb582572012-09-21 12:52:50 +000014029 {
14030 .vendor = "ST",
14031 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014032 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000014033 .manufacture_id = ST_ID,
14034 .model_id = ST_M29W512B,
14035 .total_size = 64,
14036 .page_size = 64 * 1024,
14037 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014038 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000014039 .probe = probe_jedec,
14040 .probe_timing = TIMING_ZERO,
14041 .block_erasers =
14042 {
14043 {
14044 .eraseblocks = { {64 * 1024, 1} },
14045 .block_erase = erase_chip_block_jedec,
14046 }
14047 },
14048 .write = write_jedec_1,
14049 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014050 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000014051 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000014052
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014053 {
14054 .vendor = "ST",
14055 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014056 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014057 .manufacture_id = ST_ID,
14058 .model_id = ST_M50FLW040A,
14059 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014060 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014061 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014062 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014063 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014064 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014065 .block_erasers =
14066 {
14067 {
Sean Nelson329bde72010-01-19 16:39:19 +000014068 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014069 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014070 {64 * 1024, 5}, /* block */
14071 {4 * 1024, 16}, /* sector */
14072 {4 * 1024, 16}, /* sector */
14073 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014074 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014075 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014076 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014077 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014078 }
14079 },
Sean Nelson28accc22010-03-19 18:47:06 +000014080 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014081 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014082 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014083 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014084 },
14085
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014086 {
14087 .vendor = "ST",
14088 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014089 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014090 .manufacture_id = ST_ID,
14091 .model_id = ST_M50FLW040B,
14092 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014093 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014094 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014095 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014096 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014097 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014098 .block_erasers =
14099 {
14100 {
Sean Nelson329bde72010-01-19 16:39:19 +000014101 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014102 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014103 {4 * 1024, 16}, /* sector */
14104 {64 * 1024, 5}, /* block */
14105 {4 * 1024, 16}, /* sector */
14106 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014107 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014108 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014109 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014110 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014111 }
14112 },
Sean Nelson28accc22010-03-19 18:47:06 +000014113 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014114 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014115 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014116 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014117 },
14118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014119 {
14120 .vendor = "ST",
14121 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014122 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014123 .manufacture_id = ST_ID,
14124 .model_id = ST_M50FLW080A,
14125 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014126 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014127 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014128 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000014129 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014130 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014131 .block_erasers =
14132 {
14133 {
Sean Nelson329bde72010-01-19 16:39:19 +000014134 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014135 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014136 {64 * 1024, 13}, /* block */
14137 {4 * 1024, 16}, /* sector */
14138 {4 * 1024, 16}, /* sector */
14139 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014140 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014141 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014142 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014143 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014144 }
14145 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014146 .printlock = printlock_regspace2_block_eraser_0,
14147 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014148 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014149 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014150 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014151 },
14152
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014153 {
14154 .vendor = "ST",
14155 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014156 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014157 .manufacture_id = ST_ID,
14158 .model_id = ST_M50FLW080B,
14159 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014160 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014161 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014162 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014163 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000014164 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000014165 .block_erasers =
14166 {
14167 {
Sean Nelson329bde72010-01-19 16:39:19 +000014168 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000014169 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000014170 {4 * 1024, 16}, /* sector */
14171 {64 * 1024, 13}, /* block */
14172 {4 * 1024, 16}, /* sector */
14173 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000014174 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000014175 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000014176 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014177 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014178 }
14179 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014180 .printlock = printlock_regspace2_block_eraser_0,
14181 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014182 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014183 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014184 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014185 },
14186
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014187 {
14188 .vendor = "ST",
14189 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014190 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014191 .manufacture_id = ST_ID,
14192 .model_id = ST_M50FW002,
14193 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000014194 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014195 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014196 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000014197 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014198 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014199 .block_erasers =
14200 {
14201 {
14202 .eraseblocks = {
14203 {64 * 1024, 3},
14204 {32 * 1024, 1},
14205 {8 * 1024, 2},
14206 {16 * 1024, 1},
14207 },
Sean Nelson28accc22010-03-19 18:47:06 +000014208 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014209 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000014210 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014211 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000014212 }
14213 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014214 .printlock = printlock_regspace2_block_eraser_0,
14215 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014216 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014217 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014218 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014219 },
14220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014221 {
14222 .vendor = "ST",
14223 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014224 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014225 .manufacture_id = ST_ID,
14226 .model_id = ST_M50FW016,
14227 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000014228 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014229 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014230 .tested = TEST_UNTESTED,
14231 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014232 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014233 .block_erasers =
14234 {
14235 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014236 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000014237 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014238 }
14239 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014240 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014241 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014242 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014243 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014244 },
14245
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014246 {
14247 .vendor = "ST",
14248 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014249 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014250 .manufacture_id = ST_ID,
14251 .model_id = ST_M50FW040,
14252 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000014253 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014254 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000014255 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014256 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014257 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014258 .block_erasers =
14259 {
14260 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014261 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000014262 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014263 }
14264 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014265 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014266 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014267 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014268 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014269 },
14270
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014271 {
14272 .vendor = "ST",
14273 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014274 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014275 .manufacture_id = ST_ID,
14276 .model_id = ST_M50FW080,
14277 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000014278 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014279 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014280 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014281 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014282 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000014283 .block_erasers =
14284 {
14285 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014286 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000014287 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014288 }
14289 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014290 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000014291 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014292 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014293 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014294 },
14295
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014296 {
14297 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014298 .name = "M50LPW080",
14299 .bustype = BUS_LPC, /* A/A Mux */
14300 .manufacture_id = ST_ID,
14301 .model_id = ST_M50LPW080,
14302 .total_size = 1024,
14303 .page_size = 0,
14304 .feature_bits = FEATURE_REGISTERMAP,
14305 .tested = TEST_UNTESTED,
14306 .probe = probe_82802ab,
14307 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14308 .block_erasers =
14309 {
14310 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014311 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014312 .block_erase = erase_block_82802ab,
14313 }
14314 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014315 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000014316 .write = write_82802ab,
14317 .read = read_memmapped,
14318 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
14319 },
14320
14321 {
14322 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014323 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014324 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014325 .manufacture_id = ST_ID,
14326 .model_id = ST_M50LPW116,
14327 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000014328 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014329 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014330 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000014331 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000014332 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014333 .block_erasers =
14334 {
14335 {
14336 .eraseblocks = {
14337 {4 * 1024, 16},
14338 {64 * 1024, 30},
14339 {32 * 1024, 1},
14340 {8 * 1024, 2},
14341 {16 * 1024, 1},
14342 },
Sean Nelson28accc22010-03-19 18:47:06 +000014343 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000014344 }
14345 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014346 .printlock = printlock_regspace2_block_eraser_0,
14347 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000014348 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014349 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014350 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000014351 },
14352
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014353 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014354 .vendor = "SyncMOS/MoselVitelic",
14355 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014356 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014357 .manufacture_id = SYNCMOS_MVC_ID,
14358 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014359 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014360 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000014361 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014362 .tested = TEST_UNTESTED,
14363 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014364 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014365 .block_erasers =
14366 {
14367 {
14368 .eraseblocks = { {512, 256} },
14369 .block_erase = erase_sector_jedec,
14370 }, {
14371 .eraseblocks = { {128 * 1024, 1} },
14372 .block_erase = erase_chip_block_jedec,
14373 },
14374 },
Sean Nelson35727f72010-01-28 23:55:12 +000014375 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014376 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014377 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014378 },
14379
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014380 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014381 .vendor = "SyncMOS/MoselVitelic",
14382 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014383 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014384 .manufacture_id = SYNCMOS_MVC_ID,
14385 .model_id = SM_MVC_29C51001T,
14386 .total_size = 128,
14387 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000014388 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014389 .tested = TEST_UNTESTED,
14390 .probe = probe_jedec,
14391 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14392 .block_erasers =
14393 {
14394 {
14395 .eraseblocks = { {512, 256} },
14396 .block_erase = erase_sector_jedec,
14397 }, {
14398 .eraseblocks = { {128 * 1024, 1} },
14399 .block_erase = erase_chip_block_jedec,
14400 },
14401 },
14402 .write = write_jedec_1,
14403 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014404 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014405 },
14406
14407 {
14408 .vendor = "SyncMOS/MoselVitelic",
14409 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014410 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014411 .manufacture_id = SYNCMOS_MVC_ID,
14412 .model_id = SM_MVC_29C51002B,
14413 .total_size = 256,
14414 .page_size = 512,
14415 .feature_bits = FEATURE_EITHER_RESET,
14416 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014417 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014418 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014419 .block_erasers =
14420 {
14421 {
14422 .eraseblocks = { {512, 512} },
14423 .block_erase = erase_sector_jedec,
14424 }, {
14425 .eraseblocks = { {256 * 1024, 1} },
14426 .block_erase = erase_chip_block_jedec,
14427 },
14428 },
Sean Nelson35727f72010-01-28 23:55:12 +000014429 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014430 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000014431 },
14432
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014433 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014434 .vendor = "SyncMOS/MoselVitelic",
14435 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014436 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014437 .manufacture_id = SYNCMOS_MVC_ID,
14438 .model_id = SM_MVC_29C51002T,
14439 .total_size = 256,
14440 .page_size = 512,
14441 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014442 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014443 .probe = probe_jedec,
14444 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14445 .block_erasers =
14446 {
14447 {
14448 .eraseblocks = { {512, 512} },
14449 .block_erase = erase_sector_jedec,
14450 }, {
14451 .eraseblocks = { {256 * 1024, 1} },
14452 .block_erase = erase_chip_block_jedec,
14453 },
14454 },
14455 .write = write_jedec_1,
14456 .read = read_memmapped,
14457 },
14458
14459 {
14460 .vendor = "SyncMOS/MoselVitelic",
14461 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014462 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014463 .manufacture_id = SYNCMOS_MVC_ID,
14464 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014465 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014466 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014467 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014468 .tested = TEST_UNTESTED,
14469 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014470 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000014471 .block_erasers =
14472 {
14473 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000014474 .eraseblocks = { {1024, 512} },
14475 .block_erase = erase_sector_jedec,
14476 }, {
14477 .eraseblocks = { {512 * 1024, 1} },
14478 .block_erase = erase_chip_block_jedec,
14479 },
14480 },
14481 .write = write_jedec_1,
14482 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014483 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014484 },
14485
14486 {
14487 .vendor = "SyncMOS/MoselVitelic",
14488 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014489 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014490 .manufacture_id = SYNCMOS_MVC_ID,
14491 .model_id = SM_MVC_29C51004T,
14492 .total_size = 512,
14493 .page_size = 1024,
14494 .feature_bits = FEATURE_EITHER_RESET,
14495 .tested = TEST_UNTESTED,
14496 .probe = probe_jedec,
14497 .probe_timing = TIMING_ZERO,
14498 .block_erasers =
14499 {
14500 {
14501 .eraseblocks = { {1024, 512} },
14502 .block_erase = erase_sector_jedec,
14503 }, {
14504 .eraseblocks = { {512 * 1024, 1} },
14505 .block_erase = erase_chip_block_jedec,
14506 },
14507 },
14508 .write = write_jedec_1,
14509 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014510 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014511 },
14512
14513 {
14514 .vendor = "SyncMOS/MoselVitelic",
14515 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014516 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014517 .manufacture_id = SYNCMOS_MVC_ID,
14518 .model_id = SM_MVC_29C31004B,
14519 .total_size = 512,
14520 .page_size = 1024,
14521 .feature_bits = FEATURE_EITHER_RESET,
14522 .tested = TEST_UNTESTED,
14523 .probe = probe_jedec,
14524 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14525 .block_erasers =
14526 {
14527 {
14528 .eraseblocks = { {1024, 512} },
14529 .block_erase = erase_sector_jedec,
14530 }, {
14531 .eraseblocks = { {512 * 1024, 1} },
14532 .block_erase = erase_chip_block_jedec,
14533 },
14534 },
14535 .write = write_jedec_1,
14536 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014537 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000014538 },
14539
14540 {
14541 .vendor = "SyncMOS/MoselVitelic",
14542 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014543 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000014544 .manufacture_id = SYNCMOS_MVC_ID,
14545 .model_id = SM_MVC_29C31004T,
14546 .total_size = 512,
14547 .page_size = 1024,
14548 .feature_bits = FEATURE_EITHER_RESET,
14549 .tested = TEST_UNTESTED,
14550 .probe = probe_jedec,
14551 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
14552 .block_erasers =
14553 {
14554 {
14555 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000014556 .block_erase = erase_sector_jedec,
14557 }, {
14558 .eraseblocks = { {512 * 1024, 1} },
14559 .block_erase = erase_chip_block_jedec,
14560 },
14561 },
Sean Nelson35727f72010-01-28 23:55:12 +000014562 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014563 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014564 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014565 },
14566
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014567 {
Uwe Hermanna106d152009-05-27 23:17:40 +000014568 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014569 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014570 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014571 .manufacture_id = TI_OLD_ID,
14572 .model_id = TI_TMS29F002RB,
14573 .total_size = 256,
14574 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000014575 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014576 .tested = TEST_UNTESTED,
14577 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014578 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014579 .block_erasers =
14580 {
14581 {
14582 .eraseblocks = {
14583 {16 * 1024, 1},
14584 {8 * 1024, 2},
14585 {32 * 1024, 1},
14586 {64 * 1024, 3},
14587 },
14588 .block_erase = erase_sector_jedec,
14589 }, {
14590 .eraseblocks = { {256 * 1024, 1} },
14591 .block_erase = erase_chip_block_jedec,
14592 },
14593 },
Sean Nelson35727f72010-01-28 23:55:12 +000014594 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014595 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014596 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014597 },
14598
14599 {
Uwe Hermanna106d152009-05-27 23:17:40 +000014600 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014601 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014602 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014603 .manufacture_id = TI_OLD_ID,
14604 .model_id = TI_TMS29F002RT,
14605 .total_size = 256,
14606 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000014607 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014608 .tested = TEST_UNTESTED,
14609 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014610 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014611 .block_erasers =
14612 {
14613 {
14614 .eraseblocks = {
14615 {64 * 1024, 3},
14616 {32 * 1024, 1},
14617 {8 * 1024, 2},
14618 {16 * 1024, 1},
14619 },
14620 .block_erase = erase_sector_jedec,
14621 }, {
14622 .eraseblocks = { {256 * 1024, 1} },
14623 .block_erase = erase_chip_block_jedec,
14624 },
14625 },
Sean Nelson35727f72010-01-28 23:55:12 +000014626 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014627 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014628 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000014629 },
14630
14631 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014632 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000014633 .name = "W25Q40.V",
14634 .bustype = BUS_SPI,
14635 .manufacture_id = WINBOND_NEX_ID,
14636 .model_id = WINBOND_NEX_W25Q40_V,
14637 .total_size = 512,
14638 .page_size = 256,
14639 /* supports SFDP */
14640 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14641 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014642 .tested = TEST_OK_PREW,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000014643 .probe = probe_spi_rdid,
14644 .probe_timing = TIMING_ZERO,
14645 .block_erasers =
14646 {
14647 {
14648 .eraseblocks = { {4 * 1024, 128} },
14649 .block_erase = spi_block_erase_20,
14650 }, {
14651 .eraseblocks = { {32 * 1024, 16} },
14652 .block_erase = spi_block_erase_52,
14653 }, {
14654 .eraseblocks = { {64 * 1024, 8} },
14655 .block_erase = spi_block_erase_d8,
14656 }, {
14657 .eraseblocks = { {512 * 1024, 1} },
14658 .block_erase = spi_block_erase_60,
14659 }, {
14660 .eraseblocks = { {512 * 1024, 1} },
14661 .block_erase = spi_block_erase_c7,
14662 }
14663 },
14664 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14665 .unlock = spi_disable_blockprotect,
14666 .write = spi_chip_write_256, /* Multi I/O supported */
14667 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14668 .voltage = {2700, 3600},
14669 },
14670
14671 {
14672 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014673 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014674 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014675 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014676 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014677 .total_size = 1024,
14678 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014679 /* supports SFDP */
14680 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014681 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014682 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014683 .probe = probe_spi_rdid,
14684 .probe_timing = TIMING_ZERO,
14685 .block_erasers =
14686 {
14687 {
14688 .eraseblocks = { {4 * 1024, 256} },
14689 .block_erase = spi_block_erase_20,
14690 }, {
14691 .eraseblocks = { {32 * 1024, 32} },
14692 .block_erase = spi_block_erase_52,
14693 }, {
14694 .eraseblocks = { {64 * 1024, 16} },
14695 .block_erase = spi_block_erase_d8,
14696 }, {
14697 .eraseblocks = { {1024 * 1024, 1} },
14698 .block_erase = spi_block_erase_60,
14699 }, {
14700 .eraseblocks = { {1024 * 1024, 1} },
14701 .block_erase = spi_block_erase_c7,
14702 }
14703 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014704 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014705 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014706 .write = spi_chip_write_256,
14707 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014708 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014709 },
14710
14711 {
14712 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014713 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014714 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014715 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014716 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014717 .total_size = 2048,
14718 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014719 /* supports SFDP */
14720 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014721 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000014722 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014723 .probe = probe_spi_rdid,
14724 .probe_timing = TIMING_ZERO,
14725 .block_erasers =
14726 {
14727 {
14728 .eraseblocks = { {4 * 1024, 512} },
14729 .block_erase = spi_block_erase_20,
14730 }, {
14731 .eraseblocks = { {32 * 1024, 64} },
14732 .block_erase = spi_block_erase_52,
14733 }, {
14734 .eraseblocks = { {64 * 1024, 32} },
14735 .block_erase = spi_block_erase_d8,
14736 }, {
14737 .eraseblocks = { {2 * 1024 * 1024, 1} },
14738 .block_erase = spi_block_erase_60,
14739 }, {
14740 .eraseblocks = { {2 * 1024 * 1024, 1} },
14741 .block_erase = spi_block_erase_c7,
14742 }
14743 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014744 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014745 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014746 .write = spi_chip_write_256,
14747 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014748 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014749 },
14750
14751 {
14752 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014753 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014754 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014755 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014756 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014757 .total_size = 4096,
14758 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014759 /* supports SFDP */
14760 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014761 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014762 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014763 .probe = probe_spi_rdid,
14764 .probe_timing = TIMING_ZERO,
14765 .block_erasers =
14766 {
14767 {
14768 .eraseblocks = { {4 * 1024, 1024} },
14769 .block_erase = spi_block_erase_20,
14770 }, {
14771 .eraseblocks = { {32 * 1024, 128} },
14772 .block_erase = spi_block_erase_52,
14773 }, {
14774 .eraseblocks = { {64 * 1024, 64} },
14775 .block_erase = spi_block_erase_d8,
14776 }, {
14777 .eraseblocks = { {4 * 1024 * 1024, 1} },
14778 .block_erase = spi_block_erase_60,
14779 }, {
14780 .eraseblocks = { {4 * 1024 * 1024, 1} },
14781 .block_erase = spi_block_erase_c7,
14782 }
14783 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014784 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014785 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000014786 .write = spi_chip_write_256,
14787 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014788 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000014789 },
14790
14791 {
14792 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014793 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014794 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000014795 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014796 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000014797 .total_size = 8192,
14798 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014799 /* supports SFDP */
14800 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000014802 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000014803 .probe = probe_spi_rdid,
14804 .probe_timing = TIMING_ZERO,
14805 .block_erasers =
14806 {
14807 {
14808 .eraseblocks = { {4 * 1024, 2048} },
14809 .block_erase = spi_block_erase_20,
14810 }, {
14811 .eraseblocks = { {32 * 1024, 256} },
14812 .block_erase = spi_block_erase_52,
14813 }, {
14814 .eraseblocks = { {64 * 1024, 128} },
14815 .block_erase = spi_block_erase_d8,
14816 }, {
14817 .eraseblocks = { {8 * 1024 * 1024, 1} },
14818 .block_erase = spi_block_erase_60,
14819 }, {
14820 .eraseblocks = { {8 * 1024 * 1024, 1} },
14821 .block_erase = spi_block_erase_c7,
14822 }
14823 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014824 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014825 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000014826 .write = spi_chip_write_256,
14827 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014828 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000014829 },
14830
14831 {
14832 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014833 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014834 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014835 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014836 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014837 .total_size = 16384,
14838 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014839 /* supports SFDP */
14840 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000014841 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014842 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014843 .probe = probe_spi_rdid,
14844 .probe_timing = TIMING_ZERO,
14845 .block_erasers =
14846 {
14847 {
14848 .eraseblocks = { {4 * 1024, 4096} },
14849 .block_erase = spi_block_erase_20,
14850 }, {
14851 .eraseblocks = { {32 * 1024, 512} },
14852 .block_erase = spi_block_erase_52,
14853 }, {
14854 .eraseblocks = { {64 * 1024, 256} },
14855 .block_erase = spi_block_erase_d8,
14856 }, {
14857 .eraseblocks = { {16 * 1024 * 1024, 1} },
14858 .block_erase = spi_block_erase_60,
14859 }, {
14860 .eraseblocks = { {16 * 1024 * 1024, 1} },
14861 .block_erase = spi_block_erase_c7,
14862 }
14863 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014864 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000014865 .unlock = spi_disable_blockprotect,
14866 .write = spi_chip_write_256,
14867 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014868 .voltage = {2700, 3600},
14869 },
14870
14871 {
14872 .vendor = "Winbond",
Boris Baykovaa6c3742016-06-11 18:29:01 +020014873 .name = "W25Q256.V",
14874 .bustype = BUS_SPI,
14875 .manufacture_id = WINBOND_NEX_ID,
14876 .model_id = WINBOND_NEX_W25Q256_V,
14877 .total_size = 32768,
14878 .page_size = 256,
14879 /* supports SFDP */
14880 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14881 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nico Huberaac81422017-11-10 22:54:13 +010014882 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
14883 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
14884 .tested = TEST_UNTESTED,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014885 .probe = probe_spi_rdid,
14886 .probe_timing = TIMING_ZERO,
14887 .block_erasers =
14888 {
14889 {
14890 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020014891 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014892 }, {
14893 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020014894 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014895 }, {
14896 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020014897 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020014898 }, {
14899 .eraseblocks = { {32 * 1024 * 1024, 1} },
14900 .block_erase = spi_block_erase_60,
14901 }, {
14902 .eraseblocks = { {32 * 1024 * 1024, 1} },
14903 .block_erase = spi_block_erase_c7,
14904 }
14905 },
14906 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14907 .unlock = spi_disable_blockprotect,
14908 .write = spi_chip_write_256,
14909 .read = spi_chip_read,
14910 .voltage = {2700, 3600},
14911 },
14912
14913 {
14914 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000014915 .name = "W25Q20.W",
14916 .bustype = BUS_SPI,
14917 .manufacture_id = WINBOND_NEX_ID,
14918 .model_id = WINBOND_NEX_W25Q20_W,
14919 .total_size = 256,
14920 .page_size = 256,
14921 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14922 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14923 .tested = TEST_UNTESTED,
14924 .probe = probe_spi_rdid,
14925 .probe_timing = TIMING_ZERO,
14926 .block_erasers =
14927 {
14928 {
14929 .eraseblocks = { {4 * 1024, 64} },
14930 .block_erase = spi_block_erase_20,
14931 }, {
14932 .eraseblocks = { {32 * 1024, 8} },
14933 .block_erase = spi_block_erase_52,
14934 }, {
14935 .eraseblocks = { {64 * 1024, 4} },
14936 .block_erase = spi_block_erase_d8,
14937 }, {
14938 .eraseblocks = { {256 * 1024, 1} },
14939 .block_erase = spi_block_erase_60,
14940 }, {
14941 .eraseblocks = { {256 * 1024, 1} },
14942 .block_erase = spi_block_erase_c7,
14943 }
14944 },
14945 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14946 .unlock = spi_disable_blockprotect,
14947 .write = spi_chip_write_256,
14948 .read = spi_chip_read,
14949 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
14950 },
14951
14952 {
14953 .vendor = "Winbond",
14954 .name = "W25Q40.W",
14955 .bustype = BUS_SPI,
14956 .manufacture_id = WINBOND_NEX_ID,
14957 .model_id = WINBOND_NEX_W25Q40_W,
14958 .total_size = 512,
14959 .page_size = 256,
14960 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
14961 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14962 .tested = TEST_UNTESTED,
14963 .probe = probe_spi_rdid,
14964 .probe_timing = TIMING_ZERO,
14965 .block_erasers =
14966 {
14967 {
14968 .eraseblocks = { {4 * 1024, 128} },
14969 .block_erase = spi_block_erase_20,
14970 }, {
14971 .eraseblocks = { {32 * 1024, 16} },
14972 .block_erase = spi_block_erase_52,
14973 }, {
14974 .eraseblocks = { {64 * 1024, 8} },
14975 .block_erase = spi_block_erase_d8,
14976 }, {
14977 .eraseblocks = { {512 * 1024, 1} },
14978 .block_erase = spi_block_erase_60,
14979 }, {
14980 .eraseblocks = { {512 * 1024, 1} },
14981 .block_erase = spi_block_erase_c7,
14982 }
14983 },
14984 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14985 .unlock = spi_disable_blockprotect,
14986 .write = spi_chip_write_256,
14987 .read = spi_chip_read,
14988 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
14989 },
14990
14991 {
14992 .vendor = "Winbond",
14993 .name = "W25Q80.W",
14994 .bustype = BUS_SPI,
14995 .manufacture_id = WINBOND_NEX_ID,
14996 .model_id = WINBOND_NEX_W25Q80_W,
14997 .total_size = 1024,
14998 .page_size = 256,
14999 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15000 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015001 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015002 .probe = probe_spi_rdid,
15003 .probe_timing = TIMING_ZERO,
15004 .block_erasers =
15005 {
15006 {
15007 .eraseblocks = { {4 * 1024, 256} },
15008 .block_erase = spi_block_erase_20,
15009 }, {
15010 .eraseblocks = { {32 * 1024, 32} },
15011 .block_erase = spi_block_erase_52,
15012 }, {
15013 .eraseblocks = { {64 * 1024, 16} },
15014 .block_erase = spi_block_erase_d8,
15015 }, {
15016 .eraseblocks = { {1 * 1024 * 1024, 1} },
15017 .block_erase = spi_block_erase_60,
15018 }, {
15019 .eraseblocks = { {1 * 1024 * 1024, 1} },
15020 .block_erase = spi_block_erase_c7,
15021 }
15022 },
15023 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15024 .unlock = spi_disable_blockprotect,
15025 .write = spi_chip_write_256,
15026 .read = spi_chip_read,
15027 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15028 },
15029
15030 {
15031 .vendor = "Winbond",
15032 .name = "W25Q16.W",
15033 .bustype = BUS_SPI,
15034 .manufacture_id = WINBOND_NEX_ID,
15035 .model_id = WINBOND_NEX_W25Q16_W,
15036 .total_size = 2048,
15037 .page_size = 256,
15038 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15039 /* QPI enable 0x38, disable 0xFF */
15040 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15041 .tested = TEST_UNTESTED,
15042 .probe = probe_spi_rdid,
15043 .probe_timing = TIMING_ZERO,
15044 .block_erasers =
15045 {
15046 {
15047 .eraseblocks = { {4 * 1024, 512} },
15048 .block_erase = spi_block_erase_20,
15049 }, {
15050 .eraseblocks = { {32 * 1024, 64} },
15051 .block_erase = spi_block_erase_52,
15052 }, {
15053 .eraseblocks = { {64 * 1024, 32} },
15054 .block_erase = spi_block_erase_d8,
15055 }, {
15056 .eraseblocks = { {2 * 1024 * 1024, 1} },
15057 .block_erase = spi_block_erase_60,
15058 }, {
15059 .eraseblocks = { {2 * 1024 * 1024, 1} },
15060 .block_erase = spi_block_erase_c7,
15061 }
15062 },
15063 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15064 .unlock = spi_disable_blockprotect,
15065 .write = spi_chip_write_256,
15066 .read = spi_chip_read,
15067 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15068 },
15069
15070 {
15071 .vendor = "Winbond",
15072 .name = "W25Q32.W",
15073 .bustype = BUS_SPI,
15074 .manufacture_id = WINBOND_NEX_ID,
15075 .model_id = WINBOND_NEX_W25Q32_W,
15076 .total_size = 4096,
15077 .page_size = 256,
15078 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15079 /* QPI enable 0x38, disable 0xFF */
15080 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
15081 .tested = TEST_OK_PREW,
15082 .probe = probe_spi_rdid,
15083 .probe_timing = TIMING_ZERO,
15084 .block_erasers =
15085 {
15086 {
15087 .eraseblocks = { {4 * 1024, 1024} },
15088 .block_erase = spi_block_erase_20,
15089 }, {
15090 .eraseblocks = { {32 * 1024, 128} },
15091 .block_erase = spi_block_erase_52,
15092 }, {
15093 .eraseblocks = { {64 * 1024, 64} },
15094 .block_erase = spi_block_erase_d8,
15095 }, {
15096 .eraseblocks = { {4 * 1024 * 1024, 1} },
15097 .block_erase = spi_block_erase_60,
15098 }, {
15099 .eraseblocks = { {4 * 1024 * 1024, 1} },
15100 .block_erase = spi_block_erase_c7,
15101 }
15102 },
15103 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15104 .unlock = spi_disable_blockprotect,
15105 .write = spi_chip_write_256,
15106 .read = spi_chip_read,
15107 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
15108 },
15109
15110 {
15111 .vendor = "Winbond",
15112 .name = "W25Q64.W",
15113 .bustype = BUS_SPI,
15114 .manufacture_id = WINBOND_NEX_ID,
15115 .model_id = WINBOND_NEX_W25Q64_W,
15116 .total_size = 8192,
15117 .page_size = 256,
15118 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15119 /* QPI enable 0x38, disable 0xFF */
15120 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015121 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000015122 .probe = probe_spi_rdid,
15123 .probe_timing = TIMING_ZERO,
15124 .block_erasers =
15125 {
15126 {
15127 .eraseblocks = { {4 * 1024, 2048} },
15128 .block_erase = spi_block_erase_20,
15129 }, {
15130 .eraseblocks = { {32 * 1024, 256} },
15131 .block_erase = spi_block_erase_52,
15132 }, {
15133 .eraseblocks = { {64 * 1024, 128} },
15134 .block_erase = spi_block_erase_d8,
15135 }, {
15136 .eraseblocks = { {8 * 1024 * 1024, 1} },
15137 .block_erase = spi_block_erase_60,
15138 }, {
15139 .eraseblocks = { {8 * 1024 * 1024, 1} },
15140 .block_erase = spi_block_erase_c7,
15141 }
15142 },
15143 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15144 .unlock = spi_disable_blockprotect,
15145 .write = spi_chip_write_256,
15146 .read = spi_chip_read,
15147 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000015148 },
15149
15150 {
15151 .vendor = "Winbond",
Nico Huber70eed9f2017-04-24 22:19:27 +020015152 .name = "W25Q128.W",
15153 .bustype = BUS_SPI,
15154 .manufacture_id = WINBOND_NEX_ID,
15155 .model_id = WINBOND_NEX_W25Q128_W,
15156 .total_size = 16384,
15157 .page_size = 256,
15158 /* supports SFDP */
15159 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
15160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks48729d32017-12-08 14:44:07 -080015161 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020015162 .probe = probe_spi_rdid,
15163 .probe_timing = TIMING_ZERO,
15164 .block_erasers =
15165 {
15166 {
15167 .eraseblocks = { {4 * 1024, 4096} },
15168 .block_erase = spi_block_erase_20,
15169 }, {
15170 .eraseblocks = { {32 * 1024, 512} },
15171 .block_erase = spi_block_erase_52,
15172 }, {
15173 .eraseblocks = { {64 * 1024, 256} },
15174 .block_erase = spi_block_erase_d8,
15175 }, {
15176 .eraseblocks = { {16 * 1024 * 1024, 1} },
15177 .block_erase = spi_block_erase_60,
15178 }, {
15179 .eraseblocks = { {16 * 1024 * 1024, 1} },
15180 .block_erase = spi_block_erase_c7,
15181 }
15182 },
15183 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15184 .unlock = spi_disable_blockprotect,
15185 .write = spi_chip_write_256,
15186 .read = spi_chip_read,
15187 .voltage = {1650, 1950},
15188 },
15189
15190 {
15191 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015192 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015193 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015194 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015195 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015196 .total_size = 128,
15197 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015198 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015199 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015200 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015201 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015202 .block_erasers =
15203 {
15204 {
15205 .eraseblocks = { {4 * 1024, 32} },
15206 .block_erase = spi_block_erase_20,
15207 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015208 .eraseblocks = { {64 * 1024, 2} },
15209 .block_erase = spi_block_erase_d8,
15210 }, {
15211 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015212 .block_erase = spi_block_erase_c7,
15213 }
15214 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015215 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015216 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015217 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015218 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015219 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015220 },
15221
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015222 {
15223 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015224 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015225 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015226 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015227 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015228 .total_size = 256,
15229 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015230 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015231 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015232 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015233 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015234 .block_erasers =
15235 {
15236 {
15237 .eraseblocks = { {4 * 1024, 64} },
15238 .block_erase = spi_block_erase_20,
15239 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015240 .eraseblocks = { {64 * 1024, 4} },
15241 .block_erase = spi_block_erase_d8,
15242 }, {
15243 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015244 .block_erase = spi_block_erase_c7,
15245 }
15246 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015247 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015248 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015249 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015250 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015251 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015252 },
15253
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015254 {
15255 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015256 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015257 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015258 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015259 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015260 .total_size = 512,
15261 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015262 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000015263 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015264 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015265 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015266 .block_erasers =
15267 {
15268 {
15269 .eraseblocks = { {4 * 1024, 128} },
15270 .block_erase = spi_block_erase_20,
15271 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015272 .eraseblocks = { {64 * 1024, 8} },
15273 .block_erase = spi_block_erase_d8,
15274 }, {
15275 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015276 .block_erase = spi_block_erase_c7,
15277 }
15278 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015279 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015280 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015281 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015282 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015283 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015284 },
15285
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015286 {
15287 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015288 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015289 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015290 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015291 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015292 .total_size = 1024,
15293 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015294 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000015295 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015296 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015297 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015298 .block_erasers =
15299 {
15300 {
15301 .eraseblocks = { {4 * 1024, 256} },
15302 .block_erase = spi_block_erase_20,
15303 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015304 .eraseblocks = { {64 * 1024, 16} },
15305 .block_erase = spi_block_erase_d8,
15306 }, {
15307 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015308 .block_erase = spi_block_erase_c7,
15309 }
15310 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000015311 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000015312 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000015313 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015314 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015315 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015316 },
15317
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015318 {
15319 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015320 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015321 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000015322 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015323 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000015324 .total_size = 2048,
15325 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015326 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000015327 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000015328 .probe = probe_spi_rdid,
15329 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015330 .block_erasers =
15331 {
15332 {
15333 .eraseblocks = { {4 * 1024, 512} },
15334 .block_erase = spi_block_erase_20,
15335 }, {
15336 .eraseblocks = { {32 * 1024, 64} },
15337 .block_erase = spi_block_erase_52,
15338 }, {
15339 .eraseblocks = { {64 * 1024, 32} },
15340 .block_erase = spi_block_erase_d8,
15341 }, {
15342 .eraseblocks = { {2 * 1024 * 1024, 1} },
15343 .block_erase = spi_block_erase_60,
15344 }, {
15345 .eraseblocks = { {2 * 1024 * 1024, 1} },
15346 .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,
Hector Martina721ae22009-07-11 19:39:11 +000015351 .write = spi_chip_write_256,
15352 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015353 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000015354 },
15355
15356 {
15357 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015358 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015359 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000015360 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015361 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000015362 .total_size = 4096,
15363 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015364 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015365 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +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, 1024} },
15372 .block_erase = spi_block_erase_20,
15373 }, {
15374 .eraseblocks = { {32 * 1024, 128} },
15375 .block_erase = spi_block_erase_52,
15376 }, {
15377 .eraseblocks = { {64 * 1024, 64} },
15378 .block_erase = spi_block_erase_d8,
15379 }, {
15380 .eraseblocks = { {4 * 1024 * 1024, 1} },
15381 .block_erase = spi_block_erase_60,
15382 }, {
15383 .eraseblocks = { {4 * 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,
Zheng Bao1db2b752009-11-26 11:05:01 +000015389 .write = spi_chip_write_256,
15390 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015391 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000015392 },
15393
15394 {
15395 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015396 .name = "W25X64",
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_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000015400 .total_size = 8192,
15401 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000015402 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +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, 2048} },
15410 .block_erase = spi_block_erase_20,
15411 }, {
15412 .eraseblocks = { {32 * 1024, 256} },
15413 .block_erase = spi_block_erase_52,
15414 }, {
15415 .eraseblocks = { {64 * 1024, 128} },
15416 .block_erase = spi_block_erase_d8,
15417 }, {
15418 .eraseblocks = { {8 * 1024 * 1024, 1} },
15419 .block_erase = spi_block_erase_60,
15420 }, {
15421 .eraseblocks = { {8 * 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 {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080015433 .vendor = "Winbond",
15434 .name = "W25P80",
15435 .bustype = BUS_SPI,
15436 .manufacture_id = WINBOND_NEX_ID,
15437 .model_id = WINBOND_NEX_W25P80,
15438 .total_size = 1024,
15439 .page_size = 256,
15440 .feature_bits = FEATURE_WRSR_WREN,
15441 .tested = TEST_UNTESTED,
15442 .probe = probe_spi_rdid,
15443 .probe_timing = TIMING_ZERO,
15444 .block_erasers =
15445 {
15446 {
15447 .eraseblocks = { {64 * 1024, 16} },
15448 .block_erase = spi_block_erase_d8,
15449 }, {
15450 .eraseblocks = { {1024 * 1024, 1} },
15451 .block_erase = spi_block_erase_c7,
15452 }
15453 },
15454 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15455 .unlock = spi_disable_blockprotect,
15456 .write = spi_chip_write_256,
15457 .read = spi_chip_read, /* Fast read (0x0B) supported */
15458 .voltage = {2700, 3600},
15459 },
15460
15461 {
15462 .vendor = "Winbond",
15463 .name = "W25P16",
15464 .bustype = BUS_SPI,
15465 .manufacture_id = WINBOND_NEX_ID,
15466 .model_id = WINBOND_NEX_W25P16,
15467 .total_size = 2048,
15468 .page_size = 256,
15469 .feature_bits = FEATURE_WRSR_WREN,
15470 .tested = TEST_UNTESTED,
15471 .probe = probe_spi_rdid,
15472 .probe_timing = TIMING_ZERO,
15473 .block_erasers =
15474 {
15475 {
15476 .eraseblocks = { {64 * 1024, 32} },
15477 .block_erase = spi_block_erase_d8,
15478 }, {
15479 .eraseblocks = { {2048 * 1024, 1} },
15480 .block_erase = spi_block_erase_c7,
15481 }
15482 },
15483 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15484 .unlock = spi_disable_blockprotect,
15485 .write = spi_chip_write_256,
15486 .read = spi_chip_read, /* Fast read (0x0B) supported */
15487 .voltage = {2700, 3600},
15488 },
15489
15490 {
15491 .vendor = "Winbond",
15492 .name = "W25P32",
15493 .bustype = BUS_SPI,
15494 .manufacture_id = WINBOND_NEX_ID,
15495 .model_id = WINBOND_NEX_W25P32,
15496 .total_size = 4096,
15497 .page_size = 256,
15498 .feature_bits = FEATURE_WRSR_WREN,
15499 .tested = TEST_UNTESTED,
15500 .probe = probe_spi_rdid,
15501 .probe_timing = TIMING_ZERO,
15502 .block_erasers =
15503 {
15504 {
15505 .eraseblocks = { {64 * 1024, 64} },
15506 .block_erase = spi_block_erase_d8,
15507 }, {
15508 .eraseblocks = { {4096 * 1024, 1} },
15509 .block_erase = spi_block_erase_c7,
15510 }
15511 },
15512 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15513 .unlock = spi_disable_blockprotect,
15514 .write = spi_chip_write_256,
15515 .read = spi_chip_read, /* Fast read (0x0B) supported */
15516 .voltage = {2700, 3600},
15517 },
15518 {
Zheng Bao1db2b752009-11-26 11:05:01 +000015519 .vendor = "Winbond",
Urja Rannikko2a1aaba2015-06-20 11:53:10 +000015520 .name = "W29C512A/W29EE512",
15521 .bustype = BUS_PARALLEL,
15522 .manufacture_id = WINBOND_ID,
15523 .model_id = WINBOND_W29C512A,
15524 .total_size = 64,
15525 .page_size = 128,
15526 .feature_bits = FEATURE_LONG_RESET,
15527 .tested = TEST_OK_PREW,
15528 .probe = probe_jedec,
15529 .probe_timing = 10,
15530 .block_erasers =
15531 {
15532 {
15533 .eraseblocks = { {64 * 1024, 1} },
15534 .block_erase = erase_chip_block_jedec,
15535 }
15536 },
15537 .write = write_jedec,
15538 .read = read_memmapped,
15539 .voltage = {4500, 5500},
15540 },
15541
15542 {
15543 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015544 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015545 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015546 .manufacture_id = WINBOND_ID,
15547 .model_id = WINBOND_W29C010,
15548 .total_size = 128,
15549 .page_size = 128,
15550 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015551 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000015552 .probe = probe_w29ee011,
15553 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
15554 .block_erasers =
15555 {
15556 {
15557 .eraseblocks = { {128 * 1024, 1} },
15558 .block_erase = erase_chip_block_jedec,
15559 }
15560 },
15561 .write = write_jedec,
15562 .read = read_memmapped,
15563 },
15564
15565 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
15566 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015567 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015568 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015569 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015570 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015571 .total_size = 128,
15572 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015573 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000015574 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015575 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015576 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015577 .block_erasers =
15578 {
15579 {
15580 .eraseblocks = { {128 * 1024, 1} },
15581 .block_erase = erase_chip_block_jedec,
15582 }
15583 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015584 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015585 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000015586 },
15587
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015588 {
15589 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015590 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015591 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015592 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015593 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015594 .total_size = 256,
15595 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000015596 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015597 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015598 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015599 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015600 .block_erasers =
15601 {
15602 {
15603 .eraseblocks = { {256 * 1024, 1} },
15604 .block_erase = erase_chip_block_jedec,
15605 }
15606 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015607 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015608 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015609 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015610 },
15611
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015612 {
15613 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000015614 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015615 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015616 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015617 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015618 .total_size = 512,
15619 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000015620 .feature_bits = FEATURE_LONG_RESET,
15621 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015622 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015623 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015624 .block_erasers =
15625 {
15626 {
15627 .eraseblocks = { {512 * 1024, 1} },
15628 .block_erase = erase_chip_block_jedec,
15629 }
15630 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015631 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015632 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015633 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015634 },
15635
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015636 {
15637 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000015638 .name = "W29GL032CB",
15639 .bustype = BUS_PARALLEL,
15640 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15641 .model_id = WINBOND_W29GL032CB,
15642 .total_size = 4096,
15643 .page_size = 128 * 1024, /* actual page size is 16 */
15644 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15645 .tested = TEST_UNTESTED,
15646 .probe = probe_jedec_29gl,
15647 .probe_timing = TIMING_ZERO,
15648 .block_erasers =
15649 {
15650 {
15651 .eraseblocks = {
15652 {8 * 1024, 8},
15653 {64 * 1024, 63},
15654 },
15655 .block_erase = erase_sector_jedec,
15656 }, {
15657 .eraseblocks = { {4 * 1024 * 1024, 1} },
15658 .block_erase = erase_chip_block_jedec,
15659 },
15660 },
15661 .write = write_jedec_1,
15662 .read = read_memmapped,
15663 .voltage = {2700, 3600},
15664 },
15665
15666 {
15667 .vendor = "Winbond",
15668 .name = "W29GL032CT",
15669 .bustype = BUS_PARALLEL,
15670 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15671 .model_id = WINBOND_W29GL032CT,
15672 .total_size = 4096,
15673 .page_size = 128 * 1024, /* actual page size is 16 */
15674 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15675 .tested = TEST_UNTESTED,
15676 .probe = probe_jedec_29gl,
15677 .probe_timing = TIMING_ZERO,
15678 .block_erasers =
15679 {
15680 {
15681 .eraseblocks = {
15682 {64 * 1024, 63},
15683 {8 * 1024, 8},
15684 },
15685 .block_erase = erase_sector_jedec,
15686 }, {
15687 .eraseblocks = { {4 * 1024 * 1024, 1} },
15688 .block_erase = erase_chip_block_jedec,
15689 },
15690 },
15691 .write = write_jedec_1,
15692 .read = read_memmapped,
15693 .voltage = {2700, 3600},
15694 },
15695
15696 {
15697 .vendor = "Winbond",
15698 .name = "W29GL032CH/L",
15699 .bustype = BUS_PARALLEL,
15700 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15701 .model_id = WINBOND_W29GL032CHL,
15702 .total_size = 4096,
15703 .page_size = 128 * 1024, /* actual page size is 16 */
15704 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15705 .tested = TEST_UNTESTED,
15706 .probe = probe_jedec_29gl,
15707 .probe_timing = TIMING_ZERO,
15708 .block_erasers =
15709 {
15710 {
15711 .eraseblocks = { {64 * 1024, 64} },
15712 .block_erase = erase_sector_jedec,
15713 }, {
15714 .eraseblocks = { {4 * 1024 * 1024, 1} },
15715 .block_erase = erase_chip_block_jedec,
15716 },
15717 },
15718 .write = write_jedec_1,
15719 .read = read_memmapped,
15720 .voltage = {2700, 3600},
15721 },
15722
15723 {
15724 .vendor = "Winbond",
15725 .name = "W29GL064CB",
15726 .bustype = BUS_PARALLEL,
15727 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15728 .model_id = WINBOND_W29GL064CB,
15729 .total_size = 8192,
15730 .page_size = 128 * 1024, /* actual page size is 16 */
15731 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15732 .tested = TEST_UNTESTED,
15733 .probe = probe_jedec_29gl,
15734 .probe_timing = TIMING_ZERO,
15735 .block_erasers =
15736 {
15737 {
15738 .eraseblocks = {
15739 {8 * 1024, 8},
15740 {64 * 1024, 127},
15741 },
15742 .block_erase = erase_sector_jedec,
15743 }, {
15744 .eraseblocks = { {8 * 1024 * 1024, 1} },
15745 .block_erase = erase_chip_block_jedec,
15746 },
15747 },
15748 .write = write_jedec_1,
15749 .read = read_memmapped,
15750 .voltage = {2700, 3600},
15751 },
15752
15753 {
15754 .vendor = "Winbond",
15755 .name = "W29GL064CT",
15756 .bustype = BUS_PARALLEL,
15757 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15758 .model_id = WINBOND_W29GL064CT,
15759 .total_size = 8192,
15760 .page_size = 128 * 1024, /* actual page size is 16 */
15761 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15762 .tested = TEST_UNTESTED,
15763 .probe = probe_jedec_29gl,
15764 .probe_timing = TIMING_ZERO,
15765 .block_erasers =
15766 {
15767 {
15768 .eraseblocks = {
15769 {64 * 1024, 127},
15770 {8 * 1024, 8},
15771 },
15772 .block_erase = erase_sector_jedec,
15773 }, {
15774 .eraseblocks = { {8 * 1024 * 1024, 1} },
15775 .block_erase = erase_chip_block_jedec,
15776 },
15777 },
15778 .write = write_jedec_1,
15779 .read = read_memmapped,
15780 .voltage = {2700, 3600},
15781 },
15782
15783 {
15784 .vendor = "Winbond",
15785 .name = "W29GL064CH/L",
15786 .bustype = BUS_PARALLEL,
15787 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15788 .model_id = WINBOND_W29GL064CHL,
15789 .total_size = 8192,
15790 .page_size = 128 * 1024, /* actual page size is 16 */
15791 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15792 .tested = TEST_UNTESTED,
15793 .probe = probe_jedec_29gl,
15794 .probe_timing = TIMING_ZERO,
15795 .block_erasers =
15796 {
15797 {
15798 .eraseblocks = { {64 * 1024, 128} },
15799 .block_erase = erase_sector_jedec,
15800 }, {
15801 .eraseblocks = { {8 * 1024 * 1024, 1} },
15802 .block_erase = erase_chip_block_jedec,
15803 },
15804 },
15805 .write = write_jedec_1,
15806 .read = read_memmapped,
15807 .voltage = {2700, 3600},
15808 },
15809
15810 {
15811 .vendor = "Winbond",
15812 .name = "W29GL128C",
15813 .bustype = BUS_PARALLEL,
15814 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
15815 .model_id = WINBOND_W29GL128CHL,
15816 .total_size = 16384,
15817 .page_size = 128 * 1024, /* actual page size is 16 */
15818 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
15819 .tested = TEST_UNTESTED,
15820 .probe = probe_jedec_29gl,
15821 .probe_timing = TIMING_ZERO,
15822 .block_erasers =
15823 {
15824 {
15825 .eraseblocks = { {128 * 1024, 128} },
15826 .block_erase = erase_sector_jedec,
15827 }, {
15828 .eraseblocks = { {16 * 1024 * 1024, 1} },
15829 .block_erase = erase_chip_block_jedec,
15830 },
15831 },
15832 .write = write_jedec_1,
15833 .read = read_memmapped,
15834 .voltage = {2700, 3600},
15835 },
15836
15837 {
15838 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000015839 .name = "W39F010",
15840 .bustype = BUS_PARALLEL,
15841 .manufacture_id = WINBOND_ID,
15842 .model_id = WINBOND_W39F010,
15843 .total_size = 128,
15844 .page_size = 4 * 1024,
15845 .feature_bits = FEATURE_EITHER_RESET,
15846 .tested = TEST_OK_PREW,
15847 .probe = probe_jedec,
15848 .probe_timing = 10,
15849 .block_erasers =
15850 {
15851 {
15852 .eraseblocks = { {4 * 1024, 32} },
15853 .block_erase = erase_block_jedec,
15854 }, {
15855 .eraseblocks = { {128 * 1024, 1} },
15856 .block_erase = erase_chip_block_jedec,
15857 }
15858 },
15859 .printlock = printlock_w39f010,
15860 .write = write_jedec_1,
15861 .read = read_memmapped,
15862 .voltage = {4500, 5500},
15863 },
15864
15865 {
15866 .vendor = "Winbond",
15867 .name = "W39L010",
15868 .bustype = BUS_PARALLEL,
15869 .manufacture_id = WINBOND_ID,
15870 .model_id = WINBOND_W39L010,
15871 .total_size = 128,
15872 .page_size = 4 * 1024,
15873 .feature_bits = FEATURE_EITHER_RESET,
15874 .tested = TEST_UNTESTED,
15875 .probe = probe_jedec,
15876 .probe_timing = 10,
15877 .block_erasers =
15878 {
15879 {
15880 .eraseblocks = { {4 * 1024, 32} },
15881 .block_erase = erase_block_jedec,
15882 }, {
15883 .eraseblocks = { {128 * 1024, 1} },
15884 .block_erase = erase_chip_block_jedec,
15885 }
15886 },
15887 .printlock = printlock_w39l010,
15888 .write = write_jedec_1,
15889 .read = read_memmapped,
15890 .voltage = {3000, 3600},
15891 },
15892
15893 {
15894 .vendor = "Winbond",
15895 .name = "W39L020",
15896 .bustype = BUS_PARALLEL,
15897 .manufacture_id = WINBOND_ID,
15898 .model_id = WINBOND_W39L020,
15899 .total_size = 256,
15900 .page_size = 4 * 1024,
15901 .feature_bits = FEATURE_EITHER_RESET,
15902 .tested = TEST_UNTESTED,
15903 .probe = probe_jedec,
15904 .probe_timing = 10,
15905 .block_erasers =
15906 {
15907 {
15908 .eraseblocks = { {4 * 1024, 64} },
15909 .block_erase = erase_block_jedec,
15910 }, {
15911 .eraseblocks = { {64 * 1024, 4} },
15912 .block_erase = erase_sector_jedec,
15913 }, {
15914 .eraseblocks = { {256 * 1024, 1} },
15915 .block_erase = erase_chip_block_jedec,
15916 }
15917 },
15918 .printlock = printlock_w39l020,
15919 .write = write_jedec_1,
15920 .read = read_memmapped,
15921 .voltage = {3000, 3600},
15922 },
15923
15924 {
15925 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000015926 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015927 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000015928 .manufacture_id = WINBOND_ID,
15929 .model_id = WINBOND_W39L040,
15930 .total_size = 512,
15931 .page_size = 64 * 1024,
15932 .feature_bits = FEATURE_EITHER_RESET,
15933 .tested = TEST_OK_PR,
15934 .probe = probe_jedec,
15935 .probe_timing = 10,
15936 .block_erasers =
15937 {
15938 {
15939 .eraseblocks = { {4 * 1024, 128} },
15940 .block_erase = erase_block_jedec,
15941 }, {
15942 .eraseblocks = { {64 * 1024, 8} },
15943 .block_erase = erase_sector_jedec,
15944 }, {
15945 .eraseblocks = { {512 * 1024, 1} },
15946 .block_erase = erase_chip_block_jedec,
15947 }
15948 },
15949 .printlock = printlock_w39l040,
15950 .write = write_jedec_1,
15951 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015952 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000015953 },
15954
15955 {
15956 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015957 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015958 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015959 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015960 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015961 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000015962 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015963 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000015964 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015965 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000015966 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015967 .block_erasers =
15968 {
15969 {
15970 .eraseblocks = { {64 * 1024, 8} },
15971 .block_erase = erase_sector_jedec,
15972 }, {
15973 .eraseblocks = { {512 * 1024, 1} },
15974 .block_erase = erase_chip_block_jedec,
15975 }
15976 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000015977 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000015978 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015979 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015980 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015981 },
15982
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015983 {
15984 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000015985 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015986 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015987 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000015988 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015989 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000015990 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015991 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015992 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015993 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000015994 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000015995 .block_erasers =
15996 {
15997 {
15998 .eraseblocks = { {64 * 1024, 8} },
15999 .block_erase = erase_sector_jedec,
16000 }, {
16001 .eraseblocks = { {512 * 1024, 1} },
16002 .block_erase = erase_chip_block_jedec,
16003 }
16004 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016005 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000016006 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016007 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016008 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016009 },
16010
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016011 {
16012 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016013 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016014 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016015 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016016 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016017 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016018 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016019 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016020 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000016021 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016022 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016023 .block_erasers =
16024 {
16025 {
16026 .eraseblocks = { {64 * 1024, 8} },
16027 .block_erase = erase_sector_jedec,
16028 }, {
16029 .eraseblocks = { {512 * 1024, 1} },
16030 .block_erase = erase_chip_block_jedec,
16031 }
16032 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000016033 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000016034 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016035 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016036 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016037 },
16038
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016039 {
16040 .vendor = "Winbond",
16041 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016042 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016043 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016044 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016045 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016046 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000016047 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016048 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016049 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000016050 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016051 .block_erasers =
16052 {
16053 {
16054 .eraseblocks = { {4 * 1024, 128} },
16055 .block_erase = erase_block_jedec,
16056 }, {
16057 .eraseblocks = { {64 * 1024, 8} },
16058 .block_erase = erase_sector_jedec,
16059 }, {
16060 .eraseblocks = { {512 * 1024, 1} },
16061 .block_erase = erase_chip_block_jedec,
16062 }
16063 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016064 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016065 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000016066 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016067 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016068 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016069 },
16070
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016071 {
16072 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016073 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016074 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016075 .manufacture_id = WINBOND_ID,
16076 .model_id = WINBOND_W39V040B,
16077 .total_size = 512,
16078 .page_size = 64 * 1024,
16079 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000016080 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016081 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016082 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016083 .block_erasers =
16084 {
16085 {
16086 .eraseblocks = { {64 * 1024, 8} },
16087 .block_erase = erase_sector_jedec,
16088 }, {
16089 .eraseblocks = { {512 * 1024, 1} },
16090 .block_erase = erase_chip_block_jedec,
16091 }
16092 },
16093 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016094 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016095 .write = write_jedec_1,
16096 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016097 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016098 },
16099
16100 {
16101 .vendor = "Winbond",
16102 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016103 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016104 .manufacture_id = WINBOND_ID,
16105 .model_id = WINBOND_W39V040C,
16106 .total_size = 512,
16107 .page_size = 64 * 1024,
16108 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000016109 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016110 .probe = probe_jedec,
16111 .probe_timing = 10,
16112 .block_erasers =
16113 {
16114 {
16115 .eraseblocks = { {64 * 1024, 8} },
16116 .block_erase = erase_sector_jedec,
16117 }, {
16118 .eraseblocks = { {512 * 1024, 1} },
16119 .block_erase = erase_chip_block_jedec,
16120 }
16121 },
16122 .printlock = printlock_w39v040fc,
16123 .write = write_jedec_1,
16124 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016125 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016126 },
16127
16128 {
16129 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016130 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016131 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016132 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016133 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016134 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000016135 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016136 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000016137 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016138 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000016139 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016140 .block_erasers =
16141 {
16142 {
16143 .eraseblocks = { {64 * 1024, 16} },
16144 .block_erase = erase_sector_jedec,
16145 }, {
16146 .eraseblocks = { {1024 * 1024, 1} },
16147 .block_erase = erase_chip_block_jedec,
16148 }
16149 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016150 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000016151 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016152 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016153 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016154 },
16155
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016156 {
16157 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000016158 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016159 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016160 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016161 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016162 .total_size = 256,
16163 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016164 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000016165 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016166 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016167 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016168 .block_erasers =
16169 {
16170 {
16171 .eraseblocks = {
16172 {128 * 1024, 1},
16173 {96 * 1024, 1},
16174 {8 * 1024, 2},
16175 {16 * 1024, 1},
16176 },
16177 .block_erase = erase_sector_jedec,
16178 }, {
16179 .eraseblocks = { {256 * 1024, 1} },
16180 .block_erase = erase_chip_block_jedec,
16181 }
16182 },
Sean Nelson35727f72010-01-28 23:55:12 +000016183 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016184 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016185 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016186 },
16187
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016188 {
16189 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016190 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016191 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016192 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016193 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016194 .total_size = 256,
16195 .page_size = 128,
16196 .feature_bits = FEATURE_EITHER_RESET,
16197 .tested = TEST_OK_PROBE,
16198 .probe = probe_jedec,
16199 .probe_timing = 10,
16200 .block_erasers =
16201 {
16202 {
16203 .eraseblocks = { {256 * 1024, 1} },
16204 .block_erase = erase_chip_block_jedec,
16205 }
16206 },
16207 .write = write_jedec_1,
16208 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016209 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000016210 },
16211
16212 {
16213 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016214 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016215 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016216 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016217 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016218 .total_size = 256,
16219 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016220 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016221 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016222 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000016223 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016224 .block_erasers =
16225 {
16226 {
16227 .eraseblocks = {
16228 {64 * 1024, 3},
16229 {32 * 1024, 1},
16230 {8 * 1024, 2},
16231 {16 * 1024, 1},
16232 },
16233 .block_erase = erase_sector_jedec,
16234 }, {
16235 .eraseblocks = { {256 * 1024, 1} },
16236 .block_erase = erase_chip_block_jedec,
16237 }
16238 },
Sean Nelson35727f72010-01-28 23:55:12 +000016239 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016240 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016241 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016242 },
16243
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016244 {
16245 .vendor = "Winbond",
16246 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016247 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016248 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016249 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016250 .total_size = 256,
16251 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000016252 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000016253 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016254 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016255 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016256 .block_erasers =
16257 {
16258 {
16259 .eraseblocks = {
16260 {64 * 1024, 3},
16261 {32 * 1024, 1},
16262 {8 * 1024, 2},
16263 {16 * 1024, 1},
16264 },
16265 .block_erase = erase_sector_jedec,
16266 }, {
16267 .eraseblocks = { {256 * 1024, 1} },
16268 .block_erase = erase_chip_block_jedec,
16269 }
16270 },
Sean Nelson35727f72010-01-28 23:55:12 +000016271 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016272 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016273 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016274 },
16275
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016276 {
16277 .vendor = "Winbond",
16278 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016279 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016280 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016281 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016282 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000016283 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016284 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000016285 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000016286 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016287 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016288 .block_erasers =
16289 {
16290 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016291 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016292 .block_erase = erase_sector_jedec,
16293 }, {
16294 .eraseblocks = { {1024 * 1024, 1} },
16295 .block_erase = erase_chip_block_jedec,
16296 }
16297 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016298 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016299 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000016300 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016301 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016302 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000016303 },
16304
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016305 {
16306 .vendor = "Winbond",
16307 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016308 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016309 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000016310 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016311 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000016312 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016313 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016314 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000016315 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016316 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016317 .block_erasers =
16318 {
16319 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016320 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000016321 .block_erase = erase_sector_jedec,
16322 }, {
16323 .eraseblocks = { {512 * 1024, 1} },
16324 .block_erase = erase_chip_block_jedec,
16325 }
16326 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000016327 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000016328 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016329 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000016330 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000016331 },
nybashcbb46e22018-02-11 17:53:49 -080016332
16333 {
16334 .vendor = "Zetta Device",
David Hendricksa72d5a92018-02-11 17:58:44 -080016335 .name = "ZD25D20",
16336 .bustype = BUS_SPI,
16337 .manufacture_id = ZETTADEVICE_ID,
16338 .model_id = ZETTADEVICE_ZD25D20,
16339 .total_size = 256,
16340 .page_size = 256,
16341 .feature_bits = FEATURE_WRSR_WREN,
16342 .tested = TEST_UNTESTED,
16343 .probe = probe_spi_rdid,
16344 .probe_timing = TIMING_ZERO,
16345 .block_erasers =
16346 {
16347 {
16348 .eraseblocks = { {4 * 1024, 64} },
16349 .block_erase = spi_block_erase_20,
16350 }, {
16351 .eraseblocks = { {32 * 1024, 8} },
16352 .block_erase = spi_block_erase_52,
16353 }, {
16354 .eraseblocks = { {64 * 1024, 4} },
16355 .block_erase = spi_block_erase_d8,
16356 }, {
16357 .eraseblocks = { {256 * 1024, 1} },
16358 .block_erase = spi_block_erase_60,
16359 }, {
16360 .eraseblocks = { {256 * 1024, 1} },
16361 .block_erase = spi_block_erase_c7,
16362 }
16363 },
16364 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16365 .unlock = spi_disable_blockprotect,
16366 .write = spi_chip_write_256,
16367 .read = spi_chip_read,
16368 .voltage = {2700, 3600},
16369 },
16370
16371 {
16372 .vendor = "Zetta Device",
nybashcbb46e22018-02-11 17:53:49 -080016373 .name = "ZD25D40",
16374 .bustype = BUS_SPI,
16375 .manufacture_id = ZETTADEVICE_ID,
16376 .model_id = ZETTADEVICE_ZD25D40,
16377 .total_size = 512,
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, 128} },
16387 .block_erase = spi_block_erase_20,
16388 }, {
16389 .eraseblocks = { {32 * 1024, 16} },
16390 .block_erase = spi_block_erase_52,
16391 }, {
16392 .eraseblocks = { {64 * 1024, 8} },
16393 .block_erase = spi_block_erase_d8,
16394 }, {
16395 .eraseblocks = { {512 * 1024, 1} },
16396 .block_erase = spi_block_erase_60,
16397 }, {
16398 .eraseblocks = { {512 * 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
Stefan Taunerac1b4c82012-02-17 14:51:04 +000016409 {
16410 .vendor = "Unknown",
16411 .name = "SFDP-capable chip",
16412 .bustype = BUS_SPI,
16413 .manufacture_id = GENERIC_MANUF_ID,
16414 .model_id = SFDP_DEVICE_ID,
16415 /* We present our own "report this" text hence we do not
16416 * want the default "This flash part has status UNTESTED..."
16417 * text to be printed. */
16418 .tested = TEST_OK_PREW,
16419 .probe = probe_spi_sfdp,
16420 .unlock = spi_disable_blockprotect, /* is this safe? */
16421 .read = spi_chip_read,
16422 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000016423 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000016424 /* Everything below will be set by the probing function. */
16425 .write = NULL,
16426 .total_size = 0,
16427 .page_size = 0,
16428 .feature_bits = 0,
16429 .block_erasers = {},
16430 },
FENG yu ningff692fb2008-12-08 18:15:10 +000016431
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016432 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000016433 .vendor = "Programmer",
16434 .name = "Opaque flash chip",
16435 .bustype = BUS_PROG,
16436 .manufacture_id = PROGMANUF_ID,
16437 .model_id = PROGDEV_ID,
16438 .total_size = 0,
16439 .page_size = 256,
16440 /* probe is assumed to work, rest will be filled in by probe */
16441 .tested = TEST_OK_PROBE,
16442 .probe = probe_opaque,
16443 /* eraseblock sizes will be set by the probing function */
16444 .block_erasers =
16445 {
16446 {
16447 .block_erase = erase_opaque,
16448 }
16449 },
16450 .write = write_opaque,
16451 .read = read_opaque,
16452 },
16453
16454 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000016455 .vendor = "AMIC",
16456 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016457 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000016458 .manufacture_id = AMIC_ID,
16459 .model_id = GENERIC_DEVICE_ID,
16460 .total_size = 0,
16461 .page_size = 256,
16462 .tested = TEST_BAD_PREW,
16463 .probe = probe_spi_rdid4,
16464 .probe_timing = TIMING_ZERO,
16465 .write = NULL,
16466 .read = NULL,
16467 },
16468
16469 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016470 .vendor = "Atmel",
16471 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016472 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016473 .manufacture_id = ATMEL_ID,
16474 .model_id = GENERIC_DEVICE_ID,
16475 .total_size = 0,
16476 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016477 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016478 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016479 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016480 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016481 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016482 },
16483
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016484 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000016485 .vendor = "Eon",
16486 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016487 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016488 .manufacture_id = EON_ID_NOPREFIX,
16489 .model_id = GENERIC_DEVICE_ID,
16490 .total_size = 0,
16491 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016492 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016493 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016494 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016495 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016496 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016497 },
16498
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016499 {
16500 .vendor = "Macronix",
16501 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016502 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000016503 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016504 .model_id = GENERIC_DEVICE_ID,
16505 .total_size = 0,
16506 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016507 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016508 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016509 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016510 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016511 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016512 },
16513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016514 {
16515 .vendor = "PMC",
16516 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016517 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016518 .manufacture_id = PMC_ID,
16519 .model_id = GENERIC_DEVICE_ID,
16520 .total_size = 0,
16521 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016522 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016523 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016524 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016525 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016526 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016527 },
16528
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016529 {
16530 .vendor = "SST",
16531 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016532 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016533 .manufacture_id = SST_ID,
16534 .model_id = GENERIC_DEVICE_ID,
16535 .total_size = 0,
16536 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016537 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016538 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016539 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016540 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016541 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016542 },
16543
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016544 {
16545 .vendor = "ST",
16546 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016547 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016548 .manufacture_id = ST_ID,
16549 .model_id = GENERIC_DEVICE_ID,
16550 .total_size = 0,
16551 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000016552 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016553 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000016554 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016555 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016556 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000016557 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000016558
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016559 {
Sean Nelson118e1d62009-11-24 02:08:11 +000016560 .vendor = "Sanyo",
16561 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016562 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000016563 .manufacture_id = SANYO_ID,
16564 .model_id = GENERIC_DEVICE_ID,
16565 .total_size = 0,
16566 .page_size = 256,
16567 .tested = TEST_BAD_PREW,
16568 .probe = probe_spi_rdid,
16569 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000016570 .write = NULL,
16571 .read = NULL,
16572 },
16573
16574 {
Stefan Taunereb582572012-09-21 12:52:50 +000016575 .vendor = "Winbond",
16576 .name = "unknown Winbond (ex Nexcom) SPI chip",
16577 .bustype = BUS_SPI,
16578 .manufacture_id = WINBOND_NEX_ID,
16579 .model_id = GENERIC_DEVICE_ID,
16580 .total_size = 0,
16581 .page_size = 256,
16582 .tested = TEST_BAD_PREW,
16583 .probe = probe_spi_rdid,
16584 .probe_timing = TIMING_ZERO,
16585 .write = NULL,
16586 .read = NULL,
16587 },
16588
16589 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016590 .vendor = "Generic",
16591 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016592 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016593 .manufacture_id = GENERIC_MANUF_ID,
16594 .model_id = GENERIC_DEVICE_ID,
16595 .total_size = 0,
16596 .page_size = 256,
16597 .tested = TEST_BAD_PREW,
16598 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016599 .write = NULL,
16600 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000016601
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016602 {
16603 .vendor = "Generic",
16604 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016605 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016606 .manufacture_id = GENERIC_MANUF_ID,
16607 .model_id = GENERIC_DEVICE_ID,
16608 .total_size = 0,
16609 .page_size = 256,
16610 .tested = TEST_BAD_PREW,
16611 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000016612 .write = NULL,
16613 },
16614
Stefan Tauner96658be2014-05-26 22:05:31 +000016615 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000016616};
Stefan Tauner96658be2014-05-26 22:05:31 +000016617
16618const unsigned int flashchips_size = ARRAY_SIZE(flashchips);