blob: efd7599d91f25656aa641d15baae63e8e17e9419 [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,
68 .tested = TEST_UNTESTED,
69 .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,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000234 .tested = TEST_UNTESTED,
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,
646 .tested = TEST_UNTESTED,
647 .probe = probe_spi_rdid,
648 .probe_timing = TIMING_ZERO,
649 .block_erasers =
650 {
651 {
652 .eraseblocks = { { 4 * 1024, 16 } },
653 .block_erase = spi_block_erase_20,
654 }, {
655 .eraseblocks = { { 64 * 1024, 1 } },
656 .block_erase = spi_block_erase_d8,
657 }, {
658 .eraseblocks = { { 64 * 1024, 1 } },
659 .block_erase = spi_block_erase_c7,
660 }
661 },
662 .unlock = spi_disable_blockprotect,
663 .write = spi_chip_write_256,
664 .read = spi_chip_read,
665 },
666
667 {
668 .vendor = "AMIC",
669 .name = "A25L010",
670 .bustype = CHIP_BUSTYPE_SPI,
671 .manufacture_id = AMIC_ID_NOPREFIX,
672 .model_id = AMIC_A25L010,
673 .total_size = 128,
674 .page_size = 256,
675 .tested = TEST_UNTESTED,
676 .probe = probe_spi_rdid,
677 .probe_timing = TIMING_ZERO,
678 .block_erasers =
679 {
680 {
681 .eraseblocks = { { 4 * 1024, 32 } },
682 .block_erase = spi_block_erase_20,
683 }, {
684 .eraseblocks = { { 64 * 1024, 2 } },
685 .block_erase = spi_block_erase_d8,
686 }, {
687 .eraseblocks = { { 128 * 1024, 1 } },
688 .block_erase = spi_block_erase_c7,
689 }
690 },
691 .unlock = spi_disable_blockprotect,
692 .write = spi_chip_write_256,
693 .read = spi_chip_read,
694 },
695
696 {
697 .vendor = "AMIC",
698 .name = "A25L020",
699 .bustype = CHIP_BUSTYPE_SPI,
700 .manufacture_id = AMIC_ID_NOPREFIX,
701 .model_id = AMIC_A25L020,
702 .total_size = 256,
703 .page_size = 256,
704 .tested = TEST_UNTESTED,
705 .probe = probe_spi_rdid,
706 .probe_timing = TIMING_ZERO,
707 .block_erasers =
708 {
709 {
710 .eraseblocks = { { 4 * 1024, 64 } },
711 .block_erase = spi_block_erase_20,
712 }, {
713 .eraseblocks = { { 64 * 1024, 4 } },
714 .block_erase = spi_block_erase_d8,
715 }, {
716 .eraseblocks = { { 256 * 1024, 1 } },
717 .block_erase = spi_block_erase_c7,
718 }
719 },
720 .unlock = spi_disable_blockprotect,
721 .write = spi_chip_write_256,
722 .read = spi_chip_read,
723 },
724
725 {
726 .vendor = "AMIC",
727 .name = "A25L040",
728 .bustype = CHIP_BUSTYPE_SPI,
729 .manufacture_id = AMIC_ID_NOPREFIX,
730 .model_id = AMIC_A25L040,
731 .total_size = 512,
732 .page_size = 256,
733 .tested = TEST_UNTESTED,
734 .probe = probe_spi_rdid,
735 .probe_timing = TIMING_ZERO,
736 .block_erasers =
737 {
738 {
739 .eraseblocks = { { 4 * 1024, 128 } },
740 .block_erase = spi_block_erase_20,
741 }, {
742 .eraseblocks = { { 64 * 1024, 8 } },
743 .block_erase = spi_block_erase_d8,
744 }, {
745 .eraseblocks = { { 512 * 1024, 1 } },
746 .block_erase = spi_block_erase_c7,
747 }
748 },
749 .unlock = spi_disable_blockprotect,
750 .write = spi_chip_write_256,
751 .read = spi_chip_read,
752 },
753
754 {
755 .vendor = "AMIC",
756 .name = "A25L080",
757 .bustype = CHIP_BUSTYPE_SPI,
758 .manufacture_id = AMIC_ID_NOPREFIX,
759 .model_id = AMIC_A25L080,
760 .total_size = 1024,
761 .page_size = 256,
762 .tested = TEST_UNTESTED,
763 .probe = probe_spi_rdid,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = { { 4 * 1024, 256 } },
769 .block_erase = spi_block_erase_20,
770 }, {
771 .eraseblocks = { { 64 * 1024, 16 } },
772 .block_erase = spi_block_erase_d8,
773 }, {
774 .eraseblocks = { { 1024 * 1024, 1 } },
775 .block_erase = spi_block_erase_c7,
776 }
777 },
778 .unlock = spi_disable_blockprotect,
779 .write = spi_chip_write_256,
780 .read = spi_chip_read,
781 },
782
783 {
784 .vendor = "AMIC",
785 .name = "A25L016",
786 .bustype = CHIP_BUSTYPE_SPI,
787 .manufacture_id = AMIC_ID_NOPREFIX,
788 .model_id = AMIC_A25L016,
789 .total_size = 2048,
790 .page_size = 256,
791 .tested = TEST_UNTESTED,
792 .probe = probe_spi_rdid,
793 .probe_timing = TIMING_ZERO,
794 .block_erasers =
795 {
796 {
797 .eraseblocks = { { 4 * 1024, 512 } },
798 .block_erase = spi_block_erase_20,
799 }, {
800 .eraseblocks = { { 64 * 1024, 32 } },
801 .block_erase = spi_block_erase_d8,
802 }, {
803 .eraseblocks = { { 2048 * 1024, 1 } },
804 .block_erase = spi_block_erase_c7,
805 }
806 },
807 .unlock = spi_disable_blockprotect,
808 .write = spi_chip_write_256,
809 .read = spi_chip_read,
810 },
811
812 {
813 .vendor = "AMIC",
814 .name = "A25L032",
815 .bustype = CHIP_BUSTYPE_SPI,
816 .manufacture_id = AMIC_ID_NOPREFIX,
817 .model_id = AMIC_A25L032,
818 .total_size = 4096,
819 .page_size = 256,
820 .tested = TEST_UNTESTED,
821 .probe = probe_spi_rdid,
822 .probe_timing = TIMING_ZERO,
823 .block_erasers =
824 {
825 {
826 .eraseblocks = { { 4 * 1024, 1024 } },
827 .block_erase = spi_block_erase_20,
828 }, {
829 .eraseblocks = { { 64 * 1024, 64 } },
830 .block_erase = spi_block_erase_52,
831 }, {
832 .eraseblocks = { { 64 * 1024, 64 } },
833 .block_erase = spi_block_erase_d8,
834 }, {
835 .eraseblocks = { { 4096 * 1024, 1 } },
836 .block_erase = spi_block_erase_60,
837 }, {
838 .eraseblocks = { { 4096 * 1024, 1 } },
839 .block_erase = spi_block_erase_c7,
840 }
841 },
842 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
843 .write = spi_chip_write_256,
844 .read = spi_chip_read,
845 },
846
847 {
848 .vendor = "AMIC",
849 .name = "A25LQ032",
850 .bustype = CHIP_BUSTYPE_SPI,
851 .manufacture_id = AMIC_ID_NOPREFIX,
852 .model_id = AMIC_A25LQ032,
853 .total_size = 4096,
854 .page_size = 256,
855 .tested = TEST_UNTESTED,
856 .probe = probe_spi_rdid,
857 .probe_timing = TIMING_ZERO,
858 .block_erasers =
859 {
860 {
861 .eraseblocks = { { 4 * 1024, 1024 } },
862 .block_erase = spi_block_erase_20,
863 }, {
864 .eraseblocks = { { 64 * 1024, 64 } },
865 .block_erase = spi_block_erase_52,
866 }, {
867 .eraseblocks = { { 64 * 1024, 64 } },
868 .block_erase = spi_block_erase_d8,
869 }, {
870 .eraseblocks = { { 4096 * 1024, 1 } },
871 .block_erase = spi_block_erase_60,
872 }, {
873 .eraseblocks = { { 4096 * 1024, 1 } },
874 .block_erase = spi_block_erase_c7,
875 }
876 },
877 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
878 .write = spi_chip_write_256,
879 .read = spi_chip_read,
880 },
881
882 {
883 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000884 .name = "A29002B",
885 .bustype = CHIP_BUSTYPE_PARALLEL,
886 .manufacture_id = AMIC_ID_NOPREFIX,
887 .model_id = AMIC_A29002B,
888 .total_size = 256,
889 .page_size = 64 * 1024,
890 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
891 .tested = TEST_UNTESTED,
892 .probe = probe_jedec,
893 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
894 .block_erasers =
895 {
896 {
897 .eraseblocks = {
898 {16 * 1024, 1},
899 {8 * 1024, 2},
900 {32 * 1024, 1},
901 {64 * 1024, 3},
902 },
903 .block_erase = erase_sector_jedec,
904 }, {
905 .eraseblocks = { {256 * 1024, 1} },
906 .block_erase = erase_chip_block_jedec,
907 },
908 },
909 .write = write_jedec_1,
910 .read = read_memmapped,
911 },
912
913 {
914 .vendor = "AMIC",
915 .name = "A29002T",
916 .bustype = CHIP_BUSTYPE_PARALLEL,
917 .manufacture_id = AMIC_ID_NOPREFIX,
918 .model_id = AMIC_A29002T,
919 .total_size = 256,
920 .page_size = 64 * 1024,
921 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
922 .tested = TEST_OK_PRW,
923 .probe = probe_jedec,
924 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
925 .block_erasers =
926 {
927 {
928 .eraseblocks = {
929 {64 * 1024, 3},
930 {32 * 1024, 1},
931 {8 * 1024, 2},
932 {16 * 1024, 1},
933 },
934 .block_erase = erase_sector_jedec,
935 }, {
936 .eraseblocks = { {256 * 1024, 1} },
937 .block_erase = erase_chip_block_jedec,
938 },
939 },
940 .write = write_jedec_1,
941 .read = read_memmapped,
942 },
943
944 {
945 .vendor = "AMIC",
946 .name = "A29040B",
947 .bustype = CHIP_BUSTYPE_PARALLEL,
948 .manufacture_id = AMIC_ID_NOPREFIX,
949 .model_id = AMIC_A29040B,
950 .total_size = 512,
951 .page_size = 64 * 1024,
952 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
953 .tested = TEST_UNTESTED,
954 .probe = probe_jedec,
955 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (am29f040b.c) */
956 .block_erasers =
957 {
958 {
959 .eraseblocks = { {64 * 1024, 8} },
960 .block_erase = erase_sector_jedec,
961 }, {
962 .eraseblocks = { {512 * 1024, 1} },
963 .block_erase = erase_chip_block_jedec,
964 },
965 },
966 .write = write_jedec_1,
967 .read = read_memmapped,
968 },
969
970 {
971 .vendor = "AMIC",
972 .name = "A49LF040A",
973 .bustype = CHIP_BUSTYPE_LPC,
974 .manufacture_id = AMIC_ID_NOPREFIX,
975 .model_id = AMIC_A49LF040A,
976 .total_size = 512,
977 .page_size = 64 * 1024,
978 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
979 .tested = TEST_OK_PREW,
980 .probe = probe_jedec,
981 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
982 .block_erasers =
983 {
984 {
985 .eraseblocks = { {64 * 1024, 8} },
986 .block_erase = erase_block_jedec,
987 }, {
988 .eraseblocks = { {512 * 1024, 1} },
989 .block_erase = erase_chip_block_jedec,
990 }
991 },
992 .unlock = unlock_49fl00x,
993 .write = write_jedec_1,
994 .read = read_memmapped,
995 },
996
997 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000998 .vendor = "ASD",
999 .name = "AE49F2008",
Urja Rannikko038a3122009-06-28 19:19:25 +00001000 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001001 .manufacture_id = ASD_ID,
1002 .model_id = ASD_AE49F2008,
1003 .total_size = 256,
1004 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001005 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001006 .tested = TEST_UNTESTED,
1007 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001008 .probe_timing = TIMING_FIXME,
Sean Nelson54596372010-01-09 05:30:14 +00001009 .block_erasers =
1010 {
1011 {
1012 .eraseblocks = {
1013 {128 * 1024, 1},
1014 {96 * 1024, 1},
1015 {8 * 1024, 2},
1016 {16 * 1024, 1},
1017 },
1018 .block_erase = erase_sector_jedec,
1019 }, {
1020 .eraseblocks = { {256 * 1024, 1} },
1021 .block_erase = erase_chip_block_jedec,
1022 }
1023 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001024 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001025 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001026 },
1027
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001028 {
1029 .vendor = "Atmel",
1030 .name = "AT25DF021",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001031 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001032 .manufacture_id = ATMEL_ID,
1033 .model_id = AT_25DF021,
1034 .total_size = 256,
1035 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001036 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001037 .tested = TEST_UNTESTED,
1038 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001039 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001040 .block_erasers =
1041 {
1042 {
1043 .eraseblocks = { {4 * 1024, 64} },
1044 .block_erase = spi_block_erase_20,
1045 }, {
1046 .eraseblocks = { {32 * 1024, 8} },
1047 .block_erase = spi_block_erase_52,
1048 }, {
1049 .eraseblocks = { {64 * 1024, 4} },
1050 .block_erase = spi_block_erase_d8,
1051 }, {
1052 .eraseblocks = { {256 * 1024, 1} },
1053 .block_erase = spi_block_erase_60,
1054 }, {
1055 .eraseblocks = { {256 * 1024, 1} },
1056 .block_erase = spi_block_erase_c7,
1057 }
1058 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001059 .printlock = spi_prettyprint_status_register_at25df,
1060 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001061 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001062 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001063 },
1064
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001065 {
1066 .vendor = "Atmel",
1067 .name = "AT25DF041A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001068 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001069 .manufacture_id = ATMEL_ID,
1070 .model_id = AT_25DF041A,
1071 .total_size = 512,
1072 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001073 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001074 .tested = TEST_UNTESTED,
1075 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001076 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001077 .block_erasers =
1078 {
1079 {
1080 .eraseblocks = { {4 * 1024, 128} },
1081 .block_erase = spi_block_erase_20,
1082 }, {
1083 .eraseblocks = { {32 * 1024, 16} },
1084 .block_erase = spi_block_erase_52,
1085 }, {
1086 .eraseblocks = { {64 * 1024, 8} },
1087 .block_erase = spi_block_erase_d8,
1088 }, {
1089 .eraseblocks = { {512 * 1024, 1} },
1090 .block_erase = spi_block_erase_60,
1091 }, {
1092 .eraseblocks = { {512 * 1024, 1} },
1093 .block_erase = spi_block_erase_c7,
1094 }
1095 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001096 .printlock = spi_prettyprint_status_register_at25df,
1097 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001098 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001099 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001100 },
1101
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001102 {
1103 .vendor = "Atmel",
1104 .name = "AT25DF081",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001105 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001106 .manufacture_id = ATMEL_ID,
1107 .model_id = AT_25DF081,
1108 .total_size = 1024,
1109 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001110 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001111 .tested = TEST_UNTESTED,
1112 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001113 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001114 .block_erasers =
1115 {
1116 {
1117 .eraseblocks = { {4 * 1024, 256} },
1118 .block_erase = spi_block_erase_20,
1119 }, {
1120 .eraseblocks = { {32 * 1024, 32} },
1121 .block_erase = spi_block_erase_52,
1122 }, {
1123 .eraseblocks = { {64 * 1024, 16} },
1124 .block_erase = spi_block_erase_d8,
1125 }, {
1126 .eraseblocks = { {1024 * 1024, 1} },
1127 .block_erase = spi_block_erase_60,
1128 }, {
1129 .eraseblocks = { {1024 * 1024, 1} },
1130 .block_erase = spi_block_erase_c7,
1131 }
1132 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001133 .printlock = spi_prettyprint_status_register_at25df,
1134 .unlock = spi_disable_blockprotect_at25df,
1135 .write = spi_chip_write_256,
1136 .read = spi_chip_read,
1137 },
1138
1139 {
1140 .vendor = "Atmel",
1141 .name = "AT25DF081A",
1142 .bustype = CHIP_BUSTYPE_SPI,
1143 .manufacture_id = ATMEL_ID,
1144 .model_id = AT_25DF081A,
1145 .total_size = 1024,
1146 .page_size = 256,
1147 .feature_bits = FEATURE_WRSR_WREN,
1148 .tested = TEST_UNTESTED,
1149 .probe = probe_spi_rdid,
1150 .probe_timing = TIMING_ZERO,
1151 .block_erasers =
1152 {
1153 {
1154 .eraseblocks = { {4 * 1024, 256} },
1155 .block_erase = spi_block_erase_20,
1156 }, {
1157 .eraseblocks = { {32 * 1024, 32} },
1158 .block_erase = spi_block_erase_52,
1159 }, {
1160 .eraseblocks = { {64 * 1024, 16} },
1161 .block_erase = spi_block_erase_d8,
1162 }, {
1163 .eraseblocks = { {1024 * 1024, 1} },
1164 .block_erase = spi_block_erase_60,
1165 }, {
1166 .eraseblocks = { {1024 * 1024, 1} },
1167 .block_erase = spi_block_erase_c7,
1168 }
1169 },
1170 .printlock = spi_prettyprint_status_register_at25df_sec,
1171 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001172 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001173 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001174 },
1175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001176 {
1177 .vendor = "Atmel",
1178 .name = "AT25DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001179 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001180 .manufacture_id = ATMEL_ID,
1181 .model_id = AT_25DF161,
1182 .total_size = 2048,
1183 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001184 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001185 .tested = TEST_UNTESTED,
1186 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001187 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001188 .block_erasers =
1189 {
1190 {
1191 .eraseblocks = { {4 * 1024, 512} },
1192 .block_erase = spi_block_erase_20,
1193 }, {
1194 .eraseblocks = { {32 * 1024, 64} },
1195 .block_erase = spi_block_erase_52,
1196 }, {
1197 .eraseblocks = { {64 * 1024, 32} },
1198 .block_erase = spi_block_erase_d8,
1199 }, {
1200 .eraseblocks = { {2 * 1024 * 1024, 1} },
1201 .block_erase = spi_block_erase_60,
1202 }, {
1203 .eraseblocks = { {2 * 1024 * 1024, 1} },
1204 .block_erase = spi_block_erase_c7,
1205 }
1206 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001207 .printlock = spi_prettyprint_status_register_at25df_sec,
1208 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001209 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001210 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001211 },
1212
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001213 {
1214 .vendor = "Atmel",
1215 .name = "AT25DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001216 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001217 .manufacture_id = ATMEL_ID,
1218 .model_id = AT_25DF321,
1219 .total_size = 4096,
1220 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001221 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson89187292009-12-23 12:02:55 +00001222 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001223 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001224 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001225 .block_erasers =
1226 {
1227 {
1228 .eraseblocks = { {4 * 1024, 1024} },
1229 .block_erase = spi_block_erase_20,
1230 }, {
1231 .eraseblocks = { {32 * 1024, 128} },
1232 .block_erase = spi_block_erase_52,
1233 }, {
1234 .eraseblocks = { {64 * 1024, 64} },
1235 .block_erase = spi_block_erase_d8,
1236 }, {
1237 .eraseblocks = { {4 * 1024 * 1024, 1} },
1238 .block_erase = spi_block_erase_60,
1239 }, {
1240 .eraseblocks = { {4 * 1024 * 1024, 1} },
1241 .block_erase = spi_block_erase_c7,
1242 }
1243 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001244 .printlock = spi_prettyprint_status_register_at25df,
1245 .unlock = spi_disable_blockprotect_at25df,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001246 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001247 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001248 },
1249
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001250 {
1251 .vendor = "Atmel",
1252 .name = "AT25DF321A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001253 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001254 .manufacture_id = ATMEL_ID,
1255 .model_id = AT_25DF321A,
1256 .total_size = 4096,
1257 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001258 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001259 .tested = TEST_UNTESTED,
1260 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001261 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001262 .block_erasers =
1263 {
1264 {
1265 .eraseblocks = { {4 * 1024, 1024} },
1266 .block_erase = spi_block_erase_20,
1267 }, {
1268 .eraseblocks = { {32 * 1024, 128} },
1269 .block_erase = spi_block_erase_52,
1270 }, {
1271 .eraseblocks = { {64 * 1024, 64} },
1272 .block_erase = spi_block_erase_d8,
1273 }, {
1274 .eraseblocks = { {4 * 1024 * 1024, 1} },
1275 .block_erase = spi_block_erase_60,
1276 }, {
1277 .eraseblocks = { {4 * 1024 * 1024, 1} },
1278 .block_erase = spi_block_erase_c7,
1279 }
1280 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001281 .printlock = spi_prettyprint_status_register_at25df_sec,
1282 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001283 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001284 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001285 },
1286
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001287 {
1288 .vendor = "Atmel",
1289 .name = "AT25DF641",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001290 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001291 .manufacture_id = ATMEL_ID,
1292 .model_id = AT_25DF641,
1293 .total_size = 8192,
1294 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001295 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001296 .tested = TEST_UNTESTED,
1297 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001298 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001299 .block_erasers =
1300 {
1301 {
1302 .eraseblocks = { {4 * 1024, 2048} },
1303 .block_erase = spi_block_erase_20,
1304 }, {
1305 .eraseblocks = { {32 * 1024, 256} },
1306 .block_erase = spi_block_erase_52,
1307 }, {
1308 .eraseblocks = { {64 * 1024, 128} },
1309 .block_erase = spi_block_erase_d8,
1310 }, {
1311 .eraseblocks = { {8 * 1024 * 1024, 1} },
1312 .block_erase = spi_block_erase_60,
1313 }, {
1314 .eraseblocks = { {8 * 1024 * 1024, 1} },
1315 .block_erase = spi_block_erase_c7,
1316 }
1317 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001318 .printlock = spi_prettyprint_status_register_at25df_sec,
1319 .unlock = spi_disable_blockprotect_at25df_sec,
1320 .write = spi_chip_write_256,
1321 .read = spi_chip_read,
1322 },
1323
1324 {
1325 .vendor = "Atmel",
1326 .name = "AT25DQ161",
1327 .bustype = CHIP_BUSTYPE_SPI,
1328 .manufacture_id = ATMEL_ID,
1329 .model_id = AT_25DQ161,
1330 .total_size = 2048,
1331 .page_size = 256,
1332 .feature_bits = FEATURE_WRSR_WREN,
1333 .tested = TEST_UNTESTED,
1334 .probe = probe_spi_rdid,
1335 .probe_timing = TIMING_ZERO,
1336 .block_erasers =
1337 {
1338 {
1339 .eraseblocks = { {4 * 1024, 512} },
1340 .block_erase = spi_block_erase_20,
1341 }, {
1342 .eraseblocks = { {32 * 1024, 64} },
1343 .block_erase = spi_block_erase_52,
1344 }, {
1345 .eraseblocks = { {64 * 1024, 32} },
1346 .block_erase = spi_block_erase_d8,
1347 }, {
1348 .eraseblocks = { {2 * 1024 * 1024, 1} },
1349 .block_erase = spi_block_erase_60,
1350 }, {
1351 .eraseblocks = { {2 * 1024 * 1024, 1} },
1352 .block_erase = spi_block_erase_c7,
1353 }
1354 },
1355 .printlock = spi_prettyprint_status_register_at25df_sec,
1356 .unlock = spi_disable_blockprotect_at25df_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001357 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001358 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001359 },
1360
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001361 {
1362 .vendor = "Atmel",
1363 .name = "AT25F512B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001364 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001365 .manufacture_id = ATMEL_ID,
1366 .model_id = AT_25F512B,
1367 .total_size = 64,
1368 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001369 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001370 .tested = TEST_UNTESTED,
1371 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001372 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001373 .block_erasers =
1374 {
1375 {
1376 .eraseblocks = { {4 * 1024, 16} },
1377 .block_erase = spi_block_erase_20,
1378 }, {
1379 .eraseblocks = { {32 * 1024, 2} },
1380 .block_erase = spi_block_erase_52,
1381 }, {
1382 .eraseblocks = { {32 * 1024, 2} },
1383 .block_erase = spi_block_erase_d8,
1384 }, {
1385 .eraseblocks = { {64 * 1024, 1} },
1386 .block_erase = spi_block_erase_60,
1387 }, {
1388 .eraseblocks = { {64 * 1024, 1} },
1389 .block_erase = spi_block_erase_c7,
1390 }
1391 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001392 .printlock = spi_prettyprint_status_register_at25f,
1393 .unlock = spi_disable_blockprotect_at25f,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001394 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001395 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001396 },
1397
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001398 {
1399 .vendor = "Atmel",
1400 .name = "AT25FS010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001401 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001402 .manufacture_id = ATMEL_ID,
1403 .model_id = AT_25FS010,
1404 .total_size = 128,
1405 .page_size = 256,
1406 .tested = TEST_UNTESTED,
1407 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001408 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001409 .block_erasers =
1410 {
1411 {
1412 .eraseblocks = { {4 * 1024, 32} },
1413 .block_erase = spi_block_erase_20,
1414 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001415 .eraseblocks = { {4 * 1024, 32} },
1416 .block_erase = spi_block_erase_d7,
1417 }, {
Sean Nelson89187292009-12-23 12:02:55 +00001418 .eraseblocks = { {32 * 1024, 4} },
1419 .block_erase = spi_block_erase_52,
1420 }, {
1421 .eraseblocks = { {32 * 1024, 4} },
1422 .block_erase = spi_block_erase_d8,
1423 }, {
1424 .eraseblocks = { {128 * 1024, 1} },
1425 .block_erase = spi_block_erase_60,
1426 }, {
1427 .eraseblocks = { {128 * 1024, 1} },
1428 .block_erase = spi_block_erase_c7,
1429 }
1430 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001431 .printlock = spi_prettyprint_status_register_at25fs010,
1432 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001433 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001434 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001435 },
1436
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001437 {
1438 .vendor = "Atmel",
1439 .name = "AT25FS040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001440 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001441 .manufacture_id = ATMEL_ID,
1442 .model_id = AT_25FS040,
1443 .total_size = 512,
1444 .page_size = 256,
1445 .tested = TEST_UNTESTED,
1446 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001447 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001448 .block_erasers =
1449 {
1450 {
1451 .eraseblocks = { {4 * 1024, 128} },
1452 .block_erase = spi_block_erase_20,
1453 }, {
1454 .eraseblocks = { {64 * 1024, 8} },
1455 .block_erase = spi_block_erase_52,
1456 }, {
1457 .eraseblocks = { {64 * 1024, 8} },
1458 .block_erase = spi_block_erase_d8,
1459 }, {
1460 .eraseblocks = { {512 * 1024, 1} },
1461 .block_erase = spi_block_erase_60,
1462 }, {
1463 .eraseblocks = { {512 * 1024, 1} },
1464 .block_erase = spi_block_erase_c7,
1465 }
1466 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001467 .printlock = spi_prettyprint_status_register_at25fs040,
1468 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001469 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001470 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001471 },
1472
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001473 {
1474 .vendor = "Atmel",
1475 .name = "AT26DF041",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001476 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001477 .manufacture_id = ATMEL_ID,
1478 .model_id = AT_26DF041,
1479 .total_size = 512,
1480 .page_size = 256,
1481 .tested = TEST_UNTESTED,
1482 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001483 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001484 .block_erasers =
1485 {
1486 {
1487 .eraseblocks = { {4 * 1024, 128} },
1488 .block_erase = spi_block_erase_20,
1489 }
1490 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001491 .write = NULL /* Incompatible Page write */,
1492 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001493 },
1494
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001495 {
1496 .vendor = "Atmel",
1497 .name = "AT26DF081A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001498 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001499 .manufacture_id = ATMEL_ID,
1500 .model_id = AT_26DF081A,
1501 .total_size = 1024,
1502 .page_size = 256,
1503 .tested = TEST_UNTESTED,
1504 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001505 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001506 .block_erasers =
1507 {
1508 {
1509 .eraseblocks = { {4 * 1024, 256} },
1510 .block_erase = spi_block_erase_20,
1511 }, {
1512 .eraseblocks = { {32 * 1024, 32} },
1513 .block_erase = spi_block_erase_52,
1514 }, {
1515 .eraseblocks = { {64 * 1024, 16} },
1516 .block_erase = spi_block_erase_d8,
1517 }, {
1518 .eraseblocks = { {1024 * 1024, 1} },
1519 .block_erase = spi_block_erase_60,
1520 }, {
1521 .eraseblocks = { {1024 * 1024, 1} },
1522 .block_erase = spi_block_erase_c7,
1523 }
1524 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001525 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001526 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001527 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001528 },
1529
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001530 {
1531 .vendor = "Atmel",
1532 .name = "AT26DF161",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001533 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001534 .manufacture_id = ATMEL_ID,
1535 .model_id = AT_26DF161,
1536 .total_size = 2048,
1537 .page_size = 256,
1538 .tested = TEST_UNTESTED,
1539 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001540 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001541 .block_erasers =
1542 {
1543 {
1544 .eraseblocks = { {4 * 1024, 512} },
1545 .block_erase = spi_block_erase_20,
1546 }, {
1547 .eraseblocks = { {32 * 1024, 64} },
1548 .block_erase = spi_block_erase_52,
1549 }, {
1550 .eraseblocks = { {64 * 1024, 32} },
1551 .block_erase = spi_block_erase_d8,
1552 }, {
1553 .eraseblocks = { {2 * 1024 * 1024, 1} },
1554 .block_erase = spi_block_erase_60,
1555 }, {
1556 .eraseblocks = { {2 * 1024 * 1024, 1} },
1557 .block_erase = spi_block_erase_c7,
1558 }
1559 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001560 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001561 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001562 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001563 },
1564
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001565 {
1566 .vendor = "Atmel",
1567 .name = "AT26DF161A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001568 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001569 .manufacture_id = ATMEL_ID,
1570 .model_id = AT_26DF161A,
1571 .total_size = 2048,
1572 .page_size = 256,
1573 .tested = TEST_UNTESTED,
1574 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001575 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001576 .block_erasers =
1577 {
1578 {
1579 .eraseblocks = { {4 * 1024, 512} },
1580 .block_erase = spi_block_erase_20,
1581 }, {
1582 .eraseblocks = { {32 * 1024, 64} },
1583 .block_erase = spi_block_erase_52,
1584 }, {
1585 .eraseblocks = { {64 * 1024, 32} },
1586 .block_erase = spi_block_erase_d8,
1587 }, {
1588 .eraseblocks = { {2 * 1024 * 1024, 1} },
1589 .block_erase = spi_block_erase_60,
1590 }, {
1591 .eraseblocks = { {2 * 1024 * 1024, 1} },
1592 .block_erase = spi_block_erase_c7,
1593 }
1594 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001595 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001596 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001597 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001598 },
1599
1600 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 /*{
1602 .vendor = "Atmel",
1603 .name = "AT26DF321",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001604 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .manufacture_id = ATMEL_ID,
1606 .model_id = AT_26DF321,
1607 .total_size = 4096,
1608 .page_size = 256,
1609 .tested = TEST_UNTESTED,
1610 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001611 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00001612 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001613 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001614 .read = spi_chip_read,
1615 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00001616
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001617 {
1618 .vendor = "Atmel",
1619 .name = "AT26F004",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001620 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001621 .manufacture_id = ATMEL_ID,
1622 .model_id = AT_26F004,
1623 .total_size = 512,
1624 .page_size = 256,
1625 .tested = TEST_UNTESTED,
1626 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001627 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001628 .block_erasers =
1629 {
1630 {
1631 .eraseblocks = { {4 * 1024, 128} },
1632 .block_erase = spi_block_erase_20,
1633 }, {
1634 .eraseblocks = { {32 * 1024, 16} },
1635 .block_erase = spi_block_erase_52,
1636 }, {
1637 .eraseblocks = { {64 * 1024, 8} },
1638 .block_erase = spi_block_erase_d8,
1639 }, {
1640 .eraseblocks = { {512 * 1024, 1} },
1641 .block_erase = spi_block_erase_60,
1642 }, {
1643 .eraseblocks = { {512 * 1024, 1} },
1644 .block_erase = spi_block_erase_c7,
1645 }
1646 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001647 .write = NULL /* Incompatible Page write */,
1648 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00001649 },
1650
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001651 {
1652 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001653 .name = "AT29C512",
Urja Rannikko038a3122009-06-28 19:19:25 +00001654 .bustype = CHIP_BUSTYPE_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001655 .manufacture_id = ATMEL_ID,
1656 .model_id = AT_29C512,
1657 .total_size = 64,
1658 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001659 .feature_bits = FEATURE_LONG_RESET,
1660 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00001661 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001662 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001663 .block_erasers =
1664 {
1665 {
1666 .eraseblocks = { {64 * 1024, 1} },
1667 .block_erase = erase_chip_block_jedec,
1668 }
1669 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00001670 .write = write_jedec,
1671 .read = read_memmapped,
1672
1673 },
1674
1675 {
1676 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001677 .name = "AT29C010A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001678 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001679 .manufacture_id = ATMEL_ID,
1680 .model_id = AT_29C010A,
1681 .total_size = 128,
1682 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00001683 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00001684 .tested = TEST_OK_PREW,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001685 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00001686 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00001687 .block_erasers =
1688 {
1689 {
1690 .eraseblocks = { {128 * 1024, 1} },
1691 .block_erase = erase_chip_block_jedec,
1692 }
1693 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00001694 .write = write_jedec, /* FIXME */
1695 .read = read_memmapped,
1696 },
1697
1698 {
1699 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001700 .name = "AT29C020",
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_29C020,
1704 .total_size = 256,
1705 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001706 .feature_bits = FEATURE_LONG_RESET,
1707 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001708 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00001709 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00001710 .block_erasers =
1711 {
1712 {
1713 .eraseblocks = { {256 * 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 = "AT29C040A",
Urja Rannikko161b8852009-06-05 08:47:37 +00001724 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001725 .manufacture_id = ATMEL_ID,
1726 .model_id = AT_29C040A,
1727 .total_size = 512,
1728 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001729 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001730 .tested = TEST_UNTESTED,
1731 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00001732 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00001733 .block_erasers =
1734 {
1735 {
1736 .eraseblocks = { {512 * 1024, 1} },
1737 .block_erase = erase_chip_block_jedec,
1738 }
1739 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001740 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001741 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001742 },
1743
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001744 {
1745 .vendor = "Atmel",
1746 .name = "AT45CS1282",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001747 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001748 .manufacture_id = ATMEL_ID,
1749 .model_id = AT_45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001750 .total_size = 16896 /* No power of two sizes */,
1751 .page_size = 1056 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001752 .tested = TEST_BAD_READ,
1753 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001754 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001755 .write = NULL /* Incompatible Page write */,
1756 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001757 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001758
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001759 {
1760 .vendor = "Atmel",
1761 .name = "AT45DB011D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001762 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001763 .manufacture_id = ATMEL_ID,
1764 .model_id = AT_45DB011D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001765 .total_size = 128 /* Size can only be determined from status register */,
1766 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001767 .tested = TEST_BAD_READ,
1768 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001769 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001770 .write = NULL,
1771 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001772 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001773
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001774 {
1775 .vendor = "Atmel",
1776 .name = "AT45DB021D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001777 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001778 .manufacture_id = ATMEL_ID,
1779 .model_id = AT_45DB021D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001780 .total_size = 256 /* Size can only be determined from status register */,
1781 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001782 .tested = TEST_BAD_READ,
1783 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001784 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001785 .write = NULL,
1786 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001787 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001788
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001789 {
1790 .vendor = "Atmel",
1791 .name = "AT45DB041D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001792 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001793 .manufacture_id = ATMEL_ID,
1794 .model_id = AT_45DB041D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001795 .total_size = 512 /* Size can only be determined from status register */,
1796 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001797 .tested = TEST_BAD_READ,
1798 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001799 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001800 .write = NULL,
1801 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001802 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001803
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001804 {
1805 .vendor = "Atmel",
1806 .name = "AT45DB081D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001807 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001808 .manufacture_id = ATMEL_ID,
1809 .model_id = AT_45DB081D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001810 .total_size = 1024 /* Size can only be determined from status register */,
1811 .page_size = 256 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 .tested = TEST_BAD_READ,
1813 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001814 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001815 .write = NULL,
1816 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001817 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001818
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001819 {
1820 .vendor = "Atmel",
1821 .name = "AT45DB161D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001822 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001823 .manufacture_id = ATMEL_ID,
1824 .model_id = AT_45DB161D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001825 .total_size = 2048 /* Size can only be determined from status register */,
1826 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001827 .tested = TEST_BAD_READ,
1828 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001829 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001830 .write = NULL,
1831 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001832 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001833
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001834 {
1835 .vendor = "Atmel",
1836 .name = "AT45DB321C",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001837 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001838 .manufacture_id = ATMEL_ID,
1839 .model_id = AT_45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001840 .total_size = 4224 /* No power of two sizes */,
1841 .page_size = 528 /* No power of two sizes */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001842 .tested = TEST_BAD_READ,
1843 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001844 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001845 .write = NULL,
1846 .read = NULL /* Incompatible read */,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001847 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001848
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001849 {
1850 .vendor = "Atmel",
1851 .name = "AT45DB321D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001852 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001853 .manufacture_id = ATMEL_ID,
1854 .model_id = AT_45DB321D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001855 .total_size = 4096 /* Size can only be determined from status register */,
1856 .page_size = 512 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001857 .tested = TEST_BAD_READ,
1858 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001859 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001860 .write = NULL,
1861 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001862 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001863
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001864 {
1865 .vendor = "Atmel",
1866 .name = "AT45DB642D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00001867 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001868 .manufacture_id = ATMEL_ID,
1869 .model_id = AT_45DB642D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001870 .total_size = 8192 /* Size can only be determined from status register */,
1871 .page_size = 1024 /* Size can only be determined from status register */,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001872 .tested = TEST_BAD_READ,
1873 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001874 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001875 .write = NULL,
1876 .read = NULL,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00001877 },
FENG yu ningff692fb2008-12-08 18:15:10 +00001878
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001879 {
1880 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001881 .name = "AT49BV512",
Urja Rannikko161b8852009-06-05 08:47:37 +00001882 .bustype = CHIP_BUSTYPE_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001883 .manufacture_id = ATMEL_ID,
1884 .model_id = AT_49BV512,
1885 .total_size = 64,
1886 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00001887 .feature_bits = FEATURE_EITHER_RESET,
1888 .tested = TEST_UNTESTED,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001889 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001890 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001891 .block_erasers =
1892 {
1893 {
1894 .eraseblocks = { {64 * 1024, 1} },
1895 .block_erase = erase_chip_block_jedec,
1896 }
1897 },
Sean Nelson35727f72010-01-28 23:55:12 +00001898 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00001899 .read = read_memmapped,
1900 },
1901
1902 {
1903 .vendor = "Atmel",
Andrew Morgan1a5eaa12010-06-07 14:10:55 +00001904 .name = "AT49F020",
1905 .bustype = CHIP_BUSTYPE_PARALLEL,
1906 .manufacture_id = ATMEL_ID,
1907 .model_id = AT_49F020,
1908 .total_size = 256,
1909 .page_size = 256,
1910 .feature_bits = FEATURE_EITHER_RESET,
1911 .tested = TEST_OK_PREW,
1912 .probe = probe_jedec,
1913 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
1914 .block_erasers =
1915 {
1916 {
1917 .eraseblocks = { {256 * 1024, 1} },
1918 .block_erase = erase_chip_block_jedec,
1919 }
1920 },
1921 .write = write_jedec_1,
1922 .read = read_memmapped,
1923 },
1924
1925 {
1926 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001927 .name = "AT49F002(N)",
Urja Rannikko161b8852009-06-05 08:47:37 +00001928 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001929 .manufacture_id = ATMEL_ID,
1930 .model_id = AT_49F002N,
1931 .total_size = 256,
1932 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001933 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001934 .tested = TEST_UNTESTED,
1935 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001936 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001937 .block_erasers =
1938 {
1939 {
1940 .eraseblocks = {
1941 {16 * 1024, 1},
1942 {8 * 1024, 2},
1943 {96 * 1024, 1},
1944 {128 * 1024, 1},
1945 },
1946 .block_erase = erase_sector_jedec,
1947 }, {
1948 .eraseblocks = { {256 * 1024, 1} },
1949 .block_erase = erase_chip_block_jedec,
1950 }
1951 },
Sean Nelson35727f72010-01-28 23:55:12 +00001952 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001953 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001954 },
1955
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001956 {
1957 .vendor = "Atmel",
1958 .name = "AT49F002(N)T",
Urja Rannikko161b8852009-06-05 08:47:37 +00001959 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001960 .manufacture_id = ATMEL_ID,
1961 .model_id = AT_49F002NT,
1962 .total_size = 256,
1963 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00001964 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00001965 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001966 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001967 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00001968 .block_erasers =
1969 {
1970 {
1971 .eraseblocks = {
1972 {128 * 1024, 1},
1973 {96 * 1024, 1},
1974 {8 * 1024, 2},
1975 {16 * 1024, 1},
1976 },
1977 .block_erase = erase_sector_jedec,
1978 }, {
1979 .eraseblocks = { {256 * 1024, 1} },
1980 .block_erase = erase_chip_block_jedec,
1981 }
1982 },
Sean Nelson35727f72010-01-28 23:55:12 +00001983 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00001984 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00001985 },
1986
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00001987 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001988 .vendor = "EMST",
1989 .name = "F49B002UA",
Urja Rannikko161b8852009-06-05 08:47:37 +00001990 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001991 .manufacture_id = EMST_ID,
1992 .model_id = EMST_F49B002UA,
1993 .total_size = 256,
1994 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00001995 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001996 .tested = TEST_UNTESTED,
1997 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00001998 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00001999 .block_erasers =
2000 {
2001 {
2002 .eraseblocks = {
2003 {128 * 1024, 1},
2004 {96 * 1024, 1},
2005 {8 * 1024, 2},
2006 {16 * 1024, 1},
2007 },
2008 .block_erase = erase_sector_jedec,
2009 }, {
2010 .eraseblocks = { {256 * 1024, 1} },
2011 .block_erase = erase_chip_block_jedec,
2012 }
2013 },
Sean Nelson35727f72010-01-28 23:55:12 +00002014 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002015 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002016 },
2017
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002018 {
Michael Karcher80a59ea2010-06-19 22:06:35 +00002019 .vendor = "EMST",
2020 .name = "F25L008A",
2021 .bustype = CHIP_BUSTYPE_SPI,
2022 .manufacture_id = EMST_ID,
2023 .model_id = EMST_F25L008A,
2024 .total_size = 1024,
2025 .page_size = 256,
2026 .tested = TEST_UNTESTED,
2027 .probe = probe_spi_rdid,
2028 .probe_timing = TIMING_ZERO,
2029 .block_erasers =
2030 {
2031 {
2032 .eraseblocks = { {4 * 1024, 256} },
2033 .block_erase = spi_block_erase_20,
2034 }, {
2035 .eraseblocks = { {64 * 1024, 16} },
2036 .block_erase = spi_block_erase_d8,
2037 }, {
2038 .eraseblocks = { {1024 * 1024, 1} },
2039 .block_erase = spi_block_erase_60,
2040 }, {
2041 .eraseblocks = { {1024 * 1024, 1} },
2042 .block_erase = spi_block_erase_c7,
2043 }
2044 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002045 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00002046 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00002047 .read = spi_chip_read,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002048 },
2049
2050 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002051 .vendor = "Eon",
2052 .name = "EN25B05",
2053 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002054 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002055 .model_id = EN_25B05,
2056 .total_size = 64,
2057 .page_size = 256,
2058 .tested = TEST_UNTESTED,
2059 .probe = probe_spi_rdid,
2060 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002061 .block_erasers =
2062 {
2063 {
2064 .eraseblocks = {
2065 {4 * 1024, 2},
2066 {8 * 1024, 1},
2067 {16 * 1024, 1},
2068 {32 * 1024, 1},
2069 },
2070 .block_erase = spi_block_erase_d8,
2071 }, {
2072 .eraseblocks = { {64 * 1024, 1} },
2073 .block_erase = spi_block_erase_c7,
2074 }
2075 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002076 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002077 .write = spi_chip_write_256,
2078 .read = spi_chip_read,
2079 },
2080
2081 {
2082 .vendor = "Eon",
2083 .name = "EN25B05T",
2084 .bustype = CHIP_BUSTYPE_SPI,
2085 .manufacture_id = EON_ID_NOPREFIX,
2086 .model_id = EN_25B05,
2087 .total_size = 64,
2088 .page_size = 256,
2089 .tested = TEST_UNTESTED,
2090 .probe = probe_spi_rdid,
2091 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002092 .block_erasers =
2093 {
2094 {
2095 .eraseblocks = {
2096 {32 * 1024, 1},
2097 {16 * 1024, 1},
2098 {8 * 1024, 1},
2099 {4 * 1024, 2},
2100 },
2101 .block_erase = spi_block_erase_d8,
2102 }, {
2103 .eraseblocks = { {64 * 1024, 1} },
2104 .block_erase = spi_block_erase_c7,
2105 }
2106 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002107 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002108 .write = spi_chip_write_256,
2109 .read = spi_chip_read,
2110 },
2111
2112 {
2113 .vendor = "Eon",
2114 .name = "EN25B10",
2115 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002116 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002117 .model_id = EN_25B10,
2118 .total_size = 128,
2119 .page_size = 256,
2120 .tested = TEST_UNTESTED,
2121 .probe = probe_spi_rdid,
2122 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002123 .block_erasers =
2124 {
2125 {
2126 .eraseblocks = {
2127 {4 * 1024, 2},
2128 {8 * 1024, 1},
2129 {16 * 1024, 1},
2130 {32 * 1024, 3},
2131 },
2132 .block_erase = spi_block_erase_d8,
2133 }, {
2134 .eraseblocks = { {128 * 1024, 1} },
2135 .block_erase = spi_block_erase_c7,
2136 }
2137 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002138 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002139 .write = spi_chip_write_256,
2140 .read = spi_chip_read,
2141 },
2142
2143 {
2144 .vendor = "Eon",
2145 .name = "EN25B10T",
2146 .bustype = CHIP_BUSTYPE_SPI,
2147 .manufacture_id = EON_ID_NOPREFIX,
2148 .model_id = EN_25B10,
2149 .total_size = 128,
2150 .page_size = 256,
2151 .tested = TEST_UNTESTED,
2152 .probe = probe_spi_rdid,
2153 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002154 .block_erasers =
2155 {
2156 {
2157 .eraseblocks = {
2158 {32 * 1024, 3},
2159 {16 * 1024, 1},
2160 {8 * 1024, 1},
2161 {4 * 1024, 2},
2162 },
2163 .block_erase = spi_block_erase_d8,
2164 }, {
2165 .eraseblocks = { {128 * 1024, 1} },
2166 .block_erase = spi_block_erase_c7,
2167 }
2168 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002169 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002170 .write = spi_chip_write_256,
2171 .read = spi_chip_read,
2172 },
2173
2174 {
2175 .vendor = "Eon",
2176 .name = "EN25B20",
2177 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002178 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002179 .model_id = EN_25B20,
2180 .total_size = 256,
2181 .page_size = 256,
2182 .tested = TEST_UNTESTED,
2183 .probe = probe_spi_rdid,
2184 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002185 .block_erasers =
2186 {
2187 {
2188 .eraseblocks = {
2189 {4 * 1024, 2},
2190 {8 * 1024, 1},
2191 {16 * 1024, 1},
2192 {32 * 1024, 1},
2193 {64 * 1024, 3}
2194 },
2195 .block_erase = spi_block_erase_d8,
2196 }, {
2197 .eraseblocks = { {256 * 1024, 1} },
2198 .block_erase = spi_block_erase_c7,
2199 }
2200 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002201 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002202 .write = spi_chip_write_256,
2203 .read = spi_chip_read,
2204 },
2205
2206 {
2207 .vendor = "Eon",
2208 .name = "EN25B20T",
2209 .bustype = CHIP_BUSTYPE_SPI,
2210 .manufacture_id = EON_ID_NOPREFIX,
2211 .model_id = EN_25B20,
2212 .total_size = 256,
2213 .page_size = 256,
2214 .tested = TEST_UNTESTED,
2215 .probe = probe_spi_rdid,
2216 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002217 .block_erasers =
2218 {
2219 {
2220 .eraseblocks = {
2221 {64 * 1024, 3},
2222 {32 * 1024, 1},
2223 {16 * 1024, 1},
2224 {8 * 1024, 1},
2225 {4 * 1024, 2},
2226 },
2227 .block_erase = spi_block_erase_d8,
2228 }, {
2229 .eraseblocks = { {256 * 1024, 1} },
2230 .block_erase = spi_block_erase_c7,
2231 }
2232 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002233 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002234 .write = spi_chip_write_256,
2235 .read = spi_chip_read,
2236 },
2237
2238 {
2239 .vendor = "Eon",
2240 .name = "EN25B40",
2241 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002242 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002243 .model_id = EN_25B40,
2244 .total_size = 512,
2245 .page_size = 256,
2246 .tested = TEST_UNTESTED,
2247 .probe = probe_spi_rdid,
2248 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002249 .block_erasers =
2250 {
2251 {
2252 .eraseblocks = {
2253 {4 * 1024, 2},
2254 {8 * 1024, 1},
2255 {16 * 1024, 1},
2256 {32 * 1024, 1},
2257 {64 * 1024, 7}
2258 },
2259 .block_erase = spi_block_erase_d8,
2260 }, {
2261 .eraseblocks = { {512 * 1024, 1} },
2262 .block_erase = spi_block_erase_c7,
2263 }
2264 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002265 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002266 .write = spi_chip_write_256,
2267 .read = spi_chip_read,
2268 },
2269
2270 {
2271 .vendor = "Eon",
2272 .name = "EN25B40T",
2273 .bustype = CHIP_BUSTYPE_SPI,
2274 .manufacture_id = EON_ID_NOPREFIX,
2275 .model_id = EN_25B40,
2276 .total_size = 512,
2277 .page_size = 256,
2278 .tested = TEST_UNTESTED,
2279 .probe = probe_spi_rdid,
2280 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002281 .block_erasers =
2282 {
2283 {
2284 .eraseblocks = {
2285 {64 * 1024, 7},
2286 {32 * 1024, 1},
2287 {16 * 1024, 1},
2288 {8 * 1024, 1},
2289 {4 * 1024, 2},
2290 },
2291 .block_erase = spi_block_erase_d8,
2292 }, {
2293 .eraseblocks = { {512 * 1024, 1} },
2294 .block_erase = spi_block_erase_c7,
2295 }
2296 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002297 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002298 .write = spi_chip_write_256,
2299 .read = spi_chip_read,
2300 },
2301
2302 {
2303 .vendor = "Eon",
2304 .name = "EN25B80",
2305 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002306 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002307 .model_id = EN_25B80,
2308 .total_size = 1024,
2309 .page_size = 256,
2310 .tested = TEST_UNTESTED,
2311 .probe = probe_spi_rdid,
2312 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002313 .block_erasers =
2314 {
2315 {
2316 .eraseblocks = {
2317 {4 * 1024, 2},
2318 {8 * 1024, 1},
2319 {16 * 1024, 1},
2320 {32 * 1024, 1},
2321 {64 * 1024, 15}
2322 },
2323 .block_erase = spi_block_erase_d8,
2324 }, {
2325 .eraseblocks = { {1024 * 1024, 1} },
2326 .block_erase = spi_block_erase_c7,
2327 }
2328 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002329 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002330 .write = spi_chip_write_256,
2331 .read = spi_chip_read,
2332 },
2333
2334 {
2335 .vendor = "Eon",
2336 .name = "EN25B80T",
2337 .bustype = CHIP_BUSTYPE_SPI,
2338 .manufacture_id = EON_ID_NOPREFIX,
2339 .model_id = EN_25B80,
2340 .total_size = 1024,
2341 .page_size = 256,
2342 .tested = TEST_UNTESTED,
2343 .probe = probe_spi_rdid,
2344 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002345 .block_erasers =
2346 {
2347 {
2348 .eraseblocks = {
2349 {64 * 1024, 15},
2350 {32 * 1024, 1},
2351 {16 * 1024, 1},
2352 {8 * 1024, 1},
2353 {4 * 1024, 2},
2354 },
2355 .block_erase = spi_block_erase_d8,
2356 }, {
2357 .eraseblocks = { {1024 * 1024, 1} },
2358 .block_erase = spi_block_erase_c7,
2359 }
2360 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002361 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002362 .write = spi_chip_write_256,
2363 .read = spi_chip_read,
2364 },
2365
2366 {
2367 .vendor = "Eon",
2368 .name = "EN25B16",
2369 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002370 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002371 .model_id = EN_25B16,
2372 .total_size = 2048,
2373 .page_size = 256,
2374 .tested = TEST_UNTESTED,
2375 .probe = probe_spi_rdid,
2376 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002377 .block_erasers =
2378 {
2379 {
2380 .eraseblocks = {
2381 {4 * 1024, 2},
2382 {8 * 1024, 1},
2383 {16 * 1024, 1},
2384 {32 * 1024, 1},
2385 {64 * 1024, 31},
2386 },
2387 .block_erase = spi_block_erase_d8,
2388 }, {
2389 .eraseblocks = { {2 * 1024 * 1024, 1} },
2390 .block_erase = spi_block_erase_c7,
2391 }
2392 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002393 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002394 .write = spi_chip_write_256,
2395 .read = spi_chip_read,
2396 },
2397
2398 {
2399 .vendor = "Eon",
2400 .name = "EN25B16T",
2401 .bustype = CHIP_BUSTYPE_SPI,
2402 .manufacture_id = EON_ID_NOPREFIX,
2403 .model_id = EN_25B16,
2404 .total_size = 2048,
2405 .page_size = 256,
2406 .tested = TEST_UNTESTED,
2407 .probe = probe_spi_rdid,
2408 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002409 .block_erasers =
2410 {
2411 {
2412 .eraseblocks = {
2413 {64 * 1024, 31},
2414 {32 * 1024, 1},
2415 {16 * 1024, 1},
2416 {8 * 1024, 1},
2417 {4 * 1024, 2},
2418 },
2419 .block_erase = spi_block_erase_d8,
2420 }, {
2421 .eraseblocks = { {2 * 1024 * 1024, 1} },
2422 .block_erase = spi_block_erase_c7,
2423 }
2424 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002425 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002426 .write = spi_chip_write_256,
2427 .read = spi_chip_read,
2428 },
2429
2430 {
2431 .vendor = "Eon",
2432 .name = "EN25B32",
2433 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002434 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002435 .model_id = EN_25B32,
2436 .total_size = 4096,
2437 .page_size = 256,
2438 .tested = TEST_UNTESTED,
2439 .probe = probe_spi_rdid,
2440 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002441 .block_erasers =
2442 {
2443 {
2444 .eraseblocks = {
2445 {4 * 1024, 2},
2446 {8 * 1024, 1},
2447 {16 * 1024, 1},
2448 {32 * 1024, 1},
2449 {64 * 1024, 63},
2450 },
2451 .block_erase = spi_block_erase_d8,
2452 }, {
2453 .eraseblocks = { {4 * 1024 * 1024, 1} },
2454 .block_erase = spi_block_erase_c7,
2455 }
2456 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002457 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002458 .write = spi_chip_write_256,
2459 .read = spi_chip_read,
2460 },
2461
2462 {
2463 .vendor = "Eon",
2464 .name = "EN25B32T",
2465 .bustype = CHIP_BUSTYPE_SPI,
2466 .manufacture_id = EON_ID_NOPREFIX,
2467 .model_id = EN_25B32,
2468 .total_size = 4096,
2469 .page_size = 256,
2470 .tested = TEST_UNTESTED,
2471 .probe = probe_spi_rdid,
2472 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002473 .block_erasers =
2474 {
2475 {
2476 .eraseblocks = {
2477 {64 * 1024, 63},
2478 {32 * 1024, 1},
2479 {16 * 1024, 1},
2480 {8 * 1024, 1},
2481 {4 * 1024, 2},
2482 },
2483 .block_erase = spi_block_erase_d8,
2484 }, {
2485 .eraseblocks = { {4 * 1024 * 1024, 1} },
2486 .block_erase = spi_block_erase_c7,
2487 }
2488 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002489 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002490 .write = spi_chip_write_256,
2491 .read = spi_chip_read,
2492 },
2493
2494 {
2495 .vendor = "Eon",
2496 .name = "EN25B64",
2497 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002498 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002499 .model_id = EN_25B64,
2500 .total_size = 8192,
2501 .page_size = 256,
2502 .tested = TEST_UNTESTED,
2503 .probe = probe_spi_rdid,
2504 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002505 .block_erasers =
2506 {
2507 {
2508 .eraseblocks = {
2509 {4 * 1024, 2},
2510 {8 * 1024, 1},
2511 {16 * 1024, 1},
2512 {32 * 1024, 1},
2513 {64 * 1024, 127},
2514 },
2515 .block_erase = spi_block_erase_d8,
2516 }, {
2517 .eraseblocks = { {8 * 1024 * 1024, 1} },
2518 .block_erase = spi_block_erase_c7,
2519 }
2520 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002521 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002522 .write = spi_chip_write_256,
2523 .read = spi_chip_read,
2524 },
2525
2526 {
2527 .vendor = "Eon",
2528 .name = "EN25B64T",
2529 .bustype = CHIP_BUSTYPE_SPI,
2530 .manufacture_id = EON_ID_NOPREFIX,
2531 .model_id = EN_25B64,
2532 .total_size = 8192,
2533 .page_size = 256,
2534 .tested = TEST_UNTESTED,
2535 .probe = probe_spi_rdid,
2536 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002537 .block_erasers =
2538 {
2539 {
2540 .eraseblocks = {
2541 {64 * 1024, 127},
2542 {32 * 1024, 1},
2543 {16 * 1024, 1},
2544 {8 * 1024, 1},
2545 {4 * 1024, 2},
2546 },
2547 .block_erase = spi_block_erase_d8,
2548 }, {
2549 .eraseblocks = { {8 * 1024 * 1024, 1} },
2550 .block_erase = spi_block_erase_c7,
2551 }
2552 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002553 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002554 .write = spi_chip_write_256,
2555 .read = spi_chip_read,
2556 },
2557
2558 {
2559 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002560 .name = "EN25D16",
2561 .bustype = CHIP_BUSTYPE_SPI,
2562 .manufacture_id = EON_ID_NOPREFIX,
2563 .model_id = EN_25D16,
2564 .total_size = 2048,
2565 .page_size = 256,
2566 .tested = TEST_UNTESTED,
2567 .probe = probe_spi_rdid,
2568 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002569 .block_erasers =
2570 {
2571 {
2572 .eraseblocks = { {4 * 1024, 512} },
2573 .block_erase = spi_block_erase_20,
2574 }, {
2575 .eraseblocks = { {64 * 1024, 32} },
2576 .block_erase = spi_block_erase_d8,
2577 }, {
2578 .eraseblocks = { {64 * 1024, 32} },
2579 .block_erase = spi_block_erase_52,
2580 }, {
2581 .eraseblocks = { {2 * 1024 * 1024, 1} },
2582 .block_erase = spi_block_erase_60,
2583 }, {
2584 .eraseblocks = { {2 * 1024 * 1024, 1} },
2585 .block_erase = spi_block_erase_c7,
2586 }
2587 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002588 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002589 .write = spi_chip_write_256,
2590 .read = spi_chip_read,
2591 },
2592
2593 {
2594 .vendor = "Eon",
2595 .name = "EN25F05",
2596 .bustype = CHIP_BUSTYPE_SPI,
2597 .manufacture_id = EON_ID_NOPREFIX,
2598 .model_id = EN_25F05,
2599 .total_size = 64,
2600 .page_size = 256,
2601 .tested = TEST_UNTESTED,
2602 .probe = probe_spi_rdid,
2603 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002604 .block_erasers =
2605 {
2606 {
2607 .eraseblocks = { {4 * 1024, 16} },
2608 .block_erase = spi_block_erase_20,
2609 }, {
2610 .eraseblocks = { {32 * 1024, 2} },
2611 .block_erase = spi_block_erase_d8,
2612 }, {
2613 .eraseblocks = { {32 * 1024, 2} },
2614 .block_erase = spi_block_erase_52,
2615 }, {
2616 .eraseblocks = { {64 * 1024, 1} },
2617 .block_erase = spi_block_erase_60,
2618 }, {
2619 .eraseblocks = { {64 * 1024, 1} },
2620 .block_erase = spi_block_erase_c7,
2621 }
2622 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002623 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002624 .write = spi_chip_write_256,
2625 .read = spi_chip_read,
2626 },
2627
2628 {
2629 .vendor = "Eon",
2630 .name = "EN25F10",
2631 .bustype = CHIP_BUSTYPE_SPI,
2632 .manufacture_id = EON_ID_NOPREFIX,
2633 .model_id = EN_25F10,
2634 .total_size = 128,
2635 .page_size = 256,
2636 .tested = TEST_UNTESTED,
2637 .probe = probe_spi_rdid,
2638 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002639 .block_erasers =
2640 {
2641 {
2642 .eraseblocks = { {4 * 1024, 32} },
2643 .block_erase = spi_block_erase_20,
2644 }, {
2645 .eraseblocks = { {32 * 1024, 4} },
2646 .block_erase = spi_block_erase_d8,
2647 }, {
2648 .eraseblocks = { {32 * 1024, 4} },
2649 .block_erase = spi_block_erase_52,
2650 }, {
2651 .eraseblocks = { {128 * 1024, 1} },
2652 .block_erase = spi_block_erase_60,
2653 }, {
2654 .eraseblocks = { {128 * 1024, 1} },
2655 .block_erase = spi_block_erase_c7,
2656 }
2657 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002658 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002659 .write = spi_chip_write_256,
2660 .read = spi_chip_read,
2661 },
2662
2663 {
2664 .vendor = "Eon",
2665 .name = "EN25F20",
2666 .bustype = CHIP_BUSTYPE_SPI,
2667 .manufacture_id = EON_ID_NOPREFIX,
2668 .model_id = EN_25F20,
2669 .total_size = 256,
2670 .page_size = 256,
2671 .tested = TEST_UNTESTED,
2672 .probe = probe_spi_rdid,
2673 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002674 .block_erasers =
2675 {
2676 {
2677 .eraseblocks = { {4 * 1024, 64} },
2678 .block_erase = spi_block_erase_20,
2679 }, {
2680 .eraseblocks = { {64 * 1024, 4} },
2681 .block_erase = spi_block_erase_d8,
2682 }, {
2683 .eraseblocks = { {64 * 1024, 4} },
2684 .block_erase = spi_block_erase_52,
2685 }, {
2686 .eraseblocks = { {256 * 1024, 1} },
2687 .block_erase = spi_block_erase_60,
2688 }, {
2689 .eraseblocks = { {256 * 1024, 1} },
2690 .block_erase = spi_block_erase_c7,
2691 }
2692 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002693 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002694 .write = spi_chip_write_256,
2695 .read = spi_chip_read,
2696 },
2697
2698 {
2699 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002700 .name = "EN25F40",
2701 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002702 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002703 .model_id = EN_25F40,
2704 .total_size = 512,
2705 .page_size = 256,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00002706 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002707 .probe = probe_spi_rdid,
2708 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002709 .block_erasers =
2710 {
2711 {
Sean Nelson54596372010-01-09 05:30:14 +00002712 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002713 .block_erase = spi_block_erase_20,
2714 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002715 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002716 .block_erase = spi_block_erase_d8,
2717 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002718 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002719 .block_erase = spi_block_erase_60,
2720 }, {
Sean Nelson54596372010-01-09 05:30:14 +00002721 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00002722 .block_erase = spi_block_erase_c7,
2723 },
2724 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002725 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002726 .write = spi_chip_write_256,
2727 .read = spi_chip_read,
2728 },
2729
2730 {
2731 .vendor = "Eon",
2732 .name = "EN25F80",
2733 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002734 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002735 .model_id = EN_25F80,
2736 .total_size = 1024,
2737 .page_size = 256,
Uwe Hermannea5425b2010-05-30 17:00:19 +00002738 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002739 .probe = probe_spi_rdid,
2740 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002741 .block_erasers =
2742 {
2743 {
2744 .eraseblocks = { {4 * 1024, 256} },
2745 .block_erase = spi_block_erase_20,
2746 }, {
2747 .eraseblocks = { {64 * 1024, 16} },
2748 .block_erase = spi_block_erase_d8,
2749 }, {
2750 .eraseblocks = { {1024 * 1024, 1} },
2751 .block_erase = spi_block_erase_60,
2752 }, {
2753 .eraseblocks = { {1024 * 1024, 1} },
2754 .block_erase = spi_block_erase_c7,
2755 }
2756 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002757 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002758 .write = spi_chip_write_256,
2759 .read = spi_chip_read,
2760 },
2761
2762 {
2763 .vendor = "Eon",
2764 .name = "EN25F16",
2765 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002766 .manufacture_id = EON_ID_NOPREFIX,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002767 .model_id = EN_25F16,
2768 .total_size = 2048,
2769 .page_size = 256,
2770 .tested = TEST_UNTESTED,
2771 .probe = probe_spi_rdid,
2772 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002773 .block_erasers =
2774 {
2775 {
2776 .eraseblocks = { {4 * 1024, 512} },
2777 .block_erase = spi_block_erase_20,
2778 }, {
2779 .eraseblocks = { {64 * 1024, 32} },
2780 .block_erase = spi_block_erase_d8,
2781 }, {
2782 .eraseblocks = { {2 * 1024 * 1024, 1} },
2783 .block_erase = spi_block_erase_60,
2784 }, {
2785 .eraseblocks = { {2 * 1024 * 1024, 1} },
2786 .block_erase = spi_block_erase_c7,
2787 }
2788 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002789 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002790 .write = spi_chip_write_256,
2791 .read = spi_chip_read,
2792 },
2793
2794 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002795 .vendor = "Eon",
2796 .name = "EN25F32",
2797 .bustype = CHIP_BUSTYPE_SPI,
2798 .manufacture_id = EON_ID_NOPREFIX,
2799 .model_id = EN_25F32,
2800 .total_size = 4096,
2801 .page_size = 256,
2802 .tested = TEST_UNTESTED,
2803 .probe = probe_spi_rdid,
2804 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002805 .block_erasers =
2806 {
2807 {
2808 .eraseblocks = { {4 * 1024, 1024} },
2809 .block_erase = spi_block_erase_20,
2810 }, {
2811 .eraseblocks = { {64 * 1024, 64} },
2812 .block_erase = spi_block_erase_d8,
2813 }, {
2814 .eraseblocks = { {4 * 1024 * 1024, 1} },
2815 .block_erase = spi_block_erase_60,
2816 }, {
2817 .eraseblocks = { {4 * 1024 * 1024, 1} },
2818 .block_erase = spi_block_erase_c7,
2819 }
2820 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002821 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002822 .write = spi_chip_write_256,
2823 .read = spi_chip_read,
2824 },
2825
2826 {
Russ Dill3cd5a122010-03-05 08:44:11 +00002827 .vendor = "Eon",
2828 .name = "EN29F010",
2829 .bustype = CHIP_BUSTYPE_PARALLEL,
2830 .manufacture_id = EON_ID,
2831 .model_id = EN_29F010,
2832 .total_size = 128,
2833 .page_size = 128,
2834 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
2835 .tested = TEST_OK_PREW,
2836 .probe = probe_jedec,
2837 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2838 .block_erasers =
2839 {
2840 {
2841 .eraseblocks = { {16 * 1024, 8} },
2842 .block_erase = erase_sector_jedec,
2843 },
2844 {
2845 .eraseblocks = { {128 * 1024, 1} },
2846 .block_erase = erase_chip_block_jedec,
2847 },
2848 },
2849 .write = write_jedec_1,
2850 .read = read_memmapped,
2851 },
2852
2853 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002854 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002855 .name = "EN29F002(A)(N)B",
Urja Rannikko161b8852009-06-05 08:47:37 +00002856 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002857 .manufacture_id = EON_ID,
2858 .model_id = EN_29F002B,
2859 .total_size = 256,
2860 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002861 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00002862 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002863 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002864 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002865 .block_erasers =
2866 {
2867 {
2868 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00002869 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002870 {8 * 1024, 2},
2871 {32 * 1024, 1},
2872 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00002873 },
2874 .block_erase = erase_sector_jedec,
2875 }, {
2876 .eraseblocks = { {256 * 1024, 1} },
2877 .block_erase = erase_chip_block_jedec,
2878 },
2879 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00002880 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002881 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002882 },
2883
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002884 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00002885 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002886 .name = "EN29F002(A)(N)T",
Urja Rannikko161b8852009-06-05 08:47:37 +00002887 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002888 .manufacture_id = EON_ID,
2889 .model_id = EN_29F002T,
2890 .total_size = 256,
2891 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002892 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00002893 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002894 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002895 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002896 .block_erasers =
2897 {
2898 {
2899 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00002900 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00002901 {32 * 1024, 1},
2902 {8 * 1024, 2},
2903 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00002904 },
2905 .block_erase = erase_sector_jedec,
2906 }, {
2907 .eraseblocks = { {256 * 1024, 1} },
2908 .block_erase = erase_chip_block_jedec,
2909 },
2910 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00002911 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002912 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002913 },
2914
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002915 {
2916 .vendor = "Fujitsu",
2917 .name = "MBM29F004BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002918 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002919 .manufacture_id = FUJITSU_ID,
2920 .model_id = MBM29F004BC,
2921 .total_size = 512,
2922 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002923 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002924 .tested = TEST_UNTESTED,
2925 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002926 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002927 .block_erasers =
2928 {
2929 {
2930 .eraseblocks = {
2931 {16 * 1024, 1},
2932 {8 * 1024, 2},
2933 {32 * 1024, 1},
2934 {64 * 1024, 7},
2935 },
Sean Nelson35727f72010-01-28 23:55:12 +00002936 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002937 }, {
2938 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00002939 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002940 },
2941 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002942 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002943 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002944 },
2945
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002946 {
2947 .vendor = "Fujitsu",
2948 .name = "MBM29F004TC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002949 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002950 .manufacture_id = FUJITSU_ID,
2951 .model_id = MBM29F004TC,
2952 .total_size = 512,
2953 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002954 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002955 .tested = TEST_UNTESTED,
2956 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002957 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002958 .block_erasers =
2959 {
2960 {
2961 .eraseblocks = {
2962 {64 * 1024, 7},
2963 {32 * 1024, 1},
2964 {8 * 1024, 2},
2965 {16 * 1024, 1},
2966 },
Sean Nelson35727f72010-01-28 23:55:12 +00002967 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002968 }, {
2969 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00002970 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00002971 },
2972 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002973 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002974 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00002975 },
2976
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002977 {
Sean Nelson35727f72010-01-28 23:55:12 +00002978 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002979 .vendor = "Fujitsu",
2980 .name = "MBM29F400BC",
Urja Rannikko038a3122009-06-28 19:19:25 +00002981 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002982 .manufacture_id = FUJITSU_ID,
2983 .model_id = MBM29F400BC,
2984 .total_size = 512,
2985 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00002986 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00002987 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002988 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002989 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00002990 .block_erasers =
2991 {
2992 {
2993 .eraseblocks = {
2994 {16 * 1024, 1},
2995 {8 * 1024, 2},
2996 {32 * 1024, 1},
2997 {64 * 1024, 7},
2998 },
2999 .block_erase = block_erase_m29f400bt,
3000 }, {
3001 .eraseblocks = { {512 * 1024, 1} },
3002 .block_erase = block_erase_chip_m29f400bt,
3003 },
3004 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00003005 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003006 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003007 },
3008
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003009 {
3010 .vendor = "Fujitsu",
3011 .name = "MBM29F400TC",
Urja Rannikko038a3122009-06-28 19:19:25 +00003012 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003013 .manufacture_id = FUJITSU_ID,
3014 .model_id = MBM29F400TC,
3015 .total_size = 512,
3016 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003017 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003018 .tested = TEST_UNTESTED,
3019 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003020 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003021 .block_erasers =
3022 {
3023 {
3024 .eraseblocks = {
3025 {64 * 1024, 7},
3026 {32 * 1024, 1},
3027 {8 * 1024, 2},
3028 {16 * 1024, 1},
3029 },
3030 .block_erase = block_erase_m29f400bt,
3031 }, {
3032 .eraseblocks = { {512 * 1024, 1} },
3033 .block_erase = block_erase_chip_m29f400bt,
3034 },
3035 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00003036 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003037 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003038 },
3039
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003040 {
David Borgc96a8bd2010-06-21 16:12:22 +00003041 .vendor = "Hyundai",
3042 .name = "HY29F002T",
3043 .bustype = CHIP_BUSTYPE_PARALLEL,
3044 .manufacture_id = HYUNDAI_ID,
3045 .model_id = HY_29F002T,
3046 .total_size = 256,
3047 .page_size = 256 * 1024,
3048 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3049 .tested = TEST_OK_PREW,
3050 .probe = probe_jedec,
3051 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3052 .block_erasers =
3053 {
3054 {
3055 .eraseblocks = {
3056 {64 * 1024, 3},
3057 {32 * 1024, 1},
3058 {8 * 1024, 2},
3059 {16 * 1024, 1},
3060 },
3061 .block_erase = erase_sector_jedec,
3062 }, {
3063 .eraseblocks = { {256 * 1024, 1} },
3064 .block_erase = erase_chip_block_jedec,
3065 },
3066 },
3067 .write = write_jedec_1,
3068 .read = read_memmapped,
3069 },
3070
3071 {
3072 .vendor = "Hyundai",
3073 .name = "HY29F002B",
3074 .bustype = CHIP_BUSTYPE_PARALLEL,
3075 .manufacture_id = HYUNDAI_ID,
3076 .model_id = HY_29F002B,
3077 .total_size = 256,
3078 .page_size = 256 * 1024,
3079 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3080 .tested = TEST_UNTESTED,
3081 .probe = probe_jedec,
3082 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3083 .block_erasers =
3084 {
3085 {
3086 .eraseblocks = {
3087 {16 * 1024, 1},
3088 {8 * 1024, 2},
3089 {32 * 1024, 1},
3090 {64 * 1024, 3},
3091 },
3092 .block_erase = erase_sector_jedec,
3093 }, {
3094 .eraseblocks = { {256 * 1024, 1} },
3095 .block_erase = erase_chip_block_jedec,
3096 },
3097 },
3098 .write = write_jedec_1,
3099 .read = read_memmapped,
3100 },
3101
3102 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003103 .vendor = "Intel",
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003104 .name = "28F001BX-B",
Urja Rannikko161b8852009-06-05 08:47:37 +00003105 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003106 .manufacture_id = INTEL_ID,
3107 .model_id = P28F001BXB,
3108 .total_size = 128,
3109 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003110 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003111 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003112 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003113 .block_erasers =
3114 {
3115 {
3116 .eraseblocks = {
3117 {8 * 1024, 1},
3118 {4 * 1024, 2},
3119 {112 * 1024, 1},
3120 },
Sean Nelson28accc22010-03-19 18:47:06 +00003121 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003122 },
3123 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003124 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003125 .read = read_memmapped,
3126 },
3127
3128 {
3129 .vendor = "Intel",
3130 .name = "28F001BX-T",
Urja Rannikko161b8852009-06-05 08:47:37 +00003131 .bustype = CHIP_BUSTYPE_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003132 .manufacture_id = INTEL_ID,
3133 .model_id = P28F001BXT,
3134 .total_size = 128,
3135 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sean Nelsondee4a832010-03-22 04:39:31 +00003136 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003137 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003138 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003139 .block_erasers =
3140 {
3141 {
3142 .eraseblocks = {
3143 {112 * 1024, 1},
3144 {4 * 1024, 2},
3145 {8 * 1024, 1},
3146 },
Sean Nelson28accc22010-03-19 18:47:06 +00003147 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003148 },
3149 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003150 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00003151 .read = read_memmapped,
3152 },
3153
3154 {
3155 .vendor = "Intel",
Joshua Roysd97c0e02010-07-22 15:20:43 +00003156 .name = "28F002BC-T",
3157 .bustype = CHIP_BUSTYPE_PARALLEL,
3158 .manufacture_id = INTEL_ID,
3159 .model_id = P28F002BC,
3160 .total_size = 256,
3161 .page_size = 256 * 1024,
3162 .tested = TEST_UNTESTED,
3163 .probe = probe_82802ab,
3164 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3165 .block_erasers =
3166 {
3167 {
3168 .eraseblocks = {
3169 {128 * 1024, 1},
3170 {96 * 1024, 1},
3171 {8 * 1024, 2},
3172 {16 * 1024, 1},
3173 },
3174 .block_erase = erase_block_82802ab,
3175 },
3176 },
3177 .write = write_82802ab,
3178 .read = read_memmapped,
3179 },
3180
3181 {
3182 .vendor = "Intel",
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003183 .name = "28F004S5",
3184 .bustype = CHIP_BUSTYPE_PARALLEL,
3185 .manufacture_id = INTEL_ID,
3186 .model_id = E_28F004S5,
3187 .total_size = 512,
3188 .page_size = 256,
3189 .tested = TEST_UNTESTED,
3190 .probe = probe_82802ab,
3191 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003192 .block_erasers =
3193 {
3194 {
3195 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003196 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003197 },
3198 },
Sean Nelsondee4a832010-03-22 04:39:31 +00003199 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00003200 .write = write_82802ab,
3201 .read = read_memmapped,
3202 },
3203
3204 {
3205 .vendor = "Intel",
Michael Karcherad0010a2010-04-03 10:27:08 +00003206 .name = "28F004BV/BE-B",
3207 .bustype = CHIP_BUSTYPE_PARALLEL,
3208 .manufacture_id = INTEL_ID,
3209 .model_id = P28F004BB,
3210 .total_size = 512,
3211 .page_size = 128 * 1024, /* maximal block size */
3212 .tested = TEST_UNTESTED,
3213 .probe = probe_82802ab,
3214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3215 .block_erasers =
3216 {
3217 {
3218 .eraseblocks = {
3219 {16 * 1024, 1},
3220 {8 * 1024, 2},
3221 {96 * 1024, 1},
3222 {128 * 1024, 3},
3223 },
3224 .block_erase = erase_block_82802ab,
3225 },
3226 },
3227 .write = write_82802ab,
3228 .read = read_memmapped,
3229 },
3230
3231 {
3232 .vendor = "Intel",
3233 .name = "28F004BV/BE-T",
3234 .bustype = CHIP_BUSTYPE_PARALLEL,
3235 .manufacture_id = INTEL_ID,
3236 .model_id = P28F004BT,
3237 .total_size = 512,
3238 .page_size = 128 * 1024, /* maximal block size */
3239 .tested = TEST_UNTESTED,
3240 .probe = probe_82802ab,
3241 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3242 .block_erasers =
3243 {
3244 {
3245 .eraseblocks = {
3246 {128 * 1024, 3},
3247 {96 * 1024, 1},
3248 {8 * 1024, 2},
3249 {16 * 1024, 1},
3250 },
3251 .block_erase = erase_block_82802ab,
3252 },
3253 },
3254 .write = write_82802ab,
3255 .read = read_memmapped,
3256 },
3257
3258 {
3259 .vendor = "Intel",
3260 .name = "28F400BV/CV/CE-B",
3261 .bustype = CHIP_BUSTYPE_PARALLEL,
3262 .manufacture_id = INTEL_ID,
3263 .model_id = P28F400BB,
3264 .total_size = 512,
3265 .page_size = 128 * 1024, /* maximal block size */
3266 .feature_bits = FEATURE_ADDR_SHIFTED,
3267 .tested = TEST_UNTESTED,
3268 .probe = probe_82802ab,
3269 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3270 .block_erasers =
3271 {
3272 {
3273 .eraseblocks = {
3274 {16 * 1024, 1},
3275 {8 * 1024, 2},
3276 {96 * 1024, 1},
3277 {128 * 1024, 3},
3278 },
3279 .block_erase = erase_block_82802ab,
3280 },
3281 },
3282 .write = write_82802ab,
3283 .read = read_memmapped,
3284 },
3285
3286 {
3287 .vendor = "Intel",
3288 .name = "28F400BV/CV/CE-T",
3289 .bustype = CHIP_BUSTYPE_PARALLEL,
3290 .manufacture_id = INTEL_ID,
3291 .model_id = P28F400BT,
3292 .total_size = 512,
3293 .page_size = 128 * 1024, /* maximal block size */
3294 .feature_bits = FEATURE_ADDR_SHIFTED,
3295 .tested = TEST_UNTESTED,
3296 .probe = probe_82802ab,
3297 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3298 .block_erasers =
3299 {
3300 {
3301 .eraseblocks = {
3302 {128 * 1024, 3},
3303 {96 * 1024, 1},
3304 {8 * 1024, 2},
3305 {16 * 1024, 1},
3306 },
3307 .block_erase = erase_block_82802ab,
3308 },
3309 },
3310 .write = write_82802ab,
3311 .read = read_memmapped,
3312 },
3313
3314 {
3315 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003316 .name = "82802AB",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003317 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003318 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003319 .model_id = I_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003320 .total_size = 512,
3321 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003322 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003323 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003324 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003325 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003326 .block_erasers =
3327 {
3328 {
3329 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00003330 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003331 },
3332 },
Sean Nelson28accc22010-03-19 18:47:06 +00003333 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003334 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003335 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003336 },
3337
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003338 {
3339 .vendor = "Intel",
3340 .name = "82802AC",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003341 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003342 .manufacture_id = INTEL_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003343 .model_id = I_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003344 .total_size = 1024,
3345 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00003346 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00003347 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003348 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003349 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003350 .block_erasers =
3351 {
3352 {
3353 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00003354 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00003355 },
3356 },
Sean Nelson28accc22010-03-19 18:47:06 +00003357 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003358 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003359 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003360 },
3361
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003362 {
3363 .vendor = "Macronix",
3364 .name = "MX25L512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003365 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003366 .manufacture_id = MX_ID,
3367 .model_id = MX_25L512,
3368 .total_size = 64,
3369 .page_size = 256,
3370 .tested = TEST_UNTESTED,
3371 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003372 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003373 .block_erasers =
3374 {
3375 {
3376 .eraseblocks = { {4 * 1024, 16} },
3377 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003378 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003379 .eraseblocks = { {64 * 1024, 1} },
3380 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003381 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003382 .eraseblocks = { {64 * 1024, 1} },
3383 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003384 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003385 .eraseblocks = { {64 * 1024, 1} },
3386 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003387 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003388 .eraseblocks = { {64 * 1024, 1} },
3389 .block_erase = spi_block_erase_c7,
3390 },
3391 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003392 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003393 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003394 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003395 },
3396
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003397 {
3398 .vendor = "Macronix",
3399 .name = "MX25L1005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003400 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003401 .manufacture_id = MX_ID,
3402 .model_id = MX_25L1005,
3403 .total_size = 128,
3404 .page_size = 256,
3405 .tested = TEST_UNTESTED,
3406 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003407 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003408 .block_erasers =
3409 {
3410 {
3411 .eraseblocks = { {4 * 1024, 32} },
3412 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003413 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003414 .eraseblocks = { {64 * 1024, 2} },
3415 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003416 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003417 .eraseblocks = { {128 * 1024, 1} },
3418 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003419 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00003420 .eraseblocks = { {128 * 1024, 1} },
3421 .block_erase = spi_block_erase_c7,
3422 },
3423 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003424 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003425 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003426 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003427 },
3428
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003429 {
3430 .vendor = "Macronix",
3431 .name = "MX25L2005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003432 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003433 .manufacture_id = MX_ID,
3434 .model_id = MX_25L2005,
3435 .total_size = 256,
3436 .page_size = 256,
3437 .tested = TEST_UNTESTED,
3438 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003439 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003440 .block_erasers =
3441 {
3442 {
3443 .eraseblocks = { {4 * 1024, 64} },
3444 .block_erase = spi_block_erase_20,
3445 }, {
3446 .eraseblocks = { {64 * 1024, 4} },
3447 .block_erase = spi_block_erase_52,
3448 }, {
3449 .eraseblocks = { {64 * 1024, 4} },
3450 .block_erase = spi_block_erase_d8,
3451 }, {
3452 .eraseblocks = { {256 * 1024, 1} },
3453 .block_erase = spi_block_erase_60,
3454 }, {
3455 .eraseblocks = { {256 * 1024, 1} },
3456 .block_erase = spi_block_erase_c7,
3457 },
3458 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003459 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003460 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003461 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003462 },
3463
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003464 {
3465 .vendor = "Macronix",
3466 .name = "MX25L4005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003467 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003468 .manufacture_id = MX_ID,
3469 .model_id = MX_25L4005,
3470 .total_size = 512,
3471 .page_size = 256,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003472 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003473 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003474 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003475 .block_erasers =
3476 {
3477 {
3478 .eraseblocks = { {4 * 1024, 128} },
3479 .block_erase = spi_block_erase_20,
3480 }, {
3481 .eraseblocks = { {64 * 1024, 8} },
3482 .block_erase = spi_block_erase_52,
3483 }, {
3484 .eraseblocks = { {64 * 1024, 8} },
3485 .block_erase = spi_block_erase_d8,
3486 }, {
3487 .eraseblocks = { {512 * 1024, 1} },
3488 .block_erase = spi_block_erase_60,
3489 }, {
3490 .eraseblocks = { {512 * 1024, 1} },
3491 .block_erase = spi_block_erase_c7,
3492 },
3493 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003494 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003495 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003496 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003497 },
3498
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003499 {
3500 .vendor = "Macronix",
3501 .name = "MX25L8005",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003502 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003503 .manufacture_id = MX_ID,
3504 .model_id = MX_25L8005,
3505 .total_size = 1024,
3506 .page_size = 256,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003507 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003508 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003509 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003510 .block_erasers =
3511 {
3512 {
3513 .eraseblocks = { {4 * 1024, 256} },
3514 .block_erase = spi_block_erase_20,
3515 }, {
3516 .eraseblocks = { {64 * 1024, 16} },
3517 .block_erase = spi_block_erase_52,
3518 }, {
3519 .eraseblocks = { {64 * 1024, 16} },
3520 .block_erase = spi_block_erase_d8,
3521 }, {
3522 .eraseblocks = { {1024 * 1024, 1} },
3523 .block_erase = spi_block_erase_60,
3524 }, {
3525 .eraseblocks = { {1024 * 1024, 1} },
3526 .block_erase = spi_block_erase_c7,
3527 },
3528 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003529 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003530 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003531 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003532 },
3533
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003534 {
3535 .vendor = "Macronix",
3536 .name = "MX25L1605",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003537 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003538 .manufacture_id = MX_ID,
3539 .model_id = MX_25L1605,
3540 .total_size = 2048,
3541 .page_size = 256,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003542 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003543 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003544 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00003545 .block_erasers =
3546 {
3547 {
3548 .eraseblocks = { {4 * 1024, 512} },
3549 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
3550 }, {
3551 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
3552 .block_erase = spi_block_erase_52,
3553 }, {
3554 .eraseblocks = { {64 * 1024, 32} },
3555 .block_erase = spi_block_erase_d8,
3556 }, {
3557 .eraseblocks = { {2 * 1024 * 1024, 1} },
3558 .block_erase = spi_block_erase_60,
3559 }, {
3560 .eraseblocks = { {2 * 1024 * 1024, 1} },
3561 .block_erase = spi_block_erase_c7,
3562 },
3563 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003564 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003565 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003566 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003567 },
3568
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003569 {
3570 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003571 .name = "MX25L1635D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003572 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003573 .manufacture_id = MX_ID,
3574 .model_id = MX_25L1635D,
3575 .total_size = 2048,
3576 .page_size = 256,
3577 .tested = TEST_UNTESTED,
3578 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003579 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003580 .block_erasers =
3581 {
3582 {
3583 .eraseblocks = { {4 * 1024, 512} },
3584 .block_erase = spi_block_erase_20,
3585 }, {
3586 .eraseblocks = { {64 * 1024, 32} },
3587 .block_erase = spi_block_erase_d8,
3588 }, {
3589 .eraseblocks = { {2 * 1024 * 1024, 1} },
3590 .block_erase = spi_block_erase_60,
3591 }, {
3592 .eraseblocks = { {2 * 1024 * 1024, 1} },
3593 .block_erase = spi_block_erase_c7,
3594 }
3595 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003596 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003597 .write = spi_chip_write_256,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003598 .read = spi_chip_read,
3599 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00003600
Stephan Guillouxf5c70902009-04-19 23:04:00 +00003601 {
3602 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003603 .name = "MX25L3205",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003604 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003605 .manufacture_id = MX_ID,
3606 .model_id = MX_25L3205,
3607 .total_size = 4096,
3608 .page_size = 256,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003609 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003610 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003611 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003612 .block_erasers =
3613 {
3614 {
3615 .eraseblocks = { {4 * 1024, 1024} },
3616 .block_erase = spi_block_erase_20,
3617 }, {
3618 .eraseblocks = { {4 * 1024, 1024} },
3619 .block_erase = spi_block_erase_d8,
3620 }, {
3621 .eraseblocks = { {4 * 1024 * 1024, 1} },
3622 .block_erase = spi_block_erase_60,
3623 }, {
3624 .eraseblocks = { {4 * 1024 * 1024, 1} },
3625 .block_erase = spi_block_erase_c7,
3626 },
3627 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003628 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003629 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003630 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003631 },
3632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003633 {
3634 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003635 .name = "MX25L3235D",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003636 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003637 .manufacture_id = MX_ID,
3638 .model_id = MX_25L3235D,
3639 .total_size = 4096,
3640 .page_size = 256,
3641 .tested = TEST_UNTESTED,
3642 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003643 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003644 .block_erasers =
3645 {
3646 {
3647 .eraseblocks = { {4 * 1024, 1024} },
3648 .block_erase = spi_block_erase_20,
3649 }, {
3650 .eraseblocks = { {64 * 1024, 64} },
3651 .block_erase = spi_block_erase_d8,
3652 }, {
3653 .eraseblocks = { {4 * 1024 * 1024, 1} },
3654 .block_erase = spi_block_erase_60,
3655 }, {
3656 .eraseblocks = { {4 * 1024 * 1024, 1} },
3657 .block_erase = spi_block_erase_c7,
3658 }
3659 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003660 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003661 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00003662 .read = spi_chip_read,
3663 },
3664
3665 {
3666 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003667 .name = "MX25L6405",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003668 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003669 .manufacture_id = MX_ID,
3670 .model_id = MX_25L6405,
3671 .total_size = 8192,
3672 .page_size = 256,
Carl-Daniel Hailfinger452b3e32009-06-22 11:14:43 +00003673 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003674 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003675 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003676 .block_erasers =
3677 {
3678 {
3679 .eraseblocks = { {64 * 1024, 128} },
3680 .block_erase = spi_block_erase_20,
3681 }, {
3682 .eraseblocks = { {64 * 1024, 128} },
3683 .block_erase = spi_block_erase_d8,
3684 }, {
3685 .eraseblocks = { {8 * 1024 * 1024, 1} },
3686 .block_erase = spi_block_erase_60,
3687 }, {
3688 .eraseblocks = { {8 * 1024 * 1024, 1} },
3689 .block_erase = spi_block_erase_c7,
3690 }
3691 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003692 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003693 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003694 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003695 },
3696
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003697 {
3698 .vendor = "Macronix",
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003699 .name = "MX25L12805",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003700 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003701 .manufacture_id = MX_ID,
3702 .model_id = MX_25L12805,
3703 .total_size = 16384,
3704 .page_size = 256,
3705 .tested = TEST_UNTESTED,
3706 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003707 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003708 .block_erasers =
3709 {
3710 {
3711 .eraseblocks = { {4 * 1024, 4096} },
3712 .block_erase = spi_block_erase_20,
3713 }, {
3714 .eraseblocks = { {64 * 1024, 256} },
3715 .block_erase = spi_block_erase_d8,
3716 }, {
3717 .eraseblocks = { {16 * 1024 * 1024, 1} },
3718 .block_erase = spi_block_erase_60,
3719 }, {
3720 .eraseblocks = { {16 * 1024 * 1024, 1} },
3721 .block_erase = spi_block_erase_c7,
3722 }
3723 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003724 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003725 .write = spi_chip_write_256,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00003726 .read = spi_chip_read,
3727 },
3728
3729 {
3730 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00003731 .name = "MX29F001B",
3732 .bustype = CHIP_BUSTYPE_PARALLEL,
3733 .manufacture_id = MX_ID,
3734 .model_id = MX_29F001B,
3735 .total_size = 128,
3736 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003737 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3738 .tested = TEST_UNTESTED,
3739 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003740 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003741 .block_erasers =
3742 {
3743 {
3744 .eraseblocks = {
3745 {8 * 1024, 1},
3746 {4 * 1024, 2},
3747 {8 * 1024, 2},
3748 {32 * 1024, 1},
3749 {64 * 1024, 1},
3750 },
Sean Nelson35727f72010-01-28 23:55:12 +00003751 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003752 }, {
3753 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003754 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003755 }
3756 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003757 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003758 .read = read_memmapped,
3759 },
3760
3761 {
3762 .vendor = "Macronix",
3763 .name = "MX29F001T",
3764 .bustype = CHIP_BUSTYPE_PARALLEL,
3765 .manufacture_id = MX_ID,
3766 .model_id = MX_29F001T,
3767 .total_size = 128,
3768 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003769 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3770 .tested = TEST_UNTESTED,
3771 .probe = probe_jedec,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003772 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003773 .block_erasers =
3774 {
3775 {
3776 .eraseblocks = {
3777 {64 * 1024, 1},
3778 {32 * 1024, 1},
3779 {8 * 1024, 2},
3780 {4 * 1024, 2},
3781 {8 * 1024, 1},
3782 },
Sean Nelson35727f72010-01-28 23:55:12 +00003783 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003784 }, {
3785 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003786 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003787 }
3788 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003789 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00003790 .read = read_memmapped,
3791 },
3792
3793 {
3794 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003795 .name = "MX29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00003796 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003797 .manufacture_id = MX_ID,
3798 .model_id = MX_29F002B,
3799 .total_size = 256,
3800 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003801 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003802 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00003803 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003804 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003805 .block_erasers =
3806 {
3807 {
3808 .eraseblocks = {
3809 {16 * 1024, 1},
3810 {8 * 1024, 2},
3811 {32 * 1024, 1},
3812 {64 * 1024, 3},
3813 },
Sean Nelson35727f72010-01-28 23:55:12 +00003814 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003815 }, {
3816 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003817 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003818 },
3819 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003820 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003821 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003822 },
3823
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003824 {
3825 .vendor = "Macronix",
3826 .name = "MX29F002T",
Urja Rannikko038a3122009-06-28 19:19:25 +00003827 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003828 .manufacture_id = MX_ID,
3829 .model_id = MX_29F002T,
3830 .total_size = 256,
3831 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003832 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00003833 .tested = TEST_OK_PRW,
Sean Nelson35727f72010-01-28 23:55:12 +00003834 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003835 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00003836 .block_erasers =
3837 {
3838 {
3839 .eraseblocks = {
3840 {64 * 1024, 3},
3841 {32 * 1024, 1},
3842 {8 * 1024, 2},
3843 {16 * 1024, 1},
3844 },
Sean Nelson35727f72010-01-28 23:55:12 +00003845 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003846 }, {
3847 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003848 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003849 },
3850 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003851 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003852 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00003853 },
3854
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003855 {
3856 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003857 .name = "MX29LV040",
Urja Rannikko038a3122009-06-28 19:19:25 +00003858 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003859 .manufacture_id = MX_ID,
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00003860 .model_id = MX_29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003861 .total_size = 512,
3862 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00003863 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
3864 .tested = TEST_UNTESTED,
3865 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00003866 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
Sean Nelson54596372010-01-09 05:30:14 +00003867 .block_erasers =
3868 {
3869 {
3870 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00003871 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003872 }, {
3873 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00003874 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00003875 },
3876 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00003877 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003878 .read = read_memmapped,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00003879 },
3880
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003881 {
3882 .vendor = "Numonyx",
3883 .name = "M25PE10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003884 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003885 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003886 .model_id = ST_M25PE10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003887 .total_size = 128,
3888 .page_size = 256,
3889 .tested = TEST_UNTESTED,
3890 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003891 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00003892 .block_erasers =
3893 {
3894 {
3895 .eraseblocks = { {4 * 1024, 32} },
3896 .block_erase = spi_block_erase_20,
3897 }, {
3898 .eraseblocks = { {64 * 1024, 2} },
3899 .block_erase = spi_block_erase_d8,
3900 }, {
3901 .eraseblocks = { {128 * 1024, 1} },
3902 .block_erase = spi_block_erase_c7,
3903 }
3904 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003905 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003906 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003907 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003908 },
3909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003910 {
3911 .vendor = "Numonyx",
3912 .name = "M25PE20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003913 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003914 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003915 .model_id = ST_M25PE20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003916 .total_size = 256,
3917 .page_size = 256,
3918 .tested = TEST_UNTESTED,
3919 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003920 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00003921 .block_erasers =
3922 {
3923 {
3924 .eraseblocks = { {4 * 1024, 64} },
3925 .block_erase = spi_block_erase_20,
3926 }, {
3927 .eraseblocks = { {64 * 1024, 4} },
3928 .block_erase = spi_block_erase_d8,
3929 }, {
3930 .eraseblocks = { {256 * 1024, 1} },
3931 .block_erase = spi_block_erase_c7,
3932 }
3933 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003934 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003935 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003936 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003937 },
3938
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003939 {
3940 .vendor = "Numonyx",
3941 .name = "M25PE40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003942 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003943 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003944 .model_id = ST_M25PE40,
Sean Nelson5643c072010-01-19 03:23:07 +00003945 .total_size = 512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003946 .page_size = 256,
3947 .tested = TEST_UNTESTED,
3948 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003949 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00003950 .block_erasers =
3951 {
3952 {
3953 .eraseblocks = { {4 * 1024, 128} },
3954 .block_erase = spi_block_erase_20,
3955 }, {
3956 .eraseblocks = { {64 * 1024, 8} },
3957 .block_erase = spi_block_erase_d8,
3958 }, {
3959 .eraseblocks = { {512 * 1024, 1} },
3960 .block_erase = spi_block_erase_c7,
3961 }
3962 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003963 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003964 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003965 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003966 },
3967
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003968 {
3969 .vendor = "Numonyx",
3970 .name = "M25PE80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00003971 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003972 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00003973 .model_id = ST_M25PE80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003974 .total_size = 1024,
3975 .page_size = 256,
3976 .tested = TEST_OK_PREW,
3977 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003978 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00003979 .block_erasers =
3980 {
3981 {
3982 .eraseblocks = { {4 * 1024, 256} },
3983 .block_erase = spi_block_erase_20,
3984 }, {
3985 .eraseblocks = { {64 * 1024, 16} },
3986 .block_erase = spi_block_erase_d8,
3987 }, {
3988 .eraseblocks = { {1024 * 1024, 1} },
3989 .block_erase = spi_block_erase_c7,
3990 }
3991 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003992 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00003993 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003994 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00003995 },
3996
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003997 {
3998 .vendor = "Numonyx",
3999 .name = "M25PE16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004000 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004001 .manufacture_id = ST_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004002 .model_id = ST_M25PE16,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004003 .total_size = 2048,
4004 .page_size = 256,
4005 .tested = TEST_UNTESTED,
4006 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004007 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004008 .block_erasers =
4009 {
4010 {
4011 .eraseblocks = { {4 * 1024, 512} },
4012 .block_erase = spi_block_erase_20,
4013 }, {
4014 .eraseblocks = { {64 * 1024, 32} },
4015 .block_erase = spi_block_erase_d8,
4016 }, {
4017 .eraseblocks = { {2 * 1024 * 1024, 1} },
4018 .block_erase = spi_block_erase_c7,
4019 }
4020 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004021 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004022 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004023 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004024 },
4025
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004026 {
4027 .vendor = "PMC",
4028 .name = "Pm25LV010",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004029 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004030 .manufacture_id = PMC_ID,
4031 .model_id = PMC_25LV010,
4032 .total_size = 128,
4033 .page_size = 256,
4034 .tested = TEST_UNTESTED,
4035 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004036 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004037 .block_erasers =
4038 {
4039 {
4040 .eraseblocks = { {4 * 1024, 32} },
4041 .block_erase = spi_block_erase_d7,
4042 }, {
4043 .eraseblocks = { {32 * 1024, 4} },
4044 .block_erase = spi_block_erase_d8,
4045 }, {
4046 .eraseblocks = { {128 * 1024, 1} },
4047 .block_erase = spi_block_erase_c7,
4048 }
4049 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004050 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004051 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004052 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004053 },
4054
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004055 {
4056 .vendor = "PMC",
4057 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004058 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004059 .manufacture_id = PMC_ID,
4060 .model_id = PMC_25LV016B,
4061 .total_size = 2048,
4062 .page_size = 256,
4063 .tested = TEST_UNTESTED,
4064 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004065 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004066 .block_erasers =
4067 {
4068 {
4069 .eraseblocks = { {4 * 1024, 512} },
4070 .block_erase = spi_block_erase_d7,
4071 }, {
4072 .eraseblocks = { {4 * 1024, 512} },
4073 .block_erase = spi_block_erase_20,
4074 }, {
4075 .eraseblocks = { {64 * 1024, 32} },
4076 .block_erase = spi_block_erase_d8,
4077 }, {
4078 .eraseblocks = { {2 * 1024 * 1024, 1} },
4079 .block_erase = spi_block_erase_60,
4080 }, {
4081 .eraseblocks = { {2 * 1024 * 1024, 1} },
4082 .block_erase = spi_block_erase_c7,
4083 }
4084 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004085 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004086 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004087 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004088 },
4089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004090 {
4091 .vendor = "PMC",
4092 .name = "Pm25LV020",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004093 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004094 .manufacture_id = PMC_ID,
4095 .model_id = PMC_25LV020,
4096 .total_size = 256,
4097 .page_size = 256,
4098 .tested = TEST_UNTESTED,
4099 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004100 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004101 .block_erasers =
4102 {
4103 {
4104 .eraseblocks = { {4 * 1024, 64} },
4105 .block_erase = spi_block_erase_d7,
4106 }, {
4107 .eraseblocks = { {64 * 1024, 4} },
4108 .block_erase = spi_block_erase_d8,
4109 }, {
4110 .eraseblocks = { {256 * 1024, 1} },
4111 .block_erase = spi_block_erase_c7,
4112 }
4113 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004114 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004115 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004116 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004117 },
4118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004119 {
4120 .vendor = "PMC",
4121 .name = "Pm25LV040",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004122 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004123 .manufacture_id = PMC_ID,
4124 .model_id = PMC_25LV040,
4125 .total_size = 512,
4126 .page_size = 256,
4127 .tested = TEST_UNTESTED,
4128 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004129 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004130 .block_erasers =
4131 {
4132 {
4133 .eraseblocks = { {4 * 1024, 128} },
4134 .block_erase = spi_block_erase_d7,
4135 }, {
4136 .eraseblocks = { {64 * 1024, 8} },
4137 .block_erase = spi_block_erase_d8,
4138 }, {
4139 .eraseblocks = { {512 * 1024, 1} },
4140 .block_erase = spi_block_erase_c7,
4141 }
4142 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004143 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004144 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004145 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004146 },
4147
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004148 {
4149 .vendor = "PMC",
4150 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004151 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004152 .manufacture_id = PMC_ID,
4153 .model_id = PMC_25LV080B,
4154 .total_size = 1024,
4155 .page_size = 256,
4156 .tested = TEST_UNTESTED,
4157 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004158 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004159 .block_erasers =
4160 {
4161 {
4162 .eraseblocks = { {4 * 1024, 256} },
4163 .block_erase = spi_block_erase_d7,
4164 }, {
4165 .eraseblocks = { {4 * 1024, 256} },
4166 .block_erase = spi_block_erase_20,
4167 }, {
4168 .eraseblocks = { {64 * 1024, 16} },
4169 .block_erase = spi_block_erase_d8,
4170 }, {
4171 .eraseblocks = { {1024 * 1024, 1} },
4172 .block_erase = spi_block_erase_60,
4173 }, {
4174 .eraseblocks = { {1024 * 1024, 1} },
4175 .block_erase = spi_block_erase_c7,
4176 }
4177 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004178 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004179 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004180 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004181 },
4182
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004183 {
4184 .vendor = "PMC",
4185 .name = "Pm25LV512",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004186 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004187 .manufacture_id = PMC_ID,
4188 .model_id = PMC_25LV512,
4189 .total_size = 64,
4190 .page_size = 256,
4191 .tested = TEST_UNTESTED,
4192 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004193 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004194 .block_erasers =
4195 {
4196 {
4197 .eraseblocks = { {4 * 1024, 16} },
4198 .block_erase = spi_block_erase_d7,
4199 }, {
4200 .eraseblocks = { {32 * 1024, 2} },
4201 .block_erase = spi_block_erase_d8,
4202 }, {
4203 .eraseblocks = { {64 * 1024, 1} },
4204 .block_erase = spi_block_erase_c7,
4205 }
4206 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004207 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004208 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004209 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004210 },
4211
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004212 {
4213 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004214 .name = "Pm29F002T",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004215 .bustype = CHIP_BUSTYPE_PARALLEL,
4216 .manufacture_id = PMC_ID_NOPREFIX,
4217 .model_id = PMC_29F002T,
4218 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00004219 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004220 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4221 .tested = TEST_UNTESTED,
4222 .probe = probe_jedec,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004223 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00004224 .block_erasers =
4225 {
4226 {
4227 .eraseblocks = {
4228 {128 * 1024, 1},
4229 {96 * 1024, 1},
4230 {8 * 1024, 2},
4231 {16 * 1024, 1},
4232 },
Sean Nelson35727f72010-01-28 23:55:12 +00004233 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004234 }, {
4235 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004236 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004237 },
4238 },
Sean Nelson35727f72010-01-28 23:55:12 +00004239 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004240 .read = read_memmapped,
4241 },
4242
4243 {
4244 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00004245 .name = "Pm29F002B",
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004246 .bustype = CHIP_BUSTYPE_PARALLEL,
4247 .manufacture_id = PMC_ID_NOPREFIX,
4248 .model_id = PMC_29F002B,
4249 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00004250 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004251 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004252 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00004253 .probe = probe_jedec,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004254 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00004255 .block_erasers =
4256 {
4257 {
4258 .eraseblocks = {
4259 {16 * 1024, 1},
4260 {8 * 1024, 2},
4261 {96 * 1024, 1},
4262 {128 * 1024, 1},
4263 },
Sean Nelson35727f72010-01-28 23:55:12 +00004264 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004265 }, {
4266 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004267 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00004268 },
4269 },
Sean Nelson35727f72010-01-28 23:55:12 +00004270 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00004271 .read = read_memmapped,
4272 },
4273
4274 {
4275 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004276 .name = "Pm39LV010",
Urja Rannikko038a3122009-06-28 19:19:25 +00004277 .bustype = CHIP_BUSTYPE_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004278 .manufacture_id = PMC_ID_NOPREFIX,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004279 .model_id = PMC_39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004280 .total_size = 128,
4281 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004282 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00004283 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004284 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004285 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00004286 .block_erasers =
4287 {
4288 {
4289 .eraseblocks = { {4 * 1024, 32} },
4290 .block_erase = erase_sector_jedec,
4291 }, {
4292 .eraseblocks = { {64 * 1024, 2} },
4293 .block_erase = erase_block_jedec,
4294 }, {
4295 .eraseblocks = { {128 * 1024, 1} },
4296 .block_erase = erase_chip_block_jedec,
4297 }
4298 },
Sean Nelson35727f72010-01-28 23:55:12 +00004299 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00004300 .read = read_memmapped,
4301 },
4302
4303 {
4304 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00004305 .name = "Pm39LV020",
4306 .bustype = CHIP_BUSTYPE_PARALLEL,
4307 .manufacture_id = PMC_ID_NOPREFIX,
4308 .model_id = PMC_39LV020,
4309 .total_size = 256,
4310 .page_size = 4096,
4311 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4312 .tested = TEST_UNTESTED,
4313 .probe = probe_jedec,
4314 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4315 .block_erasers =
4316 {
4317 {
4318 .eraseblocks = { {4 * 1024, 64} },
4319 .block_erase = erase_sector_jedec,
4320 }, {
4321 .eraseblocks = { {64 * 1024, 4} },
4322 .block_erase = erase_block_jedec,
4323 }, {
4324 .eraseblocks = { {256 * 1024, 1} },
4325 .block_erase = erase_chip_block_jedec,
4326 }
4327 },
4328 .write = write_jedec_1,
4329 .read = read_memmapped,
4330 },
4331
4332 {
4333 .vendor = "PMC",
4334 .name = "Pm39LV040",
4335 .bustype = CHIP_BUSTYPE_PARALLEL,
4336 .manufacture_id = PMC_ID_NOPREFIX,
4337 .model_id = PMC_39LV040,
4338 .total_size = 512,
4339 .page_size = 4096,
4340 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4341 .tested = TEST_UNTESTED,
4342 .probe = probe_jedec,
4343 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4344 .block_erasers =
4345 {
4346 {
4347 .eraseblocks = { {4 * 1024, 128} },
4348 .block_erase = erase_sector_jedec,
4349 }, {
4350 .eraseblocks = { {64 * 1024, 8} },
4351 .block_erase = erase_block_jedec,
4352 }, {
4353 .eraseblocks = { {512 * 1024, 1} },
4354 .block_erase = erase_chip_block_jedec,
4355 }
4356 },
4357 .write = write_jedec_1,
4358 .read = read_memmapped,
4359 },
4360
4361 {
4362 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004363 .name = "Pm49FL002",
Sean Nelson35727f72010-01-28 23:55:12 +00004364 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux*/
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004365 .manufacture_id = PMC_ID_NOPREFIX,
4366 .model_id = PMC_49FL002,
4367 .total_size = 256,
4368 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004369 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Russ Dill8c7c4682010-03-09 16:53:06 +00004370 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004371 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004372 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004373 .block_erasers =
4374 {
4375 {
4376 .eraseblocks = { {4 * 1024, 64} },
4377 .block_erase = erase_sector_jedec,
4378 }, {
4379 .eraseblocks = { {16 * 1024, 16} },
4380 .block_erase = erase_block_jedec,
4381 }, {
4382 .eraseblocks = { {256 * 1024, 1} },
4383 .block_erase = erase_chip_block_jedec,
4384 }
4385 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004386 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004387 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004388 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004389 },
4390
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004391 {
4392 .vendor = "PMC",
4393 .name = "Pm49FL004",
Sean Nelson35727f72010-01-28 23:55:12 +00004394 .bustype = CHIP_BUSTYPE_LPC | CHIP_BUSTYPE_FWH, /* A/A Mux*/
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004395 .manufacture_id = PMC_ID_NOPREFIX,
4396 .model_id = PMC_49FL004,
4397 .total_size = 512,
4398 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004399 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00004400 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00004401 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004402 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00004403 .block_erasers =
4404 {
4405 {
4406 .eraseblocks = { {4 * 1024, 128} },
4407 .block_erase = erase_sector_jedec,
4408 }, {
4409 .eraseblocks = { {64 * 1024, 8} },
4410 .block_erase = erase_block_jedec,
4411 }, {
4412 .eraseblocks = { {512 * 1024, 1} },
4413 .block_erase = erase_chip_block_jedec,
4414 }
4415 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00004416 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00004417 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004418 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004419 },
4420
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004421 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00004422 .vendor = "Sanyo",
4423 .name = "LF25FW203A",
4424 .bustype = CHIP_BUSTYPE_SPI,
4425 .manufacture_id = SANYO_ID,
4426 .model_id = SANYO_LE25FW203A,
4427 .total_size = 2048,
4428 .page_size = 256,
4429 .tested = TEST_UNTESTED,
4430 .probe = probe_spi_rdid,
4431 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004432 .block_erasers =
4433 {
4434 {
4435 .eraseblocks = { {64 * 1024, 32} },
4436 .block_erase = spi_block_erase_d8,
4437 }, {
4438 .eraseblocks = { {2 * 1024 * 1024, 1} },
4439 .block_erase = spi_block_erase_c7,
4440 }
4441 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004442 .unlock = spi_disable_blockprotect,
Sean Nelsond70b09c2009-11-24 02:11:08 +00004443 .write = spi_chip_write_256,
4444 .read = spi_chip_read,
4445 },
4446
4447 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004448 .vendor = "Sharp",
4449 .name = "LHF00L04",
Urja Rannikko038a3122009-06-28 19:19:25 +00004450 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004451 .manufacture_id = SHARP_ID,
4452 .model_id = SHARP_LHF00L04,
4453 .total_size = 1024,
4454 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004455 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004456 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004457 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004458 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004459 .block_erasers =
4460 {
4461 {
4462 .eraseblocks = {
4463 {64 * 1024, 15},
4464 {8 * 1024, 8}
4465 },
Sean Nelson28accc22010-03-19 18:47:06 +00004466 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004467 }, {
4468 .eraseblocks = {
4469 {1024 * 1024, 1}
4470 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00004471 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00004472 },
4473 },
Sean Nelson28accc22010-03-19 18:47:06 +00004474 .unlock = unlock_82802ab,
4475 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004476 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004477 },
4478
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004479 {
4480 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00004481 .name = "S25FL008A",
4482 .bustype = CHIP_BUSTYPE_SPI,
4483 .manufacture_id = SPANSION_ID,
4484 .model_id = SPANSION_S25FL008A,
4485 .total_size = 1024,
4486 .page_size = 256,
4487 .tested = TEST_OK_PREW,
4488 .probe = probe_spi_rdid,
4489 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00004490 .block_erasers =
4491 {
4492 {
4493 .eraseblocks = { {64 * 1024, 16} },
4494 .block_erase = spi_block_erase_d8,
4495 }, {
4496 .eraseblocks = { {1024 * 1024, 1} },
4497 .block_erase = spi_block_erase_c7,
4498 }
4499 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004500 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00004501 .write = spi_chip_write_256,
4502 .read = spi_chip_read,
4503 },
4504
4505 {
4506 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004507 .name = "S25FL016A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004508 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004509 .manufacture_id = SPANSION_ID,
4510 .model_id = SPANSION_S25FL016A,
4511 .total_size = 2048,
4512 .page_size = 256,
Sean Nelson5643c072010-01-19 03:23:07 +00004513 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004514 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004515 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00004516 .block_erasers =
4517 {
4518 {
4519 .eraseblocks = { {64 * 1024, 32} },
4520 .block_erase = spi_block_erase_d8,
4521 }, {
4522 .eraseblocks = { {2 * 1024 * 1024, 1} },
4523 .block_erase = spi_block_erase_c7,
4524 }
4525 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004526 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004527 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004528 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004529 },
4530
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004531 {
4532 .vendor = "SST",
4533 .name = "SST25VF016B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004534 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004535 .manufacture_id = SST_ID,
4536 .model_id = SST_25VF016B,
4537 .total_size = 2048,
4538 .page_size = 256,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004539 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004540 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004541 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004542 .block_erasers =
4543 {
4544 {
4545 .eraseblocks = { {4 * 1024, 512} },
4546 .block_erase = spi_block_erase_20,
4547 }, {
4548 .eraseblocks = { {32 * 1024, 64} },
4549 .block_erase = spi_block_erase_52,
4550 }, {
4551 .eraseblocks = { {64 * 1024, 32} },
4552 .block_erase = spi_block_erase_d8,
4553 }, {
4554 .eraseblocks = { {2 * 1024 * 1024, 1} },
4555 .block_erase = spi_block_erase_60,
4556 }, {
4557 .eraseblocks = { {2 * 1024 * 1024, 1} },
4558 .block_erase = spi_block_erase_c7,
4559 },
4560 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004561 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004562 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004563 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004564 },
4565
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004566 {
4567 .vendor = "SST",
4568 .name = "SST25VF032B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004569 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004570 .manufacture_id = SST_ID,
4571 .model_id = SST_25VF032B,
4572 .total_size = 4096,
4573 .page_size = 256,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004574 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004575 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004576 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004577 .block_erasers =
4578 {
4579 {
4580 .eraseblocks = { {4 * 1024, 1024} },
4581 .block_erase = spi_block_erase_20,
4582 }, {
4583 .eraseblocks = { {32 * 1024, 128} },
4584 .block_erase = spi_block_erase_52,
4585 }, {
4586 .eraseblocks = { {64 * 1024, 64} },
4587 .block_erase = spi_block_erase_d8,
4588 }, {
4589 .eraseblocks = { {4 * 1024 * 1024, 1} },
4590 .block_erase = spi_block_erase_60,
4591 }, {
4592 .eraseblocks = { {4 * 1024 * 1024, 1} },
4593 .block_erase = spi_block_erase_c7,
4594 },
4595 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004596 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004597 .write = spi_chip_write_1,
4598 .read = spi_chip_read,
4599 },
4600
4601 {
4602 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00004603 .name = "SST25VF064C",
4604 .bustype = CHIP_BUSTYPE_SPI,
4605 .manufacture_id = SST_ID,
4606 .model_id = SST_25VF064C,
4607 .total_size = 8192,
4608 .page_size = 256,
4609 .tested = TEST_OK_PREW,
4610 .probe = probe_spi_rdid,
4611 .probe_timing = TIMING_ZERO,
4612 .block_erasers =
4613 {
4614 {
4615 .eraseblocks = { {4 * 1024, 2048} },
4616 .block_erase = spi_block_erase_20,
4617 }, {
4618 .eraseblocks = { {32 * 1024, 256} },
4619 .block_erase = spi_block_erase_52,
4620 }, {
4621 .eraseblocks = { {64 * 1024, 128} },
4622 .block_erase = spi_block_erase_d8,
4623 }, {
4624 .eraseblocks = { {8 * 1024 * 1024, 1} },
4625 .block_erase = spi_block_erase_60,
4626 }, {
4627 .eraseblocks = { {8 * 1024 * 1024, 1} },
4628 .block_erase = spi_block_erase_c7,
4629 },
4630 },
4631 .unlock = spi_disable_blockprotect,
4632 .write = spi_chip_write_1,
4633 .read = spi_chip_read,
4634 },
4635
4636 {
4637 .vendor = "SST",
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004638 .name = "SST25VF040.REMS",
4639 .bustype = CHIP_BUSTYPE_SPI,
4640 .manufacture_id = SST_ID,
4641 .model_id = SST_25VF040_REMS,
4642 .total_size = 512,
4643 .page_size = 256,
4644 .tested = TEST_OK_PR,
4645 .probe = probe_spi_rems,
4646 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004647 .block_erasers =
4648 {
4649 {
4650 .eraseblocks = { {4 * 1024, 128} },
4651 .block_erase = spi_block_erase_20,
4652 }, {
4653 .eraseblocks = { {32 * 1024, 16} },
4654 .block_erase = spi_block_erase_52,
4655 }, {
4656 .eraseblocks = { {512 * 1024, 1} },
4657 .block_erase = spi_block_erase_60,
4658 },
4659 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004660 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004661 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004662 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004663 },
4664
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004665 {
4666 .vendor = "SST",
4667 .name = "SST25VF040B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004668 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004669 .manufacture_id = SST_ID,
4670 .model_id = SST_25VF040B,
4671 .total_size = 512,
4672 .page_size = 256,
4673 .tested = TEST_UNTESTED,
4674 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004675 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004676 .block_erasers =
4677 {
4678 {
4679 .eraseblocks = { {4 * 1024, 128} },
4680 .block_erase = spi_block_erase_20,
4681 }, {
4682 .eraseblocks = { {32 * 1024, 16} },
4683 .block_erase = spi_block_erase_52,
4684 }, {
4685 .eraseblocks = { {64 * 1024, 8} },
4686 .block_erase = spi_block_erase_d8,
4687 }, {
4688 .eraseblocks = { {512 * 1024, 1} },
4689 .block_erase = spi_block_erase_60,
4690 }, {
4691 .eraseblocks = { {512 * 1024, 1} },
4692 .block_erase = spi_block_erase_c7,
4693 },
4694 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004695 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004696 .write = spi_chip_write_1,
Zheng Bao0677dff2009-02-25 08:07:33 +00004697 .read = spi_chip_read,
4698 },
4699
4700 {
4701 .vendor = "SST",
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004702 .name = "SST25LF040A.RES",
4703 .bustype = CHIP_BUSTYPE_SPI,
4704 .manufacture_id = SST_ID,
4705 .model_id = SST_25VF040_REMS,
4706 .total_size = 512,
4707 .page_size = 256,
4708 .tested = TEST_OK_PROBE,
4709 .probe = probe_spi_res2,
4710 .probe_timing = TIMING_ZERO,
4711 .block_erasers =
4712 {
4713 {
4714 .eraseblocks = { {4 * 1024, 128} },
4715 .block_erase = spi_block_erase_20,
4716 }, {
4717 .eraseblocks = { {32 * 1024, 16} },
4718 .block_erase = spi_block_erase_52,
4719 }, {
4720 .eraseblocks = { {512 * 1024, 1} },
4721 .block_erase = spi_block_erase_60,
4722 },
4723 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004724 .unlock = spi_disable_blockprotect,
Stefan Reinauer5cacf8c2010-06-14 12:58:06 +00004725 .write = spi_chip_write_1,
4726 .read = spi_chip_read,
4727 },
4728
4729 {
4730 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00004731 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004732 .bustype = CHIP_BUSTYPE_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004733 .manufacture_id = SST_ID,
4734 .model_id = SST_25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00004735 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004736 .page_size = 256,
Peter Stugefd9217d2009-01-26 03:37:40 +00004737 .tested = TEST_OK_PR,
4738 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004739 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004740 .block_erasers =
4741 {
4742 {
4743 .eraseblocks = { {4 * 1024, 128} },
4744 .block_erase = spi_block_erase_20,
4745 }, {
4746 .eraseblocks = { {32 * 1024, 16} },
4747 .block_erase = spi_block_erase_52,
4748 }, {
4749 .eraseblocks = { {64 * 1024, 8} },
4750 .block_erase = spi_block_erase_d8,
4751 }, {
4752 .eraseblocks = { {512 * 1024, 1} },
4753 .block_erase = spi_block_erase_60,
4754 }, {
4755 .eraseblocks = { {512 * 1024, 1} },
4756 .block_erase = spi_block_erase_c7,
4757 },
4758 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004759 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger93bb3752009-05-13 22:19:12 +00004760 .write = spi_chip_write_1,
Peter Stugefd9217d2009-01-26 03:37:40 +00004761 .read = spi_chip_read,
4762 },
4763
4764 {
4765 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004766 .name = "SST25VF080B",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00004767 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004768 .manufacture_id = SST_ID,
4769 .model_id = SST_25VF080B,
4770 .total_size = 1024,
4771 .page_size = 256,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004772 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004773 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00004774 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00004775 .block_erasers =
4776 {
4777 {
4778 .eraseblocks = { {4 * 1024, 256} },
4779 .block_erase = spi_block_erase_20,
4780 }, {
4781 .eraseblocks = { {32 * 1024, 32} },
4782 .block_erase = spi_block_erase_52,
4783 }, {
4784 .eraseblocks = { {64 * 1024, 16} },
4785 .block_erase = spi_block_erase_d8,
4786 }, {
4787 .eraseblocks = { {1024 * 1024, 1} },
4788 .block_erase = spi_block_erase_60,
4789 }, {
4790 .eraseblocks = { {1024 * 1024, 1} },
4791 .block_erase = spi_block_erase_c7,
4792 },
4793 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004794 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00004795 .write = spi_chip_write_1,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004796 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00004797 },
4798
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004799 {
4800 .vendor = "SST",
4801 .name = "SST28SF040A",
Urja Rannikko038a3122009-06-28 19:19:25 +00004802 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004803 .manufacture_id = SST_ID,
4804 .model_id = SST_28SF040,
4805 .total_size = 512,
4806 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004807 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004808 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00004809 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00004810 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00004811 .block_erasers =
4812 {
4813 {
4814 .eraseblocks = { {128, 4096} },
4815 .block_erase = erase_sector_28sf040,
4816 }, {
4817 .eraseblocks = { {512 * 1024, 1} },
4818 .block_erase = erase_chip_28sf040,
4819 }
4820 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004821 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004822 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004823 },
4824
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004825 {
4826 .vendor = "SST",
4827 .name = "SST29EE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00004828 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004829 .manufacture_id = SST_ID,
4830 .model_id = SST_29EE010,
4831 .total_size = 128,
4832 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00004833 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00004834 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004835 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004836 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00004837 .block_erasers =
4838 {
4839 {
4840 .eraseblocks = { {128 * 1024, 1} },
4841 .block_erase = erase_chip_block_jedec,
4842 }
4843 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004844 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004845 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004846 },
4847
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004848 {
4849 .vendor = "SST",
4850 .name = "SST29LE010",
Urja Rannikko038a3122009-06-28 19:19:25 +00004851 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004852 .manufacture_id = SST_ID,
4853 .model_id = SST_29LE010,
4854 .total_size = 128,
4855 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00004856 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004857 .tested = TEST_UNTESTED,
4858 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004859 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00004860 .block_erasers =
4861 {
4862 {
4863 .eraseblocks = { {128 * 1024, 1} },
4864 .block_erase = erase_chip_block_jedec,
4865 }
4866 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004867 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004868 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004869 },
4870
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004871 {
4872 .vendor = "SST",
4873 .name = "SST29EE020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00004874 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004875 .manufacture_id = SST_ID,
4876 .model_id = SST_29EE020A,
4877 .total_size = 256,
4878 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00004879 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00004880 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004881 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004882 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00004883 .block_erasers =
4884 {
4885 {
4886 .eraseblocks = { {256 * 1024, 1} },
4887 .block_erase = erase_chip_block_jedec,
4888 }
4889 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004890 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004891 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004892 },
4893
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004894 {
4895 .vendor = "SST",
4896 .name = "SST29LE020",
Urja Rannikko038a3122009-06-28 19:19:25 +00004897 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004898 .manufacture_id = SST_ID,
4899 .model_id = SST_29LE020,
4900 .total_size = 256,
4901 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00004902 .feature_bits = FEATURE_LONG_RESET,
Michael Karcher98eff462010-03-24 22:55:56 +00004903 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004904 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004905 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00004906 .block_erasers =
4907 {
4908 {
4909 .eraseblocks = { {256 * 1024, 1} },
4910 .block_erase = erase_chip_block_jedec,
4911 }
4912 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004913 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004914 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004915 },
4916
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004917 {
4918 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +00004919 .name = "SST39SF512",
4920 .bustype = CHIP_BUSTYPE_PARALLEL,
4921 .manufacture_id = SST_ID,
4922 .model_id = SST_39SF512,
4923 .total_size = 64,
4924 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004925 .feature_bits = FEATURE_EITHER_RESET,
4926 .tested = TEST_UNTESTED,
Uwe Hermann48da3f92010-01-23 15:15:19 +00004927 .probe = probe_jedec,
4928 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +00004929 .block_erasers =
4930 {
4931 {
4932 .eraseblocks = { {4 * 1024, 16} },
4933 .block_erase = erase_sector_jedec,
4934 }, {
4935 .eraseblocks = { {64 * 1024, 1} },
4936 .block_erase = erase_chip_block_jedec,
4937 }
4938 },
Sean Nelson35727f72010-01-28 23:55:12 +00004939 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +00004940 .read = read_memmapped,
4941 },
4942
4943 {
4944 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004945 .name = "SST39SF010A",
Urja Rannikko038a3122009-06-28 19:19:25 +00004946 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004947 .manufacture_id = SST_ID,
4948 .model_id = SST_39SF010,
4949 .total_size = 128,
4950 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004951 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00004952 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004953 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004954 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00004955 .block_erasers =
4956 {
4957 {
4958 .eraseblocks = { {4 * 1024, 32} },
4959 .block_erase = erase_sector_jedec,
4960 }, {
4961 .eraseblocks = { {128 * 1024, 1} },
4962 .block_erase = erase_chip_block_jedec,
4963 }
4964 },
Sean Nelson35727f72010-01-28 23:55:12 +00004965 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004966 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004967 },
4968
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004969 {
4970 .vendor = "SST",
4971 .name = "SST39SF020A",
Urja Rannikko038a3122009-06-28 19:19:25 +00004972 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004973 .manufacture_id = SST_ID,
4974 .model_id = SST_39SF020,
4975 .total_size = 256,
4976 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00004977 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00004978 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004979 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00004980 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00004981 .block_erasers =
4982 {
4983 {
4984 .eraseblocks = { {4 * 1024, 64} },
4985 .block_erase = erase_sector_jedec,
4986 }, {
4987 .eraseblocks = { {256 * 1024, 1} },
4988 .block_erase = erase_chip_block_jedec,
4989 }
4990 },
Sean Nelson35727f72010-01-28 23:55:12 +00004991 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004992 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00004993 },
4994
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004995 {
4996 .vendor = "SST",
4997 .name = "SST39SF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00004998 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004999 .manufacture_id = SST_ID,
5000 .model_id = SST_39SF040,
5001 .total_size = 512,
5002 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005003 .feature_bits = FEATURE_EITHER_RESET,
5004 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005005 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005006 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005007 .block_erasers =
5008 {
5009 {
5010 .eraseblocks = { {4 * 1024, 128} },
5011 .block_erase = erase_sector_jedec,
5012 }, {
5013 .eraseblocks = { {512 * 1024, 1} },
5014 .block_erase = erase_chip_block_jedec,
5015 }
5016 },
Sean Nelson35727f72010-01-28 23:55:12 +00005017 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005018 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005019 },
5020
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005021 {
5022 .vendor = "SST",
5023 .name = "SST39VF512",
Urja Rannikko038a3122009-06-28 19:19:25 +00005024 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005025 .manufacture_id = SST_ID,
5026 .model_id = SST_39VF512,
5027 .total_size = 64,
5028 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005029 .feature_bits = FEATURE_EITHER_RESET,
5030 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005031 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005032 .probe_timing = 1, /* 150 ns*/
Sean Nelson51c83fb2010-01-20 20:55:53 +00005033 .block_erasers =
5034 {
5035 {
5036 .eraseblocks = { {4 * 1024, 16} },
5037 .block_erase = erase_sector_jedec,
5038 }, {
5039 .eraseblocks = { {64 * 1024, 1} },
5040 .block_erase = erase_chip_block_jedec,
5041 }
5042 },
Sean Nelson35727f72010-01-28 23:55:12 +00005043 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005044 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005045 },
5046
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005047 {
5048 .vendor = "SST",
5049 .name = "SST39VF010",
Urja Rannikko038a3122009-06-28 19:19:25 +00005050 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005051 .manufacture_id = SST_ID,
5052 .model_id = SST_39VF010,
5053 .total_size = 128,
5054 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005055 .feature_bits = FEATURE_EITHER_RESET,
Guenter Knauf2bd007a2010-06-24 11:51:12 +00005056 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005057 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005058 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005059 .block_erasers =
5060 {
5061 {
5062 .eraseblocks = { {4 * 1024, 32} },
5063 .block_erase = erase_sector_jedec,
5064 }, {
5065 .eraseblocks = { {128 * 1024, 1} },
5066 .block_erase = erase_chip_block_jedec,
5067 }
5068 },
Sean Nelson35727f72010-01-28 23:55:12 +00005069 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005070 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005071 },
5072
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005073 {
5074 .vendor = "SST",
5075 .name = "SST39VF020",
Urja Rannikko038a3122009-06-28 19:19:25 +00005076 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005077 .manufacture_id = SST_ID,
5078 .model_id = SST_39VF020,
5079 .total_size = 256,
5080 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005081 .feature_bits = FEATURE_EITHER_RESET,
5082 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005083 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005084 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005085 .block_erasers =
5086 {
5087 {
5088 .eraseblocks = { {4 * 1024, 64} },
5089 .block_erase = erase_sector_jedec,
5090 }, {
5091 .eraseblocks = { {256 * 1024, 1} },
5092 .block_erase = erase_chip_block_jedec,
5093 }
5094 },
Sean Nelson35727f72010-01-28 23:55:12 +00005095 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005096 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005097 },
5098
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005099 {
5100 .vendor = "SST",
5101 .name = "SST39VF040",
Urja Rannikko038a3122009-06-28 19:19:25 +00005102 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005103 .manufacture_id = SST_ID,
5104 .model_id = SST_39VF040,
5105 .total_size = 512,
5106 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005107 .feature_bits = FEATURE_EITHER_RESET,
5108 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005109 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005110 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005111 .block_erasers =
5112 {
5113 {
5114 .eraseblocks = { {4 * 1024, 128} },
5115 .block_erase = erase_sector_jedec,
5116 }, {
5117 .eraseblocks = { {512 * 1024, 1} },
5118 .block_erase = erase_chip_block_jedec,
5119 }
5120 },
Sean Nelson35727f72010-01-28 23:55:12 +00005121 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005122 .read = read_memmapped,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +00005123 },
FENG yu ningff692fb2008-12-08 18:15:10 +00005124
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005125 {
5126 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +00005127 .name = "SST39VF080",
Urja Rannikko038a3122009-06-28 19:19:25 +00005128 .bustype = CHIP_BUSTYPE_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005129 .manufacture_id = SST_ID,
5130 .model_id = SST_39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +00005131 .total_size = 1024,
5132 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005133 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +00005134 .tested = TEST_UNTESTED,
5135 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005136 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005137 .block_erasers =
5138 {
5139 {
5140 .eraseblocks = { {4 * 1024, 256} },
5141 .block_erase = erase_sector_jedec,
5142 }, {
5143 .eraseblocks = { {64 * 1024, 16} },
5144 .block_erase = erase_block_jedec,
5145 }, {
5146 .eraseblocks = { {1024 * 1024, 1} },
5147 .block_erase = erase_chip_block_jedec,
5148 }
5149 },
Sean Nelson35727f72010-01-28 23:55:12 +00005150 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005151 .read = read_memmapped,
Peter Stuge8440cc02009-01-25 23:55:12 +00005152 },
5153
5154 {
5155 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005156 .name = "SST49LF002A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005157 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005158 .manufacture_id = SST_ID,
5159 .model_id = SST_49LF002A,
5160 .total_size = 256,
5161 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005162 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005163 .tested = TEST_OK_PRW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005164 .probe = probe_jedec,
5165 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005166 .block_erasers =
5167 {
5168 {
5169 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005170 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005171 }, {
5172 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005173 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005174 }, {
5175 .eraseblocks = { {256 * 1024, 1} },
5176 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5177 }
5178 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005179 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005180 .unlock = unlock_sst_fwhub,
5181 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005182 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005183 },
5184
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005185 {
5186 .vendor = "SST",
5187 .name = "SST49LF003A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005188 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005189 .manufacture_id = SST_ID,
5190 .model_id = SST_49LF003A,
5191 .total_size = 384,
5192 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005193 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Peter Lemenkov45835c42009-09-25 01:09:18 +00005194 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005195 .probe = probe_jedec,
5196 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005197 .block_erasers =
5198 {
5199 {
5200 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005201 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005202 }, {
5203 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005204 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005205 }, {
5206 .eraseblocks = { {384 * 1024, 1} },
5207 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5208 }
5209 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005210 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005211 .unlock = unlock_sst_fwhub,
5212 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005213 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005214 },
5215
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005216 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005217 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
5218 * and is only honored for 64k block erase, but not 4k sector erase.
5219 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005220 .vendor = "SST",
5221 .name = "SST49LF004A/B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005222 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005223 .manufacture_id = SST_ID,
5224 .model_id = SST_49LF004A,
5225 .total_size = 512,
5226 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005227 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005228 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005229 .probe = probe_jedec,
5230 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005231 .block_erasers =
5232 {
5233 {
5234 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005235 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005236 }, {
5237 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005238 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005239 }, {
5240 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +00005241 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +00005242 },
5243 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005244 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005245 .unlock = unlock_sst_fwhub,
5246 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005247 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005248 },
5249
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005250 {
5251 .vendor = "SST",
5252 .name = "SST49LF004C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005253 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005254 .manufacture_id = SST_ID,
5255 .model_id = SST_49LF004C,
5256 .total_size = 512,
5257 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005258 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005259 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005260 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005261 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005262 .block_erasers =
5263 {
5264 {
5265 .eraseblocks = { {4 * 1024, 128} },
5266 .block_erase = erase_sector_49lfxxxc,
5267 }, {
5268 .eraseblocks = {
5269 {64 * 1024, 7},
5270 {32 * 1024, 1},
5271 {8 * 1024, 2},
5272 {16 * 1024, 1},
5273 },
Sean Nelson69e58112010-03-23 17:10:28 +00005274 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005275 }
5276 },
Sean Nelson69e58112010-03-23 17:10:28 +00005277 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005278 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005279 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005280 },
5281
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005282 {
5283 .vendor = "SST",
5284 .name = "SST49LF008A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005285 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005286 .manufacture_id = SST_ID,
5287 .model_id = SST_49LF008A,
5288 .total_size = 1024,
5289 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005290 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005291 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005292 .probe = probe_jedec,
5293 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005294 .block_erasers =
5295 {
5296 {
5297 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005298 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005299 }, {
5300 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005301 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005302 }, {
5303 .eraseblocks = { {1024 * 1024, 1} },
5304 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
5305 }
5306 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005307 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +00005308 .unlock = unlock_sst_fwhub,
5309 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005310 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005311 },
5312
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005313 {
5314 .vendor = "SST",
5315 .name = "SST49LF008C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005316 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005317 .manufacture_id = SST_ID,
5318 .model_id = SST_49LF008C,
5319 .total_size = 1024,
5320 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005321 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005322 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005323 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005324 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005325 .block_erasers =
5326 {
5327 {
5328 .eraseblocks = { {4 * 1024, 256} },
5329 .block_erase = erase_sector_49lfxxxc,
5330 }, {
5331 .eraseblocks = {
5332 {64 * 1024, 15},
5333 {32 * 1024, 1},
5334 {8 * 1024, 2},
5335 {16 * 1024, 1},
5336 },
Sean Nelson69e58112010-03-23 17:10:28 +00005337 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005338 }
5339 },
Sean Nelson69e58112010-03-23 17:10:28 +00005340 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005341 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005342 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005343 },
5344
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005345 {
5346 .vendor = "SST",
5347 .name = "SST49LF016C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005348 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005349 .manufacture_id = SST_ID,
5350 .model_id = SST_49LF016C,
5351 .total_size = 2048,
5352 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005353 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005354 .tested = TEST_OK_PRW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005355 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005356 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005357 .block_erasers =
5358 {
5359 {
5360 .eraseblocks = { {4 * 1024, 512} },
5361 .block_erase = erase_sector_49lfxxxc,
5362 }, {
5363 .eraseblocks = {
5364 {64 * 1024, 31},
5365 {32 * 1024, 1},
5366 {8 * 1024, 2},
5367 {16 * 1024, 1},
5368 },
Sean Nelson69e58112010-03-23 17:10:28 +00005369 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005370 }
5371 },
Sean Nelson69e58112010-03-23 17:10:28 +00005372 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005373 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005374 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005375 },
5376
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005377 {
5378 .vendor = "SST",
5379 .name = "SST49LF020",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005380 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005381 .manufacture_id = SST_ID,
5382 .model_id = SST_49LF020,
5383 .total_size = 256,
5384 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005385 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005386 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005387 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005388 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005389 .block_erasers =
5390 {
5391 {
5392 .eraseblocks = { {4 * 1024, 64} },
5393 .block_erase = erase_sector_jedec,
5394 }, {
5395 .eraseblocks = { {16 * 1024, 16} },
5396 .block_erase = erase_block_jedec,
5397 }, {
5398 .eraseblocks = { {256 * 1024, 1} },
5399 .block_erase = NULL,
5400 }
5401 },
Sean Nelson35727f72010-01-28 23:55:12 +00005402 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005403 .read = read_memmapped,
Sven Schnellec208dfb2009-01-07 12:35:09 +00005404 },
5405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005406 {
5407 .vendor = "SST",
5408 .name = "SST49LF020A",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005409 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005410 .manufacture_id = SST_ID,
5411 .model_id = SST_49LF020A,
5412 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +00005413 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005414 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005415 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005416 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005417 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005418 .block_erasers =
5419 {
5420 {
5421 .eraseblocks = { {4 * 1024, 64} },
5422 .block_erase = erase_sector_jedec,
5423 }, {
5424 .eraseblocks = { {16 * 1024, 16} },
5425 .block_erase = erase_block_jedec,
5426 }, {
5427 .eraseblocks = { {256 * 1024, 1} },
5428 .block_erase = NULL,
5429 }
5430 },
Sean Nelson35727f72010-01-28 23:55:12 +00005431 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005432 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005433 },
5434
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005435 {
5436 .vendor = "SST",
5437 .name = "SST49LF040",
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005438 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005439 .manufacture_id = SST_ID,
5440 .model_id = SST_49LF040,
5441 .total_size = 512,
5442 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005443 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00005444 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005445 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00005446 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005447 .block_erasers =
5448 {
5449 {
5450 .eraseblocks = { {4 * 1024, 128} },
5451 .block_erase = erase_sector_jedec,
5452 }, {
5453 .eraseblocks = { {64 * 1024, 8} },
5454 .block_erase = erase_block_jedec,
5455 }, {
5456 .eraseblocks = { {512 * 1024, 1} },
5457 .block_erase = NULL,
5458 }
5459 },
Sean Nelson35727f72010-01-28 23:55:12 +00005460 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005461 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005462 },
5463
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005464 {
5465 .vendor = "SST",
5466 .name = "SST49LF040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005467 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005468 .manufacture_id = SST_ID,
5469 .model_id = SST_49LF040B,
5470 .total_size = 512,
5471 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005472 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005473 .tested = TEST_OK_PR,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005474 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005475 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005476 .block_erasers =
5477 {
5478 {
5479 .eraseblocks = { {4 * 1024, 128} },
5480 .block_erase = erase_sector_jedec,
5481 }, {
5482 .eraseblocks = { {64 * 1024, 8} },
5483 .block_erase = erase_block_jedec,
5484 }, {
5485 .eraseblocks = { {512 * 1024, 1} },
5486 .block_erase = NULL,
5487 }
5488 },
Sean Nelson35727f72010-01-28 23:55:12 +00005489 .write = write_jedec_1,
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 = "SST49LF080A",
Urja Rannikko038a3122009-06-28 19:19:25 +00005496 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005497 .manufacture_id = SST_ID,
Urja Rannikko038a3122009-06-28 19:19:25 +00005498 .model_id = SST_49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005499 .total_size = 1024,
5500 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00005501 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00005502 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005503 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005504 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005505 .block_erasers =
5506 {
5507 {
5508 .eraseblocks = { {4 * 1024, 256} },
5509 .block_erase = erase_sector_jedec,
5510 }, {
5511 .eraseblocks = { {64 * 1024, 16} },
5512 .block_erase = erase_block_jedec,
5513 }, {
5514 .eraseblocks = { {1024 * 1024, 1} },
5515 .block_erase = NULL,
5516 }
5517 },
Sean Nelson35727f72010-01-28 23:55:12 +00005518 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005519 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005520 },
5521
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005522 {
5523 .vendor = "SST",
5524 .name = "SST49LF160C",
Urja Rannikko038a3122009-06-28 19:19:25 +00005525 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005526 .manufacture_id = SST_ID,
5527 .model_id = SST_49LF160C,
5528 .total_size = 2048,
5529 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005530 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005531 .tested = TEST_OK_PRW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005532 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00005533 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00005534 .block_erasers =
5535 {
5536 {
5537 .eraseblocks = { {4 * 1024, 512} },
5538 .block_erase = erase_sector_49lfxxxc,
5539 }, {
5540 .eraseblocks = {
5541 {64 * 1024, 31},
5542 {32 * 1024, 1},
5543 {8 * 1024, 2},
5544 {16 * 1024, 1},
5545 },
Sean Nelson69e58112010-03-23 17:10:28 +00005546 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +00005547 }
5548 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00005549 .unlock = unlock_49lfxxxc,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005550 .write = write_49lfxxxc,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005551 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005552 },
5553
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005554 {
5555 .vendor = "ST",
5556 .name = "M25P05-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005557 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005558 .manufacture_id = ST_ID,
5559 .model_id = ST_M25P05A,
5560 .total_size = 64,
5561 .page_size = 256,
5562 .tested = TEST_UNTESTED,
5563 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005564 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005565 .block_erasers =
5566 {
5567 {
5568 .eraseblocks = { {32 * 1024, 2} },
5569 .block_erase = spi_block_erase_d8,
5570 }, {
5571 .eraseblocks = { {64 * 1024, 1} },
5572 .block_erase = spi_block_erase_c7,
5573 }
5574 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005575 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005576 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005577 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005578 },
5579
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005580 /* The ST M25P05 is a bit of a problem. It has the same ID as the
5581 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005582 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005583 * only is successful if RDID does not work.
5584 */
5585 {
5586 .vendor = "ST",
5587 .name = "M25P05.RES",
5588 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005589 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005590 .model_id = ST_M25P05_RES,
5591 .total_size = 64,
5592 .page_size = 256,
5593 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005594 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005595 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005596 .block_erasers =
5597 {
5598 {
5599 .eraseblocks = { {32 * 1024, 2} },
5600 .block_erase = spi_block_erase_d8,
5601 }, {
5602 .eraseblocks = { {64 * 1024, 1} },
5603 .block_erase = spi_block_erase_c7,
5604 }
5605 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005606 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005607 .write = spi_chip_write_1, /* 128 */
5608 .read = spi_chip_read,
5609 },
5610
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005611 {
5612 .vendor = "ST",
5613 .name = "M25P10-A",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005614 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005615 .manufacture_id = ST_ID,
5616 .model_id = ST_M25P10A,
5617 .total_size = 128,
5618 .page_size = 256,
5619 .tested = TEST_UNTESTED,
5620 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005621 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005622 .block_erasers =
5623 {
5624 {
5625 .eraseblocks = { {32 * 1024, 4} },
5626 .block_erase = spi_block_erase_d8,
5627 }, {
5628 .eraseblocks = { {128 * 1024, 1} },
5629 .block_erase = spi_block_erase_c7,
5630 }
5631 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005632 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005633 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005634 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005635 },
5636
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005637 /* The ST M25P10 has the same problem as the M25P05. */
5638 {
5639 .vendor = "ST",
5640 .name = "M25P10.RES",
5641 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005642 .manufacture_id = 0, /* Not used. */
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005643 .model_id = ST_M25P10_RES,
5644 .total_size = 128,
5645 .page_size = 256,
5646 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005647 .probe = probe_spi_res1,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005648 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005649 .block_erasers =
5650 {
5651 {
5652 .eraseblocks = { {32 * 1024, 4} },
5653 .block_erase = spi_block_erase_d8,
5654 }, {
5655 .eraseblocks = { {128 * 1024, 1} },
5656 .block_erase = spi_block_erase_c7,
5657 }
5658 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005659 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger32961be2009-07-23 01:40:20 +00005660 .write = spi_chip_write_1, /* 128 */
5661 .read = spi_chip_read,
5662 },
5663
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005664 {
5665 .vendor = "ST",
5666 .name = "M25P20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005667 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005668 .manufacture_id = ST_ID,
5669 .model_id = ST_M25P20,
5670 .total_size = 256,
5671 .page_size = 256,
5672 .tested = TEST_UNTESTED,
5673 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005674 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005675 .block_erasers =
5676 {
5677 {
5678 .eraseblocks = { {64 * 1024, 4} },
5679 .block_erase = spi_block_erase_d8,
5680 }, {
5681 .eraseblocks = { {256 * 1024, 1} },
5682 .block_erase = spi_block_erase_c7,
5683 }
5684 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005685 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005686 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005687 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005688 },
5689
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005690 {
5691 .vendor = "ST",
5692 .name = "M25P40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005693 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005694 .manufacture_id = ST_ID,
5695 .model_id = ST_M25P40,
5696 .total_size = 512,
5697 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005698 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005699 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005700 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005701 .block_erasers =
5702 {
5703 {
5704 .eraseblocks = { {64 * 1024, 8} },
5705 .block_erase = spi_block_erase_d8,
5706 }, {
5707 .eraseblocks = { {512 * 1024, 1} },
5708 .block_erase = spi_block_erase_c7,
5709 }
5710 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005711 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005712 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005713 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005714 },
5715
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005716 {
5717 .vendor = "ST",
5718 .name = "M25P40-old",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005719 .bustype = CHIP_BUSTYPE_SPI,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005720 .manufacture_id = 0, /* Not used. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005721 .model_id = ST_M25P40_RES,
5722 .total_size = 512,
5723 .page_size = 256,
5724 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingerdc1cda12010-05-28 17:07:57 +00005725 .probe = probe_spi_res1,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005726 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005727 .block_erasers =
5728 {
5729 {
5730 .eraseblocks = { {64 * 1024, 8} },
5731 .block_erase = spi_block_erase_d8,
5732 }, {
5733 .eraseblocks = { {512 * 1024, 1} },
5734 .block_erase = spi_block_erase_c7,
5735 }
5736 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005737 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005738 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005739 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005740 },
5741
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005742 {
5743 .vendor = "ST",
5744 .name = "M25P80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005745 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005746 .manufacture_id = ST_ID,
5747 .model_id = ST_M25P80,
5748 .total_size = 1024,
5749 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005750 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005751 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005752 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005753 .block_erasers =
5754 {
5755 {
5756 .eraseblocks = { {64 * 1024, 16} },
5757 .block_erase = spi_block_erase_d8,
5758 }, {
5759 .eraseblocks = { {1024 * 1024, 1} },
5760 .block_erase = spi_block_erase_c7,
5761 }
5762 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005763 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005764 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005765 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005766 },
5767
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005768 {
5769 .vendor = "ST",
5770 .name = "M25P16",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005771 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005772 .manufacture_id = ST_ID,
5773 .model_id = ST_M25P16,
5774 .total_size = 2048,
5775 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005776 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005777 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005778 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005779 .block_erasers =
5780 {
5781 {
5782 .eraseblocks = { {64 * 1024, 32} },
5783 .block_erase = spi_block_erase_d8,
5784 }, {
5785 .eraseblocks = { {2 * 1024 * 1024, 1} },
5786 .block_erase = spi_block_erase_c7,
5787 }
5788 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005789 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005790 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005791 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005792 },
5793
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005794 {
5795 .vendor = "ST",
5796 .name = "M25P32",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005797 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005798 .manufacture_id = ST_ID,
5799 .model_id = ST_M25P32,
5800 .total_size = 4096,
5801 .page_size = 256,
Sean Nelson56358aa2010-01-19 16:08:51 +00005802 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005803 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005804 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005805 .block_erasers =
5806 {
5807 {
5808 .eraseblocks = { {64 * 1024, 64} },
5809 .block_erase = spi_block_erase_d8,
5810 }, {
5811 .eraseblocks = { {4 * 1024 * 1024, 1} },
5812 .block_erase = spi_block_erase_c7,
5813 }
5814 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005815 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005816 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005817 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005818 },
5819
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005820 {
5821 .vendor = "ST",
5822 .name = "M25P64",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005823 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005824 .manufacture_id = ST_ID,
5825 .model_id = ST_M25P64,
5826 .total_size = 8192,
5827 .page_size = 256,
5828 .tested = TEST_UNTESTED,
5829 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005830 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005831 .block_erasers =
5832 {
5833 {
5834 .eraseblocks = { {64 * 1024, 128} },
5835 .block_erase = spi_block_erase_d8,
5836 }, {
5837 .eraseblocks = { {8 * 1024 * 1024, 1} },
5838 .block_erase = spi_block_erase_c7,
5839 }
5840 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005841 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005842 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005843 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005844 },
5845
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005846 {
5847 .vendor = "ST",
5848 .name = "M25P128",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00005849 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005850 .manufacture_id = ST_ID,
5851 .model_id = ST_M25P128,
5852 .total_size = 16384,
5853 .page_size = 256,
5854 .tested = TEST_UNTESTED,
5855 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005856 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00005857 .block_erasers =
5858 {
5859 {
5860 .eraseblocks = { {256 * 1024, 64} },
5861 .block_erase = spi_block_erase_d8,
5862 }, {
5863 .eraseblocks = { {16 * 1024 * 1024, 1} },
5864 .block_erase = spi_block_erase_c7,
5865 }
5866 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005867 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005868 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005869 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00005870 },
5871
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005872 {
5873 .vendor = "ST",
5874 .name = "M29F002B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005875 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005876 .manufacture_id = ST_ID,
5877 .model_id = ST_M29F002B,
5878 .total_size = 256,
5879 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005880 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005881 .tested = TEST_UNTESTED,
5882 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005883 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00005884 .block_erasers =
5885 {
5886 {
5887 .eraseblocks = {
5888 {16 * 1024, 1},
5889 {8 * 1024, 2},
5890 {32 * 1024, 1},
5891 {64 * 1024, 3},
5892 },
5893 .block_erase = erase_sector_jedec,
5894 }, {
5895 .eraseblocks = { {256 * 1024, 1} },
5896 .block_erase = erase_chip_block_jedec,
5897 }
5898 },
Sean Nelson35727f72010-01-28 23:55:12 +00005899 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005900 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005901 },
5902
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005903 {
5904 .vendor = "ST",
5905 .name = "M29F002T/NT",
Urja Rannikko038a3122009-06-28 19:19:25 +00005906 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005907 .manufacture_id = ST_ID,
5908 .model_id = ST_M29F002T,
5909 .total_size = 256,
5910 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005911 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
5912 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005913 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005914 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00005915 .block_erasers =
5916 {
5917 {
5918 .eraseblocks = {
5919 {64 * 1024, 3},
5920 {32 * 1024, 1},
5921 {8 * 1024, 2},
5922 {16 * 1024, 1},
5923 },
5924 .block_erase = erase_sector_jedec,
5925 }, {
5926 .eraseblocks = { {256 * 1024, 1} },
5927 .block_erase = erase_chip_block_jedec,
5928 }
5929 },
Sean Nelson35727f72010-01-28 23:55:12 +00005930 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005931 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005932 },
5933
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005934 {
5935 .vendor = "ST",
5936 .name = "M29F040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00005937 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005938 .manufacture_id = ST_ID,
5939 .model_id = ST_M29F040B,
5940 .total_size = 512,
5941 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005942 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5943 .tested = TEST_UNTESTED,
5944 .probe = probe_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00005945 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (am29f040b.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00005946 .block_erasers =
5947 {
5948 {
5949 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00005950 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00005951 }, {
5952 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005953 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +00005954 }
5955 },
Sean Nelson35727f72010-01-28 23:55:12 +00005956 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005957 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00005958 },
5959
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005960 {
Sean Nelson35727f72010-01-28 23:55:12 +00005961 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005962 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00005963 .name = "M29F400BB",
5964 .bustype = CHIP_BUSTYPE_PARALLEL,
5965 .manufacture_id = ST_ID,
5966 .model_id = ST_M29F400BB,
5967 .total_size = 512,
5968 .page_size = 64 * 1024,
5969 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
5970 .tested = TEST_BAD_WRITE, /* Implicit eraseblock layout in write_m29f400bt is broken. */
5971 .probe = probe_m29f400bt,
5972 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
5973 .block_erasers =
5974 {
5975 {
5976 .eraseblocks = {
5977 {16 * 1024, 1},
5978 {8 * 1024, 2},
5979 {32 * 1024, 1},
5980 {64 * 1024, 7},
5981 },
5982 .block_erase = block_erase_m29f400bt,
5983 }, {
5984 .eraseblocks = { {512 * 1024, 1} },
5985 .block_erase = block_erase_chip_m29f400bt,
5986 }
5987 },
5988 .write = NULL,
5989 .read = read_memmapped,
5990 },
5991 {
5992 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
5993 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005994 .name = "M29F400BT",
Urja Rannikko038a3122009-06-28 19:19:25 +00005995 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005996 .manufacture_id = ST_ID,
5997 .model_id = ST_M29F400BT,
5998 .total_size = 512,
5999 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006000 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006001 .tested = TEST_UNTESTED,
6002 .probe = probe_m29f400bt,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006003 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006004 .block_erasers =
6005 {
6006 {
6007 .eraseblocks = {
6008 {64 * 1024, 7},
6009 {32 * 1024, 1},
6010 {8 * 1024, 2},
6011 {16 * 1024, 1},
6012 },
6013 .block_erase = block_erase_m29f400bt,
6014 }, {
6015 .eraseblocks = { {512 * 1024, 1} },
6016 .block_erase = block_erase_chip_m29f400bt,
6017 }
6018 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00006019 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006020 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006021 },
6022
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006023 {
6024 .vendor = "ST",
6025 .name = "M29W010B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006026 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006027 .manufacture_id = ST_ID,
6028 .model_id = ST_M29W010B,
6029 .total_size = 128,
6030 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006031 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006032 .tested = TEST_UNTESTED,
6033 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006034 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006035 .block_erasers =
6036 {
6037 {
6038 .eraseblocks = { {16 * 1024, 8}, },
6039 .block_erase = erase_sector_jedec,
6040 }, {
6041 .eraseblocks = { {128 * 1024, 1} },
6042 .block_erase = erase_chip_block_jedec,
6043 }
6044 },
Sean Nelson35727f72010-01-28 23:55:12 +00006045 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006046 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006047 },
6048
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006049 {
6050 .vendor = "ST",
6051 .name = "M29W040B",
Urja Rannikko038a3122009-06-28 19:19:25 +00006052 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006053 .manufacture_id = ST_ID,
6054 .model_id = ST_M29W040B,
6055 .total_size = 512,
6056 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006057 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006058 .tested = TEST_UNTESTED,
6059 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006060 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006061 .block_erasers =
6062 {
6063 {
6064 .eraseblocks = { {64 * 1024, 8}, },
6065 .block_erase = erase_sector_jedec,
6066 }, {
6067 .eraseblocks = { {512 * 1024, 1} },
6068 .block_erase = erase_chip_block_jedec,
6069 }
6070 },
Sean Nelson35727f72010-01-28 23:55:12 +00006071 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006072 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006073 },
6074
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006075 {
6076 .vendor = "ST",
6077 .name = "M29W512B",
6078 .bustype = CHIP_BUSTYPE_PARALLEL,
6079 .manufacture_id = ST_ID,
6080 .model_id = ST_M29W512B,
6081 .total_size = 64,
6082 .page_size = 64 * 1024,
6083 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6084 .tested = TEST_OK_PREW,
6085 .probe = probe_jedec,
6086 .probe_timing = TIMING_ZERO,
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +00006087 .block_erasers =
6088 {
6089 {
6090 .eraseblocks = { {64 * 1024, 1} },
6091 .block_erase = erase_chip_block_jedec,
6092 }
6093 },
6094 .write = write_jedec_1,
6095 .read = read_memmapped,
6096 },
6097
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006098 {
6099 .vendor = "ST",
6100 .name = "M50FLW040A",
Sean Nelson35727f72010-01-28 23:55:12 +00006101 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006102 .manufacture_id = ST_ID,
6103 .model_id = ST_M50FLW040A,
6104 .total_size = 512,
6105 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006106 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006107 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006108 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006109 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006110 .block_erasers =
6111 {
6112 {
Sean Nelson329bde72010-01-19 16:39:19 +00006113 .eraseblocks = {
6114 {4 * 1024, 16}, /* sector */
6115 {64 * 1024, 5}, /* block */
6116 {4 * 1024, 16}, /* sector */
6117 {4 * 1024, 16}, /* sector */
6118 },
6119 .block_erase = NULL,
6120 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006121 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006122 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006123 }, {
6124 .eraseblocks = { {512 * 1024, 1} },
6125 .block_erase = erase_chip_stm50flw0x0x,
6126 }
6127 },
Sean Nelson28accc22010-03-19 18:47:06 +00006128 .unlock = unlock_stm50flw0x0x,
6129 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006130 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006131 },
6132
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006133 {
6134 .vendor = "ST",
6135 .name = "M50FLW040B",
Sean Nelson35727f72010-01-28 23:55:12 +00006136 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006137 .manufacture_id = ST_ID,
6138 .model_id = ST_M50FLW040B,
6139 .total_size = 512,
6140 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006141 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006142 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006143 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006144 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006145 .block_erasers =
6146 {
6147 {
Sean Nelson329bde72010-01-19 16:39:19 +00006148 .eraseblocks = {
6149 {4 * 1024, 16}, /* sector */
6150 {4 * 1024, 16}, /* sector */
6151 {64 * 1024, 5}, /* block */
6152 {4 * 1024, 16}, /* sector */
6153 },
6154 .block_erase = NULL,
6155 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006156 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006157 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006158 }, {
6159 .eraseblocks = { {512 * 1024, 1} },
6160 .block_erase = erase_chip_stm50flw0x0x,
6161 }
6162 },
Sean Nelson28accc22010-03-19 18:47:06 +00006163 .unlock = unlock_stm50flw0x0x,
6164 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006165 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006166 },
6167
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006168 {
6169 .vendor = "ST",
6170 .name = "M50FLW080A",
Sean Nelson35727f72010-01-28 23:55:12 +00006171 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006172 .manufacture_id = ST_ID,
6173 .model_id = ST_M50FLW080A,
6174 .total_size = 1024,
6175 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006176 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson35727f72010-01-28 23:55:12 +00006177 .tested = TEST_UNTESTED,
6178 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006179 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006180 .block_erasers =
6181 {
6182 {
Sean Nelson329bde72010-01-19 16:39:19 +00006183 .eraseblocks = {
6184 {4 * 1024, 16}, /* sector */
6185 {64 * 1024, 13}, /* block */
6186 {4 * 1024, 16}, /* sector */
6187 {4 * 1024, 16}, /* sector */
6188 },
6189 .block_erase = NULL,
6190 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006191 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006192 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006193 }, {
6194 .eraseblocks = { {1024 * 1024, 1} },
6195 .block_erase = erase_chip_stm50flw0x0x,
6196 }
6197 },
Sean Nelson28accc22010-03-19 18:47:06 +00006198 .unlock = unlock_stm50flw0x0x,
6199 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006200 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006201 },
6202
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006203 {
6204 .vendor = "ST",
6205 .name = "M50FLW080B",
Sean Nelson35727f72010-01-28 23:55:12 +00006206 .bustype = CHIP_BUSTYPE_FWH | CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006207 .manufacture_id = ST_ID,
6208 .model_id = ST_M50FLW080B,
6209 .total_size = 1024,
6210 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006211 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006212 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006213 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00006214 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +00006215 .block_erasers =
6216 {
6217 {
Sean Nelson329bde72010-01-19 16:39:19 +00006218 .eraseblocks = {
6219 {4 * 1024, 16}, /* sector */
6220 {4 * 1024, 16}, /* sector */
6221 {64 * 1024, 13}, /* block */
6222 {4 * 1024, 16}, /* sector */
6223 },
6224 .block_erase = NULL,
6225 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +00006226 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006227 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006228 }, {
6229 .eraseblocks = { {1024 * 1024, 1} },
6230 .block_erase = erase_chip_stm50flw0x0x,
6231 }
6232 },
Sean Nelson28accc22010-03-19 18:47:06 +00006233 .unlock = unlock_stm50flw0x0x,
6234 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006235 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006236 },
6237
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006238 {
6239 .vendor = "ST",
6240 .name = "M50FW002",
Urja Rannikko038a3122009-06-28 19:19:25 +00006241 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006242 .manufacture_id = ST_ID,
6243 .model_id = ST_M50FW002,
6244 .total_size = 256,
6245 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006246 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006247 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006248 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006249 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006250 .block_erasers =
6251 {
6252 {
6253 .eraseblocks = {
6254 {64 * 1024, 3},
6255 {32 * 1024, 1},
6256 {8 * 1024, 2},
6257 {16 * 1024, 1},
6258 },
Sean Nelson28accc22010-03-19 18:47:06 +00006259 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006260 }, {
6261 .eraseblocks = { {256 * 1024, 1} },
6262 .block_erase = erase_chip_stm50flw0x0x,
6263 }
6264 },
Sean Nelson28accc22010-03-19 18:47:06 +00006265 .unlock = unlock_stm50flw0x0x,
6266 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006267 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006268 },
6269
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006270 {
6271 .vendor = "ST",
6272 .name = "M50FW016",
Urja Rannikko038a3122009-06-28 19:19:25 +00006273 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006274 .manufacture_id = ST_ID,
6275 .model_id = ST_M50FW016,
6276 .total_size = 2048,
6277 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006278 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006279 .tested = TEST_UNTESTED,
6280 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006281 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006282 .block_erasers =
6283 {
6284 {
6285 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006286 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006287 }, {
6288 .eraseblocks = { {2 * 1024 * 1024, 1} },
6289 .block_erase = erase_chip_stm50flw0x0x,
6290 }
6291 },
Sean Nelson28accc22010-03-19 18:47:06 +00006292 .unlock = unlock_stm50flw0x0x,
6293 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006294 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006295 },
6296
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006297 {
6298 .vendor = "ST",
6299 .name = "M50FW040",
Urja Rannikko038a3122009-06-28 19:19:25 +00006300 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006301 .manufacture_id = ST_ID,
6302 .model_id = ST_M50FW040,
6303 .total_size = 512,
6304 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006305 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006306 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006307 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006308 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006309 .block_erasers =
6310 {
6311 {
6312 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006313 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006314 }, {
6315 .eraseblocks = { {512 * 1024, 1} },
6316 .block_erase = erase_chip_stm50flw0x0x,
6317 }
6318 },
Sean Nelson28accc22010-03-19 18:47:06 +00006319 .unlock = unlock_stm50flw0x0x,
6320 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006321 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006322 },
6323
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006324 {
6325 .vendor = "ST",
6326 .name = "M50FW080",
Urja Rannikko038a3122009-06-28 19:19:25 +00006327 .bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006328 .manufacture_id = ST_ID,
6329 .model_id = ST_M50FW080,
6330 .total_size = 1024,
6331 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006332 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006333 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006334 .probe = probe_82802ab,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006335 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +00006336 .block_erasers =
6337 {
6338 {
6339 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +00006340 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006341 }, {
6342 .eraseblocks = { {1024 * 1024, 1} },
6343 .block_erase = erase_chip_stm50flw0x0x,
6344 }
6345 },
Sean Nelson28accc22010-03-19 18:47:06 +00006346 .unlock = unlock_stm50flw0x0x,
6347 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006348 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006349 },
6350
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006351 {
6352 .vendor = "ST",
6353 .name = "M50LPW116",
Urja Rannikko038a3122009-06-28 19:19:25 +00006354 .bustype = CHIP_BUSTYPE_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006355 .manufacture_id = ST_ID,
6356 .model_id = ST_M50LPW116,
6357 .total_size = 2048,
6358 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006359 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006360 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006361 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +00006362 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006363 .block_erasers =
6364 {
6365 {
6366 .eraseblocks = {
6367 {4 * 1024, 16},
6368 {64 * 1024, 30},
6369 {32 * 1024, 1},
6370 {8 * 1024, 2},
6371 {16 * 1024, 1},
6372 },
Sean Nelson28accc22010-03-19 18:47:06 +00006373 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +00006374 }, {
6375 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006376 .block_erase = erase_chip_stm50flw0x0x,
Sean Nelson56358aa2010-01-19 16:08:51 +00006377 }
6378 },
Sean Nelson28accc22010-03-19 18:47:06 +00006379 .unlock = unlock_stm50flw0x0x,
6380 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006381 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006382 },
6383
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006384 {
6385 .vendor = "SyncMOS",
6386 .name = "S29C31004T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006387 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006388 .manufacture_id = SYNCMOS_ID,
6389 .model_id = S29C31004T,
6390 .total_size = 512,
6391 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006392 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006393 .tested = TEST_UNTESTED,
6394 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006395 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006396 .block_erasers =
6397 {
6398 {
6399 .eraseblocks = { {1 * 1024, 512} },
6400 .block_erase = erase_sector_jedec,
6401 }, {
6402 .eraseblocks = { {512 * 1024, 1} },
6403 .block_erase = erase_chip_block_jedec,
6404 },
6405 },
Sean Nelson35727f72010-01-28 23:55:12 +00006406 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006407 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006408 },
6409
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006410 {
6411 .vendor = "SyncMOS",
6412 .name = "S29C51001T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006413 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006414 .manufacture_id = SYNCMOS_ID,
6415 .model_id = S29C51001T,
6416 .total_size = 128,
6417 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006418 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006419 .tested = TEST_UNTESTED,
6420 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006421 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006422 .block_erasers =
6423 {
6424 {
6425 .eraseblocks = { {512, 256} },
6426 .block_erase = erase_sector_jedec,
6427 }, {
6428 .eraseblocks = { {128 * 1024, 1} },
6429 .block_erase = erase_chip_block_jedec,
6430 },
6431 },
Sean Nelson35727f72010-01-28 23:55:12 +00006432 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006433 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006434 },
6435
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006436 {
6437 .vendor = "SyncMOS",
6438 .name = "S29C51002T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006439 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006440 .manufacture_id = SYNCMOS_ID,
6441 .model_id = S29C51002T,
6442 .total_size = 256,
6443 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006444 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00006445 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006446 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006447 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006448 .block_erasers =
6449 {
6450 {
6451 .eraseblocks = { {512, 512} },
6452 .block_erase = erase_sector_jedec,
6453 }, {
6454 .eraseblocks = { {256 * 1024, 1} },
6455 .block_erase = erase_chip_block_jedec,
6456 },
6457 },
Sean Nelson35727f72010-01-28 23:55:12 +00006458 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006459 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006460 },
6461
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006462 {
6463 .vendor = "SyncMOS",
6464 .name = "S29C51004T",
Urja Rannikko038a3122009-06-28 19:19:25 +00006465 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006466 .manufacture_id = SYNCMOS_ID,
6467 .model_id = S29C51004T,
6468 .total_size = 512,
6469 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006470 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006471 .tested = TEST_UNTESTED,
6472 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006473 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +00006474 .block_erasers =
6475 {
6476 {
Sean Nelson012a31e2010-01-19 20:23:26 +00006477 .eraseblocks = { {1 * 1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +00006478 .block_erase = erase_sector_jedec,
6479 }, {
6480 .eraseblocks = { {512 * 1024, 1} },
6481 .block_erase = erase_chip_block_jedec,
6482 },
6483 },
Sean Nelson35727f72010-01-28 23:55:12 +00006484 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006485 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006486 },
6487
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006488 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006489 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006490 .name = "TMS29F002RB",
Urja Rannikko038a3122009-06-28 19:19:25 +00006491 .bustype = CHIP_BUSTYPE_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006492 .manufacture_id = TI_OLD_ID,
6493 .model_id = TI_TMS29F002RB,
6494 .total_size = 256,
6495 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +00006496 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006497 .tested = TEST_UNTESTED,
6498 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006499 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006500 .block_erasers =
6501 {
6502 {
6503 .eraseblocks = {
6504 {16 * 1024, 1},
6505 {8 * 1024, 2},
6506 {32 * 1024, 1},
6507 {64 * 1024, 3},
6508 },
6509 .block_erase = erase_sector_jedec,
6510 }, {
6511 .eraseblocks = { {256 * 1024, 1} },
6512 .block_erase = erase_chip_block_jedec,
6513 },
6514 },
Sean Nelson35727f72010-01-28 23:55:12 +00006515 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006516 .read = read_memmapped,
6517 },
6518
6519 {
Uwe Hermanna106d152009-05-27 23:17:40 +00006520 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006521 .name = "TMS29F002RT",
Urja Rannikko038a3122009-06-28 19:19:25 +00006522 .bustype = CHIP_BUSTYPE_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006523 .manufacture_id = TI_OLD_ID,
6524 .model_id = TI_TMS29F002RT,
6525 .total_size = 256,
6526 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +00006527 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006528 .tested = TEST_UNTESTED,
6529 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006530 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +00006531 .block_erasers =
6532 {
6533 {
6534 .eraseblocks = {
6535 {64 * 1024, 3},
6536 {32 * 1024, 1},
6537 {8 * 1024, 2},
6538 {16 * 1024, 1},
6539 },
6540 .block_erase = erase_sector_jedec,
6541 }, {
6542 .eraseblocks = { {256 * 1024, 1} },
6543 .block_erase = erase_chip_block_jedec,
6544 },
6545 },
Sean Nelson35727f72010-01-28 23:55:12 +00006546 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +00006547 .read = read_memmapped,
6548 },
6549
6550 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006551 .vendor = "Winbond",
Rudolf Marekce1c7982010-04-20 19:34:31 +00006552 .name = "W25Q80",
6553 .bustype = CHIP_BUSTYPE_SPI,
6554 .manufacture_id = WINBOND_NEX_ID,
6555 .model_id = W_25Q80,
6556 .total_size = 1024,
6557 .page_size = 256,
6558 .tested = TEST_UNTESTED,
6559 .probe = probe_spi_rdid,
6560 .probe_timing = TIMING_ZERO,
6561 .block_erasers =
6562 {
6563 {
6564 .eraseblocks = { {4 * 1024, 256} },
6565 .block_erase = spi_block_erase_20,
6566 }, {
6567 .eraseblocks = { {32 * 1024, 32} },
6568 .block_erase = spi_block_erase_52,
6569 }, {
6570 .eraseblocks = { {64 * 1024, 16} },
6571 .block_erase = spi_block_erase_d8,
6572 }, {
6573 .eraseblocks = { {1024 * 1024, 1} },
6574 .block_erase = spi_block_erase_60,
6575 }, {
6576 .eraseblocks = { {1024 * 1024, 1} },
6577 .block_erase = spi_block_erase_c7,
6578 }
6579 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006580 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006581 .write = spi_chip_write_256,
6582 .read = spi_chip_read,
6583 },
6584
6585 {
6586 .vendor = "Winbond",
6587 .name = "W25Q16",
6588 .bustype = CHIP_BUSTYPE_SPI,
6589 .manufacture_id = WINBOND_NEX_ID,
6590 .model_id = W_25Q16,
6591 .total_size = 2048,
6592 .page_size = 256,
6593 .tested = TEST_UNTESTED,
6594 .probe = probe_spi_rdid,
6595 .probe_timing = TIMING_ZERO,
6596 .block_erasers =
6597 {
6598 {
6599 .eraseblocks = { {4 * 1024, 512} },
6600 .block_erase = spi_block_erase_20,
6601 }, {
6602 .eraseblocks = { {32 * 1024, 64} },
6603 .block_erase = spi_block_erase_52,
6604 }, {
6605 .eraseblocks = { {64 * 1024, 32} },
6606 .block_erase = spi_block_erase_d8,
6607 }, {
6608 .eraseblocks = { {2 * 1024 * 1024, 1} },
6609 .block_erase = spi_block_erase_60,
6610 }, {
6611 .eraseblocks = { {2 * 1024 * 1024, 1} },
6612 .block_erase = spi_block_erase_c7,
6613 }
6614 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006615 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006616 .write = spi_chip_write_256,
6617 .read = spi_chip_read,
6618 },
6619
6620 {
6621 .vendor = "Winbond",
6622 .name = "W25Q32",
6623 .bustype = CHIP_BUSTYPE_SPI,
6624 .manufacture_id = WINBOND_NEX_ID,
6625 .model_id = W_25Q32,
6626 .total_size = 4096,
6627 .page_size = 256,
6628 .tested = TEST_UNTESTED,
6629 .probe = probe_spi_rdid,
6630 .probe_timing = TIMING_ZERO,
6631 .block_erasers =
6632 {
6633 {
6634 .eraseblocks = { {4 * 1024, 1024} },
6635 .block_erase = spi_block_erase_20,
6636 }, {
6637 .eraseblocks = { {32 * 1024, 128} },
6638 .block_erase = spi_block_erase_52,
6639 }, {
6640 .eraseblocks = { {64 * 1024, 64} },
6641 .block_erase = spi_block_erase_d8,
6642 }, {
6643 .eraseblocks = { {4 * 1024 * 1024, 1} },
6644 .block_erase = spi_block_erase_60,
6645 }, {
6646 .eraseblocks = { {4 * 1024 * 1024, 1} },
6647 .block_erase = spi_block_erase_c7,
6648 }
6649 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006650 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +00006651 .write = spi_chip_write_256,
6652 .read = spi_chip_read,
6653 },
6654
6655 {
6656 .vendor = "Winbond",
David Hendricksc4acec92010-06-24 11:39:57 +00006657 .name = "W25Q64",
6658 .bustype = CHIP_BUSTYPE_SPI,
6659 .manufacture_id = WINBOND_NEX_ID,
6660 .model_id = W_25Q64,
6661 .total_size = 8192,
6662 .page_size = 256,
6663 .tested = TEST_OK_PRW,
6664 .probe = probe_spi_rdid,
6665 .probe_timing = TIMING_ZERO,
6666 .block_erasers =
6667 {
6668 {
6669 .eraseblocks = { {4 * 1024, 2048} },
6670 .block_erase = spi_block_erase_20,
6671 }, {
6672 .eraseblocks = { {32 * 1024, 256} },
6673 .block_erase = spi_block_erase_52,
6674 }, {
6675 .eraseblocks = { {64 * 1024, 128} },
6676 .block_erase = spi_block_erase_d8,
6677 }, {
6678 .eraseblocks = { {8 * 1024 * 1024, 1} },
6679 .block_erase = spi_block_erase_60,
6680 }, {
6681 .eraseblocks = { {8 * 1024 * 1024, 1} },
6682 .block_erase = spi_block_erase_c7,
6683 }
6684 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006685 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +00006686 .write = spi_chip_write_256,
6687 .read = spi_chip_read,
6688 },
6689
6690 {
6691 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006692 .name = "W25x10",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006693 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006694 .manufacture_id = WINBOND_NEX_ID,
6695 .model_id = W_25X10,
6696 .total_size = 128,
6697 .page_size = 256,
6698 .tested = TEST_UNTESTED,
6699 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006700 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006701 .block_erasers =
6702 {
6703 {
6704 .eraseblocks = { {4 * 1024, 32} },
6705 .block_erase = spi_block_erase_20,
6706 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006707 .eraseblocks = { {64 * 1024, 2} },
6708 .block_erase = spi_block_erase_d8,
6709 }, {
6710 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006711 .block_erase = spi_block_erase_c7,
6712 }
6713 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006714 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006715 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006716 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006717 },
6718
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006719 {
6720 .vendor = "Winbond",
6721 .name = "W25x20",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006722 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006723 .manufacture_id = WINBOND_NEX_ID,
6724 .model_id = W_25X20,
6725 .total_size = 256,
6726 .page_size = 256,
6727 .tested = TEST_UNTESTED,
6728 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006729 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006730 .block_erasers =
6731 {
6732 {
6733 .eraseblocks = { {4 * 1024, 64} },
6734 .block_erase = spi_block_erase_20,
6735 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006736 .eraseblocks = { {64 * 1024, 4} },
6737 .block_erase = spi_block_erase_d8,
6738 }, {
6739 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006740 .block_erase = spi_block_erase_c7,
6741 }
6742 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006743 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006744 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006745 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006746 },
6747
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006748 {
6749 .vendor = "Winbond",
6750 .name = "W25x40",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006751 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006752 .manufacture_id = WINBOND_NEX_ID,
6753 .model_id = W_25X40,
6754 .total_size = 512,
6755 .page_size = 256,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006756 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006757 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006758 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006759 .block_erasers =
6760 {
6761 {
6762 .eraseblocks = { {4 * 1024, 128} },
6763 .block_erase = spi_block_erase_20,
6764 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006765 .eraseblocks = { {64 * 1024, 8} },
6766 .block_erase = spi_block_erase_d8,
6767 }, {
6768 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006769 .block_erase = spi_block_erase_c7,
6770 }
6771 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006772 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006773 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006774 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006775 },
6776
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006777 {
6778 .vendor = "Winbond",
6779 .name = "W25x80",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00006780 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006781 .manufacture_id = WINBOND_NEX_ID,
6782 .model_id = W_25X80,
6783 .total_size = 1024,
6784 .page_size = 256,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006785 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006786 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006787 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006788 .block_erasers =
6789 {
6790 {
6791 .eraseblocks = { {4 * 1024, 256} },
6792 .block_erase = spi_block_erase_20,
6793 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006794 .eraseblocks = { {64 * 1024, 16} },
6795 .block_erase = spi_block_erase_d8,
6796 }, {
6797 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006798 .block_erase = spi_block_erase_c7,
6799 }
6800 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006801 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006802 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006803 .read = spi_chip_read,
FENG yu ningff692fb2008-12-08 18:15:10 +00006804 },
6805
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006806 {
6807 .vendor = "Winbond",
Hector Martina721ae22009-07-11 19:39:11 +00006808 .name = "W25x16",
6809 .bustype = CHIP_BUSTYPE_SPI,
6810 .manufacture_id = WINBOND_NEX_ID,
6811 .model_id = W_25X16,
6812 .total_size = 2048,
6813 .page_size = 256,
6814 .tested = TEST_OK_PR,
6815 .probe = probe_spi_rdid,
6816 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006817 .block_erasers =
6818 {
6819 {
6820 .eraseblocks = { {4 * 1024, 512} },
6821 .block_erase = spi_block_erase_20,
6822 }, {
6823 .eraseblocks = { {32 * 1024, 64} },
6824 .block_erase = spi_block_erase_52,
6825 }, {
6826 .eraseblocks = { {64 * 1024, 32} },
6827 .block_erase = spi_block_erase_d8,
6828 }, {
6829 .eraseblocks = { {2 * 1024 * 1024, 1} },
6830 .block_erase = spi_block_erase_60,
6831 }, {
6832 .eraseblocks = { {2 * 1024 * 1024, 1} },
6833 .block_erase = spi_block_erase_c7,
6834 }
6835 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006836 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +00006837 .write = spi_chip_write_256,
6838 .read = spi_chip_read,
6839 },
6840
6841 {
6842 .vendor = "Winbond",
Zheng Bao1db2b752009-11-26 11:05:01 +00006843 .name = "W25x32",
6844 .bustype = CHIP_BUSTYPE_SPI,
6845 .manufacture_id = WINBOND_NEX_ID,
6846 .model_id = W_25X32,
6847 .total_size = 4096,
6848 .page_size = 256,
6849 .tested = TEST_OK_PROBE,
6850 .probe = probe_spi_rdid,
6851 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006852 .block_erasers =
6853 {
6854 {
6855 .eraseblocks = { {4 * 1024, 1024} },
6856 .block_erase = spi_block_erase_20,
6857 }, {
6858 .eraseblocks = { {32 * 1024, 128} },
6859 .block_erase = spi_block_erase_52,
6860 }, {
6861 .eraseblocks = { {64 * 1024, 64} },
6862 .block_erase = spi_block_erase_d8,
6863 }, {
6864 .eraseblocks = { {4 * 1024 * 1024, 1} },
6865 .block_erase = spi_block_erase_60,
6866 }, {
6867 .eraseblocks = { {4 * 1024 * 1024, 1} },
6868 .block_erase = spi_block_erase_c7,
6869 }
6870 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006871 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00006872 .write = spi_chip_write_256,
6873 .read = spi_chip_read,
6874 },
6875
6876 {
6877 .vendor = "Winbond",
6878 .name = "W25x64",
6879 .bustype = CHIP_BUSTYPE_SPI,
6880 .manufacture_id = WINBOND_NEX_ID,
6881 .model_id = W_25X64,
6882 .total_size = 8192,
6883 .page_size = 256,
6884 .tested = TEST_UNTESTED,
6885 .probe = probe_spi_rdid,
6886 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006887 .block_erasers =
6888 {
6889 {
6890 .eraseblocks = { {4 * 1024, 2048} },
6891 .block_erase = spi_block_erase_20,
6892 }, {
6893 .eraseblocks = { {32 * 1024, 256} },
6894 .block_erase = spi_block_erase_52,
6895 }, {
6896 .eraseblocks = { {64 * 1024, 128} },
6897 .block_erase = spi_block_erase_d8,
6898 }, {
6899 .eraseblocks = { {8 * 1024 * 1024, 1} },
6900 .block_erase = spi_block_erase_60,
6901 }, {
6902 .eraseblocks = { {8 * 1024 * 1024, 1} },
6903 .block_erase = spi_block_erase_c7,
6904 }
6905 },
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006906 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +00006907 .write = spi_chip_write_256,
6908 .read = spi_chip_read,
6909 },
6910
6911 {
6912 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006913 .name = "W29C011",
Urja Rannikko038a3122009-06-28 19:19:25 +00006914 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006915 .manufacture_id = WINBOND_ID,
6916 .model_id = W_29C011,
6917 .total_size = 128,
6918 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006919 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00006920 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006921 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006922 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006923 .block_erasers =
6924 {
6925 {
6926 .eraseblocks = { {128 * 1024, 1} },
6927 .block_erase = erase_chip_block_jedec,
6928 }
6929 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006930 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006931 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006932 },
6933
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006934 {
6935 .vendor = "Winbond",
6936 .name = "W29C020C",
Urja Rannikko161b8852009-06-05 08:47:37 +00006937 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006938 .manufacture_id = WINBOND_ID,
6939 .model_id = W_29C020C,
6940 .total_size = 256,
6941 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006942 .feature_bits = FEATURE_LONG_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00006943 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006944 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00006945 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006946 .block_erasers =
6947 {
6948 {
6949 .eraseblocks = { {256 * 1024, 1} },
6950 .block_erase = erase_chip_block_jedec,
6951 }
6952 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006953 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006954 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006955 },
6956
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006957 {
6958 .vendor = "Winbond",
6959 .name = "W29C040P",
Urja Rannikko161b8852009-06-05 08:47:37 +00006960 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006961 .manufacture_id = WINBOND_ID,
6962 .model_id = W_29C040P,
6963 .total_size = 512,
6964 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00006965 .feature_bits = FEATURE_LONG_RESET,
6966 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006967 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00006968 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006969 .block_erasers =
6970 {
6971 {
6972 .eraseblocks = { {512 * 1024, 1} },
6973 .block_erase = erase_chip_block_jedec,
6974 }
6975 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006976 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006977 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00006978 },
6979
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006980 {
6981 .vendor = "Winbond",
6982 .name = "W29EE011",
Urja Rannikko038a3122009-06-28 19:19:25 +00006983 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006984 .manufacture_id = WINBOND_ID,
6985 .model_id = W_29C011,
6986 .total_size = 128,
6987 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00006988 .feature_bits = FEATURE_LONG_RESET,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006989 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006990 .probe = probe_w29ee011,
Maciej Pijankac6e11112009-06-03 14:46:22 +00006991 .probe_timing = TIMING_IGNORED, /* routine don't use probe_timing (w29ee011.c) */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00006992 .block_erasers =
6993 {
6994 {
6995 .eraseblocks = { {128 * 1024, 1} },
6996 .block_erase = erase_chip_block_jedec,
6997 }
6998 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006999 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007000 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007001 },
7002
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007003 {
7004 .vendor = "Winbond",
7005 .name = "W39V040A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007006 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007007 .manufacture_id = WINBOND_ID,
7008 .model_id = W_39V040A,
7009 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007010 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007011 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcher3355f062010-03-24 22:56:23 +00007012 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007013 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007014 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007015 .block_erasers =
7016 {
7017 {
7018 .eraseblocks = { {64 * 1024, 8} },
7019 .block_erase = erase_sector_jedec,
7020 }, {
7021 .eraseblocks = { {512 * 1024, 1} },
7022 .block_erase = erase_chip_block_jedec,
7023 }
7024 },
Sean Nelson35727f72010-01-28 23:55:12 +00007025 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007026 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007027 },
7028
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007029 {
7030 .vendor = "Winbond",
7031 .name = "W39V040B",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007032 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007033 .manufacture_id = WINBOND_ID,
7034 .model_id = W_39V040B,
7035 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007036 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007037 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann8d341b52010-05-25 23:27:44 +00007038 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007039 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007040 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007041 .block_erasers =
7042 {
7043 {
7044 .eraseblocks = { {64 * 1024, 8} },
7045 .block_erase = erase_sector_jedec,
7046 }, {
7047 .eraseblocks = { {512 * 1024, 1} },
7048 .block_erase = erase_chip_block_jedec,
7049 }
7050 },
Sean Nelson35727f72010-01-28 23:55:12 +00007051 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007052 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007053 },
7054
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007055 {
7056 .vendor = "Winbond",
7057 .name = "W39V040C",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007058 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007059 .manufacture_id = WINBOND_ID,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00007060 .model_id = W_39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007061 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007062 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007063 .feature_bits = FEATURE_EITHER_RESET,
7064 .tested = TEST_UNTESTED,
7065 .probe = probe_jedec,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +00007066 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007067 .block_erasers =
7068 {
7069 {
7070 .eraseblocks = { {64 * 1024, 8} },
7071 .block_erase = erase_sector_jedec,
7072 }, {
7073 .eraseblocks = { {512 * 1024, 1} },
7074 .block_erase = erase_chip_block_jedec,
7075 }
7076 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007077 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +00007078 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007079 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007080 },
7081
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007082 {
7083 .vendor = "Winbond",
7084 .name = "W39V040FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007085 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007086 .manufacture_id = WINBOND_ID,
7087 .model_id = W_39V040FA,
7088 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007089 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +00007090 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermann41787602010-05-30 17:50:16 +00007091 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007092 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007093 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007094 .block_erasers =
7095 {
7096 {
7097 .eraseblocks = { {4 * 1024, 128} },
7098 .block_erase = erase_block_jedec,
7099 }, {
7100 .eraseblocks = { {64 * 1024, 8} },
7101 .block_erase = erase_sector_jedec,
7102 }, {
7103 .eraseblocks = { {512 * 1024, 1} },
7104 .block_erase = erase_chip_block_jedec,
7105 }
7106 },
Michael Karcherc9b63412010-05-30 16:55:18 +00007107 .printlock = printlock_sst_fwhub,
7108 .unlock = unlock_sst_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007109 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007110 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007111 },
7112
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007113 {
7114 .vendor = "Winbond",
7115 .name = "W39V080A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007116 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007117 .manufacture_id = WINBOND_ID,
7118 .model_id = W_39V080A,
7119 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007120 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007121 .feature_bits = FEATURE_EITHER_RESET,
7122 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007123 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007124 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007125 .block_erasers =
7126 {
7127 {
7128 .eraseblocks = { {64 * 1024, 16} },
7129 .block_erase = erase_sector_jedec,
7130 }, {
7131 .eraseblocks = { {1024 * 1024, 1} },
7132 .block_erase = erase_chip_block_jedec,
7133 }
7134 },
Sean Nelson35727f72010-01-28 23:55:12 +00007135 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007136 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007137 },
7138
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007139 {
7140 .vendor = "Winbond",
7141 .name = "W49F002U",
Urja Rannikko038a3122009-06-28 19:19:25 +00007142 .bustype = CHIP_BUSTYPE_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007143 .manufacture_id = WINBOND_ID,
7144 .model_id = W_49F002U,
7145 .total_size = 256,
7146 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007147 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann60939692010-03-17 00:05:59 +00007148 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007149 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007150 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007151 .block_erasers =
7152 {
7153 {
7154 .eraseblocks = {
7155 {128 * 1024, 1},
7156 {96 * 1024, 1},
7157 {8 * 1024, 2},
7158 {16 * 1024, 1},
7159 },
7160 .block_erase = erase_sector_jedec,
7161 }, {
7162 .eraseblocks = { {256 * 1024, 1} },
7163 .block_erase = erase_chip_block_jedec,
7164 }
7165 },
Sean Nelson35727f72010-01-28 23:55:12 +00007166 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007167 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007168 },
7169
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007170 {
7171 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +00007172 .name = "W49F020",
7173 .bustype = CHIP_BUSTYPE_PARALLEL,
7174 .manufacture_id = WINBOND_ID,
7175 .model_id = W_49F020,
7176 .total_size = 256,
7177 .page_size = 128,
7178 .feature_bits = FEATURE_EITHER_RESET,
7179 .tested = TEST_OK_PROBE,
7180 .probe = probe_jedec,
7181 .probe_timing = 10,
7182 .block_erasers =
7183 {
7184 {
7185 .eraseblocks = { {256 * 1024, 1} },
7186 .block_erase = erase_chip_block_jedec,
7187 }
7188 },
7189 .write = write_jedec_1,
7190 .read = read_memmapped,
7191 },
7192
7193 {
7194 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007195 .name = "W49V002A",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007196 .bustype = CHIP_BUSTYPE_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007197 .manufacture_id = WINBOND_ID,
7198 .model_id = W_49V002A,
7199 .total_size = 256,
7200 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007201 .feature_bits = FEATURE_EITHER_RESET,
7202 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007203 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007204 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007205 .block_erasers =
7206 {
7207 {
7208 .eraseblocks = {
7209 {64 * 1024, 3},
7210 {32 * 1024, 1},
7211 {8 * 1024, 2},
7212 {16 * 1024, 1},
7213 },
7214 .block_erase = erase_sector_jedec,
7215 }, {
7216 .eraseblocks = { {256 * 1024, 1} },
7217 .block_erase = erase_chip_block_jedec,
7218 }
7219 },
Sean Nelson35727f72010-01-28 23:55:12 +00007220 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007221 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007222 },
7223
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007224 {
7225 .vendor = "Winbond",
7226 .name = "W49V002FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007227 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007228 .manufacture_id = WINBOND_ID,
7229 .model_id = W_49V002FA,
7230 .total_size = 256,
7231 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00007232 .feature_bits = FEATURE_EITHER_RESET,
Michael Karcherb90c2212010-03-24 22:56:14 +00007233 .tested = TEST_OK_PRW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007234 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00007235 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007236 .block_erasers =
7237 {
7238 {
7239 .eraseblocks = {
7240 {64 * 1024, 3},
7241 {32 * 1024, 1},
7242 {8 * 1024, 2},
7243 {16 * 1024, 1},
7244 },
7245 .block_erase = erase_sector_jedec,
7246 }, {
7247 .eraseblocks = { {256 * 1024, 1} },
7248 .block_erase = erase_chip_block_jedec,
7249 }
7250 },
Sean Nelson35727f72010-01-28 23:55:12 +00007251 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007252 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007253 },
7254
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007255 {
7256 .vendor = "Winbond",
7257 .name = "W39V080FA",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007258 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007259 .manufacture_id = WINBOND_ID,
7260 .model_id = W_39V080FA,
7261 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +00007262 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007263 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Uwe Hermannea5425b2010-05-30 17:00:19 +00007264 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007265 .probe = probe_jedec,
7266 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007267 .block_erasers =
7268 {
7269 {
7270 .eraseblocks = { {64 * 1024, 16}, },
7271 .block_erase = erase_sector_jedec,
7272 }, {
7273 .eraseblocks = { {1024 * 1024, 1} },
7274 .block_erase = erase_chip_block_jedec,
7275 }
7276 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007277 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007278 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007279 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007280 },
7281
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007282 {
7283 .vendor = "Winbond",
7284 .name = "W39V080FA (dual mode)",
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00007285 .bustype = CHIP_BUSTYPE_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007286 .manufacture_id = WINBOND_ID,
7287 .model_id = W_39V080FA_DM,
7288 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +00007289 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007290 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007291 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00007292 .probe = probe_jedec,
7293 .probe_timing = TIMING_FIXME,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +00007294 .block_erasers =
7295 {
7296 {
7297 .eraseblocks = { {64 * 1024, 8}, },
7298 .block_erase = erase_sector_jedec,
7299 }, {
7300 .eraseblocks = { {512 * 1024, 1} },
7301 .block_erase = erase_chip_block_jedec,
7302 }
7303 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00007304 .unlock = unlock_winbond_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +00007305 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007306 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +00007307 },
7308
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007309 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00007310 .vendor = "AMIC",
7311 .name = "unknown AMIC SPI chip",
7312 .bustype = CHIP_BUSTYPE_SPI,
7313 .manufacture_id = AMIC_ID,
7314 .model_id = GENERIC_DEVICE_ID,
7315 .total_size = 0,
7316 .page_size = 256,
7317 .tested = TEST_BAD_PREW,
7318 .probe = probe_spi_rdid4,
7319 .probe_timing = TIMING_ZERO,
7320 .write = NULL,
7321 .read = NULL,
7322 },
7323
7324 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007325 .vendor = "Atmel",
7326 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007327 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007328 .manufacture_id = ATMEL_ID,
7329 .model_id = GENERIC_DEVICE_ID,
7330 .total_size = 0,
7331 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007332 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007333 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007334 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007335 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007336 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007337 },
7338
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007339 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00007340 .vendor = "Eon",
7341 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007342 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007343 .manufacture_id = EON_ID_NOPREFIX,
7344 .model_id = GENERIC_DEVICE_ID,
7345 .total_size = 0,
7346 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007347 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007348 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007349 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007350 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007351 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007352 },
7353
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007354 {
7355 .vendor = "Macronix",
7356 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007357 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007358 .manufacture_id = MX_ID,
7359 .model_id = GENERIC_DEVICE_ID,
7360 .total_size = 0,
7361 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007362 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007363 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007364 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007365 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007366 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007367 },
7368
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007369 {
7370 .vendor = "PMC",
7371 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007372 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007373 .manufacture_id = PMC_ID,
7374 .model_id = GENERIC_DEVICE_ID,
7375 .total_size = 0,
7376 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007377 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007378 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007379 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007380 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007381 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007382 },
7383
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007384 {
7385 .vendor = "SST",
7386 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007387 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007388 .manufacture_id = SST_ID,
7389 .model_id = GENERIC_DEVICE_ID,
7390 .total_size = 0,
7391 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007392 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007393 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007394 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007395 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007396 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007397 },
7398
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007399 {
7400 .vendor = "ST",
7401 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1dfe0ff2009-05-31 17:57:34 +00007402 .bustype = CHIP_BUSTYPE_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007403 .manufacture_id = ST_ID,
7404 .model_id = GENERIC_DEVICE_ID,
7405 .total_size = 0,
7406 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +00007407 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007408 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007409 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007410 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007411 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +00007412 },
Uwe Hermannfc425e82008-03-16 02:06:25 +00007413
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007414 {
Sean Nelson118e1d62009-11-24 02:08:11 +00007415 .vendor = "Sanyo",
7416 .name = "unknown Sanyo SPI chip",
7417 .bustype = CHIP_BUSTYPE_SPI,
7418 .manufacture_id = SANYO_ID,
7419 .model_id = GENERIC_DEVICE_ID,
7420 .total_size = 0,
7421 .page_size = 256,
7422 .tested = TEST_BAD_PREW,
7423 .probe = probe_spi_rdid,
7424 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +00007425 .write = NULL,
7426 .read = NULL,
7427 },
7428
7429 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007430 .vendor = "Generic",
7431 .name = "unknown SPI chip (RDID)",
7432 .bustype = CHIP_BUSTYPE_SPI,
7433 .manufacture_id = GENERIC_MANUF_ID,
7434 .model_id = GENERIC_DEVICE_ID,
7435 .total_size = 0,
7436 .page_size = 256,
7437 .tested = TEST_BAD_PREW,
7438 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007439 .write = NULL,
7440 },
7441 {
7442 .vendor = "Generic",
7443 .name = "unknown SPI chip (REMS)",
7444 .bustype = CHIP_BUSTYPE_SPI,
7445 .manufacture_id = GENERIC_MANUF_ID,
7446 .model_id = GENERIC_DEVICE_ID,
7447 .total_size = 0,
7448 .page_size = 256,
7449 .tested = TEST_BAD_PREW,
7450 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +00007451 .write = NULL,
7452 },
7453
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007454 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +00007455};