blob: 3ab19bb81603a74867367a1dcc7ac57649a4597e [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 = "Atmel",
1007 .name = "AT25DF021",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001008 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001009 .manufacture_id = ATMEL_ID,
1010 .model_id = AT_25DF021,
1011 .total_size = 256,
1012 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001013 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001014 .tested = TEST_UNTESTED,
1015 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001016 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001017 .block_erasers =
1018 {
1019 {
1020 .eraseblocks = { {4 * 1024, 64} },
1021 .block_erase = spi_block_erase_20,
1022 }, {
1023 .eraseblocks = { {32 * 1024, 8} },
1024 .block_erase = spi_block_erase_52,
1025 }, {
1026 .eraseblocks = { {64 * 1024, 4} },
1027 .block_erase = spi_block_erase_d8,
1028 }, {
1029 .eraseblocks = { {256 * 1024, 1} },
1030 .block_erase = spi_block_erase_60,
1031 }, {
1032 .eraseblocks = { {256 * 1024, 1} },
1033 .block_erase = spi_block_erase_c7,
1034 }
1035 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001036 .printlock = spi_prettyprint_status_register_at25df,
1037 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001038 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001039 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001040 },
1041
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001042 {
1043 .vendor = "Atmel",
1044 .name = "AT25DF041A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001045 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001046 .manufacture_id = ATMEL_ID,
1047 .model_id = AT_25DF041A,
1048 .total_size = 512,
1049 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001050 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001051 .tested = TEST_UNTESTED,
1052 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001053 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001054 .block_erasers =
1055 {
1056 {
1057 .eraseblocks = { {4 * 1024, 128} },
1058 .block_erase = spi_block_erase_20,
1059 }, {
1060 .eraseblocks = { {32 * 1024, 16} },
1061 .block_erase = spi_block_erase_52,
1062 }, {
1063 .eraseblocks = { {64 * 1024, 8} },
1064 .block_erase = spi_block_erase_d8,
1065 }, {
1066 .eraseblocks = { {512 * 1024, 1} },
1067 .block_erase = spi_block_erase_60,
1068 }, {
1069 .eraseblocks = { {512 * 1024, 1} },
1070 .block_erase = spi_block_erase_c7,
1071 }
1072 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001073 .printlock = spi_prettyprint_status_register_at25df,
1074 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001075 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001076 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001077 },
1078
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001079 {
1080 .vendor = "Atmel",
1081 .name = "AT25DF081",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001082 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001083 .manufacture_id = ATMEL_ID,
1084 .model_id = AT_25DF081,
1085 .total_size = 1024,
1086 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001087 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001088 .tested = TEST_UNTESTED,
1089 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001090 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001091 .block_erasers =
1092 {
1093 {
1094 .eraseblocks = { {4 * 1024, 256} },
1095 .block_erase = spi_block_erase_20,
1096 }, {
1097 .eraseblocks = { {32 * 1024, 32} },
1098 .block_erase = spi_block_erase_52,
1099 }, {
1100 .eraseblocks = { {64 * 1024, 16} },
1101 .block_erase = spi_block_erase_d8,
1102 }, {
1103 .eraseblocks = { {1024 * 1024, 1} },
1104 .block_erase = spi_block_erase_60,
1105 }, {
1106 .eraseblocks = { {1024 * 1024, 1} },
1107 .block_erase = spi_block_erase_c7,
1108 }
1109 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001110 .printlock = spi_prettyprint_status_register_at25df,
1111 .unlock = spi_disable_blockprotect_at25df,
1112 .write = spi_chip_write_256,
1113 .read = spi_chip_read,
1114 },
1115
1116 {
1117 .vendor = "Atmel",
1118 .name = "AT25DF081A",
1119 .bustype = CHIP_BUSTYPE_SPI,
1120 .manufacture_id = ATMEL_ID,
1121 .model_id = AT_25DF081A,
1122 .total_size = 1024,
1123 .page_size = 256,
1124 .feature_bits = FEATURE_WRSR_WREN,
1125 .tested = TEST_UNTESTED,
1126 .probe = probe_spi_rdid,
1127 .probe_timing = TIMING_ZERO,
1128 .block_erasers =
1129 {
1130 {
1131 .eraseblocks = { {4 * 1024, 256} },
1132 .block_erase = spi_block_erase_20,
1133 }, {
1134 .eraseblocks = { {32 * 1024, 32} },
1135 .block_erase = spi_block_erase_52,
1136 }, {
1137 .eraseblocks = { {64 * 1024, 16} },
1138 .block_erase = spi_block_erase_d8,
1139 }, {
1140 .eraseblocks = { {1024 * 1024, 1} },
1141 .block_erase = spi_block_erase_60,
1142 }, {
1143 .eraseblocks = { {1024 * 1024, 1} },
1144 .block_erase = spi_block_erase_c7,
1145 }
1146 },
1147 .printlock = spi_prettyprint_status_register_at25df_sec,
1148 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001149 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001150 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001151 },
1152
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001153 {
1154 .vendor = "Atmel",
1155 .name = "AT25DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001156 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001157 .manufacture_id = ATMEL_ID,
1158 .model_id = AT_25DF161,
1159 .total_size = 2048,
1160 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001161 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001162 .tested = TEST_UNTESTED,
1163 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001164 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001165 .block_erasers =
1166 {
1167 {
1168 .eraseblocks = { {4 * 1024, 512} },
1169 .block_erase = spi_block_erase_20,
1170 }, {
1171 .eraseblocks = { {32 * 1024, 64} },
1172 .block_erase = spi_block_erase_52,
1173 }, {
1174 .eraseblocks = { {64 * 1024, 32} },
1175 .block_erase = spi_block_erase_d8,
1176 }, {
1177 .eraseblocks = { {2 * 1024 * 1024, 1} },
1178 .block_erase = spi_block_erase_60,
1179 }, {
1180 .eraseblocks = { {2 * 1024 * 1024, 1} },
1181 .block_erase = spi_block_erase_c7,
1182 }
1183 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001184 .printlock = spi_prettyprint_status_register_at25df_sec,
1185 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001186 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001187 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001188 },
1189
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001190 {
1191 .vendor = "Atmel",
1192 .name = "AT25DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001193 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001194 .manufacture_id = ATMEL_ID,
1195 .model_id = AT_25DF321,
1196 .total_size = 4096,
1197 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001198 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00001199 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001200 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001201 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001202 .block_erasers =
1203 {
1204 {
1205 .eraseblocks = { {4 * 1024, 1024} },
1206 .block_erase = spi_block_erase_20,
1207 }, {
1208 .eraseblocks = { {32 * 1024, 128} },
1209 .block_erase = spi_block_erase_52,
1210 }, {
1211 .eraseblocks = { {64 * 1024, 64} },
1212 .block_erase = spi_block_erase_d8,
1213 }, {
1214 .eraseblocks = { {4 * 1024 * 1024, 1} },
1215 .block_erase = spi_block_erase_60,
1216 }, {
1217 .eraseblocks = { {4 * 1024 * 1024, 1} },
1218 .block_erase = spi_block_erase_c7,
1219 }
1220 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001221 .printlock = spi_prettyprint_status_register_at25df,
1222 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001223 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001224 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001225 },
1226
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001227 {
1228 .vendor = "Atmel",
1229 .name = "AT25DF321A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001230 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001231 .manufacture_id = ATMEL_ID,
1232 .model_id = AT_25DF321A,
1233 .total_size = 4096,
1234 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001235 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001236 .tested = TEST_UNTESTED,
1237 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001238 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001239 .block_erasers =
1240 {
1241 {
1242 .eraseblocks = { {4 * 1024, 1024} },
1243 .block_erase = spi_block_erase_20,
1244 }, {
1245 .eraseblocks = { {32 * 1024, 128} },
1246 .block_erase = spi_block_erase_52,
1247 }, {
1248 .eraseblocks = { {64 * 1024, 64} },
1249 .block_erase = spi_block_erase_d8,
1250 }, {
1251 .eraseblocks = { {4 * 1024 * 1024, 1} },
1252 .block_erase = spi_block_erase_60,
1253 }, {
1254 .eraseblocks = { {4 * 1024 * 1024, 1} },
1255 .block_erase = spi_block_erase_c7,
1256 }
1257 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001258 .printlock = spi_prettyprint_status_register_at25df_sec,
1259 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001260 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001261 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001262 },
1263
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001264 {
1265 .vendor = "Atmel",
1266 .name = "AT25DF641",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001267 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001268 .manufacture_id = ATMEL_ID,
1269 .model_id = AT_25DF641,
1270 .total_size = 8192,
1271 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001272 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001273 .tested = TEST_UNTESTED,
1274 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001275 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001276 .block_erasers =
1277 {
1278 {
1279 .eraseblocks = { {4 * 1024, 2048} },
1280 .block_erase = spi_block_erase_20,
1281 }, {
1282 .eraseblocks = { {32 * 1024, 256} },
1283 .block_erase = spi_block_erase_52,
1284 }, {
1285 .eraseblocks = { {64 * 1024, 128} },
1286 .block_erase = spi_block_erase_d8,
1287 }, {
1288 .eraseblocks = { {8 * 1024 * 1024, 1} },
1289 .block_erase = spi_block_erase_60,
1290 }, {
1291 .eraseblocks = { {8 * 1024 * 1024, 1} },
1292 .block_erase = spi_block_erase_c7,
1293 }
1294 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001295 .printlock = spi_prettyprint_status_register_at25df_sec,
1296 .unlock = spi_disable_blockprotect_at25df_sec,
1297 .write = spi_chip_write_256,
1298 .read = spi_chip_read,
1299 },
1300
1301 {
1302 .vendor = "Atmel",
1303 .name = "AT25DQ161",
1304 .bustype = CHIP_BUSTYPE_SPI,
1305 .manufacture_id = ATMEL_ID,
1306 .model_id = AT_25DQ161,
1307 .total_size = 2048,
1308 .page_size = 256,
1309 .feature_bits = FEATURE_WRSR_WREN,
1310 .tested = TEST_UNTESTED,
1311 .probe = probe_spi_rdid,
1312 .probe_timing = TIMING_ZERO,
1313 .block_erasers =
1314 {
1315 {
1316 .eraseblocks = { {4 * 1024, 512} },
1317 .block_erase = spi_block_erase_20,
1318 }, {
1319 .eraseblocks = { {32 * 1024, 64} },
1320 .block_erase = spi_block_erase_52,
1321 }, {
1322 .eraseblocks = { {64 * 1024, 32} },
1323 .block_erase = spi_block_erase_d8,
1324 }, {
1325 .eraseblocks = { {2 * 1024 * 1024, 1} },
1326 .block_erase = spi_block_erase_60,
1327 }, {
1328 .eraseblocks = { {2 * 1024 * 1024, 1} },
1329 .block_erase = spi_block_erase_c7,
1330 }
1331 },
1332 .printlock = spi_prettyprint_status_register_at25df_sec,
1333 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001334 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001335 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001336 },
1337
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001338 {
1339 .vendor = "Atmel",
1340 .name = "AT25F512B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001341 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001342 .manufacture_id = ATMEL_ID,
1343 .model_id = AT_25F512B,
1344 .total_size = 64,
1345 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001346 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001347 .tested = TEST_UNTESTED,
1348 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001349 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001350 .block_erasers =
1351 {
1352 {
1353 .eraseblocks = { {4 * 1024, 16} },
1354 .block_erase = spi_block_erase_20,
1355 }, {
1356 .eraseblocks = { {32 * 1024, 2} },
1357 .block_erase = spi_block_erase_52,
1358 }, {
1359 .eraseblocks = { {32 * 1024, 2} },
1360 .block_erase = spi_block_erase_d8,
1361 }, {
1362 .eraseblocks = { {64 * 1024, 1} },
1363 .block_erase = spi_block_erase_60,
1364 }, {
1365 .eraseblocks = { {64 * 1024, 1} },
1366 .block_erase = spi_block_erase_c7,
1367 }
1368 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001369 .printlock = spi_prettyprint_status_register_at25f,
1370 .unlock = spi_disable_blockprotect_at25f,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001371 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001372 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001373 },
1374
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001375 {
1376 .vendor = "Atmel",
1377 .name = "AT25FS010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001378 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001379 .manufacture_id = ATMEL_ID,
1380 .model_id = AT_25FS010,
1381 .total_size = 128,
1382 .page_size = 256,
1383 .tested = TEST_UNTESTED,
1384 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001385 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001386 .block_erasers =
1387 {
1388 {
1389 .eraseblocks = { {4 * 1024, 32} },
1390 .block_erase = spi_block_erase_20,
1391 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001392 .eraseblocks = { {4 * 1024, 32} },
1393 .block_erase = spi_block_erase_d7,
1394 }, {
Sean Nelson89187292009-12-23 12:02:55 +00001395 .eraseblocks = { {32 * 1024, 4} },
1396 .block_erase = spi_block_erase_52,
1397 }, {
1398 .eraseblocks = { {32 * 1024, 4} },
1399 .block_erase = spi_block_erase_d8,
1400 }, {
1401 .eraseblocks = { {128 * 1024, 1} },
1402 .block_erase = spi_block_erase_60,
1403 }, {
1404 .eraseblocks = { {128 * 1024, 1} },
1405 .block_erase = spi_block_erase_c7,
1406 }
1407 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001408 .printlock = spi_prettyprint_status_register_at25fs010,
1409 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001410 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001411 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001412 },
1413
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001414 {
1415 .vendor = "Atmel",
1416 .name = "AT25FS040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001417 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001418 .manufacture_id = ATMEL_ID,
1419 .model_id = AT_25FS040,
1420 .total_size = 512,
1421 .page_size = 256,
1422 .tested = TEST_UNTESTED,
1423 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001424 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001425 .block_erasers =
1426 {
1427 {
1428 .eraseblocks = { {4 * 1024, 128} },
1429 .block_erase = spi_block_erase_20,
1430 }, {
1431 .eraseblocks = { {64 * 1024, 8} },
1432 .block_erase = spi_block_erase_52,
1433 }, {
1434 .eraseblocks = { {64 * 1024, 8} },
1435 .block_erase = spi_block_erase_d8,
1436 }, {
1437 .eraseblocks = { {512 * 1024, 1} },
1438 .block_erase = spi_block_erase_60,
1439 }, {
1440 .eraseblocks = { {512 * 1024, 1} },
1441 .block_erase = spi_block_erase_c7,
1442 }
1443 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001444 .printlock = spi_prettyprint_status_register_at25fs040,
1445 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001446 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001447 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001448 },
1449
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001450 {
1451 .vendor = "Atmel",
1452 .name = "AT26DF041",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001453 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001454 .manufacture_id = ATMEL_ID,
1455 .model_id = AT_26DF041,
1456 .total_size = 512,
1457 .page_size = 256,
1458 .tested = TEST_UNTESTED,
1459 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001460 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001461 .block_erasers =
1462 {
1463 {
1464 .eraseblocks = { {4 * 1024, 128} },
1465 .block_erase = spi_block_erase_20,
1466 }
1467 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001468 .write = NULL /* Incompatible Page write */,
1469 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001470 },
1471
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001472 {
1473 .vendor = "Atmel",
1474 .name = "AT26DF081A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001475 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001476 .manufacture_id = ATMEL_ID,
1477 .model_id = AT_26DF081A,
1478 .total_size = 1024,
1479 .page_size = 256,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00001480 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001482 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001483 .block_erasers =
1484 {
1485 {
1486 .eraseblocks = { {4 * 1024, 256} },
1487 .block_erase = spi_block_erase_20,
1488 }, {
1489 .eraseblocks = { {32 * 1024, 32} },
1490 .block_erase = spi_block_erase_52,
1491 }, {
1492 .eraseblocks = { {64 * 1024, 16} },
1493 .block_erase = spi_block_erase_d8,
1494 }, {
1495 .eraseblocks = { {1024 * 1024, 1} },
1496 .block_erase = spi_block_erase_60,
1497 }, {
1498 .eraseblocks = { {1024 * 1024, 1} },
1499 .block_erase = spi_block_erase_c7,
1500 }
1501 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001502 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001503 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001504 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001505 },
1506
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001507 {
1508 .vendor = "Atmel",
1509 .name = "AT26DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001510 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001511 .manufacture_id = ATMEL_ID,
1512 .model_id = AT_26DF161,
1513 .total_size = 2048,
1514 .page_size = 256,
1515 .tested = TEST_UNTESTED,
1516 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001517 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001518 .block_erasers =
1519 {
1520 {
1521 .eraseblocks = { {4 * 1024, 512} },
1522 .block_erase = spi_block_erase_20,
1523 }, {
1524 .eraseblocks = { {32 * 1024, 64} },
1525 .block_erase = spi_block_erase_52,
1526 }, {
1527 .eraseblocks = { {64 * 1024, 32} },
1528 .block_erase = spi_block_erase_d8,
1529 }, {
1530 .eraseblocks = { {2 * 1024 * 1024, 1} },
1531 .block_erase = spi_block_erase_60,
1532 }, {
1533 .eraseblocks = { {2 * 1024 * 1024, 1} },
1534 .block_erase = spi_block_erase_c7,
1535 }
1536 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001537 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001538 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001539 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001540 },
1541
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001542 {
1543 .vendor = "Atmel",
1544 .name = "AT26DF161A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001545 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001546 .manufacture_id = ATMEL_ID,
1547 .model_id = AT_26DF161A,
1548 .total_size = 2048,
1549 .page_size = 256,
1550 .tested = TEST_UNTESTED,
1551 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001552 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001553 .block_erasers =
1554 {
1555 {
1556 .eraseblocks = { {4 * 1024, 512} },
1557 .block_erase = spi_block_erase_20,
1558 }, {
1559 .eraseblocks = { {32 * 1024, 64} },
1560 .block_erase = spi_block_erase_52,
1561 }, {
1562 .eraseblocks = { {64 * 1024, 32} },
1563 .block_erase = spi_block_erase_d8,
1564 }, {
1565 .eraseblocks = { {2 * 1024 * 1024, 1} },
1566 .block_erase = spi_block_erase_60,
1567 }, {
1568 .eraseblocks = { {2 * 1024 * 1024, 1} },
1569 .block_erase = spi_block_erase_c7,
1570 }
1571 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001572 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001573 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001574 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001575 },
1576
1577 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001578 /*{
1579 .vendor = "Atmel",
1580 .name = "AT26DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001581 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001582 .manufacture_id = ATMEL_ID,
1583 .model_id = AT_26DF321,
1584 .total_size = 4096,
1585 .page_size = 256,
1586 .tested = TEST_UNTESTED,
1587 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001588 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001589 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001590 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001591 .read = spi_chip_read,
1592 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00001593
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001594 {
1595 .vendor = "Atmel",
1596 .name = "AT26F004",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001597 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001598 .manufacture_id = ATMEL_ID,
1599 .model_id = AT_26F004,
1600 .total_size = 512,
1601 .page_size = 256,
1602 .tested = TEST_UNTESTED,
1603 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001604 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001605 .block_erasers =
1606 {
1607 {
1608 .eraseblocks = { {4 * 1024, 128} },
1609 .block_erase = spi_block_erase_20,
1610 }, {
1611 .eraseblocks = { {32 * 1024, 16} },
1612 .block_erase = spi_block_erase_52,
1613 }, {
1614 .eraseblocks = { {64 * 1024, 8} },
1615 .block_erase = spi_block_erase_d8,
1616 }, {
1617 .eraseblocks = { {512 * 1024, 1} },
1618 .block_erase = spi_block_erase_60,
1619 }, {
1620 .eraseblocks = { {512 * 1024, 1} },
1621 .block_erase = spi_block_erase_c7,
1622 }
1623 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001624 .write = NULL /* Incompatible Page write */,
1625 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001626 },
1627
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001628 {
1629 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001630 .name = "AT29C512",
Urja Rannikko038a3122009-06-28 19:19:25 +00001631 .bustype = CHIP_BUSTYPE_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001632 .manufacture_id = ATMEL_ID,
1633 .model_id = AT_29C512,
1634 .total_size = 64,
1635 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001636 .feature_bits = FEATURE_LONG_RESET,
1637 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00001638 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001639 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001640 .block_erasers =
1641 {
1642 {
1643 .eraseblocks = { {64 * 1024, 1} },
1644 .block_erase = erase_chip_block_jedec,
1645 }
1646 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001647 .write = write_jedec,
1648 .read = read_memmapped,
1649
1650 },
1651
1652 {
1653 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001654 .name = "AT29C010A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001655 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001656 .manufacture_id = ATMEL_ID,
1657 .model_id = AT_29C010A,
1658 .total_size = 128,
1659 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001660 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00001661 .tested = TEST_OK_PREW,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001662 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001663 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001664 .block_erasers =
1665 {
1666 {
1667 .eraseblocks = { {128 * 1024, 1} },
1668 .block_erase = erase_chip_block_jedec,
1669 }
1670 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001671 .write = write_jedec, /* FIXME */
1672 .read = read_memmapped,
1673 },
1674
1675 {
1676 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001677 .name = "AT29C020",
Urja Rannikko161b8852009-06-05 08:47:37 +00001678 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001679 .manufacture_id = ATMEL_ID,
1680 .model_id = AT_29C020,
1681 .total_size = 256,
1682 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001683 .feature_bits = FEATURE_LONG_RESET,
1684 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001685 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00001686 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00001687 .block_erasers =
1688 {
1689 {
1690 .eraseblocks = { {256 * 1024, 1} },
1691 .block_erase = erase_chip_block_jedec,
1692 }
1693 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001694 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001695 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001696 },
1697
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001698 {
1699 .vendor = "Atmel",
1700 .name = "AT29C040A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001701 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001702 .manufacture_id = ATMEL_ID,
1703 .model_id = AT_29C040A,
1704 .total_size = 512,
1705 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001706 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001707 .tested = TEST_UNTESTED,
1708 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00001709 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00001710 .block_erasers =
1711 {
1712 {
1713 .eraseblocks = { {512 * 1024, 1} },
1714 .block_erase = erase_chip_block_jedec,
1715 }
1716 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001717 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001718 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001719 },
1720
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001721 {
1722 .vendor = "Atmel",
1723 .name = "AT45CS1282",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001724 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001725 .manufacture_id = ATMEL_ID,
1726 .model_id = AT_45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001727 .total_size = 16896 /* No power of two sizes */,
1728 .page_size = 1056 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001729 .tested = TEST_BAD_READ,
1730 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001731 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001732 .write = NULL /* Incompatible Page write */,
1733 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001734 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001735
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001736 {
1737 .vendor = "Atmel",
1738 .name = "AT45DB011D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001739 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001740 .manufacture_id = ATMEL_ID,
1741 .model_id = AT_45DB011D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001742 .total_size = 128 /* Size can only be determined from status register */,
1743 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001744 .tested = TEST_BAD_READ,
1745 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001746 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001747 .write = NULL,
1748 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001749 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001750
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001751 {
1752 .vendor = "Atmel",
1753 .name = "AT45DB021D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001754 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001755 .manufacture_id = ATMEL_ID,
1756 .model_id = AT_45DB021D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001757 .total_size = 256 /* Size can only be determined from status register */,
1758 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001759 .tested = TEST_BAD_READ,
1760 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001761 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001762 .write = NULL,
1763 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001764 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001765
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001766 {
1767 .vendor = "Atmel",
1768 .name = "AT45DB041D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001769 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001770 .manufacture_id = ATMEL_ID,
1771 .model_id = AT_45DB041D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001772 .total_size = 512 /* Size can only be determined from status register */,
1773 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001774 .tested = TEST_BAD_READ,
1775 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001776 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001777 .write = NULL,
1778 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001779 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001780
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001781 {
1782 .vendor = "Atmel",
1783 .name = "AT45DB081D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001784 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001785 .manufacture_id = ATMEL_ID,
1786 .model_id = AT_45DB081D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001787 .total_size = 1024 /* Size can only be determined from status register */,
1788 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001789 .tested = TEST_BAD_READ,
1790 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001791 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001792 .write = NULL,
1793 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001794 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001795
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001796 {
1797 .vendor = "Atmel",
1798 .name = "AT45DB161D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001799 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001800 .manufacture_id = ATMEL_ID,
1801 .model_id = AT_45DB161D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001802 .total_size = 2048 /* Size can only be determined from status register */,
1803 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001804 .tested = TEST_BAD_READ,
1805 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001806 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001807 .write = NULL,
1808 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001809 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001810
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001811 {
1812 .vendor = "Atmel",
1813 .name = "AT45DB321C",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001814 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001815 .manufacture_id = ATMEL_ID,
1816 .model_id = AT_45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001817 .total_size = 4224 /* No power of two sizes */,
1818 .page_size = 528 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001819 .tested = TEST_BAD_READ,
1820 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001821 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001822 .write = NULL,
1823 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001824 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001825
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001826 {
1827 .vendor = "Atmel",
1828 .name = "AT45DB321D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001829 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001830 .manufacture_id = ATMEL_ID,
1831 .model_id = AT_45DB321D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001832 .total_size = 4096 /* Size can only be determined from status register */,
1833 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001834 .tested = TEST_BAD_READ,
1835 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001836 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001837 .write = NULL,
1838 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001839 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001840
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001841 {
1842 .vendor = "Atmel",
1843 .name = "AT45DB642D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001844 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001845 .manufacture_id = ATMEL_ID,
1846 .model_id = AT_45DB642D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001847 .total_size = 8192 /* Size can only be determined from status register */,
1848 .page_size = 1024 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001849 .tested = TEST_BAD_READ,
1850 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001851 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001852 .write = NULL,
1853 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001854 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001855
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001856 {
1857 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001858 .name = "AT49BV512",
Urja Rannikko161b8852009-06-05 08:47:37 +00001859 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001860 .manufacture_id = ATMEL_ID,
1861 .model_id = AT_49BV512,
1862 .total_size = 64,
1863 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00001864 .feature_bits = FEATURE_EITHER_RESET,
1865 .tested = TEST_UNTESTED,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001866 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001867 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001868 .block_erasers =
1869 {
1870 {
1871 .eraseblocks = { {64 * 1024, 1} },
1872 .block_erase = erase_chip_block_jedec,
1873 }
1874 },
Sean Nelson35727f72010-01-28 23:55:12 +00001875 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001876 .read = read_memmapped,
1877 },
1878
1879 {
1880 .vendor = "Atmel",
Andrew Morgan1a5eaa12010-06-07 14:10:55 +00001881 .name = "AT49F020",
1882 .bustype = CHIP_BUSTYPE_PARALLEL,
1883 .manufacture_id = ATMEL_ID,
1884 .model_id = AT_49F020,
1885 .total_size = 256,
1886 .page_size = 256,
1887 .feature_bits = FEATURE_EITHER_RESET,
1888 .tested = TEST_OK_PREW,
1889 .probe = probe_jedec,
1890 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
1891 .block_erasers =
1892 {
1893 {
1894 .eraseblocks = { {256 * 1024, 1} },
1895 .block_erase = erase_chip_block_jedec,
1896 }
1897 },
1898 .write = write_jedec_1,
1899 .read = read_memmapped,
1900 },
1901
1902 {
1903 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001904 .name = "AT49F002(N)",
Urja Rannikko161b8852009-06-05 08:47:37 +00001905 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001906 .manufacture_id = ATMEL_ID,
1907 .model_id = AT_49F002N,
1908 .total_size = 256,
1909 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001910 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001911 .tested = TEST_UNTESTED,
1912 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001913 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001914 .block_erasers =
1915 {
1916 {
1917 .eraseblocks = {
1918 {16 * 1024, 1},
1919 {8 * 1024, 2},
1920 {96 * 1024, 1},
1921 {128 * 1024, 1},
1922 },
1923 .block_erase = erase_sector_jedec,
1924 }, {
1925 .eraseblocks = { {256 * 1024, 1} },
1926 .block_erase = erase_chip_block_jedec,
1927 }
1928 },
Sean Nelson35727f72010-01-28 23:55:12 +00001929 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001930 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001931 },
1932
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001933 {
1934 .vendor = "Atmel",
1935 .name = "AT49F002(N)T",
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_49F002NT,
1939 .total_size = 256,
1940 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001941 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00001942 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001943 .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 {128 * 1024, 1},
1950 {96 * 1024, 1},
1951 {8 * 1024, 2},
1952 {16 * 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
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00001964 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001965 .vendor = "EMST",
1966 .name = "F49B002UA",
Urja Rannikko161b8852009-06-05 08:47:37 +00001967 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001968 .manufacture_id = EMST_ID,
1969 .model_id = EMST_F49B002UA,
1970 .total_size = 256,
1971 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00001972 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001973 .tested = TEST_UNTESTED,
1974 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001975 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +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
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001995 {
Michael Karcher80a59ea2010-06-19 22:06:35 +00001996 .vendor = "EMST",
1997 .name = "F25L008A",
1998 .bustype = CHIP_BUSTYPE_SPI,
1999 .manufacture_id = EMST_ID,
2000 .model_id = EMST_F25L008A,
2001 .total_size = 1024,
2002 .page_size = 256,
2003 .tested = TEST_UNTESTED,
2004 .probe = probe_spi_rdid,
2005 .probe_timing = TIMING_ZERO,
2006 .block_erasers =
2007 {
2008 {
2009 .eraseblocks = { {4 * 1024, 256} },
2010 .block_erase = spi_block_erase_20,
2011 }, {
2012 .eraseblocks = { {64 * 1024, 16} },
2013 .block_erase = spi_block_erase_d8,
2014 }, {
2015 .eraseblocks = { {1024 * 1024, 1} },
2016 .block_erase = spi_block_erase_60,
2017 }, {
2018 .eraseblocks = { {1024 * 1024, 1} },
2019 .block_erase = spi_block_erase_c7,
2020 }
2021 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002022 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00002023 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00002024 .read = spi_chip_read,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002025 },
2026
2027 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002028 .vendor = "Eon",
2029 .name = "EN25B05",
2030 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002031 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002032 .model_id = EN_25B05,
2033 .total_size = 64,
2034 .page_size = 256,
2035 .tested = TEST_UNTESTED,
2036 .probe = probe_spi_rdid,
2037 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002038 .block_erasers =
2039 {
2040 {
2041 .eraseblocks = {
2042 {4 * 1024, 2},
2043 {8 * 1024, 1},
2044 {16 * 1024, 1},
2045 {32 * 1024, 1},
2046 },
2047 .block_erase = spi_block_erase_d8,
2048 }, {
2049 .eraseblocks = { {64 * 1024, 1} },
2050 .block_erase = spi_block_erase_c7,
2051 }
2052 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002053 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002054 .write = spi_chip_write_256,
2055 .read = spi_chip_read,
2056 },
2057
2058 {
2059 .vendor = "Eon",
2060 .name = "EN25B05T",
2061 .bustype = CHIP_BUSTYPE_SPI,
2062 .manufacture_id = EON_ID_NOPREFIX,
2063 .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 {32 * 1024, 1},
2074 {16 * 1024, 1},
2075 {8 * 1024, 1},
2076 {4 * 1024, 2},
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,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002085 .write = spi_chip_write_256,
2086 .read = spi_chip_read,
2087 },
2088
2089 {
2090 .vendor = "Eon",
2091 .name = "EN25B10",
2092 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002093 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002094 .model_id = EN_25B10,
2095 .total_size = 128,
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 {4 * 1024, 2},
2105 {8 * 1024, 1},
2106 {16 * 1024, 1},
2107 {32 * 1024, 3},
2108 },
2109 .block_erase = spi_block_erase_d8,
2110 }, {
2111 .eraseblocks = { {128 * 1024, 1} },
2112 .block_erase = spi_block_erase_c7,
2113 }
2114 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002115 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002116 .write = spi_chip_write_256,
2117 .read = spi_chip_read,
2118 },
2119
2120 {
2121 .vendor = "Eon",
2122 .name = "EN25B10T",
2123 .bustype = CHIP_BUSTYPE_SPI,
2124 .manufacture_id = EON_ID_NOPREFIX,
2125 .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 {32 * 1024, 3},
2136 {16 * 1024, 1},
2137 {8 * 1024, 1},
2138 {4 * 1024, 2},
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,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002147 .write = spi_chip_write_256,
2148 .read = spi_chip_read,
2149 },
2150
2151 {
2152 .vendor = "Eon",
2153 .name = "EN25B20",
2154 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002155 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002156 .model_id = EN_25B20,
2157 .total_size = 256,
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 {4 * 1024, 2},
2167 {8 * 1024, 1},
2168 {16 * 1024, 1},
2169 {32 * 1024, 1},
2170 {64 * 1024, 3}
2171 },
2172 .block_erase = spi_block_erase_d8,
2173 }, {
2174 .eraseblocks = { {256 * 1024, 1} },
2175 .block_erase = spi_block_erase_c7,
2176 }
2177 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002178 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002179 .write = spi_chip_write_256,
2180 .read = spi_chip_read,
2181 },
2182
2183 {
2184 .vendor = "Eon",
2185 .name = "EN25B20T",
2186 .bustype = CHIP_BUSTYPE_SPI,
2187 .manufacture_id = EON_ID_NOPREFIX,
2188 .model_id = EN_25B20,
2189 .total_size = 256,
2190 .page_size = 256,
2191 .tested = TEST_UNTESTED,
2192 .probe = probe_spi_rdid,
2193 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002194 .block_erasers =
2195 {
2196 {
2197 .eraseblocks = {
2198 {64 * 1024, 3},
2199 {32 * 1024, 1},
2200 {16 * 1024, 1},
2201 {8 * 1024, 1},
2202 {4 * 1024, 2},
2203 },
2204 .block_erase = spi_block_erase_d8,
2205 }, {
2206 .eraseblocks = { {256 * 1024, 1} },
2207 .block_erase = spi_block_erase_c7,
2208 }
2209 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002210 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002211 .write = spi_chip_write_256,
2212 .read = spi_chip_read,
2213 },
2214
2215 {
2216 .vendor = "Eon",
2217 .name = "EN25B40",
2218 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002219 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002220 .model_id = EN_25B40,
2221 .total_size = 512,
2222 .page_size = 256,
2223 .tested = TEST_UNTESTED,
2224 .probe = probe_spi_rdid,
2225 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002226 .block_erasers =
2227 {
2228 {
2229 .eraseblocks = {
2230 {4 * 1024, 2},
2231 {8 * 1024, 1},
2232 {16 * 1024, 1},
2233 {32 * 1024, 1},
2234 {64 * 1024, 7}
2235 },
2236 .block_erase = spi_block_erase_d8,
2237 }, {
2238 .eraseblocks = { {512 * 1024, 1} },
2239 .block_erase = spi_block_erase_c7,
2240 }
2241 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002242 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002243 .write = spi_chip_write_256,
2244 .read = spi_chip_read,
2245 },
2246
2247 {
2248 .vendor = "Eon",
2249 .name = "EN25B40T",
2250 .bustype = CHIP_BUSTYPE_SPI,
2251 .manufacture_id = EON_ID_NOPREFIX,
2252 .model_id = EN_25B40,
2253 .total_size = 512,
2254 .page_size = 256,
2255 .tested = TEST_UNTESTED,
2256 .probe = probe_spi_rdid,
2257 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002258 .block_erasers =
2259 {
2260 {
2261 .eraseblocks = {
2262 {64 * 1024, 7},
2263 {32 * 1024, 1},
2264 {16 * 1024, 1},
2265 {8 * 1024, 1},
2266 {4 * 1024, 2},
2267 },
2268 .block_erase = spi_block_erase_d8,
2269 }, {
2270 .eraseblocks = { {512 * 1024, 1} },
2271 .block_erase = spi_block_erase_c7,
2272 }
2273 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002274 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002275 .write = spi_chip_write_256,
2276 .read = spi_chip_read,
2277 },
2278
2279 {
2280 .vendor = "Eon",
2281 .name = "EN25B80",
2282 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002283 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002284 .model_id = EN_25B80,
2285 .total_size = 1024,
2286 .page_size = 256,
2287 .tested = TEST_UNTESTED,
2288 .probe = probe_spi_rdid,
2289 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002290 .block_erasers =
2291 {
2292 {
2293 .eraseblocks = {
2294 {4 * 1024, 2},
2295 {8 * 1024, 1},
2296 {16 * 1024, 1},
2297 {32 * 1024, 1},
2298 {64 * 1024, 15}
2299 },
2300 .block_erase = spi_block_erase_d8,
2301 }, {
2302 .eraseblocks = { {1024 * 1024, 1} },
2303 .block_erase = spi_block_erase_c7,
2304 }
2305 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002306 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002307 .write = spi_chip_write_256,
2308 .read = spi_chip_read,
2309 },
2310
2311 {
2312 .vendor = "Eon",
2313 .name = "EN25B80T",
2314 .bustype = CHIP_BUSTYPE_SPI,
2315 .manufacture_id = EON_ID_NOPREFIX,
2316 .model_id = EN_25B80,
2317 .total_size = 1024,
2318 .page_size = 256,
2319 .tested = TEST_UNTESTED,
2320 .probe = probe_spi_rdid,
2321 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002322 .block_erasers =
2323 {
2324 {
2325 .eraseblocks = {
2326 {64 * 1024, 15},
2327 {32 * 1024, 1},
2328 {16 * 1024, 1},
2329 {8 * 1024, 1},
2330 {4 * 1024, 2},
2331 },
2332 .block_erase = spi_block_erase_d8,
2333 }, {
2334 .eraseblocks = { {1024 * 1024, 1} },
2335 .block_erase = spi_block_erase_c7,
2336 }
2337 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002338 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002339 .write = spi_chip_write_256,
2340 .read = spi_chip_read,
2341 },
2342
2343 {
2344 .vendor = "Eon",
2345 .name = "EN25B16",
2346 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002347 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002348 .model_id = EN_25B16,
2349 .total_size = 2048,
2350 .page_size = 256,
2351 .tested = TEST_UNTESTED,
2352 .probe = probe_spi_rdid,
2353 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002354 .block_erasers =
2355 {
2356 {
2357 .eraseblocks = {
2358 {4 * 1024, 2},
2359 {8 * 1024, 1},
2360 {16 * 1024, 1},
2361 {32 * 1024, 1},
2362 {64 * 1024, 31},
2363 },
2364 .block_erase = spi_block_erase_d8,
2365 }, {
2366 .eraseblocks = { {2 * 1024 * 1024, 1} },
2367 .block_erase = spi_block_erase_c7,
2368 }
2369 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002370 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002371 .write = spi_chip_write_256,
2372 .read = spi_chip_read,
2373 },
2374
2375 {
2376 .vendor = "Eon",
2377 .name = "EN25B16T",
2378 .bustype = CHIP_BUSTYPE_SPI,
2379 .manufacture_id = EON_ID_NOPREFIX,
2380 .model_id = EN_25B16,
2381 .total_size = 2048,
2382 .page_size = 256,
2383 .tested = TEST_UNTESTED,
2384 .probe = probe_spi_rdid,
2385 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002386 .block_erasers =
2387 {
2388 {
2389 .eraseblocks = {
2390 {64 * 1024, 31},
2391 {32 * 1024, 1},
2392 {16 * 1024, 1},
2393 {8 * 1024, 1},
2394 {4 * 1024, 2},
2395 },
2396 .block_erase = spi_block_erase_d8,
2397 }, {
2398 .eraseblocks = { {2 * 1024 * 1024, 1} },
2399 .block_erase = spi_block_erase_c7,
2400 }
2401 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002402 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002403 .write = spi_chip_write_256,
2404 .read = spi_chip_read,
2405 },
2406
2407 {
2408 .vendor = "Eon",
2409 .name = "EN25B32",
2410 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002411 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002412 .model_id = EN_25B32,
2413 .total_size = 4096,
2414 .page_size = 256,
2415 .tested = TEST_UNTESTED,
2416 .probe = probe_spi_rdid,
2417 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002418 .block_erasers =
2419 {
2420 {
2421 .eraseblocks = {
2422 {4 * 1024, 2},
2423 {8 * 1024, 1},
2424 {16 * 1024, 1},
2425 {32 * 1024, 1},
2426 {64 * 1024, 63},
2427 },
2428 .block_erase = spi_block_erase_d8,
2429 }, {
2430 .eraseblocks = { {4 * 1024 * 1024, 1} },
2431 .block_erase = spi_block_erase_c7,
2432 }
2433 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002434 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002435 .write = spi_chip_write_256,
2436 .read = spi_chip_read,
2437 },
2438
2439 {
2440 .vendor = "Eon",
2441 .name = "EN25B32T",
2442 .bustype = CHIP_BUSTYPE_SPI,
2443 .manufacture_id = EON_ID_NOPREFIX,
2444 .model_id = EN_25B32,
2445 .total_size = 4096,
2446 .page_size = 256,
2447 .tested = TEST_UNTESTED,
2448 .probe = probe_spi_rdid,
2449 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002450 .block_erasers =
2451 {
2452 {
2453 .eraseblocks = {
2454 {64 * 1024, 63},
2455 {32 * 1024, 1},
2456 {16 * 1024, 1},
2457 {8 * 1024, 1},
2458 {4 * 1024, 2},
2459 },
2460 .block_erase = spi_block_erase_d8,
2461 }, {
2462 .eraseblocks = { {4 * 1024 * 1024, 1} },
2463 .block_erase = spi_block_erase_c7,
2464 }
2465 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002466 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002467 .write = spi_chip_write_256,
2468 .read = spi_chip_read,
2469 },
2470
2471 {
2472 .vendor = "Eon",
2473 .name = "EN25B64",
2474 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002475 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002476 .model_id = EN_25B64,
2477 .total_size = 8192,
2478 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002479 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002480 .tested = TEST_UNTESTED,
2481 .probe = probe_spi_rdid,
2482 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002483 .block_erasers =
2484 {
2485 {
2486 .eraseblocks = {
2487 {4 * 1024, 2},
2488 {8 * 1024, 1},
2489 {16 * 1024, 1},
2490 {32 * 1024, 1},
2491 {64 * 1024, 127},
2492 },
2493 .block_erase = spi_block_erase_d8,
2494 }, {
2495 .eraseblocks = { {8 * 1024 * 1024, 1} },
2496 .block_erase = spi_block_erase_c7,
2497 }
2498 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002499 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002500 .write = spi_chip_write_256,
2501 .read = spi_chip_read,
2502 },
2503
2504 {
2505 .vendor = "Eon",
2506 .name = "EN25B64T",
2507 .bustype = CHIP_BUSTYPE_SPI,
2508 .manufacture_id = EON_ID_NOPREFIX,
2509 .model_id = EN_25B64,
2510 .total_size = 8192,
2511 .page_size = 256,
2512 .tested = TEST_UNTESTED,
2513 .probe = probe_spi_rdid,
2514 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002515 .block_erasers =
2516 {
2517 {
2518 .eraseblocks = {
2519 {64 * 1024, 127},
2520 {32 * 1024, 1},
2521 {16 * 1024, 1},
2522 {8 * 1024, 1},
2523 {4 * 1024, 2},
2524 },
2525 .block_erase = spi_block_erase_d8,
2526 }, {
2527 .eraseblocks = { {8 * 1024 * 1024, 1} },
2528 .block_erase = spi_block_erase_c7,
2529 }
2530 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002531 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002532 .write = spi_chip_write_256,
2533 .read = spi_chip_read,
2534 },
2535
2536 {
2537 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002538 .name = "EN25D16",
2539 .bustype = CHIP_BUSTYPE_SPI,
2540 .manufacture_id = EON_ID_NOPREFIX,
2541 .model_id = EN_25D16,
2542 .total_size = 2048,
2543 .page_size = 256,
2544 .tested = TEST_UNTESTED,
2545 .probe = probe_spi_rdid,
2546 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002547 .block_erasers =
2548 {
2549 {
2550 .eraseblocks = { {4 * 1024, 512} },
2551 .block_erase = spi_block_erase_20,
2552 }, {
2553 .eraseblocks = { {64 * 1024, 32} },
2554 .block_erase = spi_block_erase_d8,
2555 }, {
2556 .eraseblocks = { {64 * 1024, 32} },
2557 .block_erase = spi_block_erase_52,
2558 }, {
2559 .eraseblocks = { {2 * 1024 * 1024, 1} },
2560 .block_erase = spi_block_erase_60,
2561 }, {
2562 .eraseblocks = { {2 * 1024 * 1024, 1} },
2563 .block_erase = spi_block_erase_c7,
2564 }
2565 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002566 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002567 .write = spi_chip_write_256,
2568 .read = spi_chip_read,
2569 },
2570
2571 {
2572 .vendor = "Eon",
2573 .name = "EN25F05",
2574 .bustype = CHIP_BUSTYPE_SPI,
2575 .manufacture_id = EON_ID_NOPREFIX,
2576 .model_id = EN_25F05,
2577 .total_size = 64,
2578 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002579 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002580 .tested = TEST_UNTESTED,
2581 .probe = probe_spi_rdid,
2582 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002583 .block_erasers =
2584 {
2585 {
2586 .eraseblocks = { {4 * 1024, 16} },
2587 .block_erase = spi_block_erase_20,
2588 }, {
2589 .eraseblocks = { {32 * 1024, 2} },
2590 .block_erase = spi_block_erase_d8,
2591 }, {
2592 .eraseblocks = { {32 * 1024, 2} },
2593 .block_erase = spi_block_erase_52,
2594 }, {
2595 .eraseblocks = { {64 * 1024, 1} },
2596 .block_erase = spi_block_erase_60,
2597 }, {
2598 .eraseblocks = { {64 * 1024, 1} },
2599 .block_erase = spi_block_erase_c7,
2600 }
2601 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002602 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002603 .write = spi_chip_write_256,
2604 .read = spi_chip_read,
2605 },
2606
2607 {
2608 .vendor = "Eon",
2609 .name = "EN25F10",
2610 .bustype = CHIP_BUSTYPE_SPI,
2611 .manufacture_id = EON_ID_NOPREFIX,
2612 .model_id = EN_25F10,
2613 .total_size = 128,
2614 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002615 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002616 .tested = TEST_UNTESTED,
2617 .probe = probe_spi_rdid,
2618 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002619 .block_erasers =
2620 {
2621 {
2622 .eraseblocks = { {4 * 1024, 32} },
2623 .block_erase = spi_block_erase_20,
2624 }, {
2625 .eraseblocks = { {32 * 1024, 4} },
2626 .block_erase = spi_block_erase_d8,
2627 }, {
2628 .eraseblocks = { {32 * 1024, 4} },
2629 .block_erase = spi_block_erase_52,
2630 }, {
2631 .eraseblocks = { {128 * 1024, 1} },
2632 .block_erase = spi_block_erase_60,
2633 }, {
2634 .eraseblocks = { {128 * 1024, 1} },
2635 .block_erase = spi_block_erase_c7,
2636 }
2637 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002638 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002639 .write = spi_chip_write_256,
2640 .read = spi_chip_read,
2641 },
2642
2643 {
2644 .vendor = "Eon",
2645 .name = "EN25F20",
2646 .bustype = CHIP_BUSTYPE_SPI,
2647 .manufacture_id = EON_ID_NOPREFIX,
2648 .model_id = EN_25F20,
2649 .total_size = 256,
2650 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002652 .tested = TEST_UNTESTED,
2653 .probe = probe_spi_rdid,
2654 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002655 .block_erasers =
2656 {
2657 {
2658 .eraseblocks = { {4 * 1024, 64} },
2659 .block_erase = spi_block_erase_20,
2660 }, {
2661 .eraseblocks = { {64 * 1024, 4} },
2662 .block_erase = spi_block_erase_d8,
2663 }, {
2664 .eraseblocks = { {64 * 1024, 4} },
2665 .block_erase = spi_block_erase_52,
2666 }, {
2667 .eraseblocks = { {256 * 1024, 1} },
2668 .block_erase = spi_block_erase_60,
2669 }, {
2670 .eraseblocks = { {256 * 1024, 1} },
2671 .block_erase = spi_block_erase_c7,
2672 }
2673 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002674 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002675 .write = spi_chip_write_256,
2676 .read = spi_chip_read,
2677 },
2678
2679 {
2680 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002681 .name = "EN25F40",
2682 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002683 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002684 .model_id = EN_25F40,
2685 .total_size = 512,
2686 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002687 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00002688 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002689 .probe = probe_spi_rdid,
2690 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002691 .block_erasers =
2692 {
2693 {
Sean Nelson54596372010-01-09 05:30:14 +00002694 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002695 .block_erase = spi_block_erase_20,
2696 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002697 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002698 .block_erase = spi_block_erase_d8,
2699 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002700 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002701 .block_erase = spi_block_erase_60,
2702 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002703 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002704 .block_erase = spi_block_erase_c7,
2705 },
2706 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002707 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002708 .write = spi_chip_write_256,
2709 .read = spi_chip_read,
2710 },
2711
2712 {
2713 .vendor = "Eon",
2714 .name = "EN25F80",
2715 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002716 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002717 .model_id = EN_25F80,
2718 .total_size = 1024,
2719 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002720 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002721 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002722 .probe = probe_spi_rdid,
2723 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002724 .block_erasers =
2725 {
2726 {
2727 .eraseblocks = { {4 * 1024, 256} },
2728 .block_erase = spi_block_erase_20,
2729 }, {
2730 .eraseblocks = { {64 * 1024, 16} },
2731 .block_erase = spi_block_erase_d8,
2732 }, {
2733 .eraseblocks = { {1024 * 1024, 1} },
2734 .block_erase = spi_block_erase_60,
2735 }, {
2736 .eraseblocks = { {1024 * 1024, 1} },
2737 .block_erase = spi_block_erase_c7,
2738 }
2739 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002740 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002741 .write = spi_chip_write_256,
2742 .read = spi_chip_read,
2743 },
2744
2745 {
2746 .vendor = "Eon",
2747 .name = "EN25F16",
2748 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002749 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002750 .model_id = EN_25F16,
2751 .total_size = 2048,
2752 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002753 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002754 .tested = TEST_UNTESTED,
2755 .probe = probe_spi_rdid,
2756 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002757 .block_erasers =
2758 {
2759 {
2760 .eraseblocks = { {4 * 1024, 512} },
2761 .block_erase = spi_block_erase_20,
2762 }, {
2763 .eraseblocks = { {64 * 1024, 32} },
2764 .block_erase = spi_block_erase_d8,
2765 }, {
2766 .eraseblocks = { {2 * 1024 * 1024, 1} },
2767 .block_erase = spi_block_erase_60,
2768 }, {
2769 .eraseblocks = { {2 * 1024 * 1024, 1} },
2770 .block_erase = spi_block_erase_c7,
2771 }
2772 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002773 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002774 .write = spi_chip_write_256,
2775 .read = spi_chip_read,
2776 },
2777
2778 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002779 .vendor = "Eon",
2780 .name = "EN25F32",
2781 .bustype = CHIP_BUSTYPE_SPI,
2782 .manufacture_id = EON_ID_NOPREFIX,
2783 .model_id = EN_25F32,
2784 .total_size = 4096,
2785 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00002786 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002787 .tested = TEST_UNTESTED,
2788 .probe = probe_spi_rdid,
2789 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002790 .block_erasers =
2791 {
2792 {
2793 .eraseblocks = { {4 * 1024, 1024} },
2794 .block_erase = spi_block_erase_20,
2795 }, {
2796 .eraseblocks = { {64 * 1024, 64} },
2797 .block_erase = spi_block_erase_d8,
2798 }, {
2799 .eraseblocks = { {4 * 1024 * 1024, 1} },
2800 .block_erase = spi_block_erase_60,
2801 }, {
2802 .eraseblocks = { {4 * 1024 * 1024, 1} },
2803 .block_erase = spi_block_erase_c7,
2804 }
2805 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002806 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002807 .write = spi_chip_write_256,
2808 .read = spi_chip_read,
2809 },
2810
2811 {
Russ Dill3cd5a122010-03-05 08:44:11 +00002812 .vendor = "Eon",
2813 .name = "EN29F010",
2814 .bustype = CHIP_BUSTYPE_PARALLEL,
2815 .manufacture_id = EON_ID,
2816 .model_id = EN_29F010,
2817 .total_size = 128,
2818 .page_size = 128,
2819 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
2820 .tested = TEST_OK_PREW,
2821 .probe = probe_jedec,
2822 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2823 .block_erasers =
2824 {
2825 {
2826 .eraseblocks = { {16 * 1024, 8} },
2827 .block_erase = erase_sector_jedec,
2828 },
2829 {
2830 .eraseblocks = { {128 * 1024, 1} },
2831 .block_erase = erase_chip_block_jedec,
2832 },
2833 },
2834 .write = write_jedec_1,
2835 .read = read_memmapped,
2836 },
2837
2838 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002839 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002840 .name = "EN29F002(A)(N)B",
Urja Rannikko161b8852009-06-05 08:47:37 +00002841 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002842 .manufacture_id = EON_ID,
2843 .model_id = EN_29F002B,
2844 .total_size = 256,
2845 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002846 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00002847 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002848 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002849 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002850 .block_erasers =
2851 {
2852 {
2853 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00002854 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002855 {8 * 1024, 2},
2856 {32 * 1024, 1},
2857 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00002858 },
2859 .block_erase = erase_sector_jedec,
2860 }, {
2861 .eraseblocks = { {256 * 1024, 1} },
2862 .block_erase = erase_chip_block_jedec,
2863 },
2864 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00002865 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002866 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002867 },
2868
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002869 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002870 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002871 .name = "EN29F002(A)(N)T",
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_29F002T,
2875 .total_size = 256,
2876 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002877 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +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 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002886 {32 * 1024, 1},
2887 {8 * 1024, 2},
2888 {16 * 1024, 1},
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 {
2901 .vendor = "Fujitsu",
2902 .name = "MBM29F004BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002903 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002904 .manufacture_id = FUJITSU_ID,
2905 .model_id = MBM29F004BC,
2906 .total_size = 512,
2907 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002908 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002909 .tested = TEST_UNTESTED,
2910 .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 = {
2916 {16 * 1024, 1},
2917 {8 * 1024, 2},
2918 {32 * 1024, 1},
2919 {64 * 1024, 7},
2920 },
Sean Nelson35727f72010-01-28 23:55:12 +00002921 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002922 }, {
2923 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00002924 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002925 },
2926 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002927 .write = NULL,
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 = "MBM29F004TC",
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 = MBM29F004TC,
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 {64 * 1024, 7},
2948 {32 * 1024, 1},
2949 {8 * 1024, 2},
2950 {16 * 1024, 1},
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 {
Sean Nelson35727f72010-01-28 23:55:12 +00002963 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002964 .vendor = "Fujitsu",
2965 .name = "MBM29F400BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002966 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002967 .manufacture_id = FUJITSU_ID,
2968 .model_id = MBM29F400BC,
2969 .total_size = 512,
2970 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002971 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00002972 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002973 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002974 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002975 .block_erasers =
2976 {
2977 {
2978 .eraseblocks = {
2979 {16 * 1024, 1},
2980 {8 * 1024, 2},
2981 {32 * 1024, 1},
2982 {64 * 1024, 7},
2983 },
2984 .block_erase = block_erase_m29f400bt,
2985 }, {
2986 .eraseblocks = { {512 * 1024, 1} },
2987 .block_erase = block_erase_chip_m29f400bt,
2988 },
2989 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00002990 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002991 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002992 },
2993
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002994 {
2995 .vendor = "Fujitsu",
2996 .name = "MBM29F400TC",
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 = MBM29F400TC,
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,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003003 .tested = TEST_UNTESTED,
3004 .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 {64 * 1024, 7},
3011 {32 * 1024, 1},
3012 {8 * 1024, 2},
3013 {16 * 1024, 1},
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 = write_m29f400bt,
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 {
David Borgc96a8bd2010-06-21 16:12:22 +00003026 .vendor = "Hyundai",
3027 .name = "HY29F002T",
3028 .bustype = CHIP_BUSTYPE_PARALLEL,
3029 .manufacture_id = HYUNDAI_ID,
3030 .model_id = HY_29F002T,
3031 .total_size = 256,
3032 .page_size = 256 * 1024,
3033 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3034 .tested = TEST_OK_PREW,
3035 .probe = probe_jedec,
3036 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3037 .block_erasers =
3038 {
3039 {
3040 .eraseblocks = {
3041 {64 * 1024, 3},
3042 {32 * 1024, 1},
3043 {8 * 1024, 2},
3044 {16 * 1024, 1},
3045 },
3046 .block_erase = erase_sector_jedec,
3047 }, {
3048 .eraseblocks = { {256 * 1024, 1} },
3049 .block_erase = erase_chip_block_jedec,
3050 },
3051 },
3052 .write = write_jedec_1,
3053 .read = read_memmapped,
3054 },
3055
3056 {
3057 .vendor = "Hyundai",
3058 .name = "HY29F002B",
3059 .bustype = CHIP_BUSTYPE_PARALLEL,
3060 .manufacture_id = HYUNDAI_ID,
3061 .model_id = HY_29F002B,
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_UNTESTED,
3066 .probe = probe_jedec,
3067 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3068 .block_erasers =
3069 {
3070 {
3071 .eraseblocks = {
3072 {16 * 1024, 1},
3073 {8 * 1024, 2},
3074 {32 * 1024, 1},
3075 {64 * 1024, 3},
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 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003088 .vendor = "Intel",
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003089 .name = "28F001BX-B",
Urja Rannikko161b8852009-06-05 08:47:37 +00003090 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003091 .manufacture_id = INTEL_ID,
3092 .model_id = P28F001BXB,
3093 .total_size = 128,
3094 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003095 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003096 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003097 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003098 .block_erasers =
3099 {
3100 {
3101 .eraseblocks = {
3102 {8 * 1024, 1},
3103 {4 * 1024, 2},
3104 {112 * 1024, 1},
3105 },
Sean Nelson28accc22010-03-19 18:47:06 +00003106 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003107 },
3108 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003109 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003110 .read = read_memmapped,
3111 },
3112
3113 {
3114 .vendor = "Intel",
3115 .name = "28F001BX-T",
Urja Rannikko161b8852009-06-05 08:47:37 +00003116 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003117 .manufacture_id = INTEL_ID,
3118 .model_id = P28F001BXT,
3119 .total_size = 128,
3120 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003121 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003122 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003123 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003124 .block_erasers =
3125 {
3126 {
3127 .eraseblocks = {
3128 {112 * 1024, 1},
3129 {4 * 1024, 2},
3130 {8 * 1024, 1},
3131 },
Sean Nelson28accc22010-03-19 18:47:06 +00003132 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003133 },
3134 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003135 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003136 .read = read_memmapped,
3137 },
3138
3139 {
3140 .vendor = "Intel",
Joshua Roysd97c0e02010-07-22 15:20:43 +00003141 .name = "28F002BC-T",
3142 .bustype = CHIP_BUSTYPE_PARALLEL,
3143 .manufacture_id = INTEL_ID,
3144 .model_id = P28F002BC,
3145 .total_size = 256,
3146 .page_size = 256 * 1024,
3147 .tested = TEST_UNTESTED,
3148 .probe = probe_82802ab,
3149 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3150 .block_erasers =
3151 {
3152 {
3153 .eraseblocks = {
3154 {128 * 1024, 1},
3155 {96 * 1024, 1},
3156 {8 * 1024, 2},
3157 {16 * 1024, 1},
3158 },
3159 .block_erase = erase_block_82802ab,
3160 },
3161 },
3162 .write = write_82802ab,
3163 .read = read_memmapped,
3164 },
3165
3166 {
3167 .vendor = "Intel",
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003168 .name = "28F004S5",
3169 .bustype = CHIP_BUSTYPE_PARALLEL,
3170 .manufacture_id = INTEL_ID,
3171 .model_id = E_28F004S5,
3172 .total_size = 512,
3173 .page_size = 256,
3174 .tested = TEST_UNTESTED,
3175 .probe = probe_82802ab,
3176 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003177 .block_erasers =
3178 {
3179 {
3180 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003181 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003182 },
3183 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003184 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003185 .write = write_82802ab,
3186 .read = read_memmapped,
3187 },
3188
3189 {
3190 .vendor = "Intel",
Michael Karcherad0010a2010-04-03 10:27:08 +00003191 .name = "28F004BV/BE-B",
3192 .bustype = CHIP_BUSTYPE_PARALLEL,
3193 .manufacture_id = INTEL_ID,
3194 .model_id = P28F004BB,
3195 .total_size = 512,
3196 .page_size = 128 * 1024, /* maximal block size */
3197 .tested = TEST_UNTESTED,
3198 .probe = probe_82802ab,
3199 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3200 .block_erasers =
3201 {
3202 {
3203 .eraseblocks = {
3204 {16 * 1024, 1},
3205 {8 * 1024, 2},
3206 {96 * 1024, 1},
3207 {128 * 1024, 3},
3208 },
3209 .block_erase = erase_block_82802ab,
3210 },
3211 },
3212 .write = write_82802ab,
3213 .read = read_memmapped,
3214 },
3215
3216 {
3217 .vendor = "Intel",
3218 .name = "28F004BV/BE-T",
3219 .bustype = CHIP_BUSTYPE_PARALLEL,
3220 .manufacture_id = INTEL_ID,
3221 .model_id = P28F004BT,
3222 .total_size = 512,
3223 .page_size = 128 * 1024, /* maximal block size */
3224 .tested = TEST_UNTESTED,
3225 .probe = probe_82802ab,
3226 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3227 .block_erasers =
3228 {
3229 {
3230 .eraseblocks = {
3231 {128 * 1024, 3},
3232 {96 * 1024, 1},
3233 {8 * 1024, 2},
3234 {16 * 1024, 1},
3235 },
3236 .block_erase = erase_block_82802ab,
3237 },
3238 },
3239 .write = write_82802ab,
3240 .read = read_memmapped,
3241 },
3242
3243 {
3244 .vendor = "Intel",
3245 .name = "28F400BV/CV/CE-B",
3246 .bustype = CHIP_BUSTYPE_PARALLEL,
3247 .manufacture_id = INTEL_ID,
3248 .model_id = P28F400BB,
3249 .total_size = 512,
3250 .page_size = 128 * 1024, /* maximal block size */
3251 .feature_bits = FEATURE_ADDR_SHIFTED,
3252 .tested = TEST_UNTESTED,
3253 .probe = probe_82802ab,
3254 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3255 .block_erasers =
3256 {
3257 {
3258 .eraseblocks = {
3259 {16 * 1024, 1},
3260 {8 * 1024, 2},
3261 {96 * 1024, 1},
3262 {128 * 1024, 3},
3263 },
3264 .block_erase = erase_block_82802ab,
3265 },
3266 },
3267 .write = write_82802ab,
3268 .read = read_memmapped,
3269 },
3270
3271 {
3272 .vendor = "Intel",
3273 .name = "28F400BV/CV/CE-T",
3274 .bustype = CHIP_BUSTYPE_PARALLEL,
3275 .manufacture_id = INTEL_ID,
3276 .model_id = P28F400BT,
3277 .total_size = 512,
3278 .page_size = 128 * 1024, /* maximal block size */
3279 .feature_bits = FEATURE_ADDR_SHIFTED,
3280 .tested = TEST_UNTESTED,
3281 .probe = probe_82802ab,
3282 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3283 .block_erasers =
3284 {
3285 {
3286 .eraseblocks = {
3287 {128 * 1024, 3},
3288 {96 * 1024, 1},
3289 {8 * 1024, 2},
3290 {16 * 1024, 1},
3291 },
3292 .block_erase = erase_block_82802ab,
3293 },
3294 },
3295 .write = write_82802ab,
3296 .read = read_memmapped,
3297 },
3298
3299 {
3300 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003301 .name = "82802AB",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003302 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003303 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003304 .model_id = I_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003305 .total_size = 512,
3306 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003307 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003308 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003309 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003310 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003311 .block_erasers =
3312 {
3313 {
3314 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003315 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003316 },
3317 },
Sean Nelson28accc22010-03-19 18:47:06 +00003318 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003319 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003320 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003321 },
3322
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003323 {
3324 .vendor = "Intel",
3325 .name = "82802AC",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003326 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003327 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003328 .model_id = I_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003329 .total_size = 1024,
3330 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003331 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003332 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003333 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003334 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003335 .block_erasers =
3336 {
3337 {
3338 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00003339 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003340 },
3341 },
Sean Nelson28accc22010-03-19 18:47:06 +00003342 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003343 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003344 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003345 },
3346
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003347 {
3348 .vendor = "Macronix",
3349 .name = "MX25L512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003350 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003351 .manufacture_id = MX_ID,
3352 .model_id = MX_25L512,
3353 .total_size = 64,
3354 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003355 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003356 .tested = TEST_UNTESTED,
3357 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003358 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003359 .block_erasers =
3360 {
3361 {
3362 .eraseblocks = { {4 * 1024, 16} },
3363 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003364 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003365 .eraseblocks = { {64 * 1024, 1} },
3366 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003367 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003368 .eraseblocks = { {64 * 1024, 1} },
3369 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003370 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003371 .eraseblocks = { {64 * 1024, 1} },
3372 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003373 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003374 .eraseblocks = { {64 * 1024, 1} },
3375 .block_erase = spi_block_erase_c7,
3376 },
3377 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003378 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003379 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003380 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003381 },
3382
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003383 {
3384 .vendor = "Macronix",
3385 .name = "MX25L1005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003386 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003387 .manufacture_id = MX_ID,
3388 .model_id = MX_25L1005,
3389 .total_size = 128,
3390 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003391 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003392 .tested = TEST_UNTESTED,
3393 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003394 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003395 .block_erasers =
3396 {
3397 {
3398 .eraseblocks = { {4 * 1024, 32} },
3399 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003400 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003401 .eraseblocks = { {64 * 1024, 2} },
3402 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003403 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003404 .eraseblocks = { {128 * 1024, 1} },
3405 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003406 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003407 .eraseblocks = { {128 * 1024, 1} },
3408 .block_erase = spi_block_erase_c7,
3409 },
3410 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003411 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003412 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003413 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003414 },
3415
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003416 {
3417 .vendor = "Macronix",
3418 .name = "MX25L2005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003419 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003420 .manufacture_id = MX_ID,
3421 .model_id = MX_25L2005,
3422 .total_size = 256,
3423 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003424 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003425 .tested = TEST_UNTESTED,
3426 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003427 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003428 .block_erasers =
3429 {
3430 {
3431 .eraseblocks = { {4 * 1024, 64} },
3432 .block_erase = spi_block_erase_20,
3433 }, {
3434 .eraseblocks = { {64 * 1024, 4} },
3435 .block_erase = spi_block_erase_52,
3436 }, {
3437 .eraseblocks = { {64 * 1024, 4} },
3438 .block_erase = spi_block_erase_d8,
3439 }, {
3440 .eraseblocks = { {256 * 1024, 1} },
3441 .block_erase = spi_block_erase_60,
3442 }, {
3443 .eraseblocks = { {256 * 1024, 1} },
3444 .block_erase = spi_block_erase_c7,
3445 },
3446 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003447 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003448 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003449 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003450 },
3451
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003452 {
3453 .vendor = "Macronix",
3454 .name = "MX25L4005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003455 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003456 .manufacture_id = MX_ID,
3457 .model_id = MX_25L4005,
3458 .total_size = 512,
3459 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003460 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003461 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003462 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003463 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003464 .block_erasers =
3465 {
3466 {
3467 .eraseblocks = { {4 * 1024, 128} },
3468 .block_erase = spi_block_erase_20,
3469 }, {
3470 .eraseblocks = { {64 * 1024, 8} },
3471 .block_erase = spi_block_erase_52,
3472 }, {
3473 .eraseblocks = { {64 * 1024, 8} },
3474 .block_erase = spi_block_erase_d8,
3475 }, {
3476 .eraseblocks = { {512 * 1024, 1} },
3477 .block_erase = spi_block_erase_60,
3478 }, {
3479 .eraseblocks = { {512 * 1024, 1} },
3480 .block_erase = spi_block_erase_c7,
3481 },
3482 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003483 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003484 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003485 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003486 },
3487
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003488 {
3489 .vendor = "Macronix",
3490 .name = "MX25L8005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003491 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003492 .manufacture_id = MX_ID,
3493 .model_id = MX_25L8005,
3494 .total_size = 1024,
3495 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003496 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00003497 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003498 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003499 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003500 .block_erasers =
3501 {
3502 {
3503 .eraseblocks = { {4 * 1024, 256} },
3504 .block_erase = spi_block_erase_20,
3505 }, {
3506 .eraseblocks = { {64 * 1024, 16} },
3507 .block_erase = spi_block_erase_52,
3508 }, {
3509 .eraseblocks = { {64 * 1024, 16} },
3510 .block_erase = spi_block_erase_d8,
3511 }, {
3512 .eraseblocks = { {1024 * 1024, 1} },
3513 .block_erase = spi_block_erase_60,
3514 }, {
3515 .eraseblocks = { {1024 * 1024, 1} },
3516 .block_erase = spi_block_erase_c7,
3517 },
3518 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003519 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003520 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003521 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003522 },
3523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003524 {
3525 .vendor = "Macronix",
3526 .name = "MX25L1605",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003527 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003528 .manufacture_id = MX_ID,
3529 .model_id = MX_25L1605,
3530 .total_size = 2048,
3531 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003532 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003533 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003534 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003535 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003536 .block_erasers =
3537 {
3538 {
3539 .eraseblocks = { {4 * 1024, 512} },
3540 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
3541 }, {
3542 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
3543 .block_erase = spi_block_erase_52,
3544 }, {
3545 .eraseblocks = { {64 * 1024, 32} },
3546 .block_erase = spi_block_erase_d8,
3547 }, {
3548 .eraseblocks = { {2 * 1024 * 1024, 1} },
3549 .block_erase = spi_block_erase_60,
3550 }, {
3551 .eraseblocks = { {2 * 1024 * 1024, 1} },
3552 .block_erase = spi_block_erase_c7,
3553 },
3554 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003555 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003556 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003557 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003558 },
3559
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003560 {
3561 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003562 .name = "MX25L1635D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003563 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003564 .manufacture_id = MX_ID,
3565 .model_id = MX_25L1635D,
3566 .total_size = 2048,
3567 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003568 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003569 .tested = TEST_UNTESTED,
3570 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003571 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003572 .block_erasers =
3573 {
3574 {
3575 .eraseblocks = { {4 * 1024, 512} },
3576 .block_erase = spi_block_erase_20,
3577 }, {
3578 .eraseblocks = { {64 * 1024, 32} },
3579 .block_erase = spi_block_erase_d8,
3580 }, {
3581 .eraseblocks = { {2 * 1024 * 1024, 1} },
3582 .block_erase = spi_block_erase_60,
3583 }, {
3584 .eraseblocks = { {2 * 1024 * 1024, 1} },
3585 .block_erase = spi_block_erase_c7,
3586 }
3587 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003588 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003589 .write = spi_chip_write_256,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003590 .read = spi_chip_read,
3591 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00003592
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003593 {
3594 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00003595 .name = "MX25L1635E",
3596 .bustype = CHIP_BUSTYPE_SPI,
3597 .manufacture_id = MX_ID,
3598 .model_id = MX_25L1635E,
3599 .total_size = 2048,
3600 .page_size = 256,
3601 .feature_bits = FEATURE_WRSR_WREN,
3602 .tested = TEST_UNTESTED,
3603 .probe = probe_spi_rdid,
3604 .probe_timing = TIMING_ZERO,
3605 .block_erasers =
3606 {
3607 {
3608 .eraseblocks = { {4 * 1024, 512} },
3609 .block_erase = spi_block_erase_20,
3610 }, {
3611 .eraseblocks = { {64 * 1024, 32} },
3612 .block_erase = spi_block_erase_d8,
3613 }, {
3614 .eraseblocks = { {2 * 1024 * 1024, 1} },
3615 .block_erase = spi_block_erase_60,
3616 }, {
3617 .eraseblocks = { {2 * 1024 * 1024, 1} },
3618 .block_erase = spi_block_erase_c7,
3619 }
3620 },
3621 .unlock = spi_disable_blockprotect,
3622 .write = spi_chip_write_256,
3623 .read = spi_chip_read,
3624 },
3625
3626 {
3627 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003628 .name = "MX25L3205",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003629 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003630 .manufacture_id = MX_ID,
3631 .model_id = MX_25L3205,
3632 .total_size = 4096,
3633 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003634 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003635 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003636 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003637 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003638 .block_erasers =
3639 {
3640 {
3641 .eraseblocks = { {4 * 1024, 1024} },
3642 .block_erase = spi_block_erase_20,
3643 }, {
3644 .eraseblocks = { {4 * 1024, 1024} },
3645 .block_erase = spi_block_erase_d8,
3646 }, {
3647 .eraseblocks = { {4 * 1024 * 1024, 1} },
3648 .block_erase = spi_block_erase_60,
3649 }, {
3650 .eraseblocks = { {4 * 1024 * 1024, 1} },
3651 .block_erase = spi_block_erase_c7,
3652 },
3653 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003654 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003655 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003656 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003657 },
3658
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003659 {
3660 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003661 .name = "MX25L3235D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003662 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003663 .manufacture_id = MX_ID,
3664 .model_id = MX_25L3235D,
3665 .total_size = 4096,
3666 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003667 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003668 .tested = TEST_UNTESTED,
3669 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003670 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003671 .block_erasers =
3672 {
3673 {
3674 .eraseblocks = { {4 * 1024, 1024} },
3675 .block_erase = spi_block_erase_20,
3676 }, {
3677 .eraseblocks = { {64 * 1024, 64} },
3678 .block_erase = spi_block_erase_d8,
3679 }, {
3680 .eraseblocks = { {4 * 1024 * 1024, 1} },
3681 .block_erase = spi_block_erase_60,
3682 }, {
3683 .eraseblocks = { {4 * 1024 * 1024, 1} },
3684 .block_erase = spi_block_erase_c7,
3685 }
3686 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003687 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003688 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003689 .read = spi_chip_read,
3690 },
3691
3692 {
3693 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003694 .name = "MX25L6405",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003695 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003696 .manufacture_id = MX_ID,
3697 .model_id = MX_25L6405,
3698 .total_size = 8192,
3699 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003700 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger452b3e32009-06-22 11:14:43 +00003701 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003702 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003703 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003704 .block_erasers =
3705 {
3706 {
3707 .eraseblocks = { {64 * 1024, 128} },
3708 .block_erase = spi_block_erase_20,
3709 }, {
3710 .eraseblocks = { {64 * 1024, 128} },
3711 .block_erase = spi_block_erase_d8,
3712 }, {
3713 .eraseblocks = { {8 * 1024 * 1024, 1} },
3714 .block_erase = spi_block_erase_60,
3715 }, {
3716 .eraseblocks = { {8 * 1024 * 1024, 1} },
3717 .block_erase = spi_block_erase_c7,
3718 }
3719 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003720 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003721 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003722 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003723 },
3724
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003725 {
3726 .vendor = "Macronix",
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003727 .name = "MX25L12805",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003728 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003729 .manufacture_id = MX_ID,
3730 .model_id = MX_25L12805,
3731 .total_size = 16384,
3732 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00003733 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003734 .tested = TEST_UNTESTED,
3735 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003736 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003737 .block_erasers =
3738 {
3739 {
3740 .eraseblocks = { {4 * 1024, 4096} },
3741 .block_erase = spi_block_erase_20,
3742 }, {
3743 .eraseblocks = { {64 * 1024, 256} },
3744 .block_erase = spi_block_erase_d8,
3745 }, {
3746 .eraseblocks = { {16 * 1024 * 1024, 1} },
3747 .block_erase = spi_block_erase_60,
3748 }, {
3749 .eraseblocks = { {16 * 1024 * 1024, 1} },
3750 .block_erase = spi_block_erase_c7,
3751 }
3752 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003753 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003754 .write = spi_chip_write_256,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003755 .read = spi_chip_read,
3756 },
3757
3758 {
3759 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00003760 .name = "MX29F001B",
3761 .bustype = CHIP_BUSTYPE_PARALLEL,
3762 .manufacture_id = MX_ID,
3763 .model_id = MX_29F001B,
3764 .total_size = 128,
3765 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003766 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3767 .tested = TEST_UNTESTED,
3768 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003769 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003770 .block_erasers =
3771 {
3772 {
3773 .eraseblocks = {
3774 {8 * 1024, 1},
3775 {4 * 1024, 2},
3776 {8 * 1024, 2},
3777 {32 * 1024, 1},
3778 {64 * 1024, 1},
3779 },
Sean Nelson35727f72010-01-28 23:55:12 +00003780 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003781 }, {
3782 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003783 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003784 }
3785 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003786 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003787 .read = read_memmapped,
3788 },
3789
3790 {
3791 .vendor = "Macronix",
3792 .name = "MX29F001T",
3793 .bustype = CHIP_BUSTYPE_PARALLEL,
3794 .manufacture_id = MX_ID,
3795 .model_id = MX_29F001T,
3796 .total_size = 128,
3797 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003798 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3799 .tested = TEST_UNTESTED,
3800 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003801 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003802 .block_erasers =
3803 {
3804 {
3805 .eraseblocks = {
3806 {64 * 1024, 1},
3807 {32 * 1024, 1},
3808 {8 * 1024, 2},
3809 {4 * 1024, 2},
3810 {8 * 1024, 1},
3811 },
Sean Nelson35727f72010-01-28 23:55:12 +00003812 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003813 }, {
3814 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003815 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003816 }
3817 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003818 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003819 .read = read_memmapped,
3820 },
3821
3822 {
3823 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003824 .name = "MX29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00003825 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003826 .manufacture_id = MX_ID,
3827 .model_id = MX_29F002B,
3828 .total_size = 256,
3829 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003830 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003831 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00003832 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003833 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003834 .block_erasers =
3835 {
3836 {
3837 .eraseblocks = {
3838 {16 * 1024, 1},
3839 {8 * 1024, 2},
3840 {32 * 1024, 1},
3841 {64 * 1024, 3},
3842 },
Sean Nelson35727f72010-01-28 23:55:12 +00003843 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003844 }, {
3845 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003846 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003847 },
3848 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003849 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003850 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003851 },
3852
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003853 {
3854 .vendor = "Macronix",
3855 .name = "MX29F002T",
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_29F002T,
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,
Uwe Hermann60939692010-03-17 00:05:59 +00003862 .tested = TEST_OK_PRW,
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 {64 * 1024, 3},
3870 {32 * 1024, 1},
3871 {8 * 1024, 2},
3872 {16 * 1024, 1},
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",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003886 .name = "MX29LV040",
Urja Rannikko038a3122009-06-28 19:19:25 +00003887 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003888 .manufacture_id = MX_ID,
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003889 .model_id = MX_29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003890 .total_size = 512,
3891 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003892 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3893 .tested = TEST_UNTESTED,
3894 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003895 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003896 .block_erasers =
3897 {
3898 {
3899 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00003900 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003901 }, {
3902 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003903 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003904 },
3905 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003906 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003907 .read = read_memmapped,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00003908 },
3909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003910 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00003911 .vendor = "MoselVitelic",
3912 .name = "V29C51000B",
3913 .bustype = CHIP_BUSTYPE_PARALLEL,
3914 .manufacture_id = SYNCMOS_MVC_ID,
3915 .model_id = MVC_V29C51000B,
3916 .total_size = 64,
3917 .page_size = 512,
3918 .feature_bits = FEATURE_EITHER_RESET,
3919 .tested = TEST_UNTESTED,
3920 .probe = probe_jedec,
3921 .probe_timing = TIMING_ZERO,
3922 .block_erasers =
3923 {
3924 {
3925 .eraseblocks = { {512, 128} },
3926 .block_erase = erase_sector_jedec,
3927 }, {
3928 .eraseblocks = { {64 * 1024, 1} },
3929 .block_erase = erase_chip_block_jedec,
3930 },
3931 },
3932 .write = write_jedec_1,
3933 .read = read_memmapped,
3934 },
3935
3936 {
3937 .vendor = "MoselVitelic",
3938 .name = "V29C51000T",
3939 .bustype = CHIP_BUSTYPE_PARALLEL,
3940 .manufacture_id = SYNCMOS_MVC_ID,
3941 .model_id = MVC_V29C51000T,
3942 .total_size = 64,
3943 .page_size = 512,
3944 .feature_bits = FEATURE_EITHER_RESET,
3945 .tested = TEST_UNTESTED,
3946 .probe = probe_jedec,
3947 .probe_timing = TIMING_ZERO,
3948 .block_erasers =
3949 {
3950 {
3951 .eraseblocks = { {512, 128} },
3952 .block_erase = erase_sector_jedec,
3953 }, {
3954 .eraseblocks = { {64 * 1024, 1} },
3955 .block_erase = erase_chip_block_jedec,
3956 },
3957 },
3958 .write = write_jedec_1,
3959 .read = read_memmapped,
3960 },
3961
3962 {
3963 .vendor = "MoselVitelic",
3964 .name = "V29C51400B",
3965 .bustype = CHIP_BUSTYPE_PARALLEL,
3966 .manufacture_id = SYNCMOS_MVC_ID,
3967 .model_id = MVC_V29C51400B,
3968 .total_size = 512,
3969 .page_size = 1024,
3970 .feature_bits = FEATURE_EITHER_RESET,
3971 .tested = TEST_UNTESTED,
3972 .probe = probe_jedec,
3973 .probe_timing = TIMING_ZERO,
3974 .block_erasers =
3975 {
3976 {
3977 .eraseblocks = { {1024, 512} },
3978 .block_erase = erase_sector_jedec,
3979 }, {
3980 .eraseblocks = { {512 * 1024, 1} },
3981 .block_erase = erase_chip_block_jedec,
3982 },
3983 },
3984 .write = write_jedec_1,
3985 .read = read_memmapped,
3986 },
3987
3988 {
3989 .vendor = "MoselVitelic",
3990 .name = "V29C51400T",
3991 .bustype = CHIP_BUSTYPE_PARALLEL,
3992 .manufacture_id = SYNCMOS_MVC_ID,
3993 .model_id = MVC_V29C51400T,
3994 .total_size = 512,
3995 .page_size = 1024,
3996 .feature_bits = FEATURE_EITHER_RESET,
3997 .tested = TEST_UNTESTED,
3998 .probe = probe_jedec,
3999 .probe_timing = TIMING_ZERO,
4000 .block_erasers =
4001 {
4002 {
4003 .eraseblocks = { {1024, 512} },
4004 .block_erase = erase_sector_jedec,
4005 }, {
4006 .eraseblocks = { {512 * 1024, 1} },
4007 .block_erase = erase_chip_block_jedec,
4008 },
4009 },
4010 .write = write_jedec_1,
4011 .read = read_memmapped,
4012 },
4013
4014 {
4015 .vendor = "MoselVitelic",
4016 .name = "V29LC51000",
4017 .bustype = CHIP_BUSTYPE_PARALLEL,
4018 .manufacture_id = SYNCMOS_MVC_ID,
4019 .model_id = MVC_V29LC51000,
4020 .total_size = 64,
4021 .page_size = 512,
4022 .feature_bits = FEATURE_EITHER_RESET,
4023 .tested = TEST_UNTESTED,
4024 .probe = probe_jedec,
4025 .probe_timing = TIMING_ZERO,
4026 .block_erasers =
4027 {
4028 {
4029 .eraseblocks = { {512, 128} },
4030 .block_erase = erase_sector_jedec,
4031 }, {
4032 .eraseblocks = { {64 * 1024, 1} },
4033 .block_erase = erase_chip_block_jedec,
4034 },
4035 },
4036 .write = write_jedec_1,
4037 .read = read_memmapped,
4038 },
4039
4040 {
4041 .vendor = "MoselVitelic",
4042 .name = "V29LC51001",
4043 .bustype = CHIP_BUSTYPE_PARALLEL,
4044 .manufacture_id = SYNCMOS_MVC_ID,
4045 .model_id = MVC_V29LC51001,
4046 .total_size = 128,
4047 .page_size = 512,
4048 .feature_bits = FEATURE_EITHER_RESET,
4049 .tested = TEST_UNTESTED,
4050 .probe = probe_jedec,
4051 .probe_timing = TIMING_ZERO,
4052 .block_erasers =
4053 {
4054 {
4055 .eraseblocks = { {512, 256} },
4056 .block_erase = erase_sector_jedec,
4057 }, {
4058 .eraseblocks = { {128 * 1024, 1} },
4059 .block_erase = erase_chip_block_jedec,
4060 },
4061 },
4062 .write = write_jedec_1,
4063 .read = read_memmapped,
4064 },
4065
4066 {
4067 .vendor = "MoselVitelic",
4068 .name = "V29LC51002",
4069 .bustype = CHIP_BUSTYPE_PARALLEL,
4070 .manufacture_id = SYNCMOS_MVC_ID,
4071 .model_id = MVC_V29LC51002,
4072 .total_size = 256,
4073 .page_size = 512,
4074 .feature_bits = FEATURE_EITHER_RESET,
4075 .tested = TEST_UNTESTED,
4076 .probe = probe_jedec,
4077 .probe_timing = TIMING_ZERO,
4078 .block_erasers =
4079 {
4080 {
4081 .eraseblocks = { {512, 512} },
4082 .block_erase = erase_sector_jedec,
4083 }, {
4084 .eraseblocks = { {256 * 1024, 1} },
4085 .block_erase = erase_chip_block_jedec,
4086 },
4087 },
4088 .write = write_jedec_1,
4089 .read = read_memmapped,
4090 },
4091
4092 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004093 .vendor = "Numonyx",
4094 .name = "M25PE10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004095 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004096 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004097 .model_id = ST_M25PE10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004098 .total_size = 128,
4099 .page_size = 256,
4100 .tested = TEST_UNTESTED,
4101 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004102 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004103 .block_erasers =
4104 {
4105 {
4106 .eraseblocks = { {4 * 1024, 32} },
4107 .block_erase = spi_block_erase_20,
4108 }, {
4109 .eraseblocks = { {64 * 1024, 2} },
4110 .block_erase = spi_block_erase_d8,
4111 }, {
4112 .eraseblocks = { {128 * 1024, 1} },
4113 .block_erase = spi_block_erase_c7,
4114 }
4115 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004116 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004117 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004118 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004119 },
4120
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004121 {
4122 .vendor = "Numonyx",
4123 .name = "M25PE20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004124 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004125 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004126 .model_id = ST_M25PE20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004127 .total_size = 256,
4128 .page_size = 256,
4129 .tested = TEST_UNTESTED,
4130 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004131 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004132 .block_erasers =
4133 {
4134 {
4135 .eraseblocks = { {4 * 1024, 64} },
4136 .block_erase = spi_block_erase_20,
4137 }, {
4138 .eraseblocks = { {64 * 1024, 4} },
4139 .block_erase = spi_block_erase_d8,
4140 }, {
4141 .eraseblocks = { {256 * 1024, 1} },
4142 .block_erase = spi_block_erase_c7,
4143 }
4144 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004145 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004146 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004147 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004148 },
4149
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004150 {
4151 .vendor = "Numonyx",
4152 .name = "M25PE40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004153 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004154 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004155 .model_id = ST_M25PE40,
Sean Nelson5643c072010-01-19 03:23:07 +00004156 .total_size = 512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004157 .page_size = 256,
4158 .tested = TEST_UNTESTED,
4159 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004160 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004161 .block_erasers =
4162 {
4163 {
4164 .eraseblocks = { {4 * 1024, 128} },
4165 .block_erase = spi_block_erase_20,
4166 }, {
4167 .eraseblocks = { {64 * 1024, 8} },
4168 .block_erase = spi_block_erase_d8,
4169 }, {
4170 .eraseblocks = { {512 * 1024, 1} },
4171 .block_erase = spi_block_erase_c7,
4172 }
4173 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004174 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004175 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004176 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004177 },
4178
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004179 {
4180 .vendor = "Numonyx",
4181 .name = "M25PE80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004182 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004183 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004184 .model_id = ST_M25PE80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004185 .total_size = 1024,
4186 .page_size = 256,
4187 .tested = TEST_OK_PREW,
4188 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004189 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004190 .block_erasers =
4191 {
4192 {
4193 .eraseblocks = { {4 * 1024, 256} },
4194 .block_erase = spi_block_erase_20,
4195 }, {
4196 .eraseblocks = { {64 * 1024, 16} },
4197 .block_erase = spi_block_erase_d8,
4198 }, {
4199 .eraseblocks = { {1024 * 1024, 1} },
4200 .block_erase = spi_block_erase_c7,
4201 }
4202 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004203 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004204 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004205 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004206 },
4207
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004208 {
4209 .vendor = "Numonyx",
4210 .name = "M25PE16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004211 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004212 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004213 .model_id = ST_M25PE16,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004214 .total_size = 2048,
4215 .page_size = 256,
4216 .tested = TEST_UNTESTED,
4217 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004218 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004219 .block_erasers =
4220 {
4221 {
4222 .eraseblocks = { {4 * 1024, 512} },
4223 .block_erase = spi_block_erase_20,
4224 }, {
4225 .eraseblocks = { {64 * 1024, 32} },
4226 .block_erase = spi_block_erase_d8,
4227 }, {
4228 .eraseblocks = { {2 * 1024 * 1024, 1} },
4229 .block_erase = spi_block_erase_c7,
4230 }
4231 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004232 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004233 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004234 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004235 },
4236
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004237 {
4238 .vendor = "PMC",
4239 .name = "Pm25LV010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004240 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004241 .manufacture_id = PMC_ID,
4242 .model_id = PMC_25LV010,
4243 .total_size = 128,
4244 .page_size = 256,
4245 .tested = TEST_UNTESTED,
4246 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004247 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004248 .block_erasers =
4249 {
4250 {
4251 .eraseblocks = { {4 * 1024, 32} },
4252 .block_erase = spi_block_erase_d7,
4253 }, {
4254 .eraseblocks = { {32 * 1024, 4} },
4255 .block_erase = spi_block_erase_d8,
4256 }, {
4257 .eraseblocks = { {128 * 1024, 1} },
4258 .block_erase = spi_block_erase_c7,
4259 }
4260 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004261 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004262 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004263 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004264 },
4265
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004266 {
4267 .vendor = "PMC",
4268 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004269 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004270 .manufacture_id = PMC_ID,
4271 .model_id = PMC_25LV016B,
4272 .total_size = 2048,
4273 .page_size = 256,
4274 .tested = TEST_UNTESTED,
4275 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004276 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004277 .block_erasers =
4278 {
4279 {
4280 .eraseblocks = { {4 * 1024, 512} },
4281 .block_erase = spi_block_erase_d7,
4282 }, {
4283 .eraseblocks = { {4 * 1024, 512} },
4284 .block_erase = spi_block_erase_20,
4285 }, {
4286 .eraseblocks = { {64 * 1024, 32} },
4287 .block_erase = spi_block_erase_d8,
4288 }, {
4289 .eraseblocks = { {2 * 1024 * 1024, 1} },
4290 .block_erase = spi_block_erase_60,
4291 }, {
4292 .eraseblocks = { {2 * 1024 * 1024, 1} },
4293 .block_erase = spi_block_erase_c7,
4294 }
4295 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004296 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004297 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004298 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004299 },
4300
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004301 {
4302 .vendor = "PMC",
4303 .name = "Pm25LV020",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004304 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004305 .manufacture_id = PMC_ID,
4306 .model_id = PMC_25LV020,
4307 .total_size = 256,
4308 .page_size = 256,
4309 .tested = TEST_UNTESTED,
4310 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004311 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004312 .block_erasers =
4313 {
4314 {
4315 .eraseblocks = { {4 * 1024, 64} },
4316 .block_erase = spi_block_erase_d7,
4317 }, {
4318 .eraseblocks = { {64 * 1024, 4} },
4319 .block_erase = spi_block_erase_d8,
4320 }, {
4321 .eraseblocks = { {256 * 1024, 1} },
4322 .block_erase = spi_block_erase_c7,
4323 }
4324 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004325 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004326 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004327 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004328 },
4329
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004330 {
4331 .vendor = "PMC",
4332 .name = "Pm25LV040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004333 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004334 .manufacture_id = PMC_ID,
4335 .model_id = PMC_25LV040,
4336 .total_size = 512,
4337 .page_size = 256,
4338 .tested = TEST_UNTESTED,
4339 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004340 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004341 .block_erasers =
4342 {
4343 {
4344 .eraseblocks = { {4 * 1024, 128} },
4345 .block_erase = spi_block_erase_d7,
4346 }, {
4347 .eraseblocks = { {64 * 1024, 8} },
4348 .block_erase = spi_block_erase_d8,
4349 }, {
4350 .eraseblocks = { {512 * 1024, 1} },
4351 .block_erase = spi_block_erase_c7,
4352 }
4353 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004354 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004355 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004356 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004357 },
4358
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004359 {
4360 .vendor = "PMC",
4361 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004362 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004363 .manufacture_id = PMC_ID,
4364 .model_id = PMC_25LV080B,
4365 .total_size = 1024,
4366 .page_size = 256,
4367 .tested = TEST_UNTESTED,
4368 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004369 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004370 .block_erasers =
4371 {
4372 {
4373 .eraseblocks = { {4 * 1024, 256} },
4374 .block_erase = spi_block_erase_d7,
4375 }, {
4376 .eraseblocks = { {4 * 1024, 256} },
4377 .block_erase = spi_block_erase_20,
4378 }, {
4379 .eraseblocks = { {64 * 1024, 16} },
4380 .block_erase = spi_block_erase_d8,
4381 }, {
4382 .eraseblocks = { {1024 * 1024, 1} },
4383 .block_erase = spi_block_erase_60,
4384 }, {
4385 .eraseblocks = { {1024 * 1024, 1} },
4386 .block_erase = spi_block_erase_c7,
4387 }
4388 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004389 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004390 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004391 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004392 },
4393
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004394 {
4395 .vendor = "PMC",
4396 .name = "Pm25LV512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004397 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004398 .manufacture_id = PMC_ID,
4399 .model_id = PMC_25LV512,
4400 .total_size = 64,
4401 .page_size = 256,
4402 .tested = TEST_UNTESTED,
4403 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004404 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004405 .block_erasers =
4406 {
4407 {
4408 .eraseblocks = { {4 * 1024, 16} },
4409 .block_erase = spi_block_erase_d7,
4410 }, {
4411 .eraseblocks = { {32 * 1024, 2} },
4412 .block_erase = spi_block_erase_d8,
4413 }, {
4414 .eraseblocks = { {64 * 1024, 1} },
4415 .block_erase = spi_block_erase_c7,
4416 }
4417 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004418 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004419 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004420 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004421 },
4422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004423 {
4424 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004425 .name = "Pm29F002T",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004426 .bustype = CHIP_BUSTYPE_PARALLEL,
4427 .manufacture_id = PMC_ID_NOPREFIX,
4428 .model_id = PMC_29F002T,
4429 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00004430 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004431 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00004432 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00004433 .probe = probe_jedec,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004434 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00004435 .block_erasers =
4436 {
4437 {
4438 .eraseblocks = {
4439 {128 * 1024, 1},
4440 {96 * 1024, 1},
4441 {8 * 1024, 2},
4442 {16 * 1024, 1},
4443 },
Sean Nelson35727f72010-01-28 23:55:12 +00004444 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004445 }, {
4446 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004447 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004448 },
4449 },
Sean Nelson35727f72010-01-28 23:55:12 +00004450 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004451 .read = read_memmapped,
4452 },
4453
4454 {
4455 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004456 .name = "Pm29F002B",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004457 .bustype = CHIP_BUSTYPE_PARALLEL,
4458 .manufacture_id = PMC_ID_NOPREFIX,
4459 .model_id = PMC_29F002B,
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 Hermannf983d9f2009-06-14 21:53:26 +00004463 .tested = TEST_UNTESTED,
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 {16 * 1024, 1},
4471 {8 * 1024, 2},
4472 {96 * 1024, 1},
4473 {128 * 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",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004487 .name = "Pm39LV010",
Urja Rannikko038a3122009-06-28 19:19:25 +00004488 .bustype = CHIP_BUSTYPE_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004489 .manufacture_id = PMC_ID_NOPREFIX,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004490 .model_id = PMC_39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004491 .total_size = 128,
4492 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004493 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00004494 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004495 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004496 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00004497 .block_erasers =
4498 {
4499 {
4500 .eraseblocks = { {4 * 1024, 32} },
4501 .block_erase = erase_sector_jedec,
4502 }, {
4503 .eraseblocks = { {64 * 1024, 2} },
4504 .block_erase = erase_block_jedec,
4505 }, {
4506 .eraseblocks = { {128 * 1024, 1} },
4507 .block_erase = erase_chip_block_jedec,
4508 }
4509 },
Sean Nelson35727f72010-01-28 23:55:12 +00004510 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004511 .read = read_memmapped,
4512 },
4513
4514 {
4515 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004516 .name = "Pm39LV020",
4517 .bustype = CHIP_BUSTYPE_PARALLEL,
4518 .manufacture_id = PMC_ID_NOPREFIX,
4519 .model_id = PMC_39LV020,
4520 .total_size = 256,
4521 .page_size = 4096,
4522 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4523 .tested = TEST_UNTESTED,
4524 .probe = probe_jedec,
4525 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4526 .block_erasers =
4527 {
4528 {
4529 .eraseblocks = { {4 * 1024, 64} },
4530 .block_erase = erase_sector_jedec,
4531 }, {
4532 .eraseblocks = { {64 * 1024, 4} },
4533 .block_erase = erase_block_jedec,
4534 }, {
4535 .eraseblocks = { {256 * 1024, 1} },
4536 .block_erase = erase_chip_block_jedec,
4537 }
4538 },
4539 .write = write_jedec_1,
4540 .read = read_memmapped,
4541 },
4542
4543 {
4544 .vendor = "PMC",
4545 .name = "Pm39LV040",
4546 .bustype = CHIP_BUSTYPE_PARALLEL,
4547 .manufacture_id = PMC_ID_NOPREFIX,
4548 .model_id = PMC_39LV040,
4549 .total_size = 512,
4550 .page_size = 4096,
4551 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4552 .tested = TEST_UNTESTED,
4553 .probe = probe_jedec,
4554 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4555 .block_erasers =
4556 {
4557 {
4558 .eraseblocks = { {4 * 1024, 128} },
4559 .block_erase = erase_sector_jedec,
4560 }, {
4561 .eraseblocks = { {64 * 1024, 8} },
4562 .block_erase = erase_block_jedec,
4563 }, {
4564 .eraseblocks = { {512 * 1024, 1} },
4565 .block_erase = erase_chip_block_jedec,
4566 }
4567 },
4568 .write = write_jedec_1,
4569 .read = read_memmapped,
4570 },
4571
4572 {
4573 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004574 .name = "Pm49FL002",
Uwe Hermann431f4f72010-09-05 12:41:25 +00004575 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004576 .manufacture_id = PMC_ID_NOPREFIX,
4577 .model_id = PMC_49FL002,
4578 .total_size = 256,
4579 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004580 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Russ Dill8c7c4682010-03-09 16:53:06 +00004581 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004582 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004583 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004584 .block_erasers =
4585 {
4586 {
4587 .eraseblocks = { {4 * 1024, 64} },
4588 .block_erase = erase_sector_jedec,
4589 }, {
4590 .eraseblocks = { {16 * 1024, 16} },
4591 .block_erase = erase_block_jedec,
4592 }, {
4593 .eraseblocks = { {256 * 1024, 1} },
4594 .block_erase = erase_chip_block_jedec,
4595 }
4596 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004597 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004598 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004599 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004600 },
4601
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004602 {
4603 .vendor = "PMC",
4604 .name = "Pm49FL004",
Uwe Hermann431f4f72010-09-05 12:41:25 +00004605 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004606 .manufacture_id = PMC_ID_NOPREFIX,
4607 .model_id = PMC_49FL004,
4608 .total_size = 512,
4609 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004610 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00004611 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004612 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004613 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004614 .block_erasers =
4615 {
4616 {
4617 .eraseblocks = { {4 * 1024, 128} },
4618 .block_erase = erase_sector_jedec,
4619 }, {
4620 .eraseblocks = { {64 * 1024, 8} },
4621 .block_erase = erase_block_jedec,
4622 }, {
4623 .eraseblocks = { {512 * 1024, 1} },
4624 .block_erase = erase_chip_block_jedec,
4625 }
4626 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004627 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004628 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004629 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004630 },
4631
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004632 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00004633 .vendor = "Sanyo",
4634 .name = "LF25FW203A",
4635 .bustype = CHIP_BUSTYPE_SPI,
4636 .manufacture_id = SANYO_ID,
4637 .model_id = SANYO_LE25FW203A,
4638 .total_size = 2048,
4639 .page_size = 256,
4640 .tested = TEST_UNTESTED,
4641 .probe = probe_spi_rdid,
4642 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004643 .block_erasers =
4644 {
4645 {
4646 .eraseblocks = { {64 * 1024, 32} },
4647 .block_erase = spi_block_erase_d8,
4648 }, {
4649 .eraseblocks = { {2 * 1024 * 1024, 1} },
4650 .block_erase = spi_block_erase_c7,
4651 }
4652 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004653 .unlock = spi_disable_blockprotect,
Sean Nelsond70b09c2009-11-24 02:11:08 +00004654 .write = spi_chip_write_256,
4655 .read = spi_chip_read,
4656 },
4657
4658 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004659 .vendor = "Sharp",
4660 .name = "LHF00L04",
Urja Rannikko038a3122009-06-28 19:19:25 +00004661 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004662 .manufacture_id = SHARP_ID,
4663 .model_id = SHARP_LHF00L04,
4664 .total_size = 1024,
4665 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004666 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004667 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004668 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004669 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004670 .block_erasers =
4671 {
4672 {
4673 .eraseblocks = {
4674 {64 * 1024, 15},
4675 {8 * 1024, 8}
4676 },
Sean Nelson28accc22010-03-19 18:47:06 +00004677 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004678 }, {
4679 .eraseblocks = {
4680 {1024 * 1024, 1}
4681 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00004682 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004683 },
4684 },
Sean Nelson28accc22010-03-19 18:47:06 +00004685 .unlock = unlock_82802ab,
4686 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004687 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004688 },
4689
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004690 {
4691 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00004692 .name = "S25FL008A",
4693 .bustype = CHIP_BUSTYPE_SPI,
4694 .manufacture_id = SPANSION_ID,
4695 .model_id = SPANSION_S25FL008A,
4696 .total_size = 1024,
4697 .page_size = 256,
4698 .tested = TEST_OK_PREW,
4699 .probe = probe_spi_rdid,
4700 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00004701 .block_erasers =
4702 {
4703 {
4704 .eraseblocks = { {64 * 1024, 16} },
4705 .block_erase = spi_block_erase_d8,
4706 }, {
4707 .eraseblocks = { {1024 * 1024, 1} },
4708 .block_erase = spi_block_erase_c7,
4709 }
4710 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004711 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00004712 .write = spi_chip_write_256,
4713 .read = spi_chip_read,
4714 },
4715
4716 {
4717 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004718 .name = "S25FL016A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004719 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004720 .manufacture_id = SPANSION_ID,
4721 .model_id = SPANSION_S25FL016A,
4722 .total_size = 2048,
4723 .page_size = 256,
Sean Nelson5643c072010-01-19 03:23:07 +00004724 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004725 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004726 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004727 .block_erasers =
4728 {
4729 {
4730 .eraseblocks = { {64 * 1024, 32} },
4731 .block_erase = spi_block_erase_d8,
4732 }, {
4733 .eraseblocks = { {2 * 1024 * 1024, 1} },
4734 .block_erase = spi_block_erase_c7,
4735 }
4736 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004737 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004738 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004739 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004740 },
4741
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004742 {
4743 .vendor = "SST",
4744 .name = "SST25VF016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004745 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004746 .manufacture_id = SST_ID,
4747 .model_id = SST_25VF016B,
4748 .total_size = 2048,
4749 .page_size = 256,
Uwe Hermanna3473242010-09-14 22:59:39 +00004750 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004751 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004752 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004753 .block_erasers =
4754 {
4755 {
4756 .eraseblocks = { {4 * 1024, 512} },
4757 .block_erase = spi_block_erase_20,
4758 }, {
4759 .eraseblocks = { {32 * 1024, 64} },
4760 .block_erase = spi_block_erase_52,
4761 }, {
4762 .eraseblocks = { {64 * 1024, 32} },
4763 .block_erase = spi_block_erase_d8,
4764 }, {
4765 .eraseblocks = { {2 * 1024 * 1024, 1} },
4766 .block_erase = spi_block_erase_60,
4767 }, {
4768 .eraseblocks = { {2 * 1024 * 1024, 1} },
4769 .block_erase = spi_block_erase_c7,
4770 },
4771 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004772 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004773 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004774 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004775 },
4776
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004777 {
4778 .vendor = "SST",
4779 .name = "SST25VF032B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004780 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004781 .manufacture_id = SST_ID,
4782 .model_id = SST_25VF032B,
4783 .total_size = 4096,
4784 .page_size = 256,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004785 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004786 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004787 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004788 .block_erasers =
4789 {
4790 {
4791 .eraseblocks = { {4 * 1024, 1024} },
4792 .block_erase = spi_block_erase_20,
4793 }, {
4794 .eraseblocks = { {32 * 1024, 128} },
4795 .block_erase = spi_block_erase_52,
4796 }, {
4797 .eraseblocks = { {64 * 1024, 64} },
4798 .block_erase = spi_block_erase_d8,
4799 }, {
4800 .eraseblocks = { {4 * 1024 * 1024, 1} },
4801 .block_erase = spi_block_erase_60,
4802 }, {
4803 .eraseblocks = { {4 * 1024 * 1024, 1} },
4804 .block_erase = spi_block_erase_c7,
4805 },
4806 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004807 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004808 .write = spi_chip_write_1,
4809 .read = spi_chip_read,
4810 },
4811
4812 {
4813 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00004814 .name = "SST25VF064C",
4815 .bustype = CHIP_BUSTYPE_SPI,
4816 .manufacture_id = SST_ID,
4817 .model_id = SST_25VF064C,
4818 .total_size = 8192,
4819 .page_size = 256,
4820 .tested = TEST_OK_PREW,
4821 .probe = probe_spi_rdid,
4822 .probe_timing = TIMING_ZERO,
4823 .block_erasers =
4824 {
4825 {
4826 .eraseblocks = { {4 * 1024, 2048} },
4827 .block_erase = spi_block_erase_20,
4828 }, {
4829 .eraseblocks = { {32 * 1024, 256} },
4830 .block_erase = spi_block_erase_52,
4831 }, {
4832 .eraseblocks = { {64 * 1024, 128} },
4833 .block_erase = spi_block_erase_d8,
4834 }, {
4835 .eraseblocks = { {8 * 1024 * 1024, 1} },
4836 .block_erase = spi_block_erase_60,
4837 }, {
4838 .eraseblocks = { {8 * 1024 * 1024, 1} },
4839 .block_erase = spi_block_erase_c7,
4840 },
4841 },
4842 .unlock = spi_disable_blockprotect,
4843 .write = spi_chip_write_1,
4844 .read = spi_chip_read,
4845 },
4846
4847 {
4848 .vendor = "SST",
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004849 .name = "SST25VF040.REMS",
4850 .bustype = CHIP_BUSTYPE_SPI,
4851 .manufacture_id = SST_ID,
4852 .model_id = SST_25VF040_REMS,
4853 .total_size = 512,
4854 .page_size = 256,
4855 .tested = TEST_OK_PR,
4856 .probe = probe_spi_rems,
4857 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004858 .block_erasers =
4859 {
4860 {
4861 .eraseblocks = { {4 * 1024, 128} },
4862 .block_erase = spi_block_erase_20,
4863 }, {
4864 .eraseblocks = { {32 * 1024, 16} },
4865 .block_erase = spi_block_erase_52,
4866 }, {
4867 .eraseblocks = { {512 * 1024, 1} },
4868 .block_erase = spi_block_erase_60,
4869 },
4870 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004871 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004872 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004873 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004874 },
4875
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004876 {
4877 .vendor = "SST",
4878 .name = "SST25VF040B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004879 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004880 .manufacture_id = SST_ID,
4881 .model_id = SST_25VF040B,
4882 .total_size = 512,
4883 .page_size = 256,
4884 .tested = TEST_UNTESTED,
4885 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004886 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004887 .block_erasers =
4888 {
4889 {
4890 .eraseblocks = { {4 * 1024, 128} },
4891 .block_erase = spi_block_erase_20,
4892 }, {
4893 .eraseblocks = { {32 * 1024, 16} },
4894 .block_erase = spi_block_erase_52,
4895 }, {
4896 .eraseblocks = { {64 * 1024, 8} },
4897 .block_erase = spi_block_erase_d8,
4898 }, {
4899 .eraseblocks = { {512 * 1024, 1} },
4900 .block_erase = spi_block_erase_60,
4901 }, {
4902 .eraseblocks = { {512 * 1024, 1} },
4903 .block_erase = spi_block_erase_c7,
4904 },
4905 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004906 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004907 .write = spi_chip_write_1,
Zheng Bao0677dff2009-02-25 08:07:33 +00004908 .read = spi_chip_read,
4909 },
4910
4911 {
4912 .vendor = "SST",
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004913 .name = "SST25LF040A.RES",
4914 .bustype = CHIP_BUSTYPE_SPI,
4915 .manufacture_id = SST_ID,
4916 .model_id = SST_25VF040_REMS,
4917 .total_size = 512,
4918 .page_size = 256,
4919 .tested = TEST_OK_PROBE,
4920 .probe = probe_spi_res2,
4921 .probe_timing = TIMING_ZERO,
4922 .block_erasers =
4923 {
4924 {
4925 .eraseblocks = { {4 * 1024, 128} },
4926 .block_erase = spi_block_erase_20,
4927 }, {
4928 .eraseblocks = { {32 * 1024, 16} },
4929 .block_erase = spi_block_erase_52,
4930 }, {
4931 .eraseblocks = { {512 * 1024, 1} },
4932 .block_erase = spi_block_erase_60,
4933 },
4934 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004935 .unlock = spi_disable_blockprotect,
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004936 .write = spi_chip_write_1,
4937 .read = spi_chip_read,
4938 },
4939
4940 {
4941 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00004942 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004943 .bustype = CHIP_BUSTYPE_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004944 .manufacture_id = SST_ID,
4945 .model_id = SST_25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00004946 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004947 .page_size = 256,
Peter Stugefd9217d2009-01-26 03:37:40 +00004948 .tested = TEST_OK_PR,
4949 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004950 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004951 .block_erasers =
4952 {
4953 {
4954 .eraseblocks = { {4 * 1024, 128} },
4955 .block_erase = spi_block_erase_20,
4956 }, {
4957 .eraseblocks = { {32 * 1024, 16} },
4958 .block_erase = spi_block_erase_52,
4959 }, {
4960 .eraseblocks = { {64 * 1024, 8} },
4961 .block_erase = spi_block_erase_d8,
4962 }, {
4963 .eraseblocks = { {512 * 1024, 1} },
4964 .block_erase = spi_block_erase_60,
4965 }, {
4966 .eraseblocks = { {512 * 1024, 1} },
4967 .block_erase = spi_block_erase_c7,
4968 },
4969 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004970 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004971 .write = spi_chip_write_1,
Peter Stugefd9217d2009-01-26 03:37:40 +00004972 .read = spi_chip_read,
4973 },
4974
4975 {
4976 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004977 .name = "SST25VF080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004978 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004979 .manufacture_id = SST_ID,
4980 .model_id = SST_25VF080B,
4981 .total_size = 1024,
4982 .page_size = 256,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00004983 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004984 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004985 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004986 .block_erasers =
4987 {
4988 {
4989 .eraseblocks = { {4 * 1024, 256} },
4990 .block_erase = spi_block_erase_20,
4991 }, {
4992 .eraseblocks = { {32 * 1024, 32} },
4993 .block_erase = spi_block_erase_52,
4994 }, {
4995 .eraseblocks = { {64 * 1024, 16} },
4996 .block_erase = spi_block_erase_d8,
4997 }, {
4998 .eraseblocks = { {1024 * 1024, 1} },
4999 .block_erase = spi_block_erase_60,
5000 }, {
5001 .eraseblocks = { {1024 * 1024, 1} },
5002 .block_erase = spi_block_erase_c7,
5003 },
5004 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005005 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005006 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005007 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005008 },
5009
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005010 {
5011 .vendor = "SST",
5012 .name = "SST28SF040A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005013 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005014 .manufacture_id = SST_ID,
5015 .model_id = SST_28SF040,
5016 .total_size = 512,
5017 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005018 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005019 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005020 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005021 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005022 .block_erasers =
5023 {
5024 {
5025 .eraseblocks = { {128, 4096} },
5026 .block_erase = erase_sector_28sf040,
5027 }, {
5028 .eraseblocks = { {512 * 1024, 1} },
5029 .block_erase = erase_chip_28sf040,
5030 }
5031 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005032 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005033 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005034 },
5035
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005036 {
5037 .vendor = "SST",
5038 .name = "SST29EE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005039 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005040 .manufacture_id = SST_ID,
5041 .model_id = SST_29EE010,
5042 .total_size = 128,
5043 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005044 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00005045 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005046 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005047 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005048 .block_erasers =
5049 {
5050 {
5051 .eraseblocks = { {128 * 1024, 1} },
5052 .block_erase = erase_chip_block_jedec,
5053 }
5054 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005055 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005056 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005057 },
5058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005059 {
5060 .vendor = "SST",
5061 .name = "SST29LE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005062 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005063 .manufacture_id = SST_ID,
5064 .model_id = SST_29LE010,
5065 .total_size = 128,
5066 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005067 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005068 .tested = TEST_UNTESTED,
5069 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005070 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005071 .block_erasers =
5072 {
5073 {
5074 .eraseblocks = { {128 * 1024, 1} },
5075 .block_erase = erase_chip_block_jedec,
5076 }
5077 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005078 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005079 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005080 },
5081
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005082 {
5083 .vendor = "SST",
5084 .name = "SST29EE020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005085 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005086 .manufacture_id = SST_ID,
5087 .model_id = SST_29EE020A,
5088 .total_size = 256,
5089 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005090 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005091 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005092 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005093 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005094 .block_erasers =
5095 {
5096 {
5097 .eraseblocks = { {256 * 1024, 1} },
5098 .block_erase = erase_chip_block_jedec,
5099 }
5100 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005101 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005102 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005103 },
5104
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005105 {
5106 .vendor = "SST",
5107 .name = "SST29LE020",
Urja Rannikko038a3122009-06-28 19:19:25 +00005108 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005109 .manufacture_id = SST_ID,
5110 .model_id = SST_29LE020,
5111 .total_size = 256,
5112 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00005113 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00005114 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005115 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005116 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005117 .block_erasers =
5118 {
5119 {
5120 .eraseblocks = { {256 * 1024, 1} },
5121 .block_erase = erase_chip_block_jedec,
5122 }
5123 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005124 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005125 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005126 },
5127
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005128 {
5129 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +00005130 .name = "SST39SF512",
5131 .bustype = CHIP_BUSTYPE_PARALLEL,
5132 .manufacture_id = SST_ID,
5133 .model_id = SST_39SF512,
5134 .total_size = 64,
5135 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005136 .feature_bits = FEATURE_EITHER_RESET,
5137 .tested = TEST_UNTESTED,
Uwe Hermann48da3f92010-01-23 15:15:19 +00005138 .probe = probe_jedec,
5139 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +00005140 .block_erasers =
5141 {
5142 {
5143 .eraseblocks = { {4 * 1024, 16} },
5144 .block_erase = erase_sector_jedec,
5145 }, {
5146 .eraseblocks = { {64 * 1024, 1} },
5147 .block_erase = erase_chip_block_jedec,
5148 }
5149 },
Sean Nelson35727f72010-01-28 23:55:12 +00005150 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +00005151 .read = read_memmapped,
5152 },
5153
5154 {
5155 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005156 .name = "SST39SF010A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005157 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005158 .manufacture_id = SST_ID,
5159 .model_id = SST_39SF010,
5160 .total_size = 128,
5161 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005162 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00005163 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005164 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005165 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005166 .block_erasers =
5167 {
5168 {
5169 .eraseblocks = { {4 * 1024, 32} },
5170 .block_erase = erase_sector_jedec,
5171 }, {
5172 .eraseblocks = { {128 * 1024, 1} },
5173 .block_erase = erase_chip_block_jedec,
5174 }
5175 },
Sean Nelson35727f72010-01-28 23:55:12 +00005176 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005177 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005178 },
5179
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005180 {
5181 .vendor = "SST",
5182 .name = "SST39SF020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005183 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005184 .manufacture_id = SST_ID,
5185 .model_id = SST_39SF020,
5186 .total_size = 256,
5187 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005188 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005189 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005190 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005191 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005192 .block_erasers =
5193 {
5194 {
5195 .eraseblocks = { {4 * 1024, 64} },
5196 .block_erase = erase_sector_jedec,
5197 }, {
5198 .eraseblocks = { {256 * 1024, 1} },
5199 .block_erase = erase_chip_block_jedec,
5200 }
5201 },
Sean Nelson35727f72010-01-28 23:55:12 +00005202 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005203 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005204 },
5205
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005206 {
5207 .vendor = "SST",
5208 .name = "SST39SF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00005209 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005210 .manufacture_id = SST_ID,
5211 .model_id = SST_39SF040,
5212 .total_size = 512,
5213 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005214 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005215 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005216 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005217 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005218 .block_erasers =
5219 {
5220 {
5221 .eraseblocks = { {4 * 1024, 128} },
5222 .block_erase = erase_sector_jedec,
5223 }, {
5224 .eraseblocks = { {512 * 1024, 1} },
5225 .block_erase = erase_chip_block_jedec,
5226 }
5227 },
Sean Nelson35727f72010-01-28 23:55:12 +00005228 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005229 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005230 },
5231
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005232 {
5233 .vendor = "SST",
5234 .name = "SST39VF512",
Urja Rannikko038a3122009-06-28 19:19:25 +00005235 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005236 .manufacture_id = SST_ID,
5237 .model_id = SST_39VF512,
5238 .total_size = 64,
5239 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005240 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00005241 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005242 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005243 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005244 .block_erasers =
5245 {
5246 {
5247 .eraseblocks = { {4 * 1024, 16} },
5248 .block_erase = erase_sector_jedec,
5249 }, {
5250 .eraseblocks = { {64 * 1024, 1} },
5251 .block_erase = erase_chip_block_jedec,
5252 }
5253 },
Sean Nelson35727f72010-01-28 23:55:12 +00005254 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005255 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005256 },
5257
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005258 {
5259 .vendor = "SST",
5260 .name = "SST39VF010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005261 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005262 .manufacture_id = SST_ID,
5263 .model_id = SST_39VF010,
5264 .total_size = 128,
5265 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005266 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005267 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005268 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005269 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005270 .block_erasers =
5271 {
5272 {
5273 .eraseblocks = { {4 * 1024, 32} },
5274 .block_erase = erase_sector_jedec,
5275 }, {
5276 .eraseblocks = { {128 * 1024, 1} },
5277 .block_erase = erase_chip_block_jedec,
5278 }
5279 },
Sean Nelson35727f72010-01-28 23:55:12 +00005280 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005281 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005282 },
5283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005284 {
5285 .vendor = "SST",
5286 .name = "SST39VF020",
Urja Rannikko038a3122009-06-28 19:19:25 +00005287 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005288 .manufacture_id = SST_ID,
5289 .model_id = SST_39VF020,
5290 .total_size = 256,
5291 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005292 .feature_bits = FEATURE_EITHER_RESET,
5293 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005294 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005295 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005296 .block_erasers =
5297 {
5298 {
5299 .eraseblocks = { {4 * 1024, 64} },
5300 .block_erase = erase_sector_jedec,
5301 }, {
5302 .eraseblocks = { {256 * 1024, 1} },
5303 .block_erase = erase_chip_block_jedec,
5304 }
5305 },
Sean Nelson35727f72010-01-28 23:55:12 +00005306 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005307 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005308 },
5309
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005310 {
5311 .vendor = "SST",
5312 .name = "SST39VF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00005313 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005314 .manufacture_id = SST_ID,
5315 .model_id = SST_39VF040,
5316 .total_size = 512,
5317 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005318 .feature_bits = FEATURE_EITHER_RESET,
5319 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005320 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005321 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005322 .block_erasers =
5323 {
5324 {
5325 .eraseblocks = { {4 * 1024, 128} },
5326 .block_erase = erase_sector_jedec,
5327 }, {
5328 .eraseblocks = { {512 * 1024, 1} },
5329 .block_erase = erase_chip_block_jedec,
5330 }
5331 },
Sean Nelson35727f72010-01-28 23:55:12 +00005332 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005333 .read = read_memmapped,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +00005334 },
FENG yu ningff692fb2008-12-08 18:15:10 +00005335
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005336 {
5337 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +00005338 .name = "SST39VF080",
Urja Rannikko038a3122009-06-28 19:19:25 +00005339 .bustype = CHIP_BUSTYPE_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005340 .manufacture_id = SST_ID,
5341 .model_id = SST_39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +00005342 .total_size = 1024,
5343 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005344 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +00005345 .tested = TEST_UNTESTED,
5346 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005347 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005348 .block_erasers =
5349 {
5350 {
5351 .eraseblocks = { {4 * 1024, 256} },
5352 .block_erase = erase_sector_jedec,
5353 }, {
5354 .eraseblocks = { {64 * 1024, 16} },
5355 .block_erase = erase_block_jedec,
5356 }, {
5357 .eraseblocks = { {1024 * 1024, 1} },
5358 .block_erase = erase_chip_block_jedec,
5359 }
5360 },
Sean Nelson35727f72010-01-28 23:55:12 +00005361 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005362 .read = read_memmapped,
Peter Stuge8440cc02009-01-25 23:55:12 +00005363 },
5364
5365 {
5366 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005367 .name = "SST49LF002A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005368 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005369 .manufacture_id = SST_ID,
5370 .model_id = SST_49LF002A,
5371 .total_size = 256,
5372 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005373 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00005374 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005375 .probe = probe_jedec,
5376 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005377 .block_erasers =
5378 {
5379 {
5380 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005381 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005382 }, {
5383 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005384 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005385 }, {
5386 .eraseblocks = { {256 * 1024, 1} },
5387 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5388 }
5389 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005390 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005391 .unlock = unlock_sst_fwhub,
5392 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005393 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005394 },
5395
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005396 {
5397 .vendor = "SST",
5398 .name = "SST49LF003A/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_49LF003A,
5402 .total_size = 384,
5403 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005404 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Peter Lemenkov45835c42009-09-25 01:09:18 +00005405 .tested = TEST_OK_PR,
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, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005412 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005413 }, {
5414 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005415 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005416 }, {
5417 .eraseblocks = { {384 * 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 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005428 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
5429 * and is only honored for 64k block erase, but not 4k sector erase.
5430 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005431 .vendor = "SST",
5432 .name = "SST49LF004A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005433 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005434 .manufacture_id = SST_ID,
5435 .model_id = SST_49LF004A,
5436 .total_size = 512,
5437 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005438 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005439 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005440 .probe = probe_jedec,
5441 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005442 .block_erasers =
5443 {
5444 {
5445 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005446 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005447 }, {
5448 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005449 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005450 }, {
5451 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +00005452 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005453 },
5454 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005455 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005456 .unlock = unlock_sst_fwhub,
5457 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005458 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005459 },
5460
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005461 {
5462 .vendor = "SST",
5463 .name = "SST49LF004C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005464 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005465 .manufacture_id = SST_ID,
5466 .model_id = SST_49LF004C,
5467 .total_size = 512,
5468 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005469 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005470 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005471 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005472 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005473 .block_erasers =
5474 {
5475 {
5476 .eraseblocks = { {4 * 1024, 128} },
5477 .block_erase = erase_sector_49lfxxxc,
5478 }, {
5479 .eraseblocks = {
5480 {64 * 1024, 7},
5481 {32 * 1024, 1},
5482 {8 * 1024, 2},
5483 {16 * 1024, 1},
5484 },
Sean Nelson69e58112010-03-23 17:10:28 +00005485 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005486 }
5487 },
Sean Nelson69e58112010-03-23 17:10:28 +00005488 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005489 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005490 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005491 },
5492
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005493 {
5494 .vendor = "SST",
5495 .name = "SST49LF008A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005496 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005497 .manufacture_id = SST_ID,
5498 .model_id = SST_49LF008A,
5499 .total_size = 1024,
5500 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005501 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005502 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005503 .probe = probe_jedec,
5504 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005505 .block_erasers =
5506 {
5507 {
5508 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005509 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005510 }, {
5511 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005512 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005513 }, {
5514 .eraseblocks = { {1024 * 1024, 1} },
5515 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5516 }
5517 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005518 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005519 .unlock = unlock_sst_fwhub,
5520 .write = write_jedec_1,
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 = "SST49LF008C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005527 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005528 .manufacture_id = SST_ID,
5529 .model_id = SST_49LF008C,
5530 .total_size = 1024,
5531 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005532 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005533 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005534 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005535 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005536 .block_erasers =
5537 {
5538 {
5539 .eraseblocks = { {4 * 1024, 256} },
5540 .block_erase = erase_sector_49lfxxxc,
5541 }, {
5542 .eraseblocks = {
5543 {64 * 1024, 15},
5544 {32 * 1024, 1},
5545 {8 * 1024, 2},
5546 {16 * 1024, 1},
5547 },
Sean Nelson69e58112010-03-23 17:10:28 +00005548 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005549 }
5550 },
Sean Nelson69e58112010-03-23 17:10:28 +00005551 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005552 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005553 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005554 },
5555
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005556 {
5557 .vendor = "SST",
5558 .name = "SST49LF016C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005559 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005560 .manufacture_id = SST_ID,
5561 .model_id = SST_49LF016C,
5562 .total_size = 2048,
5563 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005564 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005565 .tested = TEST_OK_PRW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005566 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005567 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005568 .block_erasers =
5569 {
5570 {
5571 .eraseblocks = { {4 * 1024, 512} },
5572 .block_erase = erase_sector_49lfxxxc,
5573 }, {
5574 .eraseblocks = {
5575 {64 * 1024, 31},
5576 {32 * 1024, 1},
5577 {8 * 1024, 2},
5578 {16 * 1024, 1},
5579 },
Sean Nelson69e58112010-03-23 17:10:28 +00005580 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005581 }
5582 },
Sean Nelson69e58112010-03-23 17:10:28 +00005583 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005584 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005585 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005586 },
5587
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005588 {
5589 .vendor = "SST",
5590 .name = "SST49LF020",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005591 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005592 .manufacture_id = SST_ID,
5593 .model_id = SST_49LF020,
5594 .total_size = 256,
5595 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005596 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005597 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005598 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005599 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005600 .block_erasers =
5601 {
5602 {
5603 .eraseblocks = { {4 * 1024, 64} },
5604 .block_erase = erase_sector_jedec,
5605 }, {
5606 .eraseblocks = { {16 * 1024, 16} },
5607 .block_erase = erase_block_jedec,
5608 }, {
5609 .eraseblocks = { {256 * 1024, 1} },
5610 .block_erase = NULL,
5611 }
5612 },
Sean Nelson35727f72010-01-28 23:55:12 +00005613 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005614 .read = read_memmapped,
Sven Schnellec208dfb2009-01-07 12:35:09 +00005615 },
5616
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005617 {
5618 .vendor = "SST",
5619 .name = "SST49LF020A",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005620 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005621 .manufacture_id = SST_ID,
5622 .model_id = SST_49LF020A,
5623 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +00005624 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005625 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005626 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005627 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005628 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005629 .block_erasers =
5630 {
5631 {
5632 .eraseblocks = { {4 * 1024, 64} },
5633 .block_erase = erase_sector_jedec,
5634 }, {
5635 .eraseblocks = { {16 * 1024, 16} },
5636 .block_erase = erase_block_jedec,
5637 }, {
5638 .eraseblocks = { {256 * 1024, 1} },
5639 .block_erase = NULL,
5640 }
5641 },
Sean Nelson35727f72010-01-28 23:55:12 +00005642 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005643 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005644 },
5645
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005646 {
5647 .vendor = "SST",
5648 .name = "SST49LF040",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005649 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005650 .manufacture_id = SST_ID,
5651 .model_id = SST_49LF040,
5652 .total_size = 512,
5653 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005654 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00005655 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005656 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00005657 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005658 .block_erasers =
5659 {
5660 {
5661 .eraseblocks = { {4 * 1024, 128} },
5662 .block_erase = erase_sector_jedec,
5663 }, {
5664 .eraseblocks = { {64 * 1024, 8} },
5665 .block_erase = erase_block_jedec,
5666 }, {
5667 .eraseblocks = { {512 * 1024, 1} },
5668 .block_erase = NULL,
5669 }
5670 },
Sean Nelson35727f72010-01-28 23:55:12 +00005671 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005672 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005673 },
5674
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005675 {
5676 .vendor = "SST",
5677 .name = "SST49LF040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005678 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005679 .manufacture_id = SST_ID,
5680 .model_id = SST_49LF040B,
5681 .total_size = 512,
5682 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +00005683 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
5684 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005685 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005686 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005687 .block_erasers =
5688 {
5689 {
5690 .eraseblocks = { {4 * 1024, 128} },
5691 .block_erase = erase_sector_jedec,
5692 }, {
5693 .eraseblocks = { {64 * 1024, 8} },
5694 .block_erase = erase_block_jedec,
5695 }, {
5696 .eraseblocks = { {512 * 1024, 1} },
5697 .block_erase = NULL,
5698 }
5699 },
Joshua Roysa84b0bd2010-08-16 22:12:39 +00005700 .unlock = unlock_82802ab,
Sean Nelson35727f72010-01-28 23:55:12 +00005701 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005702 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005703 },
5704
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005705 {
5706 .vendor = "SST",
5707 .name = "SST49LF080A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005708 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005709 .manufacture_id = SST_ID,
Urja Rannikko038a3122009-06-28 19:19:25 +00005710 .model_id = SST_49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005711 .total_size = 1024,
5712 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005713 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005714 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005715 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005716 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005717 .block_erasers =
5718 {
5719 {
5720 .eraseblocks = { {4 * 1024, 256} },
5721 .block_erase = erase_sector_jedec,
5722 }, {
5723 .eraseblocks = { {64 * 1024, 16} },
5724 .block_erase = erase_block_jedec,
5725 }, {
5726 .eraseblocks = { {1024 * 1024, 1} },
5727 .block_erase = NULL,
5728 }
5729 },
Sean Nelson35727f72010-01-28 23:55:12 +00005730 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005731 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005732 },
5733
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005734 {
5735 .vendor = "SST",
5736 .name = "SST49LF160C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005737 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005738 .manufacture_id = SST_ID,
5739 .model_id = SST_49LF160C,
5740 .total_size = 2048,
5741 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005742 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00005743 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005744 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005745 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005746 .block_erasers =
5747 {
5748 {
5749 .eraseblocks = { {4 * 1024, 512} },
5750 .block_erase = erase_sector_49lfxxxc,
5751 }, {
5752 .eraseblocks = {
5753 {64 * 1024, 31},
5754 {32 * 1024, 1},
5755 {8 * 1024, 2},
5756 {16 * 1024, 1},
5757 },
Sean Nelson69e58112010-03-23 17:10:28 +00005758 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005759 }
5760 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00005761 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005762 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005763 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005764 },
5765
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005766 {
5767 .vendor = "ST",
5768 .name = "M25P05-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005769 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005770 .manufacture_id = ST_ID,
5771 .model_id = ST_M25P05A,
5772 .total_size = 64,
5773 .page_size = 256,
5774 .tested = TEST_UNTESTED,
5775 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005776 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005777 .block_erasers =
5778 {
5779 {
5780 .eraseblocks = { {32 * 1024, 2} },
5781 .block_erase = spi_block_erase_d8,
5782 }, {
5783 .eraseblocks = { {64 * 1024, 1} },
5784 .block_erase = spi_block_erase_c7,
5785 }
5786 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005787 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005788 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005789 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005790 },
5791
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005792 /* The ST M25P05 is a bit of a problem. It has the same ID as the
5793 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005794 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005795 * only is successful if RDID does not work.
5796 */
5797 {
5798 .vendor = "ST",
5799 .name = "M25P05.RES",
5800 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005801 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005802 .model_id = ST_M25P05_RES,
5803 .total_size = 64,
5804 .page_size = 256,
5805 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005806 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +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 Hailfinger32961be2009-07-23 01:40:20 +00005819 .write = spi_chip_write_1, /* 128 */
5820 .read = spi_chip_read,
5821 },
5822
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005823 {
5824 .vendor = "ST",
5825 .name = "M25P10-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005826 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005827 .manufacture_id = ST_ID,
5828 .model_id = ST_M25P10A,
5829 .total_size = 128,
5830 .page_size = 256,
Uwe Hermann51afebb2010-08-01 00:13:49 +00005831 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005832 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005833 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005834 .block_erasers =
5835 {
5836 {
5837 .eraseblocks = { {32 * 1024, 4} },
5838 .block_erase = spi_block_erase_d8,
5839 }, {
5840 .eraseblocks = { {128 * 1024, 1} },
5841 .block_erase = spi_block_erase_c7,
5842 }
5843 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005844 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005845 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005846 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005847 },
5848
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005849 /* The ST M25P10 has the same problem as the M25P05. */
5850 {
5851 .vendor = "ST",
5852 .name = "M25P10.RES",
5853 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005854 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005855 .model_id = ST_M25P10_RES,
5856 .total_size = 128,
5857 .page_size = 256,
5858 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005859 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005860 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005861 .block_erasers =
5862 {
5863 {
5864 .eraseblocks = { {32 * 1024, 4} },
5865 .block_erase = spi_block_erase_d8,
5866 }, {
5867 .eraseblocks = { {128 * 1024, 1} },
5868 .block_erase = spi_block_erase_c7,
5869 }
5870 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005871 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005872 .write = spi_chip_write_1, /* 128 */
5873 .read = spi_chip_read,
5874 },
5875
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005876 {
5877 .vendor = "ST",
5878 .name = "M25P20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005879 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005880 .manufacture_id = ST_ID,
5881 .model_id = ST_M25P20,
5882 .total_size = 256,
5883 .page_size = 256,
5884 .tested = TEST_UNTESTED,
5885 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005886 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005887 .block_erasers =
5888 {
5889 {
5890 .eraseblocks = { {64 * 1024, 4} },
5891 .block_erase = spi_block_erase_d8,
5892 }, {
5893 .eraseblocks = { {256 * 1024, 1} },
5894 .block_erase = spi_block_erase_c7,
5895 }
5896 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005897 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005898 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005899 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005900 },
5901
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005902 {
5903 .vendor = "ST",
5904 .name = "M25P40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005905 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005906 .manufacture_id = ST_ID,
5907 .model_id = ST_M25P40,
5908 .total_size = 512,
5909 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005910 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005911 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005912 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005913 .block_erasers =
5914 {
5915 {
5916 .eraseblocks = { {64 * 1024, 8} },
5917 .block_erase = spi_block_erase_d8,
5918 }, {
5919 .eraseblocks = { {512 * 1024, 1} },
5920 .block_erase = spi_block_erase_c7,
5921 }
5922 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005923 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005924 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005925 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005926 },
5927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005928 {
5929 .vendor = "ST",
5930 .name = "M25P40-old",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005931 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005932 .manufacture_id = 0, /* Not used. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005933 .model_id = ST_M25P40_RES,
5934 .total_size = 512,
5935 .page_size = 256,
5936 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005937 .probe = probe_spi_res1,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005938 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005939 .block_erasers =
5940 {
5941 {
5942 .eraseblocks = { {64 * 1024, 8} },
5943 .block_erase = spi_block_erase_d8,
5944 }, {
5945 .eraseblocks = { {512 * 1024, 1} },
5946 .block_erase = spi_block_erase_c7,
5947 }
5948 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005949 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005950 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005951 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005952 },
5953
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005954 {
5955 .vendor = "ST",
5956 .name = "M25P80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005957 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005958 .manufacture_id = ST_ID,
5959 .model_id = ST_M25P80,
5960 .total_size = 1024,
5961 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005962 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005963 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005964 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005965 .block_erasers =
5966 {
5967 {
5968 .eraseblocks = { {64 * 1024, 16} },
5969 .block_erase = spi_block_erase_d8,
5970 }, {
5971 .eraseblocks = { {1024 * 1024, 1} },
5972 .block_erase = spi_block_erase_c7,
5973 }
5974 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005975 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005976 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005977 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005978 },
5979
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005980 {
5981 .vendor = "ST",
5982 .name = "M25P16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005983 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005984 .manufacture_id = ST_ID,
5985 .model_id = ST_M25P16,
5986 .total_size = 2048,
5987 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005988 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005989 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005990 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005991 .block_erasers =
5992 {
5993 {
5994 .eraseblocks = { {64 * 1024, 32} },
5995 .block_erase = spi_block_erase_d8,
5996 }, {
5997 .eraseblocks = { {2 * 1024 * 1024, 1} },
5998 .block_erase = spi_block_erase_c7,
5999 }
6000 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006001 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006002 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006003 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006004 },
6005
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006006 {
6007 .vendor = "ST",
6008 .name = "M25P32",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006009 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006010 .manufacture_id = ST_ID,
6011 .model_id = ST_M25P32,
6012 .total_size = 4096,
6013 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00006014 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006015 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006016 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006017 .block_erasers =
6018 {
6019 {
6020 .eraseblocks = { {64 * 1024, 64} },
6021 .block_erase = spi_block_erase_d8,
6022 }, {
6023 .eraseblocks = { {4 * 1024 * 1024, 1} },
6024 .block_erase = spi_block_erase_c7,
6025 }
6026 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006027 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006028 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006029 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006030 },
6031
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006032 {
6033 .vendor = "ST",
6034 .name = "M25P64",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006035 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006036 .manufacture_id = ST_ID,
6037 .model_id = ST_M25P64,
6038 .total_size = 8192,
6039 .page_size = 256,
6040 .tested = TEST_UNTESTED,
6041 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006042 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006043 .block_erasers =
6044 {
6045 {
6046 .eraseblocks = { {64 * 1024, 128} },
6047 .block_erase = spi_block_erase_d8,
6048 }, {
6049 .eraseblocks = { {8 * 1024 * 1024, 1} },
6050 .block_erase = spi_block_erase_c7,
6051 }
6052 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006053 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006054 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006055 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006056 },
6057
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006058 {
6059 .vendor = "ST",
6060 .name = "M25P128",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006061 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006062 .manufacture_id = ST_ID,
6063 .model_id = ST_M25P128,
6064 .total_size = 16384,
6065 .page_size = 256,
6066 .tested = TEST_UNTESTED,
6067 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006068 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006069 .block_erasers =
6070 {
6071 {
6072 .eraseblocks = { {256 * 1024, 64} },
6073 .block_erase = spi_block_erase_d8,
6074 }, {
6075 .eraseblocks = { {16 * 1024 * 1024, 1} },
6076 .block_erase = spi_block_erase_c7,
6077 }
6078 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006079 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006080 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006081 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006082 },
6083
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006084 {
6085 .vendor = "ST",
Jason Shriver4119e9b2010-09-14 13:16:01 +00006086 .name = "M25PX32",
6087 .bustype = CHIP_BUSTYPE_SPI,
6088 .manufacture_id = ST_ID,
6089 .model_id = ST_M25PX32,
6090 .total_size = 4096,
6091 .page_size = 256,
6092 .tested = TEST_OK_PREW,
6093 .probe = probe_spi_rdid,
6094 .probe_timing = TIMING_ZERO,
6095 .block_erasers =
6096 {
6097 {
6098 .eraseblocks = { { 4 * 1024, 1024 } },
6099 .block_erase = spi_block_erase_20,
6100 }, {
6101 .eraseblocks = { {64 * 1024, 64} },
6102 .block_erase = spi_block_erase_d8,
6103 }, {
6104 .eraseblocks = { {4 * 1024 * 1024, 1} },
6105 .block_erase = spi_block_erase_c7,
6106 }
6107 },
6108 .unlock = spi_disable_blockprotect,
6109 .write = spi_chip_write_256,
6110 .read = spi_chip_read,
6111 },
6112
6113 {
6114 .vendor = "ST",
6115 .name = "M25PX64",
6116 .bustype = CHIP_BUSTYPE_SPI,
6117 .manufacture_id = ST_ID,
6118 .model_id = ST_M25PX64,
6119 .total_size = 8192,
6120 .page_size = 256,
6121 .tested = TEST_OK_PREW,
6122 .probe = probe_spi_rdid,
6123 .probe_timing = TIMING_ZERO,
6124 .block_erasers =
6125 {
6126 {
6127 .eraseblocks = { { 4 * 1024, 2048 } },
6128 .block_erase = spi_block_erase_20,
6129 }, {
6130 .eraseblocks = { {64 * 1024, 128} },
6131 .block_erase = spi_block_erase_d8,
6132 }, {
6133 .eraseblocks = { {8 * 1024 * 1024, 1} },
6134 .block_erase = spi_block_erase_c7,
6135 }
6136 },
6137 .unlock = spi_disable_blockprotect,
6138 .write = spi_chip_write_256,
6139 .read = spi_chip_read,
6140 },
6141
6142 {
6143 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006144 .name = "M29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006145 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006146 .manufacture_id = ST_ID,
6147 .model_id = ST_M29F002B,
6148 .total_size = 256,
6149 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006150 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006151 .tested = TEST_UNTESTED,
6152 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006153 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006154 .block_erasers =
6155 {
6156 {
6157 .eraseblocks = {
6158 {16 * 1024, 1},
6159 {8 * 1024, 2},
6160 {32 * 1024, 1},
6161 {64 * 1024, 3},
6162 },
6163 .block_erase = erase_sector_jedec,
6164 }, {
6165 .eraseblocks = { {256 * 1024, 1} },
6166 .block_erase = erase_chip_block_jedec,
6167 }
6168 },
Sean Nelson35727f72010-01-28 23:55:12 +00006169 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006170 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006171 },
6172
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006173 {
6174 .vendor = "ST",
6175 .name = "M29F002T/NT",
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_M29F002T,
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,
6182 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006183 .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 {64 * 1024, 3},
6190 {32 * 1024, 1},
6191 {8 * 1024, 2},
6192 {16 * 1024, 1},
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 = "M29F040B",
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_M29F040B,
6210 .total_size = 512,
6211 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006212 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6213 .tested = TEST_UNTESTED,
6214 .probe = probe_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006215 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (am29f040b.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006216 .block_erasers =
6217 {
6218 {
6219 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00006220 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00006221 }, {
6222 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006223 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00006224 }
6225 },
Sean Nelson35727f72010-01-28 23:55:12 +00006226 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006227 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006228 },
6229
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006230 {
Sean Nelson35727f72010-01-28 23:55:12 +00006231 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006232 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006233 .name = "M29F400BB",
6234 .bustype = CHIP_BUSTYPE_PARALLEL,
6235 .manufacture_id = ST_ID,
6236 .model_id = ST_M29F400BB,
6237 .total_size = 512,
6238 .page_size = 64 * 1024,
6239 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
6240 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
6241 .probe = probe_m29f400bt,
6242 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
6243 .block_erasers =
6244 {
6245 {
6246 .eraseblocks = {
6247 {16 * 1024, 1},
6248 {8 * 1024, 2},
6249 {32 * 1024, 1},
6250 {64 * 1024, 7},
6251 },
6252 .block_erase = block_erase_m29f400bt,
6253 }, {
6254 .eraseblocks = { {512 * 1024, 1} },
6255 .block_erase = block_erase_chip_m29f400bt,
6256 }
6257 },
6258 .write = NULL,
6259 .read = read_memmapped,
6260 },
6261 {
6262 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
6263 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006264 .name = "M29F400BT",
Urja Rannikko038a3122009-06-28 19:19:25 +00006265 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006266 .manufacture_id = ST_ID,
6267 .model_id = ST_M29F400BT,
6268 .total_size = 512,
6269 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006270 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006271 .tested = TEST_UNTESTED,
6272 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006273 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006274 .block_erasers =
6275 {
6276 {
6277 .eraseblocks = {
6278 {64 * 1024, 7},
6279 {32 * 1024, 1},
6280 {8 * 1024, 2},
6281 {16 * 1024, 1},
6282 },
6283 .block_erase = block_erase_m29f400bt,
6284 }, {
6285 .eraseblocks = { {512 * 1024, 1} },
6286 .block_erase = block_erase_chip_m29f400bt,
6287 }
6288 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006289 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006290 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006291 },
6292
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006293 {
6294 .vendor = "ST",
6295 .name = "M29W010B",
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_M29W010B,
6299 .total_size = 128,
6300 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006301 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006302 .tested = TEST_UNTESTED,
6303 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006304 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006305 .block_erasers =
6306 {
6307 {
6308 .eraseblocks = { {16 * 1024, 8}, },
6309 .block_erase = erase_sector_jedec,
6310 }, {
6311 .eraseblocks = { {128 * 1024, 1} },
6312 .block_erase = erase_chip_block_jedec,
6313 }
6314 },
Sean Nelson35727f72010-01-28 23:55:12 +00006315 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006316 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006317 },
6318
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006319 {
6320 .vendor = "ST",
6321 .name = "M29W040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006322 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006323 .manufacture_id = ST_ID,
6324 .model_id = ST_M29W040B,
6325 .total_size = 512,
6326 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006327 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006328 .tested = TEST_UNTESTED,
6329 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006330 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006331 .block_erasers =
6332 {
6333 {
6334 .eraseblocks = { {64 * 1024, 8}, },
6335 .block_erase = erase_sector_jedec,
6336 }, {
6337 .eraseblocks = { {512 * 1024, 1} },
6338 .block_erase = erase_chip_block_jedec,
6339 }
6340 },
Sean Nelson35727f72010-01-28 23:55:12 +00006341 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006342 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006343 },
6344
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006345 {
6346 .vendor = "ST",
6347 .name = "M29W512B",
6348 .bustype = CHIP_BUSTYPE_PARALLEL,
6349 .manufacture_id = ST_ID,
6350 .model_id = ST_M29W512B,
6351 .total_size = 64,
6352 .page_size = 64 * 1024,
6353 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6354 .tested = TEST_OK_PREW,
6355 .probe = probe_jedec,
6356 .probe_timing = TIMING_ZERO,
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006357 .block_erasers =
6358 {
6359 {
6360 .eraseblocks = { {64 * 1024, 1} },
6361 .block_erase = erase_chip_block_jedec,
6362 }
6363 },
6364 .write = write_jedec_1,
6365 .read = read_memmapped,
6366 },
6367
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006368 {
6369 .vendor = "ST",
6370 .name = "M50FLW040A",
Sean Nelson35727f72010-01-28 23:55:12 +00006371 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006372 .manufacture_id = ST_ID,
6373 .model_id = ST_M50FLW040A,
6374 .total_size = 512,
6375 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006376 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006377 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006378 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006379 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006380 .block_erasers =
6381 {
6382 {
Sean Nelson329bde72010-01-19 16:39:19 +00006383 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006384 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006385 {64 * 1024, 5}, /* block */
6386 {4 * 1024, 16}, /* sector */
6387 {4 * 1024, 16}, /* sector */
6388 },
6389 .block_erase = NULL,
6390 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006391 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006392 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006393 }, {
6394 .eraseblocks = { {512 * 1024, 1} },
6395 .block_erase = erase_chip_stm50flw0x0x,
6396 }
6397 },
Sean Nelson28accc22010-03-19 18:47:06 +00006398 .unlock = unlock_stm50flw0x0x,
6399 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006400 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006401 },
6402
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006403 {
6404 .vendor = "ST",
6405 .name = "M50FLW040B",
Sean Nelson35727f72010-01-28 23:55:12 +00006406 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006407 .manufacture_id = ST_ID,
6408 .model_id = ST_M50FLW040B,
6409 .total_size = 512,
6410 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006411 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006412 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006413 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006414 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006415 .block_erasers =
6416 {
6417 {
Sean Nelson329bde72010-01-19 16:39:19 +00006418 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006419 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006420 {4 * 1024, 16}, /* sector */
6421 {64 * 1024, 5}, /* block */
6422 {4 * 1024, 16}, /* sector */
6423 },
6424 .block_erase = NULL,
6425 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006426 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006427 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006428 }, {
6429 .eraseblocks = { {512 * 1024, 1} },
6430 .block_erase = erase_chip_stm50flw0x0x,
6431 }
6432 },
Sean Nelson28accc22010-03-19 18:47:06 +00006433 .unlock = unlock_stm50flw0x0x,
6434 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006435 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006436 },
6437
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006438 {
6439 .vendor = "ST",
6440 .name = "M50FLW080A",
Sean Nelson35727f72010-01-28 23:55:12 +00006441 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006442 .manufacture_id = ST_ID,
6443 .model_id = ST_M50FLW080A,
6444 .total_size = 1024,
6445 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006446 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00006447 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006448 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006449 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006450 .block_erasers =
6451 {
6452 {
Sean Nelson329bde72010-01-19 16:39:19 +00006453 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006454 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006455 {64 * 1024, 13}, /* block */
6456 {4 * 1024, 16}, /* sector */
6457 {4 * 1024, 16}, /* sector */
6458 },
6459 .block_erase = NULL,
6460 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006461 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006462 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006463 }, {
6464 .eraseblocks = { {1024 * 1024, 1} },
6465 .block_erase = erase_chip_stm50flw0x0x,
6466 }
6467 },
Sean Nelson28accc22010-03-19 18:47:06 +00006468 .unlock = unlock_stm50flw0x0x,
6469 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006470 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006471 },
6472
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006473 {
6474 .vendor = "ST",
6475 .name = "M50FLW080B",
Sean Nelson35727f72010-01-28 23:55:12 +00006476 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006477 .manufacture_id = ST_ID,
6478 .model_id = ST_M50FLW080B,
6479 .total_size = 1024,
6480 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006481 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006482 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006483 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006484 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006485 .block_erasers =
6486 {
6487 {
Sean Nelson329bde72010-01-19 16:39:19 +00006488 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +00006489 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +00006490 {4 * 1024, 16}, /* sector */
6491 {64 * 1024, 13}, /* block */
6492 {4 * 1024, 16}, /* sector */
6493 },
6494 .block_erase = NULL,
6495 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006496 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006497 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006498 }, {
6499 .eraseblocks = { {1024 * 1024, 1} },
6500 .block_erase = erase_chip_stm50flw0x0x,
6501 }
6502 },
Sean Nelson28accc22010-03-19 18:47:06 +00006503 .unlock = unlock_stm50flw0x0x,
6504 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006505 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006506 },
6507
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006508 {
6509 .vendor = "ST",
6510 .name = "M50FW002",
Urja Rannikko038a3122009-06-28 19:19:25 +00006511 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006512 .manufacture_id = ST_ID,
6513 .model_id = ST_M50FW002,
6514 .total_size = 256,
6515 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006516 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006517 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006518 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006519 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006520 .block_erasers =
6521 {
6522 {
6523 .eraseblocks = {
6524 {64 * 1024, 3},
6525 {32 * 1024, 1},
6526 {8 * 1024, 2},
6527 {16 * 1024, 1},
6528 },
Sean Nelson28accc22010-03-19 18:47:06 +00006529 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006530 }, {
6531 .eraseblocks = { {256 * 1024, 1} },
6532 .block_erase = erase_chip_stm50flw0x0x,
6533 }
6534 },
Sean Nelson28accc22010-03-19 18:47:06 +00006535 .unlock = unlock_stm50flw0x0x,
6536 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006537 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006538 },
6539
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006540 {
6541 .vendor = "ST",
6542 .name = "M50FW016",
Urja Rannikko038a3122009-06-28 19:19:25 +00006543 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006544 .manufacture_id = ST_ID,
6545 .model_id = ST_M50FW016,
6546 .total_size = 2048,
6547 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006548 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006549 .tested = TEST_UNTESTED,
6550 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006551 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006552 .block_erasers =
6553 {
6554 {
6555 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006556 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006557 }, {
6558 .eraseblocks = { {2 * 1024 * 1024, 1} },
6559 .block_erase = erase_chip_stm50flw0x0x,
6560 }
6561 },
Sean Nelson28accc22010-03-19 18:47:06 +00006562 .unlock = unlock_stm50flw0x0x,
6563 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006564 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006565 },
6566
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006567 {
6568 .vendor = "ST",
6569 .name = "M50FW040",
Urja Rannikko038a3122009-06-28 19:19:25 +00006570 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006571 .manufacture_id = ST_ID,
6572 .model_id = ST_M50FW040,
6573 .total_size = 512,
6574 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006575 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006576 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006577 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006578 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006579 .block_erasers =
6580 {
6581 {
6582 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006583 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006584 }, {
6585 .eraseblocks = { {512 * 1024, 1} },
6586 .block_erase = erase_chip_stm50flw0x0x,
6587 }
6588 },
Sean Nelson28accc22010-03-19 18:47:06 +00006589 .unlock = unlock_stm50flw0x0x,
6590 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006591 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006592 },
6593
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006594 {
6595 .vendor = "ST",
6596 .name = "M50FW080",
Urja Rannikko038a3122009-06-28 19:19:25 +00006597 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006598 .manufacture_id = ST_ID,
6599 .model_id = ST_M50FW080,
6600 .total_size = 1024,
6601 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006602 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006603 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006604 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006605 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006606 .block_erasers =
6607 {
6608 {
6609 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006610 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006611 }, {
6612 .eraseblocks = { {1024 * 1024, 1} },
6613 .block_erase = erase_chip_stm50flw0x0x,
6614 }
6615 },
Sean Nelson28accc22010-03-19 18:47:06 +00006616 .unlock = unlock_stm50flw0x0x,
6617 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006618 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006619 },
6620
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006621 {
6622 .vendor = "ST",
6623 .name = "M50LPW116",
Urja Rannikko038a3122009-06-28 19:19:25 +00006624 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006625 .manufacture_id = ST_ID,
6626 .model_id = ST_M50LPW116,
6627 .total_size = 2048,
6628 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006629 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006630 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006631 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +00006632 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006633 .block_erasers =
6634 {
6635 {
6636 .eraseblocks = {
6637 {4 * 1024, 16},
6638 {64 * 1024, 30},
6639 {32 * 1024, 1},
6640 {8 * 1024, 2},
6641 {16 * 1024, 1},
6642 },
Sean Nelson28accc22010-03-19 18:47:06 +00006643 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006644 }, {
6645 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006646 .block_erase = erase_chip_stm50flw0x0x,
Sean Nelson56358aa2010-01-19 16:08:51 +00006647 }
6648 },
Sean Nelson28accc22010-03-19 18:47:06 +00006649 .unlock = unlock_stm50flw0x0x,
6650 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006651 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006652 },
6653
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006654 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006655 .vendor = "SyncMOS/MoselVitelic",
6656 .name = "{F,S,V}29C51001B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006657 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006658 .manufacture_id = SYNCMOS_MVC_ID,
6659 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006660 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006661 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +00006662 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006663 .tested = TEST_UNTESTED,
6664 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006665 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006666 .block_erasers =
6667 {
6668 {
6669 .eraseblocks = { {512, 256} },
6670 .block_erase = erase_sector_jedec,
6671 }, {
6672 .eraseblocks = { {128 * 1024, 1} },
6673 .block_erase = erase_chip_block_jedec,
6674 },
6675 },
Sean Nelson35727f72010-01-28 23:55:12 +00006676 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006677 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006678 },
6679
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006680 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006681 .vendor = "SyncMOS/MoselVitelic",
6682 .name = "{F,S,V}29C51001T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006683 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006684 .manufacture_id = SYNCMOS_MVC_ID,
6685 .model_id = SM_MVC_29C51001T,
6686 .total_size = 128,
6687 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +00006688 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006689 .tested = TEST_UNTESTED,
6690 .probe = probe_jedec,
6691 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6692 .block_erasers =
6693 {
6694 {
6695 .eraseblocks = { {512, 256} },
6696 .block_erase = erase_sector_jedec,
6697 }, {
6698 .eraseblocks = { {128 * 1024, 1} },
6699 .block_erase = erase_chip_block_jedec,
6700 },
6701 },
6702 .write = write_jedec_1,
6703 .read = read_memmapped,
6704 },
6705
6706 {
6707 .vendor = "SyncMOS/MoselVitelic",
6708 .name = "{F,S,V}29C51002B",
6709 .bustype = CHIP_BUSTYPE_PARALLEL,
6710 .manufacture_id = SYNCMOS_MVC_ID,
6711 .model_id = SM_MVC_29C51002B,
6712 .total_size = 256,
6713 .page_size = 512,
6714 .feature_bits = FEATURE_EITHER_RESET,
6715 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006716 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006717 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006718 .block_erasers =
6719 {
6720 {
6721 .eraseblocks = { {512, 512} },
6722 .block_erase = erase_sector_jedec,
6723 }, {
6724 .eraseblocks = { {256 * 1024, 1} },
6725 .block_erase = erase_chip_block_jedec,
6726 },
6727 },
Sean Nelson35727f72010-01-28 23:55:12 +00006728 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006729 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006730 },
6731
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006732 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006733 .vendor = "SyncMOS/MoselVitelic",
6734 .name = "{F,S,V}29C51002T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006735 .bustype = CHIP_BUSTYPE_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006736 .manufacture_id = SYNCMOS_MVC_ID,
6737 .model_id = SM_MVC_29C51002T,
6738 .total_size = 256,
6739 .page_size = 512,
6740 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann431f4f72010-09-05 12:41:25 +00006741 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006742 .probe = probe_jedec,
6743 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6744 .block_erasers =
6745 {
6746 {
6747 .eraseblocks = { {512, 512} },
6748 .block_erase = erase_sector_jedec,
6749 }, {
6750 .eraseblocks = { {256 * 1024, 1} },
6751 .block_erase = erase_chip_block_jedec,
6752 },
6753 },
6754 .write = write_jedec_1,
6755 .read = read_memmapped,
6756 },
6757
6758 {
6759 .vendor = "SyncMOS/MoselVitelic",
6760 .name = "{F,S,V}29C51004B",
6761 .bustype = CHIP_BUSTYPE_PARALLEL,
6762 .manufacture_id = SYNCMOS_MVC_ID,
6763 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006764 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +00006765 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006766 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006767 .tested = TEST_UNTESTED,
6768 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006769 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006770 .block_erasers =
6771 {
6772 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00006773 .eraseblocks = { {1024, 512} },
6774 .block_erase = erase_sector_jedec,
6775 }, {
6776 .eraseblocks = { {512 * 1024, 1} },
6777 .block_erase = erase_chip_block_jedec,
6778 },
6779 },
6780 .write = write_jedec_1,
6781 .read = read_memmapped,
6782 },
6783
6784 {
6785 .vendor = "SyncMOS/MoselVitelic",
6786 .name = "{F,S,V}29C51004T",
6787 .bustype = CHIP_BUSTYPE_PARALLEL,
6788 .manufacture_id = SYNCMOS_MVC_ID,
6789 .model_id = SM_MVC_29C51004T,
6790 .total_size = 512,
6791 .page_size = 1024,
6792 .feature_bits = FEATURE_EITHER_RESET,
6793 .tested = TEST_UNTESTED,
6794 .probe = probe_jedec,
6795 .probe_timing = TIMING_ZERO,
6796 .block_erasers =
6797 {
6798 {
6799 .eraseblocks = { {1024, 512} },
6800 .block_erase = erase_sector_jedec,
6801 }, {
6802 .eraseblocks = { {512 * 1024, 1} },
6803 .block_erase = erase_chip_block_jedec,
6804 },
6805 },
6806 .write = write_jedec_1,
6807 .read = read_memmapped,
6808 },
6809
6810 {
6811 .vendor = "SyncMOS/MoselVitelic",
6812 .name = "{S,V}29C31004B",
6813 .bustype = CHIP_BUSTYPE_PARALLEL,
6814 .manufacture_id = SYNCMOS_MVC_ID,
6815 .model_id = SM_MVC_29C31004B,
6816 .total_size = 512,
6817 .page_size = 1024,
6818 .feature_bits = FEATURE_EITHER_RESET,
6819 .tested = TEST_UNTESTED,
6820 .probe = probe_jedec,
6821 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6822 .block_erasers =
6823 {
6824 {
6825 .eraseblocks = { {1024, 512} },
6826 .block_erase = erase_sector_jedec,
6827 }, {
6828 .eraseblocks = { {512 * 1024, 1} },
6829 .block_erase = erase_chip_block_jedec,
6830 },
6831 },
6832 .write = write_jedec_1,
6833 .read = read_memmapped,
6834 },
6835
6836 {
6837 .vendor = "SyncMOS/MoselVitelic",
6838 .name = "{S,V}29C31004T",
6839 .bustype = CHIP_BUSTYPE_PARALLEL,
6840 .manufacture_id = SYNCMOS_MVC_ID,
6841 .model_id = SM_MVC_29C31004T,
6842 .total_size = 512,
6843 .page_size = 1024,
6844 .feature_bits = FEATURE_EITHER_RESET,
6845 .tested = TEST_UNTESTED,
6846 .probe = probe_jedec,
6847 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6848 .block_erasers =
6849 {
6850 {
6851 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +00006852 .block_erase = erase_sector_jedec,
6853 }, {
6854 .eraseblocks = { {512 * 1024, 1} },
6855 .block_erase = erase_chip_block_jedec,
6856 },
6857 },
Sean Nelson35727f72010-01-28 23:55:12 +00006858 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006859 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006860 },
6861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006862 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006863 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006864 .name = "TMS29F002RB",
Urja Rannikko038a3122009-06-28 19:19:25 +00006865 .bustype = CHIP_BUSTYPE_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006866 .manufacture_id = TI_OLD_ID,
6867 .model_id = TI_TMS29F002RB,
6868 .total_size = 256,
6869 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +00006870 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006871 .tested = TEST_UNTESTED,
6872 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006873 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006874 .block_erasers =
6875 {
6876 {
6877 .eraseblocks = {
6878 {16 * 1024, 1},
6879 {8 * 1024, 2},
6880 {32 * 1024, 1},
6881 {64 * 1024, 3},
6882 },
6883 .block_erase = erase_sector_jedec,
6884 }, {
6885 .eraseblocks = { {256 * 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 Hailfinger09b4fb72009-05-26 21:26:23 +00006890 .read = read_memmapped,
6891 },
6892
6893 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006894 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006895 .name = "TMS29F002RT",
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_TMS29F002RT,
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 {64 * 1024, 3},
6910 {32 * 1024, 1},
6911 {8 * 1024, 2},
6912 {16 * 1024, 1},
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 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006925 .vendor = "Winbond",
Rudolf Marekce1c7982010-04-20 19:34:31 +00006926 .name = "W25Q80",
6927 .bustype = CHIP_BUSTYPE_SPI,
6928 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00006929 .model_id = WINBOND_NEX_W25Q80,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006930 .total_size = 1024,
6931 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00006932 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00006933 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006934 .probe = probe_spi_rdid,
6935 .probe_timing = TIMING_ZERO,
6936 .block_erasers =
6937 {
6938 {
6939 .eraseblocks = { {4 * 1024, 256} },
6940 .block_erase = spi_block_erase_20,
6941 }, {
6942 .eraseblocks = { {32 * 1024, 32} },
6943 .block_erase = spi_block_erase_52,
6944 }, {
6945 .eraseblocks = { {64 * 1024, 16} },
6946 .block_erase = spi_block_erase_d8,
6947 }, {
6948 .eraseblocks = { {1024 * 1024, 1} },
6949 .block_erase = spi_block_erase_60,
6950 }, {
6951 .eraseblocks = { {1024 * 1024, 1} },
6952 .block_erase = spi_block_erase_c7,
6953 }
6954 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006955 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006956 .write = spi_chip_write_256,
6957 .read = spi_chip_read,
6958 },
6959
6960 {
6961 .vendor = "Winbond",
6962 .name = "W25Q16",
6963 .bustype = CHIP_BUSTYPE_SPI,
6964 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00006965 .model_id = WINBOND_NEX_W25Q16,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006966 .total_size = 2048,
6967 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00006968 .feature_bits = FEATURE_WRSR_WREN,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006969 .tested = TEST_UNTESTED,
6970 .probe = probe_spi_rdid,
6971 .probe_timing = TIMING_ZERO,
6972 .block_erasers =
6973 {
6974 {
6975 .eraseblocks = { {4 * 1024, 512} },
6976 .block_erase = spi_block_erase_20,
6977 }, {
6978 .eraseblocks = { {32 * 1024, 64} },
6979 .block_erase = spi_block_erase_52,
6980 }, {
6981 .eraseblocks = { {64 * 1024, 32} },
6982 .block_erase = spi_block_erase_d8,
6983 }, {
6984 .eraseblocks = { {2 * 1024 * 1024, 1} },
6985 .block_erase = spi_block_erase_60,
6986 }, {
6987 .eraseblocks = { {2 * 1024 * 1024, 1} },
6988 .block_erase = spi_block_erase_c7,
6989 }
6990 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006991 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006992 .write = spi_chip_write_256,
6993 .read = spi_chip_read,
6994 },
6995
6996 {
6997 .vendor = "Winbond",
6998 .name = "W25Q32",
6999 .bustype = CHIP_BUSTYPE_SPI,
7000 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007001 .model_id = WINBOND_NEX_W25Q32,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007002 .total_size = 4096,
7003 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007004 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger9017cec2010-09-04 23:37:40 +00007005 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007006 .probe = probe_spi_rdid,
7007 .probe_timing = TIMING_ZERO,
7008 .block_erasers =
7009 {
7010 {
7011 .eraseblocks = { {4 * 1024, 1024} },
7012 .block_erase = spi_block_erase_20,
7013 }, {
7014 .eraseblocks = { {32 * 1024, 128} },
7015 .block_erase = spi_block_erase_52,
7016 }, {
7017 .eraseblocks = { {64 * 1024, 64} },
7018 .block_erase = spi_block_erase_d8,
7019 }, {
7020 .eraseblocks = { {4 * 1024 * 1024, 1} },
7021 .block_erase = spi_block_erase_60,
7022 }, {
7023 .eraseblocks = { {4 * 1024 * 1024, 1} },
7024 .block_erase = spi_block_erase_c7,
7025 }
7026 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007027 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00007028 .write = spi_chip_write_256,
7029 .read = spi_chip_read,
7030 },
7031
7032 {
7033 .vendor = "Winbond",
David Hendricksc4acec92010-06-24 11:39:57 +00007034 .name = "W25Q64",
7035 .bustype = CHIP_BUSTYPE_SPI,
7036 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007037 .model_id = WINBOND_NEX_W25Q64,
David Hendricksc4acec92010-06-24 11:39:57 +00007038 .total_size = 8192,
7039 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007040 .feature_bits = FEATURE_WRSR_WREN,
David Hendricksc4acec92010-06-24 11:39:57 +00007041 .tested = TEST_OK_PRW,
7042 .probe = probe_spi_rdid,
7043 .probe_timing = TIMING_ZERO,
7044 .block_erasers =
7045 {
7046 {
7047 .eraseblocks = { {4 * 1024, 2048} },
7048 .block_erase = spi_block_erase_20,
7049 }, {
7050 .eraseblocks = { {32 * 1024, 256} },
7051 .block_erase = spi_block_erase_52,
7052 }, {
7053 .eraseblocks = { {64 * 1024, 128} },
7054 .block_erase = spi_block_erase_d8,
7055 }, {
7056 .eraseblocks = { {8 * 1024 * 1024, 1} },
7057 .block_erase = spi_block_erase_60,
7058 }, {
7059 .eraseblocks = { {8 * 1024 * 1024, 1} },
7060 .block_erase = spi_block_erase_c7,
7061 }
7062 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007063 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +00007064 .write = spi_chip_write_256,
7065 .read = spi_chip_read,
7066 },
7067
7068 {
7069 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007070 .name = "W25x10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007071 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007072 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007073 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007074 .total_size = 128,
7075 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007076 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007077 .tested = TEST_UNTESTED,
7078 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007079 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007080 .block_erasers =
7081 {
7082 {
7083 .eraseblocks = { {4 * 1024, 32} },
7084 .block_erase = spi_block_erase_20,
7085 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007086 .eraseblocks = { {64 * 1024, 2} },
7087 .block_erase = spi_block_erase_d8,
7088 }, {
7089 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007090 .block_erase = spi_block_erase_c7,
7091 }
7092 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007093 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007094 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007095 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007096 },
7097
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007098 {
7099 .vendor = "Winbond",
7100 .name = "W25x20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007101 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007102 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007103 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007104 .total_size = 256,
7105 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007106 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007107 .tested = TEST_UNTESTED,
7108 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007109 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007110 .block_erasers =
7111 {
7112 {
7113 .eraseblocks = { {4 * 1024, 64} },
7114 .block_erase = spi_block_erase_20,
7115 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007116 .eraseblocks = { {64 * 1024, 4} },
7117 .block_erase = spi_block_erase_d8,
7118 }, {
7119 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007120 .block_erase = spi_block_erase_c7,
7121 }
7122 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007123 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007124 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007125 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007126 },
7127
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007128 {
7129 .vendor = "Winbond",
7130 .name = "W25x40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007131 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007132 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007133 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007134 .total_size = 512,
7135 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007136 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007137 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007138 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007139 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007140 .block_erasers =
7141 {
7142 {
7143 .eraseblocks = { {4 * 1024, 128} },
7144 .block_erase = spi_block_erase_20,
7145 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007146 .eraseblocks = { {64 * 1024, 8} },
7147 .block_erase = spi_block_erase_d8,
7148 }, {
7149 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007150 .block_erase = spi_block_erase_c7,
7151 }
7152 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007153 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007154 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007155 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007156 },
7157
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007158 {
7159 .vendor = "Winbond",
7160 .name = "W25x80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007161 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007162 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007163 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007164 .total_size = 1024,
7165 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007166 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007167 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007168 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007169 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007170 .block_erasers =
7171 {
7172 {
7173 .eraseblocks = { {4 * 1024, 256} },
7174 .block_erase = spi_block_erase_20,
7175 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007176 .eraseblocks = { {64 * 1024, 16} },
7177 .block_erase = spi_block_erase_d8,
7178 }, {
7179 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007180 .block_erase = spi_block_erase_c7,
7181 }
7182 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007183 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007184 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007185 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00007186 },
7187
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007188 {
7189 .vendor = "Winbond",
Hector Martina721ae22009-07-11 19:39:11 +00007190 .name = "W25x16",
7191 .bustype = CHIP_BUSTYPE_SPI,
7192 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007193 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +00007194 .total_size = 2048,
7195 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007196 .feature_bits = FEATURE_WRSR_WREN,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007197 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +00007198 .probe = probe_spi_rdid,
7199 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007200 .block_erasers =
7201 {
7202 {
7203 .eraseblocks = { {4 * 1024, 512} },
7204 .block_erase = spi_block_erase_20,
7205 }, {
7206 .eraseblocks = { {32 * 1024, 64} },
7207 .block_erase = spi_block_erase_52,
7208 }, {
7209 .eraseblocks = { {64 * 1024, 32} },
7210 .block_erase = spi_block_erase_d8,
7211 }, {
7212 .eraseblocks = { {2 * 1024 * 1024, 1} },
7213 .block_erase = spi_block_erase_60,
7214 }, {
7215 .eraseblocks = { {2 * 1024 * 1024, 1} },
7216 .block_erase = spi_block_erase_c7,
7217 }
7218 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007219 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +00007220 .write = spi_chip_write_256,
7221 .read = spi_chip_read,
7222 },
7223
7224 {
7225 .vendor = "Winbond",
Zheng Bao1db2b752009-11-26 11:05:01 +00007226 .name = "W25x32",
7227 .bustype = CHIP_BUSTYPE_SPI,
7228 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007229 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +00007230 .total_size = 4096,
7231 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007232 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +00007233 .tested = TEST_OK_PROBE,
7234 .probe = probe_spi_rdid,
7235 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007236 .block_erasers =
7237 {
7238 {
7239 .eraseblocks = { {4 * 1024, 1024} },
7240 .block_erase = spi_block_erase_20,
7241 }, {
7242 .eraseblocks = { {32 * 1024, 128} },
7243 .block_erase = spi_block_erase_52,
7244 }, {
7245 .eraseblocks = { {64 * 1024, 64} },
7246 .block_erase = spi_block_erase_d8,
7247 }, {
7248 .eraseblocks = { {4 * 1024 * 1024, 1} },
7249 .block_erase = spi_block_erase_60,
7250 }, {
7251 .eraseblocks = { {4 * 1024 * 1024, 1} },
7252 .block_erase = spi_block_erase_c7,
7253 }
7254 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007255 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00007256 .write = spi_chip_write_256,
7257 .read = spi_chip_read,
7258 },
7259
7260 {
7261 .vendor = "Winbond",
7262 .name = "W25x64",
7263 .bustype = CHIP_BUSTYPE_SPI,
7264 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007265 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +00007266 .total_size = 8192,
7267 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +00007268 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +00007269 .tested = TEST_UNTESTED,
7270 .probe = probe_spi_rdid,
7271 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007272 .block_erasers =
7273 {
7274 {
7275 .eraseblocks = { {4 * 1024, 2048} },
7276 .block_erase = spi_block_erase_20,
7277 }, {
7278 .eraseblocks = { {32 * 1024, 256} },
7279 .block_erase = spi_block_erase_52,
7280 }, {
7281 .eraseblocks = { {64 * 1024, 128} },
7282 .block_erase = spi_block_erase_d8,
7283 }, {
7284 .eraseblocks = { {8 * 1024 * 1024, 1} },
7285 .block_erase = spi_block_erase_60,
7286 }, {
7287 .eraseblocks = { {8 * 1024 * 1024, 1} },
7288 .block_erase = spi_block_erase_c7,
7289 }
7290 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007291 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00007292 .write = spi_chip_write_256,
7293 .read = spi_chip_read,
7294 },
7295
7296 {
7297 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007298 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Urja Rannikko038a3122009-06-28 19:19:25 +00007299 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007300 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007301 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007302 .total_size = 128,
7303 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007304 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00007305 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007306 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007307 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007308 .block_erasers =
7309 {
7310 {
7311 .eraseblocks = { {128 * 1024, 1} },
7312 .block_erase = erase_chip_block_jedec,
7313 }
7314 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007315 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007316 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007317 },
7318
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007319 {
7320 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007321 .name = "W29C020(C)/W29C022",
Urja Rannikko161b8852009-06-05 08:47:37 +00007322 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007323 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007324 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007325 .total_size = 256,
7326 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007327 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00007328 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007329 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007330 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007331 .block_erasers =
7332 {
7333 {
7334 .eraseblocks = { {256 * 1024, 1} },
7335 .block_erase = erase_chip_block_jedec,
7336 }
7337 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007338 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007339 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007340 },
7341
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007342 {
7343 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007344 .name = "W29C040/P",
Urja Rannikko161b8852009-06-05 08:47:37 +00007345 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007346 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007347 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007348 .total_size = 512,
7349 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00007350 .feature_bits = FEATURE_LONG_RESET,
7351 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007352 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007353 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007354 .block_erasers =
7355 {
7356 {
7357 .eraseblocks = { {512 * 1024, 1} },
7358 .block_erase = erase_chip_block_jedec,
7359 }
7360 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007361 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007362 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007363 },
7364
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007365 {
7366 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007367 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Urja Rannikko038a3122009-06-28 19:19:25 +00007368 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007369 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007370 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007371 .total_size = 128,
7372 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007373 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann1e94fa62010-08-08 15:52:07 +00007374 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007375 .probe = probe_w29ee011,
Maciej Pijankac6e11112009-06-03 14:46:22 +00007376 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (w29ee011.c) */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007377 .block_erasers =
7378 {
7379 {
7380 .eraseblocks = { {128 * 1024, 1} },
7381 .block_erase = erase_chip_block_jedec,
7382 }
7383 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007384 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007385 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007386 },
7387
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007388 {
7389 .vendor = "Winbond",
7390 .name = "W39V040A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007391 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007392 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007393 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007394 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007395 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007396 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcher3355f062010-03-24 22:56:23 +00007397 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007398 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007399 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007400 .block_erasers =
7401 {
7402 {
7403 .eraseblocks = { {64 * 1024, 8} },
7404 .block_erase = erase_sector_jedec,
7405 }, {
7406 .eraseblocks = { {512 * 1024, 1} },
7407 .block_erase = erase_chip_block_jedec,
7408 }
7409 },
Sean Nelson35727f72010-01-28 23:55:12 +00007410 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007411 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007412 },
7413
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007414 {
7415 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007416 .name = "W39V040(F)B",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007417 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007418 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007419 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007420 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007421 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007422 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00007423 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007424 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007425 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007426 .block_erasers =
7427 {
7428 {
7429 .eraseblocks = { {64 * 1024, 8} },
7430 .block_erase = erase_sector_jedec,
7431 }, {
7432 .eraseblocks = { {512 * 1024, 1} },
7433 .block_erase = erase_chip_block_jedec,
7434 }
7435 },
Sean Nelson35727f72010-01-28 23:55:12 +00007436 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007437 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007438 },
7439
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007440 {
7441 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007442 .name = "W39V040(F)C",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007443 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007444 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007445 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007446 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007447 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007448 .feature_bits = FEATURE_EITHER_RESET,
7449 .tested = TEST_UNTESTED,
7450 .probe = probe_jedec,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00007451 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007452 .block_erasers =
7453 {
7454 {
7455 .eraseblocks = { {64 * 1024, 8} },
7456 .block_erase = erase_sector_jedec,
7457 }, {
7458 .eraseblocks = { {512 * 1024, 1} },
7459 .block_erase = erase_chip_block_jedec,
7460 }
7461 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007462 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +00007463 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007464 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007465 },
7466
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007467 {
7468 .vendor = "Winbond",
7469 .name = "W39V040FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007470 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007471 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007472 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007473 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007474 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +00007475 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann41787602010-05-30 17:50:16 +00007476 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007477 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007478 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007479 .block_erasers =
7480 {
7481 {
7482 .eraseblocks = { {4 * 1024, 128} },
7483 .block_erase = erase_block_jedec,
7484 }, {
7485 .eraseblocks = { {64 * 1024, 8} },
7486 .block_erase = erase_sector_jedec,
7487 }, {
7488 .eraseblocks = { {512 * 1024, 1} },
7489 .block_erase = erase_chip_block_jedec,
7490 }
7491 },
Michael Karcherc9b63412010-05-30 16:55:18 +00007492 .printlock = printlock_sst_fwhub,
7493 .unlock = unlock_sst_fwhub,
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 = "W39V080A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007501 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007502 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007503 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007504 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007505 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007506 .feature_bits = FEATURE_EITHER_RESET,
7507 .tested = TEST_UNTESTED,
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 = { {64 * 1024, 16} },
7514 .block_erase = erase_sector_jedec,
7515 }, {
7516 .eraseblocks = { {1024 * 1024, 1} },
7517 .block_erase = erase_chip_block_jedec,
7518 }
7519 },
Sean Nelson35727f72010-01-28 23:55:12 +00007520 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007521 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007522 },
7523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007524 {
7525 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +00007526 .name = "W49F002U/N",
Urja Rannikko038a3122009-06-28 19:19:25 +00007527 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007528 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007529 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007530 .total_size = 256,
7531 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007532 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann51afebb2010-08-01 00:13:49 +00007533 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007534 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007535 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007536 .block_erasers =
7537 {
7538 {
7539 .eraseblocks = {
7540 {128 * 1024, 1},
7541 {96 * 1024, 1},
7542 {8 * 1024, 2},
7543 {16 * 1024, 1},
7544 },
7545 .block_erase = erase_sector_jedec,
7546 }, {
7547 .eraseblocks = { {256 * 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",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +00007557 .name = "W49F020",
7558 .bustype = CHIP_BUSTYPE_PARALLEL,
7559 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007560 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +00007561 .total_size = 256,
7562 .page_size = 128,
7563 .feature_bits = FEATURE_EITHER_RESET,
7564 .tested = TEST_OK_PROBE,
7565 .probe = probe_jedec,
7566 .probe_timing = 10,
7567 .block_erasers =
7568 {
7569 {
7570 .eraseblocks = { {256 * 1024, 1} },
7571 .block_erase = erase_chip_block_jedec,
7572 }
7573 },
7574 .write = write_jedec_1,
7575 .read = read_memmapped,
7576 },
7577
7578 {
7579 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007580 .name = "W49V002A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007581 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007582 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007583 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007584 .total_size = 256,
7585 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007586 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermannc2521ab2010-07-29 22:39:47 +00007587 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007588 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007589 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007590 .block_erasers =
7591 {
7592 {
7593 .eraseblocks = {
7594 {64 * 1024, 3},
7595 {32 * 1024, 1},
7596 {8 * 1024, 2},
7597 {16 * 1024, 1},
7598 },
7599 .block_erase = erase_sector_jedec,
7600 }, {
7601 .eraseblocks = { {256 * 1024, 1} },
7602 .block_erase = erase_chip_block_jedec,
7603 }
7604 },
Sean Nelson35727f72010-01-28 23:55:12 +00007605 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007606 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007607 },
7608
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007609 {
7610 .vendor = "Winbond",
7611 .name = "W49V002FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007612 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007613 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007614 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007615 .total_size = 256,
7616 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007617 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00007618 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007619 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +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 = "W39V080FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007643 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007644 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007645 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007646 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007647 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007648 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00007649 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007650 .probe = probe_jedec,
7651 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007652 .block_erasers =
7653 {
7654 {
7655 .eraseblocks = { {64 * 1024, 16}, },
7656 .block_erase = erase_sector_jedec,
7657 }, {
7658 .eraseblocks = { {1024 * 1024, 1} },
7659 .block_erase = erase_chip_block_jedec,
7660 }
7661 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007662 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007663 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007664 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007665 },
7666
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007667 {
7668 .vendor = "Winbond",
7669 .name = "W39V080FA (dual mode)",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007670 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007671 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +00007672 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007673 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007674 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007675 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007676 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007677 .probe = probe_jedec,
7678 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007679 .block_erasers =
7680 {
7681 {
7682 .eraseblocks = { {64 * 1024, 8}, },
7683 .block_erase = erase_sector_jedec,
7684 }, {
7685 .eraseblocks = { {512 * 1024, 1} },
7686 .block_erase = erase_chip_block_jedec,
7687 }
7688 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007689 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007690 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007691 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007692 },
7693
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007694 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00007695 .vendor = "AMIC",
7696 .name = "unknown AMIC SPI chip",
7697 .bustype = CHIP_BUSTYPE_SPI,
7698 .manufacture_id = AMIC_ID,
7699 .model_id = GENERIC_DEVICE_ID,
7700 .total_size = 0,
7701 .page_size = 256,
7702 .tested = TEST_BAD_PREW,
7703 .probe = probe_spi_rdid4,
7704 .probe_timing = TIMING_ZERO,
7705 .write = NULL,
7706 .read = NULL,
7707 },
7708
7709 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007710 .vendor = "Atmel",
7711 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007712 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007713 .manufacture_id = ATMEL_ID,
7714 .model_id = GENERIC_DEVICE_ID,
7715 .total_size = 0,
7716 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007717 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007718 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007719 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007720 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007721 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007722 },
7723
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007724 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00007725 .vendor = "Eon",
7726 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007727 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007728 .manufacture_id = EON_ID_NOPREFIX,
7729 .model_id = GENERIC_DEVICE_ID,
7730 .total_size = 0,
7731 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007732 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007733 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007734 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007735 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007736 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007737 },
7738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007739 {
7740 .vendor = "Macronix",
7741 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007742 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007743 .manufacture_id = MX_ID,
7744 .model_id = GENERIC_DEVICE_ID,
7745 .total_size = 0,
7746 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007747 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007748 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007749 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007750 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007751 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007752 },
7753
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007754 {
7755 .vendor = "PMC",
7756 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007757 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007758 .manufacture_id = PMC_ID,
7759 .model_id = GENERIC_DEVICE_ID,
7760 .total_size = 0,
7761 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007762 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007763 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007764 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007765 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007766 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007767 },
7768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007769 {
7770 .vendor = "SST",
7771 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007772 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007773 .manufacture_id = SST_ID,
7774 .model_id = GENERIC_DEVICE_ID,
7775 .total_size = 0,
7776 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007777 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007778 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007779 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007780 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007781 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007782 },
7783
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007784 {
7785 .vendor = "ST",
7786 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007787 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007788 .manufacture_id = ST_ID,
7789 .model_id = GENERIC_DEVICE_ID,
7790 .total_size = 0,
7791 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007792 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007793 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007794 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007795 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007796 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007797 },
Uwe Hermannfc425e82008-03-16 02:06:25 +00007798
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007799 {
Sean Nelson118e1d62009-11-24 02:08:11 +00007800 .vendor = "Sanyo",
7801 .name = "unknown Sanyo SPI chip",
7802 .bustype = CHIP_BUSTYPE_SPI,
7803 .manufacture_id = SANYO_ID,
7804 .model_id = GENERIC_DEVICE_ID,
7805 .total_size = 0,
7806 .page_size = 256,
7807 .tested = TEST_BAD_PREW,
7808 .probe = probe_spi_rdid,
7809 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +00007810 .write = NULL,
7811 .read = NULL,
7812 },
7813
7814 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007815 .vendor = "Generic",
7816 .name = "unknown SPI chip (RDID)",
7817 .bustype = CHIP_BUSTYPE_SPI,
7818 .manufacture_id = GENERIC_MANUF_ID,
7819 .model_id = GENERIC_DEVICE_ID,
7820 .total_size = 0,
7821 .page_size = 256,
7822 .tested = TEST_BAD_PREW,
7823 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007824 .write = NULL,
7825 },
7826 {
7827 .vendor = "Generic",
7828 .name = "unknown SPI chip (REMS)",
7829 .bustype = CHIP_BUSTYPE_SPI,
7830 .manufacture_id = GENERIC_MANUF_ID,
7831 .model_id = GENERIC_DEVICE_ID,
7832 .total_size = 0,
7833 .page_size = 256,
7834 .tested = TEST_BAD_PREW,
7835 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007836 .write = NULL,
7837 },
7838
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007839 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +00007840};