blob: 8b5d1ecdc0899cdf0bb96489d99c132ea69281ee [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",
Uwe Hermanna8b37272009-06-19 15:54:39 +000062 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000064 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000065 .model_id = AMD_AM29F010B, /* Same as Am29F010A */
Uwe Hermanna8b37272009-06-19 15:54:39 +000066 .total_size = 128,
67 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000068 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000069 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000070 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000071 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000072 .block_erasers =
73 {
74 {
75 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000076 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000077 }, {
78 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000079 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000080 },
81 },
Sean Nelson35727f72010-01-28 23:55:12 +000082 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +000083 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000084 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +000085 },
86
87 {
88 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000089 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000090 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000091 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000092 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000093 .total_size = 256,
94 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000095 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000096 .tested = TEST_UNTESTED,
97 .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 = {
103 {16 * 1024, 1},
104 {8 * 1024, 2},
105 {32 * 1024, 1},
106 {64 * 1024, 3},
107 },
108 .block_erase = erase_sector_jedec,
109 }, {
110 .eraseblocks = { {256 * 1024, 1} },
111 .block_erase = erase_chip_block_jedec,
112 },
113 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000114 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000115 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000116 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000117 },
118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000119 {
120 .vendor = "AMD",
121 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000122 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000124 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000125 .total_size = 256,
126 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000127 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000129 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000130 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000131 .block_erasers =
132 {
133 {
134 .eraseblocks = {
135 {64 * 1024, 3},
136 {32 * 1024, 1},
137 {8 * 1024, 2},
138 {16 * 1024, 1},
139 },
140 .block_erase = erase_sector_jedec,
141 }, {
142 .eraseblocks = { {256 * 1024, 1} },
143 .block_erase = erase_chip_block_jedec,
144 },
145 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000146 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000147 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000148 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000149 },
150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000151 {
152 .vendor = "AMD",
153 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000154 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000155 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000156 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000157 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000158 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000159 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000160 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000161 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000162 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000163 .block_erasers =
164 {
165 {
166 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000167 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000168 }, {
169 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000170 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000171 },
172 },
Sean Nelson35727f72010-01-28 23:55:12 +0000173 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000175 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000176 },
177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 {
179 .vendor = "AMD",
180 .name = "Am29F040B",
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_AM29F040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000184 .total_size = 512,
185 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187 .tested = TEST_UNTESTED,
188 .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, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000195 }, {
196 .eraseblocks = { {512 * 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",
Peter Stuge8440cc02009-01-25 23:55:12 +0000207 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000208 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000209 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000210 .model_id = AMD_AM29F080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000211 .total_size = 1024,
212 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000213 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000216 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000217 .block_erasers =
218 {
219 {
220 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000221 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000222 }, {
223 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000224 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000225 },
226 },
Sean Nelson35727f72010-01-28 23:55:12 +0000227 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000229 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000230 },
231
232 {
233 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000234 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000235 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000236 .manufacture_id = AMD_ID,
237 .model_id = AMD_AM29LV001BB,
238 .total_size = 128,
239 .page_size = 64 * 1024, /* unused */
240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_OK_PREW,
242 .probe = probe_jedec,
243 .probe_timing = TIMING_ZERO,
244 .block_erasers =
245 {
246 {
247 .eraseblocks = {
248 {8 * 1024, 1},
249 {4 * 1024, 2},
250 {16 * 1024, 7},
251 },
252 .block_erase = erase_sector_jedec,
253 }, {
254 .eraseblocks = { {128 * 1024, 1} },
255 .block_erase = erase_chip_block_jedec,
256 },
257 },
258 .write = write_jedec_1,
259 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000260 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000261 },
262
263 {
264 .vendor = "AMD",
265 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000266 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000267 .manufacture_id = AMD_ID,
268 .model_id = AMD_AM29LV001BT,
269 .total_size = 128,
270 .page_size = 64 * 1024, /* unused */
271 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272 .tested = TEST_UNTESTED,
273 .probe = probe_jedec,
274 .probe_timing = TIMING_ZERO,
275 .block_erasers =
276 {
277 {
278 .eraseblocks = {
279 {16 * 1024, 7},
280 {4 * 1024, 2},
281 {8 * 1024, 1},
282 },
283 .block_erase = erase_sector_jedec,
284 }, {
285 .eraseblocks = { {128 * 1024, 1} },
286 .block_erase = erase_chip_block_jedec,
287 },
288 },
289 .write = write_jedec_1,
290 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000291 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000292 },
293
294 {
295 .vendor = "AMD",
296 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000297 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000298 .manufacture_id = AMD_ID,
299 .model_id = AMD_AM29LV002BB,
300 .total_size = 256,
301 .page_size = 64 * 1024, /* unused */
302 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303 .tested = TEST_UNTESTED,
304 .probe = probe_jedec,
305 .probe_timing = TIMING_ZERO,
306 .block_erasers =
307 {
308 {
309 .eraseblocks = {
310 {16 * 1024, 1},
311 {8 * 1024, 2},
312 {32 * 1024, 1},
313 {64 * 1024, 3},
314 },
315 .block_erase = erase_sector_jedec,
316 }, {
317 .eraseblocks = { {256 * 1024, 1} },
318 .block_erase = erase_chip_block_jedec,
319 },
320 },
321 .write = write_jedec_1,
322 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000323 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000324 },
325
326 {
327 .vendor = "AMD",
328 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000329 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000330 .manufacture_id = AMD_ID,
331 .model_id = AMD_AM29LV002BT,
332 .total_size = 256,
333 .page_size = 64 * 1024, /* unused */
334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335 .tested = TEST_UNTESTED,
336 .probe = probe_jedec,
337 .probe_timing = TIMING_ZERO,
338 .block_erasers =
339 {
340 {
341 .eraseblocks = {
342 {64 * 1024, 3},
343 {32 * 1024, 1},
344 {8 * 1024, 2},
345 {16 * 1024, 1},
346 },
347 .block_erase = erase_sector_jedec,
348 }, {
349 .eraseblocks = { {256 * 1024, 1} },
350 .block_erase = erase_chip_block_jedec,
351 },
352 },
353 .write = write_jedec_1,
354 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000355 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000356 },
357
358 {
359 .vendor = "AMD",
360 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000361 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000362 .manufacture_id = AMD_ID,
363 .model_id = AMD_AM29LV004BB,
364 .total_size = 512,
365 .page_size = 64 * 1024, /* unused */
366 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367 .tested = TEST_UNTESTED,
368 .probe = probe_jedec,
369 .probe_timing = TIMING_ZERO,
370 .block_erasers =
371 {
372 {
373 .eraseblocks = {
374 {16 * 1024, 1},
375 {8 * 1024, 2},
376 {32 * 1024, 1},
377 {64 * 1024, 7},
378 },
379 .block_erase = erase_sector_jedec,
380 }, {
381 .eraseblocks = { {512 * 1024, 1} },
382 .block_erase = erase_chip_block_jedec,
383 },
384 },
385 .write = write_jedec_1,
386 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000387 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000388 },
389
390 {
391 .vendor = "AMD",
392 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000393 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000394 .manufacture_id = AMD_ID,
395 .model_id = AMD_AM29LV004BT,
396 .total_size = 512,
397 .page_size = 64 * 1024, /* unused */
398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399 .tested = TEST_UNTESTED,
400 .probe = probe_jedec,
401 .probe_timing = TIMING_ZERO,
402 .block_erasers =
403 {
404 {
405 .eraseblocks = {
406 {64 * 1024, 7},
407 {32 * 1024, 1},
408 {8 * 1024, 2},
409 {16 * 1024, 1},
410 },
411 .block_erase = erase_sector_jedec,
412 }, {
413 .eraseblocks = { {512 * 1024, 1} },
414 .block_erase = erase_chip_block_jedec,
415 },
416 },
417 .write = write_jedec_1,
418 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000419 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000420 },
421
422 {
423 .vendor = "AMD",
424 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000425 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000426 .manufacture_id = AMD_ID,
427 .model_id = AMD_AM29LV008BB,
428 .total_size = 1024,
429 .page_size = 64 * 1024, /* unused */
430 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000431 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000432 .probe = probe_jedec,
433 .probe_timing = TIMING_ZERO,
434 .block_erasers =
435 {
436 {
437 .eraseblocks = {
438 {16 * 1024, 1},
439 {8 * 1024, 2},
440 {32 * 1024, 1},
441 {64 * 1024, 15},
442 },
443 .block_erase = erase_sector_jedec,
444 }, {
445 .eraseblocks = { {1024 * 1024, 1} },
446 .block_erase = erase_chip_block_jedec,
447 },
448 },
449 .write = write_jedec_1,
450 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000451 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000452 },
453
454 {
455 .vendor = "AMD",
456 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000457 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000458 .manufacture_id = AMD_ID,
459 .model_id = AMD_AM29LV008BT,
460 .total_size = 1024,
461 .page_size = 64 * 1024, /* unused */
462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463 .tested = TEST_UNTESTED,
464 .probe = probe_jedec,
465 .probe_timing = TIMING_ZERO,
466 .block_erasers =
467 {
468 {
469 .eraseblocks = {
470 {64 * 1024, 15},
471 {32 * 1024, 1},
472 {8 * 1024, 2},
473 {16 * 1024, 1},
474 },
475 .block_erase = erase_sector_jedec,
476 }, {
477 .eraseblocks = { {1024 * 1024, 1} },
478 .block_erase = erase_chip_block_jedec,
479 },
480 },
481 .write = write_jedec_1,
482 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000483 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000484 },
485
486 {
487 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000488 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000489 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000490 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000491 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000492 .total_size = 512,
493 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000495 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000496 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000497 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000498 .block_erasers =
499 {
500 {
501 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000502 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000503 }, {
504 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000505 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000506 },
507 },
Sean Nelson35727f72010-01-28 23:55:12 +0000508 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000509 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000510 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000511 },
512
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000513 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000514 .vendor = "AMD",
515 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000516 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000517 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000518 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000519 .total_size = 1024,
520 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000522 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000523 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000524 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000525 .block_erasers =
526 {
527 {
528 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000529 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000530 }, {
531 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000532 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000533 },
534 },
Sean Nelson35727f72010-01-28 23:55:12 +0000535 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000536 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000537 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000538 },
539
540 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000541 .vendor = "AMIC",
542 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000543 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000544 .manufacture_id = AMIC_ID,
545 .model_id = AMIC_A25L05PT,
546 .total_size = 64,
547 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000548 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000549 .tested = TEST_UNTESTED,
550 .probe = probe_spi_rdid4,
551 .probe_timing = TIMING_ZERO,
552 .block_erasers =
553 {
554 {
555 .eraseblocks = {
556 {32 * 1024, 1},
557 {16 * 1024, 1},
558 {8 * 1024, 1},
559 {4 * 1024, 2},
560 },
561 .block_erase = spi_block_erase_d8,
562 }, {
563 .eraseblocks = { {64 * 1024, 1} },
564 .block_erase = spi_block_erase_c7,
565 }
566 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000567 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000568 .unlock = spi_disable_blockprotect,
569 .write = spi_chip_write_256,
570 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000571 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000572 },
573
574 {
575 .vendor = "AMIC",
576 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000577 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000578 .manufacture_id = AMIC_ID,
579 .model_id = AMIC_A25L05PU,
580 .total_size = 64,
581 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000582 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000583 .tested = TEST_UNTESTED,
584 .probe = probe_spi_rdid4,
585 .probe_timing = TIMING_ZERO,
586 .block_erasers =
587 {
588 {
589 .eraseblocks = {
590 {4 * 1024, 2},
591 {8 * 1024, 1},
592 {16 * 1024, 1},
593 {32 * 1024, 1},
594 },
595 .block_erase = spi_block_erase_d8,
596 }, {
597 .eraseblocks = { {64 * 1024, 1} },
598 .block_erase = spi_block_erase_c7,
599 }
600 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000601 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000602 .unlock = spi_disable_blockprotect,
603 .write = spi_chip_write_256,
604 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000605 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000606 },
607
608 {
609 .vendor = "AMIC",
610 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000611 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000612 .manufacture_id = AMIC_ID,
613 .model_id = AMIC_A25L10PT,
614 .total_size = 128,
615 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000616 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000617 .tested = TEST_UNTESTED,
618 .probe = probe_spi_rdid4,
619 .probe_timing = TIMING_ZERO,
620 .block_erasers =
621 {
622 {
623 .eraseblocks = {
624 {64 * 1024, 1},
625 {32 * 1024, 1},
626 {16 * 1024, 1},
627 {8 * 1024, 1},
628 {4 * 1024, 2},
629 },
630 .block_erase = spi_block_erase_d8,
631 }, {
632 .eraseblocks = { {128 * 1024, 1} },
633 .block_erase = spi_block_erase_c7,
634 }
635 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000636 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000637 .unlock = spi_disable_blockprotect,
638 .write = spi_chip_write_256,
639 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000640 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000641 },
642
643 {
644 .vendor = "AMIC",
645 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000646 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000647 .manufacture_id = AMIC_ID,
648 .model_id = AMIC_A25L10PU,
649 .total_size = 128,
650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000652 .tested = TEST_UNTESTED,
653 .probe = probe_spi_rdid4,
654 .probe_timing = TIMING_ZERO,
655 .block_erasers =
656 {
657 {
658 .eraseblocks = {
659 {4 * 1024, 2},
660 {8 * 1024, 1},
661 {16 * 1024, 1},
662 {32 * 1024, 1},
663 {64 * 1024, 1},
664 },
665 .block_erase = spi_block_erase_d8,
666 }, {
667 .eraseblocks = { {128 * 1024, 1} },
668 .block_erase = spi_block_erase_c7,
669 }
670 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000671 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000672 .unlock = spi_disable_blockprotect,
673 .write = spi_chip_write_256,
674 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000675 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000676 },
677
678 {
679 .vendor = "AMIC",
680 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000681 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000682 .manufacture_id = AMIC_ID,
683 .model_id = AMIC_A25L20PT,
684 .total_size = 256,
685 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000686 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000687 .tested = TEST_UNTESTED,
688 .probe = probe_spi_rdid4,
689 .probe_timing = TIMING_ZERO,
690 .block_erasers =
691 {
692 {
693 .eraseblocks = {
694 {64 * 1024, 3},
695 {32 * 1024, 1},
696 {16 * 1024, 1},
697 {8 * 1024, 1},
698 {4 * 1024, 2},
699 },
700 .block_erase = spi_block_erase_d8,
701 }, {
702 .eraseblocks = { {256 * 1024, 1} },
703 .block_erase = spi_block_erase_c7,
704 }
705 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000706 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000710 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000711 },
712
713 {
714 .vendor = "AMIC",
715 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000716 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000717 .manufacture_id = AMIC_ID,
718 .model_id = AMIC_A25L20PU,
719 .total_size = 256,
720 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000721 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000722 .tested = TEST_UNTESTED,
723 .probe = probe_spi_rdid4,
724 .probe_timing = TIMING_ZERO,
725 .block_erasers =
726 {
727 {
728 .eraseblocks = {
729 {4 * 1024, 2},
730 {8 * 1024, 1},
731 {16 * 1024, 1},
732 {32 * 1024, 1},
733 {64 * 1024, 3},
734 },
735 .block_erase = spi_block_erase_d8,
736 }, {
737 .eraseblocks = { {256 * 1024, 1} },
738 .block_erase = spi_block_erase_c7,
739 }
740 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000741 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000742 .unlock = spi_disable_blockprotect,
743 .write = spi_chip_write_256,
744 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000745 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000746 },
747
748 /* The A25L40P{T,U} chips are distinguished by their
749 * erase block layouts, but without any distinction in RDID.
750 * This inexplicable quirk was verified by Rudolf Marek
751 * and discussed on the flashrom mailing list on 2010-07-12.
752 */
753 {
754 .vendor = "AMIC",
755 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000756 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000757 .manufacture_id = AMIC_ID,
758 .model_id = AMIC_A25L40PT,
759 .total_size = 512,
760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000761 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000762 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000763 .probe = probe_spi_rdid4,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = {
769 {64 * 1024, 7},
770 {32 * 1024, 1},
771 {16 * 1024, 1},
772 {8 * 1024, 1},
773 {4 * 1024, 2},
774 },
775 .block_erase = spi_block_erase_d8,
776 }, {
777 .eraseblocks = { {512 * 1024, 1} },
778 .block_erase = spi_block_erase_c7,
779 }
780 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000781 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000782 .unlock = spi_disable_blockprotect,
783 .write = spi_chip_write_256,
784 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000785 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000786 },
787
788 {
789 .vendor = "AMIC",
790 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000792 .manufacture_id = AMIC_ID,
793 .model_id = AMIC_A25L40PU,
794 .total_size = 512,
795 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000796 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000797 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000798 .probe = probe_spi_rdid4,
799 .probe_timing = TIMING_ZERO,
800 .block_erasers =
801 {
802 {
803 .eraseblocks = {
804 {4 * 1024, 2},
805 {8 * 1024, 1},
806 {16 * 1024, 1},
807 {32 * 1024, 1},
808 {64 * 1024, 7},
809 },
810 .block_erase = spi_block_erase_d8,
811 }, {
812 .eraseblocks = { {512 * 1024, 1} },
813 .block_erase = spi_block_erase_c7,
814 }
815 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000816 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000817 .unlock = spi_disable_blockprotect,
818 .write = spi_chip_write_256,
819 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000820 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000821 },
822
823 {
824 .vendor = "AMIC",
825 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000826 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000827 .manufacture_id = AMIC_ID,
828 .model_id = AMIC_A25L80P,
829 .total_size = 1024,
830 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000831 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000832 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000833 .probe = probe_spi_rdid4,
834 .probe_timing = TIMING_ZERO,
835 .block_erasers =
836 {
837 {
838 .eraseblocks = {
839 {4 * 1024, 2},
840 {8 * 1024, 1},
841 {16 * 1024, 1},
842 {32 * 1024, 1},
843 {64 * 1024, 15},
844 },
845 .block_erase = spi_block_erase_d8,
846 }, {
847 .eraseblocks = { {1024 * 1024, 1} },
848 .block_erase = spi_block_erase_c7,
849 }
850 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000851 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000852 .unlock = spi_disable_blockprotect,
853 .write = spi_chip_write_256,
854 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000855 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000856 },
857
858 {
859 .vendor = "AMIC",
860 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000861 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000862 .manufacture_id = AMIC_ID,
863 .model_id = AMIC_A25L16PT,
864 .total_size = 2048,
865 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000866 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000867 .tested = TEST_UNTESTED,
868 .probe = probe_spi_rdid4,
869 .probe_timing = TIMING_ZERO,
870 .block_erasers =
871 {
872 {
873 .eraseblocks = {
874 {64 * 1024, 31},
875 {32 * 1024, 1},
876 {16 * 1024, 1},
877 {8 * 1024, 1},
878 {4 * 1024, 2},
879 },
880 .block_erase = spi_block_erase_d8,
881 }, {
882 .eraseblocks = { {2048 * 1024, 1} },
883 .block_erase = spi_block_erase_60,
884 }, {
885 .eraseblocks = { {2048 * 1024, 1} },
886 .block_erase = spi_block_erase_c7,
887 }
888 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000889 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000890 .unlock = spi_disable_blockprotect,
891 .write = spi_chip_write_256,
892 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000893 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000894 },
895
896 {
897 .vendor = "AMIC",
898 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000899 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000900 .manufacture_id = AMIC_ID,
901 .model_id = AMIC_A25L16PU,
902 .total_size = 2048,
903 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000904 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000905 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000906 .probe = probe_spi_rdid4,
907 .probe_timing = TIMING_ZERO,
908 .block_erasers =
909 {
910 {
911 .eraseblocks = {
912 {4 * 1024, 2},
913 {8 * 1024, 1},
914 {16 * 1024, 1},
915 {32 * 1024, 1},
916 {64 * 1024, 31},
917 },
918 .block_erase = spi_block_erase_d8,
919 }, {
920 .eraseblocks = { {2048 * 1024, 1} },
921 .block_erase = spi_block_erase_60,
922 }, {
923 .eraseblocks = { {2048 * 1024, 1} },
924 .block_erase = spi_block_erase_c7,
925 }
926 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000927 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000928 .unlock = spi_disable_blockprotect,
929 .write = spi_chip_write_256,
930 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000931 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000932 },
933
934 {
935 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +0000936 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000937 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000938 .manufacture_id = AMIC_ID_NOPREFIX,
939 .model_id = AMIC_A25L512,
940 .total_size = 64,
941 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000942 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000943 .tested = TEST_UNTESTED,
944 .probe = probe_spi_rdid,
945 .probe_timing = TIMING_ZERO,
946 .block_erasers =
947 {
948 {
949 .eraseblocks = { { 4 * 1024, 16 } },
950 .block_erase = spi_block_erase_20,
951 }, {
952 .eraseblocks = { { 64 * 1024, 1 } },
953 .block_erase = spi_block_erase_d8,
954 }, {
955 .eraseblocks = { { 64 * 1024, 1 } },
956 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000957 }
Dan Lenski11617122010-07-29 15:00:40 +0000958 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000959 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +0000960 .unlock = spi_disable_blockprotect,
961 .write = spi_chip_write_256,
962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000963 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000964 },
965
966 {
967 .vendor = "AMIC",
968 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000969 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000970 .manufacture_id = AMIC_ID_NOPREFIX,
971 .model_id = AMIC_A25L010,
972 .total_size = 128,
973 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000974 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000975 .tested = TEST_UNTESTED,
976 .probe = probe_spi_rdid,
977 .probe_timing = TIMING_ZERO,
978 .block_erasers =
979 {
980 {
981 .eraseblocks = { { 4 * 1024, 32 } },
982 .block_erase = spi_block_erase_20,
983 }, {
984 .eraseblocks = { { 64 * 1024, 2 } },
985 .block_erase = spi_block_erase_d8,
986 }, {
987 .eraseblocks = { { 128 * 1024, 1 } },
988 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000989 }
Dan Lenski11617122010-07-29 15:00:40 +0000990 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000991 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +0000992 .unlock = spi_disable_blockprotect,
993 .write = spi_chip_write_256,
994 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000995 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000996 },
997
998 {
999 .vendor = "AMIC",
1000 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001001 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001002 .manufacture_id = AMIC_ID_NOPREFIX,
1003 .model_id = AMIC_A25L020,
1004 .total_size = 256,
1005 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001006 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001007 .tested = TEST_UNTESTED,
1008 .probe = probe_spi_rdid,
1009 .probe_timing = TIMING_ZERO,
1010 .block_erasers =
1011 {
1012 {
1013 .eraseblocks = { { 4 * 1024, 64 } },
1014 .block_erase = spi_block_erase_20,
1015 }, {
1016 .eraseblocks = { { 64 * 1024, 4 } },
1017 .block_erase = spi_block_erase_d8,
1018 }, {
1019 .eraseblocks = { { 256 * 1024, 1 } },
1020 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001021 }
Dan Lenski11617122010-07-29 15:00:40 +00001022 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001023 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001027 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001028 },
1029
1030 {
1031 .vendor = "AMIC",
1032 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001033 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001034 .manufacture_id = AMIC_ID_NOPREFIX,
1035 .model_id = AMIC_A25L040,
1036 .total_size = 512,
1037 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001038 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = { { 4 * 1024, 128 } },
1046 .block_erase = spi_block_erase_20,
1047 }, {
1048 .eraseblocks = { { 64 * 1024, 8 } },
1049 .block_erase = spi_block_erase_d8,
1050 }, {
1051 .eraseblocks = { { 512 * 1024, 1 } },
1052 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001053 }
Dan Lenski11617122010-07-29 15:00:40 +00001054 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001055 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001056 .unlock = spi_disable_blockprotect,
1057 .write = spi_chip_write_256,
1058 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001059 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001060 },
1061
1062 {
1063 .vendor = "AMIC",
1064 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001065 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001066 .manufacture_id = AMIC_ID_NOPREFIX,
1067 .model_id = AMIC_A25L080,
1068 .total_size = 1024,
1069 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001070 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001071 .tested = TEST_UNTESTED,
1072 .probe = probe_spi_rdid,
1073 .probe_timing = TIMING_ZERO,
1074 .block_erasers =
1075 {
1076 {
1077 .eraseblocks = { { 4 * 1024, 256 } },
1078 .block_erase = spi_block_erase_20,
1079 }, {
1080 .eraseblocks = { { 64 * 1024, 16 } },
1081 .block_erase = spi_block_erase_d8,
1082 }, {
1083 .eraseblocks = { { 1024 * 1024, 1 } },
1084 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001085 }
Dan Lenski11617122010-07-29 15:00:40 +00001086 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001087 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001088 .unlock = spi_disable_blockprotect,
1089 .write = spi_chip_write_256,
1090 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001091 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001092 },
1093
1094 {
1095 .vendor = "AMIC",
1096 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001097 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001098 .manufacture_id = AMIC_ID_NOPREFIX,
1099 .model_id = AMIC_A25L016,
1100 .total_size = 2048,
1101 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001102 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001103 .tested = TEST_UNTESTED,
1104 .probe = probe_spi_rdid,
1105 .probe_timing = TIMING_ZERO,
1106 .block_erasers =
1107 {
1108 {
1109 .eraseblocks = { { 4 * 1024, 512 } },
1110 .block_erase = spi_block_erase_20,
1111 }, {
1112 .eraseblocks = { { 64 * 1024, 32 } },
1113 .block_erase = spi_block_erase_d8,
1114 }, {
1115 .eraseblocks = { { 2048 * 1024, 1 } },
1116 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001117 }
Dan Lenski11617122010-07-29 15:00:40 +00001118 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001119 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001120 .unlock = spi_disable_blockprotect,
1121 .write = spi_chip_write_256,
1122 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001123 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001124 },
1125
1126 {
1127 .vendor = "AMIC",
1128 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001129 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001130 .manufacture_id = AMIC_ID_NOPREFIX,
1131 .model_id = AMIC_A25L032,
1132 .total_size = 4096,
1133 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001134 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001136 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001137 .probe = probe_spi_rdid,
1138 .probe_timing = TIMING_ZERO,
1139 .block_erasers =
1140 {
1141 {
1142 .eraseblocks = { { 4 * 1024, 1024 } },
1143 .block_erase = spi_block_erase_20,
1144 }, {
1145 .eraseblocks = { { 64 * 1024, 64 } },
1146 .block_erase = spi_block_erase_52,
1147 }, {
1148 .eraseblocks = { { 64 * 1024, 64 } },
1149 .block_erase = spi_block_erase_d8,
1150 }, {
1151 .eraseblocks = { { 4096 * 1024, 1 } },
1152 .block_erase = spi_block_erase_60,
1153 }, {
1154 .eraseblocks = { { 4096 * 1024, 1 } },
1155 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001156 }
Dan Lenski11617122010-07-29 15:00:40 +00001157 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001158 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1159 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001160 .write = spi_chip_write_256,
1161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001162 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001163 },
1164
1165 {
1166 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001167 .name = "A25LQ16",
1168 .bustype = BUS_SPI,
1169 .manufacture_id = AMIC_ID_NOPREFIX,
1170 .model_id = AMIC_A25LQ16,
1171 .total_size = 2048,
1172 .page_size = 256,
1173 /* supports SFDP */
1174 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1176 .tested = TEST_UNTESTED,
1177 .probe = probe_spi_rdid,
1178 .probe_timing = TIMING_ZERO,
1179 .block_erasers = {
1180 {
1181 .eraseblocks = { { 4 * 1024, 512 } },
1182 .block_erase = spi_block_erase_20,
1183 }, {
1184 .eraseblocks = { { 64 * 1024, 32 } },
1185 .block_erase = spi_block_erase_52,
1186 }, {
1187 .eraseblocks = { { 64 * 1024, 32 } },
1188 .block_erase = spi_block_erase_d8,
1189 }, {
1190 .eraseblocks = { { 2048 * 1024, 1 } },
1191 .block_erase = spi_block_erase_60,
1192 }, {
1193 .eraseblocks = { { 2048 * 1024, 1 } },
1194 .block_erase = spi_block_erase_c7,
1195 }
1196 },
1197 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1198 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1199 .write = spi_chip_write_256,
1200 .read = spi_chip_read,
1201 .voltage = {2700, 3600},
1202 },
1203
1204 {
1205 .vendor = "AMIC",
1206 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001207 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001208 .manufacture_id = AMIC_ID_NOPREFIX,
1209 .model_id = AMIC_A25LQ032,
1210 .total_size = 4096,
1211 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001212 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001213 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001215 .tested = TEST_UNTESTED,
1216 .probe = probe_spi_rdid,
1217 .probe_timing = TIMING_ZERO,
1218 .block_erasers =
1219 {
1220 {
1221 .eraseblocks = { { 4 * 1024, 1024 } },
1222 .block_erase = spi_block_erase_20,
1223 }, {
1224 .eraseblocks = { { 64 * 1024, 64 } },
1225 .block_erase = spi_block_erase_52,
1226 }, {
1227 .eraseblocks = { { 64 * 1024, 64 } },
1228 .block_erase = spi_block_erase_d8,
1229 }, {
1230 .eraseblocks = { { 4096 * 1024, 1 } },
1231 .block_erase = spi_block_erase_60,
1232 }, {
1233 .eraseblocks = { { 4096 * 1024, 1 } },
1234 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001235 }
Dan Lenski11617122010-07-29 15:00:40 +00001236 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001237 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1238 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1239 .write = spi_chip_write_256,
1240 .read = spi_chip_read,
1241 .voltage = {2700, 3600},
1242 },
1243
1244 {
1245 .vendor = "AMIC",
1246 .name = "A25LQ64",
1247 .bustype = BUS_SPI,
1248 .manufacture_id = AMIC_ID_NOPREFIX,
1249 .model_id = AMIC_A25LQ032,
1250 .total_size = 8192,
1251 .page_size = 256,
1252 /* supports SFDP */
1253 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1254 /* QPI enable 0x35, disable 0xF5 */
1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1256 .tested = TEST_UNTESTED,
1257 .probe = probe_spi_rdid,
1258 .probe_timing = TIMING_ZERO,
1259 .block_erasers =
1260 {
1261 {
1262 .eraseblocks = { { 4 * 1024, 2048 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 32 * 1024, 256 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 128 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 8192 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 8192 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
1276 }
1277 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001278 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001279 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001282 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001283 },
1284
1285 {
1286 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001287 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001288 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A29002B,
1291 .total_size = 256,
1292 .page_size = 64 * 1024,
1293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1294 .tested = TEST_UNTESTED,
1295 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001296 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001297 .block_erasers =
1298 {
1299 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001300 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001301 {16 * 1024, 1},
1302 {8 * 1024, 2},
1303 {32 * 1024, 1},
1304 {64 * 1024, 3},
1305 },
1306 .block_erase = erase_sector_jedec,
1307 }, {
1308 .eraseblocks = { {256 * 1024, 1} },
1309 .block_erase = erase_chip_block_jedec,
1310 },
1311 },
1312 .write = write_jedec_1,
1313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001314 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001315 },
1316
1317 {
1318 .vendor = "AMIC",
1319 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001320 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001321 .manufacture_id = AMIC_ID_NOPREFIX,
1322 .model_id = AMIC_A29002T,
1323 .total_size = 256,
1324 .page_size = 64 * 1024,
1325 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001326 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001327 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001328 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001329 .block_erasers =
1330 {
1331 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001332 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001333 {64 * 1024, 3},
1334 {32 * 1024, 1},
1335 {8 * 1024, 2},
1336 {16 * 1024, 1},
1337 },
1338 .block_erase = erase_sector_jedec,
1339 }, {
1340 .eraseblocks = { {256 * 1024, 1} },
1341 .block_erase = erase_chip_block_jedec,
1342 },
1343 },
1344 .write = write_jedec_1,
1345 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001346 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001347 },
1348
1349 {
1350 .vendor = "AMIC",
1351 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001352 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001353 .manufacture_id = AMIC_ID_NOPREFIX,
1354 .model_id = AMIC_A29040B,
1355 .total_size = 512,
1356 .page_size = 64 * 1024,
1357 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001358 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001359 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001360 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001361 .block_erasers =
1362 {
1363 {
1364 .eraseblocks = { {64 * 1024, 8} },
1365 .block_erase = erase_sector_jedec,
1366 }, {
1367 .eraseblocks = { {512 * 1024, 1} },
1368 .block_erase = erase_chip_block_jedec,
1369 },
1370 },
1371 .write = write_jedec_1,
1372 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001373 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001374 },
1375
1376 {
1377 .vendor = "AMIC",
1378 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001379 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001380 .manufacture_id = AMIC_ID_NOPREFIX,
1381 .model_id = AMIC_A49LF040A,
1382 .total_size = 512,
1383 .page_size = 64 * 1024,
1384 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001385 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001386 .probe = probe_jedec,
1387 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1388 .block_erasers =
1389 {
1390 {
1391 .eraseblocks = { {64 * 1024, 8} },
1392 .block_erase = erase_block_jedec,
1393 }, {
1394 .eraseblocks = { {512 * 1024, 1} },
1395 .block_erase = erase_chip_block_jedec,
1396 }
1397 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001398 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001399 .write = write_jedec_1,
1400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001401 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 },
1403
1404 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001405 .vendor = "Atmel",
1406 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001407 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001408 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001409 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001410 .total_size = 256,
1411 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001412 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001414 .tested = TEST_UNTESTED,
1415 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001416 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001417 .block_erasers =
1418 {
1419 {
1420 .eraseblocks = { {4 * 1024, 64} },
1421 .block_erase = spi_block_erase_20,
1422 }, {
1423 .eraseblocks = { {32 * 1024, 8} },
1424 .block_erase = spi_block_erase_52,
1425 }, {
1426 .eraseblocks = { {64 * 1024, 4} },
1427 .block_erase = spi_block_erase_d8,
1428 }, {
1429 .eraseblocks = { {256 * 1024, 1} },
1430 .block_erase = spi_block_erase_60,
1431 }, {
1432 .eraseblocks = { {256 * 1024, 1} },
1433 .block_erase = spi_block_erase_c7,
1434 }
1435 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001436 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001437 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001438 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001439 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001440 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001441 },
1442
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001443 {
1444 .vendor = "Atmel",
1445 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001446 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001447 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001448 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001449 .total_size = 512,
1450 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001451 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001452 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001453 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001454 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001455 .block_erasers =
1456 {
1457 {
1458 .eraseblocks = { {4 * 1024, 128} },
1459 .block_erase = spi_block_erase_20,
1460 }, {
1461 .eraseblocks = { {32 * 1024, 16} },
1462 .block_erase = spi_block_erase_52,
1463 }, {
1464 .eraseblocks = { {64 * 1024, 8} },
1465 .block_erase = spi_block_erase_d8,
1466 }, {
1467 .eraseblocks = { {512 * 1024, 1} },
1468 .block_erase = spi_block_erase_60,
1469 }, {
1470 .eraseblocks = { {512 * 1024, 1} },
1471 .block_erase = spi_block_erase_c7,
1472 }
1473 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001474 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001475 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001476 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001477 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001478 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001479 },
1480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 {
1482 .vendor = "Atmel",
1483 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001484 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001485 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001486 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001487 .total_size = 1024,
1488 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001489 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001490 .tested = TEST_UNTESTED,
1491 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001492 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001493 .block_erasers =
1494 {
1495 {
1496 .eraseblocks = { {4 * 1024, 256} },
1497 .block_erase = spi_block_erase_20,
1498 }, {
1499 .eraseblocks = { {32 * 1024, 32} },
1500 .block_erase = spi_block_erase_52,
1501 }, {
1502 .eraseblocks = { {64 * 1024, 16} },
1503 .block_erase = spi_block_erase_d8,
1504 }, {
1505 .eraseblocks = { {1024 * 1024, 1} },
1506 .block_erase = spi_block_erase_60,
1507 }, {
1508 .eraseblocks = { {1024 * 1024, 1} },
1509 .block_erase = spi_block_erase_c7,
1510 }
1511 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001512 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001513 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001514 .write = spi_chip_write_256,
1515 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001516 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 },
1518
1519 {
1520 .vendor = "Atmel",
1521 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001522 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001523 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001524 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001525 .total_size = 1024,
1526 .page_size = 256,
1527 .feature_bits = FEATURE_WRSR_WREN,
1528 .tested = TEST_UNTESTED,
1529 .probe = probe_spi_rdid,
1530 .probe_timing = TIMING_ZERO,
1531 .block_erasers =
1532 {
1533 {
1534 .eraseblocks = { {4 * 1024, 256} },
1535 .block_erase = spi_block_erase_20,
1536 }, {
1537 .eraseblocks = { {32 * 1024, 32} },
1538 .block_erase = spi_block_erase_52,
1539 }, {
1540 .eraseblocks = { {64 * 1024, 16} },
1541 .block_erase = spi_block_erase_d8,
1542 }, {
1543 .eraseblocks = { {1024 * 1024, 1} },
1544 .block_erase = spi_block_erase_60,
1545 }, {
1546 .eraseblocks = { {1024 * 1024, 1} },
1547 .block_erase = spi_block_erase_c7,
1548 }
1549 },
1550 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001551 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001552 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001553 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001554 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001555 },
1556
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001557 {
1558 .vendor = "Atmel",
1559 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001560 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001561 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001562 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001563 .total_size = 2048,
1564 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001565 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner2abab942012-04-27 20:41:23 +00001566 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001568 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001569 .block_erasers =
1570 {
1571 {
1572 .eraseblocks = { {4 * 1024, 512} },
1573 .block_erase = spi_block_erase_20,
1574 }, {
1575 .eraseblocks = { {32 * 1024, 64} },
1576 .block_erase = spi_block_erase_52,
1577 }, {
1578 .eraseblocks = { {64 * 1024, 32} },
1579 .block_erase = spi_block_erase_d8,
1580 }, {
1581 .eraseblocks = { {2 * 1024 * 1024, 1} },
1582 .block_erase = spi_block_erase_60,
1583 }, {
1584 .eraseblocks = { {2 * 1024 * 1024, 1} },
1585 .block_erase = spi_block_erase_c7,
1586 }
1587 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001588 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001589 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001590 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001591 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001592 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001593 },
1594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001595 {
1596 .vendor = "Atmel",
1597 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001600 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 .total_size = 4096,
1602 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001603 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001604 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001606 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001607 .block_erasers =
1608 {
1609 {
1610 .eraseblocks = { {4 * 1024, 1024} },
1611 .block_erase = spi_block_erase_20,
1612 }, {
1613 .eraseblocks = { {32 * 1024, 128} },
1614 .block_erase = spi_block_erase_52,
1615 }, {
1616 .eraseblocks = { {64 * 1024, 64} },
1617 .block_erase = spi_block_erase_d8,
1618 }, {
1619 .eraseblocks = { {4 * 1024 * 1024, 1} },
1620 .block_erase = spi_block_erase_60,
1621 }, {
1622 .eraseblocks = { {4 * 1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_c7,
1624 }
1625 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001626 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001627 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001628 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001631 },
1632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001633 {
1634 .vendor = "Atmel",
1635 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001636 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001637 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001638 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001639 .total_size = 4096,
1640 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001641 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001645 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001646 .block_erasers =
1647 {
1648 {
1649 .eraseblocks = { {4 * 1024, 1024} },
1650 .block_erase = spi_block_erase_20,
1651 }, {
1652 .eraseblocks = { {32 * 1024, 128} },
1653 .block_erase = spi_block_erase_52,
1654 }, {
1655 .eraseblocks = { {64 * 1024, 64} },
1656 .block_erase = spi_block_erase_d8,
1657 }, {
1658 .eraseblocks = { {4 * 1024 * 1024, 1} },
1659 .block_erase = spi_block_erase_60,
1660 }, {
1661 .eraseblocks = { {4 * 1024 * 1024, 1} },
1662 .block_erase = spi_block_erase_c7,
1663 }
1664 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001665 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001666 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001667 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001668 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001669 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001670 },
1671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001672 {
1673 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001674 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001676 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001677 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001678 .total_size = 8192,
1679 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001680 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001681 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001682 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001683 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001684 .block_erasers =
1685 {
1686 {
1687 .eraseblocks = { {4 * 1024, 2048} },
1688 .block_erase = spi_block_erase_20,
1689 }, {
1690 .eraseblocks = { {32 * 1024, 256} },
1691 .block_erase = spi_block_erase_52,
1692 }, {
1693 .eraseblocks = { {64 * 1024, 128} },
1694 .block_erase = spi_block_erase_d8,
1695 }, {
1696 .eraseblocks = { {8 * 1024 * 1024, 1} },
1697 .block_erase = spi_block_erase_60,
1698 }, {
1699 .eraseblocks = { {8 * 1024 * 1024, 1} },
1700 .block_erase = spi_block_erase_c7,
1701 }
1702 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001703 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001704 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001705 .write = spi_chip_write_256,
1706 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001707 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001708 },
1709
1710 {
1711 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001712 .name = "AT25DL081",
1713 .bustype = BUS_SPI,
1714 .manufacture_id = ATMEL_ID,
1715 .model_id = ATMEL_AT25DF081,
1716 .total_size = 1024,
1717 .page_size = 256,
1718 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1720 .tested = TEST_UNTESTED,
1721 .probe = probe_spi_rdid,
1722 .probe_timing = TIMING_ZERO,
1723 .block_erasers =
1724 {
1725 {
1726 .eraseblocks = { {4 * 1024, 256} },
1727 .block_erase = spi_block_erase_20,
1728 }, {
1729 .eraseblocks = { {32 * 1024, 32} },
1730 .block_erase = spi_block_erase_52,
1731 }, {
1732 .eraseblocks = { {64 * 1024, 16} },
1733 .block_erase = spi_block_erase_d8,
1734 }, {
1735 .eraseblocks = { {1 * 1024 * 1024, 1} },
1736 .block_erase = spi_block_erase_60,
1737 }, {
1738 .eraseblocks = { {1 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_c7,
1740 }
1741 },
1742 .printlock = spi_prettyprint_status_register_at25df_sec,
1743 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1744 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1745 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1746 .voltage = {1650, 1950},
1747 },
1748
1749 {
1750 .vendor = "Atmel",
1751 .name = "AT25DL161",
1752 .bustype = BUS_SPI,
1753 .manufacture_id = ATMEL_ID,
1754 .model_id = ATMEL_AT25DL161,
1755 .total_size = 2048,
1756 .page_size = 256,
1757 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1758 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1759 .tested = TEST_UNTESTED,
1760 .probe = probe_spi_rdid,
1761 .probe_timing = TIMING_ZERO,
1762 .block_erasers =
1763 {
1764 {
1765 .eraseblocks = { {4 * 1024, 512} },
1766 .block_erase = spi_block_erase_20,
1767 }, {
1768 .eraseblocks = { {32 * 1024, 64} },
1769 .block_erase = spi_block_erase_52,
1770 }, {
1771 .eraseblocks = { {64 * 1024, 32} },
1772 .block_erase = spi_block_erase_d8,
1773 }, {
1774 .eraseblocks = { {2 * 1024 * 1024, 1} },
1775 .block_erase = spi_block_erase_60,
1776 }, {
1777 .eraseblocks = { {2 * 1024 * 1024, 1} },
1778 .block_erase = spi_block_erase_c7,
1779 }
1780 },
1781 .printlock = spi_prettyprint_status_register_at25df_sec,
1782 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1783 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1784 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1785 .voltage = {1650, 1950},
1786 },
1787
1788 {
1789 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001790 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001792 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001793 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001794 .total_size = 2048,
1795 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001796 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1797 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001798 .tested = TEST_UNTESTED,
1799 .probe = probe_spi_rdid,
1800 .probe_timing = TIMING_ZERO,
1801 .block_erasers =
1802 {
1803 {
1804 .eraseblocks = { {4 * 1024, 512} },
1805 .block_erase = spi_block_erase_20,
1806 }, {
1807 .eraseblocks = { {32 * 1024, 64} },
1808 .block_erase = spi_block_erase_52,
1809 }, {
1810 .eraseblocks = { {64 * 1024, 32} },
1811 .block_erase = spi_block_erase_d8,
1812 }, {
1813 .eraseblocks = { {2 * 1024 * 1024, 1} },
1814 .block_erase = spi_block_erase_60,
1815 }, {
1816 .eraseblocks = { {2 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_c7,
1818 }
1819 },
1820 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001821 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001822 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001823 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001824 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001825 },
1826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001827 {
1828 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001829 .name = "AT25F512",
1830 .bustype = BUS_SPI,
1831 .manufacture_id = ATMEL_ID,
1832 .model_id = ATMEL_AT25F512,
1833 .total_size = 64,
1834 .page_size = 256,
1835 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001836 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001837 .probe = probe_spi_at25f,
1838 .probe_timing = TIMING_ZERO,
1839 .block_erasers =
1840 {
1841 {
1842 .eraseblocks = { {32 * 1024, 2} },
1843 .block_erase = spi_block_erase_52,
1844 }, {
1845 .eraseblocks = { {64 * 1024, 1} },
1846 .block_erase = spi_block_erase_62,
1847 }
1848 },
1849 .printlock = spi_prettyprint_status_register_at25f,
1850 .unlock = spi_disable_blockprotect_at25f,
1851 .write = spi_chip_write_256,
1852 .read = spi_chip_read,
1853 .voltage = {2700, 3600},
1854 },
1855
1856 {
1857 .vendor = "Atmel",
1858 .name = "AT25F512A",
1859 .bustype = BUS_SPI,
1860 .manufacture_id = ATMEL_ID,
1861 .model_id = ATMEL_AT25F512A,
1862 .total_size = 64,
1863 .page_size = 128,
1864 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001865 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001866 .probe = probe_spi_at25f,
1867 .probe_timing = TIMING_ZERO,
1868 .block_erasers =
1869 {
1870 {
1871 .eraseblocks = { {32 * 1024, 2} },
1872 .block_erase = spi_block_erase_52,
1873 }, {
1874 .eraseblocks = { {64 * 1024, 1} },
1875 .block_erase = spi_block_erase_62,
1876 }
1877 },
1878 .printlock = spi_prettyprint_status_register_at25f512a,
1879 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1880 .unlock = spi_disable_blockprotect_at25f512a,
1881 .write = spi_chip_write_256,
1882 .read = spi_chip_read,
1883 .voltage = {2700, 3600},
1884 },
1885
1886 {
1887 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001888 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001889 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001890 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001891 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001892 .total_size = 64,
1893 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001894 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1895 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001896 .tested = TEST_UNTESTED,
1897 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001898 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001899 .block_erasers =
1900 {
1901 {
1902 .eraseblocks = { {4 * 1024, 16} },
1903 .block_erase = spi_block_erase_20,
1904 }, {
1905 .eraseblocks = { {32 * 1024, 2} },
1906 .block_erase = spi_block_erase_52,
1907 }, {
1908 .eraseblocks = { {32 * 1024, 2} },
1909 .block_erase = spi_block_erase_d8,
1910 }, {
1911 .eraseblocks = { {64 * 1024, 1} },
1912 .block_erase = spi_block_erase_60,
1913 }, {
1914 .eraseblocks = { {64 * 1024, 1} },
1915 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001916 }, {
1917 .eraseblocks = { {64 * 1024, 1} },
1918 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00001919 }
1920 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00001921 .printlock = spi_prettyprint_status_register_at25f512b,
1922 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001923 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001924 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001925 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001926 },
1927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001928 {
1929 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001930 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1931 * All other properties seem to be the same.*/
1932 .name = "AT25F1024(A)",
1933 .bustype = BUS_SPI,
1934 .manufacture_id = ATMEL_ID,
1935 .model_id = ATMEL_AT25F1024,
1936 .total_size = 128,
1937 .page_size = 256,
1938 .feature_bits = FEATURE_WRSR_WREN,
1939 .tested = TEST_OK_PREW,
1940 .probe = probe_spi_at25f,
1941 .probe_timing = TIMING_ZERO,
1942 .block_erasers =
1943 {
1944 {
1945 .eraseblocks = { {32 * 1024, 4} },
1946 .block_erase = spi_block_erase_52,
1947 }, {
1948 .eraseblocks = { {128 * 1024, 1} },
1949 .block_erase = spi_block_erase_62,
1950 }
1951 },
1952 .printlock = spi_prettyprint_status_register_at25f,
1953 .unlock = spi_disable_blockprotect_at25f,
1954 .write = spi_chip_write_256,
1955 .read = spi_chip_read,
1956 .voltage = {2700, 3600},
1957 },
1958
1959 {
1960 .vendor = "Atmel",
1961 .name = "AT25F2048",
1962 .bustype = BUS_SPI,
1963 .manufacture_id = ATMEL_ID,
1964 .model_id = ATMEL_AT25F2048,
1965 .total_size = 256,
1966 .page_size = 256,
1967 .feature_bits = FEATURE_WRSR_WREN,
1968 .tested = TEST_UNTESTED,
1969 .probe = probe_spi_at25f,
1970 .probe_timing = TIMING_ZERO,
1971 .block_erasers =
1972 {
1973 {
1974 .eraseblocks = { {64 * 1024, 4} },
1975 .block_erase = spi_block_erase_52,
1976 }, {
1977 .eraseblocks = { {256 * 1024, 1} },
1978 .block_erase = spi_block_erase_62,
1979 }
1980 },
1981 .printlock = spi_prettyprint_status_register_at25f,
1982 .unlock = spi_disable_blockprotect_at25f,
1983 .write = spi_chip_write_256,
1984 .read = spi_chip_read,
1985 .voltage = {2700, 3600},
1986 },
1987
1988 {
1989 .vendor = "Atmel",
1990 .name = "AT25F4096",
1991 .bustype = BUS_SPI,
1992 .manufacture_id = ATMEL_ID,
1993 .model_id = ATMEL_AT25F4096,
1994 .total_size = 512,
1995 .page_size = 256,
1996 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner6697f712014-08-06 15:09:15 +00001997 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001998 .probe = probe_spi_at25f,
1999 .probe_timing = TIMING_ZERO,
2000 .block_erasers =
2001 {
2002 {
2003 .eraseblocks = { {64 * 1024, 8} },
2004 .block_erase = spi_block_erase_52,
2005 }, {
2006 .eraseblocks = { {512 * 1024, 1} },
2007 .block_erase = spi_block_erase_62,
2008 }
2009 },
2010 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002011 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2012 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002013 .write = spi_chip_write_256,
2014 .read = spi_chip_read,
2015 .voltage = {2700, 3600},
2016 },
2017
2018 {
2019 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002020 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002021 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002022 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002023 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002024 .total_size = 128,
2025 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002026 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002027 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002028 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002029 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002030 .block_erasers =
2031 {
2032 {
2033 .eraseblocks = { {4 * 1024, 32} },
2034 .block_erase = spi_block_erase_20,
2035 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002036 .eraseblocks = { {4 * 1024, 32} },
2037 .block_erase = spi_block_erase_d7,
2038 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002039 .eraseblocks = { {32 * 1024, 4} },
2040 .block_erase = spi_block_erase_52,
2041 }, {
2042 .eraseblocks = { {32 * 1024, 4} },
2043 .block_erase = spi_block_erase_d8,
2044 }, {
2045 .eraseblocks = { {128 * 1024, 1} },
2046 .block_erase = spi_block_erase_60,
2047 }, {
2048 .eraseblocks = { {128 * 1024, 1} },
2049 .block_erase = spi_block_erase_c7,
2050 }
2051 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002052 .printlock = spi_prettyprint_status_register_at25fs010,
2053 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002054 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002055 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002056 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002057 },
2058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002059 {
2060 .vendor = "Atmel",
2061 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002062 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002063 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002064 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002065 .total_size = 512,
2066 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002067 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002068 .tested = TEST_UNTESTED,
2069 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002070 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002071 .block_erasers =
2072 {
2073 {
2074 .eraseblocks = { {4 * 1024, 128} },
2075 .block_erase = spi_block_erase_20,
2076 }, {
2077 .eraseblocks = { {64 * 1024, 8} },
2078 .block_erase = spi_block_erase_52,
2079 }, {
2080 .eraseblocks = { {64 * 1024, 8} },
2081 .block_erase = spi_block_erase_d8,
2082 }, {
2083 .eraseblocks = { {512 * 1024, 1} },
2084 .block_erase = spi_block_erase_60,
2085 }, {
2086 .eraseblocks = { {512 * 1024, 1} },
2087 .block_erase = spi_block_erase_c7,
2088 }
2089 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002090 .printlock = spi_prettyprint_status_register_at25fs040,
2091 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002092 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002093 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002094 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002095 },
2096
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002097 {
2098 .vendor = "Atmel",
2099 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002100 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002101 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002102 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002103 .total_size = 512,
2104 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002105 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002106 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002107 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002108 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002109 .block_erasers =
2110 {
2111 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002112 .eraseblocks = { {256, 2048} },
2113 .block_erase = spi_block_erase_81,
2114 }, {
2115 .eraseblocks = { {2 * 1024, 256} },
2116 .block_erase = spi_block_erase_50,
2117 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002118 .eraseblocks = { {4 * 1024, 128} },
2119 .block_erase = spi_block_erase_20,
2120 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002121 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002122 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002123 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002124 .write = spi_chip_write_1,
2125 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002126 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002127 },
2128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002129 {
2130 .vendor = "Atmel",
2131 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002132 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002133 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002134 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002135 .total_size = 1024,
2136 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002137 .feature_bits = FEATURE_WRSR_WREN,
2138 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002139 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002140 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002141 .block_erasers =
2142 {
2143 {
2144 .eraseblocks = { {4 * 1024, 256} },
2145 .block_erase = spi_block_erase_20,
2146 }, {
2147 .eraseblocks = { {32 * 1024, 32} },
2148 .block_erase = spi_block_erase_52,
2149 }, {
2150 .eraseblocks = { {64 * 1024, 16} },
2151 .block_erase = spi_block_erase_d8,
2152 }, {
2153 .eraseblocks = { {1024 * 1024, 1} },
2154 .block_erase = spi_block_erase_60,
2155 }, {
2156 .eraseblocks = { {1024 * 1024, 1} },
2157 .block_erase = spi_block_erase_c7,
2158 }
2159 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002160 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002161 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002162 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002163 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002164 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002165 },
2166
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002167 {
2168 .vendor = "Atmel",
2169 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002170 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002171 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002172 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002173 .total_size = 2048,
2174 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002175 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002176 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002177 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002178 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002179 .block_erasers =
2180 {
2181 {
2182 .eraseblocks = { {4 * 1024, 512} },
2183 .block_erase = spi_block_erase_20,
2184 }, {
2185 .eraseblocks = { {32 * 1024, 64} },
2186 .block_erase = spi_block_erase_52,
2187 }, {
2188 .eraseblocks = { {64 * 1024, 32} },
2189 .block_erase = spi_block_erase_d8,
2190 }, {
2191 .eraseblocks = { {2 * 1024 * 1024, 1} },
2192 .block_erase = spi_block_erase_60,
2193 }, {
2194 .eraseblocks = { {2 * 1024 * 1024, 1} },
2195 .block_erase = spi_block_erase_c7,
2196 }
2197 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002198 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002199 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002200 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002201 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002202 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002203 },
2204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002205 {
2206 .vendor = "Atmel",
2207 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002208 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002209 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002210 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002211 .total_size = 2048,
2212 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002213 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002214 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002215 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002216 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002217 .block_erasers =
2218 {
2219 {
2220 .eraseblocks = { {4 * 1024, 512} },
2221 .block_erase = spi_block_erase_20,
2222 }, {
2223 .eraseblocks = { {32 * 1024, 64} },
2224 .block_erase = spi_block_erase_52,
2225 }, {
2226 .eraseblocks = { {64 * 1024, 32} },
2227 .block_erase = spi_block_erase_d8,
2228 }, {
2229 .eraseblocks = { {2 * 1024 * 1024, 1} },
2230 .block_erase = spi_block_erase_60,
2231 }, {
2232 .eraseblocks = { {2 * 1024 * 1024, 1} },
2233 .block_erase = spi_block_erase_c7,
2234 }
2235 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002236 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002237 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002238 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002239 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002240 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002241 },
2242
2243 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002244 /*{
2245 .vendor = "Atmel",
2246 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002247 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002248 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002249 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002250 .total_size = 4096,
2251 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002252 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002253 .tested = TEST_UNTESTED,
2254 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002255 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002256 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002257 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002258 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002259 .read = spi_chip_read,
2260 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002261
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002262 {
2263 .vendor = "Atmel",
2264 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002265 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002266 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002267 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002268 .total_size = 512,
2269 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002270 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002271 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002272 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002273 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002274 .block_erasers =
2275 {
2276 {
2277 .eraseblocks = { {4 * 1024, 128} },
2278 .block_erase = spi_block_erase_20,
2279 }, {
2280 .eraseblocks = { {32 * 1024, 16} },
2281 .block_erase = spi_block_erase_52,
2282 }, {
2283 .eraseblocks = { {64 * 1024, 8} },
2284 .block_erase = spi_block_erase_d8,
2285 }, {
2286 .eraseblocks = { {512 * 1024, 1} },
2287 .block_erase = spi_block_erase_60,
2288 }, {
2289 .eraseblocks = { {512 * 1024, 1} },
2290 .block_erase = spi_block_erase_c7,
2291 }
2292 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002294 .write = NULL /* Incompatible Page write */,
2295 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002296 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002297 },
2298
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002299 {
2300 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002301 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002302 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002303 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002304 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002305 .total_size = 64,
2306 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002307 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002308 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002309 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002310 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002311 .block_erasers =
2312 {
2313 {
2314 .eraseblocks = { {64 * 1024, 1} },
2315 .block_erase = erase_chip_block_jedec,
2316 }
2317 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002318 .write = write_jedec,
2319 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002320 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002321 },
2322
2323 {
2324 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002325 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002326 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002327 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002328 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002329 .total_size = 128,
2330 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002331 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002332 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002333 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002334 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002335 .block_erasers =
2336 {
2337 {
2338 .eraseblocks = { {128 * 1024, 1} },
2339 .block_erase = erase_chip_block_jedec,
2340 }
2341 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002342 .write = write_jedec, /* FIXME */
2343 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002344 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002345 },
2346
2347 {
2348 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002349 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002350 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002351 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002352 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002353 .total_size = 256,
2354 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002355 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002356 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002357 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002358 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002359 .block_erasers =
2360 {
2361 {
2362 .eraseblocks = { {256 * 1024, 1} },
2363 .block_erase = erase_chip_block_jedec,
2364 }
2365 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002366 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002367 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002368 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002369 },
2370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002371 {
2372 .vendor = "Atmel",
2373 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002374 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002375 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002376 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002377 .total_size = 512,
2378 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002379 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .tested = TEST_UNTESTED,
2381 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002382 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002383 .block_erasers =
2384 {
2385 {
2386 .eraseblocks = { {512 * 1024, 1} },
2387 .block_erase = erase_chip_block_jedec,
2388 }
2389 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002390 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002392 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002393 },
2394
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002395 {
2396 .vendor = "Atmel",
2397 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002398 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002399 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002400 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002401 .total_size = 16896 /* No power of two sizes */,
2402 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002403 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002404 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2405 .feature_bits = FEATURE_OTP,
2406 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002407 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002408 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002409 .block_erasers =
2410 {
2411 {
2412 .eraseblocks = {
2413 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2414 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2415 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2416 },
2417 .block_erase = spi_erase_at45cs_sector,
2418 }
2419 },
2420 .printlock = spi_prettyprint_status_register_plain,
2421 .gran = write_gran_1056bytes,
2422 .write = spi_write_at45db,
2423 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002424 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002425 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002426
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002427 {
2428 .vendor = "Atmel",
2429 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002430 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002431 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002432 .model_id = ATMEL_AT45DB011D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002433 .total_size = 128 /* or 132, determined from status register */,
2434 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002435 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002436 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2437 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002438 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002439 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002440 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002441 .block_erasers =
2442 {
2443 {
2444 .eraseblocks = { {256, 512} },
2445 .block_erase = spi_erase_at45db_page,
2446 }, {
2447 .eraseblocks = { {8 * 256, 512/8} },
2448 .block_erase = spi_erase_at45db_block,
2449 }, {
2450 .eraseblocks = {
2451 {8 * 256, 1},
2452 {120 * 256, 1},
2453 {128 * 256, 3},
2454 },
2455 .block_erase = spi_erase_at45db_sector
2456 }, {
2457 .eraseblocks = { {128 * 1024, 1} },
2458 .block_erase = spi_erase_at45db_chip,
2459 }
2460 },
2461 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2462 .printlock = spi_prettyprint_status_register_at45db,
2463 /* granularity will be set by the probing function. */
2464 .write = spi_write_at45db,
2465 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002466 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002467 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002468
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002469 {
2470 .vendor = "Atmel",
2471 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002472 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002473 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002474 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002475 .total_size = 256 /* or 264, determined from status register */,
2476 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002477 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002478 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2479 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002480 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002481 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002482 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002483 .block_erasers =
2484 {
2485 {
2486 .eraseblocks = { {256, 1024} },
2487 .block_erase = spi_erase_at45db_page,
2488 }, {
2489 .eraseblocks = { {8 * 256, 1024/8} },
2490 .block_erase = spi_erase_at45db_block,
2491 }, {
2492 .eraseblocks = {
2493 {8 * 256, 1},
2494 {120 * 256, 1},
2495 {128 * 256, 7},
2496 },
2497 .block_erase = spi_erase_at45db_sector
2498 }, {
2499 .eraseblocks = { {256 * 1024, 1} },
2500 .block_erase = spi_erase_at45db_chip,
2501 }
2502 },
2503 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2504 .printlock = spi_prettyprint_status_register_at45db,
2505 /* granularity will be set by the probing function. */
2506 .write = spi_write_at45db,
2507 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002508 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002509 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002510
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002511 {
2512 .vendor = "Atmel",
2513 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002514 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002515 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002516 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002517 .total_size = 512 /* or 528, determined from status register */,
2518 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002519 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002520 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2521 .feature_bits = FEATURE_OTP,
2522 .tested = TEST_OK_PREW,
2523 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002524 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002525 .block_erasers =
2526 {
2527 {
2528 .eraseblocks = { {256, 2048} },
2529 .block_erase = spi_erase_at45db_page,
2530 }, {
2531 .eraseblocks = { {8 * 256, 2048/8} },
2532 .block_erase = spi_erase_at45db_block,
2533 }, {
2534 .eraseblocks = {
2535 {8 * 256, 1},
2536 {248 * 256, 1},
2537 {256 * 256, 7},
2538 },
2539 .block_erase = spi_erase_at45db_sector
2540 }, {
2541 .eraseblocks = { {512 * 1024, 1} },
2542 .block_erase = spi_erase_at45db_chip,
2543 }
2544 },
2545 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2546 .printlock = spi_prettyprint_status_register_at45db,
2547 /* granularity will be set by the probing function. */
2548 .write = spi_write_at45db,
2549 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2550 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002551 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002552
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002553 {
2554 .vendor = "Atmel",
2555 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002556 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002557 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002558 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002559 .total_size = 1024 /* or 1056, determined from status register */,
2560 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002561 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002562 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2563 .feature_bits = FEATURE_OTP,
2564 .tested = TEST_UNTESTED,
2565 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002566 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002567 .block_erasers =
2568 {
2569 {
2570 .eraseblocks = { {256, 4096} },
2571 .block_erase = spi_erase_at45db_page,
2572 }, {
2573 .eraseblocks = { {8 * 256, 4096/8} },
2574 .block_erase = spi_erase_at45db_block,
2575 }, {
2576 .eraseblocks = {
2577 {8 * 256, 1},
2578 {248 * 256, 1},
2579 {256 * 256, 15},
2580 },
2581 .block_erase = spi_erase_at45db_sector
2582 }, {
2583 .eraseblocks = { {1024 * 1024, 1} },
2584 .block_erase = spi_erase_at45db_chip,
2585 }
2586 },
2587 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2588 .printlock = spi_prettyprint_status_register_at45db,
2589 /* granularity will be set by the probing function. */
2590 .write = spi_write_at45db,
2591 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002592 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002593 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002595 {
2596 .vendor = "Atmel",
2597 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002600 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002601 .total_size = 2048 /* or 2112, determined from status register */,
2602 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002603 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002604 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2605 .feature_bits = FEATURE_OTP,
2606 .tested = TEST_OK_PREW,
2607 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002608 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002609 .block_erasers =
2610 {
2611 {
2612 .eraseblocks = { {512, 4096} },
2613 .block_erase = spi_erase_at45db_page,
2614 }, {
2615 .eraseblocks = { {8 * 512, 4096/8} },
2616 .block_erase = spi_erase_at45db_block,
2617 }, {
2618 .eraseblocks = {
2619 {8 * 512, 1},
2620 {248 * 512, 1},
2621 {256 * 512, 15},
2622 },
2623 .block_erase = spi_erase_at45db_sector
2624 }, {
2625 .eraseblocks = { {2048 * 1024, 1} },
2626 .block_erase = spi_erase_at45db_chip,
2627 }
2628 },
2629 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2630 .printlock = spi_prettyprint_status_register_at45db,
2631 /* granularity will be set by the probing function. */
2632 .write = spi_write_at45db,
2633 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002634 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002635 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002636
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002637 {
2638 .vendor = "Atmel",
2639 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002640 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002641 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002642 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002643 .total_size = 4224 /* No power of two sizes */,
2644 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002645 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002646 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2647 .feature_bits = FEATURE_OTP,
2648 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002649 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002650 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002651 .block_erasers =
2652 {
2653 {
2654 .eraseblocks = { {528, 8192} },
2655 .block_erase = spi_erase_at45db_page,
2656 }, {
2657 .eraseblocks = { {8 * 528, 8192/8} },
2658 .block_erase = spi_erase_at45db_block,
2659 }, /* Although the datasheets describes sectors (which can be write protected)
2660 * there seems to be no erase functions for them.
2661 {
2662 .eraseblocks = {
2663 {8 * 528, 1},
2664 {120 * 528, 1},
2665 {128 * 528, 63},
2666 },
2667 .block_erase = spi_erase_at45db_sector
2668 }, */ {
2669 .eraseblocks = { {4224 * 1024, 1} },
2670 .block_erase = spi_erase_at45db_chip,
2671 }
2672 },
2673 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2674 .gran = write_gran_528bytes,
2675 .write = spi_write_at45db,
2676 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002677 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002678 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002679
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002680 {
2681 .vendor = "Atmel",
2682 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002683 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002684 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002685 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002686 .total_size = 4096 /* or 4224, determined from status register */,
2687 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002688 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002689 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002690 .feature_bits = FEATURE_OTP,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002691 .tested = TEST_UNTESTED,
2692 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002693 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002694 .block_erasers =
2695 {
2696 {
2697 .eraseblocks = { {512, 8192} },
2698 .block_erase = spi_erase_at45db_page,
2699 }, {
2700 .eraseblocks = { {8 * 512, 8192/8} },
2701 .block_erase = spi_erase_at45db_block,
2702 }, {
2703 .eraseblocks = {
2704 {8 * 512, 1},
2705 {120 * 512, 1},
2706 {128 * 512, 63},
2707 },
2708 .block_erase = spi_erase_at45db_sector
2709 }, {
2710 .eraseblocks = { {4096 * 1024, 1} },
2711 .block_erase = spi_erase_at45db_chip,
2712 }
2713 },
2714 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2715 .printlock = spi_prettyprint_status_register_at45db,
2716 /* granularity will be set by the probing function. */
2717 .write = spi_write_at45db,
2718 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2719 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2720 },
2721
2722 {
2723 .vendor = "Atmel",
2724 .name = "AT45DB321E",
2725 .bustype = BUS_SPI,
2726 .manufacture_id = ATMEL_ID,
2727 .model_id = ATMEL_AT45DB321C,
2728 .total_size = 4096 /* or 4224, determined from status register */,
2729 .page_size = 512 /* or 528, determined from status register */,
2730 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2731 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2732 .feature_bits = FEATURE_OTP,
2733 .tested = TEST_UNTESTED,
2734 .probe = probe_spi_at45db,
2735 .probe_timing = TIMING_ZERO,
2736 .block_erasers =
2737 {
2738 {
2739 .eraseblocks = { {512, 8192} },
2740 .block_erase = spi_erase_at45db_page,
2741 }, {
2742 .eraseblocks = { {8 * 512, 8192/8} },
2743 .block_erase = spi_erase_at45db_block,
2744 }, {
2745 .eraseblocks = {
2746 {8 * 512, 1},
2747 {120 * 512, 1},
2748 {128 * 512, 63},
2749 },
2750 .block_erase = spi_erase_at45db_sector
2751 }, {
2752 .eraseblocks = { {4096 * 1024, 1} },
2753 .block_erase = spi_erase_at45db_chip,
2754 }
2755 },
2756 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2757 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2758 /* granularity will be set by the probing function. */
2759 .write = spi_write_at45db,
2760 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2761 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002762 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002763
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002764 {
2765 .vendor = "Atmel",
2766 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002767 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002768 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002769 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002770 .total_size = 8192 /* or 8448, determined from status register */,
2771 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002772 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002773 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2774 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002775 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002776 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002777 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002778 .block_erasers =
2779 {
2780 {
2781 .eraseblocks = { {1024, 8192} },
2782 .block_erase = spi_erase_at45db_page,
2783 }, {
2784 .eraseblocks = { {8 * 1024, 8192/8} },
2785 .block_erase = spi_erase_at45db_block,
2786 }, {
2787 .eraseblocks = {
2788 {8 * 1024, 1},
2789 {248 * 1024, 1},
2790 {256 * 1024, 31},
2791 },
2792 .block_erase = spi_erase_at45db_sector
2793 }, {
2794 .eraseblocks = { {8192 * 1024, 1} },
2795 .block_erase = spi_erase_at45db_chip,
2796 }
2797 },
2798 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2799 .printlock = spi_prettyprint_status_register_at45db,
2800 /* granularity will be set by the probing function. */
2801 .write = spi_write_at45db,
2802 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002803 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002804 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002805
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002806 {
2807 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002808 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002809 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002810 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002811 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002812 .total_size = 64,
2813 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002814 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002815 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002816 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002817 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002818 .block_erasers =
2819 {
2820 {
2821 .eraseblocks = { {64 * 1024, 1} },
2822 .block_erase = erase_chip_block_jedec,
2823 }
2824 },
Sean Nelson35727f72010-01-28 23:55:12 +00002825 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002827 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002828 },
2829
2830 {
2831 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002832 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002833 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002834 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002835 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002836 .total_size = 256,
2837 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002838 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002839 .tested = TEST_UNTESTED,
2840 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002842 .block_erasers =
2843 {
2844 {
2845 .eraseblocks = {
2846 {16 * 1024, 1},
2847 {8 * 1024, 2},
2848 {96 * 1024, 1},
2849 {128 * 1024, 1},
2850 },
2851 .block_erase = erase_sector_jedec,
2852 }, {
2853 .eraseblocks = { {256 * 1024, 1} },
2854 .block_erase = erase_chip_block_jedec,
2855 }
2856 },
Sean Nelson35727f72010-01-28 23:55:12 +00002857 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002858 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002859 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002860 },
2861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002862 {
2863 .vendor = "Atmel",
2864 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002865 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002866 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002867 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002868 .total_size = 256,
2869 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002870 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002871 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002872 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002873 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002874 .block_erasers =
2875 {
2876 {
2877 .eraseblocks = {
2878 {128 * 1024, 1},
2879 {96 * 1024, 1},
2880 {8 * 1024, 2},
2881 {16 * 1024, 1},
2882 },
2883 .block_erase = erase_sector_jedec,
2884 }, {
2885 .eraseblocks = { {256 * 1024, 1} },
2886 .block_erase = erase_chip_block_jedec,
2887 }
2888 },
Sean Nelson35727f72010-01-28 23:55:12 +00002889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002890 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002891 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002892 },
2893
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002894 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002895 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002896 .name = "AT49(H)F010",
2897 .bustype = BUS_PARALLEL,
2898 .manufacture_id = ATMEL_ID,
2899 .model_id = ATMEL_AT49F010,
2900 .total_size = 128,
2901 .page_size = 0, /* unused */
2902 .feature_bits = FEATURE_EITHER_RESET,
2903 .tested = TEST_OK_PREW,
2904 .probe = probe_jedec,
2905 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2906 .block_erasers =
2907 {
2908 {
2909 .eraseblocks = { {128 * 1024, 1} },
2910 .block_erase = erase_chip_block_jedec,
2911 }
2912 },
2913 .printlock = printlock_at49f,
2914 .write = write_jedec_1,
2915 .read = read_memmapped,
2916 .voltage = {4500, 5500},
2917 },
2918
2919 {
2920 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002921 .name = "AT49F020",
2922 .bustype = BUS_PARALLEL,
2923 .manufacture_id = ATMEL_ID,
2924 .model_id = ATMEL_AT49F020,
2925 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002926 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002927 .feature_bits = FEATURE_EITHER_RESET,
2928 .tested = TEST_OK_PRE,
2929 .probe = probe_jedec,
2930 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2931 .block_erasers =
2932 {
2933 {
2934 .eraseblocks = { {256 * 1024, 1} },
2935 .block_erase = erase_chip_block_jedec,
2936 }
2937 /* Chip features an optional permanent write protection
2938 * of the first 8 kB. The erase function is the same as
2939 * above, but 00000H to 01FFFH will not be erased.
2940 * FIXME: add another eraser when partial erasers are
2941 * supported.
2942 */
2943 },
2944 .printlock = printlock_at49f,
2945 .write = write_jedec_1,
2946 .read = read_memmapped,
2947 .voltage = {4500, 5500},
2948 },
2949
2950 {
2951 .vendor = "Atmel",
2952 .name = "AT49F040",
2953 .bustype = BUS_PARALLEL,
2954 .manufacture_id = ATMEL_ID,
2955 .model_id = ATMEL_AT49F040,
2956 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002957 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002958 .feature_bits = FEATURE_EITHER_RESET,
2959 .tested = TEST_UNTESTED,
2960 .probe = probe_jedec,
2961 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2962 .block_erasers =
2963 {
2964 {
2965 .eraseblocks = { {512 * 1024, 1} },
2966 .block_erase = erase_chip_block_jedec,
2967 }
2968 /* Chip features an optional permanent write protection
2969 * of the first 16 kB. The erase function is the same as
2970 * above, but 00000H to 03FFFH will not be erased.
2971 * FIXME: add another eraser when partial erasers are
2972 * supported.
2973 */
2974 },
2975 .printlock = printlock_at49f,
2976 .write = write_jedec_1,
2977 .read = read_memmapped,
2978 .voltage = {4500, 5500},
2979 },
2980
2981 {
2982 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002983 .name = "AT49F080",
2984 .bustype = BUS_PARALLEL,
2985 .manufacture_id = ATMEL_ID,
2986 .model_id = ATMEL_AT49F080,
2987 .total_size = 1024,
2988 .page_size = 0, /* unused */
2989 .feature_bits = FEATURE_EITHER_RESET,
2990 .tested = TEST_UNTESTED,
2991 .probe = probe_jedec,
2992 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2993 .block_erasers =
2994 {
2995 {
2996 .eraseblocks = { {1024 * 1024, 1} },
2997 .block_erase = erase_chip_block_jedec,
2998 }
2999 /* Chip features an optional permanent write protection
3000 * of the first 16 kB. The erase function is the same as
3001 * above, but 00000H to 03FFFH will not be erased.
3002 * FIXME: add another eraser when partial erasers are
3003 * supported.
3004 */
3005 },
3006 .printlock = printlock_at49f,
3007 .write = write_jedec_1,
3008 .read = read_memmapped,
3009 .voltage = {4500, 5500},
3010 },
3011
3012 {
3013 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3014 .vendor = "Atmel",
3015 .name = "AT49F080T",
3016 .bustype = BUS_PARALLEL,
3017 .manufacture_id = ATMEL_ID,
3018 .model_id = ATMEL_AT49F080T,
3019 .total_size = 1024,
3020 .page_size = 0, /* unused */
3021 .feature_bits = FEATURE_EITHER_RESET,
3022 .tested = TEST_UNTESTED,
3023 .probe = probe_jedec,
3024 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3025 .block_erasers =
3026 {
3027 {
3028 .eraseblocks = { {1024 * 1024, 1} },
3029 .block_erase = erase_chip_block_jedec,
3030 }
3031 /* Chip features an optional permanent write protection
3032 * of the first 16 kB. The erase function is the same as
3033 * above, but FC000H to FFFFFH will not be erased.
3034 * FIXME: add another eraser when partial erasers are
3035 * supported.
3036 */
3037 },
3038 .printlock = printlock_at49f,
3039 .write = write_jedec_1,
3040 .read = read_memmapped,
3041 .voltage = {4500, 5500},
3042 },
3043
3044 {
3045 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003046 .name = "AT49LH002",
3047 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3048 .manufacture_id = ATMEL_ID,
3049 .model_id = ATMEL_AT49LH002,
3050 .total_size = 256,
3051 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003052 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003053 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003054 .probe = probe_82802ab,
3055 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003056 .block_erasers =
3057 {
3058 {
3059 .eraseblocks = {
3060 {64 * 1024, 3},
3061 {32 * 1024, 1},
3062 {8 * 1024, 2},
3063 {16 * 1024, 1},
3064 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003065 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003066 }, {
3067 .eraseblocks = {
3068 {64 * 1024, 4},
3069 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003070 .block_erase = erase_block_82802ab,
3071 },
3072 },
3073 .printlock = printlock_regspace2_block_eraser_0,
3074 .unlock = unlock_regspace2_block_eraser_0,
3075 .write = write_82802ab,
3076 .read = read_memmapped,
3077 .voltage = {3000, 3600},
3078 },
3079
3080 {
3081 .vendor = "Atmel",
3082 .name = "AT49LH00B4",
3083 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3084 .manufacture_id = ATMEL_ID,
3085 .model_id = ATMEL_AT49LH00B4,
3086 .total_size = 512,
3087 .page_size = 0, /* unused */
3088 .feature_bits = FEATURE_REGISTERMAP,
3089 .tested = TEST_UNTESTED,
3090 .probe = probe_82802ab,
3091 .probe_timing = TIMING_ZERO,
3092 .block_erasers =
3093 {
3094 {
3095 .eraseblocks = {
3096 {8 * 1024, 2},
3097 {16 * 1024, 1},
3098 {32 * 1024, 1},
3099 {64 * 1024, 7},
3100 },
3101 .block_erase = NULL, /* TODO: Implement. */
3102 }, {
3103 .eraseblocks = {
3104 {64 * 1024, 8},
3105 },
3106 .block_erase = erase_block_82802ab,
3107 },
3108 },
3109 .printlock = printlock_regspace2_block_eraser_0,
3110 .unlock = unlock_regspace2_block_eraser_0,
3111 .write = write_82802ab,
3112 .read = read_memmapped,
3113 .voltage = {3000, 3600},
3114 },
3115
3116 {
3117 .vendor = "Atmel",
3118 .name = "AT49LH004",
3119 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3120 .manufacture_id = ATMEL_ID,
3121 .model_id = ATMEL_AT49LH004,
3122 .total_size = 512,
3123 .page_size = 0, /* unused */
3124 .feature_bits = FEATURE_REGISTERMAP,
3125 .tested = TEST_UNTESTED,
3126 .probe = probe_82802ab,
3127 .probe_timing = TIMING_ZERO,
3128 .block_erasers =
3129 {
3130 {
3131 .eraseblocks = {
3132 {64 * 1024, 7},
3133 {32 * 1024, 1},
3134 {8 * 1024, 2},
3135 {16 * 1024, 1},
3136 },
3137 .block_erase = erase_block_82802ab,
3138 }, {
3139 .eraseblocks = {
3140 {64 * 1024, 8},
3141 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003142 .block_erase = NULL, /* TODO: Implement. */
3143 },
3144 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003145 .printlock = printlock_regspace2_block_eraser_0,
3146 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003147 .write = write_82802ab,
3148 .read = read_memmapped,
3149 .voltage = {3000, 3600},
3150 },
3151
3152 {
Andrew Morganca081462011-09-13 22:05:44 +00003153 .vendor = "Catalyst",
3154 .name = "CAT28F512",
3155 .bustype = BUS_PARALLEL,
3156 .manufacture_id = CATALYST_ID,
3157 .model_id = CATALYST_CAT28F512,
3158 .total_size = 64,
3159 .page_size = 0, /* unused */
3160 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003161 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003162 .probe = probe_jedec, /* FIXME! */
3163 .probe_timing = TIMING_ZERO,
3164 .block_erasers =
3165 {
3166 {
3167 .eraseblocks = { {64 * 1024, 1} },
3168 .block_erase = NULL, /* TODO */
3169 },
3170 },
3171 .write = NULL, /* TODO */
3172 .read = read_memmapped,
3173 .voltage = {4500, 5500},
3174 },
3175
3176 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003177 .vendor = "Bright",
3178 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003179 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003180 .manufacture_id = BRIGHT_ID,
3181 .model_id = BRIGHT_BM29F040,
3182 .total_size = 512,
3183 .page_size = 64 * 1024,
3184 .feature_bits = FEATURE_EITHER_RESET,
3185 .tested = TEST_OK_PR,
3186 .probe = probe_jedec,
3187 .probe_timing = TIMING_ZERO,
3188 .block_erasers =
3189 {
3190 {
3191 .eraseblocks = { {64 * 1024, 8} },
3192 .block_erase = erase_sector_jedec,
3193 }, {
3194 .eraseblocks = { {512 * 1024, 1} },
3195 .block_erase = erase_chip_block_jedec,
3196 },
3197 },
3198 .write = write_jedec_1,
3199 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003200 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003201 },
3202
3203 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003204 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003205 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003206 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003207 .manufacture_id = ESMT_ID,
3208 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003209 .total_size = 256,
3210 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003211 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003212 .tested = TEST_UNTESTED,
3213 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003215 .block_erasers =
3216 {
3217 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003218 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003219 {128 * 1024, 1},
3220 {96 * 1024, 1},
3221 {8 * 1024, 2},
3222 {16 * 1024, 1},
3223 },
3224 .block_erase = erase_sector_jedec,
3225 }, {
3226 .eraseblocks = { {256 * 1024, 1} },
3227 .block_erase = erase_chip_block_jedec,
3228 }
3229 },
Sean Nelson35727f72010-01-28 23:55:12 +00003230 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003231 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003232 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003233 },
3234
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003235 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003236 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003237 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003238 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003239 .manufacture_id = ESMT_ID,
3240 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003241 .total_size = 1024,
3242 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003243 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003244 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003245 .probe = probe_spi_rdid,
3246 .probe_timing = TIMING_ZERO,
3247 .block_erasers =
3248 {
3249 {
3250 .eraseblocks = { {4 * 1024, 256} },
3251 .block_erase = spi_block_erase_20,
3252 }, {
3253 .eraseblocks = { {64 * 1024, 16} },
3254 .block_erase = spi_block_erase_d8,
3255 }, {
3256 .eraseblocks = { {1024 * 1024, 1} },
3257 .block_erase = spi_block_erase_60,
3258 }, {
3259 .eraseblocks = { {1024 * 1024, 1} },
3260 .block_erase = spi_block_erase_c7,
3261 }
3262 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003264 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003265 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003266 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003267 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003268 },
3269
3270 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003271 .vendor = "ESMT",
3272 .name = "F25L32PA",
3273 .bustype = BUS_SPI,
3274 .manufacture_id = ESMT_ID,
3275 .model_id = ESMT_F25L32PA,
3276 .total_size = 4096,
3277 .page_size = 256,
3278 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3279 .tested = TEST_UNTESTED,
3280 .probe = probe_spi_rdid,
3281 .probe_timing = TIMING_ZERO,
3282 .block_erasers =
3283 {
3284 {
3285 .eraseblocks = { {4 * 1024, 1024} },
3286 .block_erase = spi_block_erase_20,
3287 }, {
3288 .eraseblocks = { {64 * 1024, 64} },
3289 .block_erase = spi_block_erase_d8,
3290 }, {
3291 .eraseblocks = { {4 * 1024 * 1024, 1} },
3292 .block_erase = spi_block_erase_60,
3293 }, {
3294 .eraseblocks = { {4 * 1024 * 1024, 1} },
3295 .block_erase = spi_block_erase_c7,
3296 }
3297 },
3298 .printlock = spi_prettyprint_status_register_bp2_bpl,
3299 .unlock = spi_disable_blockprotect,
3300 .write = spi_chip_write_256,
3301 .read = spi_chip_read,
3302 .voltage = {2700, 3600},
3303 },
3304
3305 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003306 .vendor = "Eon",
3307 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003308 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003309 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003310 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003311 .total_size = 64,
3312 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003313 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003314 .tested = TEST_UNTESTED,
3315 .probe = probe_spi_rdid,
3316 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003317 .block_erasers =
3318 {
3319 {
3320 .eraseblocks = {
3321 {4 * 1024, 2},
3322 {8 * 1024, 1},
3323 {16 * 1024, 1},
3324 {32 * 1024, 1},
3325 },
3326 .block_erase = spi_block_erase_d8,
3327 }, {
3328 .eraseblocks = { {64 * 1024, 1} },
3329 .block_erase = spi_block_erase_c7,
3330 }
3331 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003332 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003333 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003334 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003335 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003336 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003337 },
3338
3339 {
3340 .vendor = "Eon",
3341 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003342 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003343 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003344 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003345 .total_size = 64,
3346 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003347 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003348 .tested = TEST_UNTESTED,
3349 .probe = probe_spi_rdid,
3350 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003351 .block_erasers =
3352 {
3353 {
3354 .eraseblocks = {
3355 {32 * 1024, 1},
3356 {16 * 1024, 1},
3357 {8 * 1024, 1},
3358 {4 * 1024, 2},
3359 },
3360 .block_erase = spi_block_erase_d8,
3361 }, {
3362 .eraseblocks = { {64 * 1024, 1} },
3363 .block_erase = spi_block_erase_c7,
3364 }
3365 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003366 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003367 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003368 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003369 .read = spi_chip_read, /* Fast read (0x0B) supported */
3370 .voltage = {2700, 3600},
3371 },
3372
3373 {
3374 .vendor = "Eon",
3375 .name = "EN25P05",
3376 .bustype = BUS_SPI,
3377 .manufacture_id = EON_ID_NOPREFIX,
3378 .model_id = EON_EN25B05,
3379 .total_size = 64,
3380 .page_size = 256,
3381 .feature_bits = FEATURE_WRSR_WREN,
3382 .tested = TEST_UNTESTED,
3383 .probe = probe_spi_rdid,
3384 .probe_timing = TIMING_ZERO,
3385 .block_erasers =
3386 {
3387 {
3388 .eraseblocks = {
3389 {32 * 1024, 2} },
3390 .block_erase = spi_block_erase_d8,
3391 }, {
3392 .eraseblocks = { {64 * 1024, 1} },
3393 .block_erase = spi_block_erase_c7,
3394 }
3395 },
3396 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3397 .unlock = spi_disable_blockprotect,
3398 .write = spi_chip_write_256,
3399 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003400 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003401 },
3402
3403 {
3404 .vendor = "Eon",
3405 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003406 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003407 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003408 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003409 .total_size = 128,
3410 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003411 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003412 .tested = TEST_UNTESTED,
3413 .probe = probe_spi_rdid,
3414 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003415 .block_erasers =
3416 {
3417 {
3418 .eraseblocks = {
3419 {4 * 1024, 2},
3420 {8 * 1024, 1},
3421 {16 * 1024, 1},
3422 {32 * 1024, 3},
3423 },
3424 .block_erase = spi_block_erase_d8,
3425 }, {
3426 .eraseblocks = { {128 * 1024, 1} },
3427 .block_erase = spi_block_erase_c7,
3428 }
3429 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003430 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003431 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003432 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003433 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003434 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003435 },
3436
3437 {
3438 .vendor = "Eon",
3439 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003440 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003441 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003442 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003443 .total_size = 128,
3444 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003445 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003446 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003447 .probe = probe_spi_rdid,
3448 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003449 .block_erasers =
3450 {
3451 {
3452 .eraseblocks = {
3453 {32 * 1024, 3},
3454 {16 * 1024, 1},
3455 {8 * 1024, 1},
3456 {4 * 1024, 2},
3457 },
3458 .block_erase = spi_block_erase_d8,
3459 }, {
3460 .eraseblocks = { {128 * 1024, 1} },
3461 .block_erase = spi_block_erase_c7,
3462 }
3463 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003464 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003465 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003466 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003467 .read = spi_chip_read, /* Fast read (0x0B) supported */
3468 .voltage = {2700, 3600},
3469 },
3470
3471 {
3472 .vendor = "Eon",
3473 .name = "EN25P10",
3474 .bustype = BUS_SPI,
3475 .manufacture_id = EON_ID_NOPREFIX,
3476 .model_id = EON_EN25B10,
3477 .total_size = 128,
3478 .page_size = 256,
3479 .feature_bits = FEATURE_WRSR_WREN,
3480 .tested = TEST_UNTESTED,
3481 .probe = probe_spi_rdid,
3482 .probe_timing = TIMING_ZERO,
3483 .block_erasers =
3484 {
3485 {
3486 .eraseblocks = { {32 * 1024, 4} },
3487 .block_erase = spi_block_erase_d8,
3488 }, {
3489 .eraseblocks = { {128 * 1024, 1} },
3490 .block_erase = spi_block_erase_c7,
3491 }
3492 },
3493 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3494 .unlock = spi_disable_blockprotect,
3495 .write = spi_chip_write_256,
3496 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003497 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003498 },
3499
3500 {
3501 .vendor = "Eon",
3502 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003503 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003504 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003505 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003506 .total_size = 256,
3507 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003508 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003509 .tested = TEST_UNTESTED,
3510 .probe = probe_spi_rdid,
3511 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003512 .block_erasers =
3513 {
3514 {
3515 .eraseblocks = {
3516 {4 * 1024, 2},
3517 {8 * 1024, 1},
3518 {16 * 1024, 1},
3519 {32 * 1024, 1},
3520 {64 * 1024, 3}
3521 },
3522 .block_erase = spi_block_erase_d8,
3523 }, {
3524 .eraseblocks = { {256 * 1024, 1} },
3525 .block_erase = spi_block_erase_c7,
3526 }
3527 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003528 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003529 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003530 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003531 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003532 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003533 },
3534
3535 {
3536 .vendor = "Eon",
3537 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003538 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003539 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003540 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003541 .total_size = 256,
3542 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003543 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003544 .tested = TEST_UNTESTED,
3545 .probe = probe_spi_rdid,
3546 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003547 .block_erasers =
3548 {
3549 {
3550 .eraseblocks = {
3551 {64 * 1024, 3},
3552 {32 * 1024, 1},
3553 {16 * 1024, 1},
3554 {8 * 1024, 1},
3555 {4 * 1024, 2},
3556 },
3557 .block_erase = spi_block_erase_d8,
3558 }, {
3559 .eraseblocks = { {256 * 1024, 1} },
3560 .block_erase = spi_block_erase_c7,
3561 }
3562 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003563 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003564 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003565 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003566 .read = spi_chip_read, /* Fast read (0x0B) supported */
3567 .voltage = {2700, 3600},
3568 },
3569
3570 {
3571 .vendor = "Eon",
3572 .name = "EN25P20",
3573 .bustype = BUS_SPI,
3574 .manufacture_id = EON_ID_NOPREFIX,
3575 .model_id = EON_EN25B20,
3576 .total_size = 256,
3577 .page_size = 256,
3578 .feature_bits = FEATURE_WRSR_WREN,
3579 .tested = TEST_UNTESTED,
3580 .probe = probe_spi_rdid,
3581 .probe_timing = TIMING_ZERO,
3582 .block_erasers =
3583 {
3584 {
3585 .eraseblocks = { {64 * 1024, 4} },
3586 .block_erase = spi_block_erase_d8,
3587 }, {
3588 .eraseblocks = { {256 * 1024, 1} },
3589 .block_erase = spi_block_erase_c7,
3590 }
3591 },
3592 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3593 .unlock = spi_disable_blockprotect,
3594 .write = spi_chip_write_256,
3595 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003596 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003597 },
3598
3599 {
3600 .vendor = "Eon",
3601 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003602 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003603 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003604 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003605 .total_size = 512,
3606 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003607 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003608 .tested = TEST_UNTESTED,
3609 .probe = probe_spi_rdid,
3610 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003611 .block_erasers =
3612 {
3613 {
3614 .eraseblocks = {
3615 {4 * 1024, 2},
3616 {8 * 1024, 1},
3617 {16 * 1024, 1},
3618 {32 * 1024, 1},
3619 {64 * 1024, 7}
3620 },
3621 .block_erase = spi_block_erase_d8,
3622 }, {
3623 .eraseblocks = { {512 * 1024, 1} },
3624 .block_erase = spi_block_erase_c7,
3625 }
3626 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003627 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003628 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003629 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003630 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003631 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003632 },
3633
3634 {
3635 .vendor = "Eon",
3636 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003637 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003638 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003639 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003640 .total_size = 512,
3641 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003642 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003643 .tested = TEST_UNTESTED,
3644 .probe = probe_spi_rdid,
3645 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003646 .block_erasers =
3647 {
3648 {
3649 .eraseblocks = {
3650 {64 * 1024, 7},
3651 {32 * 1024, 1},
3652 {16 * 1024, 1},
3653 {8 * 1024, 1},
3654 {4 * 1024, 2},
3655 },
3656 .block_erase = spi_block_erase_d8,
3657 }, {
3658 .eraseblocks = { {512 * 1024, 1} },
3659 .block_erase = spi_block_erase_c7,
3660 }
3661 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003662 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003663 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003664 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003665 .read = spi_chip_read, /* Fast read (0x0B) supported */
3666 .voltage = {2700, 3600},
3667 },
3668
3669 {
3670 .vendor = "Eon",
3671 .name = "EN25P40",
3672 .bustype = BUS_SPI,
3673 .manufacture_id = EON_ID_NOPREFIX,
3674 .model_id = EON_EN25B40,
3675 .total_size = 512,
3676 .page_size = 256,
3677 .feature_bits = FEATURE_WRSR_WREN,
3678 .tested = TEST_UNTESTED,
3679 .probe = probe_spi_rdid,
3680 .probe_timing = TIMING_ZERO,
3681 .block_erasers =
3682 {
3683 {
3684 .eraseblocks = { {64 * 1024, 8} },
3685 .block_erase = spi_block_erase_d8,
3686 }, {
3687 .eraseblocks = { {512 * 1024, 1} },
3688 .block_erase = spi_block_erase_c7,
3689 }
3690 },
3691 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3692 .unlock = spi_disable_blockprotect,
3693 .write = spi_chip_write_256,
3694 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003695 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003696 },
3697
3698 {
3699 .vendor = "Eon",
3700 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003701 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003702 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003703 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003704 .total_size = 1024,
3705 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003706 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003707 .tested = TEST_UNTESTED,
3708 .probe = probe_spi_rdid,
3709 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003710 .block_erasers =
3711 {
3712 {
3713 .eraseblocks = {
3714 {4 * 1024, 2},
3715 {8 * 1024, 1},
3716 {16 * 1024, 1},
3717 {32 * 1024, 1},
3718 {64 * 1024, 15}
3719 },
3720 .block_erase = spi_block_erase_d8,
3721 }, {
3722 .eraseblocks = { {1024 * 1024, 1} },
3723 .block_erase = spi_block_erase_c7,
3724 }
3725 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003726 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003727 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003728 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003729 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003730 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003731 },
3732
3733 {
3734 .vendor = "Eon",
3735 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003736 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003737 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003738 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003739 .total_size = 1024,
3740 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003741 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003742 .tested = TEST_UNTESTED,
3743 .probe = probe_spi_rdid,
3744 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003745 .block_erasers =
3746 {
3747 {
3748 .eraseblocks = {
3749 {64 * 1024, 15},
3750 {32 * 1024, 1},
3751 {16 * 1024, 1},
3752 {8 * 1024, 1},
3753 {4 * 1024, 2},
3754 },
3755 .block_erase = spi_block_erase_d8,
3756 }, {
3757 .eraseblocks = { {1024 * 1024, 1} },
3758 .block_erase = spi_block_erase_c7,
3759 }
3760 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003761 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003762 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003763 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003764 .read = spi_chip_read, /* Fast read (0x0B) supported */
3765 .voltage = {2700, 3600},
3766 },
3767
3768 {
3769 .vendor = "Eon",
3770 .name = "EN25P80",
3771 .bustype = BUS_SPI,
3772 .manufacture_id = EON_ID_NOPREFIX,
3773 .model_id = EON_EN25B80,
3774 .total_size = 1024,
3775 .page_size = 256,
3776 .feature_bits = FEATURE_WRSR_WREN,
3777 .tested = TEST_UNTESTED,
3778 .probe = probe_spi_rdid,
3779 .probe_timing = TIMING_ZERO,
3780 .block_erasers =
3781 {
3782 {
3783 .eraseblocks = { {64 * 1024, 16} },
3784 .block_erase = spi_block_erase_d8,
3785 }, {
3786 .eraseblocks = { {1024 * 1024, 1} },
3787 .block_erase = spi_block_erase_c7,
3788 }
3789 },
3790 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3791 .unlock = spi_disable_blockprotect,
3792 .write = spi_chip_write_256,
3793 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003794 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003795 },
3796
3797 {
3798 .vendor = "Eon",
3799 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003800 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003801 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003802 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003803 .total_size = 2048,
3804 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003805 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003806 .tested = TEST_UNTESTED,
3807 .probe = probe_spi_rdid,
3808 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003809 .block_erasers =
3810 {
3811 {
3812 .eraseblocks = {
3813 {4 * 1024, 2},
3814 {8 * 1024, 1},
3815 {16 * 1024, 1},
3816 {32 * 1024, 1},
3817 {64 * 1024, 31},
3818 },
3819 .block_erase = spi_block_erase_d8,
3820 }, {
3821 .eraseblocks = { {2 * 1024 * 1024, 1} },
3822 .block_erase = spi_block_erase_c7,
3823 }
3824 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003825 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003826 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003827 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003828 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003829 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003830 },
3831
3832 {
3833 .vendor = "Eon",
3834 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003835 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003836 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003837 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003838 .total_size = 2048,
3839 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003840 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003841 .tested = TEST_UNTESTED,
3842 .probe = probe_spi_rdid,
3843 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003844 .block_erasers =
3845 {
3846 {
3847 .eraseblocks = {
3848 {64 * 1024, 31},
3849 {32 * 1024, 1},
3850 {16 * 1024, 1},
3851 {8 * 1024, 1},
3852 {4 * 1024, 2},
3853 },
3854 .block_erase = spi_block_erase_d8,
3855 }, {
3856 .eraseblocks = { {2 * 1024 * 1024, 1} },
3857 .block_erase = spi_block_erase_c7,
3858 }
3859 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003860 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003861 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003862 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003863 .read = spi_chip_read, /* Fast read (0x0B) supported */
3864 .voltage = {2700, 3600},
3865 },
3866
3867 {
3868 .vendor = "Eon",
3869 .name = "EN25P16",
3870 .bustype = BUS_SPI,
3871 .manufacture_id = EON_ID_NOPREFIX,
3872 .model_id = EON_EN25B16,
3873 .total_size = 2048,
3874 .page_size = 256,
3875 .feature_bits = FEATURE_WRSR_WREN,
3876 .tested = TEST_UNTESTED,
3877 .probe = probe_spi_rdid,
3878 .probe_timing = TIMING_ZERO,
3879 .block_erasers =
3880 {
3881 {
3882 .eraseblocks = { {64 * 1024, 32} },
3883 .block_erase = spi_block_erase_d8,
3884 }, {
3885 .eraseblocks = { {2 * 1024 * 1024, 1} },
3886 .block_erase = spi_block_erase_c7,
3887 }
3888 },
3889 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3890 .unlock = spi_disable_blockprotect,
3891 .write = spi_chip_write_256,
3892 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003893 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003894 },
3895
3896 {
3897 .vendor = "Eon",
3898 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003899 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003900 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003901 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003902 .total_size = 4096,
3903 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003904 /* OTP: 512B total; enter 0x3A */
3905 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003906 .tested = TEST_UNTESTED,
3907 .probe = probe_spi_rdid,
3908 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003909 .block_erasers =
3910 {
3911 {
3912 .eraseblocks = {
3913 {4 * 1024, 2},
3914 {8 * 1024, 1},
3915 {16 * 1024, 1},
3916 {32 * 1024, 1},
3917 {64 * 1024, 63},
3918 },
3919 .block_erase = spi_block_erase_d8,
3920 }, {
3921 .eraseblocks = { {4 * 1024 * 1024, 1} },
3922 .block_erase = spi_block_erase_c7,
3923 }
3924 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003926 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003927 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003928 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003929 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003930 },
3931
3932 {
3933 .vendor = "Eon",
3934 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003935 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003936 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003937 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003938 .total_size = 4096,
3939 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003940 /* OTP: 512B total; enter 0x3A */
3941 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00003942 .tested = TEST_UNTESTED,
3943 .probe = probe_spi_rdid,
3944 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003945 .block_erasers =
3946 {
3947 {
3948 .eraseblocks = {
3949 {64 * 1024, 63},
3950 {32 * 1024, 1},
3951 {16 * 1024, 1},
3952 {8 * 1024, 1},
3953 {4 * 1024, 2},
3954 },
3955 .block_erase = spi_block_erase_d8,
3956 }, {
3957 .eraseblocks = { {4 * 1024 * 1024, 1} },
3958 .block_erase = spi_block_erase_c7,
3959 }
3960 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003961 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003962 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003963 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003964 .read = spi_chip_read, /* Fast read (0x0B) supported */
3965 .voltage = {2700, 3600},
3966 },
3967
3968 {
3969 .vendor = "Eon",
3970 .name = "EN25P32", /* Uniform version of EN25B32 */
3971 .bustype = BUS_SPI,
3972 .manufacture_id = EON_ID_NOPREFIX,
3973 .model_id = EON_EN25B32,
3974 .total_size = 4096,
3975 .page_size = 256,
3976 /* OTP: 512B total; enter 0x3A */
3977 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3978 .tested = TEST_UNTESTED,
3979 .probe = probe_spi_rdid,
3980 .probe_timing = TIMING_ZERO,
3981 .block_erasers =
3982 {
3983 {
3984 .eraseblocks = { {64 * 1024, 64} },
3985 .block_erase = spi_block_erase_d8,
3986 }, {
3987 .eraseblocks = { {4 * 1024 * 1024, 1} },
3988 .block_erase = spi_block_erase_c7,
3989 }
3990 },
3991 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
3992 .unlock = spi_disable_blockprotect,
3993 .write = spi_chip_write_256,
3994 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003995 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003996 },
3997
3998 {
3999 .vendor = "Eon",
4000 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004001 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004002 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004003 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004004 .total_size = 8192,
4005 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004006 /* OTP: 512B total; enter 0x3A */
4007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004008 .tested = TEST_UNTESTED,
4009 .probe = probe_spi_rdid,
4010 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004011 .block_erasers =
4012 {
4013 {
4014 .eraseblocks = {
4015 {4 * 1024, 2},
4016 {8 * 1024, 1},
4017 {16 * 1024, 1},
4018 {32 * 1024, 1},
4019 {64 * 1024, 127},
4020 },
4021 .block_erase = spi_block_erase_d8,
4022 }, {
4023 .eraseblocks = { {8 * 1024 * 1024, 1} },
4024 .block_erase = spi_block_erase_c7,
4025 }
4026 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004027 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004028 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004029 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004030 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004031 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004032 },
4033
4034 {
4035 .vendor = "Eon",
4036 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004037 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004038 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004039 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004040 .total_size = 8192,
4041 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004042 /* OTP: 512B total; enter 0x3A */
4043 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004044 .tested = TEST_UNTESTED,
4045 .probe = probe_spi_rdid,
4046 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004047 .block_erasers =
4048 {
4049 {
4050 .eraseblocks = {
4051 {64 * 1024, 127},
4052 {32 * 1024, 1},
4053 {16 * 1024, 1},
4054 {8 * 1024, 1},
4055 {4 * 1024, 2},
4056 },
4057 .block_erase = spi_block_erase_d8,
4058 }, {
4059 .eraseblocks = { {8 * 1024 * 1024, 1} },
4060 .block_erase = spi_block_erase_c7,
4061 }
4062 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004063 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004064 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004065 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004066 .read = spi_chip_read, /* Fast read (0x0B) supported */
4067 .voltage = {2700, 3600},
4068 },
4069
4070 {
4071 .vendor = "Eon",
4072 .name = "EN25P64",
4073 .bustype = BUS_SPI,
4074 .manufacture_id = EON_ID_NOPREFIX,
4075 .model_id = EON_EN25B64,
4076 .total_size = 8192,
4077 .page_size = 256,
4078 /* OTP: 512B total; enter 0x3A */
4079 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4080 .tested = TEST_UNTESTED,
4081 .probe = probe_spi_rdid,
4082 .probe_timing = TIMING_ZERO,
4083 .block_erasers =
4084 {
4085 {
4086 .eraseblocks = { {64 * 1024, 128} },
4087 .block_erase = spi_block_erase_d8,
4088 }, {
4089 .eraseblocks = { {8 * 1024 * 1024, 1} },
4090 .block_erase = spi_block_erase_c7,
4091 }
4092 },
4093 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4094 .unlock = spi_disable_blockprotect,
4095 .write = spi_chip_write_256,
4096 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004097 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004098 },
4099
4100 {
4101 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004102 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004103 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004104 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004105 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004106 .total_size = 64,
4107 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004108 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004109 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004110 .probe = probe_spi_rdid,
4111 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004112 .block_erasers =
4113 {
4114 {
4115 .eraseblocks = { {4 * 1024, 16} },
4116 .block_erase = spi_block_erase_20,
4117 }, {
4118 .eraseblocks = { {32 * 1024, 2} },
4119 .block_erase = spi_block_erase_d8,
4120 }, {
4121 .eraseblocks = { {32 * 1024, 2} },
4122 .block_erase = spi_block_erase_52,
4123 }, {
4124 .eraseblocks = { {64 * 1024, 1} },
4125 .block_erase = spi_block_erase_60,
4126 }, {
4127 .eraseblocks = { {64 * 1024, 1} },
4128 .block_erase = spi_block_erase_c7,
4129 }
4130 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004131 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004132 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004133 .write = spi_chip_write_256,
4134 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004135 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004136 },
4137
4138 {
4139 .vendor = "Eon",
4140 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004141 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004142 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004143 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004144 .total_size = 128,
4145 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004146 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004147 .tested = TEST_UNTESTED,
4148 .probe = probe_spi_rdid,
4149 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004150 .block_erasers =
4151 {
4152 {
4153 .eraseblocks = { {4 * 1024, 32} },
4154 .block_erase = spi_block_erase_20,
4155 }, {
4156 .eraseblocks = { {32 * 1024, 4} },
4157 .block_erase = spi_block_erase_d8,
4158 }, {
4159 .eraseblocks = { {32 * 1024, 4} },
4160 .block_erase = spi_block_erase_52,
4161 }, {
4162 .eraseblocks = { {128 * 1024, 1} },
4163 .block_erase = spi_block_erase_60,
4164 }, {
4165 .eraseblocks = { {128 * 1024, 1} },
4166 .block_erase = spi_block_erase_c7,
4167 }
4168 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004169 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004170 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004171 .write = spi_chip_write_256,
4172 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004173 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004174 },
4175
4176 {
4177 .vendor = "Eon",
4178 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004179 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004180 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004181 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004182 .total_size = 256,
4183 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004184 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004185 .tested = TEST_UNTESTED,
4186 .probe = probe_spi_rdid,
4187 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004188 .block_erasers =
4189 {
4190 {
4191 .eraseblocks = { {4 * 1024, 64} },
4192 .block_erase = spi_block_erase_20,
4193 }, {
4194 .eraseblocks = { {64 * 1024, 4} },
4195 .block_erase = spi_block_erase_d8,
4196 }, {
4197 .eraseblocks = { {64 * 1024, 4} },
4198 .block_erase = spi_block_erase_52,
4199 }, {
4200 .eraseblocks = { {256 * 1024, 1} },
4201 .block_erase = spi_block_erase_60,
4202 }, {
4203 .eraseblocks = { {256 * 1024, 1} },
4204 .block_erase = spi_block_erase_c7,
4205 }
4206 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004207 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004208 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004209 .write = spi_chip_write_256,
4210 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004211 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004212 },
4213
4214 {
4215 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004216 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004217 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004218 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004219 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004220 .total_size = 512,
4221 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004222 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004223 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004224 .probe = probe_spi_rdid,
4225 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004226 .block_erasers =
4227 {
4228 {
Sean Nelson54596372010-01-09 05:30:14 +00004229 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004230 .block_erase = spi_block_erase_20,
4231 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004232 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004233 .block_erase = spi_block_erase_d8,
4234 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004235 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004236 .block_erase = spi_block_erase_60,
4237 }, {
Sean Nelson54596372010-01-09 05:30:14 +00004238 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004239 .block_erase = spi_block_erase_c7,
4240 },
4241 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004242 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004243 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004244 .write = spi_chip_write_256,
4245 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004246 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004247 },
4248
4249 {
4250 .vendor = "Eon",
4251 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004252 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004253 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004254 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004255 .total_size = 1024,
4256 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004257 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004258 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004259 .probe = probe_spi_rdid,
4260 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004261 .block_erasers =
4262 {
4263 {
4264 .eraseblocks = { {4 * 1024, 256} },
4265 .block_erase = spi_block_erase_20,
4266 }, {
4267 .eraseblocks = { {64 * 1024, 16} },
4268 .block_erase = spi_block_erase_d8,
4269 }, {
4270 .eraseblocks = { {1024 * 1024, 1} },
4271 .block_erase = spi_block_erase_60,
4272 }, {
4273 .eraseblocks = { {1024 * 1024, 1} },
4274 .block_erase = spi_block_erase_c7,
4275 }
4276 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004277 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004278 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004279 .write = spi_chip_write_256,
4280 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004281 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004282 },
4283
4284 {
4285 .vendor = "Eon",
4286 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004287 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004288 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004289 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004290 .total_size = 2048,
4291 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004292 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004293 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004294 .probe = probe_spi_rdid,
4295 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004296 .block_erasers =
4297 {
4298 {
4299 .eraseblocks = { {4 * 1024, 512} },
4300 .block_erase = spi_block_erase_20,
4301 }, {
4302 .eraseblocks = { {64 * 1024, 32} },
4303 .block_erase = spi_block_erase_d8,
4304 }, {
4305 .eraseblocks = { {2 * 1024 * 1024, 1} },
4306 .block_erase = spi_block_erase_60,
4307 }, {
4308 .eraseblocks = { {2 * 1024 * 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 Hailfinger80243c92009-06-05 20:53:07 +00004314 .write = spi_chip_write_256,
4315 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004316 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004317 },
4318
4319 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004320 .vendor = "Eon",
4321 .name = "EN25F32",
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_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004325 .total_size = 4096,
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 Hailfingera0a6ae92009-06-15 12:10:57 +00004329 .probe = probe_spi_rdid,
4330 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004331 .block_erasers =
4332 {
4333 {
4334 .eraseblocks = { {4 * 1024, 1024} },
4335 .block_erase = spi_block_erase_20,
4336 }, {
4337 .eraseblocks = { {64 * 1024, 64} },
4338 .block_erase = spi_block_erase_d8,
4339 }, {
4340 .eraseblocks = { {4 * 1024 * 1024, 1} },
4341 .block_erase = spi_block_erase_60,
4342 }, {
4343 .eraseblocks = { {4 * 1024 * 1024, 1} },
4344 .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 Hailfingera0a6ae92009-06-15 12:10:57 +00004349 .write = spi_chip_write_256,
4350 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004351 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004352 },
4353
4354 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004355 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004356 .name = "EN25F64",
4357 .bustype = BUS_SPI,
4358 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004359 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004360 .total_size = 8192,
4361 .page_size = 256,
4362 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004363 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004364 .probe = probe_spi_rdid,
4365 .probe_timing = TIMING_ZERO,
4366 .block_erasers =
4367 {
4368 {
4369 .eraseblocks = { {4 * 1024, 2048} },
4370 .block_erase = spi_block_erase_20,
4371 }, {
4372 .eraseblocks = { {64 * 1024, 128} },
4373 .block_erase = spi_block_erase_d8,
4374 }, {
4375 .eraseblocks = { {8 * 1024 * 1024, 1} },
4376 .block_erase = spi_block_erase_60,
4377 }, {
4378 .eraseblocks = { {8 * 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 */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004383 .unlock = spi_disable_blockprotect,
4384 .write = spi_chip_write_256,
4385 .read = spi_chip_read,
4386 .voltage = {2700, 3600},
4387 },
4388
4389 {
4390 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004391 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004392 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004393 .manufacture_id = EON_ID_NOPREFIX,
4394 .model_id = EON_EN25Q40,
4395 .total_size = 512,
4396 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004397 /* OTP: 256B total; enter 0x3A */
4398 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004399 .tested = TEST_UNTESTED,
4400 .probe = probe_spi_rdid,
4401 .probe_timing = TIMING_ZERO,
4402 .block_erasers =
4403 {
4404 {
4405 .eraseblocks = { {4 * 1024, 128} },
4406 .block_erase = spi_block_erase_20,
4407 }, {
4408 .eraseblocks = { {64 * 1024, 8} },
4409 .block_erase = spi_block_erase_d8,
4410 }, {
4411 .eraseblocks = { {512 * 1024, 1} },
4412 .block_erase = spi_block_erase_60,
4413 }, {
4414 .eraseblocks = { {512 * 1024, 1} },
4415 .block_erase = spi_block_erase_c7,
4416 }
4417 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004418 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004419 .unlock = spi_disable_blockprotect,
4420 .write = spi_chip_write_256,
4421 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004422 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004423 },
4424
4425 {
4426 .vendor = "Eon",
4427 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004428 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004429 .manufacture_id = EON_ID_NOPREFIX,
4430 .model_id = EON_EN25Q80,
4431 .total_size = 1024,
4432 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004433 /* OTP: 256B total; enter 0x3A */
4434 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004435 .tested = TEST_UNTESTED,
4436 .probe = probe_spi_rdid,
4437 .probe_timing = TIMING_ZERO,
4438 .block_erasers =
4439 {
4440 {
4441 .eraseblocks = { {4 * 1024, 256} },
4442 .block_erase = spi_block_erase_20,
4443 }, {
4444 .eraseblocks = { {64 * 1024, 16} },
4445 .block_erase = spi_block_erase_d8,
4446 }, {
4447 .eraseblocks = { {1024 * 1024, 1} },
4448 .block_erase = spi_block_erase_60,
4449 }, {
4450 .eraseblocks = { {1024 * 1024, 1} },
4451 .block_erase = spi_block_erase_c7,
4452 }
4453 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004454 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004455 .unlock = spi_disable_blockprotect,
4456 .write = spi_chip_write_256,
4457 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004458 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004459 },
4460
4461 {
4462 /* Note: EN25D16 is an evil twin which shares the model ID
4463 but has different write protection capabilities */
4464 .vendor = "Eon",
4465 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004466 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004467 .manufacture_id = EON_ID_NOPREFIX,
4468 .model_id = EON_EN25Q16,
4469 .total_size = 2048,
4470 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004471 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4472 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004473 .tested = TEST_UNTESTED,
4474 .probe = probe_spi_rdid,
4475 .probe_timing = TIMING_ZERO,
4476 .block_erasers =
4477 {
4478 {
4479 .eraseblocks = { {4 * 1024, 512} },
4480 .block_erase = spi_block_erase_20,
4481 }, {
4482 .eraseblocks = { {64 * 1024, 32} },
4483 .block_erase = spi_block_erase_d8,
4484 }, {
4485 /* not supported by Q16 version */
4486 .eraseblocks = { {64 * 1024, 32} },
4487 .block_erase = spi_block_erase_52,
4488 }, {
4489 .eraseblocks = { {2 * 1024 * 1024, 1} },
4490 .block_erase = spi_block_erase_60,
4491 }, {
4492 .eraseblocks = { {2 * 1024 * 1024, 1} },
4493 .block_erase = spi_block_erase_c7,
4494 }
4495 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004496 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004497 .unlock = spi_disable_blockprotect,
4498 .write = spi_chip_write_256,
4499 .read = spi_chip_read,
4500 .voltage = {2700, 3600},
4501 },
4502
4503 {
4504 .vendor = "Eon",
4505 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004506 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004507 .manufacture_id = EON_ID_NOPREFIX,
4508 .model_id = EON_EN25Q32,
4509 .total_size = 4096,
4510 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004511 /* OTP: 512B total; enter 0x3A */
4512 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004513 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004514 .probe = probe_spi_rdid,
4515 .probe_timing = TIMING_ZERO,
4516 .block_erasers =
4517 {
4518 {
4519 .eraseblocks = { {4 * 1024, 1024} },
4520 .block_erase = spi_block_erase_20,
4521 }, {
4522 .eraseblocks = { {64 * 1024, 64} },
4523 .block_erase = spi_block_erase_d8,
4524 }, {
4525 .eraseblocks = { {4 * 1024 * 1024, 1} },
4526 .block_erase = spi_block_erase_60,
4527 }, {
4528 .eraseblocks = { {4 * 1024 * 1024, 1} },
4529 .block_erase = spi_block_erase_c7,
4530 }
4531 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004532 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004533 .unlock = spi_disable_blockprotect,
4534 .write = spi_chip_write_256,
4535 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004536 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004537 },
4538
4539 {
4540 .vendor = "Eon",
4541 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004542 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004543 .manufacture_id = EON_ID_NOPREFIX,
4544 .model_id = EON_EN25Q64,
4545 .total_size = 8192,
4546 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004547 /* OTP: 512B total; enter 0x3A */
4548 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004549 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004550 .probe = probe_spi_rdid,
4551 .probe_timing = TIMING_ZERO,
4552 .block_erasers =
4553 {
4554 {
4555 .eraseblocks = { {4 * 1024, 2048} },
4556 .block_erase = spi_block_erase_20,
4557 }, {
4558 .eraseblocks = { {64 * 1024, 128} },
4559 .block_erase = spi_block_erase_d8,
4560 }, {
4561 .eraseblocks = { {8 * 1024 * 1024, 1} },
4562 .block_erase = spi_block_erase_60,
4563 }, {
4564 .eraseblocks = { {8 * 1024 * 1024, 1} },
4565 .block_erase = spi_block_erase_c7,
4566 }
4567 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004568 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004569 .unlock = spi_disable_blockprotect,
4570 .write = spi_chip_write_256,
4571 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004572 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004573 },
4574
4575 {
4576 .vendor = "Eon",
4577 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004578 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004579 .manufacture_id = EON_ID_NOPREFIX,
4580 .model_id = EON_EN25Q128,
4581 .total_size = 16384,
4582 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004583 /* OTP: 512B total; enter 0x3A */
4584 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004585 .tested = TEST_UNTESTED,
4586 .probe = probe_spi_rdid,
4587 .probe_timing = TIMING_ZERO,
4588 .block_erasers =
4589 {
4590 {
4591 .eraseblocks = { {4 * 1024, 4096} },
4592 .block_erase = spi_block_erase_20,
4593 }, {
4594 .eraseblocks = { {64 * 1024, 256} },
4595 .block_erase = spi_block_erase_d8,
4596 }, {
4597 .eraseblocks = { {16 * 1024 * 1024, 1} },
4598 .block_erase = spi_block_erase_60,
4599 }, {
4600 .eraseblocks = { {16 * 1024 * 1024, 1} },
4601 .block_erase = spi_block_erase_c7,
4602 }
4603 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004604 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004605 .unlock = spi_disable_blockprotect,
4606 .write = spi_chip_write_256,
4607 .read = spi_chip_read,
4608 },
4609
4610 {
4611 .vendor = "Eon",
4612 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004613 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004614 .manufacture_id = EON_ID_NOPREFIX,
4615 .model_id = EON_EN25QH16,
4616 .total_size = 2048,
4617 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004618 /* supports SFDP */
4619 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004620 /* QPI enable 0x38, disable 0xFF */
4621 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004622 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004623 .probe = probe_spi_rdid,
4624 .probe_timing = TIMING_ZERO,
4625 .block_erasers =
4626 {
4627 {
4628 .eraseblocks = { {4 * 1024, 512} },
4629 .block_erase = spi_block_erase_20,
4630 }, {
4631 .eraseblocks = { {64 * 1024, 32} },
4632 .block_erase = spi_block_erase_d8,
4633 }, {
4634 .eraseblocks = { {1024 * 2048, 1} },
4635 .block_erase = spi_block_erase_60,
4636 }, {
4637 .eraseblocks = { {1024 * 2048, 1} },
4638 .block_erase = spi_block_erase_c7,
4639 }
4640 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004641 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004642 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004643 .write = spi_chip_write_256,
4644 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004645 .voltage = {2700, 3600},
4646 },
4647
4648 {
4649 .vendor = "Eon",
4650 .name = "EN25QH32",
4651 .bustype = BUS_SPI,
4652 .manufacture_id = EON_ID_NOPREFIX,
4653 .model_id = EON_EN25QH32,
4654 .total_size = 4096,
4655 .page_size = 256,
4656 /* supports SFDP */
4657 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004658 /* QPI enable 0x38, disable 0xFF */
4659 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004660 .tested = TEST_UNTESTED,
4661 .probe = probe_spi_rdid,
4662 .probe_timing = TIMING_ZERO,
4663 .block_erasers =
4664 {
4665 {
4666 .eraseblocks = { {4 * 1024, 1024} },
4667 .block_erase = spi_block_erase_20,
4668 }, {
4669 .eraseblocks = { {64 * 1024, 64} },
4670 .block_erase = spi_block_erase_d8,
4671 }, {
4672 .eraseblocks = { {1024 * 4096, 1} },
4673 .block_erase = spi_block_erase_60,
4674 }, {
4675 .eraseblocks = { {1024 * 4096, 1} },
4676 .block_erase = spi_block_erase_c7,
4677 }
4678 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004679 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004680 .unlock = spi_disable_blockprotect_bp3_srwd,
4681 .write = spi_chip_write_256,
4682 .read = spi_chip_read,
4683 .voltage = {2700, 3600},
4684 },
4685
4686 {
4687 .vendor = "Eon",
4688 .name = "EN25QH64",
4689 .bustype = BUS_SPI,
4690 .manufacture_id = EON_ID_NOPREFIX,
4691 .model_id = EON_EN25QH64,
4692 .total_size = 8192,
4693 .page_size = 256,
4694 /* supports SFDP */
4695 /* OTP: 512B total; enter 0x3A */
4696 /* QPI enable 0x38, disable 0xFF */
4697 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004698 .tested = TEST_OK_PR,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004699 .probe = probe_spi_rdid,
4700 .probe_timing = TIMING_ZERO,
4701 .block_erasers = {
4702 {
4703 .eraseblocks = { {4 * 1024, 2048} },
4704 .block_erase = spi_block_erase_20,
4705 }, {
4706 .eraseblocks = { {64 * 1024, 128} },
4707 .block_erase = spi_block_erase_d8,
4708 }, {
4709 .eraseblocks = { { 8192 * 1024, 1} },
4710 .block_erase = spi_block_erase_60,
4711 }, {
4712 .eraseblocks = { { 8192 * 1024, 1} },
4713 .block_erase = spi_block_erase_c7,
4714 }
4715 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004716 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004717 .unlock = spi_disable_blockprotect_bp3_srwd,
4718 .write = spi_chip_write_256,
4719 .read = spi_chip_read,
4720 .voltage = {2700, 3600},
4721 },
4722
4723 {
4724 .vendor = "Eon",
4725 .name = "EN25QH128",
4726 .bustype = BUS_SPI,
4727 .manufacture_id = EON_ID_NOPREFIX,
4728 .model_id = EON_EN25QH128,
4729 .total_size = 16384,
4730 .page_size = 256,
4731 /* supports SFDP */
4732 /* OTP: 512B total; enter 0x3A */
4733 /* QPI enable 0x38, disable 0xFF */
4734 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4735 .tested = TEST_UNTESTED,
4736 .probe = probe_spi_rdid,
4737 .probe_timing = TIMING_ZERO,
4738 .block_erasers = {
4739 {
4740 .eraseblocks = { {4 * 1024, 4096} },
4741 .block_erase = spi_block_erase_20,
4742 }, {
4743 .eraseblocks = { {64 * 1024, 256} },
4744 .block_erase = spi_block_erase_d8,
4745 }, {
4746 .eraseblocks = { { 16384 * 1024, 1} },
4747 .block_erase = spi_block_erase_60,
4748 }, {
4749 .eraseblocks = { { 16384 * 1024, 1} },
4750 .block_erase = spi_block_erase_c7,
4751 }
4752 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004753 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004754 .unlock = spi_disable_blockprotect_bp3_srwd,
4755 .write = spi_chip_write_256,
4756 .read = spi_chip_read,
4757 .voltage = {2700, 3600},
4758 },
4759
4760 {
4761 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004762 .name = "EN25S10",
4763 .bustype = BUS_SPI,
4764 .manufacture_id = EON_ID_NOPREFIX,
4765 .model_id = EON_EN25S10,
4766 .total_size = 128,
4767 .page_size = 256,
4768 /* OTP: 256B total; enter 0x3A */
4769 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4770 .tested = TEST_UNTESTED,
4771 .probe = probe_spi_rdid,
4772 .probe_timing = TIMING_ZERO,
4773 .block_erasers = {
4774 {
4775 .eraseblocks = { {4 * 1024, 32} },
4776 .block_erase = spi_block_erase_20,
4777 }, {
4778 .eraseblocks = { {32 * 1024, 4} },
4779 .block_erase = spi_block_erase_52,
4780 }, {
4781 .eraseblocks = { {128 * 1024, 1} },
4782 .block_erase = spi_block_erase_60,
4783 }, {
4784 .eraseblocks = { {128 * 1024, 1} },
4785 .block_erase = spi_block_erase_c7,
4786 }
4787 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004788 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004789 .unlock = spi_disable_blockprotect,
4790 .write = spi_chip_write_256,
4791 .read = spi_chip_read,
4792 .voltage = {1650, 1950},
4793 },
4794
4795 {
4796 .vendor = "Eon",
4797 .name = "EN25S20",
4798 .bustype = BUS_SPI,
4799 .manufacture_id = EON_ID_NOPREFIX,
4800 .model_id = EON_EN25S20,
4801 .total_size = 256,
4802 .page_size = 256,
4803 /* OTP: 256B total; enter 0x3A */
4804 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4805 .tested = TEST_UNTESTED,
4806 .probe = probe_spi_rdid,
4807 .probe_timing = TIMING_ZERO,
4808 .block_erasers = {
4809 {
4810 .eraseblocks = { {4 * 1024, 64} },
4811 .block_erase = spi_block_erase_20,
4812 }, {
4813 .eraseblocks = { {64 * 1024, 4} },
4814 .block_erase = spi_block_erase_d8,
4815 }, {
4816 .eraseblocks = { {256 * 1024, 1} },
4817 .block_erase = spi_block_erase_60,
4818 }, {
4819 .eraseblocks = { {256 * 1024, 1} },
4820 .block_erase = spi_block_erase_c7,
4821 }
4822 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004823 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004824 .unlock = spi_disable_blockprotect,
4825 .write = spi_chip_write_256,
4826 .read = spi_chip_read,
4827 .voltage = {1650, 1950},
4828 },
4829
4830 {
4831 .vendor = "Eon",
4832 .name = "EN25S40",
4833 .bustype = BUS_SPI,
4834 .manufacture_id = EON_ID_NOPREFIX,
4835 .model_id = EON_EN25S40,
4836 .total_size = 512,
4837 .page_size = 256,
4838 /* OTP: 256B total; enter 0x3A */
4839 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4840 .tested = TEST_UNTESTED,
4841 .probe = probe_spi_rdid,
4842 .probe_timing = TIMING_ZERO,
4843 .block_erasers = {
4844 {
4845 .eraseblocks = { {4 * 1024, 128} },
4846 .block_erase = spi_block_erase_20,
4847 }, {
4848 .eraseblocks = { {64 * 1024, 8} },
4849 .block_erase = spi_block_erase_d8,
4850 }, {
4851 .eraseblocks = { {512 * 1024, 1} },
4852 .block_erase = spi_block_erase_60,
4853 }, {
4854 .eraseblocks = { {512 * 1024, 1} },
4855 .block_erase = spi_block_erase_c7,
4856 }
4857 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004858 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004859 .unlock = spi_disable_blockprotect,
4860 .write = spi_chip_write_256,
4861 .read = spi_chip_read,
4862 .voltage = {1650, 1950},
4863 },
4864
4865 {
4866 .vendor = "Eon",
4867 .name = "EN25S80",
4868 .bustype = BUS_SPI,
4869 .manufacture_id = EON_ID_NOPREFIX,
4870 .model_id = EON_EN25S80,
4871 .total_size = 1024,
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, 256} },
4881 .block_erase = spi_block_erase_20,
4882 }, {
4883 .eraseblocks = { {64 * 1024, 16} },
4884 .block_erase = spi_block_erase_d8,
4885 }, {
4886 .eraseblocks = { {1024 * 1024, 1} },
4887 .block_erase = spi_block_erase_60,
4888 }, {
4889 .eraseblocks = { {1024 * 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 = "EN25S16",
4903 .bustype = BUS_SPI,
4904 .manufacture_id = EON_ID_NOPREFIX,
4905 .model_id = EON_EN25S16,
4906 .total_size = 2048,
4907 .page_size = 256,
4908 /* OTP: 512B total; enter 0x3A */
4909 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4910 .tested = TEST_UNTESTED,
4911 .probe = probe_spi_rdid,
4912 .probe_timing = TIMING_ZERO,
4913 .block_erasers = {
4914 {
4915 .eraseblocks = { {4 * 1024, 512} },
4916 .block_erase = spi_block_erase_20,
4917 }, {
4918 .eraseblocks = { {64 * 1024, 32} },
4919 .block_erase = spi_block_erase_52,
4920 }, {
4921 .eraseblocks = { {32 * 1024, 64} },
4922 .block_erase = spi_block_erase_d8,
4923 }, {
4924 .eraseblocks = { {2048 * 1024, 1} },
4925 .block_erase = spi_block_erase_60,
4926 }, {
4927 .eraseblocks = { {2048 * 1024, 1} },
4928 .block_erase = spi_block_erase_c7,
4929 }
4930 },
4931 .printlock = spi_prettyprint_status_register_en25s_wp,
4932 .unlock = spi_disable_blockprotect_bp3_srwd,
4933 .write = spi_chip_write_256,
4934 .read = spi_chip_read,
4935 .voltage = {1650, 1950},
4936 },
4937
4938 {
4939 .vendor = "Eon",
4940 .name = "EN25S32",
4941 .bustype = BUS_SPI,
4942 .manufacture_id = EON_ID_NOPREFIX,
4943 .model_id = EON_EN25S32,
4944 .total_size = 4096,
4945 .page_size = 256,
4946 /* OTP: 512B total; enter 0x3A */
4947 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4948 .tested = TEST_UNTESTED,
4949 .probe = probe_spi_rdid,
4950 .probe_timing = TIMING_ZERO,
4951 .block_erasers = {
4952 {
4953 .eraseblocks = { {4 * 1024, 1024} },
4954 .block_erase = spi_block_erase_20,
4955 }, {
4956 .eraseblocks = { {32 * 1024, 128} },
4957 .block_erase = spi_block_erase_52,
4958 }, {
4959 .eraseblocks = { {64 * 1024, 64} },
4960 .block_erase = spi_block_erase_d8,
4961 }, {
4962 .eraseblocks = { {4096 * 1024, 1} },
4963 .block_erase = spi_block_erase_60,
4964 }, {
4965 .eraseblocks = { {4096 * 1024, 1} },
4966 .block_erase = spi_block_erase_c7,
4967 }
4968 },
4969 .printlock = spi_prettyprint_status_register_en25s_wp,
4970 .unlock = spi_disable_blockprotect_bp3_srwd,
4971 .write = spi_chip_write_256,
4972 .read = spi_chip_read,
4973 .voltage = {1650, 1950},
4974 },
4975
4976 {
4977 .vendor = "Eon",
4978 .name = "EN25S64",
4979 .bustype = BUS_SPI,
4980 .manufacture_id = EON_ID_NOPREFIX,
4981 .model_id = EON_EN25S64,
4982 .total_size = 8192,
4983 .page_size = 256,
4984 /* OTP: 512B total; enter 0x3A */
4985 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4986 .tested = TEST_UNTESTED,
4987 .probe = probe_spi_rdid,
4988 .probe_timing = TIMING_ZERO,
4989 .block_erasers = {
4990 {
4991 .eraseblocks = { {4 * 1024, 2048} },
4992 .block_erase = spi_block_erase_20,
4993 }, {
4994 .eraseblocks = { {64 * 1024, 128} },
4995 .block_erase = spi_block_erase_d8,
4996 }, {
4997 .eraseblocks = { {8192 * 1024, 1} },
4998 .block_erase = spi_block_erase_60,
4999 }, {
5000 .eraseblocks = { {8192 * 1024, 1} },
5001 .block_erase = spi_block_erase_c7,
5002 }
5003 },
5004 .printlock = spi_prettyprint_status_register_en25s_wp,
5005 .unlock = spi_disable_blockprotect_bp3_srwd,
5006 .write = spi_chip_write_256,
5007 .read = spi_chip_read,
5008 .voltage = {1650, 1950},
5009 },
5010
5011 {
5012 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00005013 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005014 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00005015 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005016 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00005017 .total_size = 128,
5018 .page_size = 128,
5019 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005020 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00005021 .probe = probe_jedec,
5022 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5023 .block_erasers =
5024 {
5025 {
5026 .eraseblocks = { {16 * 1024, 8} },
5027 .block_erase = erase_sector_jedec,
5028 },
5029 {
5030 .eraseblocks = { {128 * 1024, 1} },
5031 .block_erase = erase_chip_block_jedec,
5032 },
5033 },
5034 .write = write_jedec_1,
5035 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005036 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00005037 },
5038
5039 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005040 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005041 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005042 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005043 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005044 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005045 .total_size = 256,
5046 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005047 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005048 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005049 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005050 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005051 .block_erasers =
5052 {
5053 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005054 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005055 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005056 {8 * 1024, 2},
5057 {32 * 1024, 1},
5058 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005059 },
5060 .block_erase = erase_sector_jedec,
5061 }, {
5062 .eraseblocks = { {256 * 1024, 1} },
5063 .block_erase = erase_chip_block_jedec,
5064 },
5065 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005066 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005067 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005068 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005069 },
5070
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005071 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005072 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005073 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005074 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005075 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005076 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005077 .total_size = 256,
5078 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005079 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005080 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005081 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005082 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005083 .block_erasers =
5084 {
5085 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005086 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005087 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005088 {32 * 1024, 1},
5089 {8 * 1024, 2},
5090 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005091 },
5092 .block_erase = erase_sector_jedec,
5093 }, {
5094 .eraseblocks = { {256 * 1024, 1} },
5095 .block_erase = erase_chip_block_jedec,
5096 },
5097 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005098 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005099 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005100 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005101 },
5102
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005103 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005104 .vendor = "Eon",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005105 .name = "EN29LV040(A)",
5106 .bustype = BUS_PARALLEL,
5107 .manufacture_id = EON_ID,
5108 .model_id = EON_EN29LV040,
5109 .total_size = 512,
5110 .page_size = 4 * 1024,
5111 .tested = TEST_OK_PREW,
5112 .probe = probe_jedec,
5113 .probe_timing = TIMING_ZERO,
5114 .block_erasers =
5115 {
5116 {
5117 .eraseblocks = { {64 * 1024, 8} },
5118 .block_erase = erase_sector_jedec,
5119 },
5120 {
5121 .eraseblocks = { {512 * 1024, 1} },
5122 .block_erase = erase_chip_block_jedec,
5123 },
5124 },
5125 .write = write_jedec_1,
5126 .read = read_memmapped,
5127 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5128 },
5129
5130 {
5131 .vendor = "Eon",
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005132 .name = "EN29LV640B",
5133 .bustype = BUS_PARALLEL,
5134 .manufacture_id = EON_ID,
5135 .model_id = EON_EN29LV640B,
5136 .total_size = 8192,
5137 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005138 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005139 .tested = TEST_OK_PREW,
5140 .probe = probe_en29lv640b,
5141 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5142 .block_erasers =
5143 {
5144 {
5145 .eraseblocks = {
5146 {8 * 1024, 8},
5147 {64 * 1024, 127},
5148 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005149 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005150 }, {
5151 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005152 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005153 },
5154 },
5155 .write = write_en29lv640b,
5156 .read = read_memmapped,
5157 .voltage = {2700, 3600},
5158 },
5159
5160 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005161 .vendor = "Eon",
5162 .name = "EN29GL064(A)B",
5163 .bustype = BUS_PARALLEL,
5164 .manufacture_id = EON_ID,
5165 .model_id = EON_EN29GL064B,
5166 .total_size = 8192,
5167 .page_size = 128 * 1024, /* actual page size is 16 */
5168 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5169 .tested = TEST_UNTESTED,
5170 .probe = probe_jedec_29gl,
5171 .probe_timing = TIMING_ZERO,
5172 .block_erasers =
5173 {
5174 {
5175 .eraseblocks = {
5176 {8 * 1024, 8},
5177 {64 * 1024, 127},
5178 },
5179 .block_erase = erase_sector_jedec,
5180 }, {
5181 .eraseblocks = { {8 * 1024 * 1024, 1} },
5182 .block_erase = erase_chip_block_jedec,
5183 },
5184 },
5185 .write = write_jedec_1,
5186 .read = read_memmapped,
5187 .voltage = {2700, 3600},
5188 },
5189
5190 {
5191 .vendor = "Eon",
5192 .name = "EN29GL064(A)T",
5193 .bustype = BUS_PARALLEL,
5194 .manufacture_id = EON_ID,
5195 .model_id = EON_EN29GL064T,
5196 .total_size = 8192,
5197 .page_size = 128 * 1024, /* actual page size is 16 */
5198 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5199 .tested = TEST_UNTESTED,
5200 .probe = probe_jedec_29gl,
5201 .probe_timing = TIMING_ZERO,
5202 .block_erasers =
5203 {
5204 {
5205 .eraseblocks = {
5206 {64 * 1024, 127},
5207 {8 * 1024, 8},
5208 },
5209 .block_erase = erase_sector_jedec,
5210 }, {
5211 .eraseblocks = { {8 * 1024 * 1024, 1} },
5212 .block_erase = erase_chip_block_jedec,
5213 },
5214 },
5215 .write = write_jedec_1,
5216 .read = read_memmapped,
5217 .voltage = {2700, 3600},
5218 },
5219
5220 {
5221 .vendor = "Eon",
5222 .name = "EN29GL064H/L",
5223 .bustype = BUS_PARALLEL,
5224 .manufacture_id = EON_ID,
5225 .model_id = EON_EN29GL064HL,
5226 .total_size = 8192,
5227 .page_size = 128 * 1024, /* actual page size is 16 */
5228 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5229 .tested = TEST_UNTESTED,
5230 .probe = probe_jedec_29gl,
5231 .probe_timing = TIMING_ZERO,
5232 .block_erasers =
5233 {
5234 {
5235 .eraseblocks = { {64 * 1024, 128} },
5236 .block_erase = erase_sector_jedec,
5237 }, {
5238 .eraseblocks = { {8 * 1024 * 1024, 1} },
5239 .block_erase = erase_chip_block_jedec,
5240 },
5241 },
5242 .write = write_jedec_1,
5243 .read = read_memmapped,
5244 .voltage = {2700, 3600},
5245 },
5246
5247 {
5248 .vendor = "Eon",
5249 .name = "EN29GL128",
5250 .bustype = BUS_PARALLEL,
5251 .manufacture_id = EON_ID,
5252 .model_id = EON_EN29GL128HL,
5253 .total_size = 16384,
5254 .page_size = 128 * 1024, /* actual page size is 16 */
5255 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5256 .tested = TEST_UNTESTED,
5257 .probe = probe_jedec_29gl,
5258 .probe_timing = TIMING_ZERO,
5259 .block_erasers =
5260 {
5261 {
5262 .eraseblocks = { {128 * 1024, 128} },
5263 .block_erase = erase_sector_jedec,
5264 }, {
5265 .eraseblocks = { {16 * 1024 * 1024, 1} },
5266 .block_erase = erase_chip_block_jedec,
5267 },
5268 },
5269 .write = write_jedec_1,
5270 .read = read_memmapped,
5271 .voltage = {2700, 3600},
5272 },
5273
5274 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005275 .vendor = "Fujitsu",
5276 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005277 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005278 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005279 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005280 .total_size = 512,
5281 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005282 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005283 .tested = TEST_UNTESTED,
5284 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005285 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005286 .block_erasers =
5287 {
5288 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005289 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005290 {16 * 1024, 1},
5291 {8 * 1024, 2},
5292 {32 * 1024, 1},
5293 {64 * 1024, 7},
5294 },
Sean Nelson35727f72010-01-28 23:55:12 +00005295 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005296 }, {
5297 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005298 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005299 },
5300 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005301 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005302 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005303 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005304 },
5305
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005306 {
5307 .vendor = "Fujitsu",
5308 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005309 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005310 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005311 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005312 .total_size = 512,
5313 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005314 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005315 .tested = TEST_UNTESTED,
5316 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005317 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005318 .block_erasers =
5319 {
5320 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005321 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005322 {64 * 1024, 7},
5323 {32 * 1024, 1},
5324 {8 * 1024, 2},
5325 {16 * 1024, 1},
5326 },
Sean Nelson35727f72010-01-28 23:55:12 +00005327 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005328 }, {
5329 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005330 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005331 },
5332 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005333 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005334 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005335 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005336 },
5337
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005338 {
Sean Nelson35727f72010-01-28 23:55:12 +00005339 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005340 .vendor = "Fujitsu",
5341 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005342 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005343 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005344 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005345 .total_size = 512,
5346 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005347 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005348 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005349 .probe = probe_jedec,
5350 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005351 .block_erasers =
5352 {
5353 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005354 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005355 {16 * 1024, 1},
5356 {8 * 1024, 2},
5357 {32 * 1024, 1},
5358 {64 * 1024, 7},
5359 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005360 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005361 }, {
5362 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005363 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005364 },
5365 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005366 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005367 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005368 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005369 },
5370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005371 {
5372 .vendor = "Fujitsu",
5373 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005374 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005375 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005376 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005377 .total_size = 512,
5378 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005379 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005380 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005381 .probe = probe_jedec,
5382 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005383 .block_erasers =
5384 {
5385 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005386 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005387 {64 * 1024, 7},
5388 {32 * 1024, 1},
5389 {8 * 1024, 2},
5390 {16 * 1024, 1},
5391 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005392 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005393 }, {
5394 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005395 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005396 },
5397 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005398 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005399 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005400 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005401 },
5402
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005403 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005404 .vendor = "Fujitsu",
5405 .name = "MBM29LV160BE",
5406 .bustype = BUS_PARALLEL,
5407 .manufacture_id = FUJITSU_ID,
5408 .model_id = FUJITSU_MBM29LV160BE,
5409 .total_size = 2 * 1024,
5410 .page_size = 0,
5411 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5412 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005413 .probe = probe_jedec,
5414 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005415 .block_erasers =
5416 {
5417 {
5418 .eraseblocks = {
5419 {16 * 1024, 1},
5420 {8 * 1024, 2},
5421 {32 * 1024, 1},
5422 {64 * 1024, 31},
5423 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005424 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005425 }, {
5426 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005427 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005428 },
5429 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005430 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005431 .read = read_memmapped,
5432 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5433 },
5434
5435 {
5436 .vendor = "Fujitsu",
5437 .name = "MBM29LV160TE",
5438 .bustype = BUS_PARALLEL,
5439 .manufacture_id = FUJITSU_ID,
5440 .model_id = FUJITSU_MBM29LV160TE,
5441 .total_size = 2 * 1024,
5442 .page_size = 0,
5443 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5444 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005445 .probe = probe_jedec,
5446 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005447 .block_erasers =
5448 {
5449 {
5450 .eraseblocks = {
5451 {64 * 1024, 31},
5452 {32 * 1024, 1},
5453 {8 * 1024, 2},
5454 {16 * 1024, 1},
5455 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005456 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005457 }, {
5458 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005459 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005460 },
5461 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005462 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005463 .read = read_memmapped,
5464 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5465 },
5466
5467 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005468 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005469 .name = "GD25LQ32",
5470 .bustype = BUS_SPI,
5471 .manufacture_id = GIGADEVICE_ID,
5472 .model_id = GIGADEVICE_GD25LQ32,
5473 .total_size = 4096,
5474 .page_size = 256,
5475 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5476 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5477 .tested = TEST_OK_PREW,
5478 .probe = probe_spi_rdid,
5479 .probe_timing = TIMING_ZERO,
5480 .block_erasers =
5481 {
5482 {
5483 .eraseblocks = { {4 * 1024, 1024} },
5484 .block_erase = spi_block_erase_20,
5485 }, {
5486 .eraseblocks = { {32 * 1024, 128} },
5487 .block_erase = spi_block_erase_52,
5488 }, {
5489 .eraseblocks = { {64 * 1024, 64} },
5490 .block_erase = spi_block_erase_d8,
5491 }, {
5492 .eraseblocks = { {4 * 1024 * 1024, 1} },
5493 .block_erase = spi_block_erase_60,
5494 }, {
5495 .eraseblocks = { {4 * 1024 * 1024, 1} },
5496 .block_erase = spi_block_erase_c7,
5497 }
5498 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005499 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005500 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5501 .write = spi_chip_write_256,
5502 .read = spi_chip_read,
5503 .voltage = {1700, 1950},
5504 },
5505
5506 {
5507 .vendor = "GigaDevice",
5508 .name = "GD25Q512",
5509 .bustype = BUS_SPI,
5510 .manufacture_id = GIGADEVICE_ID,
5511 .model_id = GIGADEVICE_GD25Q512,
5512 .total_size = 64,
5513 .page_size = 256,
5514 .feature_bits = FEATURE_WRSR_WREN,
5515 .tested = TEST_UNTESTED,
5516 .probe = probe_spi_rdid,
5517 .probe_timing = TIMING_ZERO,
5518 .block_erasers = {
5519 {
5520 .eraseblocks = { {4 * 1024, 16} },
5521 .block_erase = spi_block_erase_20,
5522 }, {
5523 .eraseblocks = { {32 * 1024, 2} },
5524 .block_erase = spi_block_erase_52,
5525 }, {
5526 .eraseblocks = { {64 * 1024, 1} },
5527 .block_erase = spi_block_erase_60,
5528 }, {
5529 .eraseblocks = { {64 * 1024, 1} },
5530 .block_erase = spi_block_erase_c7,
5531 }
5532 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005533 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005534 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5535 .write = spi_chip_write_256,
5536 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5537 .voltage = {2700, 3600},
5538 },
5539
5540 {
5541 .vendor = "GigaDevice",
5542 .name = "GD25Q10",
5543 .bustype = BUS_SPI,
5544 .manufacture_id = GIGADEVICE_ID,
5545 .model_id = GIGADEVICE_GD25Q10,
5546 .total_size = 128,
5547 .page_size = 256,
5548 .feature_bits = FEATURE_WRSR_WREN,
5549 .tested = TEST_UNTESTED,
5550 .probe = probe_spi_rdid,
5551 .probe_timing = TIMING_ZERO,
5552 .block_erasers = {
5553 {
5554 .eraseblocks = { {4 * 1024, 32} },
5555 .block_erase = spi_block_erase_20,
5556 }, {
5557 .eraseblocks = { {32 * 1024, 4} },
5558 .block_erase = spi_block_erase_52,
5559 }, {
5560 .eraseblocks = { {64 * 1024, 2} },
5561 .block_erase = spi_block_erase_d8,
5562 }, {
5563 .eraseblocks = { {128 * 1024, 1} },
5564 .block_erase = spi_block_erase_60,
5565 }, {
5566 .eraseblocks = { {128 * 1024, 1} },
5567 .block_erase = spi_block_erase_c7,
5568 }
5569 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005570 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005571 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5572 .write = spi_chip_write_256,
5573 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5574 .voltage = {2700, 3600},
5575 },
5576
5577 {
5578 .vendor = "GigaDevice",
5579 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005580 .bustype = BUS_SPI,
5581 .manufacture_id = GIGADEVICE_ID,
5582 .model_id = GIGADEVICE_GD25Q20,
5583 .total_size = 256,
5584 .page_size = 256,
5585 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00005586 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005587 .probe = probe_spi_rdid,
5588 .probe_timing = TIMING_ZERO,
5589 .block_erasers =
5590 {
5591 {
5592 .eraseblocks = { {4 * 1024, 64} },
5593 .block_erase = spi_block_erase_20,
5594 }, {
5595 .eraseblocks = { {32 * 1024, 8} },
5596 .block_erase = spi_block_erase_52,
5597 }, {
5598 .eraseblocks = { {64 * 1024, 4} },
5599 .block_erase = spi_block_erase_d8,
5600 }, {
5601 .eraseblocks = { {256 * 1024, 1} },
5602 .block_erase = spi_block_erase_60,
5603 }, {
5604 .eraseblocks = { {256 * 1024, 1} },
5605 .block_erase = spi_block_erase_c7,
5606 }
5607 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005608 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005609 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005610 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005611 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005612 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005613 },
5614
5615 {
5616 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005617 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005618 .bustype = BUS_SPI,
5619 .manufacture_id = GIGADEVICE_ID,
5620 .model_id = GIGADEVICE_GD25Q40,
5621 .total_size = 512,
5622 .page_size = 256,
5623 .feature_bits = FEATURE_WRSR_WREN,
5624 .tested = TEST_UNTESTED,
5625 .probe = probe_spi_rdid,
5626 .probe_timing = TIMING_ZERO,
5627 .block_erasers =
5628 {
5629 {
5630 .eraseblocks = { {4 * 1024, 128} },
5631 .block_erase = spi_block_erase_20,
5632 }, {
5633 .eraseblocks = { {32 * 1024, 16} },
5634 .block_erase = spi_block_erase_52,
5635 }, {
5636 .eraseblocks = { {64 * 1024, 8} },
5637 .block_erase = spi_block_erase_d8,
5638 }, {
5639 .eraseblocks = { {512 * 1024, 1} },
5640 .block_erase = spi_block_erase_60,
5641 }, {
5642 .eraseblocks = { {512 * 1024, 1} },
5643 .block_erase = spi_block_erase_c7,
5644 }
5645 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005646 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005647 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005648 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005649 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005650 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005651 },
5652
5653 {
5654 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005655 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005656 .bustype = BUS_SPI,
5657 .manufacture_id = GIGADEVICE_ID,
5658 .model_id = GIGADEVICE_GD25Q80,
5659 .total_size = 1024,
5660 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005661 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005662 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5663 .tested = TEST_OK_PREW,
5664 .probe = probe_spi_rdid,
5665 .probe_timing = TIMING_ZERO,
5666 .block_erasers =
5667 {
5668 {
5669 .eraseblocks = { {4 * 1024, 256} },
5670 .block_erase = spi_block_erase_20,
5671 }, {
5672 .eraseblocks = { {32 * 1024, 32} },
5673 .block_erase = spi_block_erase_52,
5674 }, {
5675 .eraseblocks = { {64 * 1024, 16} },
5676 .block_erase = spi_block_erase_d8,
5677 }, {
5678 .eraseblocks = { {1024 * 1024, 1} },
5679 .block_erase = spi_block_erase_60,
5680 }, {
5681 .eraseblocks = { {1024 * 1024, 1} },
5682 .block_erase = spi_block_erase_c7,
5683 }
5684 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005685 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005686 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005687 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005688 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005689 .voltage = {2700, 3600},
5690 },
5691
5692 {
5693 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005694 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005695 .bustype = BUS_SPI,
5696 .manufacture_id = GIGADEVICE_ID,
5697 .model_id = GIGADEVICE_GD25Q16,
5698 .total_size = 2048,
5699 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005700 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005701 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00005702 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005703 .probe = probe_spi_rdid,
5704 .probe_timing = TIMING_ZERO,
5705 .block_erasers =
5706 {
5707 {
5708 .eraseblocks = { {4 * 1024, 512} },
5709 .block_erase = spi_block_erase_20,
5710 }, {
5711 .eraseblocks = { {32 * 1024, 64} },
5712 .block_erase = spi_block_erase_52,
5713 }, {
5714 .eraseblocks = { {64 * 1024, 32} },
5715 .block_erase = spi_block_erase_d8,
5716 }, {
5717 .eraseblocks = { {2 * 1024 * 1024, 1} },
5718 .block_erase = spi_block_erase_60,
5719 }, {
5720 .eraseblocks = { {2 * 1024 * 1024, 1} },
5721 .block_erase = spi_block_erase_c7,
5722 }
5723 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005724 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005725 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005726 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005727 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005728 .voltage = {2700, 3600},
5729 },
5730
5731 {
5732 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005733 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005734 .bustype = BUS_SPI,
5735 .manufacture_id = GIGADEVICE_ID,
5736 .model_id = GIGADEVICE_GD25Q32,
5737 .total_size = 4096,
5738 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005739 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005740 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00005741 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005742 .probe = probe_spi_rdid,
5743 .probe_timing = TIMING_ZERO,
5744 .block_erasers =
5745 {
5746 {
5747 .eraseblocks = { {4 * 1024, 1024} },
5748 .block_erase = spi_block_erase_20,
5749 }, {
5750 .eraseblocks = { {32 * 1024, 128} },
5751 .block_erase = spi_block_erase_52,
5752 }, {
5753 .eraseblocks = { {64 * 1024, 64} },
5754 .block_erase = spi_block_erase_d8,
5755 }, {
5756 .eraseblocks = { {4 * 1024 * 1024, 1} },
5757 .block_erase = spi_block_erase_60,
5758 }, {
5759 .eraseblocks = { {4 * 1024 * 1024, 1} },
5760 .block_erase = spi_block_erase_c7,
5761 }
5762 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005763 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005764 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005765 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005766 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005767 .voltage = {2700, 3600},
5768 },
5769
5770 {
5771 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005772 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005773 .bustype = BUS_SPI,
5774 .manufacture_id = GIGADEVICE_ID,
5775 .model_id = GIGADEVICE_GD25Q64,
5776 .total_size = 8192,
5777 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005778 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005779 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00005780 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005781 .probe = probe_spi_rdid,
5782 .probe_timing = TIMING_ZERO,
5783 .block_erasers =
5784 {
5785 {
5786 .eraseblocks = { {4 * 1024, 2048} },
5787 .block_erase = spi_block_erase_20,
5788 }, {
5789 .eraseblocks = { {32 * 1024, 256} },
5790 .block_erase = spi_block_erase_52,
5791 }, {
5792 .eraseblocks = { {64 * 1024, 128} },
5793 .block_erase = spi_block_erase_d8,
5794 }, {
5795 .eraseblocks = { {8 * 1024 * 1024, 1} },
5796 .block_erase = spi_block_erase_60,
5797 }, {
5798 .eraseblocks = { {8 * 1024 * 1024, 1} },
5799 .block_erase = spi_block_erase_c7,
5800 }
5801 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005802 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005803 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005804 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005805 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00005806 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005807 },
5808
5809 {
5810 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005811 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005812 .bustype = BUS_SPI,
5813 .manufacture_id = GIGADEVICE_ID,
5814 .model_id = GIGADEVICE_GD25Q128,
5815 .total_size = 16384,
5816 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005817 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005818 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5819 .tested = TEST_UNTESTED,
5820 .probe = probe_spi_rdid,
5821 .probe_timing = TIMING_ZERO,
5822 .block_erasers =
5823 {
5824 {
5825 .eraseblocks = { {4 * 1024, 4096} },
5826 .block_erase = spi_block_erase_20,
5827 }, {
5828 .eraseblocks = { {32 * 1024, 512} },
5829 .block_erase = spi_block_erase_52,
5830 }, {
5831 .eraseblocks = { {64 * 1024, 256} },
5832 .block_erase = spi_block_erase_d8,
5833 }, {
5834 .eraseblocks = { {16 * 1024 * 1024, 1} },
5835 .block_erase = spi_block_erase_60,
5836 }, {
5837 .eraseblocks = { {16 * 1024 * 1024, 1} },
5838 .block_erase = spi_block_erase_c7,
5839 }
5840 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005841 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005842 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5843 .write = spi_chip_write_256,
5844 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5845 .voltage = {2700, 3600},
5846 },
5847
5848 {
5849 .vendor = "GigaDevice",
5850 .name = "GD25T80",
5851 .bustype = BUS_SPI,
5852 .manufacture_id = GIGADEVICE_ID,
5853 .model_id = GIGADEVICE_GD25T80,
5854 .total_size = 1024,
5855 .page_size = 256,
5856 /* OTP: 256B total; enter 0x3A */
5857 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5858 .tested = TEST_UNTESTED,
5859 .probe = probe_spi_rdid,
5860 .probe_timing = TIMING_ZERO,
5861 .block_erasers = {
5862 {
5863 .eraseblocks = { {4 * 1024, 256} },
5864 .block_erase = spi_block_erase_20,
5865 }, {
5866 .eraseblocks = { {64 * 1024, 16} },
5867 .block_erase = spi_block_erase_52,
5868 }, {
5869 .eraseblocks = { {64 * 1024, 16} },
5870 .block_erase = spi_block_erase_d8,
5871 }, {
5872 .eraseblocks = { {1024 * 1024, 1} },
5873 .block_erase = spi_block_erase_60,
5874 }, {
5875 .eraseblocks = { {1024 * 1024, 1} },
5876 .block_erase = spi_block_erase_c7,
5877 }
5878 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005879 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005880 .unlock = spi_disable_blockprotect,
5881 .write = spi_chip_write_256,
5882 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005883 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005884 },
5885
5886 {
David Borgc96a8bd2010-06-21 16:12:22 +00005887 .vendor = "Hyundai",
5888 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005889 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005890 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005891 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005892 .total_size = 256,
5893 .page_size = 256 * 1024,
5894 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005895 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005896 .probe = probe_jedec,
5897 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5898 .block_erasers =
5899 {
5900 {
5901 .eraseblocks = {
5902 {64 * 1024, 3},
5903 {32 * 1024, 1},
5904 {8 * 1024, 2},
5905 {16 * 1024, 1},
5906 },
5907 .block_erase = erase_sector_jedec,
5908 }, {
5909 .eraseblocks = { {256 * 1024, 1} },
5910 .block_erase = erase_chip_block_jedec,
5911 },
5912 },
5913 .write = write_jedec_1,
5914 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005915 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005916 },
5917
5918 {
5919 .vendor = "Hyundai",
5920 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005921 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005922 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005923 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005924 .total_size = 256,
5925 .page_size = 256 * 1024,
5926 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5927 .tested = TEST_UNTESTED,
5928 .probe = probe_jedec,
5929 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5930 .block_erasers =
5931 {
5932 {
5933 .eraseblocks = {
5934 {16 * 1024, 1},
5935 {8 * 1024, 2},
5936 {32 * 1024, 1},
5937 {64 * 1024, 3},
5938 },
5939 .block_erase = erase_sector_jedec,
5940 }, {
5941 .eraseblocks = { {256 * 1024, 1} },
5942 .block_erase = erase_chip_block_jedec,
5943 },
5944 },
5945 .write = write_jedec_1,
5946 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005947 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005948 },
5949
5950 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005951 .vendor = "Hyundai",
5952 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005953 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005954 .manufacture_id = HYUNDAI_ID,
5955 .model_id = HYUNDAI_HY29F040A,
5956 .total_size = 512,
5957 .page_size = 64 * 1024,
5958 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5959 .tested = TEST_UNTESTED,
5960 .probe = probe_jedec,
5961 .probe_timing = TIMING_ZERO,
5962 .block_erasers =
5963 {
5964 {
5965 .eraseblocks = { {64 * 1024, 8} },
5966 .block_erase = erase_sector_jedec,
5967 }, {
5968 .eraseblocks = { {512 * 1024, 1} },
5969 .block_erase = erase_chip_block_jedec,
5970 },
5971 },
5972 .write = write_jedec_1,
5973 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005974 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005975 },
5976
5977 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005978 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005979 .name = "25F160S33B8",
5980 .bustype = BUS_SPI,
5981 .manufacture_id = INTEL_ID,
5982 .model_id = INTEL_25F160S33B8,
5983 .total_size = 2048,
5984 .page_size = 256,
5985 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5986 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5987 .tested = TEST_UNTESTED,
5988 .probe = probe_spi_rdid,
5989 .probe_timing = TIMING_ZERO,
5990 .block_erasers =
5991 {
5992 {
5993 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5994 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5995 * have no effect on the memory contents, but sets a flag in the SR.
5996 .eraseblocks = {
5997 {8 * 1024, 8},
5998 {64 * 1024, 31} // inaccessible
5999 },
6000 .block_erase = spi_block_erase_40,
6001 }, { */
6002 .eraseblocks = { {64 * 1024, 32} },
6003 .block_erase = spi_block_erase_d8,
6004 }, {
6005 .eraseblocks = { {2 * 1024 * 1024, 1} },
6006 .block_erase = spi_block_erase_c7,
6007 }
6008 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006009 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6010 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006011 .write = spi_chip_write_256,
6012 .read = spi_chip_read, /* also fast read 0x0B */
6013 .voltage = {2700, 3600},
6014 },
6015
6016 {
6017 .vendor = "Intel",
6018 .name = "25F160S33T8",
6019 .bustype = BUS_SPI,
6020 .manufacture_id = INTEL_ID,
6021 .model_id = INTEL_25F160S33T8,
6022 .total_size = 2048,
6023 .page_size = 256,
6024 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6025 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6026 .tested = TEST_UNTESTED,
6027 .probe = probe_spi_rdid,
6028 .probe_timing = TIMING_ZERO,
6029 .block_erasers =
6030 {
6031 {
6032 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6033 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6034 * have no effect on the memory contents, but sets a flag in the SR.
6035 .eraseblocks = {
6036 {64 * 1024, 31}, // inaccessible
6037 {8 * 1024, 8}
6038 },
6039 .block_erase = spi_block_erase_40,
6040 }, { */
6041 .eraseblocks = { {64 * 1024, 32} },
6042 .block_erase = spi_block_erase_d8,
6043 }, {
6044 .eraseblocks = { {2 * 1024 * 1024, 1} },
6045 .block_erase = spi_block_erase_c7,
6046 }
6047 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006048 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6049 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006050 .write = spi_chip_write_256,
6051 .read = spi_chip_read, /* also fast read 0x0B */
6052 .voltage = {2700, 3600},
6053 },
6054
6055 {
6056 .vendor = "Intel",
6057 .name = "25F320S33B8",
6058 .bustype = BUS_SPI,
6059 .manufacture_id = INTEL_ID,
6060 .model_id = INTEL_25F320S33B8,
6061 .total_size = 4096,
6062 .page_size = 256,
6063 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6064 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6065 .tested = TEST_UNTESTED,
6066 .probe = probe_spi_rdid,
6067 .probe_timing = TIMING_ZERO,
6068 .block_erasers =
6069 {
6070 {
6071 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6072 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6073 * have no effect on the memory contents, but sets a flag in the SR.
6074 .eraseblocks = {
6075 {8 * 1024, 8},
6076 {64 * 1024, 63} // inaccessible
6077 },
6078 .block_erase = spi_block_erase_40,
6079 }, { */
6080 .eraseblocks = { {64 * 1024, 64} },
6081 .block_erase = spi_block_erase_d8,
6082 }, {
6083 .eraseblocks = { {4 * 1024 * 1024, 1} },
6084 .block_erase = spi_block_erase_c7,
6085 }
6086 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006087 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6088 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006089 .write = spi_chip_write_256,
6090 .read = spi_chip_read, /* also fast read 0x0B */
6091 .voltage = {2700, 3600},
6092 },
6093
6094 {
6095 .vendor = "Intel",
6096 .name = "25F320S33T8",
6097 .bustype = BUS_SPI,
6098 .manufacture_id = INTEL_ID,
6099 .model_id = INTEL_25F320S33T8,
6100 .total_size = 4096,
6101 .page_size = 256,
6102 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6103 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6104 .tested = TEST_UNTESTED,
6105 .probe = probe_spi_rdid,
6106 .probe_timing = TIMING_ZERO,
6107 .block_erasers =
6108 {
6109 {
6110 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6111 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6112 * have no effect on the memory contents, but sets a flag in the SR.
6113 .eraseblocks = {
6114 {64 * 1024, 63}, // inaccessible
6115 {8 * 1024, 8}
6116 },
6117 .block_erase = spi_block_erase_40,
6118 }, { */
6119 .eraseblocks = { {64 * 1024, 64} },
6120 .block_erase = spi_block_erase_d8,
6121 }, {
6122 .eraseblocks = { {4 * 1024 * 1024, 1} },
6123 .block_erase = spi_block_erase_c7,
6124 }
6125 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006126 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6127 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006128 .write = spi_chip_write_256,
6129 .read = spi_chip_read, /* also fast read 0x0B */
6130 .voltage = {2700, 3600},
6131 },
6132
6133 {
6134 .vendor = "Intel",
6135 .name = "25F640S33B8",
6136 .bustype = BUS_SPI,
6137 .manufacture_id = INTEL_ID,
6138 .model_id = INTEL_25F640S33B8,
6139 .total_size = 8192,
6140 .page_size = 256,
6141 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6143 .tested = TEST_UNTESTED,
6144 .probe = probe_spi_rdid,
6145 .probe_timing = TIMING_ZERO,
6146 .block_erasers =
6147 {
6148 {
6149 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6150 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6151 * have no effect on the memory contents, but sets a flag in the SR.
6152 .eraseblocks = {
6153 {8 * 1024, 8},
6154 {64 * 1024, 127} // inaccessible
6155 },
6156 .block_erase = spi_block_erase_40,
6157 }, { */
6158 .eraseblocks = { {64 * 1024, 128} },
6159 .block_erase = spi_block_erase_d8,
6160 }, {
6161 .eraseblocks = { {8 * 1024 * 1024, 1} },
6162 .block_erase = spi_block_erase_c7,
6163 }
6164 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006165 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6166 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006167 .write = spi_chip_write_256,
6168 .read = spi_chip_read, /* also fast read 0x0B */
6169 .voltage = {2700, 3600},
6170 },
6171
6172 {
6173 .vendor = "Intel",
6174 .name = "25F640S33T8",
6175 .bustype = BUS_SPI,
6176 .manufacture_id = INTEL_ID,
6177 .model_id = INTEL_25F640S33T8,
6178 .total_size = 8192,
6179 .page_size = 256,
6180 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
6181 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6182 .tested = TEST_UNTESTED,
6183 .probe = probe_spi_rdid,
6184 .probe_timing = TIMING_ZERO,
6185 .block_erasers =
6186 {
6187 {
6188 /* This chip supports erasing of the 8 so-called "parameter blocks" with
6189 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
6190 * have no effect on the memory contents, but sets a flag in the SR.
6191 .eraseblocks = {
6192 {64 * 1024, 127}, // inaccessible
6193 {8 * 1024, 8}
6194 },
6195 .block_erase = spi_block_erase_40,
6196 }, { */
6197 .eraseblocks = { {64 * 1024, 128} },
6198 .block_erase = spi_block_erase_d8,
6199 }, {
6200 .eraseblocks = { {8 * 1024 * 1024, 1} },
6201 .block_erase = spi_block_erase_c7,
6202 }
6203 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00006204 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
6205 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00006206 .write = spi_chip_write_256,
6207 .read = spi_chip_read, /* also fast read 0x0B */
6208 .voltage = {2700, 3600},
6209 },
6210
6211 {
6212 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006213 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006214 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006215 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006216 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006217 .total_size = 128,
6218 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00006219 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006220 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006221 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006222 .block_erasers =
6223 {
6224 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006225 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006226 {8 * 1024, 1},
6227 {4 * 1024, 2},
6228 {112 * 1024, 1},
6229 },
Sean Nelson28accc22010-03-19 18:47:06 +00006230 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006231 },
6232 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006233 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006234 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006235 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006236 },
6237
6238 {
6239 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006240 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006241 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006242 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006243 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006244 .total_size = 128,
6245 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006246 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006247 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006248 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00006249 .block_erasers =
6250 {
6251 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006252 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006253 {112 * 1024, 1},
6254 {4 * 1024, 2},
6255 {8 * 1024, 1},
6256 },
Sean Nelson28accc22010-03-19 18:47:06 +00006257 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006258 },
6259 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006260 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006261 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006262 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00006263 },
6264
6265 {
6266 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006267 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006268 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006269 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006270 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006271 .total_size = 256,
6272 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006273 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006274 .probe = probe_82802ab,
6275 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6276 .block_erasers =
6277 {
6278 {
6279 .eraseblocks = {
6280 {128 * 1024, 1},
6281 {96 * 1024, 1},
6282 {8 * 1024, 2},
6283 {16 * 1024, 1},
6284 },
6285 .block_erase = erase_block_82802ab,
6286 },
6287 },
6288 .write = write_82802ab,
6289 .read = read_memmapped,
6290 },
6291
6292 {
6293 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006294 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006295 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006296 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006297 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006298 .total_size = 512,
6299 .page_size = 256,
6300 .tested = TEST_UNTESTED,
6301 .probe = probe_82802ab,
6302 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006303 .block_erasers =
6304 {
6305 {
6306 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006307 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006308 },
6309 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006310 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006311 .write = write_82802ab,
6312 .read = read_memmapped,
6313 },
6314
6315 {
6316 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006317 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006318 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006319 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006320 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006321 .total_size = 512,
6322 .page_size = 128 * 1024, /* maximal block size */
6323 .tested = TEST_UNTESTED,
6324 .probe = probe_82802ab,
6325 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6326 .block_erasers =
6327 {
6328 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006329 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006330 {16 * 1024, 1},
6331 {8 * 1024, 2},
6332 {96 * 1024, 1},
6333 {128 * 1024, 3},
6334 },
6335 .block_erase = erase_block_82802ab,
6336 },
6337 },
6338 .write = write_82802ab,
6339 .read = read_memmapped,
6340 },
6341
6342 {
6343 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006344 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006345 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006346 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006347 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006348 .total_size = 512,
6349 .page_size = 128 * 1024, /* maximal block size */
6350 .tested = TEST_UNTESTED,
6351 .probe = probe_82802ab,
6352 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6353 .block_erasers =
6354 {
6355 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006356 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006357 {128 * 1024, 3},
6358 {96 * 1024, 1},
6359 {8 * 1024, 2},
6360 {16 * 1024, 1},
6361 },
6362 .block_erase = erase_block_82802ab,
6363 },
6364 },
6365 .write = write_82802ab,
6366 .read = read_memmapped,
6367 },
6368
6369 {
6370 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006371 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006372 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006373 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006374 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006375 .total_size = 512,
6376 .page_size = 128 * 1024, /* maximal block size */
6377 .feature_bits = FEATURE_ADDR_SHIFTED,
6378 .tested = TEST_UNTESTED,
6379 .probe = probe_82802ab,
6380 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6381 .block_erasers =
6382 {
6383 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006384 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006385 {16 * 1024, 1},
6386 {8 * 1024, 2},
6387 {96 * 1024, 1},
6388 {128 * 1024, 3},
6389 },
6390 .block_erase = erase_block_82802ab,
6391 },
6392 },
6393 .write = write_82802ab,
6394 .read = read_memmapped,
6395 },
6396
6397 {
6398 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006399 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006400 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006401 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006402 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006403 .total_size = 512,
6404 .page_size = 128 * 1024, /* maximal block size */
6405 .feature_bits = FEATURE_ADDR_SHIFTED,
6406 .tested = TEST_UNTESTED,
6407 .probe = probe_82802ab,
6408 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6409 .block_erasers =
6410 {
6411 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006412 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006413 {128 * 1024, 3},
6414 {96 * 1024, 1},
6415 {8 * 1024, 2},
6416 {16 * 1024, 1},
6417 },
6418 .block_erase = erase_block_82802ab,
6419 },
6420 },
6421 .write = write_82802ab,
6422 .read = read_memmapped,
6423 },
6424
6425 {
6426 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006427 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006428 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006429 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006430 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006431 .total_size = 512,
6432 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006433 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006434 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006435 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006436 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006437 .block_erasers =
6438 {
6439 {
6440 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006441 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006442 },
6443 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006444 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006445 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006446 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006447 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006448 },
6449
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006450 {
6451 .vendor = "Intel",
6452 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006453 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006454 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006455 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006456 .total_size = 1024,
6457 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006458 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006459 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006460 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006461 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006462 .block_erasers =
6463 {
6464 {
6465 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00006466 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006467 },
6468 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006469 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006470 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006471 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006472 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006473 },
6474
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006475 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006476 .vendor = "ISSI",
6477 .name = "IS29GL064B",
6478 .bustype = BUS_PARALLEL,
6479 .manufacture_id = ISSI_ID,
6480 .model_id = ISSI_PMC_IS29GL064B,
6481 .total_size = 8192,
6482 .page_size = 128 * 1024, /* actual page size is 16 */
6483 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6484 .tested = TEST_UNTESTED,
6485 .probe = probe_jedec_29gl,
6486 .probe_timing = TIMING_ZERO,
6487 .block_erasers =
6488 {
6489 {
6490 .eraseblocks = {
6491 {8 * 1024, 8},
6492 {64 * 1024, 127},
6493 },
6494 .block_erase = erase_sector_jedec,
6495 }, {
6496 .eraseblocks = { {8 * 1024 * 1024, 1} },
6497 .block_erase = erase_chip_block_jedec,
6498 },
6499 },
6500 .write = write_jedec_1,
6501 .read = read_memmapped,
6502 .voltage = {2700, 3600},
6503 },
6504
6505 {
6506 .vendor = "ISSI",
6507 .name = "IS29GL064T",
6508 .bustype = BUS_PARALLEL,
6509 .manufacture_id = ISSI_ID,
6510 .model_id = ISSI_PMC_IS29GL064T,
6511 .total_size = 8192,
6512 .page_size = 128 * 1024, /* actual page size is 16 */
6513 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6514 .tested = TEST_UNTESTED,
6515 .probe = probe_jedec_29gl,
6516 .probe_timing = TIMING_ZERO,
6517 .block_erasers =
6518 {
6519 {
6520 .eraseblocks = {
6521 {64 * 1024, 127},
6522 {8 * 1024, 8},
6523 },
6524 .block_erase = erase_sector_jedec,
6525 }, {
6526 .eraseblocks = { {8 * 1024 * 1024, 1} },
6527 .block_erase = erase_chip_block_jedec,
6528 },
6529 },
6530 .write = write_jedec_1,
6531 .read = read_memmapped,
6532 .voltage = {2700, 3600},
6533 },
6534
6535 {
6536 .vendor = "ISSI",
6537 .name = "IS29GL064H/L",
6538 .bustype = BUS_PARALLEL,
6539 .manufacture_id = ISSI_ID,
6540 .model_id = ISSI_PMC_IS29GL064HL,
6541 .total_size = 8192,
6542 .page_size = 128 * 1024, /* actual page size is 16 */
6543 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6544 .tested = TEST_UNTESTED,
6545 .probe = probe_jedec_29gl,
6546 .probe_timing = TIMING_ZERO,
6547 .block_erasers =
6548 {
6549 {
6550 .eraseblocks = { {64 * 1024, 128} },
6551 .block_erase = erase_sector_jedec,
6552 }, {
6553 .eraseblocks = { {8 * 1024 * 1024, 1} },
6554 .block_erase = erase_chip_block_jedec,
6555 },
6556 },
6557 .write = write_jedec_1,
6558 .read = read_memmapped,
6559 .voltage = {2700, 3600},
6560 },
6561
6562 {
6563 .vendor = "ISSI",
6564 .name = "IS29GL128H/L",
6565 .bustype = BUS_PARALLEL,
6566 .manufacture_id = ISSI_ID,
6567 .model_id = ISSI_PMC_IS29GL128HL,
6568 .total_size = 16384,
6569 .page_size = 128 * 1024, /* actual page size is 16 */
6570 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6571 .tested = TEST_UNTESTED,
6572 .probe = probe_jedec_29gl,
6573 .probe_timing = TIMING_ZERO,
6574 .block_erasers =
6575 {
6576 {
6577 .eraseblocks = { {128 * 1024, 128} },
6578 .block_erase = erase_sector_jedec,
6579 }, {
6580 .eraseblocks = { {16 * 1024 * 1024, 1} },
6581 .block_erase = erase_chip_block_jedec,
6582 },
6583 },
6584 .write = write_jedec_1,
6585 .read = read_memmapped,
6586 .voltage = {2700, 3600},
6587 },
6588
6589 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006590 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00006591 .name = "MX23L1654",
6592 .bustype = BUS_SPI,
6593 .manufacture_id = MACRONIX_ID,
6594 .model_id = MACRONIX_MX23L1654,
6595 .total_size = 2048,
6596 .page_size = 256,
6597 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6598 .probe = probe_spi_rdid,
6599 .probe_timing = TIMING_ZERO,
6600 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
6601 .read = spi_chip_read, /* Fast read (0x0B) supported */
6602 .voltage = {3000, 3600},
6603 },
6604
6605 {
6606 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006607 .name = "MX23L3254",
6608 .bustype = BUS_SPI,
6609 .manufacture_id = MACRONIX_ID,
6610 .model_id = MACRONIX_MX23L3254,
6611 .total_size = 4096,
6612 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00006613 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006614 .probe = probe_spi_rdid,
6615 .probe_timing = TIMING_ZERO,
6616 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
6617 .read = spi_chip_read, /* Fast read (0x0B) supported */
6618 .voltage = {3000, 3600},
6619 },
6620
6621 {
6622 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00006623 .name = "MX23L6454",
6624 .bustype = BUS_SPI,
6625 .manufacture_id = MACRONIX_ID,
6626 .model_id = MACRONIX_MX23L6454,
6627 .total_size = 8192,
6628 .page_size = 256,
6629 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6630 .probe = probe_spi_rdid,
6631 .probe_timing = TIMING_ZERO,
6632 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
6633 .read = spi_chip_read, /* Fast read (0x0B) supported */
6634 .voltage = {3000, 3600},
6635 },
6636
6637 {
6638 .vendor = "Macronix",
6639 .name = "MX23L12854",
6640 .bustype = BUS_SPI,
6641 .manufacture_id = MACRONIX_ID,
6642 .model_id = MACRONIX_MX23L12854,
6643 .total_size = 16384,
6644 .page_size = 256,
6645 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6646 .probe = probe_spi_rdid,
6647 .probe_timing = TIMING_ZERO,
6648 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
6649 .read = spi_chip_read, /* Fast read (0x0B) supported */
6650 .voltage = {3000, 3600},
6651 },
6652
6653 {
6654 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006655 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006656 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006657 .manufacture_id = MACRONIX_ID,
6658 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006659 .total_size = 64,
6660 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006661 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006662 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006663 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006664 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006665 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006666 .block_erasers =
6667 {
6668 {
6669 .eraseblocks = { {4 * 1024, 16} },
6670 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006671 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006672 .eraseblocks = { {64 * 1024, 1} },
6673 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006674 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006675 .eraseblocks = { {64 * 1024, 1} },
6676 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006677 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006678 .eraseblocks = { {64 * 1024, 1} },
6679 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006680 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006681 .eraseblocks = { {64 * 1024, 1} },
6682 .block_erase = spi_block_erase_c7,
6683 },
6684 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006685 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006686 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006687 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006688 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
6689 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00006690 },
6691
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006692 {
6693 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006694 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006695 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006696 .manufacture_id = MACRONIX_ID,
6697 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006698 .total_size = 128,
6699 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006700 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006701 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00006702 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006703 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006704 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006705 .block_erasers =
6706 {
6707 {
6708 .eraseblocks = { {4 * 1024, 32} },
6709 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006710 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006711 .eraseblocks = { {64 * 1024, 2} },
6712 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006713 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006714 .eraseblocks = { {128 * 1024, 1} },
6715 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006716 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006717 .eraseblocks = { {128 * 1024, 1} },
6718 .block_erase = spi_block_erase_c7,
6719 },
6720 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006721 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006722 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006723 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006724 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006725 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006726 },
6727
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006728 {
6729 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00006730 .name = "MX25L2005(C)/MX25L2006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006731 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006732 .manufacture_id = MACRONIX_ID,
6733 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006734 .total_size = 256,
6735 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006736 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006737 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006738 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006739 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006740 .block_erasers =
6741 {
6742 {
6743 .eraseblocks = { {4 * 1024, 64} },
6744 .block_erase = spi_block_erase_20,
6745 }, {
6746 .eraseblocks = { {64 * 1024, 4} },
6747 .block_erase = spi_block_erase_52,
6748 }, {
6749 .eraseblocks = { {64 * 1024, 4} },
6750 .block_erase = spi_block_erase_d8,
6751 }, {
6752 .eraseblocks = { {256 * 1024, 1} },
6753 .block_erase = spi_block_erase_60,
6754 }, {
6755 .eraseblocks = { {256 * 1024, 1} },
6756 .block_erase = spi_block_erase_c7,
6757 },
6758 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006759 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006760 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006761 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006762 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006763 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006764 },
6765
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006766 {
6767 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00006768 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006769 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006770 .manufacture_id = MACRONIX_ID,
6771 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006772 .total_size = 512,
6773 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006774 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00006775 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006776 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006777 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006778 .block_erasers =
6779 {
6780 {
6781 .eraseblocks = { {4 * 1024, 128} },
6782 .block_erase = spi_block_erase_20,
6783 }, {
6784 .eraseblocks = { {64 * 1024, 8} },
6785 .block_erase = spi_block_erase_52,
6786 }, {
6787 .eraseblocks = { {64 * 1024, 8} },
6788 .block_erase = spi_block_erase_d8,
6789 }, {
6790 .eraseblocks = { {512 * 1024, 1} },
6791 .block_erase = spi_block_erase_60,
6792 }, {
6793 .eraseblocks = { {512 * 1024, 1} },
6794 .block_erase = spi_block_erase_c7,
6795 },
6796 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006797 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006798 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006799 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006800 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006801 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006802 },
6803
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006804 {
6805 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006806 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006807 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006808 .manufacture_id = MACRONIX_ID,
6809 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006810 .total_size = 1024,
6811 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006812 /* MX25L8006E, MX25L8008E support SFDP */
6813 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
David Hendricks67db2eb2010-09-03 03:35:48 +00006814 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00006815 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006816 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006817 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006818 .block_erasers =
6819 {
6820 {
6821 .eraseblocks = { {4 * 1024, 256} },
6822 .block_erase = spi_block_erase_20,
6823 }, {
6824 .eraseblocks = { {64 * 1024, 16} },
6825 .block_erase = spi_block_erase_52,
6826 }, {
6827 .eraseblocks = { {64 * 1024, 16} },
6828 .block_erase = spi_block_erase_d8,
6829 }, {
6830 .eraseblocks = { {1024 * 1024, 1} },
6831 .block_erase = spi_block_erase_60,
6832 }, {
6833 .eraseblocks = { {1024 * 1024, 1} },
6834 .block_erase = spi_block_erase_c7,
6835 },
6836 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006837 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006838 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006839 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006840 .read = spi_chip_read, /* Fast read (0x0B) supported */
6841 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00006842 },
6843
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006844 {
6845 .vendor = "Macronix",
6846 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006847 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006848 .manufacture_id = MACRONIX_ID,
6849 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006850 .total_size = 2048,
6851 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006852 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00006853 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006854 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006855 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006856 .block_erasers =
6857 {
6858 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006859 .eraseblocks = { {64 * 1024, 32} },
6860 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006861 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006862 .eraseblocks = { {64 * 1024, 32} },
6863 .block_erase = spi_block_erase_d8,
6864 }, {
6865 .eraseblocks = { {2 * 1024 * 1024, 1} },
6866 .block_erase = spi_block_erase_60,
6867 }, {
6868 .eraseblocks = { {2 * 1024 * 1024, 1} },
6869 .block_erase = spi_block_erase_c7,
6870 },
6871 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006872 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00006873 .unlock = spi_disable_blockprotect,
6874 .write = spi_chip_write_256,
6875 .read = spi_chip_read, /* Fast read (0x0B) supported */
6876 .voltage = {2700, 3600},
6877 },
6878
6879 {
6880 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006881 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00006882 .bustype = BUS_SPI,
6883 .manufacture_id = MACRONIX_ID,
6884 .model_id = MACRONIX_MX25L1605,
6885 .total_size = 2048,
6886 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006887 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00006888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6889 .tested = TEST_OK_PREW,
6890 .probe = probe_spi_rdid,
6891 .probe_timing = TIMING_ZERO,
6892 .block_erasers =
6893 {
6894 {
6895 .eraseblocks = { {4 * 1024, 512} },
6896 .block_erase = spi_block_erase_20,
6897 }, {
6898 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006899 .block_erase = spi_block_erase_52,
6900 }, {
6901 .eraseblocks = { {64 * 1024, 32} },
6902 .block_erase = spi_block_erase_d8,
6903 }, {
6904 .eraseblocks = { {2 * 1024 * 1024, 1} },
6905 .block_erase = spi_block_erase_60,
6906 }, {
6907 .eraseblocks = { {2 * 1024 * 1024, 1} },
6908 .block_erase = spi_block_erase_c7,
6909 },
6910 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006911 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00006912 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006913 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006914 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00006915 .voltage = {2700, 3600},
6916 },
6917
6918 {
6919 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006920 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00006921 .bustype = BUS_SPI,
6922 .manufacture_id = MACRONIX_ID,
6923 .model_id = MACRONIX_MX25L1605,
6924 .total_size = 2048,
6925 .page_size = 256,
6926 .feature_bits = FEATURE_WRSR_WREN,
6927 .tested = TEST_OK_PREW,
6928 .probe = probe_spi_rdid,
6929 .probe_timing = TIMING_ZERO,
6930 .block_erasers =
6931 {
6932 {
6933 .eraseblocks = { {4 * 1024, 512} },
6934 .block_erase = spi_block_erase_20,
6935 }, {
6936 .eraseblocks = { {64 * 1024, 32} },
6937 .block_erase = spi_block_erase_d8,
6938 }, {
6939 .eraseblocks = { {2 * 1024 * 1024, 1} },
6940 .block_erase = spi_block_erase_60,
6941 }, {
6942 .eraseblocks = { {2 * 1024 * 1024, 1} },
6943 .block_erase = spi_block_erase_c7,
6944 },
6945 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00006946 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00006947 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00006948 .write = spi_chip_write_256,
6949 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006950 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006951 },
6952
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006953 {
6954 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006955 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006956 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006957 .manufacture_id = MACRONIX_ID,
6958 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006959 .total_size = 2048,
6960 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006961 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6962 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006963 .tested = TEST_UNTESTED,
6964 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006965 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006966 .block_erasers =
6967 {
6968 {
6969 .eraseblocks = { {4 * 1024, 512} },
6970 .block_erase = spi_block_erase_20,
6971 }, {
6972 .eraseblocks = { {64 * 1024, 32} },
6973 .block_erase = spi_block_erase_d8,
6974 }, {
6975 .eraseblocks = { {2 * 1024 * 1024, 1} },
6976 .block_erase = spi_block_erase_60,
6977 }, {
6978 .eraseblocks = { {2 * 1024 * 1024, 1} },
6979 .block_erase = spi_block_erase_c7,
6980 }
6981 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006982 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00006983 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006984 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006985 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006986 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006987 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00006988
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006989 {
6990 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00006991 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006992 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006993 .manufacture_id = MACRONIX_ID,
6994 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006995 .total_size = 2048,
6996 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006997 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6998 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006999 .tested = TEST_UNTESTED,
7000 .probe = probe_spi_rdid,
7001 .probe_timing = TIMING_ZERO,
7002 .block_erasers =
7003 {
7004 {
7005 .eraseblocks = { {4 * 1024, 512} },
7006 .block_erase = spi_block_erase_20,
7007 }, {
7008 .eraseblocks = { {64 * 1024, 32} },
7009 .block_erase = spi_block_erase_d8,
7010 }, {
7011 .eraseblocks = { {2 * 1024 * 1024, 1} },
7012 .block_erase = spi_block_erase_60,
7013 }, {
7014 .eraseblocks = { {2 * 1024 * 1024, 1} },
7015 .block_erase = spi_block_erase_c7,
7016 }
7017 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007018 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007019 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00007020 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007021 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00007022 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00007023 },
7024
7025 {
7026 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00007027 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007028 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007029 .manufacture_id = MACRONIX_ID,
7030 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007031 .total_size = 4096,
7032 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00007033 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00007034 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007035 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007036 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007037 .block_erasers =
7038 {
7039 {
Stefan Tauner226037d2013-03-16 01:22:12 +00007040 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007041 .block_erase = spi_block_erase_20,
7042 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00007043 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00007044 .block_erase = spi_block_erase_d8,
7045 }, {
7046 .eraseblocks = { {4 * 1024 * 1024, 1} },
7047 .block_erase = spi_block_erase_60,
7048 }, {
7049 .eraseblocks = { {4 * 1024 * 1024, 1} },
7050 .block_erase = spi_block_erase_c7,
7051 },
7052 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007053 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007054 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007055 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007056 .read = spi_chip_read, /* Fast read (0x0B) supported */
7057 .voltage = {2700, 3600},
7058 },
7059
7060 {
7061 .vendor = "Macronix",
7062 .name = "MX25L3205D/MX25L3208D",
7063 .bustype = BUS_SPI,
7064 .manufacture_id = MACRONIX_ID,
7065 .model_id = MACRONIX_MX25L3205,
7066 .total_size = 4096,
7067 .page_size = 256,
7068 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7070 .tested = TEST_OK_PREW,
7071 .probe = probe_spi_rdid,
7072 .probe_timing = TIMING_ZERO,
7073 .block_erasers =
7074 {
7075 {
7076 .eraseblocks = { {4 * 1024, 1024} },
7077 .block_erase = spi_block_erase_20,
7078 }, {
7079 .eraseblocks = { {64 * 1024, 64} },
7080 .block_erase = spi_block_erase_d8,
7081 }, {
7082 .eraseblocks = { {4 * 1024 * 1024, 1} },
7083 .block_erase = spi_block_erase_60,
7084 }, {
7085 .eraseblocks = { {4 * 1024 * 1024, 1} },
7086 .block_erase = spi_block_erase_c7,
7087 },
7088 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007089 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007090 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007091 .write = spi_chip_write_256,
7092 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7093 .voltage = {2700, 3600},
7094 },
7095
7096 {
7097 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007098 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007099 .bustype = BUS_SPI,
7100 .manufacture_id = MACRONIX_ID,
7101 .model_id = MACRONIX_MX25L3205,
7102 .total_size = 4096,
7103 .page_size = 256,
7104 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7106 .tested = TEST_OK_PREW,
7107 .probe = probe_spi_rdid,
7108 .probe_timing = TIMING_ZERO,
7109 .block_erasers =
7110 {
7111 {
7112 .eraseblocks = { {4 * 1024, 1024} },
7113 .block_erase = spi_block_erase_20,
7114 }, {
7115 .eraseblocks = { {64 * 1024, 64} },
7116 .block_erase = spi_block_erase_d8,
7117 }, {
7118 .eraseblocks = { {64 * 1024, 64} },
7119 .block_erase = spi_block_erase_52,
7120 }, {
7121 .eraseblocks = { {4 * 1024 * 1024, 1} },
7122 .block_erase = spi_block_erase_60,
7123 }, {
7124 .eraseblocks = { {4 * 1024 * 1024, 1} },
7125 .block_erase = spi_block_erase_c7,
7126 },
7127 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007128 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007129 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007130 .write = spi_chip_write_256,
7131 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007132 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007133 },
7134
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007135 {
7136 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007137 .name = "MX25L3273E",
7138 .bustype = BUS_SPI,
7139 .manufacture_id = MACRONIX_ID,
7140 .model_id = MACRONIX_MX25L3205,
7141 .total_size = 4096,
7142 .page_size = 256,
7143 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
7144 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7145 .tested = TEST_UNTESTED,
7146 .probe = probe_spi_rdid,
7147 .probe_timing = TIMING_ZERO,
7148 .block_erasers =
7149 {
7150 {
7151 .eraseblocks = { {4 * 1024, 1024} },
7152 .block_erase = spi_block_erase_20,
7153 }, {
7154 .eraseblocks = { {32 * 1024, 128} },
7155 .block_erase = spi_block_erase_52,
7156 }, {
7157 .eraseblocks = { {64 * 1024, 64} },
7158 .block_erase = spi_block_erase_d8,
7159 }, {
7160 .eraseblocks = { {4 * 1024 * 1024, 1} },
7161 .block_erase = spi_block_erase_60,
7162 }, {
7163 .eraseblocks = { {4 * 1024 * 1024, 1} },
7164 .block_erase = spi_block_erase_c7,
7165 },
7166 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007167 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007168 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007169 .write = spi_chip_write_256,
7170 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
7171 .voltage = {2700, 3600},
7172 },
7173
7174 {
7175 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007176 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007177 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007178 .manufacture_id = MACRONIX_ID,
7179 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007180 .total_size = 4096,
7181 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007182 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
7183 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007184 .tested = TEST_UNTESTED,
7185 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007186 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007187 .block_erasers =
7188 {
7189 {
7190 .eraseblocks = { {4 * 1024, 1024} },
7191 .block_erase = spi_block_erase_20,
7192 }, {
7193 .eraseblocks = { {64 * 1024, 64} },
7194 .block_erase = spi_block_erase_d8,
7195 }, {
7196 .eraseblocks = { {4 * 1024 * 1024, 1} },
7197 .block_erase = spi_block_erase_60,
7198 }, {
7199 .eraseblocks = { {4 * 1024 * 1024, 1} },
7200 .block_erase = spi_block_erase_c7,
7201 }
7202 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007203 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007204 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007205 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007206 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007207 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00007208 },
7209
7210 {
7211 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007212 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007213 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007214 .manufacture_id = MACRONIX_ID,
7215 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007216 .total_size = 8192,
7217 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007218 /* Has an additional 512B EEPROM sector */
7219 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00007220 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007221 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007222 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007223 .block_erasers =
7224 {
7225 {
7226 .eraseblocks = { {64 * 1024, 128} },
7227 .block_erase = spi_block_erase_20,
7228 }, {
7229 .eraseblocks = { {64 * 1024, 128} },
7230 .block_erase = spi_block_erase_d8,
7231 }, {
7232 .eraseblocks = { {8 * 1024 * 1024, 1} },
7233 .block_erase = spi_block_erase_60,
7234 }, {
7235 .eraseblocks = { {8 * 1024 * 1024, 1} },
7236 .block_erase = spi_block_erase_c7,
7237 }
7238 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007239 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007240 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007241 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007242 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007243 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00007244 },
7245
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007246 {
7247 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007248 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00007249 .bustype = BUS_SPI,
7250 .manufacture_id = MACRONIX_ID,
7251 .model_id = MACRONIX_MX25L6405,
7252 .total_size = 8192,
7253 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007254 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00007255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7256 .tested = TEST_OK_PREW,
7257 .probe = probe_spi_rdid,
7258 .probe_timing = TIMING_ZERO,
7259 .block_erasers =
7260 {
7261 {
7262 .eraseblocks = { {4 * 1024, 2048} },
7263 .block_erase = spi_block_erase_20,
7264 }, {
7265 .eraseblocks = { {64 * 1024, 128} },
7266 .block_erase = spi_block_erase_d8,
7267 }, {
7268 .eraseblocks = { {8 * 1024 * 1024, 1} },
7269 .block_erase = spi_block_erase_60,
7270 }, {
7271 .eraseblocks = { {8 * 1024 * 1024, 1} },
7272 .block_erase = spi_block_erase_c7,
7273 }
7274 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007275 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007276 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007277 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007278 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00007279 .voltage = {2700, 3600},
7280 },
7281
7282 {
7283 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00007284 .name = "MX25L6406E/MX25L6408E",
7285 .bustype = BUS_SPI,
7286 .manufacture_id = MACRONIX_ID,
7287 .model_id = MACRONIX_MX25L6405,
7288 .total_size = 8192,
7289 .page_size = 256,
7290 /* MX25L6406E supports SFDP */
7291 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
7292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7293 .tested = TEST_OK_PREW,
7294 .probe = probe_spi_rdid,
7295 .probe_timing = TIMING_ZERO,
7296 .block_erasers =
7297 {
7298 {
7299 .eraseblocks = { {4 * 1024, 2048} },
7300 .block_erase = spi_block_erase_20,
7301 }, {
7302 .eraseblocks = { {64 * 1024, 128} },
7303 .block_erase = spi_block_erase_52,
7304 }, {
7305 .eraseblocks = { {64 * 1024, 128} },
7306 .block_erase = spi_block_erase_d8,
7307 }, {
7308 .eraseblocks = { {8 * 1024 * 1024, 1} },
7309 .block_erase = spi_block_erase_60,
7310 }, {
7311 .eraseblocks = { {8 * 1024 * 1024, 1} },
7312 .block_erase = spi_block_erase_c7,
7313 }
7314 },
7315 .printlock = spi_prettyprint_status_register_bp3_srwd,
7316 .unlock = spi_disable_blockprotect_bp3_srwd,
7317 .write = spi_chip_write_256,
7318 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
7319 .voltage = {2700, 3600},
7320 },
7321
7322 {
7323 .vendor = "Macronix",
7324 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007325 .bustype = BUS_SPI,
7326 .manufacture_id = MACRONIX_ID,
7327 .model_id = MACRONIX_MX25L6405,
7328 .total_size = 8192,
7329 .page_size = 256,
7330 /* supports SFDP */
7331 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7332 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7333 .tested = TEST_OK_PREW,
7334 .probe = probe_spi_rdid,
7335 .probe_timing = TIMING_ZERO,
7336 .block_erasers =
7337 {
7338 {
7339 .eraseblocks = { {4 * 1024, 2048} },
7340 .block_erase = spi_block_erase_20,
7341 }, {
7342 .eraseblocks = { {32 * 1024, 256} },
7343 .block_erase = spi_block_erase_52,
7344 }, {
7345 .eraseblocks = { {64 * 1024, 128} },
7346 .block_erase = spi_block_erase_d8,
7347 }, {
7348 .eraseblocks = { {8 * 1024 * 1024, 1} },
7349 .block_erase = spi_block_erase_60,
7350 }, {
7351 .eraseblocks = { {8 * 1024 * 1024, 1} },
7352 .block_erase = spi_block_erase_c7,
7353 }
7354 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007355 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007356 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00007357 .write = spi_chip_write_256,
7358 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7359 .voltage = {2700, 3600},
7360 },
7361
7362 {
7363 .vendor = "Macronix",
Stefan Tauner5c316f92015-02-08 21:57:52 +00007364 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007365 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007366 .manufacture_id = MACRONIX_ID,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007367 .model_id = MACRONIX_MX25L12805D,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007368 .total_size = 16384,
7369 .page_size = 256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007370 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00007371 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00007372 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007373 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007374 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007375 .block_erasers =
7376 {
7377 {
7378 .eraseblocks = { {4 * 1024, 4096} },
7379 .block_erase = spi_block_erase_20,
7380 }, {
7381 .eraseblocks = { {64 * 1024, 256} },
7382 .block_erase = spi_block_erase_d8,
7383 }, {
7384 .eraseblocks = { {16 * 1024 * 1024, 1} },
7385 .block_erase = spi_block_erase_60,
7386 }, {
7387 .eraseblocks = { {16 * 1024 * 1024, 1} },
7388 .block_erase = spi_block_erase_c7,
7389 }
7390 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007391 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007392 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007393 .write = spi_chip_write_256,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007394 .read = spi_chip_read, /* Fast read (0x0B) supported */
7395 .voltage = {2700, 3600},
7396 },
7397
7398 {
7399 .vendor = "Macronix",
7400 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
7401 .bustype = BUS_SPI,
7402 .manufacture_id = MACRONIX_ID,
7403 .model_id = MACRONIX_MX25L12805D,
7404 .total_size = 16384,
7405 .page_size = 256,
7406 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7407 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7408 .tested = TEST_OK_PREW,
7409 .probe = probe_spi_rdid,
7410 .probe_timing = TIMING_ZERO,
7411 .block_erasers =
7412 {
7413 {
7414 .eraseblocks = { {4 * 1024, 4096} },
7415 .block_erase = spi_block_erase_20,
7416 }, {
7417 .eraseblocks = { {32 * 1024, 512} },
7418 .block_erase = spi_block_erase_52,
7419 }, {
7420 .eraseblocks = { {64 * 1024, 256} },
7421 .block_erase = spi_block_erase_d8,
7422 }, {
7423 .eraseblocks = { {16 * 1024 * 1024, 1} },
7424 .block_erase = spi_block_erase_60,
7425 }, {
7426 .eraseblocks = { {16 * 1024 * 1024, 1} },
7427 .block_erase = spi_block_erase_c7,
7428 }
7429 },
7430 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
7431 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
7432 .unlock = spi_disable_blockprotect_bp3_srwd,
7433 .write = spi_chip_write_256,
7434 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007435 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007436 },
7437
7438 {
7439 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00007440 .name = "MX25U1635E",
7441 .bustype = BUS_SPI,
7442 .manufacture_id = MACRONIX_ID,
7443 .model_id = MACRONIX_MX25U1635E,
7444 .total_size = 2048,
7445 .page_size = 256,
7446 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7447 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7448 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00007449 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00007450 .probe = probe_spi_rdid,
7451 .probe_timing = TIMING_ZERO,
7452 .block_erasers =
7453 {
7454 {
7455 .eraseblocks = { {4 * 1024, 512} },
7456 .block_erase = spi_block_erase_20,
7457 }, {
7458 .eraseblocks = { {32 * 1024, 64} },
7459 .block_erase = spi_block_erase_52,
7460 }, {
7461 .eraseblocks = { {64 * 1024, 32} },
7462 .block_erase = spi_block_erase_d8,
7463 }, {
7464 .eraseblocks = { {2 * 1024 * 1024, 1} },
7465 .block_erase = spi_block_erase_60,
7466 }, {
7467 .eraseblocks = { {2 * 1024 * 1024, 1} },
7468 .block_erase = spi_block_erase_c7,
7469 }
7470 },
7471 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007472 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007473 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00007474 .write = spi_chip_write_256,
7475 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7476 .voltage = {1650, 2000},
7477 },
7478
7479 {
7480 .vendor = "Macronix",
7481 .name = "MX25U3235E/F",
7482 .bustype = BUS_SPI,
7483 .manufacture_id = MACRONIX_ID,
7484 .model_id = MACRONIX_MX25U3235E,
7485 .total_size = 4096,
7486 .page_size = 256,
7487 /* F model supports SFDP */
7488 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7489 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7490 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7491 .tested = TEST_OK_PREW,
7492 .probe = probe_spi_rdid,
7493 .probe_timing = TIMING_ZERO,
7494 .block_erasers =
7495 {
7496 {
7497 .eraseblocks = { {4 * 1024, 1024} },
7498 .block_erase = spi_block_erase_20,
7499 }, {
7500 .eraseblocks = { {32 * 1024, 128} },
7501 .block_erase = spi_block_erase_52,
7502 }, {
7503 .eraseblocks = { {64 * 1024, 64} },
7504 .block_erase = spi_block_erase_d8,
7505 }, {
7506 .eraseblocks = { {4 * 1024 * 1024, 1} },
7507 .block_erase = spi_block_erase_60,
7508 }, {
7509 .eraseblocks = { {4 * 1024 * 1024, 1} },
7510 .block_erase = spi_block_erase_c7,
7511 }
7512 },
7513 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007514 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007515 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00007516 .write = spi_chip_write_256,
7517 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7518 .voltage = {1650, 2000},
7519 },
7520
7521 {
7522 .vendor = "Macronix",
7523 .name = "MX25U6435E/F",
7524 .bustype = BUS_SPI,
7525 .manufacture_id = MACRONIX_ID,
7526 .model_id = MACRONIX_MX25U6435E,
7527 .total_size = 8192,
7528 .page_size = 256,
7529 /* F model supports SFDP */
7530 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7531 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7532 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7533 .tested = TEST_UNTESTED,
7534 .probe = probe_spi_rdid,
7535 .probe_timing = TIMING_ZERO,
7536 .block_erasers =
7537 {
7538 {
7539 .eraseblocks = { {4 * 1024, 2048} },
7540 .block_erase = spi_block_erase_20,
7541 }, {
7542 .eraseblocks = { {32 * 1024, 256} },
7543 .block_erase = spi_block_erase_52,
7544 }, {
7545 .eraseblocks = { {64 * 1024, 128} },
7546 .block_erase = spi_block_erase_d8,
7547 }, {
7548 .eraseblocks = { {8 * 1024 * 1024, 1} },
7549 .block_erase = spi_block_erase_60,
7550 }, {
7551 .eraseblocks = { {8 * 1024 * 1024, 1} },
7552 .block_erase = spi_block_erase_c7,
7553 }
7554 },
7555 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007556 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00007557 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00007558 .write = spi_chip_write_256,
7559 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7560 .voltage = {1650, 2000},
7561 },
7562
7563 {
7564 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00007565 .name = "MX25U12835F",
7566 .bustype = BUS_SPI,
7567 .manufacture_id = MACRONIX_ID,
7568 .model_id = MACRONIX_MX25U12835E,
7569 .total_size = 16384,
7570 .page_size = 256,
7571 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7572 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7573 .tested = TEST_UNTESTED,
7574 .probe = probe_spi_rdid,
7575 .probe_timing = TIMING_ZERO,
7576 .block_erasers =
7577 {
7578 {
7579 .eraseblocks = { {4 * 1024, 4096} },
7580 .block_erase = spi_block_erase_20,
7581 }, {
7582 .eraseblocks = { {32 * 1024, 512} },
7583 .block_erase = spi_block_erase_52,
7584 }, {
7585 .eraseblocks = { {64 * 1024, 256} },
7586 .block_erase = spi_block_erase_d8,
7587 }, {
7588 .eraseblocks = { {16 * 1024 * 1024, 1} },
7589 .block_erase = spi_block_erase_60,
7590 }, {
7591 .eraseblocks = { {16 * 1024 * 1024, 1} },
7592 .block_erase = spi_block_erase_c7,
7593 }
7594 },
7595 /* TODO: security register */
7596 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
7597 .unlock = spi_disable_blockprotect_bp3_srwd,
7598 .write = spi_chip_write_256, /* Multi I/O supported */
7599 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7600 .voltage = {1650, 2000},
7601 },
7602
7603 {
Stefan Taunera4617f72015-01-10 15:59:54 +00007604 .vendor = "Macronix",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00007605 .name = "MX25L6495F",
7606 .bustype = BUS_SPI,
7607 .manufacture_id = MACRONIX_ID,
7608 .model_id = MACRONIX_MX25L6495F,
7609 .total_size = 8192,
7610 .page_size = 256,
7611 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
7612 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7613 .tested = TEST_OK_PREW,
7614 .probe = probe_spi_rdid,
7615 .probe_timing = TIMING_ZERO,
7616 .block_erasers =
7617 {
7618 {
7619 .eraseblocks = { {4 * 1024, 2048} },
7620 .block_erase = spi_block_erase_20,
7621 }, {
7622 .eraseblocks = { {64 * 1024, 128} },
7623 .block_erase = spi_block_erase_d8,
7624 }, {
7625 .eraseblocks = { {32 * 1024, 256} },
7626 .block_erase = spi_block_erase_52,
7627 }, {
7628 .eraseblocks = { {8 * 1024 * 1024, 1} },
7629 .block_erase = spi_block_erase_60,
7630 }, {
7631 .eraseblocks = { {8 * 1024 * 1024, 1} },
7632 .block_erase = spi_block_erase_c7,
7633 }
7634 },
7635 .unlock = spi_disable_blockprotect,
7636 .write = spi_chip_write_256,
7637 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7638 .voltage = {2700, 3600},
7639 },
7640
7641 {
Martin Roth440057a2014-07-13 00:05:07 +00007642 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00007643 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007644 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007645 .manufacture_id = MACRONIX_ID,
7646 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007647 .total_size = 128,
7648 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007649 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7650 .tested = TEST_UNTESTED,
7651 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007652 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007653 .block_erasers =
7654 {
7655 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007656 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007657 {8 * 1024, 1},
7658 {4 * 1024, 2},
7659 {8 * 1024, 2},
7660 {32 * 1024, 1},
7661 {64 * 1024, 1},
7662 },
Sean Nelson35727f72010-01-28 23:55:12 +00007663 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007664 }, {
7665 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007666 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007667 }
7668 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007669 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007670 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007671 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007672 },
7673
7674 {
7675 .vendor = "Macronix",
7676 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007677 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007678 .manufacture_id = MACRONIX_ID,
7679 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007680 .total_size = 128,
7681 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007682 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00007683 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007684 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007685 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007686 .block_erasers =
7687 {
7688 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007689 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007690 {64 * 1024, 1},
7691 {32 * 1024, 1},
7692 {8 * 1024, 2},
7693 {4 * 1024, 2},
7694 {8 * 1024, 1},
7695 },
Sean Nelson35727f72010-01-28 23:55:12 +00007696 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007697 }, {
7698 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007699 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007700 }
7701 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007702 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007703 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007704 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007705 },
7706
7707 {
7708 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007709 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007710 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007711 .manufacture_id = MACRONIX_ID,
7712 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007713 .total_size = 256,
7714 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007715 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007716 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00007717 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007718 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007719 .block_erasers =
7720 {
7721 {
7722 .eraseblocks = {
7723 {16 * 1024, 1},
7724 {8 * 1024, 2},
7725 {32 * 1024, 1},
7726 {64 * 1024, 3},
7727 },
Sean Nelson35727f72010-01-28 23:55:12 +00007728 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007729 }, {
7730 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007731 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007732 },
7733 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007734 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007735 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007736 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007737 },
7738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007739 {
7740 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007741 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007742 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007743 .manufacture_id = MACRONIX_ID,
7744 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007745 .total_size = 256,
7746 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007747 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00007748 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007749 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007750 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007751 .block_erasers =
7752 {
7753 {
7754 .eraseblocks = {
7755 {64 * 1024, 3},
7756 {32 * 1024, 1},
7757 {8 * 1024, 2},
7758 {16 * 1024, 1},
7759 },
Sean Nelson35727f72010-01-28 23:55:12 +00007760 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007761 }, {
7762 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007763 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007764 },
7765 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007766 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007767 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007768 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007769 },
7770
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007771 {
7772 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00007773 .name = "MX29F022(N)B",
7774 .bustype = BUS_PARALLEL,
7775 .manufacture_id = MACRONIX_ID,
7776 .model_id = MACRONIX_MX29F022B,
7777 .total_size = 256,
7778 .page_size = 0, /* unused */
7779 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7780 .tested = TEST_UNTESTED,
7781 .probe = probe_jedec,
7782 .probe_timing = TIMING_ZERO,
7783 .block_erasers =
7784 {
7785 {
7786 .eraseblocks = {
7787 {16 * 1024, 1},
7788 {8 * 1024, 2},
7789 {32 * 1024, 1},
7790 {64 * 1024, 3},
7791 },
7792 .block_erase = erase_sector_jedec,
7793 }, {
7794 .eraseblocks = { {256 * 1024, 1} },
7795 .block_erase = erase_chip_block_jedec,
7796 }
7797 },
7798 .write = write_jedec_1,
7799 .read = read_memmapped,
7800 .voltage = {4500, 5500},
7801 },
7802
7803 {
7804 .vendor = "Macronix",
7805 .name = "MX29F022(N)T",
7806 .bustype = BUS_PARALLEL,
7807 .manufacture_id = MACRONIX_ID,
7808 .model_id = MACRONIX_MX29F022T,
7809 .total_size = 256,
7810 .page_size = 0, /* unused */
7811 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7812 .tested = TEST_OK_PREW,
7813 .probe = probe_jedec,
7814 .probe_timing = TIMING_ZERO,
7815 .block_erasers =
7816 {
7817 {
7818 .eraseblocks = {
7819 {64 * 1024, 3},
7820 {32 * 1024, 1},
7821 {8 * 1024, 2},
7822 {16 * 1024, 1},
7823 },
7824 .block_erase = erase_sector_jedec,
7825 }, {
7826 .eraseblocks = { {256 * 1024, 1} },
7827 .block_erase = erase_chip_block_jedec,
7828 }
7829 },
7830 .write = write_jedec_1,
7831 .read = read_memmapped,
7832 .voltage = {4500, 5500},
7833 },
7834
7835 {
7836 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00007837 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007838 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007839 .manufacture_id = MACRONIX_ID,
7840 .model_id = MACRONIX_MX29F040,
7841 .total_size = 512,
7842 .page_size = 64 * 1024,
7843 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7844 .tested = TEST_UNTESTED,
7845 .probe = probe_jedec,
7846 .probe_timing = TIMING_ZERO,
7847 .block_erasers =
7848 {
7849 {
7850 .eraseblocks = { {64 * 1024, 8} },
7851 .block_erase = erase_sector_jedec,
7852 }, {
7853 .eraseblocks = { {512 * 1024, 1} },
7854 .block_erase = erase_chip_block_jedec,
7855 },
7856 },
7857 .write = write_jedec_1,
7858 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007859 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00007860 },
7861
7862 {
7863 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007864 .name = "MX29GL320EB",
7865 .bustype = BUS_PARALLEL,
7866 .manufacture_id = MACRONIX_ID,
7867 .model_id = MACRONIX_MX29GL320EB,
7868 .total_size = 4096,
7869 .page_size = 128 * 1024, /* actual page size is 16 */
7870 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7871 .tested = TEST_UNTESTED,
7872 .probe = probe_jedec_29gl,
7873 .probe_timing = TIMING_ZERO,
7874 .block_erasers =
7875 {
7876 {
7877 .eraseblocks = {
7878 {8 * 1024, 8},
7879 {64 * 1024, 63},
7880 },
7881 .block_erase = erase_sector_jedec,
7882 }, {
7883 .eraseblocks = { {4 * 1024 * 1024, 1} },
7884 .block_erase = erase_chip_block_jedec,
7885 },
7886 },
7887 .write = write_jedec_1,
7888 .read = read_memmapped,
7889 .voltage = {2700, 3600},
7890 },
7891
7892 {
7893 .vendor = "Macronix",
7894 .name = "MX29GL320ET",
7895 .bustype = BUS_PARALLEL,
7896 .manufacture_id = MACRONIX_ID,
7897 .model_id = MACRONIX_MX29GL320ET,
7898 .total_size = 4096,
7899 .page_size = 128 * 1024, /* actual page size is 16 */
7900 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7901 .tested = TEST_UNTESTED,
7902 .probe = probe_jedec_29gl,
7903 .probe_timing = TIMING_ZERO,
7904 .block_erasers =
7905 {
7906 {
7907 .eraseblocks = {
7908 {64 * 1024, 63},
7909 {8 * 1024, 8},
7910 },
7911 .block_erase = erase_sector_jedec,
7912 }, {
7913 .eraseblocks = { {4 * 1024 * 1024, 1} },
7914 .block_erase = erase_chip_block_jedec,
7915 },
7916 },
7917 .write = write_jedec_1,
7918 .read = read_memmapped,
7919 .voltage = {2700, 3600},
7920 },
7921
7922 {
7923 .vendor = "Macronix",
7924 .name = "MX29GL320EH/L",
7925 .bustype = BUS_PARALLEL,
7926 .manufacture_id = MACRONIX_ID,
7927 .model_id = MACRONIX_MX29GL320EHL,
7928 .total_size = 4096,
7929 .page_size = 128 * 1024, /* actual page size is 16 */
7930 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7931 .tested = TEST_UNTESTED,
7932 .probe = probe_jedec_29gl,
7933 .probe_timing = TIMING_ZERO,
7934 .block_erasers =
7935 {
7936 {
7937 .eraseblocks = { {64 * 1024, 64} },
7938 .block_erase = erase_sector_jedec,
7939 }, {
7940 .eraseblocks = { {4 * 1024 * 1024, 1} },
7941 .block_erase = erase_chip_block_jedec,
7942 },
7943 },
7944 .write = write_jedec_1,
7945 .read = read_memmapped,
7946 .voltage = {2700, 3600},
7947 },
7948
7949 {
7950 .vendor = "Macronix",
7951 .name = "MX29GL640EB",
7952 .bustype = BUS_PARALLEL,
7953 .manufacture_id = MACRONIX_ID,
7954 .model_id = MACRONIX_MX29GL640EB,
7955 .total_size = 8192,
7956 .page_size = 128 * 1024, /* actual page size is 16 */
7957 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7958 .tested = TEST_UNTESTED,
7959 .probe = probe_jedec_29gl,
7960 .probe_timing = TIMING_ZERO,
7961 .block_erasers =
7962 {
7963 {
7964 .eraseblocks = {
7965 {8 * 1024, 8},
7966 {64 * 1024, 127},
7967 },
7968 .block_erase = erase_sector_jedec,
7969 }, {
7970 .eraseblocks = { {8 * 1024 * 1024, 1} },
7971 .block_erase = erase_chip_block_jedec,
7972 },
7973 },
7974 .write = write_jedec_1,
7975 .read = read_memmapped,
7976 .voltage = {2700, 3600},
7977 },
7978
7979 {
7980 .vendor = "Macronix",
7981 .name = "MX29GL640ET",
7982 .bustype = BUS_PARALLEL,
7983 .manufacture_id = MACRONIX_ID,
7984 .model_id = MACRONIX_MX29GL640ET,
7985 .total_size = 8192,
7986 .page_size = 128 * 1024, /* actual page size is 16 */
7987 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7988 .tested = TEST_UNTESTED,
7989 .probe = probe_jedec_29gl,
7990 .probe_timing = TIMING_ZERO,
7991 .block_erasers =
7992 {
7993 {
7994 .eraseblocks = {
7995 {64 * 1024, 127},
7996 {8 * 1024, 8},
7997 },
7998 .block_erase = erase_sector_jedec,
7999 }, {
8000 .eraseblocks = { {8 * 1024 * 1024, 1} },
8001 .block_erase = erase_chip_block_jedec,
8002 },
8003 },
8004 .write = write_jedec_1,
8005 .read = read_memmapped,
8006 .voltage = {2700, 3600},
8007 },
8008
8009 {
8010 .vendor = "Macronix",
8011 .name = "MX29GL640EH/L",
8012 .bustype = BUS_PARALLEL,
8013 .manufacture_id = MACRONIX_ID,
8014 .model_id = MACRONIX_MX29GL640EHL,
8015 .total_size = 8192,
8016 .page_size = 128 * 1024, /* actual page size is 16 */
8017 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8018 .tested = TEST_UNTESTED,
8019 .probe = probe_jedec_29gl,
8020 .probe_timing = TIMING_ZERO,
8021 .block_erasers =
8022 {
8023 {
8024 .eraseblocks = { {64 * 1024, 128} },
8025 .block_erase = erase_sector_jedec,
8026 }, {
8027 .eraseblocks = { {8 * 1024 * 1024, 1} },
8028 .block_erase = erase_chip_block_jedec,
8029 },
8030 },
8031 .write = write_jedec_1,
8032 .read = read_memmapped,
8033 .voltage = {2700, 3600},
8034 },
8035
8036 {
8037 .vendor = "Macronix",
8038 .name = "MX29GL128F",
8039 .bustype = BUS_PARALLEL,
8040 .manufacture_id = MACRONIX_ID,
8041 .model_id = MACRONIX_MX29GL128F,
8042 .total_size = 16384,
8043 .page_size = 128 * 1024, /* actual page size is 16 */
8044 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8045 .tested = TEST_UNTESTED,
8046 .probe = probe_jedec_29gl,
8047 .probe_timing = TIMING_ZERO,
8048 .block_erasers =
8049 {
8050 {
8051 .eraseblocks = { {128 * 1024, 128} },
8052 .block_erase = erase_sector_jedec,
8053 }, {
8054 .eraseblocks = { {16 * 1024 * 1024, 1} },
8055 .block_erase = erase_chip_block_jedec,
8056 },
8057 },
8058 .write = write_jedec_1,
8059 .read = read_memmapped,
8060 .voltage = {2700, 3600},
8061 },
8062
8063 {
8064 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00008065 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008066 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008067 .manufacture_id = MACRONIX_ID,
8068 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008069 .total_size = 512,
8070 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008071 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8072 .tested = TEST_UNTESTED,
8073 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00008074 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008075 .block_erasers =
8076 {
8077 {
Stefan Tauner6697f712014-08-06 15:09:15 +00008078 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00008079 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008080 }, {
8081 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008082 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00008083 },
8084 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00008085 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008087 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00008088 },
8089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008090 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008091 .vendor = "Micron/Numonyx/ST",
8092 .name = "M25P05-A",
8093 .bustype = BUS_SPI,
8094 .manufacture_id = ST_ID,
8095 .model_id = ST_M25P05A,
8096 .total_size = 64,
8097 .page_size = 256,
8098 .feature_bits = FEATURE_WRSR_WREN,
8099 .tested = TEST_OK_PREW,
8100 .probe = probe_spi_rdid,
8101 .probe_timing = TIMING_ZERO,
8102 .block_erasers =
8103 {
8104 {
8105 .eraseblocks = { {32 * 1024, 2} },
8106 .block_erase = spi_block_erase_d8,
8107 }, {
8108 .eraseblocks = { {64 * 1024, 1} },
8109 .block_erase = spi_block_erase_c7,
8110 }
8111 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008112 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008113 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008114 .write = spi_chip_write_256,
8115 .read = spi_chip_read,
8116 .voltage = {2700, 3600},
8117 },
8118
8119 /* The ST M25P05 is a bit of a problem. It has the same ID as the
8120 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
8121 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
8122 * only is successful if RDID does not work.
8123 */
8124 {
8125 .vendor = "Micron/Numonyx/ST",
8126 .name = "M25P05",
8127 .bustype = BUS_SPI,
8128 .manufacture_id = 0, /* Not used. */
8129 .model_id = ST_M25P05_RES,
8130 .total_size = 64,
8131 .page_size = 256,
8132 .feature_bits = FEATURE_WRSR_WREN,
8133 .tested = TEST_UNTESTED,
8134 .probe = probe_spi_res1,
8135 .probe_timing = TIMING_ZERO,
8136 .block_erasers =
8137 {
8138 {
8139 .eraseblocks = { {32 * 1024, 2} },
8140 .block_erase = spi_block_erase_d8,
8141 }, {
8142 .eraseblocks = { {64 * 1024, 1} },
8143 .block_erase = spi_block_erase_c7,
8144 }
8145 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008146 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008147 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008148 .write = spi_chip_write_1, /* 128 */
8149 .read = spi_chip_read,
8150 .voltage = {2700, 3600},
8151 },
8152
8153 {
8154 .vendor = "Micron/Numonyx/ST",
8155 .name = "M25P10-A",
8156 .bustype = BUS_SPI,
8157 .manufacture_id = ST_ID,
8158 .model_id = ST_M25P10A,
8159 .total_size = 128,
8160 .page_size = 256,
8161 .feature_bits = FEATURE_WRSR_WREN,
8162 .tested = TEST_OK_PRE,
8163 .probe = probe_spi_rdid,
8164 .probe_timing = TIMING_ZERO,
8165 .block_erasers =
8166 {
8167 {
8168 .eraseblocks = { {32 * 1024, 4} },
8169 .block_erase = spi_block_erase_d8,
8170 }, {
8171 .eraseblocks = { {128 * 1024, 1} },
8172 .block_erase = spi_block_erase_c7,
8173 }
8174 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008175 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008176 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008177 .write = spi_chip_write_256,
8178 .read = spi_chip_read,
8179 .voltage = {2700, 3600},
8180 },
8181
8182 /* The ST M25P10 has the same problem as the M25P05. */
8183 {
8184 .vendor = "Micron/Numonyx/ST",
8185 .name = "M25P10",
8186 .bustype = BUS_SPI,
8187 .manufacture_id = 0, /* Not used. */
8188 .model_id = ST_M25P10_RES,
8189 .total_size = 128,
8190 .page_size = 256,
8191 .feature_bits = FEATURE_WRSR_WREN,
8192 .tested = TEST_UNTESTED,
8193 .probe = probe_spi_res1,
8194 .probe_timing = TIMING_ZERO,
8195 .block_erasers =
8196 {
8197 {
8198 .eraseblocks = { {32 * 1024, 4} },
8199 .block_erase = spi_block_erase_d8,
8200 }, {
8201 .eraseblocks = { {128 * 1024, 1} },
8202 .block_erase = spi_block_erase_c7,
8203 }
8204 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008205 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008206 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008207 .write = spi_chip_write_1, /* 128 */
8208 .read = spi_chip_read,
8209 .voltage = {2700, 3600},
8210 },
8211
8212 {
8213 .vendor = "Micron/Numonyx/ST", /* Numonyx */
8214 .name = "M25P20",
8215 .bustype = BUS_SPI,
8216 .manufacture_id = ST_ID,
8217 .model_id = ST_M25P20,
8218 .total_size = 256,
8219 .page_size = 256,
8220 .feature_bits = FEATURE_WRSR_WREN,
8221 .tested = TEST_UNTESTED,
8222 .probe = probe_spi_rdid,
8223 .probe_timing = TIMING_ZERO,
8224 .block_erasers =
8225 {
8226 {
8227 .eraseblocks = { {64 * 1024, 4} },
8228 .block_erase = spi_block_erase_d8,
8229 }, {
8230 .eraseblocks = { {256 * 1024, 1} },
8231 .block_erase = spi_block_erase_c7,
8232 }
8233 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008234 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008235 .unlock = spi_disable_blockprotect,
8236 .write = spi_chip_write_256,
8237 .read = spi_chip_read, /* Fast read (0x0B) supported */
8238 .voltage = {2700, 3600},
8239 },
8240
8241 {
8242 .vendor = "Micron/Numonyx/ST",
8243 .name = "M25P20-old",
8244 .bustype = BUS_SPI,
8245 .manufacture_id = 0, /* Not used. */
8246 .model_id = ST_M25P20_RES,
8247 .total_size = 256,
8248 .page_size = 256,
8249 .feature_bits = FEATURE_WRSR_WREN,
8250 .tested = TEST_OK_PREW,
8251 .probe = probe_spi_res1,
8252 .probe_timing = TIMING_ZERO,
8253 .block_erasers =
8254 {
8255 {
8256 .eraseblocks = { {64 * 1024, 4} },
8257 .block_erase = spi_block_erase_d8,
8258 }, {
8259 .eraseblocks = { {256 * 1024, 1} },
8260 .block_erase = spi_block_erase_c7,
8261 }
8262 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008263 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008264 .unlock = spi_disable_blockprotect,
8265 .write = spi_chip_write_256,
8266 .read = spi_chip_read, /* Fast read (0x0B) supported */
8267 .voltage = {2700, 3600},
8268 },
8269
8270 {
8271 .vendor = "Micron/Numonyx/ST", /* Numonyx */
8272 .name = "M25P40",
8273 .bustype = BUS_SPI,
8274 .manufacture_id = ST_ID,
8275 .model_id = ST_M25P40,
8276 .total_size = 512,
8277 .page_size = 256,
8278 .feature_bits = FEATURE_WRSR_WREN,
8279 .tested = TEST_OK_PREW,
8280 .probe = probe_spi_rdid,
8281 .probe_timing = TIMING_ZERO,
8282 .block_erasers =
8283 {
8284 {
8285 .eraseblocks = { {64 * 1024, 8} },
8286 .block_erase = spi_block_erase_d8,
8287 }, {
8288 .eraseblocks = { {512 * 1024, 1} },
8289 .block_erase = spi_block_erase_c7,
8290 }
8291 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008292 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008293 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008294 .write = spi_chip_write_256,
8295 .read = spi_chip_read,
8296 .voltage = {2700, 3600},
8297 },
8298
8299 {
8300 .vendor = "Micron/Numonyx/ST",
8301 .name = "M25P40-old",
8302 .bustype = BUS_SPI,
8303 .manufacture_id = 0, /* Not used. */
8304 .model_id = ST_M25P40_RES,
8305 .total_size = 512,
8306 .page_size = 256,
8307 .feature_bits = FEATURE_WRSR_WREN,
8308 .tested = TEST_UNTESTED,
8309 .probe = probe_spi_res1,
8310 .probe_timing = TIMING_ZERO,
8311 .block_erasers =
8312 {
8313 {
8314 .eraseblocks = { {64 * 1024, 8} },
8315 .block_erase = spi_block_erase_d8,
8316 }, {
8317 .eraseblocks = { {512 * 1024, 1} },
8318 .block_erase = spi_block_erase_c7,
8319 }
8320 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008321 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008322 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008323 .write = spi_chip_write_256,
8324 .read = spi_chip_read,
8325 },
8326
8327 {
8328 .vendor = "Micron/Numonyx/ST",
8329 .name = "M25P80",
8330 .bustype = BUS_SPI,
8331 .manufacture_id = ST_ID,
8332 .model_id = ST_M25P80,
8333 .total_size = 1024,
8334 .page_size = 256,
8335 .feature_bits = FEATURE_WRSR_WREN,
8336 .tested = TEST_OK_PREW,
8337 .probe = probe_spi_rdid,
8338 .probe_timing = TIMING_ZERO,
8339 .block_erasers =
8340 {
8341 {
8342 .eraseblocks = { {64 * 1024, 16} },
8343 .block_erase = spi_block_erase_d8,
8344 }, {
8345 .eraseblocks = { {1024 * 1024, 1} },
8346 .block_erase = spi_block_erase_c7,
8347 }
8348 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008349 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008350 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008351 .write = spi_chip_write_256,
8352 .read = spi_chip_read,
8353 .voltage = {2700, 3600},
8354 },
8355
8356 {
8357 .vendor = "Micron/Numonyx/ST",
8358 .name = "M25P16",
8359 .bustype = BUS_SPI,
8360 .manufacture_id = ST_ID,
8361 .model_id = ST_M25P16,
8362 .total_size = 2048,
8363 .page_size = 256,
8364 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008365 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008366 .probe = probe_spi_rdid,
8367 .probe_timing = TIMING_ZERO,
8368 .block_erasers =
8369 {
8370 {
8371 .eraseblocks = { {64 * 1024, 32} },
8372 .block_erase = spi_block_erase_d8,
8373 }, {
8374 .eraseblocks = { {2 * 1024 * 1024, 1} },
8375 .block_erase = spi_block_erase_c7,
8376 }
8377 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008378 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008379 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008380 .write = spi_chip_write_256,
8381 .read = spi_chip_read,
8382 .voltage = {2700, 3600},
8383 },
8384
8385 {
8386 .vendor = "Micron/Numonyx/ST",
8387 .name = "M25P32",
8388 .bustype = BUS_SPI,
8389 .manufacture_id = ST_ID,
8390 .model_id = ST_M25P32,
8391 .total_size = 4096,
8392 .page_size = 256,
8393 .feature_bits = FEATURE_WRSR_WREN,
8394 .tested = TEST_OK_PREW,
8395 .probe = probe_spi_rdid,
8396 .probe_timing = TIMING_ZERO,
8397 .block_erasers =
8398 {
8399 {
8400 .eraseblocks = { {64 * 1024, 64} },
8401 .block_erase = spi_block_erase_d8,
8402 }, {
8403 .eraseblocks = { {4 * 1024 * 1024, 1} },
8404 .block_erase = spi_block_erase_c7,
8405 }
8406 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008407 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008408 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008409 .write = spi_chip_write_256,
8410 .read = spi_chip_read,
8411 .voltage = {2700, 3600},
8412 },
8413
8414 {
8415 .vendor = "Micron/Numonyx/ST",
8416 .name = "M25P64",
8417 .bustype = BUS_SPI,
8418 .manufacture_id = ST_ID,
8419 .model_id = ST_M25P64,
8420 .total_size = 8192,
8421 .page_size = 256,
8422 .feature_bits = FEATURE_WRSR_WREN,
8423 .tested = TEST_OK_PREW,
8424 .probe = probe_spi_rdid,
8425 .probe_timing = TIMING_ZERO,
8426 .block_erasers =
8427 {
8428 {
8429 .eraseblocks = { {64 * 1024, 128} },
8430 .block_erase = spi_block_erase_d8,
8431 }, {
8432 .eraseblocks = { {8 * 1024 * 1024, 1} },
8433 .block_erase = spi_block_erase_c7,
8434 }
8435 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008436 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008437 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008438 .write = spi_chip_write_256,
8439 .read = spi_chip_read,
8440 .voltage = {2700, 3600},
8441 },
8442
8443 {
8444 .vendor = "Micron/Numonyx/ST",
8445 .name = "M25P128",
8446 .bustype = BUS_SPI,
8447 .manufacture_id = ST_ID,
8448 .model_id = ST_M25P128,
8449 .total_size = 16384,
8450 .page_size = 256,
8451 .feature_bits = FEATURE_WRSR_WREN,
8452 .tested = TEST_OK_PREW,
8453 .probe = probe_spi_rdid,
8454 .probe_timing = TIMING_ZERO,
8455 .block_erasers =
8456 {
8457 {
8458 .eraseblocks = { {256 * 1024, 64} },
8459 .block_erase = spi_block_erase_d8,
8460 }, {
8461 .eraseblocks = { {16 * 1024 * 1024, 1} },
8462 .block_erase = spi_block_erase_c7,
8463 }
8464 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008465 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008466 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008467 .write = spi_chip_write_256,
8468 .read = spi_chip_read,
8469 .voltage = {2700, 3600},
8470 },
8471
8472 {
8473 .vendor = "Micron/Numonyx/ST",
8474 .name = "M25PE10",
8475 .bustype = BUS_SPI,
8476 .manufacture_id = ST_ID,
8477 .model_id = ST_M25PE10,
8478 .total_size = 128,
8479 .page_size = 256,
8480 .feature_bits = FEATURE_WRSR_WREN,
8481 .tested = TEST_UNTESTED,
8482 .probe = probe_spi_rdid,
8483 .probe_timing = TIMING_ZERO,
8484 .block_erasers =
8485 {
8486 {
8487 .eraseblocks = { {4 * 1024, 32} },
8488 .block_erase = spi_block_erase_20,
8489 }, {
8490 .eraseblocks = { {64 * 1024, 2} },
8491 .block_erase = spi_block_erase_d8,
8492 }, {
8493 .eraseblocks = { {128 * 1024, 1} },
8494 .block_erase = spi_block_erase_c7,
8495 }
8496 },
8497 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8498 .unlock = spi_disable_blockprotect,
8499 .write = spi_chip_write_256,
8500 .read = spi_chip_read,
8501 .voltage = {2700, 3600},
8502 },
8503
8504 {
8505 .vendor = "Micron/Numonyx/ST",
8506 .name = "M25PE20",
8507 .bustype = BUS_SPI,
8508 .manufacture_id = ST_ID,
8509 .model_id = ST_M25PE20,
8510 .total_size = 256,
8511 .page_size = 256,
8512 .feature_bits = FEATURE_WRSR_WREN,
8513 .tested = TEST_UNTESTED,
8514 .probe = probe_spi_rdid,
8515 .probe_timing = TIMING_ZERO,
8516 .block_erasers =
8517 {
8518 {
8519 .eraseblocks = { {4 * 1024, 64} },
8520 .block_erase = spi_block_erase_20,
8521 }, {
8522 .eraseblocks = { {64 * 1024, 4} },
8523 .block_erase = spi_block_erase_d8,
8524 }, {
8525 .eraseblocks = { {256 * 1024, 1} },
8526 .block_erase = spi_block_erase_c7,
8527 }
8528 },
8529 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8530 .unlock = spi_disable_blockprotect,
8531 .write = spi_chip_write_256,
8532 .read = spi_chip_read,
8533 .voltage = {2700, 3600},
8534 },
8535
8536 {
8537 .vendor = "Micron/Numonyx/ST",
8538 .name = "M25PE40",
8539 .bustype = BUS_SPI,
8540 .manufacture_id = ST_ID,
8541 .model_id = ST_M25PE40,
8542 .total_size = 512,
8543 .page_size = 256,
8544 .feature_bits = FEATURE_WRSR_WREN,
8545 .tested = TEST_UNTESTED,
8546 .probe = probe_spi_rdid,
8547 .probe_timing = TIMING_ZERO,
8548 .block_erasers =
8549 {
8550 {
8551 .eraseblocks = { {4 * 1024, 128} },
8552 .block_erase = spi_block_erase_20,
8553 }, {
8554 .eraseblocks = { {64 * 1024, 8} },
8555 .block_erase = spi_block_erase_d8,
8556 }, {
8557 .eraseblocks = { {512 * 1024, 1} },
8558 .block_erase = spi_block_erase_c7,
8559 }
8560 },
8561 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8562 .unlock = spi_disable_blockprotect,
8563 .write = spi_chip_write_256,
8564 .read = spi_chip_read,
8565 .voltage = {2700, 3600},
8566 },
8567
8568 {
8569 .vendor = "Micron/Numonyx/ST",
8570 .name = "M25PE80",
8571 .bustype = BUS_SPI,
8572 .manufacture_id = ST_ID,
8573 .model_id = ST_M25PE80,
8574 .total_size = 1024,
8575 .page_size = 256,
8576 .feature_bits = FEATURE_WRSR_WREN,
8577 .tested = TEST_OK_PREW,
8578 .probe = probe_spi_rdid,
8579 .probe_timing = TIMING_ZERO,
8580 .block_erasers =
8581 {
8582 {
8583 .eraseblocks = { {4 * 1024, 256} },
8584 .block_erase = spi_block_erase_20,
8585 }, {
8586 .eraseblocks = { {64 * 1024, 16} },
8587 .block_erase = spi_block_erase_d8,
8588 }, {
8589 .eraseblocks = { {1024 * 1024, 1} },
8590 .block_erase = spi_block_erase_c7,
8591 }
8592 },
8593 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8594 .unlock = spi_disable_blockprotect,
8595 .write = spi_chip_write_256,
8596 .read = spi_chip_read,
8597 .voltage = {2700, 3600},
8598 },
8599
8600 {
8601 .vendor = "Micron/Numonyx/ST",
8602 .name = "M25PE16",
8603 .bustype = BUS_SPI,
8604 .manufacture_id = ST_ID,
8605 .model_id = ST_M25PE16,
8606 .total_size = 2048,
8607 .page_size = 256,
8608 .feature_bits = FEATURE_WRSR_WREN,
8609 .tested = TEST_UNTESTED,
8610 .probe = probe_spi_rdid,
8611 .probe_timing = TIMING_ZERO,
8612 .block_erasers =
8613 {
8614 {
8615 .eraseblocks = { {4 * 1024, 512} },
8616 .block_erase = spi_block_erase_20,
8617 }, {
8618 .eraseblocks = { {64 * 1024, 32} },
8619 .block_erase = spi_block_erase_d8,
8620 }, {
8621 .eraseblocks = { {2 * 1024 * 1024, 1} },
8622 .block_erase = spi_block_erase_c7,
8623 }
8624 },
8625 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8626 .unlock = spi_disable_blockprotect,
8627 .write = spi_chip_write_256,
8628 .read = spi_chip_read,
8629 .voltage = {2700, 3600},
8630 },
8631
8632 {
8633 .vendor = "Micron/Numonyx/ST",
8634 .name = "M25PX80",
8635 .bustype = BUS_SPI,
8636 .manufacture_id = ST_ID,
8637 .model_id = ST_M25PX80,
8638 .total_size = 1024,
8639 .page_size = 256,
8640 /* OTP: 64B total; read 0x4B, write 0x42 */
8641 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8642 .tested = TEST_OK_PREW,
8643 .probe = probe_spi_rdid,
8644 .probe_timing = TIMING_ZERO,
8645 .block_erasers = {
8646 {
8647 .eraseblocks = { { 4 * 1024, 256 } },
8648 .block_erase = spi_block_erase_20,
8649 }, {
8650 .eraseblocks = { {64 * 1024, 16} },
8651 .block_erase = spi_block_erase_d8,
8652 }, {
8653 .eraseblocks = { {1024 * 1024, 1} },
8654 .block_erase = spi_block_erase_c7,
8655 }
8656 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008657 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008658 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8659 .write = spi_chip_write_256,
8660 .read = spi_chip_read,
8661 .voltage = {2700, 3600},
8662 },
8663
8664 {
8665 .vendor = "Micron/Numonyx/ST",
8666 .name = "M25PX16",
8667 .bustype = BUS_SPI,
8668 .manufacture_id = ST_ID,
8669 .model_id = ST_M25PX16,
8670 .total_size = 2048,
8671 .page_size = 256,
8672 /* OTP: 64B total; read 0x4B; write 0x42 */
8673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8674 .tested = TEST_OK_PREW,
8675 .probe = probe_spi_rdid,
8676 .probe_timing = TIMING_ZERO,
8677 .block_erasers =
8678 {
8679 {
8680 .eraseblocks = { { 4 * 1024, 512 } },
8681 .block_erase = spi_block_erase_20,
8682 }, {
8683 .eraseblocks = { {64 * 1024, 32} },
8684 .block_erase = spi_block_erase_d8,
8685 }, {
8686 .eraseblocks = { {2 * 1024 * 1024, 1} },
8687 .block_erase = spi_block_erase_c7,
8688 }
8689 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008690 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008691 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8692 .write = spi_chip_write_256,
8693 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008694 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008695 },
8696
8697 {
8698 .vendor = "Micron/Numonyx/ST",
8699 .name = "M25PX32",
8700 .bustype = BUS_SPI,
8701 .manufacture_id = ST_ID,
8702 .model_id = ST_M25PX32,
8703 .total_size = 4096,
8704 .page_size = 256,
8705 /* OTP: 64B total; read 0x4B; write 0x42 */
8706 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8707 .tested = TEST_OK_PRE,
8708 .probe = probe_spi_rdid,
8709 .probe_timing = TIMING_ZERO,
8710 .block_erasers =
8711 {
8712 {
8713 .eraseblocks = { { 4 * 1024, 1024 } },
8714 .block_erase = spi_block_erase_20,
8715 }, {
8716 .eraseblocks = { {64 * 1024, 64} },
8717 .block_erase = spi_block_erase_d8,
8718 }, {
8719 .eraseblocks = { {4 * 1024 * 1024, 1} },
8720 .block_erase = spi_block_erase_c7,
8721 }
8722 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008723 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008724 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8725 .write = spi_chip_write_256,
8726 .read = spi_chip_read,
8727 .voltage = {2700, 3600},
8728 },
8729
8730 {
8731 .vendor = "Micron/Numonyx/ST",
8732 .name = "M25PX64",
8733 .bustype = BUS_SPI,
8734 .manufacture_id = ST_ID,
8735 .model_id = ST_M25PX64,
8736 .total_size = 8192,
8737 .page_size = 256,
8738 /* OTP: 64B total; read 0x4B; write 0x42 */
8739 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008740 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008741 .probe = probe_spi_rdid,
8742 .probe_timing = TIMING_ZERO,
8743 .block_erasers =
8744 {
8745 {
8746 .eraseblocks = { { 4 * 1024, 2048 } },
8747 .block_erase = spi_block_erase_20,
8748 }, {
8749 .eraseblocks = { {64 * 1024, 128} },
8750 .block_erase = spi_block_erase_d8,
8751 }, {
8752 .eraseblocks = { {8 * 1024 * 1024, 1} },
8753 .block_erase = spi_block_erase_c7,
8754 }
8755 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008756 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008757 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8758 .write = spi_chip_write_256,
8759 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008760 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008761 },
8762
8763 {
8764 .vendor = "Micron/Numonyx/ST",
8765 .name = "M45PE10",
8766 .bustype = BUS_SPI,
8767 .manufacture_id = ST_ID,
8768 .model_id = ST_M45PE10,
8769 .total_size = 128,
8770 .page_size = 256,
8771 .tested = TEST_UNTESTED,
8772 .probe = probe_spi_rdid,
8773 .probe_timing = TIMING_ZERO,
8774 .block_erasers = {
8775 {
8776 .eraseblocks = { {256, 512} },
8777 .block_erase = spi_block_erase_db,
8778 }, {
8779 .eraseblocks = { {64 * 1024, 2} },
8780 .block_erase = spi_block_erase_d8,
8781 }
8782 },
8783 .printlock = spi_prettyprint_status_register_default_welwip,
8784 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8785 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8786 .read = spi_chip_read, /* Fast read (0x0B) supported */
8787 .voltage = {2700, 3600},
8788 },
8789
8790 {
8791 .vendor = "Micron/Numonyx/ST",
8792 .name = "M45PE20",
8793 .bustype = BUS_SPI,
8794 .manufacture_id = ST_ID,
8795 .model_id = ST_M45PE20,
8796 .total_size = 256,
8797 .page_size = 256,
8798 .tested = TEST_UNTESTED,
8799 .probe = probe_spi_rdid,
8800 .probe_timing = TIMING_ZERO,
8801 .block_erasers = {
8802 {
8803 .eraseblocks = { {256, 1024} },
8804 .block_erase = spi_block_erase_db,
8805 }, {
8806 .eraseblocks = { {64 * 1024, 4} },
8807 .block_erase = spi_block_erase_d8,
8808 }
8809 },
8810 .printlock = spi_prettyprint_status_register_default_welwip,
8811 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8812 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8813 .read = spi_chip_read, /* Fast read (0x0B) supported */
8814 .voltage = {2700, 3600},
8815 },
8816
8817 {
8818 .vendor = "Micron/Numonyx/ST",
8819 .name = "M45PE40",
8820 .bustype = BUS_SPI,
8821 .manufacture_id = ST_ID,
8822 .model_id = ST_M45PE40,
8823 .total_size = 512,
8824 .page_size = 256,
8825 .tested = TEST_UNTESTED,
8826 .probe = probe_spi_rdid,
8827 .probe_timing = TIMING_ZERO,
8828 .block_erasers = {
8829 {
8830 .eraseblocks = { {256, 2048} },
8831 .block_erase = spi_block_erase_db,
8832 }, {
8833 .eraseblocks = { {64 * 1024, 8} },
8834 .block_erase = spi_block_erase_d8,
8835 }
8836 },
8837 .printlock = spi_prettyprint_status_register_default_welwip,
8838 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8839 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8840 .read = spi_chip_read, /* Fast read (0x0B) supported */
8841 .voltage = {2700, 3600},
8842 },
8843
8844 {
8845 .vendor = "Micron/Numonyx/ST",
8846 .name = "M45PE80",
8847 .bustype = BUS_SPI,
8848 .manufacture_id = ST_ID,
8849 .model_id = ST_M45PE80,
8850 .total_size = 1024,
8851 .page_size = 256,
8852 .tested = TEST_UNTESTED,
8853 .probe = probe_spi_rdid,
8854 .probe_timing = TIMING_ZERO,
8855 .block_erasers = {
8856 {
8857 .eraseblocks = { {256, 4096} },
8858 .block_erase = spi_block_erase_db,
8859 }, {
8860 .eraseblocks = { {64 * 1024, 16} },
8861 .block_erase = spi_block_erase_d8,
8862 }
8863 },
8864 .printlock = spi_prettyprint_status_register_default_welwip,
8865 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8866 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8867 .read = spi_chip_read, /* Fast read (0x0B) supported */
8868 .voltage = {2700, 3600},
8869 },
8870
8871 {
8872 .vendor = "Micron/Numonyx/ST",
8873 .name = "M45PE16",
8874 .bustype = BUS_SPI,
8875 .manufacture_id = ST_ID,
8876 .model_id = ST_M45PE16,
8877 .total_size = 2048,
8878 .page_size = 256,
8879 .tested = TEST_UNTESTED,
8880 .probe = probe_spi_rdid,
8881 .probe_timing = TIMING_ZERO,
8882 .block_erasers = {
8883 {
8884 .eraseblocks = { {256, 8192} },
8885 .block_erase = spi_block_erase_db,
8886 }, {
8887 .eraseblocks = { {64 * 1024, 32} },
8888 .block_erase = spi_block_erase_d8,
8889 }
8890 },
8891 .printlock = spi_prettyprint_status_register_default_welwip,
8892 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8893 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8894 .read = spi_chip_read, /* Fast read (0x0B) supported */
8895 .voltage = {2700, 3600},
8896 },
8897
8898 {
8899 .vendor = "Micron/Numonyx/ST",
8900 .name = "N25Q016",
8901 .bustype = BUS_SPI,
8902 .manufacture_id = ST_ID,
8903 .model_id = ST_N25Q016__1E,
8904 .total_size = 2048,
8905 .page_size = 256,
8906 /* supports SFDP */
8907 /* OTP: 64B total; read 0x4B, write 0x42 */
8908 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8909 .tested = TEST_UNTESTED,
8910 .probe = probe_spi_rdid,
8911 .probe_timing = TIMING_ZERO,
8912 .block_erasers =
8913 {
8914 {
8915 .eraseblocks = { {4 * 1024, 512} },
8916 .block_erase = spi_block_erase_20,
8917 }, {
8918 .eraseblocks = { {32 * 1024, 64} },
8919 .block_erase = spi_block_erase_52,
8920 }, {
8921 .eraseblocks = { {64 * 1024, 32} },
8922 .block_erase = spi_block_erase_d8,
8923 }, {
8924 .eraseblocks = { {2 * 1024 * 1024, 1} },
8925 .block_erase = spi_block_erase_c7,
8926 }
8927 },
8928 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8929 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8930 .write = spi_chip_write_256, /* Multi I/O supported */
8931 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8932 .voltage = {1700, 2000},
8933 },
8934
8935 {
8936 .vendor = "Micron/Numonyx/ST",
8937 .name = "N25Q032..1E",
8938 .bustype = BUS_SPI,
8939 .manufacture_id = ST_ID,
8940 .model_id = ST_N25Q032__1E,
8941 .total_size = 4096,
8942 .page_size = 256,
8943 /* supports SFDP */
8944 /* OTP: 64B total; read 0x4B, write 0x42 */
8945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8946 .tested = TEST_UNTESTED,
8947 .probe = probe_spi_rdid,
8948 .probe_timing = TIMING_ZERO,
8949 .block_erasers =
8950 {
8951 {
8952 .eraseblocks = { {4 * 1024, 1024} },
8953 .block_erase = spi_block_erase_20,
8954 }, {
8955 .eraseblocks = { {64 * 1024, 64} },
8956 .block_erase = spi_block_erase_d8,
8957 }, {
8958 .eraseblocks = { {4 * 1024 * 1024, 1} },
8959 .block_erase = spi_block_erase_c7,
8960 }
8961 },
8962 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8963 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8964 .write = spi_chip_write_256, /* Multi I/O supported */
8965 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8966 .voltage = {1700, 2000},
8967 },
8968
8969 {
8970 .vendor = "Micron/Numonyx/ST",
8971 .name = "N25Q032..3E",
8972 .bustype = BUS_SPI,
8973 .manufacture_id = ST_ID,
8974 .model_id = ST_N25Q032__3E,
8975 .total_size = 4096,
8976 .page_size = 256,
8977 /* supports SFDP */
8978 /* OTP: 64B total; read 0x4B, write 0x42 */
8979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8980 .tested = TEST_OK_PREW,
8981 .probe = probe_spi_rdid,
8982 .probe_timing = TIMING_ZERO,
8983 .block_erasers =
8984 {
8985 {
8986 .eraseblocks = { {4 * 1024, 1024} },
8987 .block_erase = spi_block_erase_20,
8988 }, {
8989 .eraseblocks = { {64 * 1024, 64} },
8990 .block_erase = spi_block_erase_d8,
8991 }, {
8992 .eraseblocks = { {4 * 1024 * 1024, 1} },
8993 .block_erase = spi_block_erase_c7,
8994 }
8995 },
8996 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8997 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8998 .write = spi_chip_write_256, /* Multi I/O supported */
8999 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9000 .voltage = {2700, 3600},
9001 },
9002
9003 {
9004 .vendor = "Micron/Numonyx/ST",
9005 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9006 .bustype = BUS_SPI,
9007 .manufacture_id = ST_ID,
9008 .model_id = ST_N25Q064__1E,
9009 .total_size = 8192,
9010 .page_size = 256,
9011 /* supports SFDP */
9012 /* OTP: 64B total; read 0x4B, write 0x42 */
9013 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009014 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009015 .probe = probe_spi_rdid,
9016 .probe_timing = TIMING_ZERO,
9017 .block_erasers =
9018 {
9019 {
9020 .eraseblocks = { {4 * 1024, 2048 } },
9021 .block_erase = spi_block_erase_20,
9022 }, {
9023 .eraseblocks = { {64 * 1024, 128} },
9024 .block_erase = spi_block_erase_d8,
9025 }, {
9026 .eraseblocks = { {8 * 1024 * 1024, 1} },
9027 .block_erase = spi_block_erase_c7,
9028 }
9029 },
9030 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9031 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9032 .write = spi_chip_write_256, /* Multi I/O supported */
9033 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9034 .voltage = {1700, 2000},
9035 },
9036
9037 {
9038 .vendor = "Micron/Numonyx/ST",
9039 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9040 .bustype = BUS_SPI,
9041 .manufacture_id = ST_ID,
9042 .model_id = ST_N25Q064__3E,
9043 .total_size = 8192,
9044 .page_size = 256,
9045 /* supports SFDP */
9046 /* OTP: 64B total; read 0x4B, write 0x42 */
9047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9048 .tested = TEST_OK_PREW,
9049 .probe = probe_spi_rdid,
9050 .probe_timing = TIMING_ZERO,
9051 .block_erasers =
9052 {
9053 {
9054 .eraseblocks = { {4 * 1024, 2048 } },
9055 .block_erase = spi_block_erase_20,
9056 }, {
9057 .eraseblocks = { {64 * 1024, 128} },
9058 .block_erase = spi_block_erase_d8,
9059 }, {
9060 .eraseblocks = { {8 * 1024 * 1024, 1} },
9061 .block_erase = spi_block_erase_c7,
9062 }
9063 },
9064 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9065 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9066 .write = spi_chip_write_256, /* Multi I/O supported */
9067 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9068 .voltage = {2700, 3600},
9069 },
9070
9071 {
9072 .vendor = "Micron/Numonyx/ST",
9073 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
9074 .bustype = BUS_SPI,
9075 .manufacture_id = ST_ID,
9076 .model_id = ST_N25Q128__1E,
9077 .total_size = 16384,
9078 .page_size = 256,
9079 /* supports SFDP */
9080 /* OTP: 64B total; read 0x4B, write 0x42 */
9081 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9082 .tested = TEST_UNTESTED,
9083 .probe = probe_spi_rdid,
9084 .probe_timing = TIMING_ZERO,
9085 .block_erasers = {
9086 {
9087 .eraseblocks = { {4 * 1024, 4096 } },
9088 .block_erase = spi_block_erase_20,
9089 }, {
9090 .eraseblocks = { {64 * 1024, 256} },
9091 .block_erase = spi_block_erase_d8,
9092 }, {
9093 .eraseblocks = { {16384 * 1024, 1} },
9094 .block_erase = spi_block_erase_c7,
9095 }
9096 },
9097 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9098 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9099 .write = spi_chip_write_256, /* Multi I/O supported */
9100 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9101 .voltage = {1700, 2000},
9102 },
9103
9104 {
9105 .vendor = "Micron/Numonyx/ST",
9106 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
9107 .bustype = BUS_SPI,
9108 .manufacture_id = ST_ID,
9109 .model_id = ST_N25Q128__3E,
9110 .total_size = 16384,
9111 .page_size = 256,
9112 /* supports SFDP */
9113 /* OTP: 64B total; read 0x4B, write 0x42 */
9114 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9115 .tested = TEST_OK_PREW,
9116 .probe = probe_spi_rdid,
9117 .probe_timing = TIMING_ZERO,
9118 .block_erasers = {
9119 {
9120 .eraseblocks = { {4 * 1024, 4096 } },
9121 .block_erase = spi_block_erase_20,
9122 }, {
9123 .eraseblocks = { {64 * 1024, 256} },
9124 .block_erase = spi_block_erase_d8,
9125 }, {
9126 .eraseblocks = { {16384 * 1024, 1} },
9127 .block_erase = spi_block_erase_c7,
9128 }
9129 },
9130 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
9131 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
9132 .write = spi_chip_write_256, /* Multi I/O supported */
9133 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9134 .voltage = {2700, 3600},
9135 },
9136
9137 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00009138 .vendor = "MoselVitelic",
9139 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009140 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009141 .manufacture_id = SYNCMOS_MVC_ID,
9142 .model_id = MVC_V29C51000B,
9143 .total_size = 64,
9144 .page_size = 512,
9145 .feature_bits = FEATURE_EITHER_RESET,
9146 .tested = TEST_UNTESTED,
9147 .probe = probe_jedec,
9148 .probe_timing = TIMING_ZERO,
9149 .block_erasers =
9150 {
9151 {
9152 .eraseblocks = { {512, 128} },
9153 .block_erase = erase_sector_jedec,
9154 }, {
9155 .eraseblocks = { {64 * 1024, 1} },
9156 .block_erase = erase_chip_block_jedec,
9157 },
9158 },
9159 .write = write_jedec_1,
9160 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009161 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009162 },
9163
9164 {
9165 .vendor = "MoselVitelic",
9166 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009167 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009168 .manufacture_id = SYNCMOS_MVC_ID,
9169 .model_id = MVC_V29C51000T,
9170 .total_size = 64,
9171 .page_size = 512,
9172 .feature_bits = FEATURE_EITHER_RESET,
9173 .tested = TEST_UNTESTED,
9174 .probe = probe_jedec,
9175 .probe_timing = TIMING_ZERO,
9176 .block_erasers =
9177 {
9178 {
9179 .eraseblocks = { {512, 128} },
9180 .block_erase = erase_sector_jedec,
9181 }, {
9182 .eraseblocks = { {64 * 1024, 1} },
9183 .block_erase = erase_chip_block_jedec,
9184 },
9185 },
9186 .write = write_jedec_1,
9187 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009188 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009189 },
9190
9191 {
9192 .vendor = "MoselVitelic",
9193 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009194 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009195 .manufacture_id = SYNCMOS_MVC_ID,
9196 .model_id = MVC_V29C51400B,
9197 .total_size = 512,
9198 .page_size = 1024,
9199 .feature_bits = FEATURE_EITHER_RESET,
9200 .tested = TEST_UNTESTED,
9201 .probe = probe_jedec,
9202 .probe_timing = TIMING_ZERO,
9203 .block_erasers =
9204 {
9205 {
9206 .eraseblocks = { {1024, 512} },
9207 .block_erase = erase_sector_jedec,
9208 }, {
9209 .eraseblocks = { {512 * 1024, 1} },
9210 .block_erase = erase_chip_block_jedec,
9211 },
9212 },
9213 .write = write_jedec_1,
9214 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009215 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009216 },
9217
9218 {
9219 .vendor = "MoselVitelic",
9220 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009221 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009222 .manufacture_id = SYNCMOS_MVC_ID,
9223 .model_id = MVC_V29C51400T,
9224 .total_size = 512,
9225 .page_size = 1024,
9226 .feature_bits = FEATURE_EITHER_RESET,
9227 .tested = TEST_UNTESTED,
9228 .probe = probe_jedec,
9229 .probe_timing = TIMING_ZERO,
9230 .block_erasers =
9231 {
9232 {
9233 .eraseblocks = { {1024, 512} },
9234 .block_erase = erase_sector_jedec,
9235 }, {
9236 .eraseblocks = { {512 * 1024, 1} },
9237 .block_erase = erase_chip_block_jedec,
9238 },
9239 },
9240 .write = write_jedec_1,
9241 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009242 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009243 },
9244
9245 {
9246 .vendor = "MoselVitelic",
9247 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009248 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009249 .manufacture_id = SYNCMOS_MVC_ID,
9250 .model_id = MVC_V29LC51000,
9251 .total_size = 64,
9252 .page_size = 512,
9253 .feature_bits = FEATURE_EITHER_RESET,
9254 .tested = TEST_UNTESTED,
9255 .probe = probe_jedec,
9256 .probe_timing = TIMING_ZERO,
9257 .block_erasers =
9258 {
9259 {
9260 .eraseblocks = { {512, 128} },
9261 .block_erase = erase_sector_jedec,
9262 }, {
9263 .eraseblocks = { {64 * 1024, 1} },
9264 .block_erase = erase_chip_block_jedec,
9265 },
9266 },
9267 .write = write_jedec_1,
9268 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009269 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009270 },
9271
9272 {
9273 .vendor = "MoselVitelic",
9274 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009275 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009276 .manufacture_id = SYNCMOS_MVC_ID,
9277 .model_id = MVC_V29LC51001,
9278 .total_size = 128,
9279 .page_size = 512,
9280 .feature_bits = FEATURE_EITHER_RESET,
9281 .tested = TEST_UNTESTED,
9282 .probe = probe_jedec,
9283 .probe_timing = TIMING_ZERO,
9284 .block_erasers =
9285 {
9286 {
9287 .eraseblocks = { {512, 256} },
9288 .block_erase = erase_sector_jedec,
9289 }, {
9290 .eraseblocks = { {128 * 1024, 1} },
9291 .block_erase = erase_chip_block_jedec,
9292 },
9293 },
9294 .write = write_jedec_1,
9295 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009296 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009297 },
9298
9299 {
9300 .vendor = "MoselVitelic",
9301 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009302 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00009303 .manufacture_id = SYNCMOS_MVC_ID,
9304 .model_id = MVC_V29LC51002,
9305 .total_size = 256,
9306 .page_size = 512,
9307 .feature_bits = FEATURE_EITHER_RESET,
9308 .tested = TEST_UNTESTED,
9309 .probe = probe_jedec,
9310 .probe_timing = TIMING_ZERO,
9311 .block_erasers =
9312 {
9313 {
9314 .eraseblocks = { {512, 512} },
9315 .block_erase = erase_sector_jedec,
9316 }, {
9317 .eraseblocks = { {256 * 1024, 1} },
9318 .block_erase = erase_chip_block_jedec,
9319 },
9320 },
9321 .write = write_jedec_1,
9322 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009323 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00009324 },
9325
9326 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009327 .vendor = "Nantronics",
9328 .name = "N25S10",
9329 .bustype = BUS_SPI,
9330 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9331 .model_id = NANTRONICS_N25S10,
9332 .total_size = 128,
9333 .page_size = 256,
9334 .feature_bits = FEATURE_WRSR_WREN,
9335 .tested = TEST_UNTESTED,
9336 .probe = probe_spi_rdid,
9337 .probe_timing = TIMING_ZERO,
9338 .block_erasers =
9339 {
9340 {
9341 .eraseblocks = { {4 * 1024, 32} },
9342 .block_erase = spi_block_erase_20,
9343 }, {
9344 .eraseblocks = { {4 * 1024, 32} },
9345 .block_erase = spi_block_erase_d7,
9346 }, {
9347 .eraseblocks = { {32 * 1024, 4} },
9348 .block_erase = spi_block_erase_52,
9349 }, {
9350 .eraseblocks = { {64 * 1024, 2} },
9351 .block_erase = spi_block_erase_d8,
9352 }, {
9353 .eraseblocks = { {128 * 1024, 1} },
9354 .block_erase = spi_block_erase_60,
9355 }, {
9356 .eraseblocks = { {128 * 1024, 1} },
9357 .block_erase = spi_block_erase_c7,
9358 }
9359 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009360 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009361 .unlock = spi_disable_blockprotect_bp3_srwd,
9362 .write = spi_chip_write_256,
9363 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9364 .voltage = {2700, 3600},
9365 },
9366
9367 {
9368 .vendor = "Nantronics",
9369 .name = "N25S20",
9370 .bustype = BUS_SPI,
9371 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9372 .model_id = NANTRONICS_N25S20,
9373 .total_size = 256,
9374 .page_size = 256,
9375 .feature_bits = FEATURE_WRSR_WREN,
9376 .tested = TEST_UNTESTED,
9377 .probe = probe_spi_rdid,
9378 .probe_timing = TIMING_ZERO,
9379 .block_erasers =
9380 {
9381 {
9382 .eraseblocks = { {4 * 1024, 64} },
9383 .block_erase = spi_block_erase_20,
9384 }, {
9385 .eraseblocks = { {4 * 1024, 64} },
9386 .block_erase = spi_block_erase_d7,
9387 }, {
9388 .eraseblocks = { {32 * 1024, 8} },
9389 .block_erase = spi_block_erase_52,
9390 }, {
9391 .eraseblocks = { {64 * 1024, 4} },
9392 .block_erase = spi_block_erase_d8,
9393 }, {
9394 .eraseblocks = { {256 * 1024, 1} },
9395 .block_erase = spi_block_erase_60,
9396 }, {
9397 .eraseblocks = { {256 * 1024, 1} },
9398 .block_erase = spi_block_erase_c7,
9399 }
9400 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009401 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009402 .unlock = spi_disable_blockprotect_bp3_srwd,
9403 .write = spi_chip_write_256,
9404 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9405 .voltage = {2700, 3600},
9406 },
9407
9408 {
9409 .vendor = "Nantronics",
9410 .name = "N25S40",
9411 .bustype = BUS_SPI,
9412 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9413 .model_id = NANTRONICS_N25S40,
9414 .total_size = 512,
9415 .page_size = 256,
9416 .feature_bits = FEATURE_WRSR_WREN,
9417 .tested = TEST_UNTESTED,
9418 .probe = probe_spi_rdid,
9419 .probe_timing = TIMING_ZERO,
9420 .block_erasers =
9421 {
9422 {
9423 .eraseblocks = { {4 * 1024, 128} },
9424 .block_erase = spi_block_erase_20,
9425 }, {
9426 .eraseblocks = { {4 * 1024, 128} },
9427 .block_erase = spi_block_erase_d7,
9428 }, {
9429 .eraseblocks = { {32 * 1024, 16} },
9430 .block_erase = spi_block_erase_52,
9431 }, {
9432 .eraseblocks = { {64 * 1024, 8} },
9433 .block_erase = spi_block_erase_d8,
9434 }, {
9435 .eraseblocks = { {512 * 1024, 1} },
9436 .block_erase = spi_block_erase_60,
9437 }, {
9438 .eraseblocks = { {512 * 1024, 1} },
9439 .block_erase = spi_block_erase_c7,
9440 }
9441 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009442 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009443 .unlock = spi_disable_blockprotect_bp3_srwd,
9444 .write = spi_chip_write_256,
9445 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9446 .voltage = {2700, 3600},
9447 },
9448
9449 {
9450 .vendor = "Nantronics",
9451 .name = "N25S80",
9452 .bustype = BUS_SPI,
9453 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9454 .model_id = NANTRONICS_N25S80,
9455 .total_size = 1024,
9456 .page_size = 256,
9457 .feature_bits = FEATURE_WRSR_WREN,
9458 .tested = TEST_UNTESTED,
9459 .probe = probe_spi_rdid,
9460 .probe_timing = TIMING_ZERO,
9461 .block_erasers =
9462 {
9463 {
9464 .eraseblocks = { {4 * 1024, 256} },
9465 .block_erase = spi_block_erase_20,
9466 }, {
9467 .eraseblocks = { {32 * 1024, 32} },
9468 .block_erase = spi_block_erase_52,
9469 }, {
9470 .eraseblocks = { {64 * 1024, 16} },
9471 .block_erase = spi_block_erase_d8,
9472 }, {
9473 .eraseblocks = { {1024 * 1024, 1} },
9474 .block_erase = spi_block_erase_60,
9475 }, {
9476 .eraseblocks = { {1024 * 1024, 1} },
9477 .block_erase = spi_block_erase_c7,
9478 }
9479 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009480 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009481 .unlock = spi_disable_blockprotect_bp3_srwd,
9482 .write = spi_chip_write_256,
9483 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9484 .voltage = {2700, 3600},
9485 },
9486
9487 {
9488 .vendor = "Nantronics",
9489 .name = "N25S16",
9490 .bustype = BUS_SPI,
9491 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9492 .model_id = NANTRONICS_N25S16,
9493 .total_size = 2048,
9494 .page_size = 256,
9495 .feature_bits = FEATURE_WRSR_WREN,
9496 .tested = TEST_UNTESTED,
9497 .probe = probe_spi_rdid,
9498 .probe_timing = TIMING_ZERO,
9499 .block_erasers =
9500 {
9501 {
9502 .eraseblocks = { {4 * 1024, 512} },
9503 .block_erase = spi_block_erase_20,
9504 }, {
9505 .eraseblocks = { {64 * 1024, 32} },
9506 .block_erase = spi_block_erase_d8,
9507 }, {
9508 .eraseblocks = { {2048 * 1024, 1} },
9509 .block_erase = spi_block_erase_60,
9510 }, {
9511 .eraseblocks = { {2048 * 1024, 1} },
9512 .block_erase = spi_block_erase_c7,
9513 }
9514 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009515 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009516 .unlock = spi_disable_blockprotect_bp3_srwd,
9517 .write = spi_chip_write_256,
9518 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9519 .voltage = {2700, 3600},
9520 },
9521
9522 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009523 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00009524 .name = "Pm25LD256C",
9525 .bustype = BUS_SPI,
9526 .manufacture_id = PMC_ID,
9527 .model_id = PMC_PM25LD256C,
9528 .total_size = 32,
9529 .page_size = 256,
9530 .feature_bits = FEATURE_WRSR_WREN,
9531 .tested = TEST_UNTESTED,
9532 .probe = probe_spi_rdid,
9533 .probe_timing = TIMING_ZERO,
9534 .block_erasers =
9535 {
9536 {
9537 .eraseblocks = { {4 * 1024, 8} },
9538 .block_erase = spi_block_erase_20,
9539 }, {
9540 .eraseblocks = { {4 * 1024, 8} },
9541 .block_erase = spi_block_erase_d7,
9542 }, {
9543 .eraseblocks = { {32 * 1024, 1} },
9544 .block_erase = spi_block_erase_d8,
9545 }, {
9546 .eraseblocks = { {32 * 1024, 1} },
9547 .block_erase = spi_block_erase_60,
9548 }, {
9549 .eraseblocks = { {32 * 1024, 1} },
9550 .block_erase = spi_block_erase_c7,
9551 }
9552 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009553 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009554 .unlock = spi_disable_blockprotect,
9555 .write = spi_chip_write_256,
9556 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9557 .voltage = {2700, 3600},
9558 },
9559 {
9560 .vendor = "PMC",
9561 .name = "Pm25LD512(C)",
9562 .bustype = BUS_SPI,
9563 .manufacture_id = PMC_ID,
9564 .model_id = PMC_PM25LD512,
9565 .total_size = 64,
9566 .page_size = 256,
9567 .feature_bits = FEATURE_WRSR_WREN,
9568 .tested = TEST_OK_PREW,
9569 .probe = probe_spi_rdid,
9570 .probe_timing = TIMING_ZERO,
9571 .block_erasers =
9572 {
9573 {
9574 .eraseblocks = { {4 * 1024, 16} },
9575 .block_erase = spi_block_erase_20,
9576 }, {
9577 .eraseblocks = { {4 * 1024, 16} },
9578 .block_erase = spi_block_erase_d7,
9579 }, {
9580 .eraseblocks = { {32 * 1024, 2} },
9581 .block_erase = spi_block_erase_d8,
9582 }, {
9583 .eraseblocks = { {64 * 1024, 1} },
9584 .block_erase = spi_block_erase_60,
9585 }, {
9586 .eraseblocks = { {64 * 1024, 1} },
9587 .block_erase = spi_block_erase_c7,
9588 }
9589 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009590 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009591 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9592 .write = spi_chip_write_256,
9593 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9594 .voltage = {2300, 3600},
9595 },
9596
9597 {
9598 .vendor = "PMC",
9599 .name = "Pm25LD010(C)",
9600 .bustype = BUS_SPI,
9601 .manufacture_id = PMC_ID,
9602 .model_id = PMC_PM25LD010,
9603 .total_size = 128,
9604 .page_size = 256,
9605 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009606 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +00009607 .probe = probe_spi_rdid,
9608 .probe_timing = TIMING_ZERO,
9609 .block_erasers =
9610 {
9611 {
9612 .eraseblocks = { {4 * 1024, 32} },
9613 .block_erase = spi_block_erase_20,
9614 }, {
9615 .eraseblocks = { {4 * 1024, 32} },
9616 .block_erase = spi_block_erase_d7,
9617 }, {
9618 .eraseblocks = { {32 * 1024, 4} },
9619 .block_erase = spi_block_erase_d8,
9620 }, {
9621 .eraseblocks = { {128 * 1024, 1} },
9622 .block_erase = spi_block_erase_60,
9623 }, {
9624 .eraseblocks = { {128 * 1024, 1} },
9625 .block_erase = spi_block_erase_c7,
9626 }
9627 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009628 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009629 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9630 .write = spi_chip_write_256,
9631 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9632 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
9633 },
9634
9635 {
9636 .vendor = "PMC",
9637 .name = "Pm25LD020(C)",
9638 .bustype = BUS_SPI,
9639 .manufacture_id = PMC_ID,
9640 .model_id = PMC_PM25LD020,
9641 .total_size = 256,
9642 .page_size = 256,
9643 .feature_bits = FEATURE_WRSR_WREN,
9644 .tested = TEST_UNTESTED,
9645 .probe = probe_spi_rdid,
9646 .probe_timing = TIMING_ZERO,
9647 .block_erasers =
9648 {
9649 {
9650 .eraseblocks = { {4 * 1024, 64} },
9651 .block_erase = spi_block_erase_20,
9652 }, {
9653 .eraseblocks = { {4 * 1024, 64} },
9654 .block_erase = spi_block_erase_d7,
9655 }, {
9656 .eraseblocks = { {64 * 1024, 4} },
9657 .block_erase = spi_block_erase_d8,
9658 }, {
9659 .eraseblocks = { {256 * 1024, 1} },
9660 .block_erase = spi_block_erase_60,
9661 }, {
9662 .eraseblocks = { {256 * 1024, 1} },
9663 .block_erase = spi_block_erase_c7,
9664 }
9665 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009666 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009667 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9668 .write = spi_chip_write_256,
9669 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9670 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
9671 },
9672
9673 {
9674 .vendor = "PMC",
9675 .name = "Pm25LD040(C)",
9676 .bustype = BUS_SPI,
9677 .manufacture_id = PMC_ID,
9678 .model_id = PMC_PM25LV040,
9679 .total_size = 512,
9680 .page_size = 256,
9681 .feature_bits = FEATURE_WRSR_WREN,
9682 .tested = TEST_UNTESTED,
9683 .probe = probe_spi_rdid,
9684 .probe_timing = TIMING_ZERO,
9685 .block_erasers =
9686 {
9687 {
9688 .eraseblocks = { {4 * 1024, 128} },
9689 .block_erase = spi_block_erase_20,
9690 }, {
9691 .eraseblocks = { {4 * 1024, 128} },
9692 .block_erase = spi_block_erase_d7,
9693 }, {
9694 .eraseblocks = { {64 * 1024, 8} },
9695 .block_erase = spi_block_erase_d8,
9696 }, {
9697 .eraseblocks = { {512 * 1024, 1} },
9698 .block_erase = spi_block_erase_60,
9699 }, {
9700 .eraseblocks = { {512 * 1024, 1} },
9701 .block_erase = spi_block_erase_c7,
9702 }
9703 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009704 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009705 .unlock = spi_disable_blockprotect,
9706 .write = spi_chip_write_256,
9707 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9708 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
9709 },
9710
9711{
9712 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009713 .name = "Pm25LV512(A)",
9714 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00009715 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009716 .model_id = PMC_PM25LV512,
9717 .total_size = 64,
9718 .page_size = 256,
9719 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009720 .tested = TEST_OK_PREW,
Stefan Taunerbecda742014-05-30 19:34:00 +00009721 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009722 .probe_timing = TIMING_ZERO,
9723 .block_erasers =
9724 {
9725 {
9726 .eraseblocks = { {4 * 1024, 16} },
9727 .block_erase = spi_block_erase_d7,
9728 }, {
9729 .eraseblocks = { {32 * 1024, 2} },
9730 .block_erase = spi_block_erase_d8,
9731 }, {
9732 .eraseblocks = { {64 * 1024, 1} },
9733 .block_erase = spi_block_erase_c7,
9734 }
9735 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009736 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009737 .unlock = spi_disable_blockprotect,
9738 .write = spi_chip_write_256,
9739 .read = spi_chip_read, /* Fast read (0x0B) supported */
9740 .voltage = {2700, 3600},
9741 },
9742
9743 {
9744 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009745 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009746 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00009747 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009748 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009749 .total_size = 128,
9750 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009751 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +00009752 .tested = TEST_OK_PREW,
9753 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009754 .probe_timing = TIMING_ZERO,
9755 .block_erasers =
9756 {
9757 {
9758 .eraseblocks = { {4 * 1024, 32} },
9759 .block_erase = spi_block_erase_d7,
9760 }, {
9761 .eraseblocks = { {32 * 1024, 4} },
9762 .block_erase = spi_block_erase_d8,
9763 }, {
9764 .eraseblocks = { {128 * 1024, 1} },
9765 .block_erase = spi_block_erase_c7,
9766 }
9767 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009768 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009769 .unlock = spi_disable_blockprotect,
9770 .write = spi_chip_write_256,
9771 .read = spi_chip_read, /* Fast read (0x0B) supported */
9772 .voltage = {2700, 3600},
9773 },
9774
9775 {
9776 .vendor = "PMC",
9777 .name = "Pm25LV010A",
9778 .bustype = BUS_SPI,
9779 .manufacture_id = PMC_ID,
9780 .model_id = PMC_PM25LV010,
9781 .total_size = 128,
9782 .page_size = 256,
9783 .feature_bits = FEATURE_WRSR_WREN,
9784 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009785 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009786 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009787 .block_erasers =
9788 {
9789 {
9790 .eraseblocks = { {4 * 1024, 32} },
9791 .block_erase = spi_block_erase_d7,
9792 }, {
9793 .eraseblocks = { {32 * 1024, 4} },
9794 .block_erase = spi_block_erase_d8,
9795 }, {
9796 .eraseblocks = { {128 * 1024, 1} },
9797 .block_erase = spi_block_erase_c7,
9798 }
9799 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009800 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009801 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009802 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009803 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00009804 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009805 },
9806
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009807 {
9808 .vendor = "PMC",
9809 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009810 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009811 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009812 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009813 .total_size = 256,
9814 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009815 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009816 .tested = TEST_UNTESTED,
9817 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009818 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009819 .block_erasers =
9820 {
9821 {
9822 .eraseblocks = { {4 * 1024, 64} },
9823 .block_erase = spi_block_erase_d7,
9824 }, {
9825 .eraseblocks = { {64 * 1024, 4} },
9826 .block_erase = spi_block_erase_d8,
9827 }, {
9828 .eraseblocks = { {256 * 1024, 1} },
9829 .block_erase = spi_block_erase_c7,
9830 }
9831 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009832 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009833 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009834 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009835 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009836 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009837 },
9838
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009839 {
9840 .vendor = "PMC",
9841 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009842 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009843 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009844 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009845 .total_size = 512,
9846 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009847 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00009848 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009849 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009850 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009851 .block_erasers =
9852 {
9853 {
9854 .eraseblocks = { {4 * 1024, 128} },
9855 .block_erase = spi_block_erase_d7,
9856 }, {
9857 .eraseblocks = { {64 * 1024, 8} },
9858 .block_erase = spi_block_erase_d8,
9859 }, {
9860 .eraseblocks = { {512 * 1024, 1} },
9861 .block_erase = spi_block_erase_c7,
9862 }
9863 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009864 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009865 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009866 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009867 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009868 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009869 },
9870
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009871 {
9872 .vendor = "PMC",
9873 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009874 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009875 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009876 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009877 .total_size = 1024,
9878 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009879 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009880 .tested = TEST_UNTESTED,
9881 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009882 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009883 .block_erasers =
9884 {
9885 {
9886 .eraseblocks = { {4 * 1024, 256} },
9887 .block_erase = spi_block_erase_d7,
9888 }, {
9889 .eraseblocks = { {4 * 1024, 256} },
9890 .block_erase = spi_block_erase_20,
9891 }, {
9892 .eraseblocks = { {64 * 1024, 16} },
9893 .block_erase = spi_block_erase_d8,
9894 }, {
9895 .eraseblocks = { {1024 * 1024, 1} },
9896 .block_erase = spi_block_erase_60,
9897 }, {
9898 .eraseblocks = { {1024 * 1024, 1} },
9899 .block_erase = spi_block_erase_c7,
9900 }
9901 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009902 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009903 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009904 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009905 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009906 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009907 },
9908
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009909 {
9910 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009911 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009912 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009913 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009914 .model_id = PMC_PM25LV016B,
9915 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009916 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009917 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009918 .tested = TEST_UNTESTED,
9919 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009920 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009921 .block_erasers =
9922 {
9923 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009924 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00009925 .block_erase = spi_block_erase_d7,
9926 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009927 .eraseblocks = { {4 * 1024, 512} },
9928 .block_erase = spi_block_erase_20,
9929 }, {
9930 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00009931 .block_erase = spi_block_erase_d8,
9932 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009933 .eraseblocks = { {2 * 1024 * 1024, 1} },
9934 .block_erase = spi_block_erase_60,
9935 }, {
9936 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00009937 .block_erase = spi_block_erase_c7,
9938 }
9939 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009940 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009941 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009942 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009943 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00009944 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009945 },
9946
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009947 {
9948 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009949 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009950 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009951 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009952 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009953 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009954 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009955 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009956 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009957 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009958 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009959 .block_erasers =
9960 {
9961 {
9962 .eraseblocks = {
9963 {128 * 1024, 1},
9964 {96 * 1024, 1},
9965 {8 * 1024, 2},
9966 {16 * 1024, 1},
9967 },
Sean Nelson35727f72010-01-28 23:55:12 +00009968 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009969 }, {
9970 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009971 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009972 },
9973 },
Sean Nelson35727f72010-01-28 23:55:12 +00009974 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009975 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009976 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009977 },
9978
9979 {
9980 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009981 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009982 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009983 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009984 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009985 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009986 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009987 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009988 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009989 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009990 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009991 .block_erasers =
9992 {
9993 {
9994 .eraseblocks = {
9995 {16 * 1024, 1},
9996 {8 * 1024, 2},
9997 {96 * 1024, 1},
9998 {128 * 1024, 1},
9999 },
Sean Nelson35727f72010-01-28 23:55:12 +000010000 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000010001 }, {
10002 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010003 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000010004 },
10005 },
Sean Nelson35727f72010-01-28 23:55:12 +000010006 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000010007 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010008 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000010009 },
10010
10011 {
10012 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010013 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010014 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010015 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010016 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010017 .total_size = 128,
10018 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010019 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010020 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010021 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010022 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000010023 .block_erasers =
10024 {
10025 {
10026 .eraseblocks = { {4 * 1024, 32} },
10027 .block_erase = erase_sector_jedec,
10028 }, {
10029 .eraseblocks = { {64 * 1024, 2} },
10030 .block_erase = erase_block_jedec,
10031 }, {
10032 .eraseblocks = { {128 * 1024, 1} },
10033 .block_erase = erase_chip_block_jedec,
10034 }
10035 },
Sean Nelson35727f72010-01-28 23:55:12 +000010036 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010037 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010038 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000010039 },
10040
10041 {
10042 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010043 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010044 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010045 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010046 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010047 .total_size = 256,
10048 .page_size = 4096,
10049 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
10050 .tested = TEST_UNTESTED,
10051 .probe = probe_jedec,
10052 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
10053 .block_erasers =
10054 {
10055 {
10056 .eraseblocks = { {4 * 1024, 64} },
10057 .block_erase = erase_sector_jedec,
10058 }, {
10059 .eraseblocks = { {64 * 1024, 4} },
10060 .block_erase = erase_block_jedec,
10061 }, {
10062 .eraseblocks = { {256 * 1024, 1} },
10063 .block_erase = erase_chip_block_jedec,
10064 }
10065 },
10066 .write = write_jedec_1,
10067 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010068 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010069 },
10070
10071 {
10072 .vendor = "PMC",
10073 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010074 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010075 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010076 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010077 .total_size = 512,
10078 .page_size = 4096,
10079 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010080 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010081 .probe = probe_jedec,
10082 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
10083 .block_erasers =
10084 {
10085 {
10086 .eraseblocks = { {4 * 1024, 128} },
10087 .block_erase = erase_sector_jedec,
10088 }, {
10089 .eraseblocks = { {64 * 1024, 8} },
10090 .block_erase = erase_block_jedec,
10091 }, {
10092 .eraseblocks = { {512 * 1024, 1} },
10093 .block_erase = erase_chip_block_jedec,
10094 }
10095 },
10096 .write = write_jedec_1,
10097 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010098 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010099 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000010100
10101 {
10102 .vendor = "PMC",
10103 .name = "Pm39LV512",
10104 .bustype = BUS_PARALLEL,
10105 .manufacture_id = PMC_ID_NOPREFIX,
10106 .model_id = PMC_PM39LV512,
10107 .total_size = 64,
10108 .page_size = 4096,
10109 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
10110 .tested = TEST_OK_PREW,
10111 .probe = probe_jedec,
10112 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
10113 .block_erasers =
10114 {
10115 {
10116 .eraseblocks = { {4 * 1024, 16} },
10117 .block_erase = erase_sector_jedec,
10118 }, {
10119 .eraseblocks = { {64 * 1024, 1} },
10120 .block_erase = erase_block_jedec,
10121 }, {
10122 .eraseblocks = { {64 * 1024, 1} },
10123 .block_erase = erase_chip_block_jedec,
10124 }
10125 },
10126 .write = write_jedec_1,
10127 .read = read_memmapped,
10128 .voltage = {2700, 3600},
10129 },
10130
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000010131 {
10132 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010133 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010134 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010135 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010136 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010137 .total_size = 256,
10138 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010139 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000010140 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000010141 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010142 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000010143 .block_erasers =
10144 {
10145 {
10146 .eraseblocks = { {4 * 1024, 64} },
10147 .block_erase = erase_sector_jedec,
10148 }, {
10149 .eraseblocks = { {16 * 1024, 16} },
10150 .block_erase = erase_block_jedec,
10151 }, {
10152 .eraseblocks = { {256 * 1024, 1} },
10153 .block_erase = erase_chip_block_jedec,
10154 }
10155 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000010156 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000010157 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010158 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010159 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010160 },
10161
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010162 {
10163 .vendor = "PMC",
10164 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010165 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010166 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010167 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010168 .total_size = 512,
10169 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010170 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010171 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000010172 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000010173 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010174 .block_erasers =
10175 {
10176 {
10177 .eraseblocks = { {4 * 1024, 128} },
10178 .block_erase = erase_sector_jedec,
10179 }, {
10180 .eraseblocks = { {64 * 1024, 8} },
10181 .block_erase = erase_block_jedec,
10182 }, {
10183 .eraseblocks = { {512 * 1024, 1} },
10184 .block_erase = erase_chip_block_jedec,
10185 }
10186 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000010187 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000010188 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010189 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010190 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010191 },
10192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010193 {
Sean Nelsond70b09c2009-11-24 02:11:08 +000010194 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +000010195 .name = "LE25FW106",
10196 .bustype = BUS_SPI,
10197 .manufacture_id = SANYO_ID,
10198 .model_id = SANYO_LE25FW106,
10199 .total_size = 128,
10200 .page_size = 256,
10201 .feature_bits = FEATURE_WRSR_WREN,
10202 .tested = TEST_OK_PREW,
10203 .probe = probe_spi_res2,
10204 .probe_timing = TIMING_ZERO,
10205 .block_erasers = {
10206 {
10207 .eraseblocks = { {2 * 1024, 64} },
10208 .block_erase = spi_block_erase_d7,
10209 }, {
10210 .eraseblocks = { {32 * 1024, 4} },
10211 .block_erase = spi_block_erase_d8,
10212 }, {
10213 .eraseblocks = { {128 * 1024, 1} },
10214 .block_erase = spi_block_erase_c7,
10215 }
10216 },
10217 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
10218 .unlock = spi_disable_blockprotect_bp1_srwd,
10219 .write = spi_chip_write_256,
10220 .read = spi_chip_read,
10221 .voltage = {2700, 3600},
10222 },
10223
10224 {
10225 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +000010226 .name = "LE25FW406A",
10227 .bustype = BUS_SPI,
10228 .manufacture_id = SANYO_ID,
10229 .model_id = SANYO_LE25FW406A,
10230 .total_size = 512,
10231 .page_size = 256,
10232 .feature_bits = FEATURE_WRSR_WREN,
10233 .tested = TEST_OK_PREW,
10234 .probe = probe_spi_res2,
10235 .probe_timing = TIMING_ZERO,
10236 .block_erasers = {
10237 {
10238 .eraseblocks = { {4 * 1024, 128} },
10239 .block_erase = spi_block_erase_d7,
10240 }, {
10241 .eraseblocks = { {64 * 1024, 8} },
10242 .block_erase = spi_block_erase_d8,
10243 }, {
10244 .eraseblocks = { {512 * 1024, 1} },
10245 .block_erase = spi_block_erase_c7,
10246 }
10247 },
10248 .printlock = spi_prettyprint_status_register_plain,
10249 .unlock = spi_disable_blockprotect,
10250 .write = spi_chip_write_256,
10251 .read = spi_chip_read,
10252 .voltage = {2700, 3600},
10253 },
10254
10255 {
10256 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +000010257 .name = "LE25FU406B",
10258 .bustype = BUS_SPI,
10259 .manufacture_id = SANYO_ID,
10260 .model_id = SANYO_LE25FU406B,
10261 .total_size = 512,
10262 .page_size = 256,
10263 .feature_bits = FEATURE_WRSR_WREN,
10264 .tested = TEST_OK_PREW,
10265 .probe = probe_spi_res2,
10266 .probe_timing = TIMING_ZERO,
10267 .block_erasers = {
10268 {
10269 .eraseblocks = { {4 * 1024, 128} },
10270 .block_erase = spi_block_erase_d7,
10271 }, {
10272 .eraseblocks = { {64 * 1024, 8} },
10273 .block_erase = spi_block_erase_d8,
10274 }, {
10275 .eraseblocks = { {512 * 1024, 1} },
10276 .block_erase = spi_block_erase_c7,
10277 }
10278 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010279 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +000010280 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10281 .write = spi_chip_write_256,
10282 .read = spi_chip_read,
10283 .voltage = {2300, 3600},
10284 },
10285
10286 {
10287 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010288 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010289 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +000010290 .manufacture_id = SANYO_ID,
10291 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010292 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +000010293 .page_size = 256,
10294 .tested = TEST_UNTESTED,
10295 .probe = probe_spi_rdid,
10296 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010297 .block_erasers =
10298 {
10299 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010300 .eraseblocks = { {256, 1024} },
10301 .block_erase = spi_block_erase_db,
10302 }, {
10303 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +000010304 .block_erase = spi_block_erase_d8,
10305 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010306 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000010307 .block_erase = spi_block_erase_c7,
10308 }
10309 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010310 .printlock = spi_prettyprint_status_register_default_welwip,
10311 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +000010312 .write = spi_chip_write_256,
10313 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010314 .voltage = {2700, 3600},
10315 },
10316
10317 {
10318 .vendor = "Sanyo",
10319 .name = "LE25FW403A",
10320 .bustype = BUS_SPI,
10321 .manufacture_id = SANYO_ID,
10322 .model_id = SANYO_LE25FW403A,
10323 .total_size = 512,
10324 .page_size = 256,
10325 .tested = TEST_UNTESTED,
10326 .probe = probe_spi_rdid,
10327 .probe_timing = TIMING_ZERO,
10328 .block_erasers = {
10329 {
10330 .eraseblocks = { {256, 2 * 1024} },
10331 .block_erase = spi_block_erase_db,
10332 }, {
10333 .eraseblocks = { {64 * 1024, 8} },
10334 .block_erase = spi_block_erase_d8,
10335 }, {
10336 .eraseblocks = { {512 * 1024, 1} },
10337 .block_erase = spi_block_erase_c7,
10338 }
10339 },
10340 .printlock = spi_prettyprint_status_register_default_welwip,
10341 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10342 .write = spi_chip_write_256,
10343 .read = spi_chip_read,
10344 .voltage = {2700, 3600},
10345 },
10346
10347 {
10348 .vendor = "Sanyo",
10349 .name = "LE25FW418A",
10350 .bustype = BUS_SPI,
10351 .manufacture_id = SANYO_ID,
10352 .model_id = SANYO_LE25FW418A,
10353 .total_size = 512,
10354 .page_size = 256,
10355 .feature_bits = FEATURE_WRSR_WREN,
10356 .tested = TEST_UNTESTED,
10357 .probe = probe_spi_res2,
10358 .probe_timing = TIMING_ZERO,
10359 .block_erasers = {
10360 {
10361 .eraseblocks = { {4 * 1024, 128} },
10362 .block_erase = spi_block_erase_d7,
10363 }, {
10364 .eraseblocks = { {64 * 1024, 8} },
10365 .block_erase = spi_block_erase_d8,
10366 }, {
10367 .eraseblocks = { {512 * 1024, 1} },
10368 .block_erase = spi_block_erase_c7,
10369 }
10370 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010371 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010372 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10373 .write = spi_chip_write_256,
10374 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
10375 .voltage = {2700, 3600},
10376 },
10377
10378 {
10379 .vendor = "Sanyo",
10380 .name = "LE25FW806",
10381 .bustype = BUS_SPI,
10382 .manufacture_id = SANYO_ID,
10383 .model_id = SANYO_LE25FW806,
10384 .total_size = 1024,
10385 .page_size = 256,
10386 .feature_bits = FEATURE_WRSR_WREN,
10387 .tested = TEST_UNTESTED,
10388 .probe = probe_spi_res2,
10389 .probe_timing = TIMING_ZERO,
10390 .block_erasers = {
10391 {
10392 .eraseblocks = { {4 * 1024, 256} },
10393 .block_erase = spi_block_erase_20,
10394 }, {
10395 .eraseblocks = { {4 * 1024, 256} },
10396 .block_erase = spi_block_erase_d7,
10397 }, {
10398 .eraseblocks = { {64 * 1024, 16} },
10399 .block_erase = spi_block_erase_d8,
10400 }, {
10401 .eraseblocks = { {1024 * 1024, 1} },
10402 .block_erase = spi_block_erase_c7,
10403 }
10404 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010405 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010406 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10407 .write = spi_chip_write_256,
10408 .read = spi_chip_read,
10409 .voltage = {2700, 3600},
10410 },
10411
10412 {
10413 .vendor = "Sanyo",
10414 .name = "LE25FW808",
10415 .bustype = BUS_SPI,
10416 .manufacture_id = SANYO_ID,
10417 .model_id = SANYO_LE25FW808,
10418 .total_size = 1024,
10419 .page_size = 256,
10420 .feature_bits = FEATURE_WRSR_WREN,
10421 .tested = TEST_UNTESTED,
10422 .probe = probe_spi_res2,
10423 .probe_timing = TIMING_ZERO,
10424 .block_erasers = {
10425 {
10426 .eraseblocks = { {8 * 1024, 128} },
10427 .block_erase = spi_block_erase_d7,
10428 }, {
10429 .eraseblocks = { {64 * 1024, 16} },
10430 .block_erase = spi_block_erase_d8,
10431 }, {
10432 .eraseblocks = { {1024 * 1024, 1} },
10433 .block_erase = spi_block_erase_c7,
10434 }
10435 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010436 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010437 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10438 .write = spi_chip_write_256,
10439 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
10440 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000010441 },
10442
10443 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010444 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000010445 .name = "LH28F008BJT-BTLZ1",
10446 .bustype = BUS_PARALLEL,
10447 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000010448 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000010449 .total_size = 1024,
10450 .page_size = 64 * 1024,
10451 .tested = TEST_OK_PREW,
10452 .probe = probe_82802ab,
10453 .probe_timing = TIMING_ZERO,
10454 .block_erasers =
10455 {
10456 {
10457 .eraseblocks = {
10458 {8 * 1024, 8},
10459 {64 * 1024, 15}
10460 },
10461 .block_erase = erase_block_82802ab,
10462 }, {
10463 .eraseblocks = { {1024 * 1024, 1} },
10464 .block_erase = erase_sector_49lfxxxc,
10465 }
10466 },
10467 .unlock = unlock_lh28f008bjt,
10468 .write = write_82802ab,
10469 .read = read_memmapped,
10470 .voltage = {2700, 3600},
10471 },
10472
10473 {
10474 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010475 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010476 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010477 .manufacture_id = SHARP_ID,
10478 .model_id = SHARP_LHF00L04,
10479 .total_size = 1024,
10480 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010481 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010482 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010483 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010484 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010485 .block_erasers =
10486 {
10487 {
10488 .eraseblocks = {
10489 {64 * 1024, 15},
10490 {8 * 1024, 8}
10491 },
Sean Nelson28accc22010-03-19 18:47:06 +000010492 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010493 }, {
10494 .eraseblocks = {
10495 {1024 * 1024, 1}
10496 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000010497 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010498 },
10499 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000010500 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000010501 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010502 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010503 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010504 },
10505
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010506 {
10507 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000010508 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010509 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010510 .manufacture_id = SPANSION_ID,
10511 .model_id = SPANSION_S25FL004A,
10512 .total_size = 512,
10513 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010514 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000010515 .tested = TEST_UNTESTED,
10516 .probe = probe_spi_rdid,
10517 .probe_timing = TIMING_ZERO,
10518 .block_erasers =
10519 {
10520 {
10521 .eraseblocks = { {64 * 1024, 8} },
10522 .block_erase = spi_block_erase_d8,
10523 }, {
10524 .eraseblocks = { {512 * 1024, 1} },
10525 .block_erase = spi_block_erase_c7,
10526 }
10527 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010528 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010529 .unlock = spi_disable_blockprotect,
10530 .write = spi_chip_write_256,
10531 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010532 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010533 },
10534
10535 {
10536 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000010537 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010538 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000010539 .manufacture_id = SPANSION_ID,
10540 .model_id = SPANSION_S25FL008A,
10541 .total_size = 1024,
10542 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010543 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010544 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000010545 .probe = probe_spi_rdid,
10546 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000010547 .block_erasers =
10548 {
10549 {
10550 .eraseblocks = { {64 * 1024, 16} },
10551 .block_erase = spi_block_erase_d8,
10552 }, {
10553 .eraseblocks = { {1024 * 1024, 1} },
10554 .block_erase = spi_block_erase_c7,
10555 }
10556 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010557 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010558 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000010559 .write = spi_chip_write_256,
10560 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010561 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000010562 },
10563
10564 {
10565 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010566 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010567 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010568 .manufacture_id = SPANSION_ID,
10569 .model_id = SPANSION_S25FL016A,
10570 .total_size = 2048,
10571 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010572 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010573 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010574 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010575 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010576 .block_erasers =
10577 {
10578 {
10579 .eraseblocks = { {64 * 1024, 32} },
10580 .block_erase = spi_block_erase_d8,
10581 }, {
10582 .eraseblocks = { {2 * 1024 * 1024, 1} },
10583 .block_erase = spi_block_erase_c7,
10584 }
10585 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010586 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010587 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010588 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010589 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010590 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010591 },
10592
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010593 {
Rudy Hostf4e57772010-11-29 00:37:49 +000010594 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010595 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010596 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010597 .manufacture_id = SPANSION_ID,
10598 .model_id = SPANSION_S25FL032A,
10599 .total_size = 4096,
10600 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010601 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010602 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000010603 .probe = probe_spi_rdid,
10604 .probe_timing = TIMING_ZERO,
10605 .block_erasers =
10606 {
10607 {
10608 .eraseblocks = { {64 * 1024, 64} },
10609 .block_erase = spi_block_erase_d8,
10610 }, {
10611 .eraseblocks = { {4 * 1024 * 1024, 1} },
10612 .block_erase = spi_block_erase_c7,
10613 }
10614 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010615 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010616 .unlock = spi_disable_blockprotect,
10617 .write = spi_chip_write_256,
10618 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010619 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010620 },
10621
10622 {
10623 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010624 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010625 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010626 .manufacture_id = SPANSION_ID,
10627 .model_id = SPANSION_S25FL064A,
10628 .total_size = 8192,
10629 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010630 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000010631 .tested = TEST_OK_PREW,
10632 .probe = probe_spi_rdid,
10633 .probe_timing = TIMING_ZERO,
10634 .block_erasers =
10635 {
10636 {
10637 .eraseblocks = { {64 * 1024, 128} },
10638 .block_erase = spi_block_erase_d8,
10639 }, {
10640 .eraseblocks = { {8 * 1024 * 1024, 1} },
10641 .block_erase = spi_block_erase_c7,
10642 }
10643 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010644 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010645 .unlock = spi_disable_blockprotect,
10646 .write = spi_chip_write_256,
10647 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010648 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010649 },
10650
10651 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010652 .vendor = "Spansion",
10653 .name = "S25FL204K",
10654 .bustype = BUS_SPI,
10655 .manufacture_id = SPANSION_ID,
10656 .model_id = SPANSION_S25FL204,
10657 .total_size = 512,
10658 .page_size = 256,
10659 .feature_bits = FEATURE_WRSR_WREN,
10660 .tested = TEST_UNTESTED,
10661 .probe = probe_spi_rdid,
10662 .probe_timing = TIMING_ZERO,
10663 .block_erasers = {
10664 {
10665 .eraseblocks = { {4 * 1024, 128} },
10666 .block_erase = spi_block_erase_20,
10667 }, {
10668 .eraseblocks = { {64 * 1024, 8} },
10669 .block_erase = spi_block_erase_d8,
10670 }, {
10671 .eraseblocks = { { 512 * 1024, 1} },
10672 .block_erase = spi_block_erase_60,
10673 }, {
10674 .eraseblocks = { { 512 * 1024, 1} },
10675 .block_erase = spi_block_erase_c7,
10676 }
10677 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010678 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010679 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010680 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010681 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010682 .voltage = {2700, 3600},
10683 },
10684
10685 {
10686 .vendor = "Spansion",
10687 .name = "S25FL208K",
10688 .bustype = BUS_SPI,
10689 .manufacture_id = SPANSION_ID,
10690 .model_id = SPANSION_S25FL208,
10691 .total_size = 1024,
10692 .page_size = 256,
10693 .feature_bits = FEATURE_WRSR_WREN,
10694 .tested = TEST_UNTESTED,
10695 .probe = probe_spi_rdid,
10696 .probe_timing = TIMING_ZERO,
10697 .block_erasers = {
10698 {
10699 .eraseblocks = { {4 * 1024, 256} },
10700 .block_erase = spi_block_erase_20,
10701 }, {
10702 .eraseblocks = { {64 * 1024, 16} },
10703 .block_erase = spi_block_erase_d8,
10704 }, {
10705 .eraseblocks = { { 1024 * 1024, 1} },
10706 .block_erase = spi_block_erase_60,
10707 }, {
10708 .eraseblocks = { { 1024 * 1024, 1} },
10709 .block_erase = spi_block_erase_c7,
10710 }
10711 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010712 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010713 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010714 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010715 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010716 .voltage = {2700, 3600},
10717 },
10718
10719 {
10720 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000010721 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010722 .bustype = BUS_SPI,
10723 .manufacture_id = SPANSION_ID,
10724 .model_id = SPANSION_S25FL216,
10725 .total_size = 2048,
10726 .page_size = 256,
10727 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
10728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10729 .tested = TEST_UNTESTED,
10730 .probe = probe_spi_rdid,
10731 .probe_timing = TIMING_ZERO,
10732 .block_erasers = {
10733 {
10734 .eraseblocks = { {4 * 1024, 512} },
10735 .block_erase = spi_block_erase_20,
10736 }, {
10737 .eraseblocks = { {64 * 1024, 32} },
10738 .block_erase = spi_block_erase_d8,
10739 }, {
10740 .eraseblocks = { { 2048 * 1024, 1} },
10741 .block_erase = spi_block_erase_60,
10742 }, {
10743 .eraseblocks = { { 2048 * 1024, 1} },
10744 .block_erase = spi_block_erase_c7,
10745 }
10746 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010747 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010748 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010749 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010750 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010751 .voltage = {2700, 3600},
10752 },
10753
10754 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010755 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000010756 .name = "S25FL132K",
10757 .bustype = BUS_SPI,
10758 .manufacture_id = SPANSION_ID,
10759 .model_id = SPANSION_S25FL132K,
10760 .total_size = 4096,
10761 .page_size = 256,
10762 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
10763 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10764 .tested = TEST_UNTESTED,
10765 .probe = probe_spi_rdid,
10766 .probe_timing = TIMING_ZERO,
10767 .block_erasers = {
10768 {
10769 .eraseblocks = { {4 * 1024, 1024} },
10770 .block_erase = spi_block_erase_20,
10771 }, {
10772 .eraseblocks = { {64 * 1024, 64} },
10773 .block_erase = spi_block_erase_d8,
10774 }, {
10775 .eraseblocks = { { 4096 * 1024, 1} },
10776 .block_erase = spi_block_erase_60,
10777 }, {
10778 .eraseblocks = { { 4096 * 1024, 1} },
10779 .block_erase = spi_block_erase_c7,
10780 }
10781 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010782 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000010783 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10784 .write = spi_chip_write_256,
10785 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10786 .voltage = {2700, 3600},
10787 },
10788
10789 {
10790 .vendor = "Spansion",
10791 .name = "S25FL164K",
10792 .bustype = BUS_SPI,
10793 .manufacture_id = SPANSION_ID,
10794 .model_id = SPANSION_S25FL164K,
10795 .total_size = 8192,
10796 .page_size = 256,
10797 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
10798 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10799 .tested = TEST_OK_PREW,
10800 .probe = probe_spi_rdid,
10801 .probe_timing = TIMING_ZERO,
10802 .block_erasers = {
10803 {
10804 .eraseblocks = { {4 * 1024, 2048} },
10805 .block_erase = spi_block_erase_20,
10806 }, {
10807 .eraseblocks = { {64 * 1024, 128} },
10808 .block_erase = spi_block_erase_d8,
10809 }, {
10810 .eraseblocks = { { 8192 * 1024, 1} },
10811 .block_erase = spi_block_erase_60,
10812 }, {
10813 .eraseblocks = { { 8192 * 1024, 1} },
10814 .block_erase = spi_block_erase_c7,
10815 }
10816 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010817 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000010818 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10819 .write = spi_chip_write_256,
10820 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10821 .voltage = {2700, 3600},
10822 },
10823
10824 {
10825 .vendor = "Spansion",
Jernej Å krabece814a9b2014-12-12 00:32:03 +000010826 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
10827 .bustype = BUS_SPI,
10828 .manufacture_id = SPANSION_ID,
10829 .model_id = SPANSION_S25FL128,
10830 .total_size = 16384,
10831 .page_size = 256,
10832 /* supports 4B addressing */
10833 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
10834 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10835 .tested = TEST_OK_PREW,
10836 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
10837 .probe = probe_spi_rdid,
10838 .probe_timing = TIMING_ZERO,
10839 .block_erasers = {
10840 {
10841 /* This chip supports erasing of 32 so-called "parameter sectors" with
10842 * opcode 0x20 which may be configured to be on top or bottom of the address
10843 * space. Trying to access an address outside these 4kB blocks does have no
10844 * effect on the memory contents, e.g.
10845 .eraseblocks = {
10846 {4 * 1024, 32},
10847 {64 * 1024, 254} // inaccessible
10848 },
10849 .block_erase = spi_block_erase_20,
10850 }, { */
10851 .eraseblocks = { { 64 * 1024, 256} },
10852 .block_erase = spi_block_erase_d8,
10853 }, {
10854 .eraseblocks = { { 16384 * 1024, 1} },
10855 .block_erase = spi_block_erase_60,
10856 }, {
10857 .eraseblocks = { { 16384 * 1024, 1} },
10858 .block_erase = spi_block_erase_c7,
10859 }
10860 },
10861 .printlock = spi_prettyprint_status_register_bp2_srwd,
10862 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10863 .write = spi_chip_write_256, /* Multi I/O supported */
10864 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10865 .voltage = {2700, 3600},
10866 },
10867
10868 {
10869 .vendor = "Spansion",
10870 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
10871 .bustype = BUS_SPI,
10872 .manufacture_id = SPANSION_ID,
10873 .model_id = SPANSION_S25FL128,
10874 .total_size = 16384,
10875 .page_size = 512,
10876 /* supports 4B addressing */
10877 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
10878 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10879 .tested = TEST_UNTESTED,
10880 .probe = probe_spi_rdid,
10881 .probe_timing = TIMING_ZERO,
10882 .block_erasers = {
10883 {
10884 .eraseblocks = { {256 * 1024, 64} },
10885 .block_erase = spi_block_erase_d8,
10886 }, {
10887 .eraseblocks = { { 16384 * 1024, 1} },
10888 .block_erase = spi_block_erase_60,
10889 }, {
10890 .eraseblocks = { { 16384 * 1024, 1} },
10891 .block_erase = spi_block_erase_c7,
10892 }
10893 },
10894 .printlock = spi_prettyprint_status_register_bp2_srwd,
10895 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10896 .write = spi_chip_write_256, /* Multi I/O supported */
10897 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10898 .voltage = {2700, 3600},
10899 },
10900
10901 {
10902 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000010903 .name = "S25FL128P......0", /* uniform 64 kB sectors */
10904 .bustype = BUS_SPI,
10905 .manufacture_id = SPANSION_ID,
10906 .model_id = SPANSION_S25FL128,
10907 .total_size = 16384,
10908 .page_size = 256,
10909 .feature_bits = FEATURE_WRSR_WREN,
10910 .tested = TEST_UNTESTED,
10911 .probe = probe_spi_rdid,
10912 .probe_timing = TIMING_ZERO,
10913 .block_erasers = {
10914 {
10915 .eraseblocks = { {64 * 1024, 256} },
10916 .block_erase = spi_block_erase_20,
10917 }, {
10918 .eraseblocks = { {64 * 1024, 256} },
10919 .block_erase = spi_block_erase_d8,
10920 }, {
10921 .eraseblocks = { { 16384 * 1024, 1} },
10922 .block_erase = spi_block_erase_60,
10923 }, {
10924 .eraseblocks = { { 16384 * 1024, 1} },
10925 .block_erase = spi_block_erase_c7,
10926 }
10927 },
10928 .printlock = spi_prettyprint_status_register_bp3_srwd,
10929 .unlock = spi_disable_blockprotect_bp3_srwd,
10930 .write = spi_chip_write_256,
10931 .read = spi_chip_read, /* Fast read (0x0B) supported */
10932 .voltage = {2700, 3600},
10933 },
10934
10935 {
10936 .vendor = "Spansion",
10937 .name = "S25FL128P......1", /* uniform 256kB sectors */
10938 .bustype = BUS_SPI,
10939 .manufacture_id = SPANSION_ID,
10940 .model_id = SPANSION_S25FL128,
10941 .total_size = 16384,
10942 .page_size = 256,
10943 .feature_bits = FEATURE_WRSR_WREN,
10944 .tested = TEST_UNTESTED,
10945 .probe = probe_spi_rdid,
10946 .probe_timing = TIMING_ZERO,
10947 .block_erasers = {
10948 {
10949 .eraseblocks = { {256 * 1024, 64} },
10950 .block_erase = spi_block_erase_d8,
10951 }, {
10952 .eraseblocks = { { 16384 * 1024, 1} },
10953 .block_erase = spi_block_erase_c7,
10954 }
10955 },
10956 .printlock = spi_prettyprint_status_register_bp2_srwd,
10957 .unlock = spi_disable_blockprotect_bp2_srwd,
10958 .write = spi_chip_write_256,
10959 .read = spi_chip_read, /* Fast read (0x0B) supported */
10960 .voltage = {2700, 3600},
10961 },
10962
10963 {
10964 .vendor = "Spansion",
10965 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010966 .bustype = BUS_SPI,
10967 .manufacture_id = SPANSION_ID,
10968 .model_id = SPANSION_S25FL128,
10969 .total_size = 16384,
10970 .page_size = 256,
10971 /* supports 4B addressing */
10972 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
10973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10974 .tested = TEST_UNTESTED,
10975 .probe = probe_spi_rdid,
10976 .probe_timing = TIMING_ZERO,
10977 .block_erasers = {
10978 {
Stefan Tauner88b19252014-08-06 14:36:27 +000010979 /* This chip supports erasing of the 32 so-called "parameter sectors" with
10980 * opcode 0x20. Trying to access an address outside these 4kB blocks does
10981 * have no effect on the memory contents, but sets a flag in the SR.
10982 .eraseblocks = {
10983 {4 * 1024, 32},
10984 {64 * 1024, 254} // inaccessible
10985 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010986 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000010987 }, { */
10988 .eraseblocks = { { 64 * 1024, 256} },
10989 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010990 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000010991 .eraseblocks = { { 16384 * 1024, 1} },
10992 .block_erase = spi_block_erase_60,
10993 }, {
10994 .eraseblocks = { { 16384 * 1024, 1} },
10995 .block_erase = spi_block_erase_c7,
10996 }
10997 },
10998 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
10999 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
11000 .write = spi_chip_write_256, /* Multi I/O supported */
11001 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11002 .voltage = {2700, 3600},
11003 },
11004
11005 {
11006 .vendor = "Spansion",
11007 .name = "S25FL128S......1", /* uniform 256 kB sectors */
11008 .bustype = BUS_SPI,
11009 .manufacture_id = SPANSION_ID,
11010 .model_id = SPANSION_S25FL128,
11011 .total_size = 16384,
11012 .page_size = 512,
11013 /* supports 4B addressing */
11014 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
11015 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11016 .tested = TEST_UNTESTED,
11017 .probe = probe_spi_rdid,
11018 .probe_timing = TIMING_ZERO,
11019 .block_erasers = {
11020 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000011021 .eraseblocks = { {256 * 1024, 64} },
11022 .block_erase = spi_block_erase_d8,
11023 }, {
11024 .eraseblocks = { { 16384 * 1024, 1} },
11025 .block_erase = spi_block_erase_60,
11026 }, {
11027 .eraseblocks = { { 16384 * 1024, 1} },
11028 .block_erase = spi_block_erase_c7,
11029 }
11030 },
11031 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
11032 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
11033 .write = spi_chip_write_256, /* Multi I/O supported */
11034 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11035 .voltage = {2700, 3600},
11036 },
11037
11038 {
Stefan Tauner88b19252014-08-06 14:36:27 +000011039 .vendor = "Spansion",
11040 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
11041 .bustype = BUS_SPI,
11042 .manufacture_id = SPANSION_ID,
11043 .model_id = SPANSION_S25FL128,
11044 .total_size = 16384,
11045 .page_size = 256,
11046 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
11047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11048 .tested = TEST_OK_PREW,
11049 .probe = probe_spi_rdid,
11050 .probe_timing = TIMING_ZERO,
11051 .block_erasers = {
11052 {
11053 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
11054 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
11055 * effect on the memory contents, but sets a flag in the SR.
11056 .eraseblocks = {
11057 {4 * 1024, 32},
11058 {64 * 1024, 254} // inaccessible
11059 },
11060 .block_erase = spi_block_erase_20,
11061 }, { */
11062 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
11063 .eraseblocks = {
11064 {8 * 1024, 16},
11065 {64 * 1024, 254} // inaccessible
11066 },
11067 .block_erase = spi_block_erase_40,
11068 }, { */
11069 .eraseblocks = { { 64 * 1024, 256} },
11070 .block_erase = spi_block_erase_d8,
11071 }, {
11072 .eraseblocks = { { 16384 * 1024, 1} },
11073 .block_erase = spi_block_erase_60,
11074 }, {
11075 .eraseblocks = { { 16384 * 1024, 1} },
11076 .block_erase = spi_block_erase_c7,
11077 }
11078 },
11079 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
11080 .unlock = spi_disable_blockprotect_bp2_srwd,
11081 .write = spi_chip_write_256, /* Multi I/O supported */
11082 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11083 .voltage = {2700, 3600},
11084 },
11085
11086 {
11087 .vendor = "Spansion",
11088 .name = "S25FL129P......1", /* uniform 256 kB sectors */
11089 .bustype = BUS_SPI,
11090 .manufacture_id = SPANSION_ID,
11091 .model_id = SPANSION_S25FL128,
11092 .total_size = 16384,
11093 .page_size = 512,
11094 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
11095 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11096 .tested = TEST_UNTESTED,
11097 .probe = probe_spi_rdid,
11098 .probe_timing = TIMING_ZERO,
11099 .block_erasers = {
11100 {
11101 .eraseblocks = { {256 * 1024, 64} },
11102 .block_erase = spi_block_erase_d8,
11103 }, {
11104 .eraseblocks = { { 16384 * 1024, 1} },
11105 .block_erase = spi_block_erase_60,
11106 }, {
11107 .eraseblocks = { { 16384 * 1024, 1} },
11108 .block_erase = spi_block_erase_c7,
11109 }
11110 },
11111 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
11112 .unlock = spi_disable_blockprotect_bp2_srwd,
11113 .write = spi_chip_write_256, /* Multi I/O supported */
11114 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11115 .voltage = {2700, 3600},
11116 },
11117
11118 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011119 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000011120 .name = "SST25LF020A",
11121 .bustype = BUS_SPI,
11122 .manufacture_id = SST_ID,
11123 .model_id = SST_SST25VF020_REMS,
11124 .total_size = 256,
11125 .page_size = 256,
11126 .feature_bits = FEATURE_WRSR_EWSR,
11127 .tested = TEST_OK_PREW,
11128 .probe = probe_spi_rems,
11129 .probe_timing = TIMING_ZERO,
11130 .block_erasers =
11131 {
11132 {
11133 .eraseblocks = { {4 * 1024, 64} },
11134 .block_erase = spi_block_erase_20,
11135 }, {
11136 .eraseblocks = { {32 * 1024, 8} },
11137 .block_erase = spi_block_erase_52,
11138 }, {
11139 .eraseblocks = { {256 * 1024, 1} },
11140 .block_erase = spi_block_erase_60,
11141 },
11142 },
11143 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
11144 .unlock = spi_disable_blockprotect,
11145 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
11146 .read = spi_chip_read, /* Fast read (0x0B) supported */
11147 .voltage = {2700, 3600},
11148 },
11149
11150 {
11151 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000011152 .name = "SST25LF040A",
11153 .bustype = BUS_SPI,
11154 .manufacture_id = SST_ID,
11155 .model_id = SST_SST25VF040_REMS,
11156 .total_size = 512,
11157 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011158 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000011159 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000011160 .probe = probe_spi_res2,
11161 .probe_timing = TIMING_ZERO,
11162 .block_erasers =
11163 {
11164 {
11165 .eraseblocks = { {4 * 1024, 128} },
11166 .block_erase = spi_block_erase_20,
11167 }, {
11168 .eraseblocks = { {32 * 1024, 16} },
11169 .block_erase = spi_block_erase_52,
11170 }, {
11171 .eraseblocks = { {512 * 1024, 1} },
11172 .block_erase = spi_block_erase_60,
11173 },
11174 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011175 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000011176 .unlock = spi_disable_blockprotect,
11177 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
11178 .read = spi_chip_read,
11179 .voltage = {3000, 3600},
11180 },
11181
11182 {
11183 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000011184 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000011185 .bustype = BUS_SPI,
11186 .manufacture_id = SST_ID,
11187 .model_id = SST_SST25VF080_REMS,
11188 .total_size = 1024,
11189 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011190 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000011191 .tested = TEST_UNTESTED,
11192 .probe = probe_spi_res2,
11193 .probe_timing = TIMING_ZERO,
11194 .block_erasers =
11195 {
11196 {
11197 .eraseblocks = { {4 * 1024, 256} },
11198 .block_erase = spi_block_erase_20,
11199 }, {
11200 .eraseblocks = { {32 * 1024, 32} },
11201 .block_erase = spi_block_erase_52,
11202 }, {
11203 .eraseblocks = { {1024 * 1024, 1} },
11204 .block_erase = spi_block_erase_60,
11205 },
11206 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011207 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000011208 .unlock = spi_disable_blockprotect,
11209 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
11210 .read = spi_chip_read,
11211 .voltage = {3000, 3600},
11212 },
11213
11214 {
11215 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000011216 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000011217 .bustype = BUS_SPI,
11218 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000011219 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000011220 .total_size = 64,
11221 .page_size = 256,
11222 .feature_bits = FEATURE_WRSR_EWSR,
11223 .tested = TEST_OK_PREW,
11224 .probe = probe_spi_rems,
11225 .probe_timing = TIMING_ZERO,
11226 .block_erasers =
11227 {
11228 {
11229 .eraseblocks = { {4 * 1024, 16} },
11230 .block_erase = spi_block_erase_20,
11231 }, {
11232 .eraseblocks = { {32 * 1024, 2} },
11233 .block_erase = spi_block_erase_52,
11234 }, {
11235 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000011236 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011237 }, {
11238 .eraseblocks = { {64 * 1024, 1} },
11239 .block_erase = spi_block_erase_60,
11240 }, {
11241 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000011242 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011243 },
11244 },
11245 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
11246 .unlock = spi_disable_blockprotect,
11247 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000011248 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011249 .voltage = {2700, 3600},
11250 },
11251
11252 {
11253 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000011254 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011255 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000011256 .manufacture_id = SST_ID,
11257 .model_id = SST_SST25VF010_REMS,
11258 .total_size = 128,
11259 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011260 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000011261 .tested = TEST_OK_PREW,
11262 .probe = probe_spi_rems,
11263 .probe_timing = TIMING_ZERO,
11264 .block_erasers =
11265 {
11266 {
11267 .eraseblocks = { {4 * 1024, 32} },
11268 .block_erase = spi_block_erase_20,
11269 }, {
11270 .eraseblocks = { {32 * 1024, 4} },
11271 .block_erase = spi_block_erase_52,
11272 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000011273 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000011274 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011275 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000011276 .eraseblocks = { {128 * 1024, 1} },
11277 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000011278 }, {
11279 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000011280 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011281 },
11282 },
11283 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
11284 .unlock = spi_disable_blockprotect,
11285 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000011286 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000011287 .voltage = {2700, 3600},
11288 },
11289
11290 {
11291 .vendor = "SST",
11292 .name = "SST25VF020",
11293 .bustype = BUS_SPI,
11294 .manufacture_id = SST_ID,
11295 .model_id = SST_SST25VF020_REMS,
11296 .total_size = 256,
11297 .page_size = 256,
11298 .feature_bits = FEATURE_WRSR_EWSR,
11299 .tested = TEST_UNTESTED,
11300 .probe = probe_spi_rems,
11301 .probe_timing = TIMING_ZERO,
11302 .block_erasers =
11303 {
11304 {
11305 .eraseblocks = { {4 * 1024, 64} },
11306 .block_erase = spi_block_erase_20,
11307 }, {
11308 .eraseblocks = { {32 * 1024, 8} },
11309 .block_erase = spi_block_erase_52,
11310 }, {
11311 .eraseblocks = { {256 * 1024, 1} },
11312 .block_erase = spi_block_erase_60,
11313 },
11314 },
11315 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
11316 .unlock = spi_disable_blockprotect,
11317 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
11318 .read = spi_chip_read, /* only */
11319 .voltage = {2700, 3600},
11320 },
11321
11322 {
11323 .vendor = "SST",
11324 .name = "SST25VF020B",
11325 .bustype = BUS_SPI,
11326 .manufacture_id = SST_ID,
11327 .model_id = SST_SST25VF020B,
11328 .total_size = 256,
11329 .page_size = 256,
11330 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011331 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000011332 .probe = probe_spi_rdid,
11333 .probe_timing = TIMING_ZERO,
11334 .block_erasers =
11335 {
11336 {
11337 .eraseblocks = { {4 * 1024, 64} },
11338 .block_erase = spi_block_erase_20,
11339 }, {
11340 .eraseblocks = { {32 * 1024, 8} },
11341 .block_erase = spi_block_erase_52,
11342 }, {
11343 .eraseblocks = { {64 * 1024, 4} },
11344 .block_erase = spi_block_erase_d8,
11345 }, {
11346 .eraseblocks = { {256 * 1024, 1} },
11347 .block_erase = spi_block_erase_60,
11348 }, {
11349 .eraseblocks = { {256 * 1024, 1} },
11350 .block_erase = spi_block_erase_c7,
11351 },
11352 },
11353 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
11354 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
11355 .write = spi_aai_write, /* AAI supported (0xAD) */
11356 .read = spi_chip_read, /* Fast read (0x0B) supported */
11357 .voltage = {2700, 3600},
11358 },
11359
11360 {
11361 .vendor = "SST",
11362 .name = "SST25VF040",
11363 .bustype = BUS_SPI,
11364 .manufacture_id = SST_ID,
11365 .model_id = SST_SST25VF040_REMS,
11366 .total_size = 512,
11367 .page_size = 256,
11368 .feature_bits = FEATURE_WRSR_EWSR,
11369 .tested = TEST_OK_PR,
11370 .probe = probe_spi_rems,
11371 .probe_timing = TIMING_ZERO,
11372 .block_erasers =
11373 {
11374 {
11375 .eraseblocks = { {4 * 1024, 128} },
11376 .block_erase = spi_block_erase_20,
11377 }, {
11378 .eraseblocks = { {32 * 1024, 16} },
11379 .block_erase = spi_block_erase_52,
11380 }, {
11381 .eraseblocks = { {512 * 1024, 1} },
11382 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000011383 },
11384 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011385 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000011386 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000011387 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
11388 .read = spi_chip_read,
11389 .voltage = {2700, 3600},
11390 },
11391
11392 {
11393 .vendor = "SST",
11394 .name = "SST25VF040B",
11395 .bustype = BUS_SPI,
11396 .manufacture_id = SST_ID,
11397 .model_id = SST_SST25VF040B,
11398 .total_size = 512,
11399 .page_size = 256,
11400 .feature_bits = FEATURE_WRSR_EWSR,
11401 .tested = TEST_OK_PREW,
11402 .probe = probe_spi_rdid,
11403 .probe_timing = TIMING_ZERO,
11404 .block_erasers =
11405 {
11406 {
11407 .eraseblocks = { {4 * 1024, 128} },
11408 .block_erase = spi_block_erase_20,
11409 }, {
11410 .eraseblocks = { {32 * 1024, 16} },
11411 .block_erase = spi_block_erase_52,
11412 }, {
11413 .eraseblocks = { {64 * 1024, 8} },
11414 .block_erase = spi_block_erase_d8,
11415 }, {
11416 .eraseblocks = { {512 * 1024, 1} },
11417 .block_erase = spi_block_erase_60,
11418 }, {
11419 .eraseblocks = { {512 * 1024, 1} },
11420 .block_erase = spi_block_erase_c7,
11421 },
11422 },
11423 .printlock = spi_prettyprint_status_register_sst25vf040b,
11424 .unlock = spi_disable_blockprotect,
11425 .write = spi_aai_write, /* AAI supported (0xAD) */
11426 .read = spi_chip_read, /* Fast read (0x0B) supported */
11427 .voltage = {2700, 3600},
11428 },
11429
11430 {
11431 .vendor = "SST",
11432 .name = "SST25VF040B.REMS",
11433 .bustype = BUS_SPI,
11434 .manufacture_id = SST_ID,
11435 .model_id = SST_SST25VF040B_REMS,
11436 .total_size = 512,
11437 .page_size = 256,
11438 .feature_bits = FEATURE_WRSR_EWSR,
11439 .tested = TEST_OK_PREW,
11440 .probe = probe_spi_rems,
11441 .probe_timing = TIMING_ZERO,
11442 .block_erasers =
11443 {
11444 {
11445 .eraseblocks = { {4 * 1024, 128} },
11446 .block_erase = spi_block_erase_20,
11447 }, {
11448 .eraseblocks = { {32 * 1024, 16} },
11449 .block_erase = spi_block_erase_52,
11450 }, {
11451 .eraseblocks = { {64 * 1024, 8} },
11452 .block_erase = spi_block_erase_d8,
11453 }, {
11454 .eraseblocks = { {512 * 1024, 1} },
11455 .block_erase = spi_block_erase_60,
11456 }, {
11457 .eraseblocks = { {512 * 1024, 1} },
11458 .block_erase = spi_block_erase_c7,
11459 },
11460 },
11461 .printlock = spi_prettyprint_status_register_sst25vf040b,
11462 .unlock = spi_disable_blockprotect,
11463 .write = spi_aai_write,
11464 .read = spi_chip_read,
11465 .voltage = {2700, 3600},
11466 },
11467
11468 {
11469 .vendor = "SST",
11470 .name = "SST25VF080B",
11471 .bustype = BUS_SPI,
11472 .manufacture_id = SST_ID,
11473 .model_id = SST_SST25VF080B,
11474 .total_size = 1024,
11475 .page_size = 256,
11476 .feature_bits = FEATURE_WRSR_EWSR,
11477 .tested = TEST_OK_PREW,
11478 .probe = probe_spi_rdid,
11479 .probe_timing = TIMING_ZERO,
11480 .block_erasers =
11481 {
11482 {
11483 .eraseblocks = { {4 * 1024, 256} },
11484 .block_erase = spi_block_erase_20,
11485 }, {
11486 .eraseblocks = { {32 * 1024, 32} },
11487 .block_erase = spi_block_erase_52,
11488 }, {
11489 .eraseblocks = { {64 * 1024, 16} },
11490 .block_erase = spi_block_erase_d8,
11491 }, {
11492 .eraseblocks = { {1024 * 1024, 1} },
11493 .block_erase = spi_block_erase_60,
11494 }, {
11495 .eraseblocks = { {1024 * 1024, 1} },
11496 .block_erase = spi_block_erase_c7,
11497 },
11498 },
11499 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
11500 .unlock = spi_disable_blockprotect,
11501 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000011502 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011503 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000011504 },
11505
11506 {
11507 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011508 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011509 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011510 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011511 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011512 .total_size = 2048,
11513 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011514 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000011515 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011516 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011517 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011518 .block_erasers =
11519 {
11520 {
11521 .eraseblocks = { {4 * 1024, 512} },
11522 .block_erase = spi_block_erase_20,
11523 }, {
11524 .eraseblocks = { {32 * 1024, 64} },
11525 .block_erase = spi_block_erase_52,
11526 }, {
11527 .eraseblocks = { {64 * 1024, 32} },
11528 .block_erase = spi_block_erase_d8,
11529 }, {
11530 .eraseblocks = { {2 * 1024 * 1024, 1} },
11531 .block_erase = spi_block_erase_60,
11532 }, {
11533 .eraseblocks = { {2 * 1024 * 1024, 1} },
11534 .block_erase = spi_block_erase_c7,
11535 },
11536 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011537 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011538 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000011539 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011540 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011541 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011542 },
11543
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011544 {
11545 .vendor = "SST",
11546 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011547 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011548 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011549 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011550 .total_size = 4096,
11551 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011552 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000011553 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011554 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011555 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011556 .block_erasers =
11557 {
11558 {
11559 .eraseblocks = { {4 * 1024, 1024} },
11560 .block_erase = spi_block_erase_20,
11561 }, {
11562 .eraseblocks = { {32 * 1024, 128} },
11563 .block_erase = spi_block_erase_52,
11564 }, {
11565 .eraseblocks = { {64 * 1024, 64} },
11566 .block_erase = spi_block_erase_d8,
11567 }, {
11568 .eraseblocks = { {4 * 1024 * 1024, 1} },
11569 .block_erase = spi_block_erase_60,
11570 }, {
11571 .eraseblocks = { {4 * 1024 * 1024, 1} },
11572 .block_erase = spi_block_erase_c7,
11573 },
11574 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011575 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011576 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000011577 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011578 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011579 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011580 },
11581
11582 {
11583 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011584 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011585 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011586 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011587 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011588 .total_size = 8192,
11589 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011590 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000011591 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011592 .probe = probe_spi_rdid,
11593 .probe_timing = TIMING_ZERO,
11594 .block_erasers =
11595 {
11596 {
11597 .eraseblocks = { {4 * 1024, 2048} },
11598 .block_erase = spi_block_erase_20,
11599 }, {
11600 .eraseblocks = { {32 * 1024, 256} },
11601 .block_erase = spi_block_erase_52,
11602 }, {
11603 .eraseblocks = { {64 * 1024, 128} },
11604 .block_erase = spi_block_erase_d8,
11605 }, {
11606 .eraseblocks = { {8 * 1024 * 1024, 1} },
11607 .block_erase = spi_block_erase_60,
11608 }, {
11609 .eraseblocks = { {8 * 1024 * 1024, 1} },
11610 .block_erase = spi_block_erase_c7,
11611 },
11612 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011613 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011614 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000011615 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011616 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011617 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011618 },
11619
11620 {
11621 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000011622 .name = "SST25WF512",
11623 .bustype = BUS_SPI,
11624 .manufacture_id = SST_ID,
11625 .model_id = SST_SST25WF512,
11626 .total_size = 64,
11627 .page_size = 256,
11628 .feature_bits = FEATURE_WRSR_EITHER,
11629 .tested = TEST_UNTESTED,
11630 .probe = probe_spi_rdid,
11631 .probe_timing = TIMING_ZERO,
11632 .block_erasers =
11633 {
11634 {
11635 .eraseblocks = { {4 * 1024, 16} },
11636 .block_erase = spi_block_erase_20,
11637 }, {
11638 .eraseblocks = { {32 * 1024, 2} },
11639 .block_erase = spi_block_erase_52,
11640 }, {
11641 .eraseblocks = { {1024 * 64, 1} },
11642 .block_erase = spi_block_erase_60,
11643 }, {
11644 .eraseblocks = { {1024 * 64, 1} },
11645 .block_erase = spi_block_erase_c7,
11646 },
11647 },
Jason Harper43ddef02014-05-04 00:55:24 +000011648 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11649 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011650 .write = spi_aai_write,
11651 .read = spi_chip_read, /* Fast read (0x0B) supported */
11652 .voltage = {1650, 1950},
11653 },
11654
11655 {
11656 .vendor = "SST",
11657 .name = "SST25WF010",
11658 .bustype = BUS_SPI,
11659 .manufacture_id = SST_ID,
11660 .model_id = SST_SST25WF010,
11661 .total_size = 128,
11662 .page_size = 256,
11663 .feature_bits = FEATURE_WRSR_EITHER,
11664 .tested = TEST_UNTESTED,
11665 .probe = probe_spi_rdid,
11666 .probe_timing = TIMING_ZERO,
11667 .block_erasers =
11668 {
11669 {
11670 .eraseblocks = { {4 * 1024, 32} },
11671 .block_erase = spi_block_erase_20,
11672 }, {
11673 .eraseblocks = { {32 * 1024, 4} },
11674 .block_erase = spi_block_erase_52,
11675 }, {
11676 .eraseblocks = { {1024 * 128, 1} },
11677 .block_erase = spi_block_erase_60,
11678 }, {
11679 .eraseblocks = { {1024 * 128, 1} },
11680 .block_erase = spi_block_erase_c7,
11681 },
11682 },
Jason Harper43ddef02014-05-04 00:55:24 +000011683 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11684 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011685 .write = spi_aai_write,
11686 .read = spi_chip_read, /* Fast read (0x0B) supported */
11687 .voltage = {1650, 1950},
11688 },
11689
11690 {
11691 .vendor = "SST",
11692 .name = "SST25WF020",
11693 .bustype = BUS_SPI,
11694 .manufacture_id = SST_ID,
11695 .model_id = SST_SST25WF020,
11696 .total_size = 256,
11697 .page_size = 256,
11698 .feature_bits = FEATURE_WRSR_EITHER,
11699 .tested = TEST_UNTESTED,
11700 .probe = probe_spi_rdid,
11701 .probe_timing = TIMING_ZERO,
11702 .block_erasers =
11703 {
11704 {
11705 .eraseblocks = { {4 * 1024, 64} },
11706 .block_erase = spi_block_erase_20,
11707 }, {
11708 .eraseblocks = { {32 * 1024, 8} },
11709 .block_erase = spi_block_erase_52,
11710 }, {
11711 .eraseblocks = { {64 * 1024, 4} },
11712 .block_erase = spi_block_erase_d8,
11713 }, {
11714 .eraseblocks = { {1024 * 256, 1} },
11715 .block_erase = spi_block_erase_60,
11716 }, {
11717 .eraseblocks = { {1024 * 256, 1} },
11718 .block_erase = spi_block_erase_c7,
11719 },
11720 },
Jason Harper43ddef02014-05-04 00:55:24 +000011721 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11722 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011723 .write = spi_aai_write,
11724 .read = spi_chip_read, /* Fast read (0x0B) supported */
11725 .voltage = {1650, 1950},
11726 },
11727
11728 {
11729 .vendor = "SST",
11730 .name = "SST25WF040",
11731 .bustype = BUS_SPI,
11732 .manufacture_id = SST_ID,
11733 .model_id = SST_SST25WF040,
11734 .total_size = 512,
11735 .page_size = 256,
11736 .feature_bits = FEATURE_WRSR_EITHER,
11737 .tested = TEST_UNTESTED,
11738 .probe = probe_spi_rdid,
11739 .probe_timing = TIMING_ZERO,
11740 .block_erasers =
11741 {
11742 {
11743 .eraseblocks = { {4 * 1024, 128} },
11744 .block_erase = spi_block_erase_20,
11745 }, {
11746 .eraseblocks = { {32 * 1024, 16} },
11747 .block_erase = spi_block_erase_52,
11748 }, {
11749 .eraseblocks = { {64 * 1024, 8} },
11750 .block_erase = spi_block_erase_d8,
11751 }, {
11752 .eraseblocks = { {1024 * 512, 1} },
11753 .block_erase = spi_block_erase_60,
11754 }, {
11755 .eraseblocks = { {1024 * 512, 1} },
11756 .block_erase = spi_block_erase_c7,
11757 },
11758 },
Jason Harper43ddef02014-05-04 00:55:24 +000011759 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11760 .unlock = spi_disable_blockprotect_bp2_srwd,
11761 .write = spi_aai_write,
11762 .read = spi_chip_read, /* Fast read (0x0B) supported */
11763 .voltage = {1650, 1950},
11764 },
11765
11766 {
11767 .vendor = "SST",
11768 .name = "SST25WF080",
11769 .bustype = BUS_SPI,
11770 .manufacture_id = SST_ID,
11771 .model_id = SST_SST25WF080,
11772 .total_size = 1024,
11773 .page_size = 256,
11774 .feature_bits = FEATURE_WRSR_EITHER,
11775 .tested = TEST_OK_PREW,
11776 .probe = probe_spi_rdid,
11777 .probe_timing = TIMING_ZERO,
11778 .block_erasers =
11779 {
11780 {
11781 .eraseblocks = { {4 * 1024, 256} },
11782 .block_erase = spi_block_erase_20,
11783 }, {
11784 .eraseblocks = { {32 * 1024, 32} },
11785 .block_erase = spi_block_erase_52,
11786 }, {
11787 .eraseblocks = { {64 * 1024, 16} },
11788 .block_erase = spi_block_erase_d8,
11789 }, {
11790 .eraseblocks = { {1024 * 1024, 1} },
11791 .block_erase = spi_block_erase_60,
11792 }, {
11793 .eraseblocks = { {1024 * 1024, 1} },
11794 .block_erase = spi_block_erase_c7,
11795 },
11796 },
11797 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
11798 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011799 .write = spi_aai_write,
11800 .read = spi_chip_read, /* Fast read (0x0B) supported */
11801 .voltage = {1650, 1950},
11802 },
11803
11804 {
11805 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011806 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011807 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011808 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011809 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011810 .total_size = 512,
11811 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000011812 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011813 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011814 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011815 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011816 .block_erasers =
11817 {
11818 {
11819 .eraseblocks = { {128, 4096} },
11820 .block_erase = erase_sector_28sf040,
11821 }, {
11822 .eraseblocks = { {512 * 1024, 1} },
11823 .block_erase = erase_chip_28sf040,
11824 }
11825 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011826 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011827 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011828 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011829 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011830 },
11831
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011832 {
11833 .vendor = "SST",
11834 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011835 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011836 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011837 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011838 .total_size = 128,
11839 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011840 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011841 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011842 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011843 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011844 .block_erasers =
11845 {
11846 {
11847 .eraseblocks = { {128 * 1024, 1} },
11848 .block_erase = erase_chip_block_jedec,
11849 }
11850 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011851 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011852 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011853 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011854 },
11855
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011856 {
11857 .vendor = "SST",
11858 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011859 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011860 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011861 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011862 .total_size = 128,
11863 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011864 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011865 .tested = TEST_UNTESTED,
11866 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011867 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011868 .block_erasers =
11869 {
11870 {
11871 .eraseblocks = { {128 * 1024, 1} },
11872 .block_erase = erase_chip_block_jedec,
11873 }
11874 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011875 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011876 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011877 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011878 },
11879
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011880 {
11881 .vendor = "SST",
11882 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011883 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011884 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011885 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011886 .total_size = 256,
11887 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011888 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011889 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011890 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011891 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011892 .block_erasers =
11893 {
11894 {
11895 .eraseblocks = { {256 * 1024, 1} },
11896 .block_erase = erase_chip_block_jedec,
11897 }
11898 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011899 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011900 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011901 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011902 },
11903
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011904 {
11905 .vendor = "SST",
11906 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011907 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011908 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011909 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011910 .total_size = 256,
11911 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011912 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011913 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011914 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011915 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011916 .block_erasers =
11917 {
11918 {
11919 .eraseblocks = { {256 * 1024, 1} },
11920 .block_erase = erase_chip_block_jedec,
11921 }
11922 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011923 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011924 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011925 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011926 },
11927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011928 {
11929 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000011930 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011931 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011932 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011933 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011934 .total_size = 64,
11935 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011936 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000011937 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011938 .probe = probe_jedec,
11939 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000011940 .block_erasers =
11941 {
11942 {
11943 .eraseblocks = { {4 * 1024, 16} },
11944 .block_erase = erase_sector_jedec,
11945 }, {
11946 .eraseblocks = { {64 * 1024, 1} },
11947 .block_erase = erase_chip_block_jedec,
11948 }
11949 },
Sean Nelson35727f72010-01-28 23:55:12 +000011950 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011951 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011952 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000011953 },
11954
11955 {
11956 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011957 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011958 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011959 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011960 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011961 .total_size = 128,
11962 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011963 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011964 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011965 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000011966 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011967 .block_erasers =
11968 {
11969 {
11970 .eraseblocks = { {4 * 1024, 32} },
11971 .block_erase = erase_sector_jedec,
11972 }, {
11973 .eraseblocks = { {128 * 1024, 1} },
11974 .block_erase = erase_chip_block_jedec,
11975 }
11976 },
Sean Nelson35727f72010-01-28 23:55:12 +000011977 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011978 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011979 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011980 },
11981
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011982 {
11983 .vendor = "SST",
11984 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011985 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011986 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011987 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011988 .total_size = 256,
11989 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011990 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000011991 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011992 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011993 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011994 .block_erasers =
11995 {
11996 {
11997 .eraseblocks = { {4 * 1024, 64} },
11998 .block_erase = erase_sector_jedec,
11999 }, {
12000 .eraseblocks = { {256 * 1024, 1} },
12001 .block_erase = erase_chip_block_jedec,
12002 }
12003 },
Sean Nelson35727f72010-01-28 23:55:12 +000012004 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012005 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012006 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012007 },
12008
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012009 {
12010 .vendor = "SST",
12011 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012012 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012013 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012014 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012015 .total_size = 512,
12016 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012017 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000012018 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012019 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012020 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012021 .block_erasers =
12022 {
12023 {
12024 .eraseblocks = { {4 * 1024, 128} },
12025 .block_erase = erase_sector_jedec,
12026 }, {
12027 .eraseblocks = { {512 * 1024, 1} },
12028 .block_erase = erase_chip_block_jedec,
12029 }
12030 },
Sean Nelson35727f72010-01-28 23:55:12 +000012031 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012032 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012033 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012034 },
12035
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012036 {
12037 .vendor = "SST",
12038 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012039 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012040 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012041 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012042 .total_size = 64,
12043 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012044 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000012045 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012046 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012047 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012048 .block_erasers =
12049 {
12050 {
12051 .eraseblocks = { {4 * 1024, 16} },
12052 .block_erase = erase_sector_jedec,
12053 }, {
12054 .eraseblocks = { {64 * 1024, 1} },
12055 .block_erase = erase_chip_block_jedec,
12056 }
12057 },
Sean Nelson35727f72010-01-28 23:55:12 +000012058 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012059 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012060 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012061 },
12062
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012063 {
12064 .vendor = "SST",
12065 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012066 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012067 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012068 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012069 .total_size = 128,
12070 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012071 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000012072 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012073 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012074 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012075 .block_erasers =
12076 {
12077 {
12078 .eraseblocks = { {4 * 1024, 32} },
12079 .block_erase = erase_sector_jedec,
12080 }, {
12081 .eraseblocks = { {128 * 1024, 1} },
12082 .block_erase = erase_chip_block_jedec,
12083 }
12084 },
Sean Nelson35727f72010-01-28 23:55:12 +000012085 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012087 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012088 },
12089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012090 {
12091 .vendor = "SST",
12092 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012093 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012094 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012095 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012096 .total_size = 256,
12097 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012098 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000012099 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012100 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012101 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012102 .block_erasers =
12103 {
12104 {
12105 .eraseblocks = { {4 * 1024, 64} },
12106 .block_erase = erase_sector_jedec,
12107 }, {
12108 .eraseblocks = { {256 * 1024, 1} },
12109 .block_erase = erase_chip_block_jedec,
12110 }
12111 },
Sean Nelson35727f72010-01-28 23:55:12 +000012112 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012113 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012114 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012115 },
12116
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012117 {
12118 .vendor = "SST",
12119 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012120 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012121 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012122 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012123 .total_size = 512,
12124 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012125 .feature_bits = FEATURE_EITHER_RESET,
12126 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012127 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012128 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012129 .block_erasers =
12130 {
12131 {
12132 .eraseblocks = { {4 * 1024, 128} },
12133 .block_erase = erase_sector_jedec,
12134 }, {
12135 .eraseblocks = { {512 * 1024, 1} },
12136 .block_erase = erase_chip_block_jedec,
12137 }
12138 },
Sean Nelson35727f72010-01-28 23:55:12 +000012139 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012140 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012141 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000012142 },
FENG yu ningff692fb2008-12-08 18:15:10 +000012143
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012144 {
12145 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000012146 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012147 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000012148 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012149 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000012150 .total_size = 1024,
12151 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012152 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000012153 .tested = TEST_UNTESTED,
12154 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012155 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012156 .block_erasers =
12157 {
12158 {
12159 .eraseblocks = { {4 * 1024, 256} },
12160 .block_erase = erase_sector_jedec,
12161 }, {
12162 .eraseblocks = { {64 * 1024, 16} },
12163 .block_erase = erase_block_jedec,
12164 }, {
12165 .eraseblocks = { {1024 * 1024, 1} },
12166 .block_erase = erase_chip_block_jedec,
12167 }
12168 },
Sean Nelson35727f72010-01-28 23:55:12 +000012169 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012170 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012171 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000012172 },
12173
12174 {
12175 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012176 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012177 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012178 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012179 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012180 .total_size = 256,
12181 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012182 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000012183 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012184 .probe = probe_jedec,
12185 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012186 .block_erasers =
12187 {
12188 {
12189 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012190 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012191 }, {
12192 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012193 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012194 }, {
12195 .eraseblocks = { {256 * 1024, 1} },
12196 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
12197 }
12198 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012199 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012200 .unlock = unlock_sst_fwhub,
12201 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012202 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012203 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012204 },
12205
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012206 {
12207 .vendor = "SST",
12208 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012209 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012210 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012211 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012212 .total_size = 384,
12213 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012214 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000012215 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012216 .probe = probe_jedec,
12217 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012218 .block_erasers =
12219 {
12220 {
12221 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012222 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012223 }, {
12224 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012225 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012226 }, {
12227 .eraseblocks = { {384 * 1024, 1} },
12228 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
12229 }
12230 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012231 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012232 .unlock = unlock_sst_fwhub,
12233 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012234 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012235 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012236 },
12237
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012238 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000012239 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
12240 * and is only honored for 64k block erase, but not 4k sector erase.
12241 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012242 .vendor = "SST",
12243 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012244 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012245 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012246 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012247 .total_size = 512,
12248 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012249 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000012250 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012251 .probe = probe_jedec,
12252 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000012253 .block_erasers =
12254 {
12255 {
12256 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012257 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000012258 }, {
12259 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012260 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000012261 }, {
12262 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000012263 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000012264 },
12265 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012266 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012267 .unlock = unlock_sst_fwhub,
12268 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012269 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012270 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012271 },
12272
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012273 {
12274 .vendor = "SST",
12275 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012276 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012277 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012278 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012279 .total_size = 512,
12280 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012281 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012282 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012283 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012284 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012285 .block_erasers =
12286 {
12287 {
12288 .eraseblocks = { {4 * 1024, 128} },
12289 .block_erase = erase_sector_49lfxxxc,
12290 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000012291 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000012292 {64 * 1024, 7},
12293 {32 * 1024, 1},
12294 {8 * 1024, 2},
12295 {16 * 1024, 1},
12296 },
Sean Nelson69e58112010-03-23 17:10:28 +000012297 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012298 }
12299 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012300 .printlock = printlock_regspace2_block_eraser_1,
12301 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012302 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012303 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012304 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012305 },
12306
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012307 {
12308 .vendor = "SST",
12309 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012310 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012311 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012312 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012313 .total_size = 1024,
12314 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012315 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012316 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012317 .probe = probe_jedec,
12318 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012319 .block_erasers =
12320 {
12321 {
12322 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012323 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012324 }, {
12325 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012326 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012327 }, {
12328 .eraseblocks = { {1024 * 1024, 1} },
12329 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
12330 }
12331 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012332 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000012333 .unlock = unlock_sst_fwhub,
12334 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012335 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012336 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012337 },
12338
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012339 {
12340 .vendor = "SST",
12341 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012342 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012343 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012344 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012345 .total_size = 1024,
12346 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012347 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012348 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012349 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012350 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012351 .block_erasers =
12352 {
12353 {
12354 .eraseblocks = { {4 * 1024, 256} },
12355 .block_erase = erase_sector_49lfxxxc,
12356 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000012357 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000012358 {64 * 1024, 15},
12359 {32 * 1024, 1},
12360 {8 * 1024, 2},
12361 {16 * 1024, 1},
12362 },
Sean Nelson69e58112010-03-23 17:10:28 +000012363 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012364 }
12365 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012366 .printlock = printlock_regspace2_block_eraser_1,
12367 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012368 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012369 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012370 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012371 },
12372
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012373 {
12374 .vendor = "SST",
12375 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012376 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012377 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012378 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012379 .total_size = 2048,
12380 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012381 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012382 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012383 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012384 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012385 .block_erasers =
12386 {
12387 {
12388 .eraseblocks = { {4 * 1024, 512} },
12389 .block_erase = erase_sector_49lfxxxc,
12390 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000012391 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000012392 {64 * 1024, 31},
12393 {32 * 1024, 1},
12394 {8 * 1024, 2},
12395 {16 * 1024, 1},
12396 },
Sean Nelson69e58112010-03-23 17:10:28 +000012397 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012398 }
12399 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012400 .printlock = printlock_regspace2_block_eraser_1,
12401 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012402 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012403 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012404 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012405 },
12406
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012407 {
12408 .vendor = "SST",
12409 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012410 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012411 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012412 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012413 .total_size = 256,
12414 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012415 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000012416 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012417 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012418 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012419 .block_erasers =
12420 {
12421 {
12422 .eraseblocks = { {4 * 1024, 64} },
12423 .block_erase = erase_sector_jedec,
12424 }, {
12425 .eraseblocks = { {16 * 1024, 16} },
12426 .block_erase = erase_block_jedec,
12427 }, {
12428 .eraseblocks = { {256 * 1024, 1} },
12429 .block_erase = NULL,
12430 }
12431 },
Sean Nelson35727f72010-01-28 23:55:12 +000012432 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012433 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012434 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000012435 },
12436
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012437 {
12438 .vendor = "SST",
12439 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012440 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012441 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012442 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012443 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000012444 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012445 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000012446 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012447 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012448 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012449 .block_erasers =
12450 {
12451 {
12452 .eraseblocks = { {4 * 1024, 64} },
12453 .block_erase = erase_sector_jedec,
12454 }, {
12455 .eraseblocks = { {16 * 1024, 16} },
12456 .block_erase = erase_block_jedec,
12457 }, {
12458 .eraseblocks = { {256 * 1024, 1} },
12459 .block_erase = NULL,
12460 }
12461 },
Sean Nelson35727f72010-01-28 23:55:12 +000012462 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012463 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012464 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012465 },
12466
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012467 {
12468 .vendor = "SST",
12469 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012470 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012471 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012472 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012473 .total_size = 512,
12474 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012475 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012476 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012477 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012478 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012479 .block_erasers =
12480 {
12481 {
12482 .eraseblocks = { {4 * 1024, 128} },
12483 .block_erase = erase_sector_jedec,
12484 }, {
12485 .eraseblocks = { {64 * 1024, 8} },
12486 .block_erase = erase_block_jedec,
12487 }, {
12488 .eraseblocks = { {512 * 1024, 1} },
12489 .block_erase = NULL,
12490 }
12491 },
Sean Nelson35727f72010-01-28 23:55:12 +000012492 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012493 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012494 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012495 },
12496
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012497 {
12498 .vendor = "SST",
12499 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012500 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012501 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012502 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012503 .total_size = 512,
12504 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000012505 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012506 .tested = TEST_OK_PR,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012507 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012508 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012509 .block_erasers =
12510 {
12511 {
12512 .eraseblocks = { {4 * 1024, 128} },
12513 .block_erase = erase_sector_jedec,
12514 }, {
12515 .eraseblocks = { {64 * 1024, 8} },
12516 .block_erase = erase_block_jedec,
12517 }, {
12518 .eraseblocks = { {512 * 1024, 1} },
12519 .block_erase = NULL,
12520 }
12521 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012522 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000012523 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012524 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012525 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012526 },
12527
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012528 {
12529 .vendor = "SST",
12530 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012531 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012532 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012533 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012534 .total_size = 1024,
12535 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012536 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000012537 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012538 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012539 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012540 .block_erasers =
12541 {
12542 {
12543 .eraseblocks = { {4 * 1024, 256} },
12544 .block_erase = erase_sector_jedec,
12545 }, {
12546 .eraseblocks = { {64 * 1024, 16} },
12547 .block_erase = erase_block_jedec,
12548 }, {
12549 .eraseblocks = { {1024 * 1024, 1} },
12550 .block_erase = NULL,
12551 }
12552 },
Sean Nelson35727f72010-01-28 23:55:12 +000012553 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012554 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012555 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012556 },
12557
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012558 {
12559 .vendor = "SST",
12560 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012561 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012562 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012563 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012564 .total_size = 2048,
12565 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012566 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012567 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012568 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012569 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012570 .block_erasers =
12571 {
12572 {
12573 .eraseblocks = { {4 * 1024, 512} },
12574 .block_erase = erase_sector_49lfxxxc,
12575 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000012576 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000012577 {64 * 1024, 31},
12578 {32 * 1024, 1},
12579 {8 * 1024, 2},
12580 {16 * 1024, 1},
12581 },
Sean Nelson69e58112010-03-23 17:10:28 +000012582 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012583 }
12584 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012585 .printlock = printlock_regspace2_block_eraser_1,
12586 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012587 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012588 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012589 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012590 },
12591
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012592 {
12593 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012594 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012595 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012596 .manufacture_id = ST_ID,
12597 .model_id = ST_M29F002B,
12598 .total_size = 256,
12599 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012600 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012601 .tested = TEST_UNTESTED,
12602 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012603 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012604 .block_erasers =
12605 {
12606 {
12607 .eraseblocks = {
12608 {16 * 1024, 1},
12609 {8 * 1024, 2},
12610 {32 * 1024, 1},
12611 {64 * 1024, 3},
12612 },
12613 .block_erase = erase_sector_jedec,
12614 }, {
12615 .eraseblocks = { {256 * 1024, 1} },
12616 .block_erase = erase_chip_block_jedec,
12617 }
12618 },
Sean Nelson35727f72010-01-28 23:55:12 +000012619 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012620 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012621 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000012622 },
12623
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012624 {
12625 .vendor = "ST",
12626 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012627 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012628 .manufacture_id = ST_ID,
12629 .model_id = ST_M29F002T,
12630 .total_size = 256,
12631 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012632 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012633 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012634 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012635 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012636 .block_erasers =
12637 {
12638 {
12639 .eraseblocks = {
12640 {64 * 1024, 3},
12641 {32 * 1024, 1},
12642 {8 * 1024, 2},
12643 {16 * 1024, 1},
12644 },
12645 .block_erase = erase_sector_jedec,
12646 }, {
12647 .eraseblocks = { {256 * 1024, 1} },
12648 .block_erase = erase_chip_block_jedec,
12649 }
12650 },
Sean Nelson35727f72010-01-28 23:55:12 +000012651 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012652 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012653 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000012654 },
12655
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012656 {
12657 .vendor = "ST",
12658 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012659 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012660 .manufacture_id = ST_ID,
12661 .model_id = ST_M29F040B,
12662 .total_size = 512,
12663 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012664 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12665 .tested = TEST_UNTESTED,
12666 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000012667 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000012668 .block_erasers =
12669 {
12670 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012671 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000012672 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012673 }, {
12674 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000012675 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012676 }
12677 },
Sean Nelson35727f72010-01-28 23:55:12 +000012678 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012679 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012680 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012681 },
12682
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012683 {
Sean Nelson35727f72010-01-28 23:55:12 +000012684 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012685 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012686 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012687 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012688 .manufacture_id = ST_ID,
12689 .model_id = ST_M29F400BB,
12690 .total_size = 512,
12691 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012692 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012693 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012694 .probe = probe_jedec,
12695 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012696 .block_erasers =
12697 {
12698 {
12699 .eraseblocks = {
12700 {16 * 1024, 1},
12701 {8 * 1024, 2},
12702 {32 * 1024, 1},
12703 {64 * 1024, 7},
12704 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012705 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012706 }, {
12707 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012708 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012709 }
12710 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012711 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012712 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012713 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012714 },
12715 {
12716 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
12717 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012718 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012719 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012720 .manufacture_id = ST_ID,
12721 .model_id = ST_M29F400BT,
12722 .total_size = 512,
12723 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012724 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012725 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012726 .probe = probe_jedec,
12727 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000012728 .block_erasers =
12729 {
12730 {
12731 .eraseblocks = {
12732 {64 * 1024, 7},
12733 {32 * 1024, 1},
12734 {8 * 1024, 2},
12735 {16 * 1024, 1},
12736 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012737 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012738 }, {
12739 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012740 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012741 }
12742 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012743 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012744 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012745 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012746 },
12747
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012748 {
12749 .vendor = "ST",
12750 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012751 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012752 .manufacture_id = ST_ID,
12753 .model_id = ST_M29W010B,
12754 .total_size = 128,
12755 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012756 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012757 .tested = TEST_UNTESTED,
12758 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012759 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012760 .block_erasers =
12761 {
12762 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012763 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012764 .block_erase = erase_sector_jedec,
12765 }, {
12766 .eraseblocks = { {128 * 1024, 1} },
12767 .block_erase = erase_chip_block_jedec,
12768 }
12769 },
Sean Nelson35727f72010-01-28 23:55:12 +000012770 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012771 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012772 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012773 },
12774
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012775 {
12776 .vendor = "ST",
12777 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012778 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012779 .manufacture_id = ST_ID,
12780 .model_id = ST_M29W040B,
12781 .total_size = 512,
12782 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012783 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012784 .tested = TEST_UNTESTED,
12785 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012786 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012787 .block_erasers =
12788 {
12789 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012790 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012791 .block_erase = erase_sector_jedec,
12792 }, {
12793 .eraseblocks = { {512 * 1024, 1} },
12794 .block_erase = erase_chip_block_jedec,
12795 }
12796 },
Sean Nelson35727f72010-01-28 23:55:12 +000012797 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012798 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012799 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012800 },
12801
Stefan Taunereb582572012-09-21 12:52:50 +000012802 {
12803 .vendor = "ST",
12804 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012805 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000012806 .manufacture_id = ST_ID,
12807 .model_id = ST_M29W512B,
12808 .total_size = 64,
12809 .page_size = 64 * 1024,
12810 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012811 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000012812 .probe = probe_jedec,
12813 .probe_timing = TIMING_ZERO,
12814 .block_erasers =
12815 {
12816 {
12817 .eraseblocks = { {64 * 1024, 1} },
12818 .block_erase = erase_chip_block_jedec,
12819 }
12820 },
12821 .write = write_jedec_1,
12822 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012823 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000012824 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000012825
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012826 {
12827 .vendor = "ST",
12828 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012829 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012830 .manufacture_id = ST_ID,
12831 .model_id = ST_M50FLW040A,
12832 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000012833 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012834 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012835 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012836 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012837 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012838 .block_erasers =
12839 {
12840 {
Sean Nelson329bde72010-01-19 16:39:19 +000012841 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012842 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012843 {64 * 1024, 5}, /* block */
12844 {4 * 1024, 16}, /* sector */
12845 {4 * 1024, 16}, /* sector */
12846 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012847 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012848 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012849 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000012850 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012851 }
12852 },
Sean Nelson28accc22010-03-19 18:47:06 +000012853 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012854 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012855 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012856 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012857 },
12858
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012859 {
12860 .vendor = "ST",
12861 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012862 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012863 .manufacture_id = ST_ID,
12864 .model_id = ST_M50FLW040B,
12865 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000012866 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012867 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012868 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012869 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012870 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012871 .block_erasers =
12872 {
12873 {
Sean Nelson329bde72010-01-19 16:39:19 +000012874 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012875 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012876 {4 * 1024, 16}, /* sector */
12877 {64 * 1024, 5}, /* block */
12878 {4 * 1024, 16}, /* sector */
12879 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012880 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012881 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012882 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000012883 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012884 }
12885 },
Sean Nelson28accc22010-03-19 18:47:06 +000012886 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012887 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012888 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012889 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012890 },
12891
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012892 {
12893 .vendor = "ST",
12894 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012895 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012896 .manufacture_id = ST_ID,
12897 .model_id = ST_M50FLW080A,
12898 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000012899 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012900 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012901 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000012902 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012903 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012904 .block_erasers =
12905 {
12906 {
Sean Nelson329bde72010-01-19 16:39:19 +000012907 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012908 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012909 {64 * 1024, 13}, /* block */
12910 {4 * 1024, 16}, /* sector */
12911 {4 * 1024, 16}, /* sector */
12912 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012913 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012914 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012915 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000012916 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012917 }
12918 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012919 .printlock = printlock_regspace2_block_eraser_0,
12920 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012921 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012922 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012923 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012924 },
12925
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012926 {
12927 .vendor = "ST",
12928 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012929 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012930 .manufacture_id = ST_ID,
12931 .model_id = ST_M50FLW080B,
12932 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000012933 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012934 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012935 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012936 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012937 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012938 .block_erasers =
12939 {
12940 {
Sean Nelson329bde72010-01-19 16:39:19 +000012941 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012942 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012943 {4 * 1024, 16}, /* sector */
12944 {64 * 1024, 13}, /* block */
12945 {4 * 1024, 16}, /* sector */
12946 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012947 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012948 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012949 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000012950 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012951 }
12952 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012953 .printlock = printlock_regspace2_block_eraser_0,
12954 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012955 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012956 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012957 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012958 },
12959
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012960 {
12961 .vendor = "ST",
12962 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012963 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012964 .manufacture_id = ST_ID,
12965 .model_id = ST_M50FW002,
12966 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000012967 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012968 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012969 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000012970 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012971 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000012972 .block_erasers =
12973 {
12974 {
12975 .eraseblocks = {
12976 {64 * 1024, 3},
12977 {32 * 1024, 1},
12978 {8 * 1024, 2},
12979 {16 * 1024, 1},
12980 },
Sean Nelson28accc22010-03-19 18:47:06 +000012981 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012982 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000012983 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012984 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000012985 }
12986 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012987 .printlock = printlock_regspace2_block_eraser_0,
12988 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012989 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012990 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012991 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012992 },
12993
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012994 {
12995 .vendor = "ST",
12996 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012997 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012998 .manufacture_id = ST_ID,
12999 .model_id = ST_M50FW016,
13000 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000013001 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013002 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013003 .tested = TEST_UNTESTED,
13004 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013005 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000013006 .block_erasers =
13007 {
13008 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013009 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000013010 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000013011 }
13012 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013013 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000013014 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013015 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013016 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000013017 },
13018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013019 {
13020 .vendor = "ST",
13021 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013022 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013023 .manufacture_id = ST_ID,
13024 .model_id = ST_M50FW040,
13025 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000013026 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013027 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000013028 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013029 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013030 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000013031 .block_erasers =
13032 {
13033 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013034 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000013035 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000013036 }
13037 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013038 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000013039 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013040 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013041 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000013042 },
13043
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013044 {
13045 .vendor = "ST",
13046 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013047 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013048 .manufacture_id = ST_ID,
13049 .model_id = ST_M50FW080,
13050 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000013051 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013052 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013053 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013054 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000013055 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000013056 .block_erasers =
13057 {
13058 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013059 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000013060 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000013061 }
13062 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013063 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000013064 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013065 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013066 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000013067 },
13068
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013069 {
13070 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000013071 .name = "M50LPW080",
13072 .bustype = BUS_LPC, /* A/A Mux */
13073 .manufacture_id = ST_ID,
13074 .model_id = ST_M50LPW080,
13075 .total_size = 1024,
13076 .page_size = 0,
13077 .feature_bits = FEATURE_REGISTERMAP,
13078 .tested = TEST_UNTESTED,
13079 .probe = probe_82802ab,
13080 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13081 .block_erasers =
13082 {
13083 {
Stefan Tauner6697f712014-08-06 15:09:15 +000013084 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000013085 .block_erase = erase_block_82802ab,
13086 }
13087 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013088 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000013089 .write = write_82802ab,
13090 .read = read_memmapped,
13091 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
13092 },
13093
13094 {
13095 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013096 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013097 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013098 .manufacture_id = ST_ID,
13099 .model_id = ST_M50LPW116,
13100 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000013101 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000013102 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013103 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000013104 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000013105 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013106 .block_erasers =
13107 {
13108 {
13109 .eraseblocks = {
13110 {4 * 1024, 16},
13111 {64 * 1024, 30},
13112 {32 * 1024, 1},
13113 {8 * 1024, 2},
13114 {16 * 1024, 1},
13115 },
Sean Nelson28accc22010-03-19 18:47:06 +000013116 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000013117 }
13118 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013119 .printlock = printlock_regspace2_block_eraser_0,
13120 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000013121 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013122 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013123 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000013124 },
13125
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013126 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000013127 .vendor = "SyncMOS/MoselVitelic",
13128 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013129 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013130 .manufacture_id = SYNCMOS_MVC_ID,
13131 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013132 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013133 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000013134 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013135 .tested = TEST_UNTESTED,
13136 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013137 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013138 .block_erasers =
13139 {
13140 {
13141 .eraseblocks = { {512, 256} },
13142 .block_erase = erase_sector_jedec,
13143 }, {
13144 .eraseblocks = { {128 * 1024, 1} },
13145 .block_erase = erase_chip_block_jedec,
13146 },
13147 },
Sean Nelson35727f72010-01-28 23:55:12 +000013148 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013149 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013150 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013151 },
13152
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013153 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000013154 .vendor = "SyncMOS/MoselVitelic",
13155 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013156 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013157 .manufacture_id = SYNCMOS_MVC_ID,
13158 .model_id = SM_MVC_29C51001T,
13159 .total_size = 128,
13160 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000013161 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013162 .tested = TEST_UNTESTED,
13163 .probe = probe_jedec,
13164 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13165 .block_erasers =
13166 {
13167 {
13168 .eraseblocks = { {512, 256} },
13169 .block_erase = erase_sector_jedec,
13170 }, {
13171 .eraseblocks = { {128 * 1024, 1} },
13172 .block_erase = erase_chip_block_jedec,
13173 },
13174 },
13175 .write = write_jedec_1,
13176 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013177 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000013178 },
13179
13180 {
13181 .vendor = "SyncMOS/MoselVitelic",
13182 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013183 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013184 .manufacture_id = SYNCMOS_MVC_ID,
13185 .model_id = SM_MVC_29C51002B,
13186 .total_size = 256,
13187 .page_size = 512,
13188 .feature_bits = FEATURE_EITHER_RESET,
13189 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013190 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013191 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013192 .block_erasers =
13193 {
13194 {
13195 .eraseblocks = { {512, 512} },
13196 .block_erase = erase_sector_jedec,
13197 }, {
13198 .eraseblocks = { {256 * 1024, 1} },
13199 .block_erase = erase_chip_block_jedec,
13200 },
13201 },
Sean Nelson35727f72010-01-28 23:55:12 +000013202 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013203 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000013204 },
13205
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013206 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000013207 .vendor = "SyncMOS/MoselVitelic",
13208 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013209 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013210 .manufacture_id = SYNCMOS_MVC_ID,
13211 .model_id = SM_MVC_29C51002T,
13212 .total_size = 256,
13213 .page_size = 512,
13214 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013215 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013216 .probe = probe_jedec,
13217 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13218 .block_erasers =
13219 {
13220 {
13221 .eraseblocks = { {512, 512} },
13222 .block_erase = erase_sector_jedec,
13223 }, {
13224 .eraseblocks = { {256 * 1024, 1} },
13225 .block_erase = erase_chip_block_jedec,
13226 },
13227 },
13228 .write = write_jedec_1,
13229 .read = read_memmapped,
13230 },
13231
13232 {
13233 .vendor = "SyncMOS/MoselVitelic",
13234 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013235 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013236 .manufacture_id = SYNCMOS_MVC_ID,
13237 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013238 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013239 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013240 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013241 .tested = TEST_UNTESTED,
13242 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013243 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000013244 .block_erasers =
13245 {
13246 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000013247 .eraseblocks = { {1024, 512} },
13248 .block_erase = erase_sector_jedec,
13249 }, {
13250 .eraseblocks = { {512 * 1024, 1} },
13251 .block_erase = erase_chip_block_jedec,
13252 },
13253 },
13254 .write = write_jedec_1,
13255 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013256 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000013257 },
13258
13259 {
13260 .vendor = "SyncMOS/MoselVitelic",
13261 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013262 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013263 .manufacture_id = SYNCMOS_MVC_ID,
13264 .model_id = SM_MVC_29C51004T,
13265 .total_size = 512,
13266 .page_size = 1024,
13267 .feature_bits = FEATURE_EITHER_RESET,
13268 .tested = TEST_UNTESTED,
13269 .probe = probe_jedec,
13270 .probe_timing = TIMING_ZERO,
13271 .block_erasers =
13272 {
13273 {
13274 .eraseblocks = { {1024, 512} },
13275 .block_erase = erase_sector_jedec,
13276 }, {
13277 .eraseblocks = { {512 * 1024, 1} },
13278 .block_erase = erase_chip_block_jedec,
13279 },
13280 },
13281 .write = write_jedec_1,
13282 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013283 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000013284 },
13285
13286 {
13287 .vendor = "SyncMOS/MoselVitelic",
13288 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013289 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013290 .manufacture_id = SYNCMOS_MVC_ID,
13291 .model_id = SM_MVC_29C31004B,
13292 .total_size = 512,
13293 .page_size = 1024,
13294 .feature_bits = FEATURE_EITHER_RESET,
13295 .tested = TEST_UNTESTED,
13296 .probe = probe_jedec,
13297 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13298 .block_erasers =
13299 {
13300 {
13301 .eraseblocks = { {1024, 512} },
13302 .block_erase = erase_sector_jedec,
13303 }, {
13304 .eraseblocks = { {512 * 1024, 1} },
13305 .block_erase = erase_chip_block_jedec,
13306 },
13307 },
13308 .write = write_jedec_1,
13309 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013310 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000013311 },
13312
13313 {
13314 .vendor = "SyncMOS/MoselVitelic",
13315 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013316 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000013317 .manufacture_id = SYNCMOS_MVC_ID,
13318 .model_id = SM_MVC_29C31004T,
13319 .total_size = 512,
13320 .page_size = 1024,
13321 .feature_bits = FEATURE_EITHER_RESET,
13322 .tested = TEST_UNTESTED,
13323 .probe = probe_jedec,
13324 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13325 .block_erasers =
13326 {
13327 {
13328 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000013329 .block_erase = erase_sector_jedec,
13330 }, {
13331 .eraseblocks = { {512 * 1024, 1} },
13332 .block_erase = erase_chip_block_jedec,
13333 },
13334 },
Sean Nelson35727f72010-01-28 23:55:12 +000013335 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013336 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013337 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013338 },
13339
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013340 {
Uwe Hermanna106d152009-05-27 23:17:40 +000013341 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013342 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013343 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013344 .manufacture_id = TI_OLD_ID,
13345 .model_id = TI_TMS29F002RB,
13346 .total_size = 256,
13347 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000013348 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013349 .tested = TEST_UNTESTED,
13350 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013351 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013352 .block_erasers =
13353 {
13354 {
13355 .eraseblocks = {
13356 {16 * 1024, 1},
13357 {8 * 1024, 2},
13358 {32 * 1024, 1},
13359 {64 * 1024, 3},
13360 },
13361 .block_erase = erase_sector_jedec,
13362 }, {
13363 .eraseblocks = { {256 * 1024, 1} },
13364 .block_erase = erase_chip_block_jedec,
13365 },
13366 },
Sean Nelson35727f72010-01-28 23:55:12 +000013367 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013368 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013369 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013370 },
13371
13372 {
Uwe Hermanna106d152009-05-27 23:17:40 +000013373 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013374 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013375 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013376 .manufacture_id = TI_OLD_ID,
13377 .model_id = TI_TMS29F002RT,
13378 .total_size = 256,
13379 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000013380 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013381 .tested = TEST_UNTESTED,
13382 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013383 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000013384 .block_erasers =
13385 {
13386 {
13387 .eraseblocks = {
13388 {64 * 1024, 3},
13389 {32 * 1024, 1},
13390 {8 * 1024, 2},
13391 {16 * 1024, 1},
13392 },
13393 .block_erase = erase_sector_jedec,
13394 }, {
13395 .eraseblocks = { {256 * 1024, 1} },
13396 .block_erase = erase_chip_block_jedec,
13397 },
13398 },
Sean Nelson35727f72010-01-28 23:55:12 +000013399 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013401 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000013402 },
13403
13404 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013405 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000013406 .name = "W25Q40.V",
13407 .bustype = BUS_SPI,
13408 .manufacture_id = WINBOND_NEX_ID,
13409 .model_id = WINBOND_NEX_W25Q40_V,
13410 .total_size = 512,
13411 .page_size = 256,
13412 /* supports SFDP */
13413 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13414 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +000013415 .tested = TEST_OK_PREW,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000013416 .probe = probe_spi_rdid,
13417 .probe_timing = TIMING_ZERO,
13418 .block_erasers =
13419 {
13420 {
13421 .eraseblocks = { {4 * 1024, 128} },
13422 .block_erase = spi_block_erase_20,
13423 }, {
13424 .eraseblocks = { {32 * 1024, 16} },
13425 .block_erase = spi_block_erase_52,
13426 }, {
13427 .eraseblocks = { {64 * 1024, 8} },
13428 .block_erase = spi_block_erase_d8,
13429 }, {
13430 .eraseblocks = { {512 * 1024, 1} },
13431 .block_erase = spi_block_erase_60,
13432 }, {
13433 .eraseblocks = { {512 * 1024, 1} },
13434 .block_erase = spi_block_erase_c7,
13435 }
13436 },
13437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13438 .unlock = spi_disable_blockprotect,
13439 .write = spi_chip_write_256, /* Multi I/O supported */
13440 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13441 .voltage = {2700, 3600},
13442 },
13443
13444 {
13445 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013446 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013447 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013448 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013449 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013450 .total_size = 1024,
13451 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013452 /* supports SFDP */
13453 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013454 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000013455 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013456 .probe = probe_spi_rdid,
13457 .probe_timing = TIMING_ZERO,
13458 .block_erasers =
13459 {
13460 {
13461 .eraseblocks = { {4 * 1024, 256} },
13462 .block_erase = spi_block_erase_20,
13463 }, {
13464 .eraseblocks = { {32 * 1024, 32} },
13465 .block_erase = spi_block_erase_52,
13466 }, {
13467 .eraseblocks = { {64 * 1024, 16} },
13468 .block_erase = spi_block_erase_d8,
13469 }, {
13470 .eraseblocks = { {1024 * 1024, 1} },
13471 .block_erase = spi_block_erase_60,
13472 }, {
13473 .eraseblocks = { {1024 * 1024, 1} },
13474 .block_erase = spi_block_erase_c7,
13475 }
13476 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013477 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013478 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013479 .write = spi_chip_write_256,
13480 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013481 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013482 },
13483
13484 {
13485 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013486 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013487 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013488 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013489 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013490 .total_size = 2048,
13491 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013492 /* supports SFDP */
13493 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000013495 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013496 .probe = probe_spi_rdid,
13497 .probe_timing = TIMING_ZERO,
13498 .block_erasers =
13499 {
13500 {
13501 .eraseblocks = { {4 * 1024, 512} },
13502 .block_erase = spi_block_erase_20,
13503 }, {
13504 .eraseblocks = { {32 * 1024, 64} },
13505 .block_erase = spi_block_erase_52,
13506 }, {
13507 .eraseblocks = { {64 * 1024, 32} },
13508 .block_erase = spi_block_erase_d8,
13509 }, {
13510 .eraseblocks = { {2 * 1024 * 1024, 1} },
13511 .block_erase = spi_block_erase_60,
13512 }, {
13513 .eraseblocks = { {2 * 1024 * 1024, 1} },
13514 .block_erase = spi_block_erase_c7,
13515 }
13516 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013517 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013518 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013519 .write = spi_chip_write_256,
13520 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013521 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013522 },
13523
13524 {
13525 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013526 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013527 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013528 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013529 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013530 .total_size = 4096,
13531 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013532 /* supports SFDP */
13533 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013534 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000013535 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013536 .probe = probe_spi_rdid,
13537 .probe_timing = TIMING_ZERO,
13538 .block_erasers =
13539 {
13540 {
13541 .eraseblocks = { {4 * 1024, 1024} },
13542 .block_erase = spi_block_erase_20,
13543 }, {
13544 .eraseblocks = { {32 * 1024, 128} },
13545 .block_erase = spi_block_erase_52,
13546 }, {
13547 .eraseblocks = { {64 * 1024, 64} },
13548 .block_erase = spi_block_erase_d8,
13549 }, {
13550 .eraseblocks = { {4 * 1024 * 1024, 1} },
13551 .block_erase = spi_block_erase_60,
13552 }, {
13553 .eraseblocks = { {4 * 1024 * 1024, 1} },
13554 .block_erase = spi_block_erase_c7,
13555 }
13556 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013557 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013558 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013559 .write = spi_chip_write_256,
13560 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013561 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013562 },
13563
13564 {
13565 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013566 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013567 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000013568 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013569 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000013570 .total_size = 8192,
13571 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013572 /* supports SFDP */
13573 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013574 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000013575 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000013576 .probe = probe_spi_rdid,
13577 .probe_timing = TIMING_ZERO,
13578 .block_erasers =
13579 {
13580 {
13581 .eraseblocks = { {4 * 1024, 2048} },
13582 .block_erase = spi_block_erase_20,
13583 }, {
13584 .eraseblocks = { {32 * 1024, 256} },
13585 .block_erase = spi_block_erase_52,
13586 }, {
13587 .eraseblocks = { {64 * 1024, 128} },
13588 .block_erase = spi_block_erase_d8,
13589 }, {
13590 .eraseblocks = { {8 * 1024 * 1024, 1} },
13591 .block_erase = spi_block_erase_60,
13592 }, {
13593 .eraseblocks = { {8 * 1024 * 1024, 1} },
13594 .block_erase = spi_block_erase_c7,
13595 }
13596 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013597 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013598 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000013599 .write = spi_chip_write_256,
13600 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013601 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000013602 },
13603
13604 {
13605 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013606 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013607 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013608 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013609 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013610 .total_size = 16384,
13611 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013612 /* supports SFDP */
13613 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013614 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013615 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013616 .probe = probe_spi_rdid,
13617 .probe_timing = TIMING_ZERO,
13618 .block_erasers =
13619 {
13620 {
13621 .eraseblocks = { {4 * 1024, 4096} },
13622 .block_erase = spi_block_erase_20,
13623 }, {
13624 .eraseblocks = { {32 * 1024, 512} },
13625 .block_erase = spi_block_erase_52,
13626 }, {
13627 .eraseblocks = { {64 * 1024, 256} },
13628 .block_erase = spi_block_erase_d8,
13629 }, {
13630 .eraseblocks = { {16 * 1024 * 1024, 1} },
13631 .block_erase = spi_block_erase_60,
13632 }, {
13633 .eraseblocks = { {16 * 1024 * 1024, 1} },
13634 .block_erase = spi_block_erase_c7,
13635 }
13636 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013637 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000013638 .unlock = spi_disable_blockprotect,
13639 .write = spi_chip_write_256,
13640 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013641 .voltage = {2700, 3600},
13642 },
13643
13644 {
13645 .vendor = "Winbond",
13646 .name = "W25Q20.W",
13647 .bustype = BUS_SPI,
13648 .manufacture_id = WINBOND_NEX_ID,
13649 .model_id = WINBOND_NEX_W25Q20_W,
13650 .total_size = 256,
13651 .page_size = 256,
13652 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13654 .tested = TEST_UNTESTED,
13655 .probe = probe_spi_rdid,
13656 .probe_timing = TIMING_ZERO,
13657 .block_erasers =
13658 {
13659 {
13660 .eraseblocks = { {4 * 1024, 64} },
13661 .block_erase = spi_block_erase_20,
13662 }, {
13663 .eraseblocks = { {32 * 1024, 8} },
13664 .block_erase = spi_block_erase_52,
13665 }, {
13666 .eraseblocks = { {64 * 1024, 4} },
13667 .block_erase = spi_block_erase_d8,
13668 }, {
13669 .eraseblocks = { {256 * 1024, 1} },
13670 .block_erase = spi_block_erase_60,
13671 }, {
13672 .eraseblocks = { {256 * 1024, 1} },
13673 .block_erase = spi_block_erase_c7,
13674 }
13675 },
13676 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13677 .unlock = spi_disable_blockprotect,
13678 .write = spi_chip_write_256,
13679 .read = spi_chip_read,
13680 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13681 },
13682
13683 {
13684 .vendor = "Winbond",
13685 .name = "W25Q40.W",
13686 .bustype = BUS_SPI,
13687 .manufacture_id = WINBOND_NEX_ID,
13688 .model_id = WINBOND_NEX_W25Q40_W,
13689 .total_size = 512,
13690 .page_size = 256,
13691 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13692 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13693 .tested = TEST_UNTESTED,
13694 .probe = probe_spi_rdid,
13695 .probe_timing = TIMING_ZERO,
13696 .block_erasers =
13697 {
13698 {
13699 .eraseblocks = { {4 * 1024, 128} },
13700 .block_erase = spi_block_erase_20,
13701 }, {
13702 .eraseblocks = { {32 * 1024, 16} },
13703 .block_erase = spi_block_erase_52,
13704 }, {
13705 .eraseblocks = { {64 * 1024, 8} },
13706 .block_erase = spi_block_erase_d8,
13707 }, {
13708 .eraseblocks = { {512 * 1024, 1} },
13709 .block_erase = spi_block_erase_60,
13710 }, {
13711 .eraseblocks = { {512 * 1024, 1} },
13712 .block_erase = spi_block_erase_c7,
13713 }
13714 },
13715 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13716 .unlock = spi_disable_blockprotect,
13717 .write = spi_chip_write_256,
13718 .read = spi_chip_read,
13719 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13720 },
13721
13722 {
13723 .vendor = "Winbond",
13724 .name = "W25Q80.W",
13725 .bustype = BUS_SPI,
13726 .manufacture_id = WINBOND_NEX_ID,
13727 .model_id = WINBOND_NEX_W25Q80_W,
13728 .total_size = 1024,
13729 .page_size = 256,
13730 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13731 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13732 .tested = TEST_UNTESTED,
13733 .probe = probe_spi_rdid,
13734 .probe_timing = TIMING_ZERO,
13735 .block_erasers =
13736 {
13737 {
13738 .eraseblocks = { {4 * 1024, 256} },
13739 .block_erase = spi_block_erase_20,
13740 }, {
13741 .eraseblocks = { {32 * 1024, 32} },
13742 .block_erase = spi_block_erase_52,
13743 }, {
13744 .eraseblocks = { {64 * 1024, 16} },
13745 .block_erase = spi_block_erase_d8,
13746 }, {
13747 .eraseblocks = { {1 * 1024 * 1024, 1} },
13748 .block_erase = spi_block_erase_60,
13749 }, {
13750 .eraseblocks = { {1 * 1024 * 1024, 1} },
13751 .block_erase = spi_block_erase_c7,
13752 }
13753 },
13754 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13755 .unlock = spi_disable_blockprotect,
13756 .write = spi_chip_write_256,
13757 .read = spi_chip_read,
13758 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13759 },
13760
13761 {
13762 .vendor = "Winbond",
13763 .name = "W25Q16.W",
13764 .bustype = BUS_SPI,
13765 .manufacture_id = WINBOND_NEX_ID,
13766 .model_id = WINBOND_NEX_W25Q16_W,
13767 .total_size = 2048,
13768 .page_size = 256,
13769 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13770 /* QPI enable 0x38, disable 0xFF */
13771 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
13772 .tested = TEST_UNTESTED,
13773 .probe = probe_spi_rdid,
13774 .probe_timing = TIMING_ZERO,
13775 .block_erasers =
13776 {
13777 {
13778 .eraseblocks = { {4 * 1024, 512} },
13779 .block_erase = spi_block_erase_20,
13780 }, {
13781 .eraseblocks = { {32 * 1024, 64} },
13782 .block_erase = spi_block_erase_52,
13783 }, {
13784 .eraseblocks = { {64 * 1024, 32} },
13785 .block_erase = spi_block_erase_d8,
13786 }, {
13787 .eraseblocks = { {2 * 1024 * 1024, 1} },
13788 .block_erase = spi_block_erase_60,
13789 }, {
13790 .eraseblocks = { {2 * 1024 * 1024, 1} },
13791 .block_erase = spi_block_erase_c7,
13792 }
13793 },
13794 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13795 .unlock = spi_disable_blockprotect,
13796 .write = spi_chip_write_256,
13797 .read = spi_chip_read,
13798 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13799 },
13800
13801 {
13802 .vendor = "Winbond",
13803 .name = "W25Q32.W",
13804 .bustype = BUS_SPI,
13805 .manufacture_id = WINBOND_NEX_ID,
13806 .model_id = WINBOND_NEX_W25Q32_W,
13807 .total_size = 4096,
13808 .page_size = 256,
13809 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13810 /* QPI enable 0x38, disable 0xFF */
13811 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
13812 .tested = TEST_OK_PREW,
13813 .probe = probe_spi_rdid,
13814 .probe_timing = TIMING_ZERO,
13815 .block_erasers =
13816 {
13817 {
13818 .eraseblocks = { {4 * 1024, 1024} },
13819 .block_erase = spi_block_erase_20,
13820 }, {
13821 .eraseblocks = { {32 * 1024, 128} },
13822 .block_erase = spi_block_erase_52,
13823 }, {
13824 .eraseblocks = { {64 * 1024, 64} },
13825 .block_erase = spi_block_erase_d8,
13826 }, {
13827 .eraseblocks = { {4 * 1024 * 1024, 1} },
13828 .block_erase = spi_block_erase_60,
13829 }, {
13830 .eraseblocks = { {4 * 1024 * 1024, 1} },
13831 .block_erase = spi_block_erase_c7,
13832 }
13833 },
13834 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13835 .unlock = spi_disable_blockprotect,
13836 .write = spi_chip_write_256,
13837 .read = spi_chip_read,
13838 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13839 },
13840
13841 {
13842 .vendor = "Winbond",
13843 .name = "W25Q64.W",
13844 .bustype = BUS_SPI,
13845 .manufacture_id = WINBOND_NEX_ID,
13846 .model_id = WINBOND_NEX_W25Q64_W,
13847 .total_size = 8192,
13848 .page_size = 256,
13849 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13850 /* QPI enable 0x38, disable 0xFF */
13851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013852 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013853 .probe = probe_spi_rdid,
13854 .probe_timing = TIMING_ZERO,
13855 .block_erasers =
13856 {
13857 {
13858 .eraseblocks = { {4 * 1024, 2048} },
13859 .block_erase = spi_block_erase_20,
13860 }, {
13861 .eraseblocks = { {32 * 1024, 256} },
13862 .block_erase = spi_block_erase_52,
13863 }, {
13864 .eraseblocks = { {64 * 1024, 128} },
13865 .block_erase = spi_block_erase_d8,
13866 }, {
13867 .eraseblocks = { {8 * 1024 * 1024, 1} },
13868 .block_erase = spi_block_erase_60,
13869 }, {
13870 .eraseblocks = { {8 * 1024 * 1024, 1} },
13871 .block_erase = spi_block_erase_c7,
13872 }
13873 },
13874 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13875 .unlock = spi_disable_blockprotect,
13876 .write = spi_chip_write_256,
13877 .read = spi_chip_read,
13878 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000013879 },
13880
13881 {
13882 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013883 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013884 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013885 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013886 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013887 .total_size = 128,
13888 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013889 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013890 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013891 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013892 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013893 .block_erasers =
13894 {
13895 {
13896 .eraseblocks = { {4 * 1024, 32} },
13897 .block_erase = spi_block_erase_20,
13898 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013899 .eraseblocks = { {64 * 1024, 2} },
13900 .block_erase = spi_block_erase_d8,
13901 }, {
13902 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013903 .block_erase = spi_block_erase_c7,
13904 }
13905 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013906 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013907 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013908 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013909 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013910 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013911 },
13912
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013913 {
13914 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013915 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013916 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013917 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013918 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013919 .total_size = 256,
13920 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013921 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013922 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013923 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013924 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013925 .block_erasers =
13926 {
13927 {
13928 .eraseblocks = { {4 * 1024, 64} },
13929 .block_erase = spi_block_erase_20,
13930 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013931 .eraseblocks = { {64 * 1024, 4} },
13932 .block_erase = spi_block_erase_d8,
13933 }, {
13934 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013935 .block_erase = spi_block_erase_c7,
13936 }
13937 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013938 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013939 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013940 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013941 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013942 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013943 },
13944
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013945 {
13946 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013947 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013948 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013949 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013950 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013951 .total_size = 512,
13952 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013953 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000013954 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013955 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013956 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013957 .block_erasers =
13958 {
13959 {
13960 .eraseblocks = { {4 * 1024, 128} },
13961 .block_erase = spi_block_erase_20,
13962 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013963 .eraseblocks = { {64 * 1024, 8} },
13964 .block_erase = spi_block_erase_d8,
13965 }, {
13966 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013967 .block_erase = spi_block_erase_c7,
13968 }
13969 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013970 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013971 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013972 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013973 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013974 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013975 },
13976
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013977 {
13978 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013979 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013980 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013981 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013982 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013983 .total_size = 1024,
13984 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013985 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000013986 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013987 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013988 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013989 .block_erasers =
13990 {
13991 {
13992 .eraseblocks = { {4 * 1024, 256} },
13993 .block_erase = spi_block_erase_20,
13994 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013995 .eraseblocks = { {64 * 1024, 16} },
13996 .block_erase = spi_block_erase_d8,
13997 }, {
13998 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013999 .block_erase = spi_block_erase_c7,
14000 }
14001 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014002 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014003 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000014004 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014005 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014006 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014007 },
14008
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014009 {
14010 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014011 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014012 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000014013 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014014 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000014015 .total_size = 2048,
14016 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000014017 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000014018 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000014019 .probe = probe_spi_rdid,
14020 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014021 .block_erasers =
14022 {
14023 {
14024 .eraseblocks = { {4 * 1024, 512} },
14025 .block_erase = spi_block_erase_20,
14026 }, {
14027 .eraseblocks = { {32 * 1024, 64} },
14028 .block_erase = spi_block_erase_52,
14029 }, {
14030 .eraseblocks = { {64 * 1024, 32} },
14031 .block_erase = spi_block_erase_d8,
14032 }, {
14033 .eraseblocks = { {2 * 1024 * 1024, 1} },
14034 .block_erase = spi_block_erase_60,
14035 }, {
14036 .eraseblocks = { {2 * 1024 * 1024, 1} },
14037 .block_erase = spi_block_erase_c7,
14038 }
14039 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014040 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014041 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000014042 .write = spi_chip_write_256,
14043 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014044 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000014045 },
14046
14047 {
14048 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014049 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014050 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000014051 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014052 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000014053 .total_size = 4096,
14054 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000014055 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014056 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000014057 .probe = probe_spi_rdid,
14058 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014059 .block_erasers =
14060 {
14061 {
14062 .eraseblocks = { {4 * 1024, 1024} },
14063 .block_erase = spi_block_erase_20,
14064 }, {
14065 .eraseblocks = { {32 * 1024, 128} },
14066 .block_erase = spi_block_erase_52,
14067 }, {
14068 .eraseblocks = { {64 * 1024, 64} },
14069 .block_erase = spi_block_erase_d8,
14070 }, {
14071 .eraseblocks = { {4 * 1024 * 1024, 1} },
14072 .block_erase = spi_block_erase_60,
14073 }, {
14074 .eraseblocks = { {4 * 1024 * 1024, 1} },
14075 .block_erase = spi_block_erase_c7,
14076 }
14077 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014078 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014079 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000014080 .write = spi_chip_write_256,
14081 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014082 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000014083 },
14084
14085 {
14086 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014087 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014088 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000014089 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014090 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000014091 .total_size = 8192,
14092 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000014093 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014094 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000014095 .probe = probe_spi_rdid,
14096 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014097 .block_erasers =
14098 {
14099 {
14100 .eraseblocks = { {4 * 1024, 2048} },
14101 .block_erase = spi_block_erase_20,
14102 }, {
14103 .eraseblocks = { {32 * 1024, 256} },
14104 .block_erase = spi_block_erase_52,
14105 }, {
14106 .eraseblocks = { {64 * 1024, 128} },
14107 .block_erase = spi_block_erase_d8,
14108 }, {
14109 .eraseblocks = { {8 * 1024 * 1024, 1} },
14110 .block_erase = spi_block_erase_60,
14111 }, {
14112 .eraseblocks = { {8 * 1024 * 1024, 1} },
14113 .block_erase = spi_block_erase_c7,
14114 }
14115 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014116 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000014117 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000014118 .write = spi_chip_write_256,
14119 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014120 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000014121 },
14122
14123 {
14124 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000014125 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014126 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000014127 .manufacture_id = WINBOND_ID,
14128 .model_id = WINBOND_W29C010,
14129 .total_size = 128,
14130 .page_size = 128,
14131 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014132 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000014133 .probe = probe_w29ee011,
14134 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
14135 .block_erasers =
14136 {
14137 {
14138 .eraseblocks = { {128 * 1024, 1} },
14139 .block_erase = erase_chip_block_jedec,
14140 }
14141 },
14142 .write = write_jedec,
14143 .read = read_memmapped,
14144 },
14145
14146 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
14147 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000014148 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014149 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014150 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014151 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014152 .total_size = 128,
14153 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014154 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000014155 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014156 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014157 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014158 .block_erasers =
14159 {
14160 {
14161 .eraseblocks = { {128 * 1024, 1} },
14162 .block_erase = erase_chip_block_jedec,
14163 }
14164 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014165 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014166 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000014167 },
14168
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014169 {
14170 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000014171 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014172 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014173 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014174 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014175 .total_size = 256,
14176 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014177 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014178 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014179 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014180 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014181 .block_erasers =
14182 {
14183 {
14184 .eraseblocks = { {256 * 1024, 1} },
14185 .block_erase = erase_chip_block_jedec,
14186 }
14187 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014188 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014189 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014190 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014191 },
14192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014193 {
14194 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000014195 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014196 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014197 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014198 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014199 .total_size = 512,
14200 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000014201 .feature_bits = FEATURE_LONG_RESET,
14202 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014203 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014204 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014205 .block_erasers =
14206 {
14207 {
14208 .eraseblocks = { {512 * 1024, 1} },
14209 .block_erase = erase_chip_block_jedec,
14210 }
14211 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014212 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014213 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014214 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014215 },
14216
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014217 {
14218 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000014219 .name = "W29GL032CB",
14220 .bustype = BUS_PARALLEL,
14221 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14222 .model_id = WINBOND_W29GL032CB,
14223 .total_size = 4096,
14224 .page_size = 128 * 1024, /* actual page size is 16 */
14225 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14226 .tested = TEST_UNTESTED,
14227 .probe = probe_jedec_29gl,
14228 .probe_timing = TIMING_ZERO,
14229 .block_erasers =
14230 {
14231 {
14232 .eraseblocks = {
14233 {8 * 1024, 8},
14234 {64 * 1024, 63},
14235 },
14236 .block_erase = erase_sector_jedec,
14237 }, {
14238 .eraseblocks = { {4 * 1024 * 1024, 1} },
14239 .block_erase = erase_chip_block_jedec,
14240 },
14241 },
14242 .write = write_jedec_1,
14243 .read = read_memmapped,
14244 .voltage = {2700, 3600},
14245 },
14246
14247 {
14248 .vendor = "Winbond",
14249 .name = "W29GL032CT",
14250 .bustype = BUS_PARALLEL,
14251 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14252 .model_id = WINBOND_W29GL032CT,
14253 .total_size = 4096,
14254 .page_size = 128 * 1024, /* actual page size is 16 */
14255 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14256 .tested = TEST_UNTESTED,
14257 .probe = probe_jedec_29gl,
14258 .probe_timing = TIMING_ZERO,
14259 .block_erasers =
14260 {
14261 {
14262 .eraseblocks = {
14263 {64 * 1024, 63},
14264 {8 * 1024, 8},
14265 },
14266 .block_erase = erase_sector_jedec,
14267 }, {
14268 .eraseblocks = { {4 * 1024 * 1024, 1} },
14269 .block_erase = erase_chip_block_jedec,
14270 },
14271 },
14272 .write = write_jedec_1,
14273 .read = read_memmapped,
14274 .voltage = {2700, 3600},
14275 },
14276
14277 {
14278 .vendor = "Winbond",
14279 .name = "W29GL032CH/L",
14280 .bustype = BUS_PARALLEL,
14281 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14282 .model_id = WINBOND_W29GL032CHL,
14283 .total_size = 4096,
14284 .page_size = 128 * 1024, /* actual page size is 16 */
14285 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14286 .tested = TEST_UNTESTED,
14287 .probe = probe_jedec_29gl,
14288 .probe_timing = TIMING_ZERO,
14289 .block_erasers =
14290 {
14291 {
14292 .eraseblocks = { {64 * 1024, 64} },
14293 .block_erase = erase_sector_jedec,
14294 }, {
14295 .eraseblocks = { {4 * 1024 * 1024, 1} },
14296 .block_erase = erase_chip_block_jedec,
14297 },
14298 },
14299 .write = write_jedec_1,
14300 .read = read_memmapped,
14301 .voltage = {2700, 3600},
14302 },
14303
14304 {
14305 .vendor = "Winbond",
14306 .name = "W29GL064CB",
14307 .bustype = BUS_PARALLEL,
14308 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14309 .model_id = WINBOND_W29GL064CB,
14310 .total_size = 8192,
14311 .page_size = 128 * 1024, /* actual page size is 16 */
14312 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14313 .tested = TEST_UNTESTED,
14314 .probe = probe_jedec_29gl,
14315 .probe_timing = TIMING_ZERO,
14316 .block_erasers =
14317 {
14318 {
14319 .eraseblocks = {
14320 {8 * 1024, 8},
14321 {64 * 1024, 127},
14322 },
14323 .block_erase = erase_sector_jedec,
14324 }, {
14325 .eraseblocks = { {8 * 1024 * 1024, 1} },
14326 .block_erase = erase_chip_block_jedec,
14327 },
14328 },
14329 .write = write_jedec_1,
14330 .read = read_memmapped,
14331 .voltage = {2700, 3600},
14332 },
14333
14334 {
14335 .vendor = "Winbond",
14336 .name = "W29GL064CT",
14337 .bustype = BUS_PARALLEL,
14338 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14339 .model_id = WINBOND_W29GL064CT,
14340 .total_size = 8192,
14341 .page_size = 128 * 1024, /* actual page size is 16 */
14342 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14343 .tested = TEST_UNTESTED,
14344 .probe = probe_jedec_29gl,
14345 .probe_timing = TIMING_ZERO,
14346 .block_erasers =
14347 {
14348 {
14349 .eraseblocks = {
14350 {64 * 1024, 127},
14351 {8 * 1024, 8},
14352 },
14353 .block_erase = erase_sector_jedec,
14354 }, {
14355 .eraseblocks = { {8 * 1024 * 1024, 1} },
14356 .block_erase = erase_chip_block_jedec,
14357 },
14358 },
14359 .write = write_jedec_1,
14360 .read = read_memmapped,
14361 .voltage = {2700, 3600},
14362 },
14363
14364 {
14365 .vendor = "Winbond",
14366 .name = "W29GL064CH/L",
14367 .bustype = BUS_PARALLEL,
14368 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14369 .model_id = WINBOND_W29GL064CHL,
14370 .total_size = 8192,
14371 .page_size = 128 * 1024, /* actual page size is 16 */
14372 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14373 .tested = TEST_UNTESTED,
14374 .probe = probe_jedec_29gl,
14375 .probe_timing = TIMING_ZERO,
14376 .block_erasers =
14377 {
14378 {
14379 .eraseblocks = { {64 * 1024, 128} },
14380 .block_erase = erase_sector_jedec,
14381 }, {
14382 .eraseblocks = { {8 * 1024 * 1024, 1} },
14383 .block_erase = erase_chip_block_jedec,
14384 },
14385 },
14386 .write = write_jedec_1,
14387 .read = read_memmapped,
14388 .voltage = {2700, 3600},
14389 },
14390
14391 {
14392 .vendor = "Winbond",
14393 .name = "W29GL128C",
14394 .bustype = BUS_PARALLEL,
14395 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
14396 .model_id = WINBOND_W29GL128CHL,
14397 .total_size = 16384,
14398 .page_size = 128 * 1024, /* actual page size is 16 */
14399 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
14400 .tested = TEST_UNTESTED,
14401 .probe = probe_jedec_29gl,
14402 .probe_timing = TIMING_ZERO,
14403 .block_erasers =
14404 {
14405 {
14406 .eraseblocks = { {128 * 1024, 128} },
14407 .block_erase = erase_sector_jedec,
14408 }, {
14409 .eraseblocks = { {16 * 1024 * 1024, 1} },
14410 .block_erase = erase_chip_block_jedec,
14411 },
14412 },
14413 .write = write_jedec_1,
14414 .read = read_memmapped,
14415 .voltage = {2700, 3600},
14416 },
14417
14418 {
14419 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000014420 .name = "W39F010",
14421 .bustype = BUS_PARALLEL,
14422 .manufacture_id = WINBOND_ID,
14423 .model_id = WINBOND_W39F010,
14424 .total_size = 128,
14425 .page_size = 4 * 1024,
14426 .feature_bits = FEATURE_EITHER_RESET,
14427 .tested = TEST_OK_PREW,
14428 .probe = probe_jedec,
14429 .probe_timing = 10,
14430 .block_erasers =
14431 {
14432 {
14433 .eraseblocks = { {4 * 1024, 32} },
14434 .block_erase = erase_block_jedec,
14435 }, {
14436 .eraseblocks = { {128 * 1024, 1} },
14437 .block_erase = erase_chip_block_jedec,
14438 }
14439 },
14440 .printlock = printlock_w39f010,
14441 .write = write_jedec_1,
14442 .read = read_memmapped,
14443 .voltage = {4500, 5500},
14444 },
14445
14446 {
14447 .vendor = "Winbond",
14448 .name = "W39L010",
14449 .bustype = BUS_PARALLEL,
14450 .manufacture_id = WINBOND_ID,
14451 .model_id = WINBOND_W39L010,
14452 .total_size = 128,
14453 .page_size = 4 * 1024,
14454 .feature_bits = FEATURE_EITHER_RESET,
14455 .tested = TEST_UNTESTED,
14456 .probe = probe_jedec,
14457 .probe_timing = 10,
14458 .block_erasers =
14459 {
14460 {
14461 .eraseblocks = { {4 * 1024, 32} },
14462 .block_erase = erase_block_jedec,
14463 }, {
14464 .eraseblocks = { {128 * 1024, 1} },
14465 .block_erase = erase_chip_block_jedec,
14466 }
14467 },
14468 .printlock = printlock_w39l010,
14469 .write = write_jedec_1,
14470 .read = read_memmapped,
14471 .voltage = {3000, 3600},
14472 },
14473
14474 {
14475 .vendor = "Winbond",
14476 .name = "W39L020",
14477 .bustype = BUS_PARALLEL,
14478 .manufacture_id = WINBOND_ID,
14479 .model_id = WINBOND_W39L020,
14480 .total_size = 256,
14481 .page_size = 4 * 1024,
14482 .feature_bits = FEATURE_EITHER_RESET,
14483 .tested = TEST_UNTESTED,
14484 .probe = probe_jedec,
14485 .probe_timing = 10,
14486 .block_erasers =
14487 {
14488 {
14489 .eraseblocks = { {4 * 1024, 64} },
14490 .block_erase = erase_block_jedec,
14491 }, {
14492 .eraseblocks = { {64 * 1024, 4} },
14493 .block_erase = erase_sector_jedec,
14494 }, {
14495 .eraseblocks = { {256 * 1024, 1} },
14496 .block_erase = erase_chip_block_jedec,
14497 }
14498 },
14499 .printlock = printlock_w39l020,
14500 .write = write_jedec_1,
14501 .read = read_memmapped,
14502 .voltage = {3000, 3600},
14503 },
14504
14505 {
14506 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000014507 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014508 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000014509 .manufacture_id = WINBOND_ID,
14510 .model_id = WINBOND_W39L040,
14511 .total_size = 512,
14512 .page_size = 64 * 1024,
14513 .feature_bits = FEATURE_EITHER_RESET,
14514 .tested = TEST_OK_PR,
14515 .probe = probe_jedec,
14516 .probe_timing = 10,
14517 .block_erasers =
14518 {
14519 {
14520 .eraseblocks = { {4 * 1024, 128} },
14521 .block_erase = erase_block_jedec,
14522 }, {
14523 .eraseblocks = { {64 * 1024, 8} },
14524 .block_erase = erase_sector_jedec,
14525 }, {
14526 .eraseblocks = { {512 * 1024, 1} },
14527 .block_erase = erase_chip_block_jedec,
14528 }
14529 },
14530 .printlock = printlock_w39l040,
14531 .write = write_jedec_1,
14532 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014533 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000014534 },
14535
14536 {
14537 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014538 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014539 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014540 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014541 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014542 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014543 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014544 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000014545 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014546 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000014547 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014548 .block_erasers =
14549 {
14550 {
14551 .eraseblocks = { {64 * 1024, 8} },
14552 .block_erase = erase_sector_jedec,
14553 }, {
14554 .eraseblocks = { {512 * 1024, 1} },
14555 .block_erase = erase_chip_block_jedec,
14556 }
14557 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014558 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000014559 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014560 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014561 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014562 },
14563
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014564 {
14565 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014566 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014567 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014568 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014569 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014570 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014571 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014572 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014573 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014574 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000014575 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014576 .block_erasers =
14577 {
14578 {
14579 .eraseblocks = { {64 * 1024, 8} },
14580 .block_erase = erase_sector_jedec,
14581 }, {
14582 .eraseblocks = { {512 * 1024, 1} },
14583 .block_erase = erase_chip_block_jedec,
14584 }
14585 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014586 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000014587 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014588 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014589 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014590 },
14591
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014592 {
14593 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014594 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014595 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014596 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014597 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014598 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014599 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014600 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014601 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000014602 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014603 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014604 .block_erasers =
14605 {
14606 {
14607 .eraseblocks = { {64 * 1024, 8} },
14608 .block_erase = erase_sector_jedec,
14609 }, {
14610 .eraseblocks = { {512 * 1024, 1} },
14611 .block_erase = erase_chip_block_jedec,
14612 }
14613 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000014614 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000014615 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014616 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014617 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014618 },
14619
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014620 {
14621 .vendor = "Winbond",
14622 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014623 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014624 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014625 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014626 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014627 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000014628 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014629 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014630 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014631 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014632 .block_erasers =
14633 {
14634 {
14635 .eraseblocks = { {4 * 1024, 128} },
14636 .block_erase = erase_block_jedec,
14637 }, {
14638 .eraseblocks = { {64 * 1024, 8} },
14639 .block_erase = erase_sector_jedec,
14640 }, {
14641 .eraseblocks = { {512 * 1024, 1} },
14642 .block_erase = erase_chip_block_jedec,
14643 }
14644 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014645 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014646 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014647 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014648 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014649 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014650 },
14651
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014652 {
14653 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014654 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014655 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014656 .manufacture_id = WINBOND_ID,
14657 .model_id = WINBOND_W39V040B,
14658 .total_size = 512,
14659 .page_size = 64 * 1024,
14660 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014661 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014662 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014663 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014664 .block_erasers =
14665 {
14666 {
14667 .eraseblocks = { {64 * 1024, 8} },
14668 .block_erase = erase_sector_jedec,
14669 }, {
14670 .eraseblocks = { {512 * 1024, 1} },
14671 .block_erase = erase_chip_block_jedec,
14672 }
14673 },
14674 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014675 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014676 .write = write_jedec_1,
14677 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014678 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014679 },
14680
14681 {
14682 .vendor = "Winbond",
14683 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014684 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014685 .manufacture_id = WINBOND_ID,
14686 .model_id = WINBOND_W39V040C,
14687 .total_size = 512,
14688 .page_size = 64 * 1024,
14689 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000014690 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014691 .probe = probe_jedec,
14692 .probe_timing = 10,
14693 .block_erasers =
14694 {
14695 {
14696 .eraseblocks = { {64 * 1024, 8} },
14697 .block_erase = erase_sector_jedec,
14698 }, {
14699 .eraseblocks = { {512 * 1024, 1} },
14700 .block_erase = erase_chip_block_jedec,
14701 }
14702 },
14703 .printlock = printlock_w39v040fc,
14704 .write = write_jedec_1,
14705 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014706 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014707 },
14708
14709 {
14710 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014711 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014712 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014713 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014714 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014715 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000014716 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014717 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000014718 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014719 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000014720 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014721 .block_erasers =
14722 {
14723 {
14724 .eraseblocks = { {64 * 1024, 16} },
14725 .block_erase = erase_sector_jedec,
14726 }, {
14727 .eraseblocks = { {1024 * 1024, 1} },
14728 .block_erase = erase_chip_block_jedec,
14729 }
14730 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014731 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000014732 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014733 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014734 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014735 },
14736
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014737 {
14738 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000014739 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014740 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014741 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014742 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014743 .total_size = 256,
14744 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014745 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000014746 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014747 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014748 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014749 .block_erasers =
14750 {
14751 {
14752 .eraseblocks = {
14753 {128 * 1024, 1},
14754 {96 * 1024, 1},
14755 {8 * 1024, 2},
14756 {16 * 1024, 1},
14757 },
14758 .block_erase = erase_sector_jedec,
14759 }, {
14760 .eraseblocks = { {256 * 1024, 1} },
14761 .block_erase = erase_chip_block_jedec,
14762 }
14763 },
Sean Nelson35727f72010-01-28 23:55:12 +000014764 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014765 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014766 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014767 },
14768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014769 {
14770 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014771 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014772 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014773 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014774 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014775 .total_size = 256,
14776 .page_size = 128,
14777 .feature_bits = FEATURE_EITHER_RESET,
14778 .tested = TEST_OK_PROBE,
14779 .probe = probe_jedec,
14780 .probe_timing = 10,
14781 .block_erasers =
14782 {
14783 {
14784 .eraseblocks = { {256 * 1024, 1} },
14785 .block_erase = erase_chip_block_jedec,
14786 }
14787 },
14788 .write = write_jedec_1,
14789 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014790 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014791 },
14792
14793 {
14794 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014795 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014796 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014797 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014798 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014799 .total_size = 256,
14800 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014801 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014802 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014803 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014804 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014805 .block_erasers =
14806 {
14807 {
14808 .eraseblocks = {
14809 {64 * 1024, 3},
14810 {32 * 1024, 1},
14811 {8 * 1024, 2},
14812 {16 * 1024, 1},
14813 },
14814 .block_erase = erase_sector_jedec,
14815 }, {
14816 .eraseblocks = { {256 * 1024, 1} },
14817 .block_erase = erase_chip_block_jedec,
14818 }
14819 },
Sean Nelson35727f72010-01-28 23:55:12 +000014820 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014821 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014822 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014823 },
14824
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014825 {
14826 .vendor = "Winbond",
14827 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014828 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014829 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014830 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014831 .total_size = 256,
14832 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014833 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014834 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014835 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014836 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014837 .block_erasers =
14838 {
14839 {
14840 .eraseblocks = {
14841 {64 * 1024, 3},
14842 {32 * 1024, 1},
14843 {8 * 1024, 2},
14844 {16 * 1024, 1},
14845 },
14846 .block_erase = erase_sector_jedec,
14847 }, {
14848 .eraseblocks = { {256 * 1024, 1} },
14849 .block_erase = erase_chip_block_jedec,
14850 }
14851 },
Sean Nelson35727f72010-01-28 23:55:12 +000014852 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014853 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014854 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014855 },
14856
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014857 {
14858 .vendor = "Winbond",
14859 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014860 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014861 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014862 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014863 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000014864 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014865 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014866 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014867 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014868 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014869 .block_erasers =
14870 {
14871 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014872 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014873 .block_erase = erase_sector_jedec,
14874 }, {
14875 .eraseblocks = { {1024 * 1024, 1} },
14876 .block_erase = erase_chip_block_jedec,
14877 }
14878 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014879 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014880 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014881 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014882 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014883 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000014884 },
14885
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014886 {
14887 .vendor = "Winbond",
14888 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014889 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014890 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014891 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014892 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014893 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014894 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014895 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014896 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014897 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014898 .block_erasers =
14899 {
14900 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014901 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014902 .block_erase = erase_sector_jedec,
14903 }, {
14904 .eraseblocks = { {512 * 1024, 1} },
14905 .block_erase = erase_chip_block_jedec,
14906 }
14907 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014908 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000014909 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014910 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014911 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000014912 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000014913
14914 {
14915 .vendor = "Unknown",
14916 .name = "SFDP-capable chip",
14917 .bustype = BUS_SPI,
14918 .manufacture_id = GENERIC_MANUF_ID,
14919 .model_id = SFDP_DEVICE_ID,
14920 /* We present our own "report this" text hence we do not
14921 * want the default "This flash part has status UNTESTED..."
14922 * text to be printed. */
14923 .tested = TEST_OK_PREW,
14924 .probe = probe_spi_sfdp,
14925 .unlock = spi_disable_blockprotect, /* is this safe? */
14926 .read = spi_chip_read,
14927 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000014928 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000014929 /* Everything below will be set by the probing function. */
14930 .write = NULL,
14931 .total_size = 0,
14932 .page_size = 0,
14933 .feature_bits = 0,
14934 .block_erasers = {},
14935 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014936
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014937 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000014938 .vendor = "Programmer",
14939 .name = "Opaque flash chip",
14940 .bustype = BUS_PROG,
14941 .manufacture_id = PROGMANUF_ID,
14942 .model_id = PROGDEV_ID,
14943 .total_size = 0,
14944 .page_size = 256,
14945 /* probe is assumed to work, rest will be filled in by probe */
14946 .tested = TEST_OK_PROBE,
14947 .probe = probe_opaque,
14948 /* eraseblock sizes will be set by the probing function */
14949 .block_erasers =
14950 {
14951 {
14952 .block_erase = erase_opaque,
14953 }
14954 },
14955 .write = write_opaque,
14956 .read = read_opaque,
14957 },
14958
14959 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000014960 .vendor = "AMIC",
14961 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014962 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000014963 .manufacture_id = AMIC_ID,
14964 .model_id = GENERIC_DEVICE_ID,
14965 .total_size = 0,
14966 .page_size = 256,
14967 .tested = TEST_BAD_PREW,
14968 .probe = probe_spi_rdid4,
14969 .probe_timing = TIMING_ZERO,
14970 .write = NULL,
14971 .read = NULL,
14972 },
14973
14974 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014975 .vendor = "Atmel",
14976 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014977 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014978 .manufacture_id = ATMEL_ID,
14979 .model_id = GENERIC_DEVICE_ID,
14980 .total_size = 0,
14981 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014982 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014983 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014984 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014985 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014986 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014987 },
14988
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014989 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000014990 .vendor = "Eon",
14991 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014992 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014993 .manufacture_id = EON_ID_NOPREFIX,
14994 .model_id = GENERIC_DEVICE_ID,
14995 .total_size = 0,
14996 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014997 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014998 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014999 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015000 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015001 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000015002 },
15003
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015004 {
15005 .vendor = "Macronix",
15006 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015007 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015008 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015009 .model_id = GENERIC_DEVICE_ID,
15010 .total_size = 0,
15011 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000015012 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015013 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015014 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015015 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015016 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000015017 },
15018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015019 {
15020 .vendor = "PMC",
15021 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015022 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015023 .manufacture_id = PMC_ID,
15024 .model_id = GENERIC_DEVICE_ID,
15025 .total_size = 0,
15026 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000015027 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015028 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015029 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015030 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015031 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000015032 },
15033
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015034 {
15035 .vendor = "SST",
15036 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015037 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015038 .manufacture_id = SST_ID,
15039 .model_id = GENERIC_DEVICE_ID,
15040 .total_size = 0,
15041 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000015042 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015043 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015044 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015045 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015046 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000015047 },
15048
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015049 {
15050 .vendor = "ST",
15051 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015052 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015053 .manufacture_id = ST_ID,
15054 .model_id = GENERIC_DEVICE_ID,
15055 .total_size = 0,
15056 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000015057 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015058 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000015059 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015060 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015061 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000015062 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000015063
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015064 {
Sean Nelson118e1d62009-11-24 02:08:11 +000015065 .vendor = "Sanyo",
15066 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015067 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000015068 .manufacture_id = SANYO_ID,
15069 .model_id = GENERIC_DEVICE_ID,
15070 .total_size = 0,
15071 .page_size = 256,
15072 .tested = TEST_BAD_PREW,
15073 .probe = probe_spi_rdid,
15074 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000015075 .write = NULL,
15076 .read = NULL,
15077 },
15078
15079 {
Stefan Taunereb582572012-09-21 12:52:50 +000015080 .vendor = "Winbond",
15081 .name = "unknown Winbond (ex Nexcom) SPI chip",
15082 .bustype = BUS_SPI,
15083 .manufacture_id = WINBOND_NEX_ID,
15084 .model_id = GENERIC_DEVICE_ID,
15085 .total_size = 0,
15086 .page_size = 256,
15087 .tested = TEST_BAD_PREW,
15088 .probe = probe_spi_rdid,
15089 .probe_timing = TIMING_ZERO,
15090 .write = NULL,
15091 .read = NULL,
15092 },
15093
15094 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015095 .vendor = "Generic",
15096 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015097 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015098 .manufacture_id = GENERIC_MANUF_ID,
15099 .model_id = GENERIC_DEVICE_ID,
15100 .total_size = 0,
15101 .page_size = 256,
15102 .tested = TEST_BAD_PREW,
15103 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015104 .write = NULL,
15105 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000015106
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015107 {
15108 .vendor = "Generic",
15109 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015110 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015111 .manufacture_id = GENERIC_MANUF_ID,
15112 .model_id = GENERIC_DEVICE_ID,
15113 .total_size = 0,
15114 .page_size = 256,
15115 .tested = TEST_BAD_PREW,
15116 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000015117 .write = NULL,
15118 },
15119
Stefan Tauner96658be2014-05-26 22:05:31 +000015120 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000015121};
Stefan Tauner96658be2014-05-26 22:05:31 +000015122
15123const unsigned int flashchips_size = ARRAY_SIZE(flashchips);