blob: 1f70846cbdaa25f4009c2e94847e96064d371a5b [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 *
32 * Please keep the list sorted by vendor name and chip name, so that
33 * the output of 'flashrom -L' is alphabetically sorted.
34 */
Ollie Lho184a4042005-11-26 21:55:36 +000035struct 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
FENG yu ningff692fb2008-12-08 18:15:10 +000057 */
58
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000059 {
60 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000061 .name = "Am29F010A/B",
62 .bustype = CHIP_BUSTYPE_PARALLEL,
63 .manufacture_id = AMD_ID,
64 .model_id = AM_29F010B, /* Same as Am29F010A */
65 .total_size = 128,
66 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000067 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +000068 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000069 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000070 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000071 .block_erasers =
72 {
73 {
74 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000075 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000076 }, {
77 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000078 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000079 },
80 },
Sean Nelson35727f72010-01-28 23:55:12 +000081 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +000082 .read = read_memmapped,
83 },
84
85 {
86 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000087 .name = "Am29F002(N)BB",
Urja Rannikko038a3122009-06-28 19:19:25 +000088 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000089 .manufacture_id = AMD_ID,
90 .model_id = AM_29F002BB,
91 .total_size = 256,
92 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000093 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000094 .tested = TEST_UNTESTED,
95 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000096 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000097 .block_erasers =
98 {
99 {
100 .eraseblocks = {
101 {16 * 1024, 1},
102 {8 * 1024, 2},
103 {32 * 1024, 1},
104 {64 * 1024, 3},
105 },
106 .block_erase = erase_sector_jedec,
107 }, {
108 .eraseblocks = { {256 * 1024, 1} },
109 .block_erase = erase_chip_block_jedec,
110 },
111 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000112 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000113 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +0000114 },
115
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000116 {
117 .vendor = "AMD",
118 .name = "Am29F002(N)BT",
Urja Rannikko038a3122009-06-28 19:19:25 +0000119 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000120 .manufacture_id = AMD_ID,
121 .model_id = AM_29F002BT,
122 .total_size = 256,
123 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000124 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
125 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000126 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000127 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000128 .block_erasers =
129 {
130 {
131 .eraseblocks = {
132 {64 * 1024, 3},
133 {32 * 1024, 1},
134 {8 * 1024, 2},
135 {16 * 1024, 1},
136 },
137 .block_erase = erase_sector_jedec,
138 }, {
139 .eraseblocks = { {256 * 1024, 1} },
140 .block_erase = erase_chip_block_jedec,
141 },
142 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000143 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000144 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +0000145 },
146
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000147 {
148 .vendor = "AMD",
149 .name = "Am29F016D",
Urja Rannikko038a3122009-06-28 19:19:25 +0000150 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000151 .manufacture_id = AMD_ID,
152 .model_id = AM_29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000153 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000154 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000155 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000156 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000157 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +0000158 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
Sean Nelson72a9a022009-12-22 22:15:33 +0000159 .block_erasers =
160 {
161 {
162 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000163 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000164 }, {
165 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000166 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000167 },
168 },
Sean Nelson35727f72010-01-28 23:55:12 +0000169 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000170 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +0000171 },
172
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000173 {
174 .vendor = "AMD",
175 .name = "Am29F040B",
Urja Rannikko038a3122009-06-28 19:19:25 +0000176 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000177 .manufacture_id = AMD_ID,
178 .model_id = AM_29F040B,
179 .total_size = 512,
180 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000181 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
182 .tested = TEST_UNTESTED,
183 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +0000184 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
Sean Nelson72a9a022009-12-22 22:15:33 +0000185 .block_erasers =
186 {
187 {
188 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000189 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000190 }, {
191 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000192 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000193 },
194 },
Sean Nelson35727f72010-01-28 23:55:12 +0000195 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000196 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +0000197 },
198
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000199 {
200 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000201 .name = "Am29F080B",
Urja Rannikko038a3122009-06-28 19:19:25 +0000202 .bustype = CHIP_BUSTYPE_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000203 .manufacture_id = AMD_ID,
204 .model_id = AM_29F080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000205 .total_size = 1024,
206 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000207 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000208 .tested = TEST_UNTESTED,
209 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000210 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000211 .block_erasers =
212 {
213 {
214 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000215 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000216 }, {
217 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000218 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000219 },
220 },
Sean Nelson35727f72010-01-28 23:55:12 +0000221 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000222 .read = read_memmapped,
Peter Stuge8440cc02009-01-25 23:55:12 +0000223 },
224
225 {
226 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000227 .name = "Am29LV040B",
Urja Rannikko038a3122009-06-28 19:19:25 +0000228 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000229 .manufacture_id = AMD_ID,
230 .model_id = AM_29LV040B,
231 .total_size = 512,
232 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000233 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +0000234 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +0000235 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +0000236 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
Sean Nelson72a9a022009-12-22 22:15:33 +0000237 .block_erasers =
238 {
239 {
240 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000241 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000242 }, {
243 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000244 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000245 },
246 },
Sean Nelson35727f72010-01-28 23:55:12 +0000247 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000248 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +0000249 },
250
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000251 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000252 .vendor = "AMD",
253 .name = "Am29LV081B",
Urja Rannikko038a3122009-06-28 19:19:25 +0000254 .bustype = CHIP_BUSTYPE_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000255 .manufacture_id = AMD_ID,
Carl-Daniel Hailfinger6d5d2532009-08-10 10:14:23 +0000256 .model_id = AM_29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000257 .total_size = 1024,
258 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000259 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000260 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000261 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +0000262 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
Sean Nelson72a9a022009-12-22 22:15:33 +0000263 .block_erasers =
264 {
265 {
266 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000267 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000268 }, {
269 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000270 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000271 },
272 },
Sean Nelson35727f72010-01-28 23:55:12 +0000273 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000274 .read = read_memmapped,
Peter Stuge8440cc02009-01-25 23:55:12 +0000275 },
276
277 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000278 .vendor = "AMIC",
279 .name = "A25L05PT",
280 .bustype = CHIP_BUSTYPE_SPI,
281 .manufacture_id = AMIC_ID,
282 .model_id = AMIC_A25L05PT,
283 .total_size = 64,
284 .page_size = 256,
285 .tested = TEST_UNTESTED,
286 .probe = probe_spi_rdid4,
287 .probe_timing = TIMING_ZERO,
288 .block_erasers =
289 {
290 {
291 .eraseblocks = {
292 {32 * 1024, 1},
293 {16 * 1024, 1},
294 {8 * 1024, 1},
295 {4 * 1024, 2},
296 },
297 .block_erase = spi_block_erase_d8,
298 }, {
299 .eraseblocks = { {64 * 1024, 1} },
300 .block_erase = spi_block_erase_c7,
301 }
302 },
303 .unlock = spi_disable_blockprotect,
304 .write = spi_chip_write_256,
305 .read = spi_chip_read,
306 },
307
308 {
309 .vendor = "AMIC",
310 .name = "A25L05PU",
311 .bustype = CHIP_BUSTYPE_SPI,
312 .manufacture_id = AMIC_ID,
313 .model_id = AMIC_A25L05PU,
314 .total_size = 64,
315 .page_size = 256,
316 .tested = TEST_UNTESTED,
317 .probe = probe_spi_rdid4,
318 .probe_timing = TIMING_ZERO,
319 .block_erasers =
320 {
321 {
322 .eraseblocks = {
323 {4 * 1024, 2},
324 {8 * 1024, 1},
325 {16 * 1024, 1},
326 {32 * 1024, 1},
327 },
328 .block_erase = spi_block_erase_d8,
329 }, {
330 .eraseblocks = { {64 * 1024, 1} },
331 .block_erase = spi_block_erase_c7,
332 }
333 },
334 .unlock = spi_disable_blockprotect,
335 .write = spi_chip_write_256,
336 .read = spi_chip_read,
337 },
338
339 {
340 .vendor = "AMIC",
341 .name = "A25L10PT",
342 .bustype = CHIP_BUSTYPE_SPI,
343 .manufacture_id = AMIC_ID,
344 .model_id = AMIC_A25L10PT,
345 .total_size = 128,
346 .page_size = 256,
347 .tested = TEST_UNTESTED,
348 .probe = probe_spi_rdid4,
349 .probe_timing = TIMING_ZERO,
350 .block_erasers =
351 {
352 {
353 .eraseblocks = {
354 {64 * 1024, 1},
355 {32 * 1024, 1},
356 {16 * 1024, 1},
357 {8 * 1024, 1},
358 {4 * 1024, 2},
359 },
360 .block_erase = spi_block_erase_d8,
361 }, {
362 .eraseblocks = { {128 * 1024, 1} },
363 .block_erase = spi_block_erase_c7,
364 }
365 },
366 .unlock = spi_disable_blockprotect,
367 .write = spi_chip_write_256,
368 .read = spi_chip_read,
369 },
370
371 {
372 .vendor = "AMIC",
373 .name = "A25L10PU",
374 .bustype = CHIP_BUSTYPE_SPI,
375 .manufacture_id = AMIC_ID,
376 .model_id = AMIC_A25L10PU,
377 .total_size = 128,
378 .page_size = 256,
379 .tested = TEST_UNTESTED,
380 .probe = probe_spi_rdid4,
381 .probe_timing = TIMING_ZERO,
382 .block_erasers =
383 {
384 {
385 .eraseblocks = {
386 {4 * 1024, 2},
387 {8 * 1024, 1},
388 {16 * 1024, 1},
389 {32 * 1024, 1},
390 {64 * 1024, 1},
391 },
392 .block_erase = spi_block_erase_d8,
393 }, {
394 .eraseblocks = { {128 * 1024, 1} },
395 .block_erase = spi_block_erase_c7,
396 }
397 },
398 .unlock = spi_disable_blockprotect,
399 .write = spi_chip_write_256,
400 .read = spi_chip_read,
401 },
402
403 {
404 .vendor = "AMIC",
405 .name = "A25L20PT",
406 .bustype = CHIP_BUSTYPE_SPI,
407 .manufacture_id = AMIC_ID,
408 .model_id = AMIC_A25L20PT,
409 .total_size = 256,
410 .page_size = 256,
411 .tested = TEST_UNTESTED,
412 .probe = probe_spi_rdid4,
413 .probe_timing = TIMING_ZERO,
414 .block_erasers =
415 {
416 {
417 .eraseblocks = {
418 {64 * 1024, 3},
419 {32 * 1024, 1},
420 {16 * 1024, 1},
421 {8 * 1024, 1},
422 {4 * 1024, 2},
423 },
424 .block_erase = spi_block_erase_d8,
425 }, {
426 .eraseblocks = { {256 * 1024, 1} },
427 .block_erase = spi_block_erase_c7,
428 }
429 },
430 .unlock = spi_disable_blockprotect,
431 .write = spi_chip_write_256,
432 .read = spi_chip_read,
433 },
434
435 {
436 .vendor = "AMIC",
437 .name = "A25L20PU",
438 .bustype = CHIP_BUSTYPE_SPI,
439 .manufacture_id = AMIC_ID,
440 .model_id = AMIC_A25L20PU,
441 .total_size = 256,
442 .page_size = 256,
443 .tested = TEST_UNTESTED,
444 .probe = probe_spi_rdid4,
445 .probe_timing = TIMING_ZERO,
446 .block_erasers =
447 {
448 {
449 .eraseblocks = {
450 {4 * 1024, 2},
451 {8 * 1024, 1},
452 {16 * 1024, 1},
453 {32 * 1024, 1},
454 {64 * 1024, 3},
455 },
456 .block_erase = spi_block_erase_d8,
457 }, {
458 .eraseblocks = { {256 * 1024, 1} },
459 .block_erase = spi_block_erase_c7,
460 }
461 },
462 .unlock = spi_disable_blockprotect,
463 .write = spi_chip_write_256,
464 .read = spi_chip_read,
465 },
466
467 /* The A25L40P{T,U} chips are distinguished by their
468 * erase block layouts, but without any distinction in RDID.
469 * This inexplicable quirk was verified by Rudolf Marek
470 * and discussed on the flashrom mailing list on 2010-07-12.
471 */
472 {
473 .vendor = "AMIC",
474 .name = "A25L40PT",
475 .bustype = CHIP_BUSTYPE_SPI,
476 .manufacture_id = AMIC_ID,
477 .model_id = AMIC_A25L40PT,
478 .total_size = 512,
479 .page_size = 256,
480 .tested = TEST_OK_PRW,
481 .probe = probe_spi_rdid4,
482 .probe_timing = TIMING_ZERO,
483 .block_erasers =
484 {
485 {
486 .eraseblocks = {
487 {64 * 1024, 7},
488 {32 * 1024, 1},
489 {16 * 1024, 1},
490 {8 * 1024, 1},
491 {4 * 1024, 2},
492 },
493 .block_erase = spi_block_erase_d8,
494 }, {
495 .eraseblocks = { {512 * 1024, 1} },
496 .block_erase = spi_block_erase_c7,
497 }
498 },
499 .unlock = spi_disable_blockprotect,
500 .write = spi_chip_write_256,
501 .read = spi_chip_read,
502 },
503
504 {
505 .vendor = "AMIC",
506 .name = "A25L40PU",
507 .bustype = CHIP_BUSTYPE_SPI,
508 .manufacture_id = AMIC_ID,
509 .model_id = AMIC_A25L40PU,
510 .total_size = 512,
511 .page_size = 256,
512 .tested = TEST_OK_PRW,
513 .probe = probe_spi_rdid4,
514 .probe_timing = TIMING_ZERO,
515 .block_erasers =
516 {
517 {
518 .eraseblocks = {
519 {4 * 1024, 2},
520 {8 * 1024, 1},
521 {16 * 1024, 1},
522 {32 * 1024, 1},
523 {64 * 1024, 7},
524 },
525 .block_erase = spi_block_erase_d8,
526 }, {
527 .eraseblocks = { {512 * 1024, 1} },
528 .block_erase = spi_block_erase_c7,
529 }
530 },
531 .unlock = spi_disable_blockprotect,
532 .write = spi_chip_write_256,
533 .read = spi_chip_read,
534 },
535
536 {
537 .vendor = "AMIC",
538 .name = "A25L80P",
539 .bustype = CHIP_BUSTYPE_SPI,
540 .manufacture_id = AMIC_ID,
541 .model_id = AMIC_A25L80P,
542 .total_size = 1024,
543 .page_size = 256,
544 .tested = TEST_OK_PREW,
545 .probe = probe_spi_rdid4,
546 .probe_timing = TIMING_ZERO,
547 .block_erasers =
548 {
549 {
550 .eraseblocks = {
551 {4 * 1024, 2},
552 {8 * 1024, 1},
553 {16 * 1024, 1},
554 {32 * 1024, 1},
555 {64 * 1024, 15},
556 },
557 .block_erase = spi_block_erase_d8,
558 }, {
559 .eraseblocks = { {1024 * 1024, 1} },
560 .block_erase = spi_block_erase_c7,
561 }
562 },
563 .unlock = spi_disable_blockprotect,
564 .write = spi_chip_write_256,
565 .read = spi_chip_read,
566 },
567
568 {
569 .vendor = "AMIC",
570 .name = "A25L16PT",
571 .bustype = CHIP_BUSTYPE_SPI,
572 .manufacture_id = AMIC_ID,
573 .model_id = AMIC_A25L16PT,
574 .total_size = 2048,
575 .page_size = 256,
576 .tested = TEST_UNTESTED,
577 .probe = probe_spi_rdid4,
578 .probe_timing = TIMING_ZERO,
579 .block_erasers =
580 {
581 {
582 .eraseblocks = {
583 {64 * 1024, 31},
584 {32 * 1024, 1},
585 {16 * 1024, 1},
586 {8 * 1024, 1},
587 {4 * 1024, 2},
588 },
589 .block_erase = spi_block_erase_d8,
590 }, {
591 .eraseblocks = { {2048 * 1024, 1} },
592 .block_erase = spi_block_erase_60,
593 }, {
594 .eraseblocks = { {2048 * 1024, 1} },
595 .block_erase = spi_block_erase_c7,
596 }
597 },
598 .unlock = spi_disable_blockprotect,
599 .write = spi_chip_write_256,
600 .read = spi_chip_read,
601 },
602
603 {
604 .vendor = "AMIC",
605 .name = "A25L16PU",
606 .bustype = CHIP_BUSTYPE_SPI,
607 .manufacture_id = AMIC_ID,
608 .model_id = AMIC_A25L16PU,
609 .total_size = 2048,
610 .page_size = 256,
611 .tested = TEST_OK_PRW,
612 .probe = probe_spi_rdid4,
613 .probe_timing = TIMING_ZERO,
614 .block_erasers =
615 {
616 {
617 .eraseblocks = {
618 {4 * 1024, 2},
619 {8 * 1024, 1},
620 {16 * 1024, 1},
621 {32 * 1024, 1},
622 {64 * 1024, 31},
623 },
624 .block_erase = spi_block_erase_d8,
625 }, {
626 .eraseblocks = { {2048 * 1024, 1} },
627 .block_erase = spi_block_erase_60,
628 }, {
629 .eraseblocks = { {2048 * 1024, 1} },
630 .block_erase = spi_block_erase_c7,
631 }
632 },
633 .unlock = spi_disable_blockprotect,
634 .write = spi_chip_write_256,
635 .read = spi_chip_read,
636 },
637
638 {
639 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +0000640 .name = "A25L512",
641 .bustype = CHIP_BUSTYPE_SPI,
642 .manufacture_id = AMIC_ID_NOPREFIX,
643 .model_id = AMIC_A25L512,
644 .total_size = 64,
645 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000646 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000647 .tested = TEST_UNTESTED,
648 .probe = probe_spi_rdid,
649 .probe_timing = TIMING_ZERO,
650 .block_erasers =
651 {
652 {
653 .eraseblocks = { { 4 * 1024, 16 } },
654 .block_erase = spi_block_erase_20,
655 }, {
656 .eraseblocks = { { 64 * 1024, 1 } },
657 .block_erase = spi_block_erase_d8,
658 }, {
659 .eraseblocks = { { 64 * 1024, 1 } },
660 .block_erase = spi_block_erase_c7,
661 }
662 },
663 .unlock = spi_disable_blockprotect,
664 .write = spi_chip_write_256,
665 .read = spi_chip_read,
666 },
667
668 {
669 .vendor = "AMIC",
670 .name = "A25L010",
671 .bustype = CHIP_BUSTYPE_SPI,
672 .manufacture_id = AMIC_ID_NOPREFIX,
673 .model_id = AMIC_A25L010,
674 .total_size = 128,
675 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000676 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000677 .tested = TEST_UNTESTED,
678 .probe = probe_spi_rdid,
679 .probe_timing = TIMING_ZERO,
680 .block_erasers =
681 {
682 {
683 .eraseblocks = { { 4 * 1024, 32 } },
684 .block_erase = spi_block_erase_20,
685 }, {
686 .eraseblocks = { { 64 * 1024, 2 } },
687 .block_erase = spi_block_erase_d8,
688 }, {
689 .eraseblocks = { { 128 * 1024, 1 } },
690 .block_erase = spi_block_erase_c7,
691 }
692 },
693 .unlock = spi_disable_blockprotect,
694 .write = spi_chip_write_256,
695 .read = spi_chip_read,
696 },
697
698 {
699 .vendor = "AMIC",
700 .name = "A25L020",
701 .bustype = CHIP_BUSTYPE_SPI,
702 .manufacture_id = AMIC_ID_NOPREFIX,
703 .model_id = AMIC_A25L020,
704 .total_size = 256,
705 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000706 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000707 .tested = TEST_UNTESTED,
708 .probe = probe_spi_rdid,
709 .probe_timing = TIMING_ZERO,
710 .block_erasers =
711 {
712 {
713 .eraseblocks = { { 4 * 1024, 64 } },
714 .block_erase = spi_block_erase_20,
715 }, {
716 .eraseblocks = { { 64 * 1024, 4 } },
717 .block_erase = spi_block_erase_d8,
718 }, {
719 .eraseblocks = { { 256 * 1024, 1 } },
720 .block_erase = spi_block_erase_c7,
721 }
722 },
723 .unlock = spi_disable_blockprotect,
724 .write = spi_chip_write_256,
725 .read = spi_chip_read,
726 },
727
728 {
729 .vendor = "AMIC",
730 .name = "A25L040",
731 .bustype = CHIP_BUSTYPE_SPI,
732 .manufacture_id = AMIC_ID_NOPREFIX,
733 .model_id = AMIC_A25L040,
734 .total_size = 512,
735 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000736 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000737 .tested = TEST_UNTESTED,
738 .probe = probe_spi_rdid,
739 .probe_timing = TIMING_ZERO,
740 .block_erasers =
741 {
742 {
743 .eraseblocks = { { 4 * 1024, 128 } },
744 .block_erase = spi_block_erase_20,
745 }, {
746 .eraseblocks = { { 64 * 1024, 8 } },
747 .block_erase = spi_block_erase_d8,
748 }, {
749 .eraseblocks = { { 512 * 1024, 1 } },
750 .block_erase = spi_block_erase_c7,
751 }
752 },
753 .unlock = spi_disable_blockprotect,
754 .write = spi_chip_write_256,
755 .read = spi_chip_read,
756 },
757
758 {
759 .vendor = "AMIC",
760 .name = "A25L080",
761 .bustype = CHIP_BUSTYPE_SPI,
762 .manufacture_id = AMIC_ID_NOPREFIX,
763 .model_id = AMIC_A25L080,
764 .total_size = 1024,
765 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000766 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000767 .tested = TEST_UNTESTED,
768 .probe = probe_spi_rdid,
769 .probe_timing = TIMING_ZERO,
770 .block_erasers =
771 {
772 {
773 .eraseblocks = { { 4 * 1024, 256 } },
774 .block_erase = spi_block_erase_20,
775 }, {
776 .eraseblocks = { { 64 * 1024, 16 } },
777 .block_erase = spi_block_erase_d8,
778 }, {
779 .eraseblocks = { { 1024 * 1024, 1 } },
780 .block_erase = spi_block_erase_c7,
781 }
782 },
783 .unlock = spi_disable_blockprotect,
784 .write = spi_chip_write_256,
785 .read = spi_chip_read,
786 },
787
788 {
789 .vendor = "AMIC",
790 .name = "A25L016",
791 .bustype = CHIP_BUSTYPE_SPI,
792 .manufacture_id = AMIC_ID_NOPREFIX,
793 .model_id = AMIC_A25L016,
794 .total_size = 2048,
795 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000796 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000797 .tested = TEST_UNTESTED,
798 .probe = probe_spi_rdid,
799 .probe_timing = TIMING_ZERO,
800 .block_erasers =
801 {
802 {
803 .eraseblocks = { { 4 * 1024, 512 } },
804 .block_erase = spi_block_erase_20,
805 }, {
806 .eraseblocks = { { 64 * 1024, 32 } },
807 .block_erase = spi_block_erase_d8,
808 }, {
809 .eraseblocks = { { 2048 * 1024, 1 } },
810 .block_erase = spi_block_erase_c7,
811 }
812 },
813 .unlock = spi_disable_blockprotect,
814 .write = spi_chip_write_256,
815 .read = spi_chip_read,
816 },
817
818 {
819 .vendor = "AMIC",
820 .name = "A25L032",
821 .bustype = CHIP_BUSTYPE_SPI,
822 .manufacture_id = AMIC_ID_NOPREFIX,
823 .model_id = AMIC_A25L032,
824 .total_size = 4096,
825 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000826 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000827 .tested = TEST_UNTESTED,
828 .probe = probe_spi_rdid,
829 .probe_timing = TIMING_ZERO,
830 .block_erasers =
831 {
832 {
833 .eraseblocks = { { 4 * 1024, 1024 } },
834 .block_erase = spi_block_erase_20,
835 }, {
836 .eraseblocks = { { 64 * 1024, 64 } },
837 .block_erase = spi_block_erase_52,
838 }, {
839 .eraseblocks = { { 64 * 1024, 64 } },
840 .block_erase = spi_block_erase_d8,
841 }, {
842 .eraseblocks = { { 4096 * 1024, 1 } },
843 .block_erase = spi_block_erase_60,
844 }, {
845 .eraseblocks = { { 4096 * 1024, 1 } },
846 .block_erase = spi_block_erase_c7,
847 }
848 },
849 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
850 .write = spi_chip_write_256,
851 .read = spi_chip_read,
852 },
853
854 {
855 .vendor = "AMIC",
856 .name = "A25LQ032",
857 .bustype = CHIP_BUSTYPE_SPI,
858 .manufacture_id = AMIC_ID_NOPREFIX,
859 .model_id = AMIC_A25LQ032,
860 .total_size = 4096,
861 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000862 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000863 .tested = TEST_UNTESTED,
864 .probe = probe_spi_rdid,
865 .probe_timing = TIMING_ZERO,
866 .block_erasers =
867 {
868 {
869 .eraseblocks = { { 4 * 1024, 1024 } },
870 .block_erase = spi_block_erase_20,
871 }, {
872 .eraseblocks = { { 64 * 1024, 64 } },
873 .block_erase = spi_block_erase_52,
874 }, {
875 .eraseblocks = { { 64 * 1024, 64 } },
876 .block_erase = spi_block_erase_d8,
877 }, {
878 .eraseblocks = { { 4096 * 1024, 1 } },
879 .block_erase = spi_block_erase_60,
880 }, {
881 .eraseblocks = { { 4096 * 1024, 1 } },
882 .block_erase = spi_block_erase_c7,
883 }
884 },
885 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
886 .write = spi_chip_write_256,
887 .read = spi_chip_read,
888 },
889
890 {
891 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000892 .name = "A29002B",
893 .bustype = CHIP_BUSTYPE_PARALLEL,
894 .manufacture_id = AMIC_ID_NOPREFIX,
895 .model_id = AMIC_A29002B,
896 .total_size = 256,
897 .page_size = 64 * 1024,
898 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
899 .tested = TEST_UNTESTED,
900 .probe = probe_jedec,
901 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
902 .block_erasers =
903 {
904 {
905 .eraseblocks = {
906 {16 * 1024, 1},
907 {8 * 1024, 2},
908 {32 * 1024, 1},
909 {64 * 1024, 3},
910 },
911 .block_erase = erase_sector_jedec,
912 }, {
913 .eraseblocks = { {256 * 1024, 1} },
914 .block_erase = erase_chip_block_jedec,
915 },
916 },
917 .write = write_jedec_1,
918 .read = read_memmapped,
919 },
920
921 {
922 .vendor = "AMIC",
923 .name = "A29002T",
924 .bustype = CHIP_BUSTYPE_PARALLEL,
925 .manufacture_id = AMIC_ID_NOPREFIX,
926 .model_id = AMIC_A29002T,
927 .total_size = 256,
928 .page_size = 64 * 1024,
929 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
930 .tested = TEST_OK_PRW,
931 .probe = probe_jedec,
932 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
933 .block_erasers =
934 {
935 {
936 .eraseblocks = {
937 {64 * 1024, 3},
938 {32 * 1024, 1},
939 {8 * 1024, 2},
940 {16 * 1024, 1},
941 },
942 .block_erase = erase_sector_jedec,
943 }, {
944 .eraseblocks = { {256 * 1024, 1} },
945 .block_erase = erase_chip_block_jedec,
946 },
947 },
948 .write = write_jedec_1,
949 .read = read_memmapped,
950 },
951
952 {
953 .vendor = "AMIC",
954 .name = "A29040B",
955 .bustype = CHIP_BUSTYPE_PARALLEL,
956 .manufacture_id = AMIC_ID_NOPREFIX,
957 .model_id = AMIC_A29040B,
958 .total_size = 512,
959 .page_size = 64 * 1024,
960 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
961 .tested = TEST_UNTESTED,
962 .probe = probe_jedec,
963 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
964 .block_erasers =
965 {
966 {
967 .eraseblocks = { {64 * 1024, 8} },
968 .block_erase = erase_sector_jedec,
969 }, {
970 .eraseblocks = { {512 * 1024, 1} },
971 .block_erase = erase_chip_block_jedec,
972 },
973 },
974 .write = write_jedec_1,
975 .read = read_memmapped,
976 },
977
978 {
979 .vendor = "AMIC",
980 .name = "A49LF040A",
981 .bustype = CHIP_BUSTYPE_LPC,
982 .manufacture_id = AMIC_ID_NOPREFIX,
983 .model_id = AMIC_A49LF040A,
984 .total_size = 512,
985 .page_size = 64 * 1024,
986 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
987 .tested = TEST_OK_PREW,
988 .probe = probe_jedec,
989 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
990 .block_erasers =
991 {
992 {
993 .eraseblocks = { {64 * 1024, 8} },
994 .block_erase = erase_block_jedec,
995 }, {
996 .eraseblocks = { {512 * 1024, 1} },
997 .block_erase = erase_chip_block_jedec,
998 }
999 },
1000 .unlock = unlock_49fl00x,
1001 .write = write_jedec_1,
1002 .read = read_memmapped,
1003 },
1004
1005 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001006 .vendor = "ASD",
1007 .name = "AE49F2008",
Urja Rannikko038a3122009-06-28 19:19:25 +00001008 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001009 .manufacture_id = ASD_ID,
1010 .model_id = ASD_AE49F2008,
1011 .total_size = 256,
1012 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001013 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001014 .tested = TEST_UNTESTED,
1015 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001016 .probe_timing = TIMING_FIXME,
Sean Nelson54596372010-01-09 05:30:14 +00001017 .block_erasers =
1018 {
1019 {
1020 .eraseblocks = {
1021 {128 * 1024, 1},
1022 {96 * 1024, 1},
1023 {8 * 1024, 2},
1024 {16 * 1024, 1},
1025 },
1026 .block_erase = erase_sector_jedec,
1027 }, {
1028 .eraseblocks = { {256 * 1024, 1} },
1029 .block_erase = erase_chip_block_jedec,
1030 }
1031 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001032 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001033 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001034 },
1035
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001036 {
1037 .vendor = "Atmel",
1038 .name = "AT25DF021",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001039 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001040 .manufacture_id = ATMEL_ID,
1041 .model_id = AT_25DF021,
1042 .total_size = 256,
1043 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001044 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001045 .tested = TEST_UNTESTED,
1046 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001047 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001048 .block_erasers =
1049 {
1050 {
1051 .eraseblocks = { {4 * 1024, 64} },
1052 .block_erase = spi_block_erase_20,
1053 }, {
1054 .eraseblocks = { {32 * 1024, 8} },
1055 .block_erase = spi_block_erase_52,
1056 }, {
1057 .eraseblocks = { {64 * 1024, 4} },
1058 .block_erase = spi_block_erase_d8,
1059 }, {
1060 .eraseblocks = { {256 * 1024, 1} },
1061 .block_erase = spi_block_erase_60,
1062 }, {
1063 .eraseblocks = { {256 * 1024, 1} },
1064 .block_erase = spi_block_erase_c7,
1065 }
1066 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001067 .printlock = spi_prettyprint_status_register_at25df,
1068 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001069 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001070 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001071 },
1072
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001073 {
1074 .vendor = "Atmel",
1075 .name = "AT25DF041A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001076 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001077 .manufacture_id = ATMEL_ID,
1078 .model_id = AT_25DF041A,
1079 .total_size = 512,
1080 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001081 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001082 .tested = TEST_UNTESTED,
1083 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001084 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001085 .block_erasers =
1086 {
1087 {
1088 .eraseblocks = { {4 * 1024, 128} },
1089 .block_erase = spi_block_erase_20,
1090 }, {
1091 .eraseblocks = { {32 * 1024, 16} },
1092 .block_erase = spi_block_erase_52,
1093 }, {
1094 .eraseblocks = { {64 * 1024, 8} },
1095 .block_erase = spi_block_erase_d8,
1096 }, {
1097 .eraseblocks = { {512 * 1024, 1} },
1098 .block_erase = spi_block_erase_60,
1099 }, {
1100 .eraseblocks = { {512 * 1024, 1} },
1101 .block_erase = spi_block_erase_c7,
1102 }
1103 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001104 .printlock = spi_prettyprint_status_register_at25df,
1105 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001106 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001107 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001108 },
1109
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001110 {
1111 .vendor = "Atmel",
1112 .name = "AT25DF081",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001113 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001114 .manufacture_id = ATMEL_ID,
1115 .model_id = AT_25DF081,
1116 .total_size = 1024,
1117 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001118 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001119 .tested = TEST_UNTESTED,
1120 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001121 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001122 .block_erasers =
1123 {
1124 {
1125 .eraseblocks = { {4 * 1024, 256} },
1126 .block_erase = spi_block_erase_20,
1127 }, {
1128 .eraseblocks = { {32 * 1024, 32} },
1129 .block_erase = spi_block_erase_52,
1130 }, {
1131 .eraseblocks = { {64 * 1024, 16} },
1132 .block_erase = spi_block_erase_d8,
1133 }, {
1134 .eraseblocks = { {1024 * 1024, 1} },
1135 .block_erase = spi_block_erase_60,
1136 }, {
1137 .eraseblocks = { {1024 * 1024, 1} },
1138 .block_erase = spi_block_erase_c7,
1139 }
1140 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001141 .printlock = spi_prettyprint_status_register_at25df,
1142 .unlock = spi_disable_blockprotect_at25df,
1143 .write = spi_chip_write_256,
1144 .read = spi_chip_read,
1145 },
1146
1147 {
1148 .vendor = "Atmel",
1149 .name = "AT25DF081A",
1150 .bustype = CHIP_BUSTYPE_SPI,
1151 .manufacture_id = ATMEL_ID,
1152 .model_id = AT_25DF081A,
1153 .total_size = 1024,
1154 .page_size = 256,
1155 .feature_bits = FEATURE_WRSR_WREN,
1156 .tested = TEST_UNTESTED,
1157 .probe = probe_spi_rdid,
1158 .probe_timing = TIMING_ZERO,
1159 .block_erasers =
1160 {
1161 {
1162 .eraseblocks = { {4 * 1024, 256} },
1163 .block_erase = spi_block_erase_20,
1164 }, {
1165 .eraseblocks = { {32 * 1024, 32} },
1166 .block_erase = spi_block_erase_52,
1167 }, {
1168 .eraseblocks = { {64 * 1024, 16} },
1169 .block_erase = spi_block_erase_d8,
1170 }, {
1171 .eraseblocks = { {1024 * 1024, 1} },
1172 .block_erase = spi_block_erase_60,
1173 }, {
1174 .eraseblocks = { {1024 * 1024, 1} },
1175 .block_erase = spi_block_erase_c7,
1176 }
1177 },
1178 .printlock = spi_prettyprint_status_register_at25df_sec,
1179 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001180 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001181 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001182 },
1183
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001184 {
1185 .vendor = "Atmel",
1186 .name = "AT25DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001187 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001188 .manufacture_id = ATMEL_ID,
1189 .model_id = AT_25DF161,
1190 .total_size = 2048,
1191 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001192 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001193 .tested = TEST_UNTESTED,
1194 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001195 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001196 .block_erasers =
1197 {
1198 {
1199 .eraseblocks = { {4 * 1024, 512} },
1200 .block_erase = spi_block_erase_20,
1201 }, {
1202 .eraseblocks = { {32 * 1024, 64} },
1203 .block_erase = spi_block_erase_52,
1204 }, {
1205 .eraseblocks = { {64 * 1024, 32} },
1206 .block_erase = spi_block_erase_d8,
1207 }, {
1208 .eraseblocks = { {2 * 1024 * 1024, 1} },
1209 .block_erase = spi_block_erase_60,
1210 }, {
1211 .eraseblocks = { {2 * 1024 * 1024, 1} },
1212 .block_erase = spi_block_erase_c7,
1213 }
1214 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001215 .printlock = spi_prettyprint_status_register_at25df_sec,
1216 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001217 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001218 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001219 },
1220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001221 {
1222 .vendor = "Atmel",
1223 .name = "AT25DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001224 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001225 .manufacture_id = ATMEL_ID,
1226 .model_id = AT_25DF321,
1227 .total_size = 4096,
1228 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001229 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00001230 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001231 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001232 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001233 .block_erasers =
1234 {
1235 {
1236 .eraseblocks = { {4 * 1024, 1024} },
1237 .block_erase = spi_block_erase_20,
1238 }, {
1239 .eraseblocks = { {32 * 1024, 128} },
1240 .block_erase = spi_block_erase_52,
1241 }, {
1242 .eraseblocks = { {64 * 1024, 64} },
1243 .block_erase = spi_block_erase_d8,
1244 }, {
1245 .eraseblocks = { {4 * 1024 * 1024, 1} },
1246 .block_erase = spi_block_erase_60,
1247 }, {
1248 .eraseblocks = { {4 * 1024 * 1024, 1} },
1249 .block_erase = spi_block_erase_c7,
1250 }
1251 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001252 .printlock = spi_prettyprint_status_register_at25df,
1253 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001254 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001255 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001256 },
1257
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001258 {
1259 .vendor = "Atmel",
1260 .name = "AT25DF321A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001261 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001262 .manufacture_id = ATMEL_ID,
1263 .model_id = AT_25DF321A,
1264 .total_size = 4096,
1265 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001266 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001267 .tested = TEST_UNTESTED,
1268 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001269 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001270 .block_erasers =
1271 {
1272 {
1273 .eraseblocks = { {4 * 1024, 1024} },
1274 .block_erase = spi_block_erase_20,
1275 }, {
1276 .eraseblocks = { {32 * 1024, 128} },
1277 .block_erase = spi_block_erase_52,
1278 }, {
1279 .eraseblocks = { {64 * 1024, 64} },
1280 .block_erase = spi_block_erase_d8,
1281 }, {
1282 .eraseblocks = { {4 * 1024 * 1024, 1} },
1283 .block_erase = spi_block_erase_60,
1284 }, {
1285 .eraseblocks = { {4 * 1024 * 1024, 1} },
1286 .block_erase = spi_block_erase_c7,
1287 }
1288 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001289 .printlock = spi_prettyprint_status_register_at25df_sec,
1290 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001291 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001292 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001293 },
1294
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001295 {
1296 .vendor = "Atmel",
1297 .name = "AT25DF641",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001298 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001299 .manufacture_id = ATMEL_ID,
1300 .model_id = AT_25DF641,
1301 .total_size = 8192,
1302 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001303 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001304 .tested = TEST_UNTESTED,
1305 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001306 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001307 .block_erasers =
1308 {
1309 {
1310 .eraseblocks = { {4 * 1024, 2048} },
1311 .block_erase = spi_block_erase_20,
1312 }, {
1313 .eraseblocks = { {32 * 1024, 256} },
1314 .block_erase = spi_block_erase_52,
1315 }, {
1316 .eraseblocks = { {64 * 1024, 128} },
1317 .block_erase = spi_block_erase_d8,
1318 }, {
1319 .eraseblocks = { {8 * 1024 * 1024, 1} },
1320 .block_erase = spi_block_erase_60,
1321 }, {
1322 .eraseblocks = { {8 * 1024 * 1024, 1} },
1323 .block_erase = spi_block_erase_c7,
1324 }
1325 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001326 .printlock = spi_prettyprint_status_register_at25df_sec,
1327 .unlock = spi_disable_blockprotect_at25df_sec,
1328 .write = spi_chip_write_256,
1329 .read = spi_chip_read,
1330 },
1331
1332 {
1333 .vendor = "Atmel",
1334 .name = "AT25DQ161",
1335 .bustype = CHIP_BUSTYPE_SPI,
1336 .manufacture_id = ATMEL_ID,
1337 .model_id = AT_25DQ161,
1338 .total_size = 2048,
1339 .page_size = 256,
1340 .feature_bits = FEATURE_WRSR_WREN,
1341 .tested = TEST_UNTESTED,
1342 .probe = probe_spi_rdid,
1343 .probe_timing = TIMING_ZERO,
1344 .block_erasers =
1345 {
1346 {
1347 .eraseblocks = { {4 * 1024, 512} },
1348 .block_erase = spi_block_erase_20,
1349 }, {
1350 .eraseblocks = { {32 * 1024, 64} },
1351 .block_erase = spi_block_erase_52,
1352 }, {
1353 .eraseblocks = { {64 * 1024, 32} },
1354 .block_erase = spi_block_erase_d8,
1355 }, {
1356 .eraseblocks = { {2 * 1024 * 1024, 1} },
1357 .block_erase = spi_block_erase_60,
1358 }, {
1359 .eraseblocks = { {2 * 1024 * 1024, 1} },
1360 .block_erase = spi_block_erase_c7,
1361 }
1362 },
1363 .printlock = spi_prettyprint_status_register_at25df_sec,
1364 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001365 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001366 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001367 },
1368
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001369 {
1370 .vendor = "Atmel",
1371 .name = "AT25F512B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001372 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001373 .manufacture_id = ATMEL_ID,
1374 .model_id = AT_25F512B,
1375 .total_size = 64,
1376 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001377 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001378 .tested = TEST_UNTESTED,
1379 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001380 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001381 .block_erasers =
1382 {
1383 {
1384 .eraseblocks = { {4 * 1024, 16} },
1385 .block_erase = spi_block_erase_20,
1386 }, {
1387 .eraseblocks = { {32 * 1024, 2} },
1388 .block_erase = spi_block_erase_52,
1389 }, {
1390 .eraseblocks = { {32 * 1024, 2} },
1391 .block_erase = spi_block_erase_d8,
1392 }, {
1393 .eraseblocks = { {64 * 1024, 1} },
1394 .block_erase = spi_block_erase_60,
1395 }, {
1396 .eraseblocks = { {64 * 1024, 1} },
1397 .block_erase = spi_block_erase_c7,
1398 }
1399 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001400 .printlock = spi_prettyprint_status_register_at25f,
1401 .unlock = spi_disable_blockprotect_at25f,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001402 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001403 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001404 },
1405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001406 {
1407 .vendor = "Atmel",
1408 .name = "AT25FS010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001409 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001410 .manufacture_id = ATMEL_ID,
1411 .model_id = AT_25FS010,
1412 .total_size = 128,
1413 .page_size = 256,
1414 .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, 32} },
1421 .block_erase = spi_block_erase_20,
1422 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001423 .eraseblocks = { {4 * 1024, 32} },
1424 .block_erase = spi_block_erase_d7,
1425 }, {
Sean Nelson89187292009-12-23 12:02:55 +00001426 .eraseblocks = { {32 * 1024, 4} },
1427 .block_erase = spi_block_erase_52,
1428 }, {
1429 .eraseblocks = { {32 * 1024, 4} },
1430 .block_erase = spi_block_erase_d8,
1431 }, {
1432 .eraseblocks = { {128 * 1024, 1} },
1433 .block_erase = spi_block_erase_60,
1434 }, {
1435 .eraseblocks = { {128 * 1024, 1} },
1436 .block_erase = spi_block_erase_c7,
1437 }
1438 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001439 .printlock = spi_prettyprint_status_register_at25fs010,
1440 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001441 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001442 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001443 },
1444
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001445 {
1446 .vendor = "Atmel",
1447 .name = "AT25FS040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001448 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001449 .manufacture_id = ATMEL_ID,
1450 .model_id = AT_25FS040,
1451 .total_size = 512,
1452 .page_size = 256,
1453 .tested = TEST_UNTESTED,
1454 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001455 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001456 .block_erasers =
1457 {
1458 {
1459 .eraseblocks = { {4 * 1024, 128} },
1460 .block_erase = spi_block_erase_20,
1461 }, {
1462 .eraseblocks = { {64 * 1024, 8} },
1463 .block_erase = spi_block_erase_52,
1464 }, {
1465 .eraseblocks = { {64 * 1024, 8} },
1466 .block_erase = spi_block_erase_d8,
1467 }, {
1468 .eraseblocks = { {512 * 1024, 1} },
1469 .block_erase = spi_block_erase_60,
1470 }, {
1471 .eraseblocks = { {512 * 1024, 1} },
1472 .block_erase = spi_block_erase_c7,
1473 }
1474 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001475 .printlock = spi_prettyprint_status_register_at25fs040,
1476 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001477 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001478 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001479 },
1480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 {
1482 .vendor = "Atmel",
1483 .name = "AT26DF041",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001484 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001485 .manufacture_id = ATMEL_ID,
1486 .model_id = AT_26DF041,
1487 .total_size = 512,
1488 .page_size = 256,
1489 .tested = TEST_UNTESTED,
1490 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001491 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001492 .block_erasers =
1493 {
1494 {
1495 .eraseblocks = { {4 * 1024, 128} },
1496 .block_erase = spi_block_erase_20,
1497 }
1498 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001499 .write = NULL /* Incompatible Page write */,
1500 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001501 },
1502
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001503 {
1504 .vendor = "Atmel",
1505 .name = "AT26DF081A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001506 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001507 .manufacture_id = ATMEL_ID,
1508 .model_id = AT_26DF081A,
1509 .total_size = 1024,
1510 .page_size = 256,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00001511 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001512 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001513 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001514 .block_erasers =
1515 {
1516 {
1517 .eraseblocks = { {4 * 1024, 256} },
1518 .block_erase = spi_block_erase_20,
1519 }, {
1520 .eraseblocks = { {32 * 1024, 32} },
1521 .block_erase = spi_block_erase_52,
1522 }, {
1523 .eraseblocks = { {64 * 1024, 16} },
1524 .block_erase = spi_block_erase_d8,
1525 }, {
1526 .eraseblocks = { {1024 * 1024, 1} },
1527 .block_erase = spi_block_erase_60,
1528 }, {
1529 .eraseblocks = { {1024 * 1024, 1} },
1530 .block_erase = spi_block_erase_c7,
1531 }
1532 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001533 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001534 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001535 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001536 },
1537
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001538 {
1539 .vendor = "Atmel",
1540 .name = "AT26DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001541 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001542 .manufacture_id = ATMEL_ID,
1543 .model_id = AT_26DF161,
1544 .total_size = 2048,
1545 .page_size = 256,
1546 .tested = TEST_UNTESTED,
1547 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001548 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001549 .block_erasers =
1550 {
1551 {
1552 .eraseblocks = { {4 * 1024, 512} },
1553 .block_erase = spi_block_erase_20,
1554 }, {
1555 .eraseblocks = { {32 * 1024, 64} },
1556 .block_erase = spi_block_erase_52,
1557 }, {
1558 .eraseblocks = { {64 * 1024, 32} },
1559 .block_erase = spi_block_erase_d8,
1560 }, {
1561 .eraseblocks = { {2 * 1024 * 1024, 1} },
1562 .block_erase = spi_block_erase_60,
1563 }, {
1564 .eraseblocks = { {2 * 1024 * 1024, 1} },
1565 .block_erase = spi_block_erase_c7,
1566 }
1567 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001568 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001569 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001570 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001571 },
1572
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001573 {
1574 .vendor = "Atmel",
1575 .name = "AT26DF161A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001576 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001577 .manufacture_id = ATMEL_ID,
1578 .model_id = AT_26DF161A,
1579 .total_size = 2048,
1580 .page_size = 256,
1581 .tested = TEST_UNTESTED,
1582 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001583 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001584 .block_erasers =
1585 {
1586 {
1587 .eraseblocks = { {4 * 1024, 512} },
1588 .block_erase = spi_block_erase_20,
1589 }, {
1590 .eraseblocks = { {32 * 1024, 64} },
1591 .block_erase = spi_block_erase_52,
1592 }, {
1593 .eraseblocks = { {64 * 1024, 32} },
1594 .block_erase = spi_block_erase_d8,
1595 }, {
1596 .eraseblocks = { {2 * 1024 * 1024, 1} },
1597 .block_erase = spi_block_erase_60,
1598 }, {
1599 .eraseblocks = { {2 * 1024 * 1024, 1} },
1600 .block_erase = spi_block_erase_c7,
1601 }
1602 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001603 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001604 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001606 },
1607
1608 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001609 /*{
1610 .vendor = "Atmel",
1611 .name = "AT26DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001612 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001613 .manufacture_id = ATMEL_ID,
1614 .model_id = AT_26DF321,
1615 .total_size = 4096,
1616 .page_size = 256,
1617 .tested = TEST_UNTESTED,
1618 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001619 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001620 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001621 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001622 .read = spi_chip_read,
1623 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00001624
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001625 {
1626 .vendor = "Atmel",
1627 .name = "AT26F004",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001628 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .manufacture_id = ATMEL_ID,
1630 .model_id = AT_26F004,
1631 .total_size = 512,
1632 .page_size = 256,
1633 .tested = TEST_UNTESTED,
1634 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001635 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001636 .block_erasers =
1637 {
1638 {
1639 .eraseblocks = { {4 * 1024, 128} },
1640 .block_erase = spi_block_erase_20,
1641 }, {
1642 .eraseblocks = { {32 * 1024, 16} },
1643 .block_erase = spi_block_erase_52,
1644 }, {
1645 .eraseblocks = { {64 * 1024, 8} },
1646 .block_erase = spi_block_erase_d8,
1647 }, {
1648 .eraseblocks = { {512 * 1024, 1} },
1649 .block_erase = spi_block_erase_60,
1650 }, {
1651 .eraseblocks = { {512 * 1024, 1} },
1652 .block_erase = spi_block_erase_c7,
1653 }
1654 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001655 .write = NULL /* Incompatible Page write */,
1656 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001657 },
1658
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001659 {
1660 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001661 .name = "AT29C512",
Urja Rannikko038a3122009-06-28 19:19:25 +00001662 .bustype = CHIP_BUSTYPE_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001663 .manufacture_id = ATMEL_ID,
1664 .model_id = AT_29C512,
1665 .total_size = 64,
1666 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001667 .feature_bits = FEATURE_LONG_RESET,
1668 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00001669 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001670 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001671 .block_erasers =
1672 {
1673 {
1674 .eraseblocks = { {64 * 1024, 1} },
1675 .block_erase = erase_chip_block_jedec,
1676 }
1677 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001678 .write = write_jedec,
1679 .read = read_memmapped,
1680
1681 },
1682
1683 {
1684 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001685 .name = "AT29C010A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001686 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001687 .manufacture_id = ATMEL_ID,
1688 .model_id = AT_29C010A,
1689 .total_size = 128,
1690 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001691 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00001692 .tested = TEST_OK_PREW,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001693 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001694 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001695 .block_erasers =
1696 {
1697 {
1698 .eraseblocks = { {128 * 1024, 1} },
1699 .block_erase = erase_chip_block_jedec,
1700 }
1701 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001702 .write = write_jedec, /* FIXME */
1703 .read = read_memmapped,
1704 },
1705
1706 {
1707 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001708 .name = "AT29C020",
Urja Rannikko161b8852009-06-05 08:47:37 +00001709 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001710 .manufacture_id = ATMEL_ID,
1711 .model_id = AT_29C020,
1712 .total_size = 256,
1713 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001714 .feature_bits = FEATURE_LONG_RESET,
1715 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001716 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00001717 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00001718 .block_erasers =
1719 {
1720 {
1721 .eraseblocks = { {256 * 1024, 1} },
1722 .block_erase = erase_chip_block_jedec,
1723 }
1724 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001725 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001726 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001727 },
1728
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001729 {
1730 .vendor = "Atmel",
1731 .name = "AT29C040A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001732 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001733 .manufacture_id = ATMEL_ID,
1734 .model_id = AT_29C040A,
1735 .total_size = 512,
1736 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001737 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001738 .tested = TEST_UNTESTED,
1739 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00001740 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00001741 .block_erasers =
1742 {
1743 {
1744 .eraseblocks = { {512 * 1024, 1} },
1745 .block_erase = erase_chip_block_jedec,
1746 }
1747 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001748 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001749 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001750 },
1751
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001752 {
1753 .vendor = "Atmel",
1754 .name = "AT45CS1282",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001755 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001756 .manufacture_id = ATMEL_ID,
1757 .model_id = AT_45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001758 .total_size = 16896 /* No power of two sizes */,
1759 .page_size = 1056 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001760 .tested = TEST_BAD_READ,
1761 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001762 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001763 .write = NULL /* Incompatible Page write */,
1764 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001765 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001766
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001767 {
1768 .vendor = "Atmel",
1769 .name = "AT45DB011D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001770 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001771 .manufacture_id = ATMEL_ID,
1772 .model_id = AT_45DB011D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001773 .total_size = 128 /* Size can only be determined from status register */,
1774 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001775 .tested = TEST_BAD_READ,
1776 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001777 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001778 .write = NULL,
1779 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001780 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001781
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001782 {
1783 .vendor = "Atmel",
1784 .name = "AT45DB021D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001785 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001786 .manufacture_id = ATMEL_ID,
1787 .model_id = AT_45DB021D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001788 .total_size = 256 /* Size can only be determined from status register */,
1789 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001790 .tested = TEST_BAD_READ,
1791 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001792 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001793 .write = NULL,
1794 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001795 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001796
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001797 {
1798 .vendor = "Atmel",
1799 .name = "AT45DB041D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001800 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001801 .manufacture_id = ATMEL_ID,
1802 .model_id = AT_45DB041D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001803 .total_size = 512 /* Size can only be determined from status register */,
1804 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001805 .tested = TEST_BAD_READ,
1806 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001807 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001808 .write = NULL,
1809 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001810 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001811
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 {
1813 .vendor = "Atmel",
1814 .name = "AT45DB081D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001815 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001816 .manufacture_id = ATMEL_ID,
1817 .model_id = AT_45DB081D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001818 .total_size = 1024 /* Size can only be determined from status register */,
1819 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001820 .tested = TEST_BAD_READ,
1821 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001822 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001823 .write = NULL,
1824 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001825 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001827 {
1828 .vendor = "Atmel",
1829 .name = "AT45DB161D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001830 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001831 .manufacture_id = ATMEL_ID,
1832 .model_id = AT_45DB161D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001833 .total_size = 2048 /* Size can only be determined from status register */,
1834 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001835 .tested = TEST_BAD_READ,
1836 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001837 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001838 .write = NULL,
1839 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001840 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001841
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001842 {
1843 .vendor = "Atmel",
1844 .name = "AT45DB321C",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001845 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001846 .manufacture_id = ATMEL_ID,
1847 .model_id = AT_45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001848 .total_size = 4224 /* No power of two sizes */,
1849 .page_size = 528 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001850 .tested = TEST_BAD_READ,
1851 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001852 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001853 .write = NULL,
1854 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001855 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001856
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001857 {
1858 .vendor = "Atmel",
1859 .name = "AT45DB321D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001860 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001861 .manufacture_id = ATMEL_ID,
1862 .model_id = AT_45DB321D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001863 .total_size = 4096 /* Size can only be determined from status register */,
1864 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001865 .tested = TEST_BAD_READ,
1866 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001867 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001868 .write = NULL,
1869 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001870 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001871
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001872 {
1873 .vendor = "Atmel",
1874 .name = "AT45DB642D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001875 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001876 .manufacture_id = ATMEL_ID,
1877 .model_id = AT_45DB642D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001878 .total_size = 8192 /* Size can only be determined from status register */,
1879 .page_size = 1024 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001880 .tested = TEST_BAD_READ,
1881 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001882 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001883 .write = NULL,
1884 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001885 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001886
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001887 {
1888 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001889 .name = "AT49BV512",
Urja Rannikko161b8852009-06-05 08:47:37 +00001890 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001891 .manufacture_id = ATMEL_ID,
1892 .model_id = AT_49BV512,
1893 .total_size = 64,
1894 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00001895 .feature_bits = FEATURE_EITHER_RESET,
1896 .tested = TEST_UNTESTED,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001897 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001898 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001899 .block_erasers =
1900 {
1901 {
1902 .eraseblocks = { {64 * 1024, 1} },
1903 .block_erase = erase_chip_block_jedec,
1904 }
1905 },
Sean Nelson35727f72010-01-28 23:55:12 +00001906 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001907 .read = read_memmapped,
1908 },
1909
1910 {
1911 .vendor = "Atmel",
Andrew Morgan1a5eaa12010-06-07 14:10:55 +00001912 .name = "AT49F020",
1913 .bustype = CHIP_BUSTYPE_PARALLEL,
1914 .manufacture_id = ATMEL_ID,
1915 .model_id = AT_49F020,
1916 .total_size = 256,
1917 .page_size = 256,
1918 .feature_bits = FEATURE_EITHER_RESET,
1919 .tested = TEST_OK_PREW,
1920 .probe = probe_jedec,
1921 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
1922 .block_erasers =
1923 {
1924 {
1925 .eraseblocks = { {256 * 1024, 1} },
1926 .block_erase = erase_chip_block_jedec,
1927 }
1928 },
1929 .write = write_jedec_1,
1930 .read = read_memmapped,
1931 },
1932
1933 {
1934 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001935 .name = "AT49F002(N)",
Urja Rannikko161b8852009-06-05 08:47:37 +00001936 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001937 .manufacture_id = ATMEL_ID,
1938 .model_id = AT_49F002N,
1939 .total_size = 256,
1940 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001941 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001942 .tested = TEST_UNTESTED,
1943 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001944 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001945 .block_erasers =
1946 {
1947 {
1948 .eraseblocks = {
1949 {16 * 1024, 1},
1950 {8 * 1024, 2},
1951 {96 * 1024, 1},
1952 {128 * 1024, 1},
1953 },
1954 .block_erase = erase_sector_jedec,
1955 }, {
1956 .eraseblocks = { {256 * 1024, 1} },
1957 .block_erase = erase_chip_block_jedec,
1958 }
1959 },
Sean Nelson35727f72010-01-28 23:55:12 +00001960 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001961 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001962 },
1963
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001964 {
1965 .vendor = "Atmel",
1966 .name = "AT49F002(N)T",
Urja Rannikko161b8852009-06-05 08:47:37 +00001967 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001968 .manufacture_id = ATMEL_ID,
1969 .model_id = AT_49F002NT,
1970 .total_size = 256,
1971 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001972 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00001973 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001974 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001975 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001976 .block_erasers =
1977 {
1978 {
1979 .eraseblocks = {
1980 {128 * 1024, 1},
1981 {96 * 1024, 1},
1982 {8 * 1024, 2},
1983 {16 * 1024, 1},
1984 },
1985 .block_erase = erase_sector_jedec,
1986 }, {
1987 .eraseblocks = { {256 * 1024, 1} },
1988 .block_erase = erase_chip_block_jedec,
1989 }
1990 },
Sean Nelson35727f72010-01-28 23:55:12 +00001991 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001992 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001993 },
1994
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00001995 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001996 .vendor = "EMST",
1997 .name = "F49B002UA",
Urja Rannikko161b8852009-06-05 08:47:37 +00001998 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001999 .manufacture_id = EMST_ID,
2000 .model_id = EMST_F49B002UA,
2001 .total_size = 256,
2002 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00002003 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002004 .tested = TEST_UNTESTED,
2005 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002006 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00002007 .block_erasers =
2008 {
2009 {
2010 .eraseblocks = {
2011 {128 * 1024, 1},
2012 {96 * 1024, 1},
2013 {8 * 1024, 2},
2014 {16 * 1024, 1},
2015 },
2016 .block_erase = erase_sector_jedec,
2017 }, {
2018 .eraseblocks = { {256 * 1024, 1} },
2019 .block_erase = erase_chip_block_jedec,
2020 }
2021 },
Sean Nelson35727f72010-01-28 23:55:12 +00002022 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002023 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002024 },
2025
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002026 {
Michael Karcher80a59ea2010-06-19 22:06:35 +00002027 .vendor = "EMST",
2028 .name = "F25L008A",
2029 .bustype = CHIP_BUSTYPE_SPI,
2030 .manufacture_id = EMST_ID,
2031 .model_id = EMST_F25L008A,
2032 .total_size = 1024,
2033 .page_size = 256,
2034 .tested = TEST_UNTESTED,
2035 .probe = probe_spi_rdid,
2036 .probe_timing = TIMING_ZERO,
2037 .block_erasers =
2038 {
2039 {
2040 .eraseblocks = { {4 * 1024, 256} },
2041 .block_erase = spi_block_erase_20,
2042 }, {
2043 .eraseblocks = { {64 * 1024, 16} },
2044 .block_erase = spi_block_erase_d8,
2045 }, {
2046 .eraseblocks = { {1024 * 1024, 1} },
2047 .block_erase = spi_block_erase_60,
2048 }, {
2049 .eraseblocks = { {1024 * 1024, 1} },
2050 .block_erase = spi_block_erase_c7,
2051 }
2052 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002053 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00002054 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00002055 .read = spi_chip_read,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002056 },
2057
2058 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002059 .vendor = "Eon",
2060 .name = "EN25B05",
2061 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002062 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002063 .model_id = EN_25B05,
2064 .total_size = 64,
2065 .page_size = 256,
2066 .tested = TEST_UNTESTED,
2067 .probe = probe_spi_rdid,
2068 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002069 .block_erasers =
2070 {
2071 {
2072 .eraseblocks = {
2073 {4 * 1024, 2},
2074 {8 * 1024, 1},
2075 {16 * 1024, 1},
2076 {32 * 1024, 1},
2077 },
2078 .block_erase = spi_block_erase_d8,
2079 }, {
2080 .eraseblocks = { {64 * 1024, 1} },
2081 .block_erase = spi_block_erase_c7,
2082 }
2083 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002084 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002085 .write = spi_chip_write_256,
2086 .read = spi_chip_read,
2087 },
2088
2089 {
2090 .vendor = "Eon",
2091 .name = "EN25B05T",
2092 .bustype = CHIP_BUSTYPE_SPI,
2093 .manufacture_id = EON_ID_NOPREFIX,
2094 .model_id = EN_25B05,
2095 .total_size = 64,
2096 .page_size = 256,
2097 .tested = TEST_UNTESTED,
2098 .probe = probe_spi_rdid,
2099 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002100 .block_erasers =
2101 {
2102 {
2103 .eraseblocks = {
2104 {32 * 1024, 1},
2105 {16 * 1024, 1},
2106 {8 * 1024, 1},
2107 {4 * 1024, 2},
2108 },
2109 .block_erase = spi_block_erase_d8,
2110 }, {
2111 .eraseblocks = { {64 * 1024, 1} },
2112 .block_erase = spi_block_erase_c7,
2113 }
2114 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002115 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002116 .write = spi_chip_write_256,
2117 .read = spi_chip_read,
2118 },
2119
2120 {
2121 .vendor = "Eon",
2122 .name = "EN25B10",
2123 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002124 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002125 .model_id = EN_25B10,
2126 .total_size = 128,
2127 .page_size = 256,
2128 .tested = TEST_UNTESTED,
2129 .probe = probe_spi_rdid,
2130 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002131 .block_erasers =
2132 {
2133 {
2134 .eraseblocks = {
2135 {4 * 1024, 2},
2136 {8 * 1024, 1},
2137 {16 * 1024, 1},
2138 {32 * 1024, 3},
2139 },
2140 .block_erase = spi_block_erase_d8,
2141 }, {
2142 .eraseblocks = { {128 * 1024, 1} },
2143 .block_erase = spi_block_erase_c7,
2144 }
2145 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002146 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002147 .write = spi_chip_write_256,
2148 .read = spi_chip_read,
2149 },
2150
2151 {
2152 .vendor = "Eon",
2153 .name = "EN25B10T",
2154 .bustype = CHIP_BUSTYPE_SPI,
2155 .manufacture_id = EON_ID_NOPREFIX,
2156 .model_id = EN_25B10,
2157 .total_size = 128,
2158 .page_size = 256,
2159 .tested = TEST_UNTESTED,
2160 .probe = probe_spi_rdid,
2161 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002162 .block_erasers =
2163 {
2164 {
2165 .eraseblocks = {
2166 {32 * 1024, 3},
2167 {16 * 1024, 1},
2168 {8 * 1024, 1},
2169 {4 * 1024, 2},
2170 },
2171 .block_erase = spi_block_erase_d8,
2172 }, {
2173 .eraseblocks = { {128 * 1024, 1} },
2174 .block_erase = spi_block_erase_c7,
2175 }
2176 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002177 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002178 .write = spi_chip_write_256,
2179 .read = spi_chip_read,
2180 },
2181
2182 {
2183 .vendor = "Eon",
2184 .name = "EN25B20",
2185 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002186 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002187 .model_id = EN_25B20,
2188 .total_size = 256,
2189 .page_size = 256,
2190 .tested = TEST_UNTESTED,
2191 .probe = probe_spi_rdid,
2192 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002193 .block_erasers =
2194 {
2195 {
2196 .eraseblocks = {
2197 {4 * 1024, 2},
2198 {8 * 1024, 1},
2199 {16 * 1024, 1},
2200 {32 * 1024, 1},
2201 {64 * 1024, 3}
2202 },
2203 .block_erase = spi_block_erase_d8,
2204 }, {
2205 .eraseblocks = { {256 * 1024, 1} },
2206 .block_erase = spi_block_erase_c7,
2207 }
2208 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002209 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002210 .write = spi_chip_write_256,
2211 .read = spi_chip_read,
2212 },
2213
2214 {
2215 .vendor = "Eon",
2216 .name = "EN25B20T",
2217 .bustype = CHIP_BUSTYPE_SPI,
2218 .manufacture_id = EON_ID_NOPREFIX,
2219 .model_id = EN_25B20,
2220 .total_size = 256,
2221 .page_size = 256,
2222 .tested = TEST_UNTESTED,
2223 .probe = probe_spi_rdid,
2224 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002225 .block_erasers =
2226 {
2227 {
2228 .eraseblocks = {
2229 {64 * 1024, 3},
2230 {32 * 1024, 1},
2231 {16 * 1024, 1},
2232 {8 * 1024, 1},
2233 {4 * 1024, 2},
2234 },
2235 .block_erase = spi_block_erase_d8,
2236 }, {
2237 .eraseblocks = { {256 * 1024, 1} },
2238 .block_erase = spi_block_erase_c7,
2239 }
2240 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002241 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002242 .write = spi_chip_write_256,
2243 .read = spi_chip_read,
2244 },
2245
2246 {
2247 .vendor = "Eon",
2248 .name = "EN25B40",
2249 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002250 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002251 .model_id = EN_25B40,
2252 .total_size = 512,
2253 .page_size = 256,
2254 .tested = TEST_UNTESTED,
2255 .probe = probe_spi_rdid,
2256 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002257 .block_erasers =
2258 {
2259 {
2260 .eraseblocks = {
2261 {4 * 1024, 2},
2262 {8 * 1024, 1},
2263 {16 * 1024, 1},
2264 {32 * 1024, 1},
2265 {64 * 1024, 7}
2266 },
2267 .block_erase = spi_block_erase_d8,
2268 }, {
2269 .eraseblocks = { {512 * 1024, 1} },
2270 .block_erase = spi_block_erase_c7,
2271 }
2272 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002273 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002274 .write = spi_chip_write_256,
2275 .read = spi_chip_read,
2276 },
2277
2278 {
2279 .vendor = "Eon",
2280 .name = "EN25B40T",
2281 .bustype = CHIP_BUSTYPE_SPI,
2282 .manufacture_id = EON_ID_NOPREFIX,
2283 .model_id = EN_25B40,
2284 .total_size = 512,
2285 .page_size = 256,
2286 .tested = TEST_UNTESTED,
2287 .probe = probe_spi_rdid,
2288 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002289 .block_erasers =
2290 {
2291 {
2292 .eraseblocks = {
2293 {64 * 1024, 7},
2294 {32 * 1024, 1},
2295 {16 * 1024, 1},
2296 {8 * 1024, 1},
2297 {4 * 1024, 2},
2298 },
2299 .block_erase = spi_block_erase_d8,
2300 }, {
2301 .eraseblocks = { {512 * 1024, 1} },
2302 .block_erase = spi_block_erase_c7,
2303 }
2304 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002305 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002306 .write = spi_chip_write_256,
2307 .read = spi_chip_read,
2308 },
2309
2310 {
2311 .vendor = "Eon",
2312 .name = "EN25B80",
2313 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002314 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002315 .model_id = EN_25B80,
2316 .total_size = 1024,
2317 .page_size = 256,
2318 .tested = TEST_UNTESTED,
2319 .probe = probe_spi_rdid,
2320 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002321 .block_erasers =
2322 {
2323 {
2324 .eraseblocks = {
2325 {4 * 1024, 2},
2326 {8 * 1024, 1},
2327 {16 * 1024, 1},
2328 {32 * 1024, 1},
2329 {64 * 1024, 15}
2330 },
2331 .block_erase = spi_block_erase_d8,
2332 }, {
2333 .eraseblocks = { {1024 * 1024, 1} },
2334 .block_erase = spi_block_erase_c7,
2335 }
2336 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002337 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002338 .write = spi_chip_write_256,
2339 .read = spi_chip_read,
2340 },
2341
2342 {
2343 .vendor = "Eon",
2344 .name = "EN25B80T",
2345 .bustype = CHIP_BUSTYPE_SPI,
2346 .manufacture_id = EON_ID_NOPREFIX,
2347 .model_id = EN_25B80,
2348 .total_size = 1024,
2349 .page_size = 256,
2350 .tested = TEST_UNTESTED,
2351 .probe = probe_spi_rdid,
2352 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002353 .block_erasers =
2354 {
2355 {
2356 .eraseblocks = {
2357 {64 * 1024, 15},
2358 {32 * 1024, 1},
2359 {16 * 1024, 1},
2360 {8 * 1024, 1},
2361 {4 * 1024, 2},
2362 },
2363 .block_erase = spi_block_erase_d8,
2364 }, {
2365 .eraseblocks = { {1024 * 1024, 1} },
2366 .block_erase = spi_block_erase_c7,
2367 }
2368 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002369 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002370 .write = spi_chip_write_256,
2371 .read = spi_chip_read,
2372 },
2373
2374 {
2375 .vendor = "Eon",
2376 .name = "EN25B16",
2377 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002378 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002379 .model_id = EN_25B16,
2380 .total_size = 2048,
2381 .page_size = 256,
2382 .tested = TEST_UNTESTED,
2383 .probe = probe_spi_rdid,
2384 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002385 .block_erasers =
2386 {
2387 {
2388 .eraseblocks = {
2389 {4 * 1024, 2},
2390 {8 * 1024, 1},
2391 {16 * 1024, 1},
2392 {32 * 1024, 1},
2393 {64 * 1024, 31},
2394 },
2395 .block_erase = spi_block_erase_d8,
2396 }, {
2397 .eraseblocks = { {2 * 1024 * 1024, 1} },
2398 .block_erase = spi_block_erase_c7,
2399 }
2400 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002401 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002402 .write = spi_chip_write_256,
2403 .read = spi_chip_read,
2404 },
2405
2406 {
2407 .vendor = "Eon",
2408 .name = "EN25B16T",
2409 .bustype = CHIP_BUSTYPE_SPI,
2410 .manufacture_id = EON_ID_NOPREFIX,
2411 .model_id = EN_25B16,
2412 .total_size = 2048,
2413 .page_size = 256,
2414 .tested = TEST_UNTESTED,
2415 .probe = probe_spi_rdid,
2416 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002417 .block_erasers =
2418 {
2419 {
2420 .eraseblocks = {
2421 {64 * 1024, 31},
2422 {32 * 1024, 1},
2423 {16 * 1024, 1},
2424 {8 * 1024, 1},
2425 {4 * 1024, 2},
2426 },
2427 .block_erase = spi_block_erase_d8,
2428 }, {
2429 .eraseblocks = { {2 * 1024 * 1024, 1} },
2430 .block_erase = spi_block_erase_c7,
2431 }
2432 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002433 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002434 .write = spi_chip_write_256,
2435 .read = spi_chip_read,
2436 },
2437
2438 {
2439 .vendor = "Eon",
2440 .name = "EN25B32",
2441 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002442 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002443 .model_id = EN_25B32,
2444 .total_size = 4096,
2445 .page_size = 256,
2446 .tested = TEST_UNTESTED,
2447 .probe = probe_spi_rdid,
2448 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002449 .block_erasers =
2450 {
2451 {
2452 .eraseblocks = {
2453 {4 * 1024, 2},
2454 {8 * 1024, 1},
2455 {16 * 1024, 1},
2456 {32 * 1024, 1},
2457 {64 * 1024, 63},
2458 },
2459 .block_erase = spi_block_erase_d8,
2460 }, {
2461 .eraseblocks = { {4 * 1024 * 1024, 1} },
2462 .block_erase = spi_block_erase_c7,
2463 }
2464 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002465 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002466 .write = spi_chip_write_256,
2467 .read = spi_chip_read,
2468 },
2469
2470 {
2471 .vendor = "Eon",
2472 .name = "EN25B32T",
2473 .bustype = CHIP_BUSTYPE_SPI,
2474 .manufacture_id = EON_ID_NOPREFIX,
2475 .model_id = EN_25B32,
2476 .total_size = 4096,
2477 .page_size = 256,
2478 .tested = TEST_UNTESTED,
2479 .probe = probe_spi_rdid,
2480 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002481 .block_erasers =
2482 {
2483 {
2484 .eraseblocks = {
2485 {64 * 1024, 63},
2486 {32 * 1024, 1},
2487 {16 * 1024, 1},
2488 {8 * 1024, 1},
2489 {4 * 1024, 2},
2490 },
2491 .block_erase = spi_block_erase_d8,
2492 }, {
2493 .eraseblocks = { {4 * 1024 * 1024, 1} },
2494 .block_erase = spi_block_erase_c7,
2495 }
2496 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002497 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002498 .write = spi_chip_write_256,
2499 .read = spi_chip_read,
2500 },
2501
2502 {
2503 .vendor = "Eon",
2504 .name = "EN25B64",
2505 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002506 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002507 .model_id = EN_25B64,
2508 .total_size = 8192,
2509 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002510 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002511 .tested = TEST_UNTESTED,
2512 .probe = probe_spi_rdid,
2513 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002514 .block_erasers =
2515 {
2516 {
2517 .eraseblocks = {
2518 {4 * 1024, 2},
2519 {8 * 1024, 1},
2520 {16 * 1024, 1},
2521 {32 * 1024, 1},
2522 {64 * 1024, 127},
2523 },
2524 .block_erase = spi_block_erase_d8,
2525 }, {
2526 .eraseblocks = { {8 * 1024 * 1024, 1} },
2527 .block_erase = spi_block_erase_c7,
2528 }
2529 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002530 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002531 .write = spi_chip_write_256,
2532 .read = spi_chip_read,
2533 },
2534
2535 {
2536 .vendor = "Eon",
2537 .name = "EN25B64T",
2538 .bustype = CHIP_BUSTYPE_SPI,
2539 .manufacture_id = EON_ID_NOPREFIX,
2540 .model_id = EN_25B64,
2541 .total_size = 8192,
2542 .page_size = 256,
2543 .tested = TEST_UNTESTED,
2544 .probe = probe_spi_rdid,
2545 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002546 .block_erasers =
2547 {
2548 {
2549 .eraseblocks = {
2550 {64 * 1024, 127},
2551 {32 * 1024, 1},
2552 {16 * 1024, 1},
2553 {8 * 1024, 1},
2554 {4 * 1024, 2},
2555 },
2556 .block_erase = spi_block_erase_d8,
2557 }, {
2558 .eraseblocks = { {8 * 1024 * 1024, 1} },
2559 .block_erase = spi_block_erase_c7,
2560 }
2561 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002562 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002563 .write = spi_chip_write_256,
2564 .read = spi_chip_read,
2565 },
2566
2567 {
2568 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002569 .name = "EN25D16",
2570 .bustype = CHIP_BUSTYPE_SPI,
2571 .manufacture_id = EON_ID_NOPREFIX,
2572 .model_id = EN_25D16,
2573 .total_size = 2048,
2574 .page_size = 256,
2575 .tested = TEST_UNTESTED,
2576 .probe = probe_spi_rdid,
2577 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002578 .block_erasers =
2579 {
2580 {
2581 .eraseblocks = { {4 * 1024, 512} },
2582 .block_erase = spi_block_erase_20,
2583 }, {
2584 .eraseblocks = { {64 * 1024, 32} },
2585 .block_erase = spi_block_erase_d8,
2586 }, {
2587 .eraseblocks = { {64 * 1024, 32} },
2588 .block_erase = spi_block_erase_52,
2589 }, {
2590 .eraseblocks = { {2 * 1024 * 1024, 1} },
2591 .block_erase = spi_block_erase_60,
2592 }, {
2593 .eraseblocks = { {2 * 1024 * 1024, 1} },
2594 .block_erase = spi_block_erase_c7,
2595 }
2596 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002597 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002598 .write = spi_chip_write_256,
2599 .read = spi_chip_read,
2600 },
2601
2602 {
2603 .vendor = "Eon",
2604 .name = "EN25F05",
2605 .bustype = CHIP_BUSTYPE_SPI,
2606 .manufacture_id = EON_ID_NOPREFIX,
2607 .model_id = EN_25F05,
2608 .total_size = 64,
2609 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002610 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002611 .tested = TEST_UNTESTED,
2612 .probe = probe_spi_rdid,
2613 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002614 .block_erasers =
2615 {
2616 {
2617 .eraseblocks = { {4 * 1024, 16} },
2618 .block_erase = spi_block_erase_20,
2619 }, {
2620 .eraseblocks = { {32 * 1024, 2} },
2621 .block_erase = spi_block_erase_d8,
2622 }, {
2623 .eraseblocks = { {32 * 1024, 2} },
2624 .block_erase = spi_block_erase_52,
2625 }, {
2626 .eraseblocks = { {64 * 1024, 1} },
2627 .block_erase = spi_block_erase_60,
2628 }, {
2629 .eraseblocks = { {64 * 1024, 1} },
2630 .block_erase = spi_block_erase_c7,
2631 }
2632 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002633 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002634 .write = spi_chip_write_256,
2635 .read = spi_chip_read,
2636 },
2637
2638 {
2639 .vendor = "Eon",
2640 .name = "EN25F10",
2641 .bustype = CHIP_BUSTYPE_SPI,
2642 .manufacture_id = EON_ID_NOPREFIX,
2643 .model_id = EN_25F10,
2644 .total_size = 128,
2645 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002646 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002647 .tested = TEST_UNTESTED,
2648 .probe = probe_spi_rdid,
2649 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002650 .block_erasers =
2651 {
2652 {
2653 .eraseblocks = { {4 * 1024, 32} },
2654 .block_erase = spi_block_erase_20,
2655 }, {
2656 .eraseblocks = { {32 * 1024, 4} },
2657 .block_erase = spi_block_erase_d8,
2658 }, {
2659 .eraseblocks = { {32 * 1024, 4} },
2660 .block_erase = spi_block_erase_52,
2661 }, {
2662 .eraseblocks = { {128 * 1024, 1} },
2663 .block_erase = spi_block_erase_60,
2664 }, {
2665 .eraseblocks = { {128 * 1024, 1} },
2666 .block_erase = spi_block_erase_c7,
2667 }
2668 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002669 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002670 .write = spi_chip_write_256,
2671 .read = spi_chip_read,
2672 },
2673
2674 {
2675 .vendor = "Eon",
2676 .name = "EN25F20",
2677 .bustype = CHIP_BUSTYPE_SPI,
2678 .manufacture_id = EON_ID_NOPREFIX,
2679 .model_id = EN_25F20,
2680 .total_size = 256,
2681 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002682 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002683 .tested = TEST_UNTESTED,
2684 .probe = probe_spi_rdid,
2685 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002686 .block_erasers =
2687 {
2688 {
2689 .eraseblocks = { {4 * 1024, 64} },
2690 .block_erase = spi_block_erase_20,
2691 }, {
2692 .eraseblocks = { {64 * 1024, 4} },
2693 .block_erase = spi_block_erase_d8,
2694 }, {
2695 .eraseblocks = { {64 * 1024, 4} },
2696 .block_erase = spi_block_erase_52,
2697 }, {
2698 .eraseblocks = { {256 * 1024, 1} },
2699 .block_erase = spi_block_erase_60,
2700 }, {
2701 .eraseblocks = { {256 * 1024, 1} },
2702 .block_erase = spi_block_erase_c7,
2703 }
2704 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002705 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002706 .write = spi_chip_write_256,
2707 .read = spi_chip_read,
2708 },
2709
2710 {
2711 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002712 .name = "EN25F40",
2713 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002714 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002715 .model_id = EN_25F40,
2716 .total_size = 512,
2717 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002718 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00002719 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002720 .probe = probe_spi_rdid,
2721 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002722 .block_erasers =
2723 {
2724 {
Sean Nelson54596372010-01-09 05:30:14 +00002725 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002726 .block_erase = spi_block_erase_20,
2727 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002728 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002729 .block_erase = spi_block_erase_d8,
2730 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002731 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002732 .block_erase = spi_block_erase_60,
2733 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002734 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002735 .block_erase = spi_block_erase_c7,
2736 },
2737 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002738 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002739 .write = spi_chip_write_256,
2740 .read = spi_chip_read,
2741 },
2742
2743 {
2744 .vendor = "Eon",
2745 .name = "EN25F80",
2746 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002747 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002748 .model_id = EN_25F80,
2749 .total_size = 1024,
2750 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002751 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002752 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002753 .probe = probe_spi_rdid,
2754 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002755 .block_erasers =
2756 {
2757 {
2758 .eraseblocks = { {4 * 1024, 256} },
2759 .block_erase = spi_block_erase_20,
2760 }, {
2761 .eraseblocks = { {64 * 1024, 16} },
2762 .block_erase = spi_block_erase_d8,
2763 }, {
2764 .eraseblocks = { {1024 * 1024, 1} },
2765 .block_erase = spi_block_erase_60,
2766 }, {
2767 .eraseblocks = { {1024 * 1024, 1} },
2768 .block_erase = spi_block_erase_c7,
2769 }
2770 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002771 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002772 .write = spi_chip_write_256,
2773 .read = spi_chip_read,
2774 },
2775
2776 {
2777 .vendor = "Eon",
2778 .name = "EN25F16",
2779 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002780 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002781 .model_id = EN_25F16,
2782 .total_size = 2048,
2783 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002784 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002785 .tested = TEST_UNTESTED,
2786 .probe = probe_spi_rdid,
2787 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002788 .block_erasers =
2789 {
2790 {
2791 .eraseblocks = { {4 * 1024, 512} },
2792 .block_erase = spi_block_erase_20,
2793 }, {
2794 .eraseblocks = { {64 * 1024, 32} },
2795 .block_erase = spi_block_erase_d8,
2796 }, {
2797 .eraseblocks = { {2 * 1024 * 1024, 1} },
2798 .block_erase = spi_block_erase_60,
2799 }, {
2800 .eraseblocks = { {2 * 1024 * 1024, 1} },
2801 .block_erase = spi_block_erase_c7,
2802 }
2803 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002804 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002805 .write = spi_chip_write_256,
2806 .read = spi_chip_read,
2807 },
2808
2809 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002810 .vendor = "Eon",
2811 .name = "EN25F32",
2812 .bustype = CHIP_BUSTYPE_SPI,
2813 .manufacture_id = EON_ID_NOPREFIX,
2814 .model_id = EN_25F32,
2815 .total_size = 4096,
2816 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002817 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002818 .tested = TEST_UNTESTED,
2819 .probe = probe_spi_rdid,
2820 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002821 .block_erasers =
2822 {
2823 {
2824 .eraseblocks = { {4 * 1024, 1024} },
2825 .block_erase = spi_block_erase_20,
2826 }, {
2827 .eraseblocks = { {64 * 1024, 64} },
2828 .block_erase = spi_block_erase_d8,
2829 }, {
2830 .eraseblocks = { {4 * 1024 * 1024, 1} },
2831 .block_erase = spi_block_erase_60,
2832 }, {
2833 .eraseblocks = { {4 * 1024 * 1024, 1} },
2834 .block_erase = spi_block_erase_c7,
2835 }
2836 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002837 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002838 .write = spi_chip_write_256,
2839 .read = spi_chip_read,
2840 },
2841
2842 {
Russ Dill3cd5a122010-03-05 08:44:11 +00002843 .vendor = "Eon",
2844 .name = "EN29F010",
2845 .bustype = CHIP_BUSTYPE_PARALLEL,
2846 .manufacture_id = EON_ID,
2847 .model_id = EN_29F010,
2848 .total_size = 128,
2849 .page_size = 128,
2850 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
2851 .tested = TEST_OK_PREW,
2852 .probe = probe_jedec,
2853 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2854 .block_erasers =
2855 {
2856 {
2857 .eraseblocks = { {16 * 1024, 8} },
2858 .block_erase = erase_sector_jedec,
2859 },
2860 {
2861 .eraseblocks = { {128 * 1024, 1} },
2862 .block_erase = erase_chip_block_jedec,
2863 },
2864 },
2865 .write = write_jedec_1,
2866 .read = read_memmapped,
2867 },
2868
2869 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002870 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002871 .name = "EN29F002(A)(N)B",
Urja Rannikko161b8852009-06-05 08:47:37 +00002872 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002873 .manufacture_id = EON_ID,
2874 .model_id = EN_29F002B,
2875 .total_size = 256,
2876 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002877 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00002878 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002879 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002880 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002881 .block_erasers =
2882 {
2883 {
2884 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00002885 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002886 {8 * 1024, 2},
2887 {32 * 1024, 1},
2888 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00002889 },
2890 .block_erase = erase_sector_jedec,
2891 }, {
2892 .eraseblocks = { {256 * 1024, 1} },
2893 .block_erase = erase_chip_block_jedec,
2894 },
2895 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00002896 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002897 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002898 },
2899
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002900 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002901 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002902 .name = "EN29F002(A)(N)T",
Urja Rannikko161b8852009-06-05 08:47:37 +00002903 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002904 .manufacture_id = EON_ID,
2905 .model_id = EN_29F002T,
2906 .total_size = 256,
2907 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002908 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00002909 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002910 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002911 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002912 .block_erasers =
2913 {
2914 {
2915 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00002916 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002917 {32 * 1024, 1},
2918 {8 * 1024, 2},
2919 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00002920 },
2921 .block_erase = erase_sector_jedec,
2922 }, {
2923 .eraseblocks = { {256 * 1024, 1} },
2924 .block_erase = erase_chip_block_jedec,
2925 },
2926 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00002927 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002928 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002929 },
2930
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002931 {
2932 .vendor = "Fujitsu",
2933 .name = "MBM29F004BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002934 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002935 .manufacture_id = FUJITSU_ID,
2936 .model_id = MBM29F004BC,
2937 .total_size = 512,
2938 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002939 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002940 .tested = TEST_UNTESTED,
2941 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002942 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002943 .block_erasers =
2944 {
2945 {
2946 .eraseblocks = {
2947 {16 * 1024, 1},
2948 {8 * 1024, 2},
2949 {32 * 1024, 1},
2950 {64 * 1024, 7},
2951 },
Sean Nelson35727f72010-01-28 23:55:12 +00002952 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002953 }, {
2954 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00002955 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002956 },
2957 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002958 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002959 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002960 },
2961
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002962 {
2963 .vendor = "Fujitsu",
2964 .name = "MBM29F004TC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002965 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002966 .manufacture_id = FUJITSU_ID,
2967 .model_id = MBM29F004TC,
2968 .total_size = 512,
2969 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002970 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002971 .tested = TEST_UNTESTED,
2972 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002973 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002974 .block_erasers =
2975 {
2976 {
2977 .eraseblocks = {
2978 {64 * 1024, 7},
2979 {32 * 1024, 1},
2980 {8 * 1024, 2},
2981 {16 * 1024, 1},
2982 },
Sean Nelson35727f72010-01-28 23:55:12 +00002983 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002984 }, {
2985 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00002986 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002987 },
2988 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002989 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002990 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002991 },
2992
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002993 {
Sean Nelson35727f72010-01-28 23:55:12 +00002994 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002995 .vendor = "Fujitsu",
2996 .name = "MBM29F400BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002997 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002998 .manufacture_id = FUJITSU_ID,
2999 .model_id = MBM29F400BC,
3000 .total_size = 512,
3001 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003002 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00003003 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003004 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003005 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003006 .block_erasers =
3007 {
3008 {
3009 .eraseblocks = {
3010 {16 * 1024, 1},
3011 {8 * 1024, 2},
3012 {32 * 1024, 1},
3013 {64 * 1024, 7},
3014 },
3015 .block_erase = block_erase_m29f400bt,
3016 }, {
3017 .eraseblocks = { {512 * 1024, 1} },
3018 .block_erase = block_erase_chip_m29f400bt,
3019 },
3020 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00003021 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003022 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003023 },
3024
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003025 {
3026 .vendor = "Fujitsu",
3027 .name = "MBM29F400TC",
Urja Rannikko038a3122009-06-28 19:19:25 +00003028 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003029 .manufacture_id = FUJITSU_ID,
3030 .model_id = MBM29F400TC,
3031 .total_size = 512,
3032 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003033 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003034 .tested = TEST_UNTESTED,
3035 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003036 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003037 .block_erasers =
3038 {
3039 {
3040 .eraseblocks = {
3041 {64 * 1024, 7},
3042 {32 * 1024, 1},
3043 {8 * 1024, 2},
3044 {16 * 1024, 1},
3045 },
3046 .block_erase = block_erase_m29f400bt,
3047 }, {
3048 .eraseblocks = { {512 * 1024, 1} },
3049 .block_erase = block_erase_chip_m29f400bt,
3050 },
3051 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00003052 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003053 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003054 },
3055
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003056 {
David Borgc96a8bd2010-06-21 16:12:22 +00003057 .vendor = "Hyundai",
3058 .name = "HY29F002T",
3059 .bustype = CHIP_BUSTYPE_PARALLEL,
3060 .manufacture_id = HYUNDAI_ID,
3061 .model_id = HY_29F002T,
3062 .total_size = 256,
3063 .page_size = 256 * 1024,
3064 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3065 .tested = TEST_OK_PREW,
3066 .probe = probe_jedec,
3067 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3068 .block_erasers =
3069 {
3070 {
3071 .eraseblocks = {
3072 {64 * 1024, 3},
3073 {32 * 1024, 1},
3074 {8 * 1024, 2},
3075 {16 * 1024, 1},
3076 },
3077 .block_erase = erase_sector_jedec,
3078 }, {
3079 .eraseblocks = { {256 * 1024, 1} },
3080 .block_erase = erase_chip_block_jedec,
3081 },
3082 },
3083 .write = write_jedec_1,
3084 .read = read_memmapped,
3085 },
3086
3087 {
3088 .vendor = "Hyundai",
3089 .name = "HY29F002B",
3090 .bustype = CHIP_BUSTYPE_PARALLEL,
3091 .manufacture_id = HYUNDAI_ID,
3092 .model_id = HY_29F002B,
3093 .total_size = 256,
3094 .page_size = 256 * 1024,
3095 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3096 .tested = TEST_UNTESTED,
3097 .probe = probe_jedec,
3098 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3099 .block_erasers =
3100 {
3101 {
3102 .eraseblocks = {
3103 {16 * 1024, 1},
3104 {8 * 1024, 2},
3105 {32 * 1024, 1},
3106 {64 * 1024, 3},
3107 },
3108 .block_erase = erase_sector_jedec,
3109 }, {
3110 .eraseblocks = { {256 * 1024, 1} },
3111 .block_erase = erase_chip_block_jedec,
3112 },
3113 },
3114 .write = write_jedec_1,
3115 .read = read_memmapped,
3116 },
3117
3118 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003119 .vendor = "Intel",
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003120 .name = "28F001BX-B",
Urja Rannikko161b8852009-06-05 08:47:37 +00003121 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003122 .manufacture_id = INTEL_ID,
3123 .model_id = P28F001BXB,
3124 .total_size = 128,
3125 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003126 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003127 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003128 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003129 .block_erasers =
3130 {
3131 {
3132 .eraseblocks = {
3133 {8 * 1024, 1},
3134 {4 * 1024, 2},
3135 {112 * 1024, 1},
3136 },
Sean Nelson28accc22010-03-19 18:47:06 +00003137 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003138 },
3139 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003140 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003141 .read = read_memmapped,
3142 },
3143
3144 {
3145 .vendor = "Intel",
3146 .name = "28F001BX-T",
Urja Rannikko161b8852009-06-05 08:47:37 +00003147 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003148 .manufacture_id = INTEL_ID,
3149 .model_id = P28F001BXT,
3150 .total_size = 128,
3151 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003152 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003153 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003154 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003155 .block_erasers =
3156 {
3157 {
3158 .eraseblocks = {
3159 {112 * 1024, 1},
3160 {4 * 1024, 2},
3161 {8 * 1024, 1},
3162 },
Sean Nelson28accc22010-03-19 18:47:06 +00003163 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003164 },
3165 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003166 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003167 .read = read_memmapped,
3168 },
3169
3170 {
3171 .vendor = "Intel",
Joshua Roysd97c0e02010-07-22 15:20:43 +00003172 .name = "28F002BC-T",
3173 .bustype = CHIP_BUSTYPE_PARALLEL,
3174 .manufacture_id = INTEL_ID,
3175 .model_id = P28F002BC,
3176 .total_size = 256,
3177 .page_size = 256 * 1024,
3178 .tested = TEST_UNTESTED,
3179 .probe = probe_82802ab,
3180 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3181 .block_erasers =
3182 {
3183 {
3184 .eraseblocks = {
3185 {128 * 1024, 1},
3186 {96 * 1024, 1},
3187 {8 * 1024, 2},
3188 {16 * 1024, 1},
3189 },
3190 .block_erase = erase_block_82802ab,
3191 },
3192 },
3193 .write = write_82802ab,
3194 .read = read_memmapped,
3195 },
3196
3197 {
3198 .vendor = "Intel",
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003199 .name = "28F004S5",
3200 .bustype = CHIP_BUSTYPE_PARALLEL,
3201 .manufacture_id = INTEL_ID,
3202 .model_id = E_28F004S5,
3203 .total_size = 512,
3204 .page_size = 256,
3205 .tested = TEST_UNTESTED,
3206 .probe = probe_82802ab,
3207 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003208 .block_erasers =
3209 {
3210 {
3211 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003212 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003213 },
3214 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003215 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003216 .write = write_82802ab,
3217 .read = read_memmapped,
3218 },
3219
3220 {
3221 .vendor = "Intel",
Michael Karcherad0010a2010-04-03 10:27:08 +00003222 .name = "28F004BV/BE-B",
3223 .bustype = CHIP_BUSTYPE_PARALLEL,
3224 .manufacture_id = INTEL_ID,
3225 .model_id = P28F004BB,
3226 .total_size = 512,
3227 .page_size = 128 * 1024, /* maximal block size */
3228 .tested = TEST_UNTESTED,
3229 .probe = probe_82802ab,
3230 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3231 .block_erasers =
3232 {
3233 {
3234 .eraseblocks = {
3235 {16 * 1024, 1},
3236 {8 * 1024, 2},
3237 {96 * 1024, 1},
3238 {128 * 1024, 3},
3239 },
3240 .block_erase = erase_block_82802ab,
3241 },
3242 },
3243 .write = write_82802ab,
3244 .read = read_memmapped,
3245 },
3246
3247 {
3248 .vendor = "Intel",
3249 .name = "28F004BV/BE-T",
3250 .bustype = CHIP_BUSTYPE_PARALLEL,
3251 .manufacture_id = INTEL_ID,
3252 .model_id = P28F004BT,
3253 .total_size = 512,
3254 .page_size = 128 * 1024, /* maximal block size */
3255 .tested = TEST_UNTESTED,
3256 .probe = probe_82802ab,
3257 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3258 .block_erasers =
3259 {
3260 {
3261 .eraseblocks = {
3262 {128 * 1024, 3},
3263 {96 * 1024, 1},
3264 {8 * 1024, 2},
3265 {16 * 1024, 1},
3266 },
3267 .block_erase = erase_block_82802ab,
3268 },
3269 },
3270 .write = write_82802ab,
3271 .read = read_memmapped,
3272 },
3273
3274 {
3275 .vendor = "Intel",
3276 .name = "28F400BV/CV/CE-B",
3277 .bustype = CHIP_BUSTYPE_PARALLEL,
3278 .manufacture_id = INTEL_ID,
3279 .model_id = P28F400BB,
3280 .total_size = 512,
3281 .page_size = 128 * 1024, /* maximal block size */
3282 .feature_bits = FEATURE_ADDR_SHIFTED,
3283 .tested = TEST_UNTESTED,
3284 .probe = probe_82802ab,
3285 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3286 .block_erasers =
3287 {
3288 {
3289 .eraseblocks = {
3290 {16 * 1024, 1},
3291 {8 * 1024, 2},
3292 {96 * 1024, 1},
3293 {128 * 1024, 3},
3294 },
3295 .block_erase = erase_block_82802ab,
3296 },
3297 },
3298 .write = write_82802ab,
3299 .read = read_memmapped,
3300 },
3301
3302 {
3303 .vendor = "Intel",
3304 .name = "28F400BV/CV/CE-T",
3305 .bustype = CHIP_BUSTYPE_PARALLEL,
3306 .manufacture_id = INTEL_ID,
3307 .model_id = P28F400BT,
3308 .total_size = 512,
3309 .page_size = 128 * 1024, /* maximal block size */
3310 .feature_bits = FEATURE_ADDR_SHIFTED,
3311 .tested = TEST_UNTESTED,
3312 .probe = probe_82802ab,
3313 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3314 .block_erasers =
3315 {
3316 {
3317 .eraseblocks = {
3318 {128 * 1024, 3},
3319 {96 * 1024, 1},
3320 {8 * 1024, 2},
3321 {16 * 1024, 1},
3322 },
3323 .block_erase = erase_block_82802ab,
3324 },
3325 },
3326 .write = write_82802ab,
3327 .read = read_memmapped,
3328 },
3329
3330 {
3331 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003332 .name = "82802AB",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003333 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003334 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003335 .model_id = I_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003336 .total_size = 512,
3337 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003338 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003339 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003340 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003341 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003342 .block_erasers =
3343 {
3344 {
3345 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003346 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003347 },
3348 },
Sean Nelson28accc22010-03-19 18:47:06 +00003349 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003350 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003351 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003352 },
3353
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003354 {
3355 .vendor = "Intel",
3356 .name = "82802AC",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003357 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003358 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003359 .model_id = I_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003360 .total_size = 1024,
3361 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003362 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003363 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003364 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003365 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003366 .block_erasers =
3367 {
3368 {
3369 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00003370 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003371 },
3372 },
Sean Nelson28accc22010-03-19 18:47:06 +00003373 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003374 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003375 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003376 },
3377
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003378 {
3379 .vendor = "Macronix",
3380 .name = "MX25L512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003381 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003382 .manufacture_id = MX_ID,
3383 .model_id = MX_25L512,
3384 .total_size = 64,
3385 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003386 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003387 .tested = TEST_UNTESTED,
3388 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003389 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003390 .block_erasers =
3391 {
3392 {
3393 .eraseblocks = { {4 * 1024, 16} },
3394 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003395 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003396 .eraseblocks = { {64 * 1024, 1} },
3397 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003398 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003399 .eraseblocks = { {64 * 1024, 1} },
3400 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003401 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003402 .eraseblocks = { {64 * 1024, 1} },
3403 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003404 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003405 .eraseblocks = { {64 * 1024, 1} },
3406 .block_erase = spi_block_erase_c7,
3407 },
3408 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003409 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003410 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003411 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003412 },
3413
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003414 {
3415 .vendor = "Macronix",
3416 .name = "MX25L1005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003417 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003418 .manufacture_id = MX_ID,
3419 .model_id = MX_25L1005,
3420 .total_size = 128,
3421 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003422 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003423 .tested = TEST_UNTESTED,
3424 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003425 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003426 .block_erasers =
3427 {
3428 {
3429 .eraseblocks = { {4 * 1024, 32} },
3430 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003431 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003432 .eraseblocks = { {64 * 1024, 2} },
3433 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003434 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003435 .eraseblocks = { {128 * 1024, 1} },
3436 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003437 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003438 .eraseblocks = { {128 * 1024, 1} },
3439 .block_erase = spi_block_erase_c7,
3440 },
3441 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003442 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003443 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003444 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003445 },
3446
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003447 {
3448 .vendor = "Macronix",
3449 .name = "MX25L2005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003450 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003451 .manufacture_id = MX_ID,
3452 .model_id = MX_25L2005,
3453 .total_size = 256,
3454 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003455 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003456 .tested = TEST_UNTESTED,
3457 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003458 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003459 .block_erasers =
3460 {
3461 {
3462 .eraseblocks = { {4 * 1024, 64} },
3463 .block_erase = spi_block_erase_20,
3464 }, {
3465 .eraseblocks = { {64 * 1024, 4} },
3466 .block_erase = spi_block_erase_52,
3467 }, {
3468 .eraseblocks = { {64 * 1024, 4} },
3469 .block_erase = spi_block_erase_d8,
3470 }, {
3471 .eraseblocks = { {256 * 1024, 1} },
3472 .block_erase = spi_block_erase_60,
3473 }, {
3474 .eraseblocks = { {256 * 1024, 1} },
3475 .block_erase = spi_block_erase_c7,
3476 },
3477 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003478 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003479 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003480 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003481 },
3482
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003483 {
3484 .vendor = "Macronix",
3485 .name = "MX25L4005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003486 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003487 .manufacture_id = MX_ID,
3488 .model_id = MX_25L4005,
3489 .total_size = 512,
3490 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003491 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003492 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003493 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003494 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003495 .block_erasers =
3496 {
3497 {
3498 .eraseblocks = { {4 * 1024, 128} },
3499 .block_erase = spi_block_erase_20,
3500 }, {
3501 .eraseblocks = { {64 * 1024, 8} },
3502 .block_erase = spi_block_erase_52,
3503 }, {
3504 .eraseblocks = { {64 * 1024, 8} },
3505 .block_erase = spi_block_erase_d8,
3506 }, {
3507 .eraseblocks = { {512 * 1024, 1} },
3508 .block_erase = spi_block_erase_60,
3509 }, {
3510 .eraseblocks = { {512 * 1024, 1} },
3511 .block_erase = spi_block_erase_c7,
3512 },
3513 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003514 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003515 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003516 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003517 },
3518
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003519 {
3520 .vendor = "Macronix",
3521 .name = "MX25L8005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003522 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003523 .manufacture_id = MX_ID,
3524 .model_id = MX_25L8005,
3525 .total_size = 1024,
3526 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003527 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00003528 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003529 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003530 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003531 .block_erasers =
3532 {
3533 {
3534 .eraseblocks = { {4 * 1024, 256} },
3535 .block_erase = spi_block_erase_20,
3536 }, {
3537 .eraseblocks = { {64 * 1024, 16} },
3538 .block_erase = spi_block_erase_52,
3539 }, {
3540 .eraseblocks = { {64 * 1024, 16} },
3541 .block_erase = spi_block_erase_d8,
3542 }, {
3543 .eraseblocks = { {1024 * 1024, 1} },
3544 .block_erase = spi_block_erase_60,
3545 }, {
3546 .eraseblocks = { {1024 * 1024, 1} },
3547 .block_erase = spi_block_erase_c7,
3548 },
3549 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003550 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003551 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003552 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003553 },
3554
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003555 {
3556 .vendor = "Macronix",
3557 .name = "MX25L1605",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003558 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003559 .manufacture_id = MX_ID,
3560 .model_id = MX_25L1605,
3561 .total_size = 2048,
3562 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003563 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003564 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003565 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003566 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003567 .block_erasers =
3568 {
3569 {
3570 .eraseblocks = { {4 * 1024, 512} },
3571 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
3572 }, {
3573 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
3574 .block_erase = spi_block_erase_52,
3575 }, {
3576 .eraseblocks = { {64 * 1024, 32} },
3577 .block_erase = spi_block_erase_d8,
3578 }, {
3579 .eraseblocks = { {2 * 1024 * 1024, 1} },
3580 .block_erase = spi_block_erase_60,
3581 }, {
3582 .eraseblocks = { {2 * 1024 * 1024, 1} },
3583 .block_erase = spi_block_erase_c7,
3584 },
3585 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003586 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003587 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003588 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003589 },
3590
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003591 {
3592 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003593 .name = "MX25L1635D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003594 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003595 .manufacture_id = MX_ID,
3596 .model_id = MX_25L1635D,
3597 .total_size = 2048,
3598 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003599 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003600 .tested = TEST_UNTESTED,
3601 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003602 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003603 .block_erasers =
3604 {
3605 {
3606 .eraseblocks = { {4 * 1024, 512} },
3607 .block_erase = spi_block_erase_20,
3608 }, {
3609 .eraseblocks = { {64 * 1024, 32} },
3610 .block_erase = spi_block_erase_d8,
3611 }, {
3612 .eraseblocks = { {2 * 1024 * 1024, 1} },
3613 .block_erase = spi_block_erase_60,
3614 }, {
3615 .eraseblocks = { {2 * 1024 * 1024, 1} },
3616 .block_erase = spi_block_erase_c7,
3617 }
3618 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003619 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003620 .write = spi_chip_write_256,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003621 .read = spi_chip_read,
3622 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00003623
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003624 {
3625 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00003626 .name = "MX25L1635E",
3627 .bustype = CHIP_BUSTYPE_SPI,
3628 .manufacture_id = MX_ID,
3629 .model_id = MX_25L1635E,
3630 .total_size = 2048,
3631 .page_size = 256,
3632 .feature_bits = FEATURE_WRSR_WREN,
3633 .tested = TEST_UNTESTED,
3634 .probe = probe_spi_rdid,
3635 .probe_timing = TIMING_ZERO,
3636 .block_erasers =
3637 {
3638 {
3639 .eraseblocks = { {4 * 1024, 512} },
3640 .block_erase = spi_block_erase_20,
3641 }, {
3642 .eraseblocks = { {64 * 1024, 32} },
3643 .block_erase = spi_block_erase_d8,
3644 }, {
3645 .eraseblocks = { {2 * 1024 * 1024, 1} },
3646 .block_erase = spi_block_erase_60,
3647 }, {
3648 .eraseblocks = { {2 * 1024 * 1024, 1} },
3649 .block_erase = spi_block_erase_c7,
3650 }
3651 },
3652 .unlock = spi_disable_blockprotect,
3653 .write = spi_chip_write_256,
3654 .read = spi_chip_read,
3655 },
3656
3657 {
3658 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003659 .name = "MX25L3205",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003660 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003661 .manufacture_id = MX_ID,
3662 .model_id = MX_25L3205,
3663 .total_size = 4096,
3664 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003665 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003666 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003667 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003668 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003669 .block_erasers =
3670 {
3671 {
3672 .eraseblocks = { {4 * 1024, 1024} },
3673 .block_erase = spi_block_erase_20,
3674 }, {
3675 .eraseblocks = { {4 * 1024, 1024} },
3676 .block_erase = spi_block_erase_d8,
3677 }, {
3678 .eraseblocks = { {4 * 1024 * 1024, 1} },
3679 .block_erase = spi_block_erase_60,
3680 }, {
3681 .eraseblocks = { {4 * 1024 * 1024, 1} },
3682 .block_erase = spi_block_erase_c7,
3683 },
3684 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003685 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003686 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003687 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003688 },
3689
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003690 {
3691 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003692 .name = "MX25L3235D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003693 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003694 .manufacture_id = MX_ID,
3695 .model_id = MX_25L3235D,
3696 .total_size = 4096,
3697 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003698 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003699 .tested = TEST_UNTESTED,
3700 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003701 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003702 .block_erasers =
3703 {
3704 {
3705 .eraseblocks = { {4 * 1024, 1024} },
3706 .block_erase = spi_block_erase_20,
3707 }, {
3708 .eraseblocks = { {64 * 1024, 64} },
3709 .block_erase = spi_block_erase_d8,
3710 }, {
3711 .eraseblocks = { {4 * 1024 * 1024, 1} },
3712 .block_erase = spi_block_erase_60,
3713 }, {
3714 .eraseblocks = { {4 * 1024 * 1024, 1} },
3715 .block_erase = spi_block_erase_c7,
3716 }
3717 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003718 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003719 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003720 .read = spi_chip_read,
3721 },
3722
3723 {
3724 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003725 .name = "MX25L6405",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003726 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003727 .manufacture_id = MX_ID,
3728 .model_id = MX_25L6405,
3729 .total_size = 8192,
3730 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003731 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger452b3e32009-06-22 11:14:43 +00003732 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003733 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003734 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003735 .block_erasers =
3736 {
3737 {
3738 .eraseblocks = { {64 * 1024, 128} },
3739 .block_erase = spi_block_erase_20,
3740 }, {
3741 .eraseblocks = { {64 * 1024, 128} },
3742 .block_erase = spi_block_erase_d8,
3743 }, {
3744 .eraseblocks = { {8 * 1024 * 1024, 1} },
3745 .block_erase = spi_block_erase_60,
3746 }, {
3747 .eraseblocks = { {8 * 1024 * 1024, 1} },
3748 .block_erase = spi_block_erase_c7,
3749 }
3750 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003751 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003752 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003753 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003754 },
3755
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003756 {
3757 .vendor = "Macronix",
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003758 .name = "MX25L12805",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003759 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003760 .manufacture_id = MX_ID,
3761 .model_id = MX_25L12805,
3762 .total_size = 16384,
3763 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003764 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003765 .tested = TEST_UNTESTED,
3766 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003767 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003768 .block_erasers =
3769 {
3770 {
3771 .eraseblocks = { {4 * 1024, 4096} },
3772 .block_erase = spi_block_erase_20,
3773 }, {
3774 .eraseblocks = { {64 * 1024, 256} },
3775 .block_erase = spi_block_erase_d8,
3776 }, {
3777 .eraseblocks = { {16 * 1024 * 1024, 1} },
3778 .block_erase = spi_block_erase_60,
3779 }, {
3780 .eraseblocks = { {16 * 1024 * 1024, 1} },
3781 .block_erase = spi_block_erase_c7,
3782 }
3783 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003784 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003785 .write = spi_chip_write_256,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003786 .read = spi_chip_read,
3787 },
3788
3789 {
3790 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00003791 .name = "MX29F001B",
3792 .bustype = CHIP_BUSTYPE_PARALLEL,
3793 .manufacture_id = MX_ID,
3794 .model_id = MX_29F001B,
3795 .total_size = 128,
3796 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003797 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3798 .tested = TEST_UNTESTED,
3799 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003800 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003801 .block_erasers =
3802 {
3803 {
3804 .eraseblocks = {
3805 {8 * 1024, 1},
3806 {4 * 1024, 2},
3807 {8 * 1024, 2},
3808 {32 * 1024, 1},
3809 {64 * 1024, 1},
3810 },
Sean Nelson35727f72010-01-28 23:55:12 +00003811 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003812 }, {
3813 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003814 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003815 }
3816 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003817 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003818 .read = read_memmapped,
3819 },
3820
3821 {
3822 .vendor = "Macronix",
3823 .name = "MX29F001T",
3824 .bustype = CHIP_BUSTYPE_PARALLEL,
3825 .manufacture_id = MX_ID,
3826 .model_id = MX_29F001T,
3827 .total_size = 128,
3828 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003829 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3830 .tested = TEST_UNTESTED,
3831 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003832 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003833 .block_erasers =
3834 {
3835 {
3836 .eraseblocks = {
3837 {64 * 1024, 1},
3838 {32 * 1024, 1},
3839 {8 * 1024, 2},
3840 {4 * 1024, 2},
3841 {8 * 1024, 1},
3842 },
Sean Nelson35727f72010-01-28 23:55:12 +00003843 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003844 }, {
3845 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003846 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003847 }
3848 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003849 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003850 .read = read_memmapped,
3851 },
3852
3853 {
3854 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003855 .name = "MX29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00003856 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003857 .manufacture_id = MX_ID,
3858 .model_id = MX_29F002B,
3859 .total_size = 256,
3860 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003861 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003862 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00003863 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003864 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003865 .block_erasers =
3866 {
3867 {
3868 .eraseblocks = {
3869 {16 * 1024, 1},
3870 {8 * 1024, 2},
3871 {32 * 1024, 1},
3872 {64 * 1024, 3},
3873 },
Sean Nelson35727f72010-01-28 23:55:12 +00003874 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003875 }, {
3876 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003877 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003878 },
3879 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003880 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003881 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003882 },
3883
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003884 {
3885 .vendor = "Macronix",
3886 .name = "MX29F002T",
Urja Rannikko038a3122009-06-28 19:19:25 +00003887 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003888 .manufacture_id = MX_ID,
3889 .model_id = MX_29F002T,
3890 .total_size = 256,
3891 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003892 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00003893 .tested = TEST_OK_PRW,
Sean Nelson35727f72010-01-28 23:55:12 +00003894 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003895 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003896 .block_erasers =
3897 {
3898 {
3899 .eraseblocks = {
3900 {64 * 1024, 3},
3901 {32 * 1024, 1},
3902 {8 * 1024, 2},
3903 {16 * 1024, 1},
3904 },
Sean Nelson35727f72010-01-28 23:55:12 +00003905 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003906 }, {
3907 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003908 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003909 },
3910 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003911 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003912 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003913 },
3914
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003915 {
3916 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003917 .name = "MX29LV040",
Urja Rannikko038a3122009-06-28 19:19:25 +00003918 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003919 .manufacture_id = MX_ID,
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003920 .model_id = MX_29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003921 .total_size = 512,
3922 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003923 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3924 .tested = TEST_UNTESTED,
3925 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003926 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003927 .block_erasers =
3928 {
3929 {
3930 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00003931 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003932 }, {
3933 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003934 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003935 },
3936 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003937 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003938 .read = read_memmapped,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00003939 },
3940
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003941 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00003942 .vendor = "MoselVitelic",
3943 .name = "V29C51000B",
3944 .bustype = CHIP_BUSTYPE_PARALLEL,
3945 .manufacture_id = SYNCMOS_MVC_ID,
3946 .model_id = MVC_V29C51000B,
3947 .total_size = 64,
3948 .page_size = 512,
3949 .feature_bits = FEATURE_EITHER_RESET,
3950 .tested = TEST_UNTESTED,
3951 .probe = probe_jedec,
3952 .probe_timing = TIMING_ZERO,
3953 .block_erasers =
3954 {
3955 {
3956 .eraseblocks = { {512, 128} },
3957 .block_erase = erase_sector_jedec,
3958 }, {
3959 .eraseblocks = { {64 * 1024, 1} },
3960 .block_erase = erase_chip_block_jedec,
3961 },
3962 },
3963 .write = write_jedec_1,
3964 .read = read_memmapped,
3965 },
3966
3967 {
3968 .vendor = "MoselVitelic",
3969 .name = "V29C51000T",
3970 .bustype = CHIP_BUSTYPE_PARALLEL,
3971 .manufacture_id = SYNCMOS_MVC_ID,
3972 .model_id = MVC_V29C51000T,
3973 .total_size = 64,
3974 .page_size = 512,
3975 .feature_bits = FEATURE_EITHER_RESET,
3976 .tested = TEST_UNTESTED,
3977 .probe = probe_jedec,
3978 .probe_timing = TIMING_ZERO,
3979 .block_erasers =
3980 {
3981 {
3982 .eraseblocks = { {512, 128} },
3983 .block_erase = erase_sector_jedec,
3984 }, {
3985 .eraseblocks = { {64 * 1024, 1} },
3986 .block_erase = erase_chip_block_jedec,
3987 },
3988 },
3989 .write = write_jedec_1,
3990 .read = read_memmapped,
3991 },
3992
3993 {
3994 .vendor = "MoselVitelic",
3995 .name = "V29C51400B",
3996 .bustype = CHIP_BUSTYPE_PARALLEL,
3997 .manufacture_id = SYNCMOS_MVC_ID,
3998 .model_id = MVC_V29C51400B,
3999 .total_size = 512,
4000 .page_size = 1024,
4001 .feature_bits = FEATURE_EITHER_RESET,
4002 .tested = TEST_UNTESTED,
4003 .probe = probe_jedec,
4004 .probe_timing = TIMING_ZERO,
4005 .block_erasers =
4006 {
4007 {
4008 .eraseblocks = { {1024, 512} },
4009 .block_erase = erase_sector_jedec,
4010 }, {
4011 .eraseblocks = { {512 * 1024, 1} },
4012 .block_erase = erase_chip_block_jedec,
4013 },
4014 },
4015 .write = write_jedec_1,
4016 .read = read_memmapped,
4017 },
4018
4019 {
4020 .vendor = "MoselVitelic",
4021 .name = "V29C51400T",
4022 .bustype = CHIP_BUSTYPE_PARALLEL,
4023 .manufacture_id = SYNCMOS_MVC_ID,
4024 .model_id = MVC_V29C51400T,
4025 .total_size = 512,
4026 .page_size = 1024,
4027 .feature_bits = FEATURE_EITHER_RESET,
4028 .tested = TEST_UNTESTED,
4029 .probe = probe_jedec,
4030 .probe_timing = TIMING_ZERO,
4031 .block_erasers =
4032 {
4033 {
4034 .eraseblocks = { {1024, 512} },
4035 .block_erase = erase_sector_jedec,
4036 }, {
4037 .eraseblocks = { {512 * 1024, 1} },
4038 .block_erase = erase_chip_block_jedec,
4039 },
4040 },
4041 .write = write_jedec_1,
4042 .read = read_memmapped,
4043 },
4044
4045 {
4046 .vendor = "MoselVitelic",
4047 .name = "V29LC51000",
4048 .bustype = CHIP_BUSTYPE_PARALLEL,
4049 .manufacture_id = SYNCMOS_MVC_ID,
4050 .model_id = MVC_V29LC51000,
4051 .total_size = 64,
4052 .page_size = 512,
4053 .feature_bits = FEATURE_EITHER_RESET,
4054 .tested = TEST_UNTESTED,
4055 .probe = probe_jedec,
4056 .probe_timing = TIMING_ZERO,
4057 .block_erasers =
4058 {
4059 {
4060 .eraseblocks = { {512, 128} },
4061 .block_erase = erase_sector_jedec,
4062 }, {
4063 .eraseblocks = { {64 * 1024, 1} },
4064 .block_erase = erase_chip_block_jedec,
4065 },
4066 },
4067 .write = write_jedec_1,
4068 .read = read_memmapped,
4069 },
4070
4071 {
4072 .vendor = "MoselVitelic",
4073 .name = "V29LC51001",
4074 .bustype = CHIP_BUSTYPE_PARALLEL,
4075 .manufacture_id = SYNCMOS_MVC_ID,
4076 .model_id = MVC_V29LC51001,
4077 .total_size = 128,
4078 .page_size = 512,
4079 .feature_bits = FEATURE_EITHER_RESET,
4080 .tested = TEST_UNTESTED,
4081 .probe = probe_jedec,
4082 .probe_timing = TIMING_ZERO,
4083 .block_erasers =
4084 {
4085 {
4086 .eraseblocks = { {512, 256} },
4087 .block_erase = erase_sector_jedec,
4088 }, {
4089 .eraseblocks = { {128 * 1024, 1} },
4090 .block_erase = erase_chip_block_jedec,
4091 },
4092 },
4093 .write = write_jedec_1,
4094 .read = read_memmapped,
4095 },
4096
4097 {
4098 .vendor = "MoselVitelic",
4099 .name = "V29LC51002",
4100 .bustype = CHIP_BUSTYPE_PARALLEL,
4101 .manufacture_id = SYNCMOS_MVC_ID,
4102 .model_id = MVC_V29LC51002,
4103 .total_size = 256,
4104 .page_size = 512,
4105 .feature_bits = FEATURE_EITHER_RESET,
4106 .tested = TEST_UNTESTED,
4107 .probe = probe_jedec,
4108 .probe_timing = TIMING_ZERO,
4109 .block_erasers =
4110 {
4111 {
4112 .eraseblocks = { {512, 512} },
4113 .block_erase = erase_sector_jedec,
4114 }, {
4115 .eraseblocks = { {256 * 1024, 1} },
4116 .block_erase = erase_chip_block_jedec,
4117 },
4118 },
4119 .write = write_jedec_1,
4120 .read = read_memmapped,
4121 },
4122
4123 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004124 .vendor = "Numonyx",
4125 .name = "M25PE10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004126 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004127 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004128 .model_id = ST_M25PE10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004129 .total_size = 128,
4130 .page_size = 256,
4131 .tested = TEST_UNTESTED,
4132 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004133 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004134 .block_erasers =
4135 {
4136 {
4137 .eraseblocks = { {4 * 1024, 32} },
4138 .block_erase = spi_block_erase_20,
4139 }, {
4140 .eraseblocks = { {64 * 1024, 2} },
4141 .block_erase = spi_block_erase_d8,
4142 }, {
4143 .eraseblocks = { {128 * 1024, 1} },
4144 .block_erase = spi_block_erase_c7,
4145 }
4146 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004147 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004148 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004149 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004150 },
4151
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004152 {
4153 .vendor = "Numonyx",
4154 .name = "M25PE20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004155 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004156 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004157 .model_id = ST_M25PE20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004158 .total_size = 256,
4159 .page_size = 256,
4160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004162 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004163 .block_erasers =
4164 {
4165 {
4166 .eraseblocks = { {4 * 1024, 64} },
4167 .block_erase = spi_block_erase_20,
4168 }, {
4169 .eraseblocks = { {64 * 1024, 4} },
4170 .block_erase = spi_block_erase_d8,
4171 }, {
4172 .eraseblocks = { {256 * 1024, 1} },
4173 .block_erase = spi_block_erase_c7,
4174 }
4175 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004176 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004177 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004178 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004179 },
4180
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004181 {
4182 .vendor = "Numonyx",
4183 .name = "M25PE40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004184 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004185 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004186 .model_id = ST_M25PE40,
Sean Nelson5643c072010-01-19 03:23:07 +00004187 .total_size = 512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004188 .page_size = 256,
4189 .tested = TEST_UNTESTED,
4190 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004191 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004192 .block_erasers =
4193 {
4194 {
4195 .eraseblocks = { {4 * 1024, 128} },
4196 .block_erase = spi_block_erase_20,
4197 }, {
4198 .eraseblocks = { {64 * 1024, 8} },
4199 .block_erase = spi_block_erase_d8,
4200 }, {
4201 .eraseblocks = { {512 * 1024, 1} },
4202 .block_erase = spi_block_erase_c7,
4203 }
4204 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004205 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004206 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004207 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004208 },
4209
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004210 {
4211 .vendor = "Numonyx",
4212 .name = "M25PE80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004213 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004214 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004215 .model_id = ST_M25PE80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004216 .total_size = 1024,
4217 .page_size = 256,
4218 .tested = TEST_OK_PREW,
4219 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004220 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004221 .block_erasers =
4222 {
4223 {
4224 .eraseblocks = { {4 * 1024, 256} },
4225 .block_erase = spi_block_erase_20,
4226 }, {
4227 .eraseblocks = { {64 * 1024, 16} },
4228 .block_erase = spi_block_erase_d8,
4229 }, {
4230 .eraseblocks = { {1024 * 1024, 1} },
4231 .block_erase = spi_block_erase_c7,
4232 }
4233 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004234 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004235 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004236 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004237 },
4238
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004239 {
4240 .vendor = "Numonyx",
4241 .name = "M25PE16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004242 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004243 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004244 .model_id = ST_M25PE16,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004245 .total_size = 2048,
4246 .page_size = 256,
4247 .tested = TEST_UNTESTED,
4248 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004249 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004250 .block_erasers =
4251 {
4252 {
4253 .eraseblocks = { {4 * 1024, 512} },
4254 .block_erase = spi_block_erase_20,
4255 }, {
4256 .eraseblocks = { {64 * 1024, 32} },
4257 .block_erase = spi_block_erase_d8,
4258 }, {
4259 .eraseblocks = { {2 * 1024 * 1024, 1} },
4260 .block_erase = spi_block_erase_c7,
4261 }
4262 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004263 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004264 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004265 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004266 },
4267
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004268 {
4269 .vendor = "PMC",
4270 .name = "Pm25LV010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004271 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004272 .manufacture_id = PMC_ID,
4273 .model_id = PMC_25LV010,
4274 .total_size = 128,
4275 .page_size = 256,
4276 .tested = TEST_UNTESTED,
4277 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004278 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004279 .block_erasers =
4280 {
4281 {
4282 .eraseblocks = { {4 * 1024, 32} },
4283 .block_erase = spi_block_erase_d7,
4284 }, {
4285 .eraseblocks = { {32 * 1024, 4} },
4286 .block_erase = spi_block_erase_d8,
4287 }, {
4288 .eraseblocks = { {128 * 1024, 1} },
4289 .block_erase = spi_block_erase_c7,
4290 }
4291 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004292 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004293 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004294 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004295 },
4296
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004297 {
4298 .vendor = "PMC",
4299 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004300 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004301 .manufacture_id = PMC_ID,
4302 .model_id = PMC_25LV016B,
4303 .total_size = 2048,
4304 .page_size = 256,
4305 .tested = TEST_UNTESTED,
4306 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004307 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004308 .block_erasers =
4309 {
4310 {
4311 .eraseblocks = { {4 * 1024, 512} },
4312 .block_erase = spi_block_erase_d7,
4313 }, {
4314 .eraseblocks = { {4 * 1024, 512} },
4315 .block_erase = spi_block_erase_20,
4316 }, {
4317 .eraseblocks = { {64 * 1024, 32} },
4318 .block_erase = spi_block_erase_d8,
4319 }, {
4320 .eraseblocks = { {2 * 1024 * 1024, 1} },
4321 .block_erase = spi_block_erase_60,
4322 }, {
4323 .eraseblocks = { {2 * 1024 * 1024, 1} },
4324 .block_erase = spi_block_erase_c7,
4325 }
4326 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004327 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004328 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004329 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004330 },
4331
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004332 {
4333 .vendor = "PMC",
4334 .name = "Pm25LV020",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004335 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004336 .manufacture_id = PMC_ID,
4337 .model_id = PMC_25LV020,
4338 .total_size = 256,
4339 .page_size = 256,
4340 .tested = TEST_UNTESTED,
4341 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004342 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004343 .block_erasers =
4344 {
4345 {
4346 .eraseblocks = { {4 * 1024, 64} },
4347 .block_erase = spi_block_erase_d7,
4348 }, {
4349 .eraseblocks = { {64 * 1024, 4} },
4350 .block_erase = spi_block_erase_d8,
4351 }, {
4352 .eraseblocks = { {256 * 1024, 1} },
4353 .block_erase = spi_block_erase_c7,
4354 }
4355 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004356 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004357 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004358 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004359 },
4360
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004361 {
4362 .vendor = "PMC",
4363 .name = "Pm25LV040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004364 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004365 .manufacture_id = PMC_ID,
4366 .model_id = PMC_25LV040,
4367 .total_size = 512,
4368 .page_size = 256,
4369 .tested = TEST_UNTESTED,
4370 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004371 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004372 .block_erasers =
4373 {
4374 {
4375 .eraseblocks = { {4 * 1024, 128} },
4376 .block_erase = spi_block_erase_d7,
4377 }, {
4378 .eraseblocks = { {64 * 1024, 8} },
4379 .block_erase = spi_block_erase_d8,
4380 }, {
4381 .eraseblocks = { {512 * 1024, 1} },
4382 .block_erase = spi_block_erase_c7,
4383 }
4384 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004385 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004386 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004387 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004388 },
4389
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004390 {
4391 .vendor = "PMC",
4392 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004393 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004394 .manufacture_id = PMC_ID,
4395 .model_id = PMC_25LV080B,
4396 .total_size = 1024,
4397 .page_size = 256,
4398 .tested = TEST_UNTESTED,
4399 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004400 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004401 .block_erasers =
4402 {
4403 {
4404 .eraseblocks = { {4 * 1024, 256} },
4405 .block_erase = spi_block_erase_d7,
4406 }, {
4407 .eraseblocks = { {4 * 1024, 256} },
4408 .block_erase = spi_block_erase_20,
4409 }, {
4410 .eraseblocks = { {64 * 1024, 16} },
4411 .block_erase = spi_block_erase_d8,
4412 }, {
4413 .eraseblocks = { {1024 * 1024, 1} },
4414 .block_erase = spi_block_erase_60,
4415 }, {
4416 .eraseblocks = { {1024 * 1024, 1} },
4417 .block_erase = spi_block_erase_c7,
4418 }
4419 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004420 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004421 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004422 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004423 },
4424
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004425 {
4426 .vendor = "PMC",
4427 .name = "Pm25LV512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004428 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004429 .manufacture_id = PMC_ID,
4430 .model_id = PMC_25LV512,
4431 .total_size = 64,
4432 .page_size = 256,
4433 .tested = TEST_UNTESTED,
4434 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004435 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004436 .block_erasers =
4437 {
4438 {
4439 .eraseblocks = { {4 * 1024, 16} },
4440 .block_erase = spi_block_erase_d7,
4441 }, {
4442 .eraseblocks = { {32 * 1024, 2} },
4443 .block_erase = spi_block_erase_d8,
4444 }, {
4445 .eraseblocks = { {64 * 1024, 1} },
4446 .block_erase = spi_block_erase_c7,
4447 }
4448 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004449 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004450 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004451 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004452 },
4453
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004454 {
4455 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004456 .name = "Pm29F002T",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004457 .bustype = CHIP_BUSTYPE_PARALLEL,
4458 .manufacture_id = PMC_ID_NOPREFIX,
4459 .model_id = PMC_29F002T,
4460 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00004461 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00004463 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00004464 .probe = probe_jedec,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004465 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00004466 .block_erasers =
4467 {
4468 {
4469 .eraseblocks = {
4470 {128 * 1024, 1},
4471 {96 * 1024, 1},
4472 {8 * 1024, 2},
4473 {16 * 1024, 1},
4474 },
Sean Nelson35727f72010-01-28 23:55:12 +00004475 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004476 }, {
4477 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004478 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004479 },
4480 },
Sean Nelson35727f72010-01-28 23:55:12 +00004481 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004482 .read = read_memmapped,
4483 },
4484
4485 {
4486 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004487 .name = "Pm29F002B",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004488 .bustype = CHIP_BUSTYPE_PARALLEL,
4489 .manufacture_id = PMC_ID_NOPREFIX,
4490 .model_id = PMC_29F002B,
4491 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00004492 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004493 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004494 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00004495 .probe = probe_jedec,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004496 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00004497 .block_erasers =
4498 {
4499 {
4500 .eraseblocks = {
4501 {16 * 1024, 1},
4502 {8 * 1024, 2},
4503 {96 * 1024, 1},
4504 {128 * 1024, 1},
4505 },
Sean Nelson35727f72010-01-28 23:55:12 +00004506 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004507 }, {
4508 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004509 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004510 },
4511 },
Sean Nelson35727f72010-01-28 23:55:12 +00004512 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004513 .read = read_memmapped,
4514 },
4515
4516 {
4517 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004518 .name = "Pm39LV010",
Urja Rannikko038a3122009-06-28 19:19:25 +00004519 .bustype = CHIP_BUSTYPE_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004520 .manufacture_id = PMC_ID_NOPREFIX,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004521 .model_id = PMC_39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004522 .total_size = 128,
4523 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004524 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00004525 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004526 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004527 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00004528 .block_erasers =
4529 {
4530 {
4531 .eraseblocks = { {4 * 1024, 32} },
4532 .block_erase = erase_sector_jedec,
4533 }, {
4534 .eraseblocks = { {64 * 1024, 2} },
4535 .block_erase = erase_block_jedec,
4536 }, {
4537 .eraseblocks = { {128 * 1024, 1} },
4538 .block_erase = erase_chip_block_jedec,
4539 }
4540 },
Sean Nelson35727f72010-01-28 23:55:12 +00004541 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004542 .read = read_memmapped,
4543 },
4544
4545 {
4546 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004547 .name = "Pm39LV020",
4548 .bustype = CHIP_BUSTYPE_PARALLEL,
4549 .manufacture_id = PMC_ID_NOPREFIX,
4550 .model_id = PMC_39LV020,
4551 .total_size = 256,
4552 .page_size = 4096,
4553 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4554 .tested = TEST_UNTESTED,
4555 .probe = probe_jedec,
4556 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4557 .block_erasers =
4558 {
4559 {
4560 .eraseblocks = { {4 * 1024, 64} },
4561 .block_erase = erase_sector_jedec,
4562 }, {
4563 .eraseblocks = { {64 * 1024, 4} },
4564 .block_erase = erase_block_jedec,
4565 }, {
4566 .eraseblocks = { {256 * 1024, 1} },
4567 .block_erase = erase_chip_block_jedec,
4568 }
4569 },
4570 .write = write_jedec_1,
4571 .read = read_memmapped,
4572 },
4573
4574 {
4575 .vendor = "PMC",
4576 .name = "Pm39LV040",
4577 .bustype = CHIP_BUSTYPE_PARALLEL,
4578 .manufacture_id = PMC_ID_NOPREFIX,
4579 .model_id = PMC_39LV040,
4580 .total_size = 512,
4581 .page_size = 4096,
4582 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4583 .tested = TEST_UNTESTED,
4584 .probe = probe_jedec,
4585 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4586 .block_erasers =
4587 {
4588 {
4589 .eraseblocks = { {4 * 1024, 128} },
4590 .block_erase = erase_sector_jedec,
4591 }, {
4592 .eraseblocks = { {64 * 1024, 8} },
4593 .block_erase = erase_block_jedec,
4594 }, {
4595 .eraseblocks = { {512 * 1024, 1} },
4596 .block_erase = erase_chip_block_jedec,
4597 }
4598 },
4599 .write = write_jedec_1,
4600 .read = read_memmapped,
4601 },
4602
4603 {
4604 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004605 .name = "Pm49FL002",
Uwe Hermann431f4f72010-09-05 12:41:25 +00004606 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004607 .manufacture_id = PMC_ID_NOPREFIX,
4608 .model_id = PMC_49FL002,
4609 .total_size = 256,
4610 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004611 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Russ Dill8c7c4682010-03-09 16:53:06 +00004612 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004613 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004614 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004615 .block_erasers =
4616 {
4617 {
4618 .eraseblocks = { {4 * 1024, 64} },
4619 .block_erase = erase_sector_jedec,
4620 }, {
4621 .eraseblocks = { {16 * 1024, 16} },
4622 .block_erase = erase_block_jedec,
4623 }, {
4624 .eraseblocks = { {256 * 1024, 1} },
4625 .block_erase = erase_chip_block_jedec,
4626 }
4627 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004628 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004629 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004630 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004631 },
4632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004633 {
4634 .vendor = "PMC",
4635 .name = "Pm49FL004",
Uwe Hermann431f4f72010-09-05 12:41:25 +00004636 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004637 .manufacture_id = PMC_ID_NOPREFIX,
4638 .model_id = PMC_49FL004,
4639 .total_size = 512,
4640 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004641 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00004642 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004643 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004644 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004645 .block_erasers =
4646 {
4647 {
4648 .eraseblocks = { {4 * 1024, 128} },
4649 .block_erase = erase_sector_jedec,
4650 }, {
4651 .eraseblocks = { {64 * 1024, 8} },
4652 .block_erase = erase_block_jedec,
4653 }, {
4654 .eraseblocks = { {512 * 1024, 1} },
4655 .block_erase = erase_chip_block_jedec,
4656 }
4657 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004658 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004659 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004660 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004661 },
4662
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004663 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00004664 .vendor = "Sanyo",
4665 .name = "LF25FW203A",
4666 .bustype = CHIP_BUSTYPE_SPI,
4667 .manufacture_id = SANYO_ID,
4668 .model_id = SANYO_LE25FW203A,
4669 .total_size = 2048,
4670 .page_size = 256,
4671 .tested = TEST_UNTESTED,
4672 .probe = probe_spi_rdid,
4673 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004674 .block_erasers =
4675 {
4676 {
4677 .eraseblocks = { {64 * 1024, 32} },
4678 .block_erase = spi_block_erase_d8,
4679 }, {
4680 .eraseblocks = { {2 * 1024 * 1024, 1} },
4681 .block_erase = spi_block_erase_c7,
4682 }
4683 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004684 .unlock = spi_disable_blockprotect,
Sean Nelsond70b09c2009-11-24 02:11:08 +00004685 .write = spi_chip_write_256,
4686 .read = spi_chip_read,
4687 },
4688
4689 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004690 .vendor = "Sharp",
4691 .name = "LHF00L04",
Urja Rannikko038a3122009-06-28 19:19:25 +00004692 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004693 .manufacture_id = SHARP_ID,
4694 .model_id = SHARP_LHF00L04,
4695 .total_size = 1024,
4696 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004697 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004698 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004699 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004700 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004701 .block_erasers =
4702 {
4703 {
4704 .eraseblocks = {
4705 {64 * 1024, 15},
4706 {8 * 1024, 8}
4707 },
Sean Nelson28accc22010-03-19 18:47:06 +00004708 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004709 }, {
4710 .eraseblocks = {
4711 {1024 * 1024, 1}
4712 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00004713 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004714 },
4715 },
Sean Nelson28accc22010-03-19 18:47:06 +00004716 .unlock = unlock_82802ab,
4717 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004718 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004719 },
4720
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004721 {
4722 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00004723 .name = "S25FL008A",
4724 .bustype = CHIP_BUSTYPE_SPI,
4725 .manufacture_id = SPANSION_ID,
4726 .model_id = SPANSION_S25FL008A,
4727 .total_size = 1024,
4728 .page_size = 256,
4729 .tested = TEST_OK_PREW,
4730 .probe = probe_spi_rdid,
4731 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00004732 .block_erasers =
4733 {
4734 {
4735 .eraseblocks = { {64 * 1024, 16} },
4736 .block_erase = spi_block_erase_d8,
4737 }, {
4738 .eraseblocks = { {1024 * 1024, 1} },
4739 .block_erase = spi_block_erase_c7,
4740 }
4741 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004742 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00004743 .write = spi_chip_write_256,
4744 .read = spi_chip_read,
4745 },
4746
4747 {
4748 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004749 .name = "S25FL016A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004750 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004751 .manufacture_id = SPANSION_ID,
4752 .model_id = SPANSION_S25FL016A,
4753 .total_size = 2048,
4754 .page_size = 256,
Sean Nelson5643c072010-01-19 03:23:07 +00004755 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004756 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004757 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004758 .block_erasers =
4759 {
4760 {
4761 .eraseblocks = { {64 * 1024, 32} },
4762 .block_erase = spi_block_erase_d8,
4763 }, {
4764 .eraseblocks = { {2 * 1024 * 1024, 1} },
4765 .block_erase = spi_block_erase_c7,
4766 }
4767 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004768 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004769 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004770 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004771 },
4772
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004773 {
4774 .vendor = "SST",
4775 .name = "SST25VF016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004776 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004777 .manufacture_id = SST_ID,
4778 .model_id = SST_25VF016B,
4779 .total_size = 2048,
4780 .page_size = 256,
Uwe Hermanna3473242010-09-14 22:59:39 +00004781 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004782 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004783 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004784 .block_erasers =
4785 {
4786 {
4787 .eraseblocks = { {4 * 1024, 512} },
4788 .block_erase = spi_block_erase_20,
4789 }, {
4790 .eraseblocks = { {32 * 1024, 64} },
4791 .block_erase = spi_block_erase_52,
4792 }, {
4793 .eraseblocks = { {64 * 1024, 32} },
4794 .block_erase = spi_block_erase_d8,
4795 }, {
4796 .eraseblocks = { {2 * 1024 * 1024, 1} },
4797 .block_erase = spi_block_erase_60,
4798 }, {
4799 .eraseblocks = { {2 * 1024 * 1024, 1} },
4800 .block_erase = spi_block_erase_c7,
4801 },
4802 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004803 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004804 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004805 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004806 },
4807
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004808 {
4809 .vendor = "SST",
4810 .name = "SST25VF032B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004811 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004812 .manufacture_id = SST_ID,
4813 .model_id = SST_25VF032B,
4814 .total_size = 4096,
4815 .page_size = 256,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004816 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004817 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004818 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004819 .block_erasers =
4820 {
4821 {
4822 .eraseblocks = { {4 * 1024, 1024} },
4823 .block_erase = spi_block_erase_20,
4824 }, {
4825 .eraseblocks = { {32 * 1024, 128} },
4826 .block_erase = spi_block_erase_52,
4827 }, {
4828 .eraseblocks = { {64 * 1024, 64} },
4829 .block_erase = spi_block_erase_d8,
4830 }, {
4831 .eraseblocks = { {4 * 1024 * 1024, 1} },
4832 .block_erase = spi_block_erase_60,
4833 }, {
4834 .eraseblocks = { {4 * 1024 * 1024, 1} },
4835 .block_erase = spi_block_erase_c7,
4836 },
4837 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004838 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004839 .write = spi_chip_write_1,
4840 .read = spi_chip_read,
4841 },
4842
4843 {
4844 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00004845 .name = "SST25VF064C",
4846 .bustype = CHIP_BUSTYPE_SPI,
4847 .manufacture_id = SST_ID,
4848 .model_id = SST_25VF064C,
4849 .total_size = 8192,
4850 .page_size = 256,
4851 .tested = TEST_OK_PREW,
4852 .probe = probe_spi_rdid,
4853 .probe_timing = TIMING_ZERO,
4854 .block_erasers =
4855 {
4856 {
4857 .eraseblocks = { {4 * 1024, 2048} },
4858 .block_erase = spi_block_erase_20,
4859 }, {
4860 .eraseblocks = { {32 * 1024, 256} },
4861 .block_erase = spi_block_erase_52,
4862 }, {
4863 .eraseblocks = { {64 * 1024, 128} },
4864 .block_erase = spi_block_erase_d8,
4865 }, {
4866 .eraseblocks = { {8 * 1024 * 1024, 1} },
4867 .block_erase = spi_block_erase_60,
4868 }, {
4869 .eraseblocks = { {8 * 1024 * 1024, 1} },
4870 .block_erase = spi_block_erase_c7,
4871 },
4872 },
4873 .unlock = spi_disable_blockprotect,
4874 .write = spi_chip_write_1,
4875 .read = spi_chip_read,
4876 },
4877
4878 {
4879 .vendor = "SST",
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004880 .name = "SST25VF040.REMS",
4881 .bustype = CHIP_BUSTYPE_SPI,
4882 .manufacture_id = SST_ID,
4883 .model_id = SST_25VF040_REMS,
4884 .total_size = 512,
4885 .page_size = 256,
4886 .tested = TEST_OK_PR,
4887 .probe = probe_spi_rems,
4888 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004889 .block_erasers =
4890 {
4891 {
4892 .eraseblocks = { {4 * 1024, 128} },
4893 .block_erase = spi_block_erase_20,
4894 }, {
4895 .eraseblocks = { {32 * 1024, 16} },
4896 .block_erase = spi_block_erase_52,
4897 }, {
4898 .eraseblocks = { {512 * 1024, 1} },
4899 .block_erase = spi_block_erase_60,
4900 },
4901 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004902 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004903 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004904 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004905 },
4906
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004907 {
4908 .vendor = "SST",
4909 .name = "SST25VF040B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004910 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004911 .manufacture_id = SST_ID,
4912 .model_id = SST_25VF040B,
4913 .total_size = 512,
4914 .page_size = 256,
4915 .tested = TEST_UNTESTED,
4916 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004917 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004918 .block_erasers =
4919 {
4920 {
4921 .eraseblocks = { {4 * 1024, 128} },
4922 .block_erase = spi_block_erase_20,
4923 }, {
4924 .eraseblocks = { {32 * 1024, 16} },
4925 .block_erase = spi_block_erase_52,
4926 }, {
4927 .eraseblocks = { {64 * 1024, 8} },
4928 .block_erase = spi_block_erase_d8,
4929 }, {
4930 .eraseblocks = { {512 * 1024, 1} },
4931 .block_erase = spi_block_erase_60,
4932 }, {
4933 .eraseblocks = { {512 * 1024, 1} },
4934 .block_erase = spi_block_erase_c7,
4935 },
4936 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004937 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004938 .write = spi_chip_write_1,
Zheng Bao0677dff2009-02-25 08:07:33 +00004939 .read = spi_chip_read,
4940 },
4941
4942 {
4943 .vendor = "SST",
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004944 .name = "SST25LF040A.RES",
4945 .bustype = CHIP_BUSTYPE_SPI,
4946 .manufacture_id = SST_ID,
4947 .model_id = SST_25VF040_REMS,
4948 .total_size = 512,
4949 .page_size = 256,
4950 .tested = TEST_OK_PROBE,
4951 .probe = probe_spi_res2,
4952 .probe_timing = TIMING_ZERO,
4953 .block_erasers =
4954 {
4955 {
4956 .eraseblocks = { {4 * 1024, 128} },
4957 .block_erase = spi_block_erase_20,
4958 }, {
4959 .eraseblocks = { {32 * 1024, 16} },
4960 .block_erase = spi_block_erase_52,
4961 }, {
4962 .eraseblocks = { {512 * 1024, 1} },
4963 .block_erase = spi_block_erase_60,
4964 },
4965 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004966 .unlock = spi_disable_blockprotect,
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004967 .write = spi_chip_write_1,
4968 .read = spi_chip_read,
4969 },
4970
4971 {
4972 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00004973 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004974 .bustype = CHIP_BUSTYPE_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004975 .manufacture_id = SST_ID,
4976 .model_id = SST_25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00004977 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004978 .page_size = 256,
Peter Stugefd9217d2009-01-26 03:37:40 +00004979 .tested = TEST_OK_PR,
4980 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004981 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004982 .block_erasers =
4983 {
4984 {
4985 .eraseblocks = { {4 * 1024, 128} },
4986 .block_erase = spi_block_erase_20,
4987 }, {
4988 .eraseblocks = { {32 * 1024, 16} },
4989 .block_erase = spi_block_erase_52,
4990 }, {
4991 .eraseblocks = { {64 * 1024, 8} },
4992 .block_erase = spi_block_erase_d8,
4993 }, {
4994 .eraseblocks = { {512 * 1024, 1} },
4995 .block_erase = spi_block_erase_60,
4996 }, {
4997 .eraseblocks = { {512 * 1024, 1} },
4998 .block_erase = spi_block_erase_c7,
4999 },
5000 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005001 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00005002 .write = spi_chip_write_1,
Peter Stugefd9217d2009-01-26 03:37:40 +00005003 .read = spi_chip_read,
5004 },
5005
5006 {
5007 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005008 .name = "SST25VF080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005009 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005010 .manufacture_id = SST_ID,
5011 .model_id = SST_25VF080B,
5012 .total_size = 1024,
5013 .page_size = 256,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00005014 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005015 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005016 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00005017 .block_erasers =
5018 {
5019 {
5020 .eraseblocks = { {4 * 1024, 256} },
5021 .block_erase = spi_block_erase_20,
5022 }, {
5023 .eraseblocks = { {32 * 1024, 32} },
5024 .block_erase = spi_block_erase_52,
5025 }, {
5026 .eraseblocks = { {64 * 1024, 16} },
5027 .block_erase = spi_block_erase_d8,
5028 }, {
5029 .eraseblocks = { {1024 * 1024, 1} },
5030 .block_erase = spi_block_erase_60,
5031 }, {
5032 .eraseblocks = { {1024 * 1024, 1} },
5033 .block_erase = spi_block_erase_c7,
5034 },
5035 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005036 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005037 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005038 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005039 },
5040
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005041 {
5042 .vendor = "SST",
5043 .name = "SST28SF040A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005044 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005045 .manufacture_id = SST_ID,
5046 .model_id = SST_28SF040,
5047 .total_size = 512,
5048 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005049 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005050 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005051 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005052 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005053 .block_erasers =
5054 {
5055 {
5056 .eraseblocks = { {128, 4096} },
5057 .block_erase = erase_sector_28sf040,
5058 }, {
5059 .eraseblocks = { {512 * 1024, 1} },
5060 .block_erase = erase_chip_28sf040,
5061 }
5062 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005063 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005064 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005065 },
5066
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005067 {
5068 .vendor = "SST",
5069 .name = "SST29EE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005070 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005071 .manufacture_id = SST_ID,
5072 .model_id = SST_29EE010,
5073 .total_size = 128,
5074 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005075 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00005076 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005077 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005078 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005079 .block_erasers =
5080 {
5081 {
5082 .eraseblocks = { {128 * 1024, 1} },
5083 .block_erase = erase_chip_block_jedec,
5084 }
5085 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005086 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005087 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005088 },
5089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005090 {
5091 .vendor = "SST",
5092 .name = "SST29LE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005093 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005094 .manufacture_id = SST_ID,
5095 .model_id = SST_29LE010,
5096 .total_size = 128,
5097 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005098 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005099 .tested = TEST_UNTESTED,
5100 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005101 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005102 .block_erasers =
5103 {
5104 {
5105 .eraseblocks = { {128 * 1024, 1} },
5106 .block_erase = erase_chip_block_jedec,
5107 }
5108 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005109 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005110 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005111 },
5112
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005113 {
5114 .vendor = "SST",
5115 .name = "SST29EE020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005116 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005117 .manufacture_id = SST_ID,
5118 .model_id = SST_29EE020A,
5119 .total_size = 256,
5120 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005121 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005122 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005123 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005124 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005125 .block_erasers =
5126 {
5127 {
5128 .eraseblocks = { {256 * 1024, 1} },
5129 .block_erase = erase_chip_block_jedec,
5130 }
5131 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005132 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005133 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005134 },
5135
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005136 {
5137 .vendor = "SST",
5138 .name = "SST29LE020",
Urja Rannikko038a3122009-06-28 19:19:25 +00005139 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005140 .manufacture_id = SST_ID,
5141 .model_id = SST_29LE020,
5142 .total_size = 256,
5143 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005144 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00005145 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005146 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005147 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005148 .block_erasers =
5149 {
5150 {
5151 .eraseblocks = { {256 * 1024, 1} },
5152 .block_erase = erase_chip_block_jedec,
5153 }
5154 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005155 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005156 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005157 },
5158
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005159 {
5160 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +00005161 .name = "SST39SF512",
5162 .bustype = CHIP_BUSTYPE_PARALLEL,
5163 .manufacture_id = SST_ID,
5164 .model_id = SST_39SF512,
5165 .total_size = 64,
5166 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005167 .feature_bits = FEATURE_EITHER_RESET,
5168 .tested = TEST_UNTESTED,
Uwe Hermann48da3f92010-01-23 15:15:19 +00005169 .probe = probe_jedec,
5170 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +00005171 .block_erasers =
5172 {
5173 {
5174 .eraseblocks = { {4 * 1024, 16} },
5175 .block_erase = erase_sector_jedec,
5176 }, {
5177 .eraseblocks = { {64 * 1024, 1} },
5178 .block_erase = erase_chip_block_jedec,
5179 }
5180 },
Sean Nelson35727f72010-01-28 23:55:12 +00005181 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +00005182 .read = read_memmapped,
5183 },
5184
5185 {
5186 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005187 .name = "SST39SF010A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005188 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005189 .manufacture_id = SST_ID,
5190 .model_id = SST_39SF010,
5191 .total_size = 128,
5192 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005193 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00005194 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005195 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005196 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005197 .block_erasers =
5198 {
5199 {
5200 .eraseblocks = { {4 * 1024, 32} },
5201 .block_erase = erase_sector_jedec,
5202 }, {
5203 .eraseblocks = { {128 * 1024, 1} },
5204 .block_erase = erase_chip_block_jedec,
5205 }
5206 },
Sean Nelson35727f72010-01-28 23:55:12 +00005207 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005208 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005209 },
5210
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005211 {
5212 .vendor = "SST",
5213 .name = "SST39SF020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005214 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005215 .manufacture_id = SST_ID,
5216 .model_id = SST_39SF020,
5217 .total_size = 256,
5218 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005219 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005220 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005221 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005222 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005223 .block_erasers =
5224 {
5225 {
5226 .eraseblocks = { {4 * 1024, 64} },
5227 .block_erase = erase_sector_jedec,
5228 }, {
5229 .eraseblocks = { {256 * 1024, 1} },
5230 .block_erase = erase_chip_block_jedec,
5231 }
5232 },
Sean Nelson35727f72010-01-28 23:55:12 +00005233 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005234 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005235 },
5236
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005237 {
5238 .vendor = "SST",
5239 .name = "SST39SF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00005240 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005241 .manufacture_id = SST_ID,
5242 .model_id = SST_39SF040,
5243 .total_size = 512,
5244 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005245 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005246 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005247 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005248 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005249 .block_erasers =
5250 {
5251 {
5252 .eraseblocks = { {4 * 1024, 128} },
5253 .block_erase = erase_sector_jedec,
5254 }, {
5255 .eraseblocks = { {512 * 1024, 1} },
5256 .block_erase = erase_chip_block_jedec,
5257 }
5258 },
Sean Nelson35727f72010-01-28 23:55:12 +00005259 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005260 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005261 },
5262
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005263 {
5264 .vendor = "SST",
5265 .name = "SST39VF512",
Urja Rannikko038a3122009-06-28 19:19:25 +00005266 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005267 .manufacture_id = SST_ID,
5268 .model_id = SST_39VF512,
5269 .total_size = 64,
5270 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005271 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00005272 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005273 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005274 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005275 .block_erasers =
5276 {
5277 {
5278 .eraseblocks = { {4 * 1024, 16} },
5279 .block_erase = erase_sector_jedec,
5280 }, {
5281 .eraseblocks = { {64 * 1024, 1} },
5282 .block_erase = erase_chip_block_jedec,
5283 }
5284 },
Sean Nelson35727f72010-01-28 23:55:12 +00005285 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005286 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005287 },
5288
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005289 {
5290 .vendor = "SST",
5291 .name = "SST39VF010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005292 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005293 .manufacture_id = SST_ID,
5294 .model_id = SST_39VF010,
5295 .total_size = 128,
5296 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005297 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005298 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005299 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005300 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005301 .block_erasers =
5302 {
5303 {
5304 .eraseblocks = { {4 * 1024, 32} },
5305 .block_erase = erase_sector_jedec,
5306 }, {
5307 .eraseblocks = { {128 * 1024, 1} },
5308 .block_erase = erase_chip_block_jedec,
5309 }
5310 },
Sean Nelson35727f72010-01-28 23:55:12 +00005311 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005312 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005313 },
5314
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005315 {
5316 .vendor = "SST",
5317 .name = "SST39VF020",
Urja Rannikko038a3122009-06-28 19:19:25 +00005318 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005319 .manufacture_id = SST_ID,
5320 .model_id = SST_39VF020,
5321 .total_size = 256,
5322 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005323 .feature_bits = FEATURE_EITHER_RESET,
5324 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005325 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005326 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005327 .block_erasers =
5328 {
5329 {
5330 .eraseblocks = { {4 * 1024, 64} },
5331 .block_erase = erase_sector_jedec,
5332 }, {
5333 .eraseblocks = { {256 * 1024, 1} },
5334 .block_erase = erase_chip_block_jedec,
5335 }
5336 },
Sean Nelson35727f72010-01-28 23:55:12 +00005337 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005338 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005339 },
5340
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005341 {
5342 .vendor = "SST",
5343 .name = "SST39VF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00005344 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005345 .manufacture_id = SST_ID,
5346 .model_id = SST_39VF040,
5347 .total_size = 512,
5348 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005349 .feature_bits = FEATURE_EITHER_RESET,
5350 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005351 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005352 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005353 .block_erasers =
5354 {
5355 {
5356 .eraseblocks = { {4 * 1024, 128} },
5357 .block_erase = erase_sector_jedec,
5358 }, {
5359 .eraseblocks = { {512 * 1024, 1} },
5360 .block_erase = erase_chip_block_jedec,
5361 }
5362 },
Sean Nelson35727f72010-01-28 23:55:12 +00005363 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005364 .read = read_memmapped,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +00005365 },
FENG yu ningff692fb2008-12-08 18:15:10 +00005366
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005367 {
5368 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +00005369 .name = "SST39VF080",
Urja Rannikko038a3122009-06-28 19:19:25 +00005370 .bustype = CHIP_BUSTYPE_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005371 .manufacture_id = SST_ID,
5372 .model_id = SST_39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +00005373 .total_size = 1024,
5374 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005375 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +00005376 .tested = TEST_UNTESTED,
5377 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005378 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005379 .block_erasers =
5380 {
5381 {
5382 .eraseblocks = { {4 * 1024, 256} },
5383 .block_erase = erase_sector_jedec,
5384 }, {
5385 .eraseblocks = { {64 * 1024, 16} },
5386 .block_erase = erase_block_jedec,
5387 }, {
5388 .eraseblocks = { {1024 * 1024, 1} },
5389 .block_erase = erase_chip_block_jedec,
5390 }
5391 },
Sean Nelson35727f72010-01-28 23:55:12 +00005392 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005393 .read = read_memmapped,
Peter Stuge8440cc02009-01-25 23:55:12 +00005394 },
5395
5396 {
5397 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005398 .name = "SST49LF002A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005399 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005400 .manufacture_id = SST_ID,
5401 .model_id = SST_49LF002A,
5402 .total_size = 256,
5403 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005404 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00005405 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005406 .probe = probe_jedec,
5407 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005408 .block_erasers =
5409 {
5410 {
5411 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005412 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005413 }, {
5414 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005415 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005416 }, {
5417 .eraseblocks = { {256 * 1024, 1} },
5418 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5419 }
5420 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005421 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005422 .unlock = unlock_sst_fwhub,
5423 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005424 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005425 },
5426
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005427 {
5428 .vendor = "SST",
5429 .name = "SST49LF003A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005430 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005431 .manufacture_id = SST_ID,
5432 .model_id = SST_49LF003A,
5433 .total_size = 384,
5434 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005435 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Peter Lemenkov45835c42009-09-25 01:09:18 +00005436 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005437 .probe = probe_jedec,
5438 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005439 .block_erasers =
5440 {
5441 {
5442 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005443 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005444 }, {
5445 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005446 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005447 }, {
5448 .eraseblocks = { {384 * 1024, 1} },
5449 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5450 }
5451 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005452 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005453 .unlock = unlock_sst_fwhub,
5454 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005455 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005456 },
5457
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005458 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005459 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
5460 * and is only honored for 64k block erase, but not 4k sector erase.
5461 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005462 .vendor = "SST",
5463 .name = "SST49LF004A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005464 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005465 .manufacture_id = SST_ID,
5466 .model_id = SST_49LF004A,
5467 .total_size = 512,
5468 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005469 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005470 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005471 .probe = probe_jedec,
5472 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005473 .block_erasers =
5474 {
5475 {
5476 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005477 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005478 }, {
5479 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005480 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005481 }, {
5482 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +00005483 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005484 },
5485 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005486 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005487 .unlock = unlock_sst_fwhub,
5488 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005489 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005490 },
5491
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005492 {
5493 .vendor = "SST",
5494 .name = "SST49LF004C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005495 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005496 .manufacture_id = SST_ID,
5497 .model_id = SST_49LF004C,
5498 .total_size = 512,
5499 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005500 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005501 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005502 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005503 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005504 .block_erasers =
5505 {
5506 {
5507 .eraseblocks = { {4 * 1024, 128} },
5508 .block_erase = erase_sector_49lfxxxc,
5509 }, {
5510 .eraseblocks = {
5511 {64 * 1024, 7},
5512 {32 * 1024, 1},
5513 {8 * 1024, 2},
5514 {16 * 1024, 1},
5515 },
Sean Nelson69e58112010-03-23 17:10:28 +00005516 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005517 }
5518 },
Sean Nelson69e58112010-03-23 17:10:28 +00005519 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005520 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005521 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005522 },
5523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005524 {
5525 .vendor = "SST",
5526 .name = "SST49LF008A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005527 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005528 .manufacture_id = SST_ID,
5529 .model_id = SST_49LF008A,
5530 .total_size = 1024,
5531 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005532 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005533 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005534 .probe = probe_jedec,
5535 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005536 .block_erasers =
5537 {
5538 {
5539 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005540 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005541 }, {
5542 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005543 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005544 }, {
5545 .eraseblocks = { {1024 * 1024, 1} },
5546 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5547 }
5548 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005549 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005550 .unlock = unlock_sst_fwhub,
5551 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005552 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005553 },
5554
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005555 {
5556 .vendor = "SST",
5557 .name = "SST49LF008C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005558 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005559 .manufacture_id = SST_ID,
5560 .model_id = SST_49LF008C,
5561 .total_size = 1024,
5562 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005563 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005564 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005565 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005566 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005567 .block_erasers =
5568 {
5569 {
5570 .eraseblocks = { {4 * 1024, 256} },
5571 .block_erase = erase_sector_49lfxxxc,
5572 }, {
5573 .eraseblocks = {
5574 {64 * 1024, 15},
5575 {32 * 1024, 1},
5576 {8 * 1024, 2},
5577 {16 * 1024, 1},
5578 },
Sean Nelson69e58112010-03-23 17:10:28 +00005579 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005580 }
5581 },
Sean Nelson69e58112010-03-23 17:10:28 +00005582 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005583 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005584 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005585 },
5586
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005587 {
5588 .vendor = "SST",
5589 .name = "SST49LF016C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005590 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005591 .manufacture_id = SST_ID,
5592 .model_id = SST_49LF016C,
5593 .total_size = 2048,
5594 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005595 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005596 .tested = TEST_OK_PRW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005597 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005598 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005599 .block_erasers =
5600 {
5601 {
5602 .eraseblocks = { {4 * 1024, 512} },
5603 .block_erase = erase_sector_49lfxxxc,
5604 }, {
5605 .eraseblocks = {
5606 {64 * 1024, 31},
5607 {32 * 1024, 1},
5608 {8 * 1024, 2},
5609 {16 * 1024, 1},
5610 },
Sean Nelson69e58112010-03-23 17:10:28 +00005611 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005612 }
5613 },
Sean Nelson69e58112010-03-23 17:10:28 +00005614 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005615 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005616 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005617 },
5618
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005619 {
5620 .vendor = "SST",
5621 .name = "SST49LF020",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005622 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005623 .manufacture_id = SST_ID,
5624 .model_id = SST_49LF020,
5625 .total_size = 256,
5626 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005627 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005628 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005629 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005630 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005631 .block_erasers =
5632 {
5633 {
5634 .eraseblocks = { {4 * 1024, 64} },
5635 .block_erase = erase_sector_jedec,
5636 }, {
5637 .eraseblocks = { {16 * 1024, 16} },
5638 .block_erase = erase_block_jedec,
5639 }, {
5640 .eraseblocks = { {256 * 1024, 1} },
5641 .block_erase = NULL,
5642 }
5643 },
Sean Nelson35727f72010-01-28 23:55:12 +00005644 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005645 .read = read_memmapped,
Sven Schnellec208dfb2009-01-07 12:35:09 +00005646 },
5647
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005648 {
5649 .vendor = "SST",
5650 .name = "SST49LF020A",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005651 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005652 .manufacture_id = SST_ID,
5653 .model_id = SST_49LF020A,
5654 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +00005655 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005656 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005657 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005658 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005659 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005660 .block_erasers =
5661 {
5662 {
5663 .eraseblocks = { {4 * 1024, 64} },
5664 .block_erase = erase_sector_jedec,
5665 }, {
5666 .eraseblocks = { {16 * 1024, 16} },
5667 .block_erase = erase_block_jedec,
5668 }, {
5669 .eraseblocks = { {256 * 1024, 1} },
5670 .block_erase = NULL,
5671 }
5672 },
Sean Nelson35727f72010-01-28 23:55:12 +00005673 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005674 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005675 },
5676
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005677 {
5678 .vendor = "SST",
5679 .name = "SST49LF040",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005680 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005681 .manufacture_id = SST_ID,
5682 .model_id = SST_49LF040,
5683 .total_size = 512,
5684 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005685 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00005686 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005687 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005688 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005689 .block_erasers =
5690 {
5691 {
5692 .eraseblocks = { {4 * 1024, 128} },
5693 .block_erase = erase_sector_jedec,
5694 }, {
5695 .eraseblocks = { {64 * 1024, 8} },
5696 .block_erase = erase_block_jedec,
5697 }, {
5698 .eraseblocks = { {512 * 1024, 1} },
5699 .block_erase = NULL,
5700 }
5701 },
Sean Nelson35727f72010-01-28 23:55:12 +00005702 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005703 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005704 },
5705
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005706 {
5707 .vendor = "SST",
5708 .name = "SST49LF040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005709 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005710 .manufacture_id = SST_ID,
5711 .model_id = SST_49LF040B,
5712 .total_size = 512,
5713 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +00005714 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
5715 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005716 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005717 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005718 .block_erasers =
5719 {
5720 {
5721 .eraseblocks = { {4 * 1024, 128} },
5722 .block_erase = erase_sector_jedec,
5723 }, {
5724 .eraseblocks = { {64 * 1024, 8} },
5725 .block_erase = erase_block_jedec,
5726 }, {
5727 .eraseblocks = { {512 * 1024, 1} },
5728 .block_erase = NULL,
5729 }
5730 },
Joshua Roysa84b0bd2010-08-16 22:12:39 +00005731 .unlock = unlock_82802ab,
Sean Nelson35727f72010-01-28 23:55:12 +00005732 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005733 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005734 },
5735
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005736 {
5737 .vendor = "SST",
5738 .name = "SST49LF080A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005739 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005740 .manufacture_id = SST_ID,
Urja Rannikko038a3122009-06-28 19:19:25 +00005741 .model_id = SST_49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005742 .total_size = 1024,
5743 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005744 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005745 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005746 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005747 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005748 .block_erasers =
5749 {
5750 {
5751 .eraseblocks = { {4 * 1024, 256} },
5752 .block_erase = erase_sector_jedec,
5753 }, {
5754 .eraseblocks = { {64 * 1024, 16} },
5755 .block_erase = erase_block_jedec,
5756 }, {
5757 .eraseblocks = { {1024 * 1024, 1} },
5758 .block_erase = NULL,
5759 }
5760 },
Sean Nelson35727f72010-01-28 23:55:12 +00005761 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005762 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005763 },
5764
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005765 {
5766 .vendor = "SST",
5767 .name = "SST49LF160C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005768 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005769 .manufacture_id = SST_ID,
5770 .model_id = SST_49LF160C,
5771 .total_size = 2048,
5772 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005773 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00005774 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005775 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005776 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005777 .block_erasers =
5778 {
5779 {
5780 .eraseblocks = { {4 * 1024, 512} },
5781 .block_erase = erase_sector_49lfxxxc,
5782 }, {
5783 .eraseblocks = {
5784 {64 * 1024, 31},
5785 {32 * 1024, 1},
5786 {8 * 1024, 2},
5787 {16 * 1024, 1},
5788 },
Sean Nelson69e58112010-03-23 17:10:28 +00005789 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005790 }
5791 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00005792 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005793 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005794 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005795 },
5796
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005797 {
5798 .vendor = "ST",
5799 .name = "M25P05-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005800 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005801 .manufacture_id = ST_ID,
5802 .model_id = ST_M25P05A,
5803 .total_size = 64,
5804 .page_size = 256,
5805 .tested = TEST_UNTESTED,
5806 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005807 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005808 .block_erasers =
5809 {
5810 {
5811 .eraseblocks = { {32 * 1024, 2} },
5812 .block_erase = spi_block_erase_d8,
5813 }, {
5814 .eraseblocks = { {64 * 1024, 1} },
5815 .block_erase = spi_block_erase_c7,
5816 }
5817 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005818 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005819 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005820 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005821 },
5822
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005823 /* The ST M25P05 is a bit of a problem. It has the same ID as the
5824 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005825 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005826 * only is successful if RDID does not work.
5827 */
5828 {
5829 .vendor = "ST",
5830 .name = "M25P05.RES",
5831 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005832 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005833 .model_id = ST_M25P05_RES,
5834 .total_size = 64,
5835 .page_size = 256,
5836 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005837 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005838 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005839 .block_erasers =
5840 {
5841 {
5842 .eraseblocks = { {32 * 1024, 2} },
5843 .block_erase = spi_block_erase_d8,
5844 }, {
5845 .eraseblocks = { {64 * 1024, 1} },
5846 .block_erase = spi_block_erase_c7,
5847 }
5848 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005849 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005850 .write = spi_chip_write_1, /* 128 */
5851 .read = spi_chip_read,
5852 },
5853
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005854 {
5855 .vendor = "ST",
5856 .name = "M25P10-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005857 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005858 .manufacture_id = ST_ID,
5859 .model_id = ST_M25P10A,
5860 .total_size = 128,
5861 .page_size = 256,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005862 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005863 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005864 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005865 .block_erasers =
5866 {
5867 {
5868 .eraseblocks = { {32 * 1024, 4} },
5869 .block_erase = spi_block_erase_d8,
5870 }, {
5871 .eraseblocks = { {128 * 1024, 1} },
5872 .block_erase = spi_block_erase_c7,
5873 }
5874 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005875 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005876 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005877 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005878 },
5879
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005880 /* The ST M25P10 has the same problem as the M25P05. */
5881 {
5882 .vendor = "ST",
5883 .name = "M25P10.RES",
5884 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005885 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005886 .model_id = ST_M25P10_RES,
5887 .total_size = 128,
5888 .page_size = 256,
5889 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005890 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005891 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005892 .block_erasers =
5893 {
5894 {
5895 .eraseblocks = { {32 * 1024, 4} },
5896 .block_erase = spi_block_erase_d8,
5897 }, {
5898 .eraseblocks = { {128 * 1024, 1} },
5899 .block_erase = spi_block_erase_c7,
5900 }
5901 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005902 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005903 .write = spi_chip_write_1, /* 128 */
5904 .read = spi_chip_read,
5905 },
5906
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005907 {
5908 .vendor = "ST",
5909 .name = "M25P20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005910 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005911 .manufacture_id = ST_ID,
5912 .model_id = ST_M25P20,
5913 .total_size = 256,
5914 .page_size = 256,
5915 .tested = TEST_UNTESTED,
5916 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005917 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005918 .block_erasers =
5919 {
5920 {
5921 .eraseblocks = { {64 * 1024, 4} },
5922 .block_erase = spi_block_erase_d8,
5923 }, {
5924 .eraseblocks = { {256 * 1024, 1} },
5925 .block_erase = spi_block_erase_c7,
5926 }
5927 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005928 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005929 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005930 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005931 },
5932
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005933 {
5934 .vendor = "ST",
5935 .name = "M25P40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005936 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005937 .manufacture_id = ST_ID,
5938 .model_id = ST_M25P40,
5939 .total_size = 512,
5940 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005941 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005942 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005943 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005944 .block_erasers =
5945 {
5946 {
5947 .eraseblocks = { {64 * 1024, 8} },
5948 .block_erase = spi_block_erase_d8,
5949 }, {
5950 .eraseblocks = { {512 * 1024, 1} },
5951 .block_erase = spi_block_erase_c7,
5952 }
5953 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005954 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005955 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005956 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005957 },
5958
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005959 {
5960 .vendor = "ST",
5961 .name = "M25P40-old",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005962 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005963 .manufacture_id = 0, /* Not used. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005964 .model_id = ST_M25P40_RES,
5965 .total_size = 512,
5966 .page_size = 256,
5967 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005968 .probe = probe_spi_res1,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005969 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005970 .block_erasers =
5971 {
5972 {
5973 .eraseblocks = { {64 * 1024, 8} },
5974 .block_erase = spi_block_erase_d8,
5975 }, {
5976 .eraseblocks = { {512 * 1024, 1} },
5977 .block_erase = spi_block_erase_c7,
5978 }
5979 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005980 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005981 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005982 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005983 },
5984
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005985 {
5986 .vendor = "ST",
5987 .name = "M25P80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005988 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005989 .manufacture_id = ST_ID,
5990 .model_id = ST_M25P80,
5991 .total_size = 1024,
5992 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005993 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005994 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005995 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005996 .block_erasers =
5997 {
5998 {
5999 .eraseblocks = { {64 * 1024, 16} },
6000 .block_erase = spi_block_erase_d8,
6001 }, {
6002 .eraseblocks = { {1024 * 1024, 1} },
6003 .block_erase = spi_block_erase_c7,
6004 }
6005 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006006 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006007 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006008 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006009 },
6010
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006011 {
6012 .vendor = "ST",
6013 .name = "M25P16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006014 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006015 .manufacture_id = ST_ID,
6016 .model_id = ST_M25P16,
6017 .total_size = 2048,
6018 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00006019 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006020 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006021 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006022 .block_erasers =
6023 {
6024 {
6025 .eraseblocks = { {64 * 1024, 32} },
6026 .block_erase = spi_block_erase_d8,
6027 }, {
6028 .eraseblocks = { {2 * 1024 * 1024, 1} },
6029 .block_erase = spi_block_erase_c7,
6030 }
6031 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006032 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006033 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006034 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006035 },
6036
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006037 {
6038 .vendor = "ST",
6039 .name = "M25P32",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006040 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006041 .manufacture_id = ST_ID,
6042 .model_id = ST_M25P32,
6043 .total_size = 4096,
6044 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00006045 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006046 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006047 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006048 .block_erasers =
6049 {
6050 {
6051 .eraseblocks = { {64 * 1024, 64} },
6052 .block_erase = spi_block_erase_d8,
6053 }, {
6054 .eraseblocks = { {4 * 1024 * 1024, 1} },
6055 .block_erase = spi_block_erase_c7,
6056 }
6057 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006058 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006059 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006060 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006061 },
6062
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006063 {
6064 .vendor = "ST",
6065 .name = "M25P64",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006066 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006067 .manufacture_id = ST_ID,
6068 .model_id = ST_M25P64,
6069 .total_size = 8192,
6070 .page_size = 256,
6071 .tested = TEST_UNTESTED,
6072 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006073 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006074 .block_erasers =
6075 {
6076 {
6077 .eraseblocks = { {64 * 1024, 128} },
6078 .block_erase = spi_block_erase_d8,
6079 }, {
6080 .eraseblocks = { {8 * 1024 * 1024, 1} },
6081 .block_erase = spi_block_erase_c7,
6082 }
6083 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006084 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006085 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006086 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006087 },
6088
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006089 {
6090 .vendor = "ST",
6091 .name = "M25P128",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006092 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006093 .manufacture_id = ST_ID,
6094 .model_id = ST_M25P128,
6095 .total_size = 16384,
6096 .page_size = 256,
6097 .tested = TEST_UNTESTED,
6098 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006099 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006100 .block_erasers =
6101 {
6102 {
6103 .eraseblocks = { {256 * 1024, 64} },
6104 .block_erase = spi_block_erase_d8,
6105 }, {
6106 .eraseblocks = { {16 * 1024 * 1024, 1} },
6107 .block_erase = spi_block_erase_c7,
6108 }
6109 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006110 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006111 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006112 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006113 },
6114
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006115 {
6116 .vendor = "ST",
Jason Shriver4119e9b2010-09-14 13:16:01 +00006117 .name = "M25PX32",
6118 .bustype = CHIP_BUSTYPE_SPI,
6119 .manufacture_id = ST_ID,
6120 .model_id = ST_M25PX32,
6121 .total_size = 4096,
6122 .page_size = 256,
6123 .tested = TEST_OK_PREW,
6124 .probe = probe_spi_rdid,
6125 .probe_timing = TIMING_ZERO,
6126 .block_erasers =
6127 {
6128 {
6129 .eraseblocks = { { 4 * 1024, 1024 } },
6130 .block_erase = spi_block_erase_20,
6131 }, {
6132 .eraseblocks = { {64 * 1024, 64} },
6133 .block_erase = spi_block_erase_d8,
6134 }, {
6135 .eraseblocks = { {4 * 1024 * 1024, 1} },
6136 .block_erase = spi_block_erase_c7,
6137 }
6138 },
6139 .unlock = spi_disable_blockprotect,
6140 .write = spi_chip_write_256,
6141 .read = spi_chip_read,
6142 },
6143
6144 {
6145 .vendor = "ST",
6146 .name = "M25PX64",
6147 .bustype = CHIP_BUSTYPE_SPI,
6148 .manufacture_id = ST_ID,
6149 .model_id = ST_M25PX64,
6150 .total_size = 8192,
6151 .page_size = 256,
6152 .tested = TEST_OK_PREW,
6153 .probe = probe_spi_rdid,
6154 .probe_timing = TIMING_ZERO,
6155 .block_erasers =
6156 {
6157 {
6158 .eraseblocks = { { 4 * 1024, 2048 } },
6159 .block_erase = spi_block_erase_20,
6160 }, {
6161 .eraseblocks = { {64 * 1024, 128} },
6162 .block_erase = spi_block_erase_d8,
6163 }, {
6164 .eraseblocks = { {8 * 1024 * 1024, 1} },
6165 .block_erase = spi_block_erase_c7,
6166 }
6167 },
6168 .unlock = spi_disable_blockprotect,
6169 .write = spi_chip_write_256,
6170 .read = spi_chip_read,
6171 },
6172
6173 {
6174 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006175 .name = "M29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006176 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006177 .manufacture_id = ST_ID,
6178 .model_id = ST_M29F002B,
6179 .total_size = 256,
6180 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006181 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006182 .tested = TEST_UNTESTED,
6183 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006184 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006185 .block_erasers =
6186 {
6187 {
6188 .eraseblocks = {
6189 {16 * 1024, 1},
6190 {8 * 1024, 2},
6191 {32 * 1024, 1},
6192 {64 * 1024, 3},
6193 },
6194 .block_erase = erase_sector_jedec,
6195 }, {
6196 .eraseblocks = { {256 * 1024, 1} },
6197 .block_erase = erase_chip_block_jedec,
6198 }
6199 },
Sean Nelson35727f72010-01-28 23:55:12 +00006200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006201 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006202 },
6203
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006204 {
6205 .vendor = "ST",
6206 .name = "M29F002T/NT",
Urja Rannikko038a3122009-06-28 19:19:25 +00006207 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006208 .manufacture_id = ST_ID,
6209 .model_id = ST_M29F002T,
6210 .total_size = 256,
6211 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006212 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
6213 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006214 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006215 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006216 .block_erasers =
6217 {
6218 {
6219 .eraseblocks = {
6220 {64 * 1024, 3},
6221 {32 * 1024, 1},
6222 {8 * 1024, 2},
6223 {16 * 1024, 1},
6224 },
6225 .block_erase = erase_sector_jedec,
6226 }, {
6227 .eraseblocks = { {256 * 1024, 1} },
6228 .block_erase = erase_chip_block_jedec,
6229 }
6230 },
Sean Nelson35727f72010-01-28 23:55:12 +00006231 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006232 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006233 },
6234
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006235 {
6236 .vendor = "ST",
6237 .name = "M29F040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006238 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006239 .manufacture_id = ST_ID,
6240 .model_id = ST_M29F040B,
6241 .total_size = 512,
6242 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006243 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6244 .tested = TEST_UNTESTED,
6245 .probe = probe_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006246 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (am29f040b.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006247 .block_erasers =
6248 {
6249 {
6250 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00006251 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00006252 }, {
6253 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006254 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00006255 }
6256 },
Sean Nelson35727f72010-01-28 23:55:12 +00006257 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006258 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006259 },
6260
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006261 {
Sean Nelson35727f72010-01-28 23:55:12 +00006262 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006263 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006264 .name = "M29F400BB",
6265 .bustype = CHIP_BUSTYPE_PARALLEL,
6266 .manufacture_id = ST_ID,
6267 .model_id = ST_M29F400BB,
6268 .total_size = 512,
6269 .page_size = 64 * 1024,
6270 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
6271 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
6272 .probe = probe_m29f400bt,
6273 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
6274 .block_erasers =
6275 {
6276 {
6277 .eraseblocks = {
6278 {16 * 1024, 1},
6279 {8 * 1024, 2},
6280 {32 * 1024, 1},
6281 {64 * 1024, 7},
6282 },
6283 .block_erase = block_erase_m29f400bt,
6284 }, {
6285 .eraseblocks = { {512 * 1024, 1} },
6286 .block_erase = block_erase_chip_m29f400bt,
6287 }
6288 },
6289 .write = NULL,
6290 .read = read_memmapped,
6291 },
6292 {
6293 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
6294 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006295 .name = "M29F400BT",
Urja Rannikko038a3122009-06-28 19:19:25 +00006296 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006297 .manufacture_id = ST_ID,
6298 .model_id = ST_M29F400BT,
6299 .total_size = 512,
6300 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006301 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006302 .tested = TEST_UNTESTED,
6303 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006304 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006305 .block_erasers =
6306 {
6307 {
6308 .eraseblocks = {
6309 {64 * 1024, 7},
6310 {32 * 1024, 1},
6311 {8 * 1024, 2},
6312 {16 * 1024, 1},
6313 },
6314 .block_erase = block_erase_m29f400bt,
6315 }, {
6316 .eraseblocks = { {512 * 1024, 1} },
6317 .block_erase = block_erase_chip_m29f400bt,
6318 }
6319 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006320 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006321 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006322 },
6323
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006324 {
6325 .vendor = "ST",
6326 .name = "M29W010B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006327 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006328 .manufacture_id = ST_ID,
6329 .model_id = ST_M29W010B,
6330 .total_size = 128,
6331 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006332 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006333 .tested = TEST_UNTESTED,
6334 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006335 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006336 .block_erasers =
6337 {
6338 {
6339 .eraseblocks = { {16 * 1024, 8}, },
6340 .block_erase = erase_sector_jedec,
6341 }, {
6342 .eraseblocks = { {128 * 1024, 1} },
6343 .block_erase = erase_chip_block_jedec,
6344 }
6345 },
Sean Nelson35727f72010-01-28 23:55:12 +00006346 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006347 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006348 },
6349
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006350 {
6351 .vendor = "ST",
6352 .name = "M29W040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006353 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006354 .manufacture_id = ST_ID,
6355 .model_id = ST_M29W040B,
6356 .total_size = 512,
6357 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006358 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006359 .tested = TEST_UNTESTED,
6360 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006361 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006362 .block_erasers =
6363 {
6364 {
6365 .eraseblocks = { {64 * 1024, 8}, },
6366 .block_erase = erase_sector_jedec,
6367 }, {
6368 .eraseblocks = { {512 * 1024, 1} },
6369 .block_erase = erase_chip_block_jedec,
6370 }
6371 },
Sean Nelson35727f72010-01-28 23:55:12 +00006372 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006373 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006374 },
6375
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006376 {
6377 .vendor = "ST",
6378 .name = "M29W512B",
6379 .bustype = CHIP_BUSTYPE_PARALLEL,
6380 .manufacture_id = ST_ID,
6381 .model_id = ST_M29W512B,
6382 .total_size = 64,
6383 .page_size = 64 * 1024,
6384 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6385 .tested = TEST_OK_PREW,
6386 .probe = probe_jedec,
6387 .probe_timing = TIMING_ZERO,
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006388 .block_erasers =
6389 {
6390 {
6391 .eraseblocks = { {64 * 1024, 1} },
6392 .block_erase = erase_chip_block_jedec,
6393 }
6394 },
6395 .write = write_jedec_1,
6396 .read = read_memmapped,
6397 },
6398
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006399 {
6400 .vendor = "ST",
6401 .name = "M50FLW040A",
Sean Nelson35727f72010-01-28 23:55:12 +00006402 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006403 .manufacture_id = ST_ID,
6404 .model_id = ST_M50FLW040A,
6405 .total_size = 512,
6406 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006407 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006408 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006409 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006410 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006411 .block_erasers =
6412 {
6413 {
Sean Nelson329bde72010-01-19 16:39:19 +00006414 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006415 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006416 {64 * 1024, 5}, /* block */
6417 {4 * 1024, 16}, /* sector */
6418 {4 * 1024, 16}, /* sector */
6419 },
6420 .block_erase = NULL,
6421 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006422 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006423 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006424 }, {
6425 .eraseblocks = { {512 * 1024, 1} },
6426 .block_erase = erase_chip_stm50flw0x0x,
6427 }
6428 },
Sean Nelson28accc22010-03-19 18:47:06 +00006429 .unlock = unlock_stm50flw0x0x,
6430 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006431 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006432 },
6433
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006434 {
6435 .vendor = "ST",
6436 .name = "M50FLW040B",
Sean Nelson35727f72010-01-28 23:55:12 +00006437 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006438 .manufacture_id = ST_ID,
6439 .model_id = ST_M50FLW040B,
6440 .total_size = 512,
6441 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006442 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006443 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006444 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006445 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006446 .block_erasers =
6447 {
6448 {
Sean Nelson329bde72010-01-19 16:39:19 +00006449 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006450 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006451 {4 * 1024, 16}, /* sector */
6452 {64 * 1024, 5}, /* block */
6453 {4 * 1024, 16}, /* sector */
6454 },
6455 .block_erase = NULL,
6456 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006457 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006458 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006459 }, {
6460 .eraseblocks = { {512 * 1024, 1} },
6461 .block_erase = erase_chip_stm50flw0x0x,
6462 }
6463 },
Sean Nelson28accc22010-03-19 18:47:06 +00006464 .unlock = unlock_stm50flw0x0x,
6465 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006466 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006467 },
6468
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006469 {
6470 .vendor = "ST",
6471 .name = "M50FLW080A",
Sean Nelson35727f72010-01-28 23:55:12 +00006472 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006473 .manufacture_id = ST_ID,
6474 .model_id = ST_M50FLW080A,
6475 .total_size = 1024,
6476 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006477 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00006478 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006479 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006480 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006481 .block_erasers =
6482 {
6483 {
Sean Nelson329bde72010-01-19 16:39:19 +00006484 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006485 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006486 {64 * 1024, 13}, /* block */
6487 {4 * 1024, 16}, /* sector */
6488 {4 * 1024, 16}, /* sector */
6489 },
6490 .block_erase = NULL,
6491 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006492 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006493 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006494 }, {
6495 .eraseblocks = { {1024 * 1024, 1} },
6496 .block_erase = erase_chip_stm50flw0x0x,
6497 }
6498 },
Sean Nelson28accc22010-03-19 18:47:06 +00006499 .unlock = unlock_stm50flw0x0x,
6500 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006501 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006502 },
6503
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006504 {
6505 .vendor = "ST",
6506 .name = "M50FLW080B",
Sean Nelson35727f72010-01-28 23:55:12 +00006507 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006508 .manufacture_id = ST_ID,
6509 .model_id = ST_M50FLW080B,
6510 .total_size = 1024,
6511 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006512 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006513 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006514 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006515 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006516 .block_erasers =
6517 {
6518 {
Sean Nelson329bde72010-01-19 16:39:19 +00006519 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006520 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006521 {4 * 1024, 16}, /* sector */
6522 {64 * 1024, 13}, /* block */
6523 {4 * 1024, 16}, /* sector */
6524 },
6525 .block_erase = NULL,
6526 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006527 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006528 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006529 }, {
6530 .eraseblocks = { {1024 * 1024, 1} },
6531 .block_erase = erase_chip_stm50flw0x0x,
6532 }
6533 },
Sean Nelson28accc22010-03-19 18:47:06 +00006534 .unlock = unlock_stm50flw0x0x,
6535 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006536 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006537 },
6538
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006539 {
6540 .vendor = "ST",
6541 .name = "M50FW002",
Urja Rannikko038a3122009-06-28 19:19:25 +00006542 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006543 .manufacture_id = ST_ID,
6544 .model_id = ST_M50FW002,
6545 .total_size = 256,
6546 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006547 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006548 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006549 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006550 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006551 .block_erasers =
6552 {
6553 {
6554 .eraseblocks = {
6555 {64 * 1024, 3},
6556 {32 * 1024, 1},
6557 {8 * 1024, 2},
6558 {16 * 1024, 1},
6559 },
Sean Nelson28accc22010-03-19 18:47:06 +00006560 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006561 }, {
6562 .eraseblocks = { {256 * 1024, 1} },
6563 .block_erase = erase_chip_stm50flw0x0x,
6564 }
6565 },
Sean Nelson28accc22010-03-19 18:47:06 +00006566 .unlock = unlock_stm50flw0x0x,
6567 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006568 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006569 },
6570
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006571 {
6572 .vendor = "ST",
6573 .name = "M50FW016",
Urja Rannikko038a3122009-06-28 19:19:25 +00006574 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006575 .manufacture_id = ST_ID,
6576 .model_id = ST_M50FW016,
6577 .total_size = 2048,
6578 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006579 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006580 .tested = TEST_UNTESTED,
6581 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006582 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006583 .block_erasers =
6584 {
6585 {
6586 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006587 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006588 }, {
6589 .eraseblocks = { {2 * 1024 * 1024, 1} },
6590 .block_erase = erase_chip_stm50flw0x0x,
6591 }
6592 },
Sean Nelson28accc22010-03-19 18:47:06 +00006593 .unlock = unlock_stm50flw0x0x,
6594 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006595 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006596 },
6597
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006598 {
6599 .vendor = "ST",
6600 .name = "M50FW040",
Urja Rannikko038a3122009-06-28 19:19:25 +00006601 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006602 .manufacture_id = ST_ID,
6603 .model_id = ST_M50FW040,
6604 .total_size = 512,
6605 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006606 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006607 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006608 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006609 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006610 .block_erasers =
6611 {
6612 {
6613 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006614 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006615 }, {
6616 .eraseblocks = { {512 * 1024, 1} },
6617 .block_erase = erase_chip_stm50flw0x0x,
6618 }
6619 },
Sean Nelson28accc22010-03-19 18:47:06 +00006620 .unlock = unlock_stm50flw0x0x,
6621 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006622 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006623 },
6624
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006625 {
6626 .vendor = "ST",
6627 .name = "M50FW080",
Urja Rannikko038a3122009-06-28 19:19:25 +00006628 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006629 .manufacture_id = ST_ID,
6630 .model_id = ST_M50FW080,
6631 .total_size = 1024,
6632 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006633 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006634 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006635 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006636 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006637 .block_erasers =
6638 {
6639 {
6640 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006641 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006642 }, {
6643 .eraseblocks = { {1024 * 1024, 1} },
6644 .block_erase = erase_chip_stm50flw0x0x,
6645 }
6646 },
Sean Nelson28accc22010-03-19 18:47:06 +00006647 .unlock = unlock_stm50flw0x0x,
6648 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006649 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006650 },
6651
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006652 {
6653 .vendor = "ST",
6654 .name = "M50LPW116",
Urja Rannikko038a3122009-06-28 19:19:25 +00006655 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006656 .manufacture_id = ST_ID,
6657 .model_id = ST_M50LPW116,
6658 .total_size = 2048,
6659 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006660 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006661 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006662 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +00006663 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006664 .block_erasers =
6665 {
6666 {
6667 .eraseblocks = {
6668 {4 * 1024, 16},
6669 {64 * 1024, 30},
6670 {32 * 1024, 1},
6671 {8 * 1024, 2},
6672 {16 * 1024, 1},
6673 },
Sean Nelson28accc22010-03-19 18:47:06 +00006674 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006675 }, {
6676 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006677 .block_erase = erase_chip_stm50flw0x0x,
Sean Nelson56358aa2010-01-19 16:08:51 +00006678 }
6679 },
Sean Nelson28accc22010-03-19 18:47:06 +00006680 .unlock = unlock_stm50flw0x0x,
6681 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006682 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006683 },
6684
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006685 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006686 .vendor = "SyncMOS/MoselVitelic",
6687 .name = "{F,S,V}29C51001B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006688 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006689 .manufacture_id = SYNCMOS_MVC_ID,
6690 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006691 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006692 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +00006693 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006694 .tested = TEST_UNTESTED,
6695 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006696 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006697 .block_erasers =
6698 {
6699 {
6700 .eraseblocks = { {512, 256} },
6701 .block_erase = erase_sector_jedec,
6702 }, {
6703 .eraseblocks = { {128 * 1024, 1} },
6704 .block_erase = erase_chip_block_jedec,
6705 },
6706 },
Sean Nelson35727f72010-01-28 23:55:12 +00006707 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006708 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006709 },
6710
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006711 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006712 .vendor = "SyncMOS/MoselVitelic",
6713 .name = "{F,S,V}29C51001T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006714 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006715 .manufacture_id = SYNCMOS_MVC_ID,
6716 .model_id = SM_MVC_29C51001T,
6717 .total_size = 128,
6718 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +00006719 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006720 .tested = TEST_UNTESTED,
6721 .probe = probe_jedec,
6722 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6723 .block_erasers =
6724 {
6725 {
6726 .eraseblocks = { {512, 256} },
6727 .block_erase = erase_sector_jedec,
6728 }, {
6729 .eraseblocks = { {128 * 1024, 1} },
6730 .block_erase = erase_chip_block_jedec,
6731 },
6732 },
6733 .write = write_jedec_1,
6734 .read = read_memmapped,
6735 },
6736
6737 {
6738 .vendor = "SyncMOS/MoselVitelic",
6739 .name = "{F,S,V}29C51002B",
6740 .bustype = CHIP_BUSTYPE_PARALLEL,
6741 .manufacture_id = SYNCMOS_MVC_ID,
6742 .model_id = SM_MVC_29C51002B,
6743 .total_size = 256,
6744 .page_size = 512,
6745 .feature_bits = FEATURE_EITHER_RESET,
6746 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006747 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006748 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006749 .block_erasers =
6750 {
6751 {
6752 .eraseblocks = { {512, 512} },
6753 .block_erase = erase_sector_jedec,
6754 }, {
6755 .eraseblocks = { {256 * 1024, 1} },
6756 .block_erase = erase_chip_block_jedec,
6757 },
6758 },
Sean Nelson35727f72010-01-28 23:55:12 +00006759 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006760 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006761 },
6762
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006763 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006764 .vendor = "SyncMOS/MoselVitelic",
6765 .name = "{F,S,V}29C51002T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006766 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006767 .manufacture_id = SYNCMOS_MVC_ID,
6768 .model_id = SM_MVC_29C51002T,
6769 .total_size = 256,
6770 .page_size = 512,
6771 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00006772 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006773 .probe = probe_jedec,
6774 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6775 .block_erasers =
6776 {
6777 {
6778 .eraseblocks = { {512, 512} },
6779 .block_erase = erase_sector_jedec,
6780 }, {
6781 .eraseblocks = { {256 * 1024, 1} },
6782 .block_erase = erase_chip_block_jedec,
6783 },
6784 },
6785 .write = write_jedec_1,
6786 .read = read_memmapped,
6787 },
6788
6789 {
6790 .vendor = "SyncMOS/MoselVitelic",
6791 .name = "{F,S,V}29C51004B",
6792 .bustype = CHIP_BUSTYPE_PARALLEL,
6793 .manufacture_id = SYNCMOS_MVC_ID,
6794 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006795 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006796 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006797 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006798 .tested = TEST_UNTESTED,
6799 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006800 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006801 .block_erasers =
6802 {
6803 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006804 .eraseblocks = { {1024, 512} },
6805 .block_erase = erase_sector_jedec,
6806 }, {
6807 .eraseblocks = { {512 * 1024, 1} },
6808 .block_erase = erase_chip_block_jedec,
6809 },
6810 },
6811 .write = write_jedec_1,
6812 .read = read_memmapped,
6813 },
6814
6815 {
6816 .vendor = "SyncMOS/MoselVitelic",
6817 .name = "{F,S,V}29C51004T",
6818 .bustype = CHIP_BUSTYPE_PARALLEL,
6819 .manufacture_id = SYNCMOS_MVC_ID,
6820 .model_id = SM_MVC_29C51004T,
6821 .total_size = 512,
6822 .page_size = 1024,
6823 .feature_bits = FEATURE_EITHER_RESET,
6824 .tested = TEST_UNTESTED,
6825 .probe = probe_jedec,
6826 .probe_timing = TIMING_ZERO,
6827 .block_erasers =
6828 {
6829 {
6830 .eraseblocks = { {1024, 512} },
6831 .block_erase = erase_sector_jedec,
6832 }, {
6833 .eraseblocks = { {512 * 1024, 1} },
6834 .block_erase = erase_chip_block_jedec,
6835 },
6836 },
6837 .write = write_jedec_1,
6838 .read = read_memmapped,
6839 },
6840
6841 {
6842 .vendor = "SyncMOS/MoselVitelic",
6843 .name = "{S,V}29C31004B",
6844 .bustype = CHIP_BUSTYPE_PARALLEL,
6845 .manufacture_id = SYNCMOS_MVC_ID,
6846 .model_id = SM_MVC_29C31004B,
6847 .total_size = 512,
6848 .page_size = 1024,
6849 .feature_bits = FEATURE_EITHER_RESET,
6850 .tested = TEST_UNTESTED,
6851 .probe = probe_jedec,
6852 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6853 .block_erasers =
6854 {
6855 {
6856 .eraseblocks = { {1024, 512} },
6857 .block_erase = erase_sector_jedec,
6858 }, {
6859 .eraseblocks = { {512 * 1024, 1} },
6860 .block_erase = erase_chip_block_jedec,
6861 },
6862 },
6863 .write = write_jedec_1,
6864 .read = read_memmapped,
6865 },
6866
6867 {
6868 .vendor = "SyncMOS/MoselVitelic",
6869 .name = "{S,V}29C31004T",
6870 .bustype = CHIP_BUSTYPE_PARALLEL,
6871 .manufacture_id = SYNCMOS_MVC_ID,
6872 .model_id = SM_MVC_29C31004T,
6873 .total_size = 512,
6874 .page_size = 1024,
6875 .feature_bits = FEATURE_EITHER_RESET,
6876 .tested = TEST_UNTESTED,
6877 .probe = probe_jedec,
6878 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6879 .block_erasers =
6880 {
6881 {
6882 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +00006883 .block_erase = erase_sector_jedec,
6884 }, {
6885 .eraseblocks = { {512 * 1024, 1} },
6886 .block_erase = erase_chip_block_jedec,
6887 },
6888 },
Sean Nelson35727f72010-01-28 23:55:12 +00006889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006890 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006891 },
6892
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006893 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006894 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006895 .name = "TMS29F002RB",
Urja Rannikko038a3122009-06-28 19:19:25 +00006896 .bustype = CHIP_BUSTYPE_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006897 .manufacture_id = TI_OLD_ID,
6898 .model_id = TI_TMS29F002RB,
6899 .total_size = 256,
6900 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +00006901 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006902 .tested = TEST_UNTESTED,
6903 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006904 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006905 .block_erasers =
6906 {
6907 {
6908 .eraseblocks = {
6909 {16 * 1024, 1},
6910 {8 * 1024, 2},
6911 {32 * 1024, 1},
6912 {64 * 1024, 3},
6913 },
6914 .block_erase = erase_sector_jedec,
6915 }, {
6916 .eraseblocks = { {256 * 1024, 1} },
6917 .block_erase = erase_chip_block_jedec,
6918 },
6919 },
Sean Nelson35727f72010-01-28 23:55:12 +00006920 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006921 .read = read_memmapped,
6922 },
6923
6924 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006925 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006926 .name = "TMS29F002RT",
Urja Rannikko038a3122009-06-28 19:19:25 +00006927 .bustype = CHIP_BUSTYPE_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006928 .manufacture_id = TI_OLD_ID,
6929 .model_id = TI_TMS29F002RT,
6930 .total_size = 256,
6931 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +00006932 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006933 .tested = TEST_UNTESTED,
6934 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006935 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006936 .block_erasers =
6937 {
6938 {
6939 .eraseblocks = {
6940 {64 * 1024, 3},
6941 {32 * 1024, 1},
6942 {8 * 1024, 2},
6943 {16 * 1024, 1},
6944 },
6945 .block_erase = erase_sector_jedec,
6946 }, {
6947 .eraseblocks = { {256 * 1024, 1} },
6948 .block_erase = erase_chip_block_jedec,
6949 },
6950 },
Sean Nelson35727f72010-01-28 23:55:12 +00006951 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006952 .read = read_memmapped,
6953 },
6954
6955 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006956 .vendor = "Winbond",
Rudolf Marekce1c7982010-04-20 19:34:31 +00006957 .name = "W25Q80",
6958 .bustype = CHIP_BUSTYPE_SPI,
6959 .manufacture_id = WINBOND_NEX_ID,
6960 .model_id = W_25Q80,
6961 .total_size = 1024,
6962 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00006963 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00006964 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006965 .probe = probe_spi_rdid,
6966 .probe_timing = TIMING_ZERO,
6967 .block_erasers =
6968 {
6969 {
6970 .eraseblocks = { {4 * 1024, 256} },
6971 .block_erase = spi_block_erase_20,
6972 }, {
6973 .eraseblocks = { {32 * 1024, 32} },
6974 .block_erase = spi_block_erase_52,
6975 }, {
6976 .eraseblocks = { {64 * 1024, 16} },
6977 .block_erase = spi_block_erase_d8,
6978 }, {
6979 .eraseblocks = { {1024 * 1024, 1} },
6980 .block_erase = spi_block_erase_60,
6981 }, {
6982 .eraseblocks = { {1024 * 1024, 1} },
6983 .block_erase = spi_block_erase_c7,
6984 }
6985 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006986 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006987 .write = spi_chip_write_256,
6988 .read = spi_chip_read,
6989 },
6990
6991 {
6992 .vendor = "Winbond",
6993 .name = "W25Q16",
6994 .bustype = CHIP_BUSTYPE_SPI,
6995 .manufacture_id = WINBOND_NEX_ID,
6996 .model_id = W_25Q16,
6997 .total_size = 2048,
6998 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00006999 .feature_bits = FEATURE_WRSR_WREN,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007000 .tested = TEST_UNTESTED,
7001 .probe = probe_spi_rdid,
7002 .probe_timing = TIMING_ZERO,
7003 .block_erasers =
7004 {
7005 {
7006 .eraseblocks = { {4 * 1024, 512} },
7007 .block_erase = spi_block_erase_20,
7008 }, {
7009 .eraseblocks = { {32 * 1024, 64} },
7010 .block_erase = spi_block_erase_52,
7011 }, {
7012 .eraseblocks = { {64 * 1024, 32} },
7013 .block_erase = spi_block_erase_d8,
7014 }, {
7015 .eraseblocks = { {2 * 1024 * 1024, 1} },
7016 .block_erase = spi_block_erase_60,
7017 }, {
7018 .eraseblocks = { {2 * 1024 * 1024, 1} },
7019 .block_erase = spi_block_erase_c7,
7020 }
7021 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007022 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007023 .write = spi_chip_write_256,
7024 .read = spi_chip_read,
7025 },
7026
7027 {
7028 .vendor = "Winbond",
7029 .name = "W25Q32",
7030 .bustype = CHIP_BUSTYPE_SPI,
7031 .manufacture_id = WINBOND_NEX_ID,
7032 .model_id = W_25Q32,
7033 .total_size = 4096,
7034 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007035 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00007036 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007037 .probe = probe_spi_rdid,
7038 .probe_timing = TIMING_ZERO,
7039 .block_erasers =
7040 {
7041 {
7042 .eraseblocks = { {4 * 1024, 1024} },
7043 .block_erase = spi_block_erase_20,
7044 }, {
7045 .eraseblocks = { {32 * 1024, 128} },
7046 .block_erase = spi_block_erase_52,
7047 }, {
7048 .eraseblocks = { {64 * 1024, 64} },
7049 .block_erase = spi_block_erase_d8,
7050 }, {
7051 .eraseblocks = { {4 * 1024 * 1024, 1} },
7052 .block_erase = spi_block_erase_60,
7053 }, {
7054 .eraseblocks = { {4 * 1024 * 1024, 1} },
7055 .block_erase = spi_block_erase_c7,
7056 }
7057 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007058 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007059 .write = spi_chip_write_256,
7060 .read = spi_chip_read,
7061 },
7062
7063 {
7064 .vendor = "Winbond",
David Hendricksc4acec92010-06-24 11:39:57 +00007065 .name = "W25Q64",
7066 .bustype = CHIP_BUSTYPE_SPI,
7067 .manufacture_id = WINBOND_NEX_ID,
7068 .model_id = W_25Q64,
7069 .total_size = 8192,
7070 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007071 .feature_bits = FEATURE_WRSR_WREN,
David Hendricksc4acec92010-06-24 11:39:57 +00007072 .tested = TEST_OK_PRW,
7073 .probe = probe_spi_rdid,
7074 .probe_timing = TIMING_ZERO,
7075 .block_erasers =
7076 {
7077 {
7078 .eraseblocks = { {4 * 1024, 2048} },
7079 .block_erase = spi_block_erase_20,
7080 }, {
7081 .eraseblocks = { {32 * 1024, 256} },
7082 .block_erase = spi_block_erase_52,
7083 }, {
7084 .eraseblocks = { {64 * 1024, 128} },
7085 .block_erase = spi_block_erase_d8,
7086 }, {
7087 .eraseblocks = { {8 * 1024 * 1024, 1} },
7088 .block_erase = spi_block_erase_60,
7089 }, {
7090 .eraseblocks = { {8 * 1024 * 1024, 1} },
7091 .block_erase = spi_block_erase_c7,
7092 }
7093 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007094 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +00007095 .write = spi_chip_write_256,
7096 .read = spi_chip_read,
7097 },
7098
7099 {
7100 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007101 .name = "W25x10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007102 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007103 .manufacture_id = WINBOND_NEX_ID,
7104 .model_id = W_25X10,
7105 .total_size = 128,
7106 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007107 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007108 .tested = TEST_UNTESTED,
7109 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007110 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007111 .block_erasers =
7112 {
7113 {
7114 .eraseblocks = { {4 * 1024, 32} },
7115 .block_erase = spi_block_erase_20,
7116 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007117 .eraseblocks = { {64 * 1024, 2} },
7118 .block_erase = spi_block_erase_d8,
7119 }, {
7120 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007121 .block_erase = spi_block_erase_c7,
7122 }
7123 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007124 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007125 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007126 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007127 },
7128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007129 {
7130 .vendor = "Winbond",
7131 .name = "W25x20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007132 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007133 .manufacture_id = WINBOND_NEX_ID,
7134 .model_id = W_25X20,
7135 .total_size = 256,
7136 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007137 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007138 .tested = TEST_UNTESTED,
7139 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007140 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007141 .block_erasers =
7142 {
7143 {
7144 .eraseblocks = { {4 * 1024, 64} },
7145 .block_erase = spi_block_erase_20,
7146 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007147 .eraseblocks = { {64 * 1024, 4} },
7148 .block_erase = spi_block_erase_d8,
7149 }, {
7150 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007151 .block_erase = spi_block_erase_c7,
7152 }
7153 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007154 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007155 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007156 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007157 },
7158
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007159 {
7160 .vendor = "Winbond",
7161 .name = "W25x40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007162 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007163 .manufacture_id = WINBOND_NEX_ID,
7164 .model_id = W_25X40,
7165 .total_size = 512,
7166 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007167 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007168 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007169 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007170 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007171 .block_erasers =
7172 {
7173 {
7174 .eraseblocks = { {4 * 1024, 128} },
7175 .block_erase = spi_block_erase_20,
7176 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007177 .eraseblocks = { {64 * 1024, 8} },
7178 .block_erase = spi_block_erase_d8,
7179 }, {
7180 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007181 .block_erase = spi_block_erase_c7,
7182 }
7183 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007184 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007185 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007186 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007187 },
7188
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007189 {
7190 .vendor = "Winbond",
7191 .name = "W25x80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007192 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007193 .manufacture_id = WINBOND_NEX_ID,
7194 .model_id = W_25X80,
7195 .total_size = 1024,
7196 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007197 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007198 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007199 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007200 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007201 .block_erasers =
7202 {
7203 {
7204 .eraseblocks = { {4 * 1024, 256} },
7205 .block_erase = spi_block_erase_20,
7206 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007207 .eraseblocks = { {64 * 1024, 16} },
7208 .block_erase = spi_block_erase_d8,
7209 }, {
7210 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007211 .block_erase = spi_block_erase_c7,
7212 }
7213 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007214 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007215 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007216 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007217 },
7218
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007219 {
7220 .vendor = "Winbond",
Hector Martina721ae22009-07-11 19:39:11 +00007221 .name = "W25x16",
7222 .bustype = CHIP_BUSTYPE_SPI,
7223 .manufacture_id = WINBOND_NEX_ID,
7224 .model_id = W_25X16,
7225 .total_size = 2048,
7226 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007227 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007228 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +00007229 .probe = probe_spi_rdid,
7230 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007231 .block_erasers =
7232 {
7233 {
7234 .eraseblocks = { {4 * 1024, 512} },
7235 .block_erase = spi_block_erase_20,
7236 }, {
7237 .eraseblocks = { {32 * 1024, 64} },
7238 .block_erase = spi_block_erase_52,
7239 }, {
7240 .eraseblocks = { {64 * 1024, 32} },
7241 .block_erase = spi_block_erase_d8,
7242 }, {
7243 .eraseblocks = { {2 * 1024 * 1024, 1} },
7244 .block_erase = spi_block_erase_60,
7245 }, {
7246 .eraseblocks = { {2 * 1024 * 1024, 1} },
7247 .block_erase = spi_block_erase_c7,
7248 }
7249 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007250 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +00007251 .write = spi_chip_write_256,
7252 .read = spi_chip_read,
7253 },
7254
7255 {
7256 .vendor = "Winbond",
Zheng Bao1db2b752009-11-26 11:05:01 +00007257 .name = "W25x32",
7258 .bustype = CHIP_BUSTYPE_SPI,
7259 .manufacture_id = WINBOND_NEX_ID,
7260 .model_id = W_25X32,
7261 .total_size = 4096,
7262 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007263 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +00007264 .tested = TEST_OK_PROBE,
7265 .probe = probe_spi_rdid,
7266 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007267 .block_erasers =
7268 {
7269 {
7270 .eraseblocks = { {4 * 1024, 1024} },
7271 .block_erase = spi_block_erase_20,
7272 }, {
7273 .eraseblocks = { {32 * 1024, 128} },
7274 .block_erase = spi_block_erase_52,
7275 }, {
7276 .eraseblocks = { {64 * 1024, 64} },
7277 .block_erase = spi_block_erase_d8,
7278 }, {
7279 .eraseblocks = { {4 * 1024 * 1024, 1} },
7280 .block_erase = spi_block_erase_60,
7281 }, {
7282 .eraseblocks = { {4 * 1024 * 1024, 1} },
7283 .block_erase = spi_block_erase_c7,
7284 }
7285 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007286 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00007287 .write = spi_chip_write_256,
7288 .read = spi_chip_read,
7289 },
7290
7291 {
7292 .vendor = "Winbond",
7293 .name = "W25x64",
7294 .bustype = CHIP_BUSTYPE_SPI,
7295 .manufacture_id = WINBOND_NEX_ID,
7296 .model_id = W_25X64,
7297 .total_size = 8192,
7298 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007299 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +00007300 .tested = TEST_UNTESTED,
7301 .probe = probe_spi_rdid,
7302 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007303 .block_erasers =
7304 {
7305 {
7306 .eraseblocks = { {4 * 1024, 2048} },
7307 .block_erase = spi_block_erase_20,
7308 }, {
7309 .eraseblocks = { {32 * 1024, 256} },
7310 .block_erase = spi_block_erase_52,
7311 }, {
7312 .eraseblocks = { {64 * 1024, 128} },
7313 .block_erase = spi_block_erase_d8,
7314 }, {
7315 .eraseblocks = { {8 * 1024 * 1024, 1} },
7316 .block_erase = spi_block_erase_60,
7317 }, {
7318 .eraseblocks = { {8 * 1024 * 1024, 1} },
7319 .block_erase = spi_block_erase_c7,
7320 }
7321 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007322 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00007323 .write = spi_chip_write_256,
7324 .read = spi_chip_read,
7325 },
7326
7327 {
7328 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007329 .name = "W29C011",
Urja Rannikko038a3122009-06-28 19:19:25 +00007330 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007331 .manufacture_id = WINBOND_ID,
7332 .model_id = W_29C011,
7333 .total_size = 128,
7334 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007335 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00007336 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007337 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007338 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007339 .block_erasers =
7340 {
7341 {
7342 .eraseblocks = { {128 * 1024, 1} },
7343 .block_erase = erase_chip_block_jedec,
7344 }
7345 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007346 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007347 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007348 },
7349
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007350 {
7351 .vendor = "Winbond",
7352 .name = "W29C020C",
Urja Rannikko161b8852009-06-05 08:47:37 +00007353 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007354 .manufacture_id = WINBOND_ID,
7355 .model_id = W_29C020C,
7356 .total_size = 256,
7357 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007358 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00007359 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007360 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007361 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007362 .block_erasers =
7363 {
7364 {
7365 .eraseblocks = { {256 * 1024, 1} },
7366 .block_erase = erase_chip_block_jedec,
7367 }
7368 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007369 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007370 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007371 },
7372
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007373 {
7374 .vendor = "Winbond",
7375 .name = "W29C040P",
Urja Rannikko161b8852009-06-05 08:47:37 +00007376 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007377 .manufacture_id = WINBOND_ID,
7378 .model_id = W_29C040P,
7379 .total_size = 512,
7380 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00007381 .feature_bits = FEATURE_LONG_RESET,
7382 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007383 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007384 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007385 .block_erasers =
7386 {
7387 {
7388 .eraseblocks = { {512 * 1024, 1} },
7389 .block_erase = erase_chip_block_jedec,
7390 }
7391 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007392 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007393 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007394 },
7395
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007396 {
7397 .vendor = "Winbond",
7398 .name = "W29EE011",
Urja Rannikko038a3122009-06-28 19:19:25 +00007399 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007400 .manufacture_id = WINBOND_ID,
7401 .model_id = W_29C011,
7402 .total_size = 128,
7403 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007404 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00007405 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007406 .probe = probe_w29ee011,
Maciej Pijankac6e11112009-06-03 14:46:22 +00007407 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (w29ee011.c) */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007408 .block_erasers =
7409 {
7410 {
7411 .eraseblocks = { {128 * 1024, 1} },
7412 .block_erase = erase_chip_block_jedec,
7413 }
7414 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007415 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007416 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007417 },
7418
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007419 {
7420 .vendor = "Winbond",
7421 .name = "W39V040A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007422 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007423 .manufacture_id = WINBOND_ID,
7424 .model_id = W_39V040A,
7425 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007426 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007427 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcher3355f062010-03-24 22:56:23 +00007428 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007429 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007430 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007431 .block_erasers =
7432 {
7433 {
7434 .eraseblocks = { {64 * 1024, 8} },
7435 .block_erase = erase_sector_jedec,
7436 }, {
7437 .eraseblocks = { {512 * 1024, 1} },
7438 .block_erase = erase_chip_block_jedec,
7439 }
7440 },
Sean Nelson35727f72010-01-28 23:55:12 +00007441 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007442 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007443 },
7444
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007445 {
7446 .vendor = "Winbond",
7447 .name = "W39V040B",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007448 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007449 .manufacture_id = WINBOND_ID,
7450 .model_id = W_39V040B,
7451 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007452 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007453 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00007454 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007455 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007456 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007457 .block_erasers =
7458 {
7459 {
7460 .eraseblocks = { {64 * 1024, 8} },
7461 .block_erase = erase_sector_jedec,
7462 }, {
7463 .eraseblocks = { {512 * 1024, 1} },
7464 .block_erase = erase_chip_block_jedec,
7465 }
7466 },
Sean Nelson35727f72010-01-28 23:55:12 +00007467 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007468 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007469 },
7470
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007471 {
7472 .vendor = "Winbond",
7473 .name = "W39V040C",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007474 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007475 .manufacture_id = WINBOND_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00007476 .model_id = W_39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007477 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007478 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007479 .feature_bits = FEATURE_EITHER_RESET,
7480 .tested = TEST_UNTESTED,
7481 .probe = probe_jedec,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00007482 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007483 .block_erasers =
7484 {
7485 {
7486 .eraseblocks = { {64 * 1024, 8} },
7487 .block_erase = erase_sector_jedec,
7488 }, {
7489 .eraseblocks = { {512 * 1024, 1} },
7490 .block_erase = erase_chip_block_jedec,
7491 }
7492 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007493 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +00007494 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007495 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007496 },
7497
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007498 {
7499 .vendor = "Winbond",
7500 .name = "W39V040FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007501 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007502 .manufacture_id = WINBOND_ID,
7503 .model_id = W_39V040FA,
7504 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007505 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +00007506 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann41787602010-05-30 17:50:16 +00007507 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007508 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007509 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007510 .block_erasers =
7511 {
7512 {
7513 .eraseblocks = { {4 * 1024, 128} },
7514 .block_erase = erase_block_jedec,
7515 }, {
7516 .eraseblocks = { {64 * 1024, 8} },
7517 .block_erase = erase_sector_jedec,
7518 }, {
7519 .eraseblocks = { {512 * 1024, 1} },
7520 .block_erase = erase_chip_block_jedec,
7521 }
7522 },
Michael Karcherc9b63412010-05-30 16:55:18 +00007523 .printlock = printlock_sst_fwhub,
7524 .unlock = unlock_sst_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007525 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007526 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007527 },
7528
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007529 {
7530 .vendor = "Winbond",
7531 .name = "W39V080A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007532 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007533 .manufacture_id = WINBOND_ID,
7534 .model_id = W_39V080A,
7535 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007536 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007537 .feature_bits = FEATURE_EITHER_RESET,
7538 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007539 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007540 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007541 .block_erasers =
7542 {
7543 {
7544 .eraseblocks = { {64 * 1024, 16} },
7545 .block_erase = erase_sector_jedec,
7546 }, {
7547 .eraseblocks = { {1024 * 1024, 1} },
7548 .block_erase = erase_chip_block_jedec,
7549 }
7550 },
Sean Nelson35727f72010-01-28 23:55:12 +00007551 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007552 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007553 },
7554
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007555 {
7556 .vendor = "Winbond",
7557 .name = "W49F002U",
Urja Rannikko038a3122009-06-28 19:19:25 +00007558 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007559 .manufacture_id = WINBOND_ID,
7560 .model_id = W_49F002U,
7561 .total_size = 256,
7562 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007563 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00007564 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007565 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007566 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007567 .block_erasers =
7568 {
7569 {
7570 .eraseblocks = {
7571 {128 * 1024, 1},
7572 {96 * 1024, 1},
7573 {8 * 1024, 2},
7574 {16 * 1024, 1},
7575 },
7576 .block_erase = erase_sector_jedec,
7577 }, {
7578 .eraseblocks = { {256 * 1024, 1} },
7579 .block_erase = erase_chip_block_jedec,
7580 }
7581 },
Sean Nelson35727f72010-01-28 23:55:12 +00007582 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007583 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007584 },
7585
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007586 {
7587 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +00007588 .name = "W49F020",
7589 .bustype = CHIP_BUSTYPE_PARALLEL,
7590 .manufacture_id = WINBOND_ID,
7591 .model_id = W_49F020,
7592 .total_size = 256,
7593 .page_size = 128,
7594 .feature_bits = FEATURE_EITHER_RESET,
7595 .tested = TEST_OK_PROBE,
7596 .probe = probe_jedec,
7597 .probe_timing = 10,
7598 .block_erasers =
7599 {
7600 {
7601 .eraseblocks = { {256 * 1024, 1} },
7602 .block_erase = erase_chip_block_jedec,
7603 }
7604 },
7605 .write = write_jedec_1,
7606 .read = read_memmapped,
7607 },
7608
7609 {
7610 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007611 .name = "W49V002A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007612 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007613 .manufacture_id = WINBOND_ID,
7614 .model_id = W_49V002A,
7615 .total_size = 256,
7616 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007617 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007618 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007619 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007620 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007621 .block_erasers =
7622 {
7623 {
7624 .eraseblocks = {
7625 {64 * 1024, 3},
7626 {32 * 1024, 1},
7627 {8 * 1024, 2},
7628 {16 * 1024, 1},
7629 },
7630 .block_erase = erase_sector_jedec,
7631 }, {
7632 .eraseblocks = { {256 * 1024, 1} },
7633 .block_erase = erase_chip_block_jedec,
7634 }
7635 },
Sean Nelson35727f72010-01-28 23:55:12 +00007636 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007637 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007638 },
7639
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007640 {
7641 .vendor = "Winbond",
7642 .name = "W49V002FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007643 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007644 .manufacture_id = WINBOND_ID,
7645 .model_id = W_49V002FA,
7646 .total_size = 256,
7647 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007648 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00007649 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007650 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007651 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007652 .block_erasers =
7653 {
7654 {
7655 .eraseblocks = {
7656 {64 * 1024, 3},
7657 {32 * 1024, 1},
7658 {8 * 1024, 2},
7659 {16 * 1024, 1},
7660 },
7661 .block_erase = erase_sector_jedec,
7662 }, {
7663 .eraseblocks = { {256 * 1024, 1} },
7664 .block_erase = erase_chip_block_jedec,
7665 }
7666 },
Sean Nelson35727f72010-01-28 23:55:12 +00007667 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007668 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007669 },
7670
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007671 {
7672 .vendor = "Winbond",
7673 .name = "W39V080FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007674 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007675 .manufacture_id = WINBOND_ID,
7676 .model_id = W_39V080FA,
7677 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007678 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007679 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00007680 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007681 .probe = probe_jedec,
7682 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007683 .block_erasers =
7684 {
7685 {
7686 .eraseblocks = { {64 * 1024, 16}, },
7687 .block_erase = erase_sector_jedec,
7688 }, {
7689 .eraseblocks = { {1024 * 1024, 1} },
7690 .block_erase = erase_chip_block_jedec,
7691 }
7692 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007693 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007694 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007695 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007696 },
7697
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007698 {
7699 .vendor = "Winbond",
7700 .name = "W39V080FA (dual mode)",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007701 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007702 .manufacture_id = WINBOND_ID,
7703 .model_id = W_39V080FA_DM,
7704 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007705 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007706 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007707 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007708 .probe = probe_jedec,
7709 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007710 .block_erasers =
7711 {
7712 {
7713 .eraseblocks = { {64 * 1024, 8}, },
7714 .block_erase = erase_sector_jedec,
7715 }, {
7716 .eraseblocks = { {512 * 1024, 1} },
7717 .block_erase = erase_chip_block_jedec,
7718 }
7719 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007720 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007721 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007722 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007723 },
7724
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007725 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00007726 .vendor = "AMIC",
7727 .name = "unknown AMIC SPI chip",
7728 .bustype = CHIP_BUSTYPE_SPI,
7729 .manufacture_id = AMIC_ID,
7730 .model_id = GENERIC_DEVICE_ID,
7731 .total_size = 0,
7732 .page_size = 256,
7733 .tested = TEST_BAD_PREW,
7734 .probe = probe_spi_rdid4,
7735 .probe_timing = TIMING_ZERO,
7736 .write = NULL,
7737 .read = NULL,
7738 },
7739
7740 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007741 .vendor = "Atmel",
7742 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007743 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007744 .manufacture_id = ATMEL_ID,
7745 .model_id = GENERIC_DEVICE_ID,
7746 .total_size = 0,
7747 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007748 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007749 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007750 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007751 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007752 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007753 },
7754
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007755 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00007756 .vendor = "Eon",
7757 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007758 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007759 .manufacture_id = EON_ID_NOPREFIX,
7760 .model_id = GENERIC_DEVICE_ID,
7761 .total_size = 0,
7762 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007763 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007764 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007765 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007766 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007767 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007768 },
7769
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007770 {
7771 .vendor = "Macronix",
7772 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007773 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007774 .manufacture_id = MX_ID,
7775 .model_id = GENERIC_DEVICE_ID,
7776 .total_size = 0,
7777 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007778 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007779 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007780 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007781 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007782 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007783 },
7784
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007785 {
7786 .vendor = "PMC",
7787 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007788 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007789 .manufacture_id = PMC_ID,
7790 .model_id = GENERIC_DEVICE_ID,
7791 .total_size = 0,
7792 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007793 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007794 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007795 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007796 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007797 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007798 },
7799
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007800 {
7801 .vendor = "SST",
7802 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007803 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007804 .manufacture_id = SST_ID,
7805 .model_id = GENERIC_DEVICE_ID,
7806 .total_size = 0,
7807 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007808 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007809 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007810 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007811 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007812 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007813 },
7814
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007815 {
7816 .vendor = "ST",
7817 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007818 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007819 .manufacture_id = ST_ID,
7820 .model_id = GENERIC_DEVICE_ID,
7821 .total_size = 0,
7822 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007823 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007824 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007825 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007826 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007827 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007828 },
Uwe Hermannfc425e82008-03-16 02:06:25 +00007829
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007830 {
Sean Nelson118e1d62009-11-24 02:08:11 +00007831 .vendor = "Sanyo",
7832 .name = "unknown Sanyo SPI chip",
7833 .bustype = CHIP_BUSTYPE_SPI,
7834 .manufacture_id = SANYO_ID,
7835 .model_id = GENERIC_DEVICE_ID,
7836 .total_size = 0,
7837 .page_size = 256,
7838 .tested = TEST_BAD_PREW,
7839 .probe = probe_spi_rdid,
7840 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +00007841 .write = NULL,
7842 .read = NULL,
7843 },
7844
7845 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007846 .vendor = "Generic",
7847 .name = "unknown SPI chip (RDID)",
7848 .bustype = CHIP_BUSTYPE_SPI,
7849 .manufacture_id = GENERIC_MANUF_ID,
7850 .model_id = GENERIC_DEVICE_ID,
7851 .total_size = 0,
7852 .page_size = 256,
7853 .tested = TEST_BAD_PREW,
7854 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007855 .write = NULL,
7856 },
7857 {
7858 .vendor = "Generic",
7859 .name = "unknown SPI chip (REMS)",
7860 .bustype = CHIP_BUSTYPE_SPI,
7861 .manufacture_id = GENERIC_MANUF_ID,
7862 .model_id = GENERIC_DEVICE_ID,
7863 .total_size = 0,
7864 .page_size = 256,
7865 .tested = TEST_BAD_PREW,
7866 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007867 .write = NULL,
7868 },
7869
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007870 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +00007871};