blob: 9b331c749ae7aea32c667c0f7f09005d56ed64c0 [file] [log] [blame]
Ollie Lho184a4042005-11-26 21:55:36 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ollie Lho184a4042005-11-26 21:55:36 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
Stefan Reinauer4c390c82008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Sean Nelsonc57a9202010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Uwe Hermannd1107642007-08-29 17:52:32 +00009 *
Stefan Reinauerce532972007-05-23 17:20:56 +000010 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
Ollie Lho184a4042005-11-26 21:55:36 +000014 *
Stefan Reinauerce532972007-05-23 17:20:56 +000015 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
Ollie Lho184a4042005-11-26 21:55:36 +000019 *
Stefan Reinauerce532972007-05-23 17:20:56 +000020 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
Uwe Hermannd1107642007-08-29 17:52:32 +000022 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ollie Lho184a4042005-11-26 21:55:36 +000023 */
24
25#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000026#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000027#include "chipdrivers.h"
Ollie Lho184a4042005-11-26 21:55:36 +000028
Uwe Hermannfc425e82008-03-16 02:06:25 +000029/**
Uwe Hermanna9720402009-05-21 15:55:46 +000030 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000031 *
Stefan Tauner0554ca52013-07-25 22:54:25 +000032 * Please keep the list sorted by vendor name and chip family, so that the output of 'flashrom -L' is roughly
33 * alphabetically sorted. Within families keep them in order of density.
Uwe Hermannfc425e82008-03-16 02:06:25 +000034 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000035const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000036
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000037 /*
38 * .vendor = Vendor name
39 * .name = Chip name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000048 * .block_erasers[] = Array of erase layouts and erase functions
49 * {
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
52 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000053 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000055 * .write = Chip write function
56 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000057 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000058 */
59
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000060 {
61 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000062 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000064 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000065 .model_id = AMD_AM29F010B, /* Same as Am29F010A */
Uwe Hermanna8b37272009-06-19 15:54:39 +000066 .total_size = 128,
67 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000068 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000069 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000070 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000071 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000072 .block_erasers =
73 {
74 {
75 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000076 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000077 }, {
78 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000079 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000080 },
81 },
Sean Nelson35727f72010-01-28 23:55:12 +000082 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +000083 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000084 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +000085 },
86
87 {
88 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000089 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000090 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000091 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000092 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000093 .total_size = 256,
94 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000095 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000096 .tested = TEST_UNTESTED,
97 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000098 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000099 .block_erasers =
100 {
101 {
102 .eraseblocks = {
103 {16 * 1024, 1},
104 {8 * 1024, 2},
105 {32 * 1024, 1},
106 {64 * 1024, 3},
107 },
108 .block_erase = erase_sector_jedec,
109 }, {
110 .eraseblocks = { {256 * 1024, 1} },
111 .block_erase = erase_chip_block_jedec,
112 },
113 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000114 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000115 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000116 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000117 },
118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000119 {
120 .vendor = "AMD",
121 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000122 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000124 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000125 .total_size = 256,
126 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000127 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000129 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000130 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000131 .block_erasers =
132 {
133 {
134 .eraseblocks = {
135 {64 * 1024, 3},
136 {32 * 1024, 1},
137 {8 * 1024, 2},
138 {16 * 1024, 1},
139 },
140 .block_erase = erase_sector_jedec,
141 }, {
142 .eraseblocks = { {256 * 1024, 1} },
143 .block_erase = erase_chip_block_jedec,
144 },
145 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000146 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000147 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000148 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000149 },
150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000151 {
152 .vendor = "AMD",
153 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000154 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000155 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000156 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000157 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000158 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000159 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000160 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000161 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000162 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000163 .block_erasers =
164 {
165 {
166 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000167 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000168 }, {
169 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000170 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000171 },
172 },
Sean Nelson35727f72010-01-28 23:55:12 +0000173 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000175 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000176 },
177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 {
179 .vendor = "AMD",
180 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000181 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000182 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000183 .model_id = AMD_AM29F040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000184 .total_size = 512,
185 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187 .tested = TEST_UNTESTED,
188 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000189 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000190 .block_erasers =
191 {
192 {
193 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000195 }, {
196 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000197 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000198 },
199 },
Sean Nelson35727f72010-01-28 23:55:12 +0000200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000201 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000202 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000203 },
204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000205 {
206 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000207 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000208 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000209 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000210 .model_id = AMD_AM29F080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000211 .total_size = 1024,
212 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000213 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000216 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000217 .block_erasers =
218 {
219 {
220 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000221 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000222 }, {
223 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000224 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000225 },
226 },
Sean Nelson35727f72010-01-28 23:55:12 +0000227 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000229 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000230 },
231
232 {
233 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000234 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000235 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000236 .manufacture_id = AMD_ID,
237 .model_id = AMD_AM29LV001BB,
238 .total_size = 128,
239 .page_size = 64 * 1024, /* unused */
240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_OK_PREW,
242 .probe = probe_jedec,
243 .probe_timing = TIMING_ZERO,
244 .block_erasers =
245 {
246 {
247 .eraseblocks = {
248 {8 * 1024, 1},
249 {4 * 1024, 2},
250 {16 * 1024, 7},
251 },
252 .block_erase = erase_sector_jedec,
253 }, {
254 .eraseblocks = { {128 * 1024, 1} },
255 .block_erase = erase_chip_block_jedec,
256 },
257 },
258 .write = write_jedec_1,
259 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000260 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000261 },
262
263 {
264 .vendor = "AMD",
265 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000266 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000267 .manufacture_id = AMD_ID,
268 .model_id = AMD_AM29LV001BT,
269 .total_size = 128,
270 .page_size = 64 * 1024, /* unused */
271 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272 .tested = TEST_UNTESTED,
273 .probe = probe_jedec,
274 .probe_timing = TIMING_ZERO,
275 .block_erasers =
276 {
277 {
278 .eraseblocks = {
279 {16 * 1024, 7},
280 {4 * 1024, 2},
281 {8 * 1024, 1},
282 },
283 .block_erase = erase_sector_jedec,
284 }, {
285 .eraseblocks = { {128 * 1024, 1} },
286 .block_erase = erase_chip_block_jedec,
287 },
288 },
289 .write = write_jedec_1,
290 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000291 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000292 },
293
294 {
295 .vendor = "AMD",
296 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000297 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000298 .manufacture_id = AMD_ID,
299 .model_id = AMD_AM29LV002BB,
300 .total_size = 256,
301 .page_size = 64 * 1024, /* unused */
302 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303 .tested = TEST_UNTESTED,
304 .probe = probe_jedec,
305 .probe_timing = TIMING_ZERO,
306 .block_erasers =
307 {
308 {
309 .eraseblocks = {
310 {16 * 1024, 1},
311 {8 * 1024, 2},
312 {32 * 1024, 1},
313 {64 * 1024, 3},
314 },
315 .block_erase = erase_sector_jedec,
316 }, {
317 .eraseblocks = { {256 * 1024, 1} },
318 .block_erase = erase_chip_block_jedec,
319 },
320 },
321 .write = write_jedec_1,
322 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000323 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000324 },
325
326 {
327 .vendor = "AMD",
328 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000329 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000330 .manufacture_id = AMD_ID,
331 .model_id = AMD_AM29LV002BT,
332 .total_size = 256,
333 .page_size = 64 * 1024, /* unused */
334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335 .tested = TEST_UNTESTED,
336 .probe = probe_jedec,
337 .probe_timing = TIMING_ZERO,
338 .block_erasers =
339 {
340 {
341 .eraseblocks = {
342 {64 * 1024, 3},
343 {32 * 1024, 1},
344 {8 * 1024, 2},
345 {16 * 1024, 1},
346 },
347 .block_erase = erase_sector_jedec,
348 }, {
349 .eraseblocks = { {256 * 1024, 1} },
350 .block_erase = erase_chip_block_jedec,
351 },
352 },
353 .write = write_jedec_1,
354 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000355 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000356 },
357
358 {
359 .vendor = "AMD",
360 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000361 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000362 .manufacture_id = AMD_ID,
363 .model_id = AMD_AM29LV004BB,
364 .total_size = 512,
365 .page_size = 64 * 1024, /* unused */
366 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367 .tested = TEST_UNTESTED,
368 .probe = probe_jedec,
369 .probe_timing = TIMING_ZERO,
370 .block_erasers =
371 {
372 {
373 .eraseblocks = {
374 {16 * 1024, 1},
375 {8 * 1024, 2},
376 {32 * 1024, 1},
377 {64 * 1024, 7},
378 },
379 .block_erase = erase_sector_jedec,
380 }, {
381 .eraseblocks = { {512 * 1024, 1} },
382 .block_erase = erase_chip_block_jedec,
383 },
384 },
385 .write = write_jedec_1,
386 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000387 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000388 },
389
390 {
391 .vendor = "AMD",
392 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000393 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000394 .manufacture_id = AMD_ID,
395 .model_id = AMD_AM29LV004BT,
396 .total_size = 512,
397 .page_size = 64 * 1024, /* unused */
398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399 .tested = TEST_UNTESTED,
400 .probe = probe_jedec,
401 .probe_timing = TIMING_ZERO,
402 .block_erasers =
403 {
404 {
405 .eraseblocks = {
406 {64 * 1024, 7},
407 {32 * 1024, 1},
408 {8 * 1024, 2},
409 {16 * 1024, 1},
410 },
411 .block_erase = erase_sector_jedec,
412 }, {
413 .eraseblocks = { {512 * 1024, 1} },
414 .block_erase = erase_chip_block_jedec,
415 },
416 },
417 .write = write_jedec_1,
418 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000419 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000420 },
421
422 {
423 .vendor = "AMD",
424 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000425 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000426 .manufacture_id = AMD_ID,
427 .model_id = AMD_AM29LV008BB,
428 .total_size = 1024,
429 .page_size = 64 * 1024, /* unused */
430 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000431 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000432 .probe = probe_jedec,
433 .probe_timing = TIMING_ZERO,
434 .block_erasers =
435 {
436 {
437 .eraseblocks = {
438 {16 * 1024, 1},
439 {8 * 1024, 2},
440 {32 * 1024, 1},
441 {64 * 1024, 15},
442 },
443 .block_erase = erase_sector_jedec,
444 }, {
445 .eraseblocks = { {1024 * 1024, 1} },
446 .block_erase = erase_chip_block_jedec,
447 },
448 },
449 .write = write_jedec_1,
450 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000451 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000452 },
453
454 {
455 .vendor = "AMD",
456 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000457 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000458 .manufacture_id = AMD_ID,
459 .model_id = AMD_AM29LV008BT,
460 .total_size = 1024,
461 .page_size = 64 * 1024, /* unused */
462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463 .tested = TEST_UNTESTED,
464 .probe = probe_jedec,
465 .probe_timing = TIMING_ZERO,
466 .block_erasers =
467 {
468 {
469 .eraseblocks = {
470 {64 * 1024, 15},
471 {32 * 1024, 1},
472 {8 * 1024, 2},
473 {16 * 1024, 1},
474 },
475 .block_erase = erase_sector_jedec,
476 }, {
477 .eraseblocks = { {1024 * 1024, 1} },
478 .block_erase = erase_chip_block_jedec,
479 },
480 },
481 .write = write_jedec_1,
482 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000483 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000484 },
485
486 {
487 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000488 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000489 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000490 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000491 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000492 .total_size = 512,
493 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000495 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000496 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000497 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000498 .block_erasers =
499 {
500 {
501 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000502 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000503 }, {
504 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000505 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000506 },
507 },
Sean Nelson35727f72010-01-28 23:55:12 +0000508 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000509 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000510 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000511 },
512
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000513 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000514 .vendor = "AMD",
515 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000516 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000517 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000518 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000519 .total_size = 1024,
520 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000522 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000523 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000524 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000525 .block_erasers =
526 {
527 {
528 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000529 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000530 }, {
531 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000532 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000533 },
534 },
Sean Nelson35727f72010-01-28 23:55:12 +0000535 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000536 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000537 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000538 },
539
540 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000541 .vendor = "AMIC",
542 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000543 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000544 .manufacture_id = AMIC_ID,
545 .model_id = AMIC_A25L05PT,
546 .total_size = 64,
547 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000548 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000549 .tested = TEST_UNTESTED,
550 .probe = probe_spi_rdid4,
551 .probe_timing = TIMING_ZERO,
552 .block_erasers =
553 {
554 {
555 .eraseblocks = {
556 {32 * 1024, 1},
557 {16 * 1024, 1},
558 {8 * 1024, 1},
559 {4 * 1024, 2},
560 },
561 .block_erase = spi_block_erase_d8,
562 }, {
563 .eraseblocks = { {64 * 1024, 1} },
564 .block_erase = spi_block_erase_c7,
565 }
566 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000567 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000568 .unlock = spi_disable_blockprotect,
569 .write = spi_chip_write_256,
570 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000571 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000572 },
573
574 {
575 .vendor = "AMIC",
576 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000577 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000578 .manufacture_id = AMIC_ID,
579 .model_id = AMIC_A25L05PU,
580 .total_size = 64,
581 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000582 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000583 .tested = TEST_UNTESTED,
584 .probe = probe_spi_rdid4,
585 .probe_timing = TIMING_ZERO,
586 .block_erasers =
587 {
588 {
589 .eraseblocks = {
590 {4 * 1024, 2},
591 {8 * 1024, 1},
592 {16 * 1024, 1},
593 {32 * 1024, 1},
594 },
595 .block_erase = spi_block_erase_d8,
596 }, {
597 .eraseblocks = { {64 * 1024, 1} },
598 .block_erase = spi_block_erase_c7,
599 }
600 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000601 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000602 .unlock = spi_disable_blockprotect,
603 .write = spi_chip_write_256,
604 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000605 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000606 },
607
608 {
609 .vendor = "AMIC",
610 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000611 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000612 .manufacture_id = AMIC_ID,
613 .model_id = AMIC_A25L10PT,
614 .total_size = 128,
615 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000616 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000617 .tested = TEST_UNTESTED,
618 .probe = probe_spi_rdid4,
619 .probe_timing = TIMING_ZERO,
620 .block_erasers =
621 {
622 {
623 .eraseblocks = {
624 {64 * 1024, 1},
625 {32 * 1024, 1},
626 {16 * 1024, 1},
627 {8 * 1024, 1},
628 {4 * 1024, 2},
629 },
630 .block_erase = spi_block_erase_d8,
631 }, {
632 .eraseblocks = { {128 * 1024, 1} },
633 .block_erase = spi_block_erase_c7,
634 }
635 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000636 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000637 .unlock = spi_disable_blockprotect,
638 .write = spi_chip_write_256,
639 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000640 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000641 },
642
643 {
644 .vendor = "AMIC",
645 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000646 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000647 .manufacture_id = AMIC_ID,
648 .model_id = AMIC_A25L10PU,
649 .total_size = 128,
650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000652 .tested = TEST_UNTESTED,
653 .probe = probe_spi_rdid4,
654 .probe_timing = TIMING_ZERO,
655 .block_erasers =
656 {
657 {
658 .eraseblocks = {
659 {4 * 1024, 2},
660 {8 * 1024, 1},
661 {16 * 1024, 1},
662 {32 * 1024, 1},
663 {64 * 1024, 1},
664 },
665 .block_erase = spi_block_erase_d8,
666 }, {
667 .eraseblocks = { {128 * 1024, 1} },
668 .block_erase = spi_block_erase_c7,
669 }
670 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000671 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000672 .unlock = spi_disable_blockprotect,
673 .write = spi_chip_write_256,
674 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000675 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000676 },
677
678 {
679 .vendor = "AMIC",
680 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000681 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000682 .manufacture_id = AMIC_ID,
683 .model_id = AMIC_A25L20PT,
684 .total_size = 256,
685 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000686 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000687 .tested = TEST_UNTESTED,
688 .probe = probe_spi_rdid4,
689 .probe_timing = TIMING_ZERO,
690 .block_erasers =
691 {
692 {
693 .eraseblocks = {
694 {64 * 1024, 3},
695 {32 * 1024, 1},
696 {16 * 1024, 1},
697 {8 * 1024, 1},
698 {4 * 1024, 2},
699 },
700 .block_erase = spi_block_erase_d8,
701 }, {
702 .eraseblocks = { {256 * 1024, 1} },
703 .block_erase = spi_block_erase_c7,
704 }
705 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000706 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000710 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000711 },
712
713 {
714 .vendor = "AMIC",
715 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000716 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000717 .manufacture_id = AMIC_ID,
718 .model_id = AMIC_A25L20PU,
719 .total_size = 256,
720 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000721 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000722 .tested = TEST_UNTESTED,
723 .probe = probe_spi_rdid4,
724 .probe_timing = TIMING_ZERO,
725 .block_erasers =
726 {
727 {
728 .eraseblocks = {
729 {4 * 1024, 2},
730 {8 * 1024, 1},
731 {16 * 1024, 1},
732 {32 * 1024, 1},
733 {64 * 1024, 3},
734 },
735 .block_erase = spi_block_erase_d8,
736 }, {
737 .eraseblocks = { {256 * 1024, 1} },
738 .block_erase = spi_block_erase_c7,
739 }
740 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000741 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000742 .unlock = spi_disable_blockprotect,
743 .write = spi_chip_write_256,
744 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000745 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000746 },
747
748 /* The A25L40P{T,U} chips are distinguished by their
749 * erase block layouts, but without any distinction in RDID.
750 * This inexplicable quirk was verified by Rudolf Marek
751 * and discussed on the flashrom mailing list on 2010-07-12.
752 */
753 {
754 .vendor = "AMIC",
755 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000756 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000757 .manufacture_id = AMIC_ID,
758 .model_id = AMIC_A25L40PT,
759 .total_size = 512,
760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000761 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000762 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000763 .probe = probe_spi_rdid4,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = {
769 {64 * 1024, 7},
770 {32 * 1024, 1},
771 {16 * 1024, 1},
772 {8 * 1024, 1},
773 {4 * 1024, 2},
774 },
775 .block_erase = spi_block_erase_d8,
776 }, {
777 .eraseblocks = { {512 * 1024, 1} },
778 .block_erase = spi_block_erase_c7,
779 }
780 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000781 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000782 .unlock = spi_disable_blockprotect,
783 .write = spi_chip_write_256,
784 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000785 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000786 },
787
788 {
789 .vendor = "AMIC",
790 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000792 .manufacture_id = AMIC_ID,
793 .model_id = AMIC_A25L40PU,
794 .total_size = 512,
795 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000796 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000797 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000798 .probe = probe_spi_rdid4,
799 .probe_timing = TIMING_ZERO,
800 .block_erasers =
801 {
802 {
803 .eraseblocks = {
804 {4 * 1024, 2},
805 {8 * 1024, 1},
806 {16 * 1024, 1},
807 {32 * 1024, 1},
808 {64 * 1024, 7},
809 },
810 .block_erase = spi_block_erase_d8,
811 }, {
812 .eraseblocks = { {512 * 1024, 1} },
813 .block_erase = spi_block_erase_c7,
814 }
815 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000816 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000817 .unlock = spi_disable_blockprotect,
818 .write = spi_chip_write_256,
819 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000820 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000821 },
822
823 {
824 .vendor = "AMIC",
825 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000826 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000827 .manufacture_id = AMIC_ID,
828 .model_id = AMIC_A25L80P,
829 .total_size = 1024,
830 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000831 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000832 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000833 .probe = probe_spi_rdid4,
834 .probe_timing = TIMING_ZERO,
835 .block_erasers =
836 {
837 {
838 .eraseblocks = {
839 {4 * 1024, 2},
840 {8 * 1024, 1},
841 {16 * 1024, 1},
842 {32 * 1024, 1},
843 {64 * 1024, 15},
844 },
845 .block_erase = spi_block_erase_d8,
846 }, {
847 .eraseblocks = { {1024 * 1024, 1} },
848 .block_erase = spi_block_erase_c7,
849 }
850 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000851 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000852 .unlock = spi_disable_blockprotect,
853 .write = spi_chip_write_256,
854 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000855 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000856 },
857
858 {
859 .vendor = "AMIC",
860 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000861 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000862 .manufacture_id = AMIC_ID,
863 .model_id = AMIC_A25L16PT,
864 .total_size = 2048,
865 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000866 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000867 .tested = TEST_UNTESTED,
868 .probe = probe_spi_rdid4,
869 .probe_timing = TIMING_ZERO,
870 .block_erasers =
871 {
872 {
873 .eraseblocks = {
874 {64 * 1024, 31},
875 {32 * 1024, 1},
876 {16 * 1024, 1},
877 {8 * 1024, 1},
878 {4 * 1024, 2},
879 },
880 .block_erase = spi_block_erase_d8,
881 }, {
882 .eraseblocks = { {2048 * 1024, 1} },
883 .block_erase = spi_block_erase_60,
884 }, {
885 .eraseblocks = { {2048 * 1024, 1} },
886 .block_erase = spi_block_erase_c7,
887 }
888 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000889 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000890 .unlock = spi_disable_blockprotect,
891 .write = spi_chip_write_256,
892 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000893 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000894 },
895
896 {
897 .vendor = "AMIC",
898 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000899 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000900 .manufacture_id = AMIC_ID,
901 .model_id = AMIC_A25L16PU,
902 .total_size = 2048,
903 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000904 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000905 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000906 .probe = probe_spi_rdid4,
907 .probe_timing = TIMING_ZERO,
908 .block_erasers =
909 {
910 {
911 .eraseblocks = {
912 {4 * 1024, 2},
913 {8 * 1024, 1},
914 {16 * 1024, 1},
915 {32 * 1024, 1},
916 {64 * 1024, 31},
917 },
918 .block_erase = spi_block_erase_d8,
919 }, {
920 .eraseblocks = { {2048 * 1024, 1} },
921 .block_erase = spi_block_erase_60,
922 }, {
923 .eraseblocks = { {2048 * 1024, 1} },
924 .block_erase = spi_block_erase_c7,
925 }
926 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000927 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000928 .unlock = spi_disable_blockprotect,
929 .write = spi_chip_write_256,
930 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000931 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000932 },
933
934 {
935 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +0000936 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000937 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000938 .manufacture_id = AMIC_ID_NOPREFIX,
939 .model_id = AMIC_A25L512,
940 .total_size = 64,
941 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000942 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000943 .tested = TEST_UNTESTED,
944 .probe = probe_spi_rdid,
945 .probe_timing = TIMING_ZERO,
946 .block_erasers =
947 {
948 {
949 .eraseblocks = { { 4 * 1024, 16 } },
950 .block_erase = spi_block_erase_20,
951 }, {
952 .eraseblocks = { { 64 * 1024, 1 } },
953 .block_erase = spi_block_erase_d8,
954 }, {
955 .eraseblocks = { { 64 * 1024, 1 } },
956 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000957 }
Dan Lenski11617122010-07-29 15:00:40 +0000958 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000959 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +0000960 .unlock = spi_disable_blockprotect,
961 .write = spi_chip_write_256,
962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000963 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000964 },
965
966 {
967 .vendor = "AMIC",
968 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000969 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000970 .manufacture_id = AMIC_ID_NOPREFIX,
971 .model_id = AMIC_A25L010,
972 .total_size = 128,
973 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000974 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000975 .tested = TEST_UNTESTED,
976 .probe = probe_spi_rdid,
977 .probe_timing = TIMING_ZERO,
978 .block_erasers =
979 {
980 {
981 .eraseblocks = { { 4 * 1024, 32 } },
982 .block_erase = spi_block_erase_20,
983 }, {
984 .eraseblocks = { { 64 * 1024, 2 } },
985 .block_erase = spi_block_erase_d8,
986 }, {
987 .eraseblocks = { { 128 * 1024, 1 } },
988 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000989 }
Dan Lenski11617122010-07-29 15:00:40 +0000990 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000991 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +0000992 .unlock = spi_disable_blockprotect,
993 .write = spi_chip_write_256,
994 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000995 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000996 },
997
998 {
999 .vendor = "AMIC",
1000 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001001 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001002 .manufacture_id = AMIC_ID_NOPREFIX,
1003 .model_id = AMIC_A25L020,
1004 .total_size = 256,
1005 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001006 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001007 .tested = TEST_UNTESTED,
1008 .probe = probe_spi_rdid,
1009 .probe_timing = TIMING_ZERO,
1010 .block_erasers =
1011 {
1012 {
1013 .eraseblocks = { { 4 * 1024, 64 } },
1014 .block_erase = spi_block_erase_20,
1015 }, {
1016 .eraseblocks = { { 64 * 1024, 4 } },
1017 .block_erase = spi_block_erase_d8,
1018 }, {
1019 .eraseblocks = { { 256 * 1024, 1 } },
1020 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001021 }
Dan Lenski11617122010-07-29 15:00:40 +00001022 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001023 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001027 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001028 },
1029
1030 {
1031 .vendor = "AMIC",
1032 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001033 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001034 .manufacture_id = AMIC_ID_NOPREFIX,
1035 .model_id = AMIC_A25L040,
1036 .total_size = 512,
1037 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001038 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = { { 4 * 1024, 128 } },
1046 .block_erase = spi_block_erase_20,
1047 }, {
1048 .eraseblocks = { { 64 * 1024, 8 } },
1049 .block_erase = spi_block_erase_d8,
1050 }, {
1051 .eraseblocks = { { 512 * 1024, 1 } },
1052 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001053 }
Dan Lenski11617122010-07-29 15:00:40 +00001054 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001055 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001056 .unlock = spi_disable_blockprotect,
1057 .write = spi_chip_write_256,
1058 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001059 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001060 },
1061
1062 {
1063 .vendor = "AMIC",
1064 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001065 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001066 .manufacture_id = AMIC_ID_NOPREFIX,
1067 .model_id = AMIC_A25L080,
1068 .total_size = 1024,
1069 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001070 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001071 .tested = TEST_UNTESTED,
1072 .probe = probe_spi_rdid,
1073 .probe_timing = TIMING_ZERO,
1074 .block_erasers =
1075 {
1076 {
1077 .eraseblocks = { { 4 * 1024, 256 } },
1078 .block_erase = spi_block_erase_20,
1079 }, {
1080 .eraseblocks = { { 64 * 1024, 16 } },
1081 .block_erase = spi_block_erase_d8,
1082 }, {
1083 .eraseblocks = { { 1024 * 1024, 1 } },
1084 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001085 }
Dan Lenski11617122010-07-29 15:00:40 +00001086 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001087 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001088 .unlock = spi_disable_blockprotect,
1089 .write = spi_chip_write_256,
1090 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001091 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001092 },
1093
1094 {
1095 .vendor = "AMIC",
1096 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001097 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001098 .manufacture_id = AMIC_ID_NOPREFIX,
1099 .model_id = AMIC_A25L016,
1100 .total_size = 2048,
1101 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001102 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001103 .tested = TEST_UNTESTED,
1104 .probe = probe_spi_rdid,
1105 .probe_timing = TIMING_ZERO,
1106 .block_erasers =
1107 {
1108 {
1109 .eraseblocks = { { 4 * 1024, 512 } },
1110 .block_erase = spi_block_erase_20,
1111 }, {
1112 .eraseblocks = { { 64 * 1024, 32 } },
1113 .block_erase = spi_block_erase_d8,
1114 }, {
1115 .eraseblocks = { { 2048 * 1024, 1 } },
1116 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001117 }
Dan Lenski11617122010-07-29 15:00:40 +00001118 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001119 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001120 .unlock = spi_disable_blockprotect,
1121 .write = spi_chip_write_256,
1122 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001123 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001124 },
1125
1126 {
1127 .vendor = "AMIC",
1128 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001129 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001130 .manufacture_id = AMIC_ID_NOPREFIX,
1131 .model_id = AMIC_A25L032,
1132 .total_size = 4096,
1133 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001134 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001136 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001137 .probe = probe_spi_rdid,
1138 .probe_timing = TIMING_ZERO,
1139 .block_erasers =
1140 {
1141 {
1142 .eraseblocks = { { 4 * 1024, 1024 } },
1143 .block_erase = spi_block_erase_20,
1144 }, {
1145 .eraseblocks = { { 64 * 1024, 64 } },
1146 .block_erase = spi_block_erase_52,
1147 }, {
1148 .eraseblocks = { { 64 * 1024, 64 } },
1149 .block_erase = spi_block_erase_d8,
1150 }, {
1151 .eraseblocks = { { 4096 * 1024, 1 } },
1152 .block_erase = spi_block_erase_60,
1153 }, {
1154 .eraseblocks = { { 4096 * 1024, 1 } },
1155 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001156 }
Dan Lenski11617122010-07-29 15:00:40 +00001157 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001158 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1159 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001160 .write = spi_chip_write_256,
1161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001162 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001163 },
1164
1165 {
1166 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001167 .name = "A25LQ16",
1168 .bustype = BUS_SPI,
1169 .manufacture_id = AMIC_ID_NOPREFIX,
1170 .model_id = AMIC_A25LQ16,
1171 .total_size = 2048,
1172 .page_size = 256,
1173 /* supports SFDP */
1174 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1176 .tested = TEST_UNTESTED,
1177 .probe = probe_spi_rdid,
1178 .probe_timing = TIMING_ZERO,
1179 .block_erasers = {
1180 {
1181 .eraseblocks = { { 4 * 1024, 512 } },
1182 .block_erase = spi_block_erase_20,
1183 }, {
1184 .eraseblocks = { { 64 * 1024, 32 } },
1185 .block_erase = spi_block_erase_52,
1186 }, {
1187 .eraseblocks = { { 64 * 1024, 32 } },
1188 .block_erase = spi_block_erase_d8,
1189 }, {
1190 .eraseblocks = { { 2048 * 1024, 1 } },
1191 .block_erase = spi_block_erase_60,
1192 }, {
1193 .eraseblocks = { { 2048 * 1024, 1 } },
1194 .block_erase = spi_block_erase_c7,
1195 }
1196 },
1197 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1198 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1199 .write = spi_chip_write_256,
1200 .read = spi_chip_read,
1201 .voltage = {2700, 3600},
1202 },
1203
1204 {
1205 .vendor = "AMIC",
1206 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001207 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001208 .manufacture_id = AMIC_ID_NOPREFIX,
1209 .model_id = AMIC_A25LQ032,
1210 .total_size = 4096,
1211 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001212 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001213 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001215 .tested = TEST_UNTESTED,
1216 .probe = probe_spi_rdid,
1217 .probe_timing = TIMING_ZERO,
1218 .block_erasers =
1219 {
1220 {
1221 .eraseblocks = { { 4 * 1024, 1024 } },
1222 .block_erase = spi_block_erase_20,
1223 }, {
1224 .eraseblocks = { { 64 * 1024, 64 } },
1225 .block_erase = spi_block_erase_52,
1226 }, {
1227 .eraseblocks = { { 64 * 1024, 64 } },
1228 .block_erase = spi_block_erase_d8,
1229 }, {
1230 .eraseblocks = { { 4096 * 1024, 1 } },
1231 .block_erase = spi_block_erase_60,
1232 }, {
1233 .eraseblocks = { { 4096 * 1024, 1 } },
1234 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001235 }
Dan Lenski11617122010-07-29 15:00:40 +00001236 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001237 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1238 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1239 .write = spi_chip_write_256,
1240 .read = spi_chip_read,
1241 .voltage = {2700, 3600},
1242 },
1243
1244 {
1245 .vendor = "AMIC",
1246 .name = "A25LQ64",
1247 .bustype = BUS_SPI,
1248 .manufacture_id = AMIC_ID_NOPREFIX,
1249 .model_id = AMIC_A25LQ032,
1250 .total_size = 8192,
1251 .page_size = 256,
1252 /* supports SFDP */
1253 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1254 /* QPI enable 0x35, disable 0xF5 */
1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1256 .tested = TEST_UNTESTED,
1257 .probe = probe_spi_rdid,
1258 .probe_timing = TIMING_ZERO,
1259 .block_erasers =
1260 {
1261 {
1262 .eraseblocks = { { 4 * 1024, 2048 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 32 * 1024, 256 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 128 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 8192 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 8192 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
1276 }
1277 },
1278 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enhance (sic!) */
1279 .unlock = spi_disable_blockprotect,
Dan Lenski11617122010-07-29 15:00:40 +00001280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001282 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001283 },
1284
1285 {
1286 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001287 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001288 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A29002B,
1291 .total_size = 256,
1292 .page_size = 64 * 1024,
1293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1294 .tested = TEST_UNTESTED,
1295 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001296 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001297 .block_erasers =
1298 {
1299 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001300 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001301 {16 * 1024, 1},
1302 {8 * 1024, 2},
1303 {32 * 1024, 1},
1304 {64 * 1024, 3},
1305 },
1306 .block_erase = erase_sector_jedec,
1307 }, {
1308 .eraseblocks = { {256 * 1024, 1} },
1309 .block_erase = erase_chip_block_jedec,
1310 },
1311 },
1312 .write = write_jedec_1,
1313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001314 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001315 },
1316
1317 {
1318 .vendor = "AMIC",
1319 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001320 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001321 .manufacture_id = AMIC_ID_NOPREFIX,
1322 .model_id = AMIC_A29002T,
1323 .total_size = 256,
1324 .page_size = 64 * 1024,
1325 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001326 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001327 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001328 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001329 .block_erasers =
1330 {
1331 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001332 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001333 {64 * 1024, 3},
1334 {32 * 1024, 1},
1335 {8 * 1024, 2},
1336 {16 * 1024, 1},
1337 },
1338 .block_erase = erase_sector_jedec,
1339 }, {
1340 .eraseblocks = { {256 * 1024, 1} },
1341 .block_erase = erase_chip_block_jedec,
1342 },
1343 },
1344 .write = write_jedec_1,
1345 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001346 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001347 },
1348
1349 {
1350 .vendor = "AMIC",
1351 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001352 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001353 .manufacture_id = AMIC_ID_NOPREFIX,
1354 .model_id = AMIC_A29040B,
1355 .total_size = 512,
1356 .page_size = 64 * 1024,
1357 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1358 .tested = TEST_UNTESTED,
1359 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001360 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001361 .block_erasers =
1362 {
1363 {
1364 .eraseblocks = { {64 * 1024, 8} },
1365 .block_erase = erase_sector_jedec,
1366 }, {
1367 .eraseblocks = { {512 * 1024, 1} },
1368 .block_erase = erase_chip_block_jedec,
1369 },
1370 },
1371 .write = write_jedec_1,
1372 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001373 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001374 },
1375
1376 {
1377 .vendor = "AMIC",
1378 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001379 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001380 .manufacture_id = AMIC_ID_NOPREFIX,
1381 .model_id = AMIC_A49LF040A,
1382 .total_size = 512,
1383 .page_size = 64 * 1024,
1384 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00001385 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001386 .probe = probe_jedec,
1387 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1388 .block_erasers =
1389 {
1390 {
1391 .eraseblocks = { {64 * 1024, 8} },
1392 .block_erase = erase_block_jedec,
1393 }, {
1394 .eraseblocks = { {512 * 1024, 1} },
1395 .block_erase = erase_chip_block_jedec,
1396 }
1397 },
1398 .unlock = unlock_49fl00x,
1399 .write = write_jedec_1,
1400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001401 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 },
1403
1404 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001405 .vendor = "Atmel",
1406 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001407 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001408 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001409 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001410 .total_size = 256,
1411 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001412 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001414 .tested = TEST_UNTESTED,
1415 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001416 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001417 .block_erasers =
1418 {
1419 {
1420 .eraseblocks = { {4 * 1024, 64} },
1421 .block_erase = spi_block_erase_20,
1422 }, {
1423 .eraseblocks = { {32 * 1024, 8} },
1424 .block_erase = spi_block_erase_52,
1425 }, {
1426 .eraseblocks = { {64 * 1024, 4} },
1427 .block_erase = spi_block_erase_d8,
1428 }, {
1429 .eraseblocks = { {256 * 1024, 1} },
1430 .block_erase = spi_block_erase_60,
1431 }, {
1432 .eraseblocks = { {256 * 1024, 1} },
1433 .block_erase = spi_block_erase_c7,
1434 }
1435 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001436 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001437 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001438 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001439 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001440 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001441 },
1442
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001443 {
1444 .vendor = "Atmel",
1445 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001446 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001447 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001448 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001449 .total_size = 512,
1450 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001451 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001452 .tested = TEST_UNTESTED,
1453 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001454 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001455 .block_erasers =
1456 {
1457 {
1458 .eraseblocks = { {4 * 1024, 128} },
1459 .block_erase = spi_block_erase_20,
1460 }, {
1461 .eraseblocks = { {32 * 1024, 16} },
1462 .block_erase = spi_block_erase_52,
1463 }, {
1464 .eraseblocks = { {64 * 1024, 8} },
1465 .block_erase = spi_block_erase_d8,
1466 }, {
1467 .eraseblocks = { {512 * 1024, 1} },
1468 .block_erase = spi_block_erase_60,
1469 }, {
1470 .eraseblocks = { {512 * 1024, 1} },
1471 .block_erase = spi_block_erase_c7,
1472 }
1473 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001474 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001475 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001476 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001477 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001478 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001479 },
1480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 {
1482 .vendor = "Atmel",
1483 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001484 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001485 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001486 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001487 .total_size = 1024,
1488 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001489 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001490 .tested = TEST_UNTESTED,
1491 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001492 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001493 .block_erasers =
1494 {
1495 {
1496 .eraseblocks = { {4 * 1024, 256} },
1497 .block_erase = spi_block_erase_20,
1498 }, {
1499 .eraseblocks = { {32 * 1024, 32} },
1500 .block_erase = spi_block_erase_52,
1501 }, {
1502 .eraseblocks = { {64 * 1024, 16} },
1503 .block_erase = spi_block_erase_d8,
1504 }, {
1505 .eraseblocks = { {1024 * 1024, 1} },
1506 .block_erase = spi_block_erase_60,
1507 }, {
1508 .eraseblocks = { {1024 * 1024, 1} },
1509 .block_erase = spi_block_erase_c7,
1510 }
1511 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001512 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001513 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001514 .write = spi_chip_write_256,
1515 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001516 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 },
1518
1519 {
1520 .vendor = "Atmel",
1521 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001522 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001523 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001524 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001525 .total_size = 1024,
1526 .page_size = 256,
1527 .feature_bits = FEATURE_WRSR_WREN,
1528 .tested = TEST_UNTESTED,
1529 .probe = probe_spi_rdid,
1530 .probe_timing = TIMING_ZERO,
1531 .block_erasers =
1532 {
1533 {
1534 .eraseblocks = { {4 * 1024, 256} },
1535 .block_erase = spi_block_erase_20,
1536 }, {
1537 .eraseblocks = { {32 * 1024, 32} },
1538 .block_erase = spi_block_erase_52,
1539 }, {
1540 .eraseblocks = { {64 * 1024, 16} },
1541 .block_erase = spi_block_erase_d8,
1542 }, {
1543 .eraseblocks = { {1024 * 1024, 1} },
1544 .block_erase = spi_block_erase_60,
1545 }, {
1546 .eraseblocks = { {1024 * 1024, 1} },
1547 .block_erase = spi_block_erase_c7,
1548 }
1549 },
1550 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001551 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001552 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001553 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001554 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001555 },
1556
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001557 {
1558 .vendor = "Atmel",
1559 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001560 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001561 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001562 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001563 .total_size = 2048,
1564 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001565 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner2abab942012-04-27 20:41:23 +00001566 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001568 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001569 .block_erasers =
1570 {
1571 {
1572 .eraseblocks = { {4 * 1024, 512} },
1573 .block_erase = spi_block_erase_20,
1574 }, {
1575 .eraseblocks = { {32 * 1024, 64} },
1576 .block_erase = spi_block_erase_52,
1577 }, {
1578 .eraseblocks = { {64 * 1024, 32} },
1579 .block_erase = spi_block_erase_d8,
1580 }, {
1581 .eraseblocks = { {2 * 1024 * 1024, 1} },
1582 .block_erase = spi_block_erase_60,
1583 }, {
1584 .eraseblocks = { {2 * 1024 * 1024, 1} },
1585 .block_erase = spi_block_erase_c7,
1586 }
1587 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001588 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001589 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001590 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001591 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001592 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001593 },
1594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001595 {
1596 .vendor = "Atmel",
1597 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001600 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 .total_size = 4096,
1602 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001603 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001604 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001606 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001607 .block_erasers =
1608 {
1609 {
1610 .eraseblocks = { {4 * 1024, 1024} },
1611 .block_erase = spi_block_erase_20,
1612 }, {
1613 .eraseblocks = { {32 * 1024, 128} },
1614 .block_erase = spi_block_erase_52,
1615 }, {
1616 .eraseblocks = { {64 * 1024, 64} },
1617 .block_erase = spi_block_erase_d8,
1618 }, {
1619 .eraseblocks = { {4 * 1024 * 1024, 1} },
1620 .block_erase = spi_block_erase_60,
1621 }, {
1622 .eraseblocks = { {4 * 1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_c7,
1624 }
1625 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001626 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001627 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001628 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001631 },
1632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001633 {
1634 .vendor = "Atmel",
1635 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001636 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001637 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001638 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001639 .total_size = 4096,
1640 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001641 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001645 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001646 .block_erasers =
1647 {
1648 {
1649 .eraseblocks = { {4 * 1024, 1024} },
1650 .block_erase = spi_block_erase_20,
1651 }, {
1652 .eraseblocks = { {32 * 1024, 128} },
1653 .block_erase = spi_block_erase_52,
1654 }, {
1655 .eraseblocks = { {64 * 1024, 64} },
1656 .block_erase = spi_block_erase_d8,
1657 }, {
1658 .eraseblocks = { {4 * 1024 * 1024, 1} },
1659 .block_erase = spi_block_erase_60,
1660 }, {
1661 .eraseblocks = { {4 * 1024 * 1024, 1} },
1662 .block_erase = spi_block_erase_c7,
1663 }
1664 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001665 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001666 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001667 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001668 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001669 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001670 },
1671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001672 {
1673 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001674 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001676 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001677 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001678 .total_size = 8192,
1679 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001680 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001681 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001682 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001683 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001684 .block_erasers =
1685 {
1686 {
1687 .eraseblocks = { {4 * 1024, 2048} },
1688 .block_erase = spi_block_erase_20,
1689 }, {
1690 .eraseblocks = { {32 * 1024, 256} },
1691 .block_erase = spi_block_erase_52,
1692 }, {
1693 .eraseblocks = { {64 * 1024, 128} },
1694 .block_erase = spi_block_erase_d8,
1695 }, {
1696 .eraseblocks = { {8 * 1024 * 1024, 1} },
1697 .block_erase = spi_block_erase_60,
1698 }, {
1699 .eraseblocks = { {8 * 1024 * 1024, 1} },
1700 .block_erase = spi_block_erase_c7,
1701 }
1702 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001703 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001704 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001705 .write = spi_chip_write_256,
1706 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001707 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001708 },
1709
1710 {
1711 .vendor = "Atmel",
1712 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001713 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001714 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001715 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001716 .total_size = 2048,
1717 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001718 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001720 .tested = TEST_UNTESTED,
1721 .probe = probe_spi_rdid,
1722 .probe_timing = TIMING_ZERO,
1723 .block_erasers =
1724 {
1725 {
1726 .eraseblocks = { {4 * 1024, 512} },
1727 .block_erase = spi_block_erase_20,
1728 }, {
1729 .eraseblocks = { {32 * 1024, 64} },
1730 .block_erase = spi_block_erase_52,
1731 }, {
1732 .eraseblocks = { {64 * 1024, 32} },
1733 .block_erase = spi_block_erase_d8,
1734 }, {
1735 .eraseblocks = { {2 * 1024 * 1024, 1} },
1736 .block_erase = spi_block_erase_60,
1737 }, {
1738 .eraseblocks = { {2 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_c7,
1740 }
1741 },
1742 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001743 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001744 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001745 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001746 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001747 },
1748
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001749 {
1750 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001751 .name = "AT25F512",
1752 .bustype = BUS_SPI,
1753 .manufacture_id = ATMEL_ID,
1754 .model_id = ATMEL_AT25F512,
1755 .total_size = 64,
1756 .page_size = 256,
1757 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001758 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001759 .probe = probe_spi_at25f,
1760 .probe_timing = TIMING_ZERO,
1761 .block_erasers =
1762 {
1763 {
1764 .eraseblocks = { {32 * 1024, 2} },
1765 .block_erase = spi_block_erase_52,
1766 }, {
1767 .eraseblocks = { {64 * 1024, 1} },
1768 .block_erase = spi_block_erase_62,
1769 }
1770 },
1771 .printlock = spi_prettyprint_status_register_at25f,
1772 .unlock = spi_disable_blockprotect_at25f,
1773 .write = spi_chip_write_256,
1774 .read = spi_chip_read,
1775 .voltage = {2700, 3600},
1776 },
1777
1778 {
1779 .vendor = "Atmel",
1780 .name = "AT25F512A",
1781 .bustype = BUS_SPI,
1782 .manufacture_id = ATMEL_ID,
1783 .model_id = ATMEL_AT25F512A,
1784 .total_size = 64,
1785 .page_size = 128,
1786 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001787 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001788 .probe = probe_spi_at25f,
1789 .probe_timing = TIMING_ZERO,
1790 .block_erasers =
1791 {
1792 {
1793 .eraseblocks = { {32 * 1024, 2} },
1794 .block_erase = spi_block_erase_52,
1795 }, {
1796 .eraseblocks = { {64 * 1024, 1} },
1797 .block_erase = spi_block_erase_62,
1798 }
1799 },
1800 .printlock = spi_prettyprint_status_register_at25f512a,
1801 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1802 .unlock = spi_disable_blockprotect_at25f512a,
1803 .write = spi_chip_write_256,
1804 .read = spi_chip_read,
1805 .voltage = {2700, 3600},
1806 },
1807
1808 {
1809 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001810 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001811 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001813 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001814 .total_size = 64,
1815 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001816 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1817 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001818 .tested = TEST_UNTESTED,
1819 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001820 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001821 .block_erasers =
1822 {
1823 {
1824 .eraseblocks = { {4 * 1024, 16} },
1825 .block_erase = spi_block_erase_20,
1826 }, {
1827 .eraseblocks = { {32 * 1024, 2} },
1828 .block_erase = spi_block_erase_52,
1829 }, {
1830 .eraseblocks = { {32 * 1024, 2} },
1831 .block_erase = spi_block_erase_d8,
1832 }, {
1833 .eraseblocks = { {64 * 1024, 1} },
1834 .block_erase = spi_block_erase_60,
1835 }, {
1836 .eraseblocks = { {64 * 1024, 1} },
1837 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001838 }, {
1839 .eraseblocks = { {64 * 1024, 1} },
1840 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00001841 }
1842 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00001843 .printlock = spi_prettyprint_status_register_at25f512b,
1844 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001845 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001846 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001847 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001848 },
1849
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001850 {
1851 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001852 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1853 * All other properties seem to be the same.*/
1854 .name = "AT25F1024(A)",
1855 .bustype = BUS_SPI,
1856 .manufacture_id = ATMEL_ID,
1857 .model_id = ATMEL_AT25F1024,
1858 .total_size = 128,
1859 .page_size = 256,
1860 .feature_bits = FEATURE_WRSR_WREN,
1861 .tested = TEST_OK_PREW,
1862 .probe = probe_spi_at25f,
1863 .probe_timing = TIMING_ZERO,
1864 .block_erasers =
1865 {
1866 {
1867 .eraseblocks = { {32 * 1024, 4} },
1868 .block_erase = spi_block_erase_52,
1869 }, {
1870 .eraseblocks = { {128 * 1024, 1} },
1871 .block_erase = spi_block_erase_62,
1872 }
1873 },
1874 .printlock = spi_prettyprint_status_register_at25f,
1875 .unlock = spi_disable_blockprotect_at25f,
1876 .write = spi_chip_write_256,
1877 .read = spi_chip_read,
1878 .voltage = {2700, 3600},
1879 },
1880
1881 {
1882 .vendor = "Atmel",
1883 .name = "AT25F2048",
1884 .bustype = BUS_SPI,
1885 .manufacture_id = ATMEL_ID,
1886 .model_id = ATMEL_AT25F2048,
1887 .total_size = 256,
1888 .page_size = 256,
1889 .feature_bits = FEATURE_WRSR_WREN,
1890 .tested = TEST_UNTESTED,
1891 .probe = probe_spi_at25f,
1892 .probe_timing = TIMING_ZERO,
1893 .block_erasers =
1894 {
1895 {
1896 .eraseblocks = { {64 * 1024, 4} },
1897 .block_erase = spi_block_erase_52,
1898 }, {
1899 .eraseblocks = { {256 * 1024, 1} },
1900 .block_erase = spi_block_erase_62,
1901 }
1902 },
1903 .printlock = spi_prettyprint_status_register_at25f,
1904 .unlock = spi_disable_blockprotect_at25f,
1905 .write = spi_chip_write_256,
1906 .read = spi_chip_read,
1907 .voltage = {2700, 3600},
1908 },
1909
1910 {
1911 .vendor = "Atmel",
1912 .name = "AT25F4096",
1913 .bustype = BUS_SPI,
1914 .manufacture_id = ATMEL_ID,
1915 .model_id = ATMEL_AT25F4096,
1916 .total_size = 512,
1917 .page_size = 256,
1918 .feature_bits = FEATURE_WRSR_WREN,
1919 .tested = TEST_UNTESTED,
1920 .probe = probe_spi_at25f,
1921 .probe_timing = TIMING_ZERO,
1922 .block_erasers =
1923 {
1924 {
1925 .eraseblocks = { {64 * 1024, 8} },
1926 .block_erase = spi_block_erase_52,
1927 }, {
1928 .eraseblocks = { {512 * 1024, 1} },
1929 .block_erase = spi_block_erase_62,
1930 }
1931 },
1932 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00001933 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
1934 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001935 .write = spi_chip_write_256,
1936 .read = spi_chip_read,
1937 .voltage = {2700, 3600},
1938 },
1939
1940 {
1941 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001942 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001943 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001944 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001945 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001946 .total_size = 128,
1947 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001948 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00001949 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001950 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001951 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001952 .block_erasers =
1953 {
1954 {
1955 .eraseblocks = { {4 * 1024, 32} },
1956 .block_erase = spi_block_erase_20,
1957 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001958 .eraseblocks = { {4 * 1024, 32} },
1959 .block_erase = spi_block_erase_d7,
1960 }, {
Sean Nelson89187292009-12-23 12:02:55 +00001961 .eraseblocks = { {32 * 1024, 4} },
1962 .block_erase = spi_block_erase_52,
1963 }, {
1964 .eraseblocks = { {32 * 1024, 4} },
1965 .block_erase = spi_block_erase_d8,
1966 }, {
1967 .eraseblocks = { {128 * 1024, 1} },
1968 .block_erase = spi_block_erase_60,
1969 }, {
1970 .eraseblocks = { {128 * 1024, 1} },
1971 .block_erase = spi_block_erase_c7,
1972 }
1973 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001974 .printlock = spi_prettyprint_status_register_at25fs010,
1975 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001976 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001977 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001978 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001979 },
1980
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001981 {
1982 .vendor = "Atmel",
1983 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001984 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001985 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001986 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001987 .total_size = 512,
1988 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001989 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001990 .tested = TEST_UNTESTED,
1991 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001992 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001993 .block_erasers =
1994 {
1995 {
1996 .eraseblocks = { {4 * 1024, 128} },
1997 .block_erase = spi_block_erase_20,
1998 }, {
1999 .eraseblocks = { {64 * 1024, 8} },
2000 .block_erase = spi_block_erase_52,
2001 }, {
2002 .eraseblocks = { {64 * 1024, 8} },
2003 .block_erase = spi_block_erase_d8,
2004 }, {
2005 .eraseblocks = { {512 * 1024, 1} },
2006 .block_erase = spi_block_erase_60,
2007 }, {
2008 .eraseblocks = { {512 * 1024, 1} },
2009 .block_erase = spi_block_erase_c7,
2010 }
2011 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002012 .printlock = spi_prettyprint_status_register_at25fs040,
2013 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002014 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002015 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002016 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002017 },
2018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002019 {
2020 .vendor = "Atmel",
2021 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002022 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002023 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002024 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002025 .total_size = 512,
2026 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002027 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002028 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002029 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002030 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002031 .block_erasers =
2032 {
2033 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002034 .eraseblocks = { {256, 2048} },
2035 .block_erase = spi_block_erase_81,
2036 }, {
2037 .eraseblocks = { {2 * 1024, 256} },
2038 .block_erase = spi_block_erase_50,
2039 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002040 .eraseblocks = { {4 * 1024, 128} },
2041 .block_erase = spi_block_erase_20,
2042 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002043 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002044 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002045 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002046 .write = spi_chip_write_1,
2047 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002048 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002049 },
2050
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002051 {
2052 .vendor = "Atmel",
2053 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002054 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002055 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002056 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002057 .total_size = 1024,
2058 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002059 .feature_bits = FEATURE_WRSR_WREN,
2060 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002061 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002062 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002063 .block_erasers =
2064 {
2065 {
2066 .eraseblocks = { {4 * 1024, 256} },
2067 .block_erase = spi_block_erase_20,
2068 }, {
2069 .eraseblocks = { {32 * 1024, 32} },
2070 .block_erase = spi_block_erase_52,
2071 }, {
2072 .eraseblocks = { {64 * 1024, 16} },
2073 .block_erase = spi_block_erase_d8,
2074 }, {
2075 .eraseblocks = { {1024 * 1024, 1} },
2076 .block_erase = spi_block_erase_60,
2077 }, {
2078 .eraseblocks = { {1024 * 1024, 1} },
2079 .block_erase = spi_block_erase_c7,
2080 }
2081 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002082 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002083 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002084 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002085 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002086 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002087 },
2088
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002089 {
2090 .vendor = "Atmel",
2091 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002092 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002093 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002094 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002095 .total_size = 2048,
2096 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002097 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00002098 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002099 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002100 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002101 .block_erasers =
2102 {
2103 {
2104 .eraseblocks = { {4 * 1024, 512} },
2105 .block_erase = spi_block_erase_20,
2106 }, {
2107 .eraseblocks = { {32 * 1024, 64} },
2108 .block_erase = spi_block_erase_52,
2109 }, {
2110 .eraseblocks = { {64 * 1024, 32} },
2111 .block_erase = spi_block_erase_d8,
2112 }, {
2113 .eraseblocks = { {2 * 1024 * 1024, 1} },
2114 .block_erase = spi_block_erase_60,
2115 }, {
2116 .eraseblocks = { {2 * 1024 * 1024, 1} },
2117 .block_erase = spi_block_erase_c7,
2118 }
2119 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002120 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002121 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002122 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002123 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002124 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002125 },
2126
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002127 {
2128 .vendor = "Atmel",
2129 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002130 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002131 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002132 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002133 .total_size = 2048,
2134 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002135 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002136 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002137 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002138 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002139 .block_erasers =
2140 {
2141 {
2142 .eraseblocks = { {4 * 1024, 512} },
2143 .block_erase = spi_block_erase_20,
2144 }, {
2145 .eraseblocks = { {32 * 1024, 64} },
2146 .block_erase = spi_block_erase_52,
2147 }, {
2148 .eraseblocks = { {64 * 1024, 32} },
2149 .block_erase = spi_block_erase_d8,
2150 }, {
2151 .eraseblocks = { {2 * 1024 * 1024, 1} },
2152 .block_erase = spi_block_erase_60,
2153 }, {
2154 .eraseblocks = { {2 * 1024 * 1024, 1} },
2155 .block_erase = spi_block_erase_c7,
2156 }
2157 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002158 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002159 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002160 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002162 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002163 },
2164
2165 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002166 /*{
2167 .vendor = "Atmel",
2168 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002169 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002170 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002171 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002172 .total_size = 4096,
2173 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002174 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002175 .tested = TEST_UNTESTED,
2176 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002177 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002178 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002179 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002180 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002181 .read = spi_chip_read,
2182 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002183
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002184 {
2185 .vendor = "Atmel",
2186 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002187 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002188 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002189 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002190 .total_size = 512,
2191 .page_size = 256,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002192 .tested = TEST_BAD_WRITE,
Steven Zakulec3603a282012-05-02 20:07:57 +00002193 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002194 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002195 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002196 .block_erasers =
2197 {
2198 {
2199 .eraseblocks = { {4 * 1024, 128} },
2200 .block_erase = spi_block_erase_20,
2201 }, {
2202 .eraseblocks = { {32 * 1024, 16} },
2203 .block_erase = spi_block_erase_52,
2204 }, {
2205 .eraseblocks = { {64 * 1024, 8} },
2206 .block_erase = spi_block_erase_d8,
2207 }, {
2208 .eraseblocks = { {512 * 1024, 1} },
2209 .block_erase = spi_block_erase_60,
2210 }, {
2211 .eraseblocks = { {512 * 1024, 1} },
2212 .block_erase = spi_block_erase_c7,
2213 }
2214 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002215 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002216 .write = NULL /* Incompatible Page write */,
2217 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002218 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002219 },
2220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002221 {
2222 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002223 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002224 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002225 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002226 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002227 .total_size = 64,
2228 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002229 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002230 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002231 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002232 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002233 .block_erasers =
2234 {
2235 {
2236 .eraseblocks = { {64 * 1024, 1} },
2237 .block_erase = erase_chip_block_jedec,
2238 }
2239 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002240 .write = write_jedec,
2241 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002242 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002243 },
2244
2245 {
2246 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002247 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002248 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002249 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002250 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002251 .total_size = 128,
2252 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002253 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002254 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002255 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002256 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002257 .block_erasers =
2258 {
2259 {
2260 .eraseblocks = { {128 * 1024, 1} },
2261 .block_erase = erase_chip_block_jedec,
2262 }
2263 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002264 .write = write_jedec, /* FIXME */
2265 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002266 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002267 },
2268
2269 {
2270 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002271 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002272 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002273 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002274 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002275 .total_size = 256,
2276 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002277 .feature_bits = FEATURE_LONG_RESET,
2278 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002279 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002280 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002281 .block_erasers =
2282 {
2283 {
2284 .eraseblocks = { {256 * 1024, 1} },
2285 .block_erase = erase_chip_block_jedec,
2286 }
2287 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002288 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002289 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002290 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002291 },
2292
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002293 {
2294 .vendor = "Atmel",
2295 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002296 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002297 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002298 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002299 .total_size = 512,
2300 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002301 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002302 .tested = TEST_UNTESTED,
2303 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002304 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002305 .block_erasers =
2306 {
2307 {
2308 .eraseblocks = { {512 * 1024, 1} },
2309 .block_erase = erase_chip_block_jedec,
2310 }
2311 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002312 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002314 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002315 },
2316
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002317 {
2318 .vendor = "Atmel",
2319 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002320 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002321 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002322 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002323 .total_size = 16896 /* No power of two sizes */,
2324 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002325 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002326 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002327 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002328 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002329 .write = NULL /* Incompatible Page write */,
2330 .read = NULL /* Incompatible read */,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002331 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002332 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002333
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002334 {
2335 .vendor = "Atmel",
2336 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002337 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002338 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002339 .model_id = ATMEL_AT45DB011D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002340 .total_size = 128 /* Size can only be determined from status register */,
2341 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002342 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002343 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002344 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002345 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002346 .write = NULL,
2347 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002348 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002349 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002350
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002351 {
2352 .vendor = "Atmel",
2353 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002354 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002355 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002356 .model_id = ATMEL_AT45DB021D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002357 .total_size = 256 /* Size can only be determined from status register */,
2358 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002359 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002360 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002361 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002362 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002363 .write = NULL,
2364 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002365 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002366 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002367
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002368 {
2369 .vendor = "Atmel",
2370 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002371 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002372 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002373 .model_id = ATMEL_AT45DB041D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002374 .total_size = 512 /* Size can only be determined from status register */,
2375 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002376 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002377 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002378 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002379 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .write = NULL,
2381 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002382 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002383 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002384
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002385 {
2386 .vendor = "Atmel",
2387 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002388 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002389 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002390 .model_id = ATMEL_AT45DB081D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002391 .total_size = 1024 /* Size can only be determined from status register */,
2392 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002393 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002394 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002395 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002396 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002397 .write = NULL,
2398 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002399 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002400 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002401
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002402 {
2403 .vendor = "Atmel",
2404 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002405 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002406 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002407 .model_id = ATMEL_AT45DB161D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002408 .total_size = 2048 /* Size can only be determined from status register */,
2409 .page_size = 512 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002410 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002411 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002412 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002413 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002414 .write = NULL,
2415 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002416 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002417 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002418
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002419 {
2420 .vendor = "Atmel",
2421 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002422 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002423 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002424 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002425 .total_size = 4224 /* No power of two sizes */,
2426 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002427 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002428 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002429 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002430 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002431 .write = NULL,
2432 .read = NULL /* Incompatible read */,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002433 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002434 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002435
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002436 {
2437 .vendor = "Atmel",
2438 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002439 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002440 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002441 .model_id = ATMEL_AT45DB321D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002442 .total_size = 4096 /* Size can only be determined from status register */,
2443 .page_size = 512 /* Size can only be determined from status register */,
Daniel Lenski65922a32012-02-15 23:40:23 +00002444 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Steven Zakulec3603a282012-05-02 20:07:57 +00002445 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Daniel Lenski65922a32012-02-15 23:40:23 +00002446 .feature_bits = FEATURE_OTP,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002447 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002448 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002449 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002450 .write = NULL,
2451 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002452 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002453 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002454
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002455 {
2456 .vendor = "Atmel",
2457 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002458 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002459 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002460 .model_id = ATMEL_AT45DB642D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002461 .total_size = 8192 /* Size can only be determined from status register */,
2462 .page_size = 1024 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002463 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002464 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002465 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002466 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002467 .write = NULL,
2468 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002469 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002470 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002471
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002472 {
2473 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002474 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002475 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002476 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002477 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002478 .total_size = 64,
2479 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002480 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002481 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002482 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002483 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002484 .block_erasers =
2485 {
2486 {
2487 .eraseblocks = { {64 * 1024, 1} },
2488 .block_erase = erase_chip_block_jedec,
2489 }
2490 },
Sean Nelson35727f72010-01-28 23:55:12 +00002491 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002492 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002493 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002494 },
2495
2496 {
2497 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002498 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002499 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002500 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002501 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002502 .total_size = 256,
2503 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002504 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002505 .tested = TEST_UNTESTED,
2506 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002507 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002508 .block_erasers =
2509 {
2510 {
2511 .eraseblocks = {
2512 {16 * 1024, 1},
2513 {8 * 1024, 2},
2514 {96 * 1024, 1},
2515 {128 * 1024, 1},
2516 },
2517 .block_erase = erase_sector_jedec,
2518 }, {
2519 .eraseblocks = { {256 * 1024, 1} },
2520 .block_erase = erase_chip_block_jedec,
2521 }
2522 },
Sean Nelson35727f72010-01-28 23:55:12 +00002523 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002524 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002525 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002526 },
2527
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002528 {
2529 .vendor = "Atmel",
2530 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002531 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002532 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002533 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002534 .total_size = 256,
2535 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002536 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002537 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002538 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002539 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002540 .block_erasers =
2541 {
2542 {
2543 .eraseblocks = {
2544 {128 * 1024, 1},
2545 {96 * 1024, 1},
2546 {8 * 1024, 2},
2547 {16 * 1024, 1},
2548 },
2549 .block_erase = erase_sector_jedec,
2550 }, {
2551 .eraseblocks = { {256 * 1024, 1} },
2552 .block_erase = erase_chip_block_jedec,
2553 }
2554 },
Sean Nelson35727f72010-01-28 23:55:12 +00002555 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002556 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002557 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002558 },
2559
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002560 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002561 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002562 .name = "AT49(H)F010",
2563 .bustype = BUS_PARALLEL,
2564 .manufacture_id = ATMEL_ID,
2565 .model_id = ATMEL_AT49F010,
2566 .total_size = 128,
2567 .page_size = 0, /* unused */
2568 .feature_bits = FEATURE_EITHER_RESET,
2569 .tested = TEST_OK_PREW,
2570 .probe = probe_jedec,
2571 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2572 .block_erasers =
2573 {
2574 {
2575 .eraseblocks = { {128 * 1024, 1} },
2576 .block_erase = erase_chip_block_jedec,
2577 }
2578 },
2579 .printlock = printlock_at49f,
2580 .write = write_jedec_1,
2581 .read = read_memmapped,
2582 .voltage = {4500, 5500},
2583 },
2584
2585 {
2586 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002587 .name = "AT49F020",
2588 .bustype = BUS_PARALLEL,
2589 .manufacture_id = ATMEL_ID,
2590 .model_id = ATMEL_AT49F020,
2591 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002592 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002593 .feature_bits = FEATURE_EITHER_RESET,
2594 .tested = TEST_OK_PRE,
2595 .probe = probe_jedec,
2596 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2597 .block_erasers =
2598 {
2599 {
2600 .eraseblocks = { {256 * 1024, 1} },
2601 .block_erase = erase_chip_block_jedec,
2602 }
2603 /* Chip features an optional permanent write protection
2604 * of the first 8 kB. The erase function is the same as
2605 * above, but 00000H to 01FFFH will not be erased.
2606 * FIXME: add another eraser when partial erasers are
2607 * supported.
2608 */
2609 },
2610 .printlock = printlock_at49f,
2611 .write = write_jedec_1,
2612 .read = read_memmapped,
2613 .voltage = {4500, 5500},
2614 },
2615
2616 {
2617 .vendor = "Atmel",
2618 .name = "AT49F040",
2619 .bustype = BUS_PARALLEL,
2620 .manufacture_id = ATMEL_ID,
2621 .model_id = ATMEL_AT49F040,
2622 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002623 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002624 .feature_bits = FEATURE_EITHER_RESET,
2625 .tested = TEST_UNTESTED,
2626 .probe = probe_jedec,
2627 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2628 .block_erasers =
2629 {
2630 {
2631 .eraseblocks = { {512 * 1024, 1} },
2632 .block_erase = erase_chip_block_jedec,
2633 }
2634 /* Chip features an optional permanent write protection
2635 * of the first 16 kB. The erase function is the same as
2636 * above, but 00000H to 03FFFH will not be erased.
2637 * FIXME: add another eraser when partial erasers are
2638 * supported.
2639 */
2640 },
2641 .printlock = printlock_at49f,
2642 .write = write_jedec_1,
2643 .read = read_memmapped,
2644 .voltage = {4500, 5500},
2645 },
2646
2647 {
2648 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002649 .name = "AT49F080",
2650 .bustype = BUS_PARALLEL,
2651 .manufacture_id = ATMEL_ID,
2652 .model_id = ATMEL_AT49F080,
2653 .total_size = 1024,
2654 .page_size = 0, /* unused */
2655 .feature_bits = FEATURE_EITHER_RESET,
2656 .tested = TEST_UNTESTED,
2657 .probe = probe_jedec,
2658 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2659 .block_erasers =
2660 {
2661 {
2662 .eraseblocks = { {1024 * 1024, 1} },
2663 .block_erase = erase_chip_block_jedec,
2664 }
2665 /* Chip features an optional permanent write protection
2666 * of the first 16 kB. The erase function is the same as
2667 * above, but 00000H to 03FFFH will not be erased.
2668 * FIXME: add another eraser when partial erasers are
2669 * supported.
2670 */
2671 },
2672 .printlock = printlock_at49f,
2673 .write = write_jedec_1,
2674 .read = read_memmapped,
2675 .voltage = {4500, 5500},
2676 },
2677
2678 {
2679 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
2680 .vendor = "Atmel",
2681 .name = "AT49F080T",
2682 .bustype = BUS_PARALLEL,
2683 .manufacture_id = ATMEL_ID,
2684 .model_id = ATMEL_AT49F080T,
2685 .total_size = 1024,
2686 .page_size = 0, /* unused */
2687 .feature_bits = FEATURE_EITHER_RESET,
2688 .tested = TEST_UNTESTED,
2689 .probe = probe_jedec,
2690 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2691 .block_erasers =
2692 {
2693 {
2694 .eraseblocks = { {1024 * 1024, 1} },
2695 .block_erase = erase_chip_block_jedec,
2696 }
2697 /* Chip features an optional permanent write protection
2698 * of the first 16 kB. The erase function is the same as
2699 * above, but FC000H to FFFFFH will not be erased.
2700 * FIXME: add another eraser when partial erasers are
2701 * supported.
2702 */
2703 },
2704 .printlock = printlock_at49f,
2705 .write = write_jedec_1,
2706 .read = read_memmapped,
2707 .voltage = {4500, 5500},
2708 },
2709
2710 {
2711 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00002712 .name = "AT49LH002",
2713 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2714 .manufacture_id = ATMEL_ID,
2715 .model_id = ATMEL_AT49LH002,
2716 .total_size = 256,
2717 .page_size = 0, /* unused */
2718 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2719 .tested = TEST_UNTESTED,
2720 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2721 .probe_timing = TIMING_FIXME,
2722 .block_erasers =
2723 {
2724 {
2725 .eraseblocks = {
2726 {64 * 1024, 3},
2727 {32 * 1024, 1},
2728 {8 * 1024, 2},
2729 {16 * 1024, 1},
2730 },
2731 .block_erase = erase_block_82802ab,
2732 }, {
2733 .eraseblocks = {
2734 {64 * 1024, 4},
2735 },
2736 .block_erase = NULL, /* TODO: Implement. */
2737 },
2738 },
2739 .printlock = NULL, /* TODO */
2740 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2741 .write = write_82802ab,
2742 .read = read_memmapped,
2743 .voltage = {3000, 3600},
2744 },
2745
2746 {
Andrew Morganca081462011-09-13 22:05:44 +00002747 .vendor = "Catalyst",
2748 .name = "CAT28F512",
2749 .bustype = BUS_PARALLEL,
2750 .manufacture_id = CATALYST_ID,
2751 .model_id = CATALYST_CAT28F512,
2752 .total_size = 64,
2753 .page_size = 0, /* unused */
2754 .feature_bits = 0,
2755 .tested = TEST_OK_PR,
2756 .probe = probe_jedec, /* FIXME! */
2757 .probe_timing = TIMING_ZERO,
2758 .block_erasers =
2759 {
2760 {
2761 .eraseblocks = { {64 * 1024, 1} },
2762 .block_erase = NULL, /* TODO */
2763 },
2764 },
2765 .write = NULL, /* TODO */
2766 .read = read_memmapped,
2767 .voltage = {4500, 5500},
2768 },
2769
2770 {
Joshua Roysf1324e02010-09-16 00:51:51 +00002771 .vendor = "Bright",
2772 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002773 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00002774 .manufacture_id = BRIGHT_ID,
2775 .model_id = BRIGHT_BM29F040,
2776 .total_size = 512,
2777 .page_size = 64 * 1024,
2778 .feature_bits = FEATURE_EITHER_RESET,
2779 .tested = TEST_OK_PR,
2780 .probe = probe_jedec,
2781 .probe_timing = TIMING_ZERO,
2782 .block_erasers =
2783 {
2784 {
2785 .eraseblocks = { {64 * 1024, 8} },
2786 .block_erase = erase_sector_jedec,
2787 }, {
2788 .eraseblocks = { {512 * 1024, 1} },
2789 .block_erase = erase_chip_block_jedec,
2790 },
2791 },
2792 .write = write_jedec_1,
2793 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002794 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00002795 },
2796
2797 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00002798 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002799 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002800 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00002801 .manufacture_id = ESMT_ID,
2802 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002803 .total_size = 256,
2804 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00002805 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002806 .tested = TEST_UNTESTED,
2807 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002808 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00002809 .block_erasers =
2810 {
2811 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00002812 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00002813 {128 * 1024, 1},
2814 {96 * 1024, 1},
2815 {8 * 1024, 2},
2816 {16 * 1024, 1},
2817 },
2818 .block_erase = erase_sector_jedec,
2819 }, {
2820 .eraseblocks = { {256 * 1024, 1} },
2821 .block_erase = erase_chip_block_jedec,
2822 }
2823 },
Sean Nelson35727f72010-01-28 23:55:12 +00002824 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002825 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002826 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002827 },
2828
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002829 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00002830 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00002831 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002832 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00002833 .manufacture_id = ESMT_ID,
2834 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002835 .total_size = 1024,
2836 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002837 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00002838 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002839 .probe = probe_spi_rdid,
2840 .probe_timing = TIMING_ZERO,
2841 .block_erasers =
2842 {
2843 {
2844 .eraseblocks = { {4 * 1024, 256} },
2845 .block_erase = spi_block_erase_20,
2846 }, {
2847 .eraseblocks = { {64 * 1024, 16} },
2848 .block_erase = spi_block_erase_d8,
2849 }, {
2850 .eraseblocks = { {1024 * 1024, 1} },
2851 .block_erase = spi_block_erase_60,
2852 }, {
2853 .eraseblocks = { {1024 * 1024, 1} },
2854 .block_erase = spi_block_erase_c7,
2855 }
2856 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002857 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002858 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00002859 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00002860 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002861 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00002862 },
2863
2864 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002865 .vendor = "Eon",
2866 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002867 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002868 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002869 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002870 .total_size = 64,
2871 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002872 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002873 .tested = TEST_UNTESTED,
2874 .probe = probe_spi_rdid,
2875 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002876 .block_erasers =
2877 {
2878 {
2879 .eraseblocks = {
2880 {4 * 1024, 2},
2881 {8 * 1024, 1},
2882 {16 * 1024, 1},
2883 {32 * 1024, 1},
2884 },
2885 .block_erase = spi_block_erase_d8,
2886 }, {
2887 .eraseblocks = { {64 * 1024, 1} },
2888 .block_erase = spi_block_erase_c7,
2889 }
2890 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002891 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002892 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002893 .write = spi_chip_write_256,
2894 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002895 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00002896 },
2897
2898 {
2899 .vendor = "Eon",
2900 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002901 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00002902 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002903 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00002904 .total_size = 64,
2905 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002906 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00002907 .tested = TEST_UNTESTED,
2908 .probe = probe_spi_rdid,
2909 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002910 .block_erasers =
2911 {
2912 {
2913 .eraseblocks = {
2914 {32 * 1024, 1},
2915 {16 * 1024, 1},
2916 {8 * 1024, 1},
2917 {4 * 1024, 2},
2918 },
2919 .block_erase = spi_block_erase_d8,
2920 }, {
2921 .eraseblocks = { {64 * 1024, 1} },
2922 .block_erase = spi_block_erase_c7,
2923 }
2924 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002926 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002927 .write = spi_chip_write_256,
2928 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002929 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002930 },
2931
2932 {
2933 .vendor = "Eon",
2934 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002935 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002936 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002937 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002938 .total_size = 128,
2939 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002940 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002941 .tested = TEST_UNTESTED,
2942 .probe = probe_spi_rdid,
2943 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002944 .block_erasers =
2945 {
2946 {
2947 .eraseblocks = {
2948 {4 * 1024, 2},
2949 {8 * 1024, 1},
2950 {16 * 1024, 1},
2951 {32 * 1024, 3},
2952 },
2953 .block_erase = spi_block_erase_d8,
2954 }, {
2955 .eraseblocks = { {128 * 1024, 1} },
2956 .block_erase = spi_block_erase_c7,
2957 }
2958 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002959 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002960 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002961 .write = spi_chip_write_256,
2962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002963 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00002964 },
2965
2966 {
2967 .vendor = "Eon",
2968 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002969 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00002970 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002971 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00002972 .total_size = 128,
2973 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002974 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00002975 .tested = TEST_UNTESTED,
2976 .probe = probe_spi_rdid,
2977 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002978 .block_erasers =
2979 {
2980 {
2981 .eraseblocks = {
2982 {32 * 1024, 3},
2983 {16 * 1024, 1},
2984 {8 * 1024, 1},
2985 {4 * 1024, 2},
2986 },
2987 .block_erase = spi_block_erase_d8,
2988 }, {
2989 .eraseblocks = { {128 * 1024, 1} },
2990 .block_erase = spi_block_erase_c7,
2991 }
2992 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002993 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002994 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002995 .write = spi_chip_write_256,
2996 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002997 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002998 },
2999
3000 {
3001 .vendor = "Eon",
3002 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003003 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003004 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003005 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003006 .total_size = 256,
3007 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003008 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003009 .tested = TEST_UNTESTED,
3010 .probe = probe_spi_rdid,
3011 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003012 .block_erasers =
3013 {
3014 {
3015 .eraseblocks = {
3016 {4 * 1024, 2},
3017 {8 * 1024, 1},
3018 {16 * 1024, 1},
3019 {32 * 1024, 1},
3020 {64 * 1024, 3}
3021 },
3022 .block_erase = spi_block_erase_d8,
3023 }, {
3024 .eraseblocks = { {256 * 1024, 1} },
3025 .block_erase = spi_block_erase_c7,
3026 }
3027 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003028 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003029 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003030 .write = spi_chip_write_256,
3031 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003032 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003033 },
3034
3035 {
3036 .vendor = "Eon",
3037 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003038 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003039 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003040 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003041 .total_size = 256,
3042 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003043 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003044 .tested = TEST_UNTESTED,
3045 .probe = probe_spi_rdid,
3046 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003047 .block_erasers =
3048 {
3049 {
3050 .eraseblocks = {
3051 {64 * 1024, 3},
3052 {32 * 1024, 1},
3053 {16 * 1024, 1},
3054 {8 * 1024, 1},
3055 {4 * 1024, 2},
3056 },
3057 .block_erase = spi_block_erase_d8,
3058 }, {
3059 .eraseblocks = { {256 * 1024, 1} },
3060 .block_erase = spi_block_erase_c7,
3061 }
3062 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003063 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003064 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003065 .write = spi_chip_write_256,
3066 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003067 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003068 },
3069
3070 {
3071 .vendor = "Eon",
3072 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003073 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003074 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003075 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003076 .total_size = 512,
3077 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003078 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003079 .tested = TEST_UNTESTED,
3080 .probe = probe_spi_rdid,
3081 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003082 .block_erasers =
3083 {
3084 {
3085 .eraseblocks = {
3086 {4 * 1024, 2},
3087 {8 * 1024, 1},
3088 {16 * 1024, 1},
3089 {32 * 1024, 1},
3090 {64 * 1024, 7}
3091 },
3092 .block_erase = spi_block_erase_d8,
3093 }, {
3094 .eraseblocks = { {512 * 1024, 1} },
3095 .block_erase = spi_block_erase_c7,
3096 }
3097 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003098 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003099 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003100 .write = spi_chip_write_256,
3101 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003102 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003103 },
3104
3105 {
3106 .vendor = "Eon",
3107 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003108 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003109 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003110 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003111 .total_size = 512,
3112 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003113 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003114 .tested = TEST_UNTESTED,
3115 .probe = probe_spi_rdid,
3116 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003117 .block_erasers =
3118 {
3119 {
3120 .eraseblocks = {
3121 {64 * 1024, 7},
3122 {32 * 1024, 1},
3123 {16 * 1024, 1},
3124 {8 * 1024, 1},
3125 {4 * 1024, 2},
3126 },
3127 .block_erase = spi_block_erase_d8,
3128 }, {
3129 .eraseblocks = { {512 * 1024, 1} },
3130 .block_erase = spi_block_erase_c7,
3131 }
3132 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003133 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003134 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003135 .write = spi_chip_write_256,
3136 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003137 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003138 },
3139
3140 {
3141 .vendor = "Eon",
3142 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003143 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003144 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003145 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003146 .total_size = 1024,
3147 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003148 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003149 .tested = TEST_UNTESTED,
3150 .probe = probe_spi_rdid,
3151 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003152 .block_erasers =
3153 {
3154 {
3155 .eraseblocks = {
3156 {4 * 1024, 2},
3157 {8 * 1024, 1},
3158 {16 * 1024, 1},
3159 {32 * 1024, 1},
3160 {64 * 1024, 15}
3161 },
3162 .block_erase = spi_block_erase_d8,
3163 }, {
3164 .eraseblocks = { {1024 * 1024, 1} },
3165 .block_erase = spi_block_erase_c7,
3166 }
3167 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003168 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003169 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003170 .write = spi_chip_write_256,
3171 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003172 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003173 },
3174
3175 {
3176 .vendor = "Eon",
3177 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003178 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003179 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003180 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003181 .total_size = 1024,
3182 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003183 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003184 .tested = TEST_UNTESTED,
3185 .probe = probe_spi_rdid,
3186 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003187 .block_erasers =
3188 {
3189 {
3190 .eraseblocks = {
3191 {64 * 1024, 15},
3192 {32 * 1024, 1},
3193 {16 * 1024, 1},
3194 {8 * 1024, 1},
3195 {4 * 1024, 2},
3196 },
3197 .block_erase = spi_block_erase_d8,
3198 }, {
3199 .eraseblocks = { {1024 * 1024, 1} },
3200 .block_erase = spi_block_erase_c7,
3201 }
3202 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003203 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003204 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003205 .write = spi_chip_write_256,
3206 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003207 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003208 },
3209
3210 {
3211 .vendor = "Eon",
3212 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003213 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003214 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003215 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003216 .total_size = 2048,
3217 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003218 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003219 .tested = TEST_UNTESTED,
3220 .probe = probe_spi_rdid,
3221 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003222 .block_erasers =
3223 {
3224 {
3225 .eraseblocks = {
3226 {4 * 1024, 2},
3227 {8 * 1024, 1},
3228 {16 * 1024, 1},
3229 {32 * 1024, 1},
3230 {64 * 1024, 31},
3231 },
3232 .block_erase = spi_block_erase_d8,
3233 }, {
3234 .eraseblocks = { {2 * 1024 * 1024, 1} },
3235 .block_erase = spi_block_erase_c7,
3236 }
3237 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003238 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003239 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003240 .write = spi_chip_write_256,
3241 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003242 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003243 },
3244
3245 {
3246 .vendor = "Eon",
3247 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003248 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003249 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003250 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003251 .total_size = 2048,
3252 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003253 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003254 .tested = TEST_UNTESTED,
3255 .probe = probe_spi_rdid,
3256 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003257 .block_erasers =
3258 {
3259 {
3260 .eraseblocks = {
3261 {64 * 1024, 31},
3262 {32 * 1024, 1},
3263 {16 * 1024, 1},
3264 {8 * 1024, 1},
3265 {4 * 1024, 2},
3266 },
3267 .block_erase = spi_block_erase_d8,
3268 }, {
3269 .eraseblocks = { {2 * 1024 * 1024, 1} },
3270 .block_erase = spi_block_erase_c7,
3271 }
3272 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003273 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003274 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003275 .write = spi_chip_write_256,
3276 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003277 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003278 },
3279
3280 {
3281 .vendor = "Eon",
3282 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003283 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003284 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003285 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003286 .total_size = 4096,
3287 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003288 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003289 .tested = TEST_UNTESTED,
3290 .probe = probe_spi_rdid,
3291 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003292 .block_erasers =
3293 {
3294 {
3295 .eraseblocks = {
3296 {4 * 1024, 2},
3297 {8 * 1024, 1},
3298 {16 * 1024, 1},
3299 {32 * 1024, 1},
3300 {64 * 1024, 63},
3301 },
3302 .block_erase = spi_block_erase_d8,
3303 }, {
3304 .eraseblocks = { {4 * 1024 * 1024, 1} },
3305 .block_erase = spi_block_erase_c7,
3306 }
3307 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003308 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003309 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003310 .write = spi_chip_write_256,
3311 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003312 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003313 },
3314
3315 {
3316 .vendor = "Eon",
3317 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003318 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003319 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003320 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003321 .total_size = 4096,
3322 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003323 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003324 .tested = TEST_UNTESTED,
3325 .probe = probe_spi_rdid,
3326 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003327 .block_erasers =
3328 {
3329 {
3330 .eraseblocks = {
3331 {64 * 1024, 63},
3332 {32 * 1024, 1},
3333 {16 * 1024, 1},
3334 {8 * 1024, 1},
3335 {4 * 1024, 2},
3336 },
3337 .block_erase = spi_block_erase_d8,
3338 }, {
3339 .eraseblocks = { {4 * 1024 * 1024, 1} },
3340 .block_erase = spi_block_erase_c7,
3341 }
3342 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003343 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003344 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003345 .write = spi_chip_write_256,
3346 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003347 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003348 },
3349
3350 {
3351 .vendor = "Eon",
3352 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003353 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003354 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003355 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003356 .total_size = 8192,
3357 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003358 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003359 .tested = TEST_UNTESTED,
3360 .probe = probe_spi_rdid,
3361 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003362 .block_erasers =
3363 {
3364 {
3365 .eraseblocks = {
3366 {4 * 1024, 2},
3367 {8 * 1024, 1},
3368 {16 * 1024, 1},
3369 {32 * 1024, 1},
3370 {64 * 1024, 127},
3371 },
3372 .block_erase = spi_block_erase_d8,
3373 }, {
3374 .eraseblocks = { {8 * 1024 * 1024, 1} },
3375 .block_erase = spi_block_erase_c7,
3376 }
3377 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003378 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003379 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003380 .write = spi_chip_write_256,
3381 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003382 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003383 },
3384
3385 {
3386 .vendor = "Eon",
3387 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003388 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003389 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003390 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00003391 .total_size = 8192,
3392 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003393 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003394 .tested = TEST_UNTESTED,
3395 .probe = probe_spi_rdid,
3396 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003397 .block_erasers =
3398 {
3399 {
3400 .eraseblocks = {
3401 {64 * 1024, 127},
3402 {32 * 1024, 1},
3403 {16 * 1024, 1},
3404 {8 * 1024, 1},
3405 {4 * 1024, 2},
3406 },
3407 .block_erase = spi_block_erase_d8,
3408 }, {
3409 .eraseblocks = { {8 * 1024 * 1024, 1} },
3410 .block_erase = spi_block_erase_c7,
3411 }
3412 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003413 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003414 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003415 .write = spi_chip_write_256,
3416 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003417 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003418 },
3419
3420 {
3421 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003422 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003423 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003424 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003425 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003426 .total_size = 64,
3427 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003428 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00003429 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003430 .probe = probe_spi_rdid,
3431 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003432 .block_erasers =
3433 {
3434 {
3435 .eraseblocks = { {4 * 1024, 16} },
3436 .block_erase = spi_block_erase_20,
3437 }, {
3438 .eraseblocks = { {32 * 1024, 2} },
3439 .block_erase = spi_block_erase_d8,
3440 }, {
3441 .eraseblocks = { {32 * 1024, 2} },
3442 .block_erase = spi_block_erase_52,
3443 }, {
3444 .eraseblocks = { {64 * 1024, 1} },
3445 .block_erase = spi_block_erase_60,
3446 }, {
3447 .eraseblocks = { {64 * 1024, 1} },
3448 .block_erase = spi_block_erase_c7,
3449 }
3450 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003451 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003452 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003453 .write = spi_chip_write_256,
3454 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003455 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003456 },
3457
3458 {
3459 .vendor = "Eon",
3460 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003461 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003462 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003463 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003464 .total_size = 128,
3465 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003466 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003467 .tested = TEST_UNTESTED,
3468 .probe = probe_spi_rdid,
3469 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003470 .block_erasers =
3471 {
3472 {
3473 .eraseblocks = { {4 * 1024, 32} },
3474 .block_erase = spi_block_erase_20,
3475 }, {
3476 .eraseblocks = { {32 * 1024, 4} },
3477 .block_erase = spi_block_erase_d8,
3478 }, {
3479 .eraseblocks = { {32 * 1024, 4} },
3480 .block_erase = spi_block_erase_52,
3481 }, {
3482 .eraseblocks = { {128 * 1024, 1} },
3483 .block_erase = spi_block_erase_60,
3484 }, {
3485 .eraseblocks = { {128 * 1024, 1} },
3486 .block_erase = spi_block_erase_c7,
3487 }
3488 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003489 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003490 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003491 .write = spi_chip_write_256,
3492 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003493 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003494 },
3495
3496 {
3497 .vendor = "Eon",
3498 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003499 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003500 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003501 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003502 .total_size = 256,
3503 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003504 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003505 .tested = TEST_UNTESTED,
3506 .probe = probe_spi_rdid,
3507 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003508 .block_erasers =
3509 {
3510 {
3511 .eraseblocks = { {4 * 1024, 64} },
3512 .block_erase = spi_block_erase_20,
3513 }, {
3514 .eraseblocks = { {64 * 1024, 4} },
3515 .block_erase = spi_block_erase_d8,
3516 }, {
3517 .eraseblocks = { {64 * 1024, 4} },
3518 .block_erase = spi_block_erase_52,
3519 }, {
3520 .eraseblocks = { {256 * 1024, 1} },
3521 .block_erase = spi_block_erase_60,
3522 }, {
3523 .eraseblocks = { {256 * 1024, 1} },
3524 .block_erase = spi_block_erase_c7,
3525 }
3526 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003527 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003528 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003529 .write = spi_chip_write_256,
3530 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003531 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003532 },
3533
3534 {
3535 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003536 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003537 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003538 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003539 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003540 .total_size = 512,
3541 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003542 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00003543 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003544 .probe = probe_spi_rdid,
3545 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003546 .block_erasers =
3547 {
3548 {
Sean Nelson54596372010-01-09 05:30:14 +00003549 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003550 .block_erase = spi_block_erase_20,
3551 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003552 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003553 .block_erase = spi_block_erase_d8,
3554 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003555 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003556 .block_erase = spi_block_erase_60,
3557 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003558 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003559 .block_erase = spi_block_erase_c7,
3560 },
3561 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003562 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003563 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003564 .write = spi_chip_write_256,
3565 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003566 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003567 },
3568
3569 {
3570 .vendor = "Eon",
3571 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003572 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003573 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003574 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003575 .total_size = 1024,
3576 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003577 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00003578 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003579 .probe = probe_spi_rdid,
3580 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003581 .block_erasers =
3582 {
3583 {
3584 .eraseblocks = { {4 * 1024, 256} },
3585 .block_erase = spi_block_erase_20,
3586 }, {
3587 .eraseblocks = { {64 * 1024, 16} },
3588 .block_erase = spi_block_erase_d8,
3589 }, {
3590 .eraseblocks = { {1024 * 1024, 1} },
3591 .block_erase = spi_block_erase_60,
3592 }, {
3593 .eraseblocks = { {1024 * 1024, 1} },
3594 .block_erase = spi_block_erase_c7,
3595 }
3596 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003597 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003598 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003599 .write = spi_chip_write_256,
3600 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003601 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003602 },
3603
3604 {
3605 .vendor = "Eon",
3606 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003607 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003608 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003609 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003610 .total_size = 2048,
3611 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003612 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00003613 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003614 .probe = probe_spi_rdid,
3615 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003616 .block_erasers =
3617 {
3618 {
3619 .eraseblocks = { {4 * 1024, 512} },
3620 .block_erase = spi_block_erase_20,
3621 }, {
3622 .eraseblocks = { {64 * 1024, 32} },
3623 .block_erase = spi_block_erase_d8,
3624 }, {
3625 .eraseblocks = { {2 * 1024 * 1024, 1} },
3626 .block_erase = spi_block_erase_60,
3627 }, {
3628 .eraseblocks = { {2 * 1024 * 1024, 1} },
3629 .block_erase = spi_block_erase_c7,
3630 }
3631 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003632 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003633 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003634 .write = spi_chip_write_256,
3635 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003636 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003637 },
3638
3639 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003640 .vendor = "Eon",
3641 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003642 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003643 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003644 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003645 .total_size = 4096,
3646 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003647 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003648 .tested = TEST_UNTESTED,
3649 .probe = probe_spi_rdid,
3650 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003651 .block_erasers =
3652 {
3653 {
3654 .eraseblocks = { {4 * 1024, 1024} },
3655 .block_erase = spi_block_erase_20,
3656 }, {
3657 .eraseblocks = { {64 * 1024, 64} },
3658 .block_erase = spi_block_erase_d8,
3659 }, {
3660 .eraseblocks = { {4 * 1024 * 1024, 1} },
3661 .block_erase = spi_block_erase_60,
3662 }, {
3663 .eraseblocks = { {4 * 1024 * 1024, 1} },
3664 .block_erase = spi_block_erase_c7,
3665 }
3666 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003667 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003668 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003669 .write = spi_chip_write_256,
3670 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003671 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003672 },
3673
3674 {
Russ Dill3cd5a122010-03-05 08:44:11 +00003675 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00003676 .name = "EN25F64",
3677 .bustype = BUS_SPI,
3678 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00003679 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003680 .total_size = 8192,
3681 .page_size = 256,
3682 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00003683 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003684 .probe = probe_spi_rdid,
3685 .probe_timing = TIMING_ZERO,
3686 .block_erasers =
3687 {
3688 {
3689 .eraseblocks = { {4 * 1024, 2048} },
3690 .block_erase = spi_block_erase_20,
3691 }, {
3692 .eraseblocks = { {64 * 1024, 128} },
3693 .block_erase = spi_block_erase_d8,
3694 }, {
3695 .eraseblocks = { {8 * 1024 * 1024, 1} },
3696 .block_erase = spi_block_erase_60,
3697 }, {
3698 .eraseblocks = { {8 * 1024 * 1024, 1} },
3699 .block_erase = spi_block_erase_c7,
3700 }
3701 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003702 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00003703 .unlock = spi_disable_blockprotect,
3704 .write = spi_chip_write_256,
3705 .read = spi_chip_read,
3706 .voltage = {2700, 3600},
3707 },
3708
3709 {
3710 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00003711 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003712 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003713 .manufacture_id = EON_ID_NOPREFIX,
3714 .model_id = EON_EN25Q40,
3715 .total_size = 512,
3716 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003717 /* OTP: 256B total; enter 0x3A */
3718 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003719 .tested = TEST_UNTESTED,
3720 .probe = probe_spi_rdid,
3721 .probe_timing = TIMING_ZERO,
3722 .block_erasers =
3723 {
3724 {
3725 .eraseblocks = { {4 * 1024, 128} },
3726 .block_erase = spi_block_erase_20,
3727 }, {
3728 .eraseblocks = { {64 * 1024, 8} },
3729 .block_erase = spi_block_erase_d8,
3730 }, {
3731 .eraseblocks = { {512 * 1024, 1} },
3732 .block_erase = spi_block_erase_60,
3733 }, {
3734 .eraseblocks = { {512 * 1024, 1} },
3735 .block_erase = spi_block_erase_c7,
3736 }
3737 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003738 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003739 .unlock = spi_disable_blockprotect,
3740 .write = spi_chip_write_256,
3741 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003742 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003743 },
3744
3745 {
3746 .vendor = "Eon",
3747 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003748 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003749 .manufacture_id = EON_ID_NOPREFIX,
3750 .model_id = EON_EN25Q80,
3751 .total_size = 1024,
3752 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003753 /* OTP: 256B total; enter 0x3A */
3754 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003755 .tested = TEST_UNTESTED,
3756 .probe = probe_spi_rdid,
3757 .probe_timing = TIMING_ZERO,
3758 .block_erasers =
3759 {
3760 {
3761 .eraseblocks = { {4 * 1024, 256} },
3762 .block_erase = spi_block_erase_20,
3763 }, {
3764 .eraseblocks = { {64 * 1024, 16} },
3765 .block_erase = spi_block_erase_d8,
3766 }, {
3767 .eraseblocks = { {1024 * 1024, 1} },
3768 .block_erase = spi_block_erase_60,
3769 }, {
3770 .eraseblocks = { {1024 * 1024, 1} },
3771 .block_erase = spi_block_erase_c7,
3772 }
3773 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003774 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003775 .unlock = spi_disable_blockprotect,
3776 .write = spi_chip_write_256,
3777 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003778 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003779 },
3780
3781 {
3782 /* Note: EN25D16 is an evil twin which shares the model ID
3783 but has different write protection capabilities */
3784 .vendor = "Eon",
3785 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003786 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003787 .manufacture_id = EON_ID_NOPREFIX,
3788 .model_id = EON_EN25Q16,
3789 .total_size = 2048,
3790 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003791 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3792 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003793 .tested = TEST_UNTESTED,
3794 .probe = probe_spi_rdid,
3795 .probe_timing = TIMING_ZERO,
3796 .block_erasers =
3797 {
3798 {
3799 .eraseblocks = { {4 * 1024, 512} },
3800 .block_erase = spi_block_erase_20,
3801 }, {
3802 .eraseblocks = { {64 * 1024, 32} },
3803 .block_erase = spi_block_erase_d8,
3804 }, {
3805 /* not supported by Q16 version */
3806 .eraseblocks = { {64 * 1024, 32} },
3807 .block_erase = spi_block_erase_52,
3808 }, {
3809 .eraseblocks = { {2 * 1024 * 1024, 1} },
3810 .block_erase = spi_block_erase_60,
3811 }, {
3812 .eraseblocks = { {2 * 1024 * 1024, 1} },
3813 .block_erase = spi_block_erase_c7,
3814 }
3815 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003816 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003817 .unlock = spi_disable_blockprotect,
3818 .write = spi_chip_write_256,
3819 .read = spi_chip_read,
3820 .voltage = {2700, 3600},
3821 },
3822
3823 {
3824 .vendor = "Eon",
3825 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003826 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003827 .manufacture_id = EON_ID_NOPREFIX,
3828 .model_id = EON_EN25Q32,
3829 .total_size = 4096,
3830 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003831 /* OTP: 512B total; enter 0x3A */
3832 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003833 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00003834 .probe = probe_spi_rdid,
3835 .probe_timing = TIMING_ZERO,
3836 .block_erasers =
3837 {
3838 {
3839 .eraseblocks = { {4 * 1024, 1024} },
3840 .block_erase = spi_block_erase_20,
3841 }, {
3842 .eraseblocks = { {64 * 1024, 64} },
3843 .block_erase = spi_block_erase_d8,
3844 }, {
3845 .eraseblocks = { {4 * 1024 * 1024, 1} },
3846 .block_erase = spi_block_erase_60,
3847 }, {
3848 .eraseblocks = { {4 * 1024 * 1024, 1} },
3849 .block_erase = spi_block_erase_c7,
3850 }
3851 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003852 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003853 .unlock = spi_disable_blockprotect,
3854 .write = spi_chip_write_256,
3855 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003856 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003857 },
3858
3859 {
3860 .vendor = "Eon",
3861 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003862 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003863 .manufacture_id = EON_ID_NOPREFIX,
3864 .model_id = EON_EN25Q64,
3865 .total_size = 8192,
3866 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003867 /* OTP: 512B total; enter 0x3A */
3868 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003869 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00003870 .probe = probe_spi_rdid,
3871 .probe_timing = TIMING_ZERO,
3872 .block_erasers =
3873 {
3874 {
3875 .eraseblocks = { {4 * 1024, 2048} },
3876 .block_erase = spi_block_erase_20,
3877 }, {
3878 .eraseblocks = { {64 * 1024, 128} },
3879 .block_erase = spi_block_erase_d8,
3880 }, {
3881 .eraseblocks = { {8 * 1024 * 1024, 1} },
3882 .block_erase = spi_block_erase_60,
3883 }, {
3884 .eraseblocks = { {8 * 1024 * 1024, 1} },
3885 .block_erase = spi_block_erase_c7,
3886 }
3887 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003888 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003889 .unlock = spi_disable_blockprotect,
3890 .write = spi_chip_write_256,
3891 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003892 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003893 },
3894
3895 {
3896 .vendor = "Eon",
3897 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003898 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003899 .manufacture_id = EON_ID_NOPREFIX,
3900 .model_id = EON_EN25Q128,
3901 .total_size = 16384,
3902 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003903 /* OTP: 512B total; enter 0x3A */
3904 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003905 .tested = TEST_UNTESTED,
3906 .probe = probe_spi_rdid,
3907 .probe_timing = TIMING_ZERO,
3908 .block_erasers =
3909 {
3910 {
3911 .eraseblocks = { {4 * 1024, 4096} },
3912 .block_erase = spi_block_erase_20,
3913 }, {
3914 .eraseblocks = { {64 * 1024, 256} },
3915 .block_erase = spi_block_erase_d8,
3916 }, {
3917 .eraseblocks = { {16 * 1024 * 1024, 1} },
3918 .block_erase = spi_block_erase_60,
3919 }, {
3920 .eraseblocks = { {16 * 1024 * 1024, 1} },
3921 .block_erase = spi_block_erase_c7,
3922 }
3923 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003924 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003925 .unlock = spi_disable_blockprotect,
3926 .write = spi_chip_write_256,
3927 .read = spi_chip_read,
3928 },
3929
3930 {
3931 .vendor = "Eon",
3932 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003933 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003934 .manufacture_id = EON_ID_NOPREFIX,
3935 .model_id = EON_EN25QH16,
3936 .total_size = 2048,
3937 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003938 /* supports SFDP */
3939 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003940 /* QPI enable 0x38, disable 0xFF */
3941 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00003942 .tested = TEST_OK_PR,
David Hendricks6d715302011-07-24 22:21:57 +00003943 .probe = probe_spi_rdid,
3944 .probe_timing = TIMING_ZERO,
3945 .block_erasers =
3946 {
3947 {
3948 .eraseblocks = { {4 * 1024, 512} },
3949 .block_erase = spi_block_erase_20,
3950 }, {
3951 .eraseblocks = { {64 * 1024, 32} },
3952 .block_erase = spi_block_erase_d8,
3953 }, {
3954 .eraseblocks = { {1024 * 2048, 1} },
3955 .block_erase = spi_block_erase_60,
3956 }, {
3957 .eraseblocks = { {1024 * 2048, 1} },
3958 .block_erase = spi_block_erase_c7,
3959 }
3960 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003961 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
3962 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00003963 .write = spi_chip_write_256,
3964 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00003965 .voltage = {2700, 3600},
3966 },
3967
3968 {
3969 .vendor = "Eon",
3970 .name = "EN25QH32",
3971 .bustype = BUS_SPI,
3972 .manufacture_id = EON_ID_NOPREFIX,
3973 .model_id = EON_EN25QH32,
3974 .total_size = 4096,
3975 .page_size = 256,
3976 /* supports SFDP */
3977 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003978 /* QPI enable 0x38, disable 0xFF */
3979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00003980 .tested = TEST_UNTESTED,
3981 .probe = probe_spi_rdid,
3982 .probe_timing = TIMING_ZERO,
3983 .block_erasers =
3984 {
3985 {
3986 .eraseblocks = { {4 * 1024, 1024} },
3987 .block_erase = spi_block_erase_20,
3988 }, {
3989 .eraseblocks = { {64 * 1024, 64} },
3990 .block_erase = spi_block_erase_d8,
3991 }, {
3992 .eraseblocks = { {1024 * 4096, 1} },
3993 .block_erase = spi_block_erase_60,
3994 }, {
3995 .eraseblocks = { {1024 * 4096, 1} },
3996 .block_erase = spi_block_erase_c7,
3997 }
3998 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003999 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4000 .unlock = spi_disable_blockprotect_bp3_srwd,
4001 .write = spi_chip_write_256,
4002 .read = spi_chip_read,
4003 .voltage = {2700, 3600},
4004 },
4005
4006 {
4007 .vendor = "Eon",
4008 .name = "EN25QH64",
4009 .bustype = BUS_SPI,
4010 .manufacture_id = EON_ID_NOPREFIX,
4011 .model_id = EON_EN25QH64,
4012 .total_size = 8192,
4013 .page_size = 256,
4014 /* supports SFDP */
4015 /* OTP: 512B total; enter 0x3A */
4016 /* QPI enable 0x38, disable 0xFF */
4017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4018 .tested = TEST_UNTESTED,
4019 .probe = probe_spi_rdid,
4020 .probe_timing = TIMING_ZERO,
4021 .block_erasers = {
4022 {
4023 .eraseblocks = { {4 * 1024, 2048} },
4024 .block_erase = spi_block_erase_20,
4025 }, {
4026 .eraseblocks = { {64 * 1024, 128} },
4027 .block_erase = spi_block_erase_d8,
4028 }, {
4029 .eraseblocks = { { 8192 * 1024, 1} },
4030 .block_erase = spi_block_erase_60,
4031 }, {
4032 .eraseblocks = { { 8192 * 1024, 1} },
4033 .block_erase = spi_block_erase_c7,
4034 }
4035 },
4036 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4037 .unlock = spi_disable_blockprotect_bp3_srwd,
4038 .write = spi_chip_write_256,
4039 .read = spi_chip_read,
4040 .voltage = {2700, 3600},
4041 },
4042
4043 {
4044 .vendor = "Eon",
4045 .name = "EN25QH128",
4046 .bustype = BUS_SPI,
4047 .manufacture_id = EON_ID_NOPREFIX,
4048 .model_id = EON_EN25QH128,
4049 .total_size = 16384,
4050 .page_size = 256,
4051 /* supports SFDP */
4052 /* OTP: 512B total; enter 0x3A */
4053 /* QPI enable 0x38, disable 0xFF */
4054 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4055 .tested = TEST_UNTESTED,
4056 .probe = probe_spi_rdid,
4057 .probe_timing = TIMING_ZERO,
4058 .block_erasers = {
4059 {
4060 .eraseblocks = { {4 * 1024, 4096} },
4061 .block_erase = spi_block_erase_20,
4062 }, {
4063 .eraseblocks = { {64 * 1024, 256} },
4064 .block_erase = spi_block_erase_d8,
4065 }, {
4066 .eraseblocks = { { 16384 * 1024, 1} },
4067 .block_erase = spi_block_erase_60,
4068 }, {
4069 .eraseblocks = { { 16384 * 1024, 1} },
4070 .block_erase = spi_block_erase_c7,
4071 }
4072 },
4073 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4074 .unlock = spi_disable_blockprotect_bp3_srwd,
4075 .write = spi_chip_write_256,
4076 .read = spi_chip_read,
4077 .voltage = {2700, 3600},
4078 },
4079
4080 {
4081 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004082 .name = "EN25S10",
4083 .bustype = BUS_SPI,
4084 .manufacture_id = EON_ID_NOPREFIX,
4085 .model_id = EON_EN25S10,
4086 .total_size = 128,
4087 .page_size = 256,
4088 /* OTP: 256B total; enter 0x3A */
4089 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4090 .tested = TEST_UNTESTED,
4091 .probe = probe_spi_rdid,
4092 .probe_timing = TIMING_ZERO,
4093 .block_erasers = {
4094 {
4095 .eraseblocks = { {4 * 1024, 32} },
4096 .block_erase = spi_block_erase_20,
4097 }, {
4098 .eraseblocks = { {32 * 1024, 4} },
4099 .block_erase = spi_block_erase_52,
4100 }, {
4101 .eraseblocks = { {128 * 1024, 1} },
4102 .block_erase = spi_block_erase_60,
4103 }, {
4104 .eraseblocks = { {128 * 1024, 1} },
4105 .block_erase = spi_block_erase_c7,
4106 }
4107 },
4108 .printlock = spi_prettyprint_status_register_default_bp2,
4109 .unlock = spi_disable_blockprotect,
4110 .write = spi_chip_write_256,
4111 .read = spi_chip_read,
4112 .voltage = {1650, 1950},
4113 },
4114
4115 {
4116 .vendor = "Eon",
4117 .name = "EN25S20",
4118 .bustype = BUS_SPI,
4119 .manufacture_id = EON_ID_NOPREFIX,
4120 .model_id = EON_EN25S20,
4121 .total_size = 256,
4122 .page_size = 256,
4123 /* OTP: 256B total; enter 0x3A */
4124 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4125 .tested = TEST_UNTESTED,
4126 .probe = probe_spi_rdid,
4127 .probe_timing = TIMING_ZERO,
4128 .block_erasers = {
4129 {
4130 .eraseblocks = { {4 * 1024, 64} },
4131 .block_erase = spi_block_erase_20,
4132 }, {
4133 .eraseblocks = { {64 * 1024, 4} },
4134 .block_erase = spi_block_erase_d8,
4135 }, {
4136 .eraseblocks = { {256 * 1024, 1} },
4137 .block_erase = spi_block_erase_60,
4138 }, {
4139 .eraseblocks = { {256 * 1024, 1} },
4140 .block_erase = spi_block_erase_c7,
4141 }
4142 },
4143 .printlock = spi_prettyprint_status_register_default_bp2,
4144 .unlock = spi_disable_blockprotect,
4145 .write = spi_chip_write_256,
4146 .read = spi_chip_read,
4147 .voltage = {1650, 1950},
4148 },
4149
4150 {
4151 .vendor = "Eon",
4152 .name = "EN25S40",
4153 .bustype = BUS_SPI,
4154 .manufacture_id = EON_ID_NOPREFIX,
4155 .model_id = EON_EN25S40,
4156 .total_size = 512,
4157 .page_size = 256,
4158 /* OTP: 256B total; enter 0x3A */
4159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers = {
4164 {
4165 .eraseblocks = { {4 * 1024, 128} },
4166 .block_erase = spi_block_erase_20,
4167 }, {
4168 .eraseblocks = { {64 * 1024, 8} },
4169 .block_erase = spi_block_erase_d8,
4170 }, {
4171 .eraseblocks = { {512 * 1024, 1} },
4172 .block_erase = spi_block_erase_60,
4173 }, {
4174 .eraseblocks = { {512 * 1024, 1} },
4175 .block_erase = spi_block_erase_c7,
4176 }
4177 },
4178 .printlock = spi_prettyprint_status_register_default_bp2,
4179 .unlock = spi_disable_blockprotect,
4180 .write = spi_chip_write_256,
4181 .read = spi_chip_read,
4182 .voltage = {1650, 1950},
4183 },
4184
4185 {
4186 .vendor = "Eon",
4187 .name = "EN25S80",
4188 .bustype = BUS_SPI,
4189 .manufacture_id = EON_ID_NOPREFIX,
4190 .model_id = EON_EN25S80,
4191 .total_size = 1024,
4192 .page_size = 256,
4193 /* OTP: 256B total; enter 0x3A */
4194 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4195 .tested = TEST_UNTESTED,
4196 .probe = probe_spi_rdid,
4197 .probe_timing = TIMING_ZERO,
4198 .block_erasers = {
4199 {
4200 .eraseblocks = { {4 * 1024, 256} },
4201 .block_erase = spi_block_erase_20,
4202 }, {
4203 .eraseblocks = { {64 * 1024, 16} },
4204 .block_erase = spi_block_erase_d8,
4205 }, {
4206 .eraseblocks = { {1024 * 1024, 1} },
4207 .block_erase = spi_block_erase_60,
4208 }, {
4209 .eraseblocks = { {1024 * 1024, 1} },
4210 .block_erase = spi_block_erase_c7,
4211 }
4212 },
4213 .printlock = spi_prettyprint_status_register_default_bp2,
4214 .unlock = spi_disable_blockprotect,
4215 .write = spi_chip_write_256,
4216 .read = spi_chip_read,
4217 .voltage = {1650, 1950},
4218 },
4219
4220 {
4221 .vendor = "Eon",
4222 .name = "EN25S16",
4223 .bustype = BUS_SPI,
4224 .manufacture_id = EON_ID_NOPREFIX,
4225 .model_id = EON_EN25S16,
4226 .total_size = 2048,
4227 .page_size = 256,
4228 /* OTP: 512B total; enter 0x3A */
4229 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4230 .tested = TEST_UNTESTED,
4231 .probe = probe_spi_rdid,
4232 .probe_timing = TIMING_ZERO,
4233 .block_erasers = {
4234 {
4235 .eraseblocks = { {4 * 1024, 512} },
4236 .block_erase = spi_block_erase_20,
4237 }, {
4238 .eraseblocks = { {64 * 1024, 32} },
4239 .block_erase = spi_block_erase_52,
4240 }, {
4241 .eraseblocks = { {32 * 1024, 64} },
4242 .block_erase = spi_block_erase_d8,
4243 }, {
4244 .eraseblocks = { {2048 * 1024, 1} },
4245 .block_erase = spi_block_erase_60,
4246 }, {
4247 .eraseblocks = { {2048 * 1024, 1} },
4248 .block_erase = spi_block_erase_c7,
4249 }
4250 },
4251 .printlock = spi_prettyprint_status_register_en25s_wp,
4252 .unlock = spi_disable_blockprotect_bp3_srwd,
4253 .write = spi_chip_write_256,
4254 .read = spi_chip_read,
4255 .voltage = {1650, 1950},
4256 },
4257
4258 {
4259 .vendor = "Eon",
4260 .name = "EN25S32",
4261 .bustype = BUS_SPI,
4262 .manufacture_id = EON_ID_NOPREFIX,
4263 .model_id = EON_EN25S32,
4264 .total_size = 4096,
4265 .page_size = 256,
4266 /* OTP: 512B total; enter 0x3A */
4267 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4268 .tested = TEST_UNTESTED,
4269 .probe = probe_spi_rdid,
4270 .probe_timing = TIMING_ZERO,
4271 .block_erasers = {
4272 {
4273 .eraseblocks = { {4 * 1024, 1024} },
4274 .block_erase = spi_block_erase_20,
4275 }, {
4276 .eraseblocks = { {32 * 1024, 128} },
4277 .block_erase = spi_block_erase_52,
4278 }, {
4279 .eraseblocks = { {64 * 1024, 64} },
4280 .block_erase = spi_block_erase_d8,
4281 }, {
4282 .eraseblocks = { {4096 * 1024, 1} },
4283 .block_erase = spi_block_erase_60,
4284 }, {
4285 .eraseblocks = { {4096 * 1024, 1} },
4286 .block_erase = spi_block_erase_c7,
4287 }
4288 },
4289 .printlock = spi_prettyprint_status_register_en25s_wp,
4290 .unlock = spi_disable_blockprotect_bp3_srwd,
4291 .write = spi_chip_write_256,
4292 .read = spi_chip_read,
4293 .voltage = {1650, 1950},
4294 },
4295
4296 {
4297 .vendor = "Eon",
4298 .name = "EN25S64",
4299 .bustype = BUS_SPI,
4300 .manufacture_id = EON_ID_NOPREFIX,
4301 .model_id = EON_EN25S64,
4302 .total_size = 8192,
4303 .page_size = 256,
4304 /* OTP: 512B total; enter 0x3A */
4305 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4306 .tested = TEST_UNTESTED,
4307 .probe = probe_spi_rdid,
4308 .probe_timing = TIMING_ZERO,
4309 .block_erasers = {
4310 {
4311 .eraseblocks = { {4 * 1024, 2048} },
4312 .block_erase = spi_block_erase_20,
4313 }, {
4314 .eraseblocks = { {64 * 1024, 128} },
4315 .block_erase = spi_block_erase_d8,
4316 }, {
4317 .eraseblocks = { {8192 * 1024, 1} },
4318 .block_erase = spi_block_erase_60,
4319 }, {
4320 .eraseblocks = { {8192 * 1024, 1} },
4321 .block_erase = spi_block_erase_c7,
4322 }
4323 },
4324 .printlock = spi_prettyprint_status_register_en25s_wp,
4325 .unlock = spi_disable_blockprotect_bp3_srwd,
4326 .write = spi_chip_write_256,
4327 .read = spi_chip_read,
4328 .voltage = {1650, 1950},
4329 },
4330
4331 {
4332 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00004333 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004334 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00004335 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004336 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00004337 .total_size = 128,
4338 .page_size = 128,
4339 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004340 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00004341 .probe = probe_jedec,
4342 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4343 .block_erasers =
4344 {
4345 {
4346 .eraseblocks = { {16 * 1024, 8} },
4347 .block_erase = erase_sector_jedec,
4348 },
4349 {
4350 .eraseblocks = { {128 * 1024, 1} },
4351 .block_erase = erase_chip_block_jedec,
4352 },
4353 },
4354 .write = write_jedec_1,
4355 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004356 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00004357 },
4358
4359 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004360 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004361 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004362 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004363 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004364 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004365 .total_size = 256,
4366 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004367 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004368 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004369 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004370 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004371 .block_erasers =
4372 {
4373 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004374 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004375 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004376 {8 * 1024, 2},
4377 {32 * 1024, 1},
4378 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004379 },
4380 .block_erase = erase_sector_jedec,
4381 }, {
4382 .eraseblocks = { {256 * 1024, 1} },
4383 .block_erase = erase_chip_block_jedec,
4384 },
4385 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004386 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004387 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004388 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004389 },
4390
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004391 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004392 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004393 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004394 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004395 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004396 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004397 .total_size = 256,
4398 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004399 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00004400 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004401 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004402 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004403 .block_erasers =
4404 {
4405 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004406 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004407 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004408 {32 * 1024, 1},
4409 {8 * 1024, 2},
4410 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004411 },
4412 .block_erase = erase_sector_jedec,
4413 }, {
4414 .eraseblocks = { {256 * 1024, 1} },
4415 .block_erase = erase_chip_block_jedec,
4416 },
4417 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004418 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004419 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004420 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004421 },
4422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004423 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004424 .vendor = "Eon",
4425 .name = "EN29LV640B",
4426 .bustype = BUS_PARALLEL,
4427 .manufacture_id = EON_ID,
4428 .model_id = EON_EN29LV640B,
4429 .total_size = 8192,
4430 .page_size = 8192,
4431 .feature_bits = 0,
4432 .tested = TEST_OK_PREW,
4433 .probe = probe_en29lv640b,
4434 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4435 .block_erasers =
4436 {
4437 {
4438 .eraseblocks = {
4439 {8 * 1024, 8},
4440 {64 * 1024, 127},
4441 },
4442 .block_erase = block_erase_en29lv640b,
4443 }, {
4444 .eraseblocks = { {8 * 1024 * 1024, 1} },
4445 .block_erase = block_erase_chip_en29lv640b,
4446 },
4447 },
4448 .write = write_en29lv640b,
4449 .read = read_memmapped,
4450 .voltage = {2700, 3600},
4451 },
4452
4453 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004454 .vendor = "Fujitsu",
4455 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004456 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004457 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004458 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004459 .total_size = 512,
4460 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004461 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004462 .tested = TEST_UNTESTED,
4463 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004464 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004465 .block_erasers =
4466 {
4467 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004468 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004469 {16 * 1024, 1},
4470 {8 * 1024, 2},
4471 {32 * 1024, 1},
4472 {64 * 1024, 7},
4473 },
Sean Nelson35727f72010-01-28 23:55:12 +00004474 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004475 }, {
4476 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004477 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004478 },
4479 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004480 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004481 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004482 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004483 },
4484
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004485 {
4486 .vendor = "Fujitsu",
4487 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004488 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004489 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004490 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004491 .total_size = 512,
4492 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004493 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004494 .tested = TEST_UNTESTED,
4495 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004496 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004497 .block_erasers =
4498 {
4499 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004500 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004501 {64 * 1024, 7},
4502 {32 * 1024, 1},
4503 {8 * 1024, 2},
4504 {16 * 1024, 1},
4505 },
Sean Nelson35727f72010-01-28 23:55:12 +00004506 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004507 }, {
4508 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004509 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004510 },
4511 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004512 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004513 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004514 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004515 },
4516
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004517 {
Sean Nelson35727f72010-01-28 23:55:12 +00004518 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004519 .vendor = "Fujitsu",
4520 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004521 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004522 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004523 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004524 .total_size = 512,
4525 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004526 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004527 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004528 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004529 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004530 .block_erasers =
4531 {
4532 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004533 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004534 {16 * 1024, 1},
4535 {8 * 1024, 2},
4536 {32 * 1024, 1},
4537 {64 * 1024, 7},
4538 },
4539 .block_erase = block_erase_m29f400bt,
4540 }, {
4541 .eraseblocks = { {512 * 1024, 1} },
4542 .block_erase = block_erase_chip_m29f400bt,
4543 },
4544 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004545 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004546 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004547 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004548 },
4549
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004550 {
4551 .vendor = "Fujitsu",
4552 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004553 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004554 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004555 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004556 .total_size = 512,
4557 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004558 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004559 .tested = TEST_UNTESTED,
4560 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004561 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004562 .block_erasers =
4563 {
4564 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004565 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004566 {64 * 1024, 7},
4567 {32 * 1024, 1},
4568 {8 * 1024, 2},
4569 {16 * 1024, 1},
4570 },
4571 .block_erase = block_erase_m29f400bt,
4572 }, {
4573 .eraseblocks = { {512 * 1024, 1} },
4574 .block_erase = block_erase_chip_m29f400bt,
4575 },
4576 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00004577 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004578 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004579 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004580 },
4581
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004582 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00004583 .vendor = "Fujitsu",
4584 .name = "MBM29LV160BE",
4585 .bustype = BUS_PARALLEL,
4586 .manufacture_id = FUJITSU_ID,
4587 .model_id = FUJITSU_MBM29LV160BE,
4588 .total_size = 2 * 1024,
4589 .page_size = 0,
4590 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
4591 .tested = TEST_UNTESTED,
4592 .probe = probe_m29f400bt,
4593 .probe_timing = TIMING_IGNORED,
4594 .block_erasers =
4595 {
4596 {
4597 .eraseblocks = {
4598 {16 * 1024, 1},
4599 {8 * 1024, 2},
4600 {32 * 1024, 1},
4601 {64 * 1024, 31},
4602 },
4603 .block_erase = block_erase_m29f400bt,
4604 }, {
4605 .eraseblocks = { {2048 * 1024, 1} },
4606 .block_erase = block_erase_chip_m29f400bt,
4607 },
4608 },
4609 .write = write_m29f400bt, /* Supports a fast mode too */
4610 .read = read_memmapped,
4611 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
4612 },
4613
4614 {
4615 .vendor = "Fujitsu",
4616 .name = "MBM29LV160TE",
4617 .bustype = BUS_PARALLEL,
4618 .manufacture_id = FUJITSU_ID,
4619 .model_id = FUJITSU_MBM29LV160TE,
4620 .total_size = 2 * 1024,
4621 .page_size = 0,
4622 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
4623 .tested = TEST_UNTESTED,
4624 .probe = probe_m29f400bt,
4625 .probe_timing = TIMING_IGNORED,
4626 .block_erasers =
4627 {
4628 {
4629 .eraseblocks = {
4630 {64 * 1024, 31},
4631 {32 * 1024, 1},
4632 {8 * 1024, 2},
4633 {16 * 1024, 1},
4634 },
4635 .block_erase = block_erase_m29f400bt,
4636 }, {
4637 .eraseblocks = { {2048 * 1024, 1} },
4638 .block_erase = block_erase_chip_m29f400bt,
4639 },
4640 },
4641 .write = write_m29f400bt, /* Supports a fast mode too */
4642 .read = read_memmapped,
4643 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
4644 },
4645
4646 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004647 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004648 .name = "GD25LQ32",
4649 .bustype = BUS_SPI,
4650 .manufacture_id = GIGADEVICE_ID,
4651 .model_id = GIGADEVICE_GD25LQ32,
4652 .total_size = 4096,
4653 .page_size = 256,
4654 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
4655 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4656 .tested = TEST_OK_PREW,
4657 .probe = probe_spi_rdid,
4658 .probe_timing = TIMING_ZERO,
4659 .block_erasers =
4660 {
4661 {
4662 .eraseblocks = { {4 * 1024, 1024} },
4663 .block_erase = spi_block_erase_20,
4664 }, {
4665 .eraseblocks = { {32 * 1024, 128} },
4666 .block_erase = spi_block_erase_52,
4667 }, {
4668 .eraseblocks = { {64 * 1024, 64} },
4669 .block_erase = spi_block_erase_d8,
4670 }, {
4671 .eraseblocks = { {4 * 1024 * 1024, 1} },
4672 .block_erase = spi_block_erase_60,
4673 }, {
4674 .eraseblocks = { {4 * 1024 * 1024, 1} },
4675 .block_erase = spi_block_erase_c7,
4676 }
4677 },
4678 .printlock = spi_prettyprint_status_register_default_bp4,
4679 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4680 .write = spi_chip_write_256,
4681 .read = spi_chip_read,
4682 .voltage = {1700, 1950},
4683 },
4684
4685 {
4686 .vendor = "GigaDevice",
4687 .name = "GD25Q512",
4688 .bustype = BUS_SPI,
4689 .manufacture_id = GIGADEVICE_ID,
4690 .model_id = GIGADEVICE_GD25Q512,
4691 .total_size = 64,
4692 .page_size = 256,
4693 .feature_bits = FEATURE_WRSR_WREN,
4694 .tested = TEST_UNTESTED,
4695 .probe = probe_spi_rdid,
4696 .probe_timing = TIMING_ZERO,
4697 .block_erasers = {
4698 {
4699 .eraseblocks = { {4 * 1024, 16} },
4700 .block_erase = spi_block_erase_20,
4701 }, {
4702 .eraseblocks = { {32 * 1024, 2} },
4703 .block_erase = spi_block_erase_52,
4704 }, {
4705 .eraseblocks = { {64 * 1024, 1} },
4706 .block_erase = spi_block_erase_60,
4707 }, {
4708 .eraseblocks = { {64 * 1024, 1} },
4709 .block_erase = spi_block_erase_c7,
4710 }
4711 },
4712 .printlock = spi_prettyprint_status_register_default_bp4,
4713 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4714 .write = spi_chip_write_256,
4715 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4716 .voltage = {2700, 3600},
4717 },
4718
4719 {
4720 .vendor = "GigaDevice",
4721 .name = "GD25Q10",
4722 .bustype = BUS_SPI,
4723 .manufacture_id = GIGADEVICE_ID,
4724 .model_id = GIGADEVICE_GD25Q10,
4725 .total_size = 128,
4726 .page_size = 256,
4727 .feature_bits = FEATURE_WRSR_WREN,
4728 .tested = TEST_UNTESTED,
4729 .probe = probe_spi_rdid,
4730 .probe_timing = TIMING_ZERO,
4731 .block_erasers = {
4732 {
4733 .eraseblocks = { {4 * 1024, 32} },
4734 .block_erase = spi_block_erase_20,
4735 }, {
4736 .eraseblocks = { {32 * 1024, 4} },
4737 .block_erase = spi_block_erase_52,
4738 }, {
4739 .eraseblocks = { {64 * 1024, 2} },
4740 .block_erase = spi_block_erase_d8,
4741 }, {
4742 .eraseblocks = { {128 * 1024, 1} },
4743 .block_erase = spi_block_erase_60,
4744 }, {
4745 .eraseblocks = { {128 * 1024, 1} },
4746 .block_erase = spi_block_erase_c7,
4747 }
4748 },
4749 .printlock = spi_prettyprint_status_register_default_bp4,
4750 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4751 .write = spi_chip_write_256,
4752 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4753 .voltage = {2700, 3600},
4754 },
4755
4756 {
4757 .vendor = "GigaDevice",
4758 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004759 .bustype = BUS_SPI,
4760 .manufacture_id = GIGADEVICE_ID,
4761 .model_id = GIGADEVICE_GD25Q20,
4762 .total_size = 256,
4763 .page_size = 256,
4764 .feature_bits = FEATURE_WRSR_WREN,
4765 .tested = TEST_UNTESTED,
4766 .probe = probe_spi_rdid,
4767 .probe_timing = TIMING_ZERO,
4768 .block_erasers =
4769 {
4770 {
4771 .eraseblocks = { {4 * 1024, 64} },
4772 .block_erase = spi_block_erase_20,
4773 }, {
4774 .eraseblocks = { {32 * 1024, 8} },
4775 .block_erase = spi_block_erase_52,
4776 }, {
4777 .eraseblocks = { {64 * 1024, 4} },
4778 .block_erase = spi_block_erase_d8,
4779 }, {
4780 .eraseblocks = { {256 * 1024, 1} },
4781 .block_erase = spi_block_erase_60,
4782 }, {
4783 .eraseblocks = { {256 * 1024, 1} },
4784 .block_erase = spi_block_erase_c7,
4785 }
4786 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004787 .printlock = spi_prettyprint_status_register_default_bp4,
4788 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004789 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004790 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00004791 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004792 },
4793
4794 {
4795 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004796 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004797 .bustype = BUS_SPI,
4798 .manufacture_id = GIGADEVICE_ID,
4799 .model_id = GIGADEVICE_GD25Q40,
4800 .total_size = 512,
4801 .page_size = 256,
4802 .feature_bits = FEATURE_WRSR_WREN,
4803 .tested = TEST_UNTESTED,
4804 .probe = probe_spi_rdid,
4805 .probe_timing = TIMING_ZERO,
4806 .block_erasers =
4807 {
4808 {
4809 .eraseblocks = { {4 * 1024, 128} },
4810 .block_erase = spi_block_erase_20,
4811 }, {
4812 .eraseblocks = { {32 * 1024, 16} },
4813 .block_erase = spi_block_erase_52,
4814 }, {
4815 .eraseblocks = { {64 * 1024, 8} },
4816 .block_erase = spi_block_erase_d8,
4817 }, {
4818 .eraseblocks = { {512 * 1024, 1} },
4819 .block_erase = spi_block_erase_60,
4820 }, {
4821 .eraseblocks = { {512 * 1024, 1} },
4822 .block_erase = spi_block_erase_c7,
4823 }
4824 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004825 .printlock = spi_prettyprint_status_register_default_bp4,
4826 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004827 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004828 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00004829 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004830 },
4831
4832 {
4833 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004834 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004835 .bustype = BUS_SPI,
4836 .manufacture_id = GIGADEVICE_ID,
4837 .model_id = GIGADEVICE_GD25Q80,
4838 .total_size = 1024,
4839 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004840 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004841 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4842 .tested = TEST_OK_PREW,
4843 .probe = probe_spi_rdid,
4844 .probe_timing = TIMING_ZERO,
4845 .block_erasers =
4846 {
4847 {
4848 .eraseblocks = { {4 * 1024, 256} },
4849 .block_erase = spi_block_erase_20,
4850 }, {
4851 .eraseblocks = { {32 * 1024, 32} },
4852 .block_erase = spi_block_erase_52,
4853 }, {
4854 .eraseblocks = { {64 * 1024, 16} },
4855 .block_erase = spi_block_erase_d8,
4856 }, {
4857 .eraseblocks = { {1024 * 1024, 1} },
4858 .block_erase = spi_block_erase_60,
4859 }, {
4860 .eraseblocks = { {1024 * 1024, 1} },
4861 .block_erase = spi_block_erase_c7,
4862 }
4863 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004864 .printlock = spi_prettyprint_status_register_default_bp4,
4865 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004866 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004867 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004868 .voltage = {2700, 3600},
4869 },
4870
4871 {
4872 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004873 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004874 .bustype = BUS_SPI,
4875 .manufacture_id = GIGADEVICE_ID,
4876 .model_id = GIGADEVICE_GD25Q16,
4877 .total_size = 2048,
4878 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004879 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004880 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4881 .tested = TEST_UNTESTED,
4882 .probe = probe_spi_rdid,
4883 .probe_timing = TIMING_ZERO,
4884 .block_erasers =
4885 {
4886 {
4887 .eraseblocks = { {4 * 1024, 512} },
4888 .block_erase = spi_block_erase_20,
4889 }, {
4890 .eraseblocks = { {32 * 1024, 64} },
4891 .block_erase = spi_block_erase_52,
4892 }, {
4893 .eraseblocks = { {64 * 1024, 32} },
4894 .block_erase = spi_block_erase_d8,
4895 }, {
4896 .eraseblocks = { {2 * 1024 * 1024, 1} },
4897 .block_erase = spi_block_erase_60,
4898 }, {
4899 .eraseblocks = { {2 * 1024 * 1024, 1} },
4900 .block_erase = spi_block_erase_c7,
4901 }
4902 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004903 .printlock = spi_prettyprint_status_register_default_bp4,
4904 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004905 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004906 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004907 .voltage = {2700, 3600},
4908 },
4909
4910 {
4911 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004912 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004913 .bustype = BUS_SPI,
4914 .manufacture_id = GIGADEVICE_ID,
4915 .model_id = GIGADEVICE_GD25Q32,
4916 .total_size = 4096,
4917 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004918 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004919 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4920 .tested = TEST_UNTESTED,
4921 .probe = probe_spi_rdid,
4922 .probe_timing = TIMING_ZERO,
4923 .block_erasers =
4924 {
4925 {
4926 .eraseblocks = { {4 * 1024, 1024} },
4927 .block_erase = spi_block_erase_20,
4928 }, {
4929 .eraseblocks = { {32 * 1024, 128} },
4930 .block_erase = spi_block_erase_52,
4931 }, {
4932 .eraseblocks = { {64 * 1024, 64} },
4933 .block_erase = spi_block_erase_d8,
4934 }, {
4935 .eraseblocks = { {4 * 1024 * 1024, 1} },
4936 .block_erase = spi_block_erase_60,
4937 }, {
4938 .eraseblocks = { {4 * 1024 * 1024, 1} },
4939 .block_erase = spi_block_erase_c7,
4940 }
4941 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004942 .printlock = spi_prettyprint_status_register_default_bp4,
4943 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004944 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004945 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004946 .voltage = {2700, 3600},
4947 },
4948
4949 {
4950 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004951 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004952 .bustype = BUS_SPI,
4953 .manufacture_id = GIGADEVICE_ID,
4954 .model_id = GIGADEVICE_GD25Q64,
4955 .total_size = 8192,
4956 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004957 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004958 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00004959 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004960 .probe = probe_spi_rdid,
4961 .probe_timing = TIMING_ZERO,
4962 .block_erasers =
4963 {
4964 {
4965 .eraseblocks = { {4 * 1024, 2048} },
4966 .block_erase = spi_block_erase_20,
4967 }, {
4968 .eraseblocks = { {32 * 1024, 256} },
4969 .block_erase = spi_block_erase_52,
4970 }, {
4971 .eraseblocks = { {64 * 1024, 128} },
4972 .block_erase = spi_block_erase_d8,
4973 }, {
4974 .eraseblocks = { {8 * 1024 * 1024, 1} },
4975 .block_erase = spi_block_erase_60,
4976 }, {
4977 .eraseblocks = { {8 * 1024 * 1024, 1} },
4978 .block_erase = spi_block_erase_c7,
4979 }
4980 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004981 .printlock = spi_prettyprint_status_register_default_bp4,
4982 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004983 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004984 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00004985 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004986 },
4987
4988 {
4989 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004990 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004991 .bustype = BUS_SPI,
4992 .manufacture_id = GIGADEVICE_ID,
4993 .model_id = GIGADEVICE_GD25Q128,
4994 .total_size = 16384,
4995 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004996 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4998 .tested = TEST_UNTESTED,
4999 .probe = probe_spi_rdid,
5000 .probe_timing = TIMING_ZERO,
5001 .block_erasers =
5002 {
5003 {
5004 .eraseblocks = { {4 * 1024, 4096} },
5005 .block_erase = spi_block_erase_20,
5006 }, {
5007 .eraseblocks = { {32 * 1024, 512} },
5008 .block_erase = spi_block_erase_52,
5009 }, {
5010 .eraseblocks = { {64 * 1024, 256} },
5011 .block_erase = spi_block_erase_d8,
5012 }, {
5013 .eraseblocks = { {16 * 1024 * 1024, 1} },
5014 .block_erase = spi_block_erase_60,
5015 }, {
5016 .eraseblocks = { {16 * 1024 * 1024, 1} },
5017 .block_erase = spi_block_erase_c7,
5018 }
5019 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005020 .printlock = spi_prettyprint_status_register_default_bp4,
5021 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5022 .write = spi_chip_write_256,
5023 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5024 .voltage = {2700, 3600},
5025 },
5026
5027 {
5028 .vendor = "GigaDevice",
5029 .name = "GD25T80",
5030 .bustype = BUS_SPI,
5031 .manufacture_id = GIGADEVICE_ID,
5032 .model_id = GIGADEVICE_GD25T80,
5033 .total_size = 1024,
5034 .page_size = 256,
5035 /* OTP: 256B total; enter 0x3A */
5036 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5037 .tested = TEST_UNTESTED,
5038 .probe = probe_spi_rdid,
5039 .probe_timing = TIMING_ZERO,
5040 .block_erasers = {
5041 {
5042 .eraseblocks = { {4 * 1024, 256} },
5043 .block_erase = spi_block_erase_20,
5044 }, {
5045 .eraseblocks = { {64 * 1024, 16} },
5046 .block_erase = spi_block_erase_52,
5047 }, {
5048 .eraseblocks = { {64 * 1024, 16} },
5049 .block_erase = spi_block_erase_d8,
5050 }, {
5051 .eraseblocks = { {1024 * 1024, 1} },
5052 .block_erase = spi_block_erase_60,
5053 }, {
5054 .eraseblocks = { {1024 * 1024, 1} },
5055 .block_erase = spi_block_erase_c7,
5056 }
5057 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005058 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005059 .unlock = spi_disable_blockprotect,
5060 .write = spi_chip_write_256,
5061 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005062 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005063 },
5064
5065 {
David Borgc96a8bd2010-06-21 16:12:22 +00005066 .vendor = "Hyundai",
5067 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005068 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005069 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005070 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005071 .total_size = 256,
5072 .page_size = 256 * 1024,
5073 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005074 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005075 .probe = probe_jedec,
5076 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5077 .block_erasers =
5078 {
5079 {
5080 .eraseblocks = {
5081 {64 * 1024, 3},
5082 {32 * 1024, 1},
5083 {8 * 1024, 2},
5084 {16 * 1024, 1},
5085 },
5086 .block_erase = erase_sector_jedec,
5087 }, {
5088 .eraseblocks = { {256 * 1024, 1} },
5089 .block_erase = erase_chip_block_jedec,
5090 },
5091 },
5092 .write = write_jedec_1,
5093 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005094 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005095 },
5096
5097 {
5098 .vendor = "Hyundai",
5099 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005100 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005101 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005102 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005103 .total_size = 256,
5104 .page_size = 256 * 1024,
5105 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5106 .tested = TEST_UNTESTED,
5107 .probe = probe_jedec,
5108 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5109 .block_erasers =
5110 {
5111 {
5112 .eraseblocks = {
5113 {16 * 1024, 1},
5114 {8 * 1024, 2},
5115 {32 * 1024, 1},
5116 {64 * 1024, 3},
5117 },
5118 .block_erase = erase_sector_jedec,
5119 }, {
5120 .eraseblocks = { {256 * 1024, 1} },
5121 .block_erase = erase_chip_block_jedec,
5122 },
5123 },
5124 .write = write_jedec_1,
5125 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005126 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005127 },
5128
5129 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005130 .vendor = "Hyundai",
5131 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005132 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005133 .manufacture_id = HYUNDAI_ID,
5134 .model_id = HYUNDAI_HY29F040A,
5135 .total_size = 512,
5136 .page_size = 64 * 1024,
5137 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5138 .tested = TEST_UNTESTED,
5139 .probe = probe_jedec,
5140 .probe_timing = TIMING_ZERO,
5141 .block_erasers =
5142 {
5143 {
5144 .eraseblocks = { {64 * 1024, 8} },
5145 .block_erase = erase_sector_jedec,
5146 }, {
5147 .eraseblocks = { {512 * 1024, 1} },
5148 .block_erase = erase_chip_block_jedec,
5149 },
5150 },
5151 .write = write_jedec_1,
5152 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005153 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005154 },
5155
5156 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005157 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005158 .name = "25F160S33B8",
5159 .bustype = BUS_SPI,
5160 .manufacture_id = INTEL_ID,
5161 .model_id = INTEL_25F160S33B8,
5162 .total_size = 2048,
5163 .page_size = 256,
5164 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5165 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5166 .tested = TEST_UNTESTED,
5167 .probe = probe_spi_rdid,
5168 .probe_timing = TIMING_ZERO,
5169 .block_erasers =
5170 {
5171 {
5172 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5173 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5174 * have no effect on the memory contents, but sets a flag in the SR.
5175 .eraseblocks = {
5176 {8 * 1024, 8},
5177 {64 * 1024, 31} // inaccessible
5178 },
5179 .block_erase = spi_block_erase_40,
5180 }, { */
5181 .eraseblocks = { {64 * 1024, 32} },
5182 .block_erase = spi_block_erase_d8,
5183 }, {
5184 .eraseblocks = { {2 * 1024 * 1024, 1} },
5185 .block_erase = spi_block_erase_c7,
5186 }
5187 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005188 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5189 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005190 .write = spi_chip_write_256,
5191 .read = spi_chip_read, /* also fast read 0x0B */
5192 .voltage = {2700, 3600},
5193 },
5194
5195 {
5196 .vendor = "Intel",
5197 .name = "25F160S33T8",
5198 .bustype = BUS_SPI,
5199 .manufacture_id = INTEL_ID,
5200 .model_id = INTEL_25F160S33T8,
5201 .total_size = 2048,
5202 .page_size = 256,
5203 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5205 .tested = TEST_UNTESTED,
5206 .probe = probe_spi_rdid,
5207 .probe_timing = TIMING_ZERO,
5208 .block_erasers =
5209 {
5210 {
5211 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5212 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5213 * have no effect on the memory contents, but sets a flag in the SR.
5214 .eraseblocks = {
5215 {64 * 1024, 31}, // inaccessible
5216 {8 * 1024, 8}
5217 },
5218 .block_erase = spi_block_erase_40,
5219 }, { */
5220 .eraseblocks = { {64 * 1024, 32} },
5221 .block_erase = spi_block_erase_d8,
5222 }, {
5223 .eraseblocks = { {2 * 1024 * 1024, 1} },
5224 .block_erase = spi_block_erase_c7,
5225 }
5226 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005227 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5228 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005229 .write = spi_chip_write_256,
5230 .read = spi_chip_read, /* also fast read 0x0B */
5231 .voltage = {2700, 3600},
5232 },
5233
5234 {
5235 .vendor = "Intel",
5236 .name = "25F320S33B8",
5237 .bustype = BUS_SPI,
5238 .manufacture_id = INTEL_ID,
5239 .model_id = INTEL_25F320S33B8,
5240 .total_size = 4096,
5241 .page_size = 256,
5242 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5244 .tested = TEST_UNTESTED,
5245 .probe = probe_spi_rdid,
5246 .probe_timing = TIMING_ZERO,
5247 .block_erasers =
5248 {
5249 {
5250 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5251 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5252 * have no effect on the memory contents, but sets a flag in the SR.
5253 .eraseblocks = {
5254 {8 * 1024, 8},
5255 {64 * 1024, 63} // inaccessible
5256 },
5257 .block_erase = spi_block_erase_40,
5258 }, { */
5259 .eraseblocks = { {64 * 1024, 64} },
5260 .block_erase = spi_block_erase_d8,
5261 }, {
5262 .eraseblocks = { {4 * 1024 * 1024, 1} },
5263 .block_erase = spi_block_erase_c7,
5264 }
5265 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005266 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5267 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005268 .write = spi_chip_write_256,
5269 .read = spi_chip_read, /* also fast read 0x0B */
5270 .voltage = {2700, 3600},
5271 },
5272
5273 {
5274 .vendor = "Intel",
5275 .name = "25F320S33T8",
5276 .bustype = BUS_SPI,
5277 .manufacture_id = INTEL_ID,
5278 .model_id = INTEL_25F320S33T8,
5279 .total_size = 4096,
5280 .page_size = 256,
5281 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5283 .tested = TEST_UNTESTED,
5284 .probe = probe_spi_rdid,
5285 .probe_timing = TIMING_ZERO,
5286 .block_erasers =
5287 {
5288 {
5289 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5290 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5291 * have no effect on the memory contents, but sets a flag in the SR.
5292 .eraseblocks = {
5293 {64 * 1024, 63}, // inaccessible
5294 {8 * 1024, 8}
5295 },
5296 .block_erase = spi_block_erase_40,
5297 }, { */
5298 .eraseblocks = { {64 * 1024, 64} },
5299 .block_erase = spi_block_erase_d8,
5300 }, {
5301 .eraseblocks = { {4 * 1024 * 1024, 1} },
5302 .block_erase = spi_block_erase_c7,
5303 }
5304 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005305 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5306 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005307 .write = spi_chip_write_256,
5308 .read = spi_chip_read, /* also fast read 0x0B */
5309 .voltage = {2700, 3600},
5310 },
5311
5312 {
5313 .vendor = "Intel",
5314 .name = "25F640S33B8",
5315 .bustype = BUS_SPI,
5316 .manufacture_id = INTEL_ID,
5317 .model_id = INTEL_25F640S33B8,
5318 .total_size = 8192,
5319 .page_size = 256,
5320 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5321 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5322 .tested = TEST_UNTESTED,
5323 .probe = probe_spi_rdid,
5324 .probe_timing = TIMING_ZERO,
5325 .block_erasers =
5326 {
5327 {
5328 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5329 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5330 * have no effect on the memory contents, but sets a flag in the SR.
5331 .eraseblocks = {
5332 {8 * 1024, 8},
5333 {64 * 1024, 127} // inaccessible
5334 },
5335 .block_erase = spi_block_erase_40,
5336 }, { */
5337 .eraseblocks = { {64 * 1024, 128} },
5338 .block_erase = spi_block_erase_d8,
5339 }, {
5340 .eraseblocks = { {8 * 1024 * 1024, 1} },
5341 .block_erase = spi_block_erase_c7,
5342 }
5343 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005344 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5345 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005346 .write = spi_chip_write_256,
5347 .read = spi_chip_read, /* also fast read 0x0B */
5348 .voltage = {2700, 3600},
5349 },
5350
5351 {
5352 .vendor = "Intel",
5353 .name = "25F640S33T8",
5354 .bustype = BUS_SPI,
5355 .manufacture_id = INTEL_ID,
5356 .model_id = INTEL_25F640S33T8,
5357 .total_size = 8192,
5358 .page_size = 256,
5359 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5361 .tested = TEST_UNTESTED,
5362 .probe = probe_spi_rdid,
5363 .probe_timing = TIMING_ZERO,
5364 .block_erasers =
5365 {
5366 {
5367 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5368 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5369 * have no effect on the memory contents, but sets a flag in the SR.
5370 .eraseblocks = {
5371 {64 * 1024, 127}, // inaccessible
5372 {8 * 1024, 8}
5373 },
5374 .block_erase = spi_block_erase_40,
5375 }, { */
5376 .eraseblocks = { {64 * 1024, 128} },
5377 .block_erase = spi_block_erase_d8,
5378 }, {
5379 .eraseblocks = { {8 * 1024 * 1024, 1} },
5380 .block_erase = spi_block_erase_c7,
5381 }
5382 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005383 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5384 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005385 .write = spi_chip_write_256,
5386 .read = spi_chip_read, /* also fast read 0x0B */
5387 .voltage = {2700, 3600},
5388 },
5389
5390 {
5391 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005392 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005393 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005394 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005395 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005396 .total_size = 128,
5397 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00005398 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005399 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005400 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005401 .block_erasers =
5402 {
5403 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005404 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005405 {8 * 1024, 1},
5406 {4 * 1024, 2},
5407 {112 * 1024, 1},
5408 },
Sean Nelson28accc22010-03-19 18:47:06 +00005409 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005410 },
5411 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005412 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005413 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005414 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005415 },
5416
5417 {
5418 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005419 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005420 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005421 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005422 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005423 .total_size = 128,
5424 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005425 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005426 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005427 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005428 .block_erasers =
5429 {
5430 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005431 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005432 {112 * 1024, 1},
5433 {4 * 1024, 2},
5434 {8 * 1024, 1},
5435 },
Sean Nelson28accc22010-03-19 18:47:06 +00005436 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005437 },
5438 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005439 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005440 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005441 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005442 },
5443
5444 {
5445 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005446 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005447 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005448 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005449 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005450 .total_size = 256,
5451 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005452 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005453 .probe = probe_82802ab,
5454 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5455 .block_erasers =
5456 {
5457 {
5458 .eraseblocks = {
5459 {128 * 1024, 1},
5460 {96 * 1024, 1},
5461 {8 * 1024, 2},
5462 {16 * 1024, 1},
5463 },
5464 .block_erase = erase_block_82802ab,
5465 },
5466 },
5467 .write = write_82802ab,
5468 .read = read_memmapped,
5469 },
5470
5471 {
5472 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005473 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005474 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005475 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005476 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005477 .total_size = 512,
5478 .page_size = 256,
5479 .tested = TEST_UNTESTED,
5480 .probe = probe_82802ab,
5481 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005482 .block_erasers =
5483 {
5484 {
5485 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005486 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005487 },
5488 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005489 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005490 .write = write_82802ab,
5491 .read = read_memmapped,
5492 },
5493
5494 {
5495 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005496 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005497 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005498 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005499 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005500 .total_size = 512,
5501 .page_size = 128 * 1024, /* maximal block size */
5502 .tested = TEST_UNTESTED,
5503 .probe = probe_82802ab,
5504 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5505 .block_erasers =
5506 {
5507 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005508 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005509 {16 * 1024, 1},
5510 {8 * 1024, 2},
5511 {96 * 1024, 1},
5512 {128 * 1024, 3},
5513 },
5514 .block_erase = erase_block_82802ab,
5515 },
5516 },
5517 .write = write_82802ab,
5518 .read = read_memmapped,
5519 },
5520
5521 {
5522 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005523 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005524 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005525 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005526 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005527 .total_size = 512,
5528 .page_size = 128 * 1024, /* maximal block size */
5529 .tested = TEST_UNTESTED,
5530 .probe = probe_82802ab,
5531 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5532 .block_erasers =
5533 {
5534 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005535 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005536 {128 * 1024, 3},
5537 {96 * 1024, 1},
5538 {8 * 1024, 2},
5539 {16 * 1024, 1},
5540 },
5541 .block_erase = erase_block_82802ab,
5542 },
5543 },
5544 .write = write_82802ab,
5545 .read = read_memmapped,
5546 },
5547
5548 {
5549 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005550 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005551 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005552 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005553 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005554 .total_size = 512,
5555 .page_size = 128 * 1024, /* maximal block size */
5556 .feature_bits = FEATURE_ADDR_SHIFTED,
5557 .tested = TEST_UNTESTED,
5558 .probe = probe_82802ab,
5559 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5560 .block_erasers =
5561 {
5562 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005563 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005564 {16 * 1024, 1},
5565 {8 * 1024, 2},
5566 {96 * 1024, 1},
5567 {128 * 1024, 3},
5568 },
5569 .block_erase = erase_block_82802ab,
5570 },
5571 },
5572 .write = write_82802ab,
5573 .read = read_memmapped,
5574 },
5575
5576 {
5577 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005578 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005579 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005580 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005581 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005582 .total_size = 512,
5583 .page_size = 128 * 1024, /* maximal block size */
5584 .feature_bits = FEATURE_ADDR_SHIFTED,
5585 .tested = TEST_UNTESTED,
5586 .probe = probe_82802ab,
5587 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5588 .block_erasers =
5589 {
5590 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005591 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005592 {128 * 1024, 3},
5593 {96 * 1024, 1},
5594 {8 * 1024, 2},
5595 {16 * 1024, 1},
5596 },
5597 .block_erase = erase_block_82802ab,
5598 },
5599 },
5600 .write = write_82802ab,
5601 .read = read_memmapped,
5602 },
5603
5604 {
5605 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005606 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005607 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005608 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005609 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005610 .total_size = 512,
5611 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005612 .feature_bits = FEATURE_REGISTERMAP,
Stefan Taunerd06d9412011-06-12 19:47:55 +00005613 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005614 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005615 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005616 .block_erasers =
5617 {
5618 {
5619 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005620 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005621 },
5622 },
Sean Nelson28accc22010-03-19 18:47:06 +00005623 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005624 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005625 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005626 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005627 },
5628
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005629 {
5630 .vendor = "Intel",
5631 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005632 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005633 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005634 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005635 .total_size = 1024,
5636 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005637 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00005638 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005639 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005640 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005641 .block_erasers =
5642 {
5643 {
5644 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00005645 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005646 },
5647 },
Sean Nelson28accc22010-03-19 18:47:06 +00005648 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005649 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005650 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005651 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005652 },
5653
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005654 {
5655 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005656 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005657 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005658 .manufacture_id = MACRONIX_ID,
5659 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005660 .total_size = 64,
5661 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005662 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005663 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005664 .tested = TEST_UNTESTED,
5665 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005666 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005667 .block_erasers =
5668 {
5669 {
5670 .eraseblocks = { {4 * 1024, 16} },
5671 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005672 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005673 .eraseblocks = { {64 * 1024, 1} },
5674 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005675 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005676 .eraseblocks = { {64 * 1024, 1} },
5677 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005678 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005679 .eraseblocks = { {64 * 1024, 1} },
5680 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005681 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005682 .eraseblocks = { {64 * 1024, 1} },
5683 .block_erase = spi_block_erase_c7,
5684 },
5685 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005686 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005687 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005688 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005689 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
5690 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00005691 },
5692
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005693 {
5694 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005695 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005696 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005697 .manufacture_id = MACRONIX_ID,
5698 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005699 .total_size = 128,
5700 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005701 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005702 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00005703 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005704 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005705 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005706 .block_erasers =
5707 {
5708 {
5709 .eraseblocks = { {4 * 1024, 32} },
5710 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005711 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005712 .eraseblocks = { {64 * 1024, 2} },
5713 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005714 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005715 .eraseblocks = { {128 * 1024, 1} },
5716 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005717 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005718 .eraseblocks = { {128 * 1024, 1} },
5719 .block_erase = spi_block_erase_c7,
5720 },
5721 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005722 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005723 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005724 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005725 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005726 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005727 },
5728
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005729 {
5730 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005731 .name = "MX25L2005(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005732 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005733 .manufacture_id = MACRONIX_ID,
5734 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005735 .total_size = 256,
5736 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005737 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005738 .tested = TEST_UNTESTED,
5739 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005740 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005741 .block_erasers =
5742 {
5743 {
5744 .eraseblocks = { {4 * 1024, 64} },
5745 .block_erase = spi_block_erase_20,
5746 }, {
5747 .eraseblocks = { {64 * 1024, 4} },
5748 .block_erase = spi_block_erase_52,
5749 }, {
5750 .eraseblocks = { {64 * 1024, 4} },
5751 .block_erase = spi_block_erase_d8,
5752 }, {
5753 .eraseblocks = { {256 * 1024, 1} },
5754 .block_erase = spi_block_erase_60,
5755 }, {
5756 .eraseblocks = { {256 * 1024, 1} },
5757 .block_erase = spi_block_erase_c7,
5758 },
5759 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005760 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005761 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005762 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005763 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005764 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005765 },
5766
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005767 {
5768 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005769 .name = "MX25L4005(A/C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005770 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005771 .manufacture_id = MACRONIX_ID,
5772 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005773 .total_size = 512,
5774 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005775 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00005776 .tested = TEST_OK_PREW,
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,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005779 .block_erasers =
5780 {
5781 {
5782 .eraseblocks = { {4 * 1024, 128} },
5783 .block_erase = spi_block_erase_20,
5784 }, {
5785 .eraseblocks = { {64 * 1024, 8} },
5786 .block_erase = spi_block_erase_52,
5787 }, {
5788 .eraseblocks = { {64 * 1024, 8} },
5789 .block_erase = spi_block_erase_d8,
5790 }, {
5791 .eraseblocks = { {512 * 1024, 1} },
5792 .block_erase = spi_block_erase_60,
5793 }, {
5794 .eraseblocks = { {512 * 1024, 1} },
5795 .block_erase = spi_block_erase_c7,
5796 },
5797 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005798 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005799 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005800 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005801 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005802 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005803 },
5804
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005805 {
5806 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005807 .name = "MX25L8005/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005808 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005809 .manufacture_id = MACRONIX_ID,
5810 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005811 .total_size = 1024,
5812 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005813 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00005814 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005815 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005816 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005817 .block_erasers =
5818 {
5819 {
5820 .eraseblocks = { {4 * 1024, 256} },
5821 .block_erase = spi_block_erase_20,
5822 }, {
5823 .eraseblocks = { {64 * 1024, 16} },
5824 .block_erase = spi_block_erase_52,
5825 }, {
5826 .eraseblocks = { {64 * 1024, 16} },
5827 .block_erase = spi_block_erase_d8,
5828 }, {
5829 .eraseblocks = { {1024 * 1024, 1} },
5830 .block_erase = spi_block_erase_60,
5831 }, {
5832 .eraseblocks = { {1024 * 1024, 1} },
5833 .block_erase = spi_block_erase_c7,
5834 },
5835 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005836 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005837 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005838 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005839 .read = spi_chip_read, /* Fast read (0x0B) supported */
5840 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00005841 },
5842
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005843 {
5844 .vendor = "Macronix",
5845 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005846 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005847 .manufacture_id = MACRONIX_ID,
5848 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005849 .total_size = 2048,
5850 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005851 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00005852 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005853 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005854 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005855 .block_erasers =
5856 {
5857 {
Stefan Tauner226037d2013-03-16 01:22:12 +00005858 .eraseblocks = { {64 * 1024, 32} },
5859 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005860 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00005861 .eraseblocks = { {64 * 1024, 32} },
5862 .block_erase = spi_block_erase_d8,
5863 }, {
5864 .eraseblocks = { {2 * 1024 * 1024, 1} },
5865 .block_erase = spi_block_erase_60,
5866 }, {
5867 .eraseblocks = { {2 * 1024 * 1024, 1} },
5868 .block_erase = spi_block_erase_c7,
5869 },
5870 },
5871 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
5872 .unlock = spi_disable_blockprotect,
5873 .write = spi_chip_write_256,
5874 .read = spi_chip_read, /* Fast read (0x0B) supported */
5875 .voltage = {2700, 3600},
5876 },
5877
5878 {
5879 .vendor = "Macronix",
5880 .name = "MX25L1605A/MX25L1606E",
5881 .bustype = BUS_SPI,
5882 .manufacture_id = MACRONIX_ID,
5883 .model_id = MACRONIX_MX25L1605,
5884 .total_size = 2048,
5885 .page_size = 256,
5886 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
5887 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5888 .tested = TEST_OK_PREW,
5889 .probe = probe_spi_rdid,
5890 .probe_timing = TIMING_ZERO,
5891 .block_erasers =
5892 {
5893 {
5894 .eraseblocks = { {4 * 1024, 512} },
5895 .block_erase = spi_block_erase_20,
5896 }, {
5897 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005898 .block_erase = spi_block_erase_52,
5899 }, {
5900 .eraseblocks = { {64 * 1024, 32} },
5901 .block_erase = spi_block_erase_d8,
5902 }, {
5903 .eraseblocks = { {2 * 1024 * 1024, 1} },
5904 .block_erase = spi_block_erase_60,
5905 }, {
5906 .eraseblocks = { {2 * 1024 * 1024, 1} },
5907 .block_erase = spi_block_erase_c7,
5908 },
5909 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005910 .printlock = spi_prettyprint_status_register_default_bp3, /* MX25L1605A bp2 only */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005911 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005912 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005913 .read = spi_chip_read, /* Fast read (0x0B) supported */
5914 .voltage = {2700, 3600},
5915 },
5916
5917 {
5918 .vendor = "Macronix",
5919 .name = "MX25L1605D/MX25L1608D",
5920 .bustype = BUS_SPI,
5921 .manufacture_id = MACRONIX_ID,
5922 .model_id = MACRONIX_MX25L1605,
5923 .total_size = 2048,
5924 .page_size = 256,
5925 .feature_bits = FEATURE_WRSR_WREN,
5926 .tested = TEST_OK_PREW,
5927 .probe = probe_spi_rdid,
5928 .probe_timing = TIMING_ZERO,
5929 .block_erasers =
5930 {
5931 {
5932 .eraseblocks = { {4 * 1024, 512} },
5933 .block_erase = spi_block_erase_20,
5934 }, {
5935 .eraseblocks = { {64 * 1024, 32} },
5936 .block_erase = spi_block_erase_d8,
5937 }, {
5938 .eraseblocks = { {2 * 1024 * 1024, 1} },
5939 .block_erase = spi_block_erase_60,
5940 }, {
5941 .eraseblocks = { {2 * 1024 * 1024, 1} },
5942 .block_erase = spi_block_erase_c7,
5943 },
5944 },
5945 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: Continously Program (CP) mode */
5946 .unlock = spi_disable_blockprotect,
5947 .write = spi_chip_write_256,
5948 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005949 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005950 },
5951
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005952 {
5953 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005954 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005955 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005956 .manufacture_id = MACRONIX_ID,
5957 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005958 .total_size = 2048,
5959 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005960 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
5961 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005962 .tested = TEST_UNTESTED,
5963 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005964 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00005965 .block_erasers =
5966 {
5967 {
5968 .eraseblocks = { {4 * 1024, 512} },
5969 .block_erase = spi_block_erase_20,
5970 }, {
5971 .eraseblocks = { {64 * 1024, 32} },
5972 .block_erase = spi_block_erase_d8,
5973 }, {
5974 .eraseblocks = { {2 * 1024 * 1024, 1} },
5975 .block_erase = spi_block_erase_60,
5976 }, {
5977 .eraseblocks = { {2 * 1024 * 1024, 1} },
5978 .block_erase = spi_block_erase_c7,
5979 }
5980 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005981 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005982 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005983 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005984 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005985 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005986 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00005987
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005988 {
5989 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00005990 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005991 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005992 .manufacture_id = MACRONIX_ID,
5993 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00005994 .total_size = 2048,
5995 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005996 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
5997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00005998 .tested = TEST_UNTESTED,
5999 .probe = probe_spi_rdid,
6000 .probe_timing = TIMING_ZERO,
6001 .block_erasers =
6002 {
6003 {
6004 .eraseblocks = { {4 * 1024, 512} },
6005 .block_erase = spi_block_erase_20,
6006 }, {
6007 .eraseblocks = { {64 * 1024, 32} },
6008 .block_erase = spi_block_erase_d8,
6009 }, {
6010 .eraseblocks = { {2 * 1024 * 1024, 1} },
6011 .block_erase = spi_block_erase_60,
6012 }, {
6013 .eraseblocks = { {2 * 1024 * 1024, 1} },
6014 .block_erase = spi_block_erase_c7,
6015 }
6016 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006017 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Stephan Guilloux3611b802010-09-13 19:59:28 +00006018 .unlock = spi_disable_blockprotect,
6019 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006020 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00006021 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00006022 },
6023
6024 {
6025 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006026 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006027 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006028 .manufacture_id = MACRONIX_ID,
6029 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006030 .total_size = 4096,
6031 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006032 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00006033 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006034 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006035 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006036 .block_erasers =
6037 {
6038 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006039 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006040 .block_erase = spi_block_erase_20,
6041 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006042 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006043 .block_erase = spi_block_erase_d8,
6044 }, {
6045 .eraseblocks = { {4 * 1024 * 1024, 1} },
6046 .block_erase = spi_block_erase_60,
6047 }, {
6048 .eraseblocks = { {4 * 1024 * 1024, 1} },
6049 .block_erase = spi_block_erase_c7,
6050 },
6051 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006052 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006053 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006054 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006055 .read = spi_chip_read, /* Fast read (0x0B) supported */
6056 .voltage = {2700, 3600},
6057 },
6058
6059 {
6060 .vendor = "Macronix",
6061 .name = "MX25L3205D/MX25L3208D",
6062 .bustype = BUS_SPI,
6063 .manufacture_id = MACRONIX_ID,
6064 .model_id = MACRONIX_MX25L3205,
6065 .total_size = 4096,
6066 .page_size = 256,
6067 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6069 .tested = TEST_OK_PREW,
6070 .probe = probe_spi_rdid,
6071 .probe_timing = TIMING_ZERO,
6072 .block_erasers =
6073 {
6074 {
6075 .eraseblocks = { {4 * 1024, 1024} },
6076 .block_erase = spi_block_erase_20,
6077 }, {
6078 .eraseblocks = { {64 * 1024, 64} },
6079 .block_erase = spi_block_erase_d8,
6080 }, {
6081 .eraseblocks = { {4 * 1024 * 1024, 1} },
6082 .block_erase = spi_block_erase_60,
6083 }, {
6084 .eraseblocks = { {4 * 1024 * 1024, 1} },
6085 .block_erase = spi_block_erase_c7,
6086 },
6087 },
6088 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: CP mode */
6089 .unlock = spi_disable_blockprotect,
6090 .write = spi_chip_write_256,
6091 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6092 .voltage = {2700, 3600},
6093 },
6094
6095 {
6096 .vendor = "Macronix",
6097 .name = "MX25L3206E",
6098 .bustype = BUS_SPI,
6099 .manufacture_id = MACRONIX_ID,
6100 .model_id = MACRONIX_MX25L3205,
6101 .total_size = 4096,
6102 .page_size = 256,
6103 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6105 .tested = TEST_OK_PREW,
6106 .probe = probe_spi_rdid,
6107 .probe_timing = TIMING_ZERO,
6108 .block_erasers =
6109 {
6110 {
6111 .eraseblocks = { {4 * 1024, 1024} },
6112 .block_erase = spi_block_erase_20,
6113 }, {
6114 .eraseblocks = { {64 * 1024, 64} },
6115 .block_erase = spi_block_erase_d8,
6116 }, {
6117 .eraseblocks = { {64 * 1024, 64} },
6118 .block_erase = spi_block_erase_52,
6119 }, {
6120 .eraseblocks = { {4 * 1024 * 1024, 1} },
6121 .block_erase = spi_block_erase_60,
6122 }, {
6123 .eraseblocks = { {4 * 1024 * 1024, 1} },
6124 .block_erase = spi_block_erase_c7,
6125 },
6126 },
6127 .printlock = spi_prettyprint_status_register_default_bp3,
6128 .unlock = spi_disable_blockprotect,
6129 .write = spi_chip_write_256,
6130 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006131 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006132 },
6133
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006134 {
6135 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006136 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006137 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006138 .manufacture_id = MACRONIX_ID,
6139 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006140 .total_size = 4096,
6141 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006142 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
6143 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006144 .tested = TEST_UNTESTED,
6145 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006146 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006147 .block_erasers =
6148 {
6149 {
6150 .eraseblocks = { {4 * 1024, 1024} },
6151 .block_erase = spi_block_erase_20,
6152 }, {
6153 .eraseblocks = { {64 * 1024, 64} },
6154 .block_erase = spi_block_erase_d8,
6155 }, {
6156 .eraseblocks = { {4 * 1024 * 1024, 1} },
6157 .block_erase = spi_block_erase_60,
6158 }, {
6159 .eraseblocks = { {4 * 1024 * 1024, 1} },
6160 .block_erase = spi_block_erase_c7,
6161 }
6162 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006163 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006164 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006165 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006166 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006167 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006168 },
6169
6170 {
6171 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006172 .name = "MX25L6405(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006173 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006174 .manufacture_id = MACRONIX_ID,
6175 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006176 .total_size = 8192,
6177 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006178 /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
6179 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Paul Menzelac427b22012-02-16 21:07:07 +00006180 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006181 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006182 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006183 .block_erasers =
6184 {
6185 {
6186 .eraseblocks = { {64 * 1024, 128} },
6187 .block_erase = spi_block_erase_20,
6188 }, {
6189 .eraseblocks = { {64 * 1024, 128} },
6190 .block_erase = spi_block_erase_d8,
6191 }, {
6192 .eraseblocks = { {8 * 1024 * 1024, 1} },
6193 .block_erase = spi_block_erase_60,
6194 }, {
6195 .eraseblocks = { {8 * 1024 * 1024, 1} },
6196 .block_erase = spi_block_erase_c7,
6197 }
6198 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006199 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 has different meanings */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006200 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006201 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006202 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006203 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006204 },
6205
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006206 {
6207 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006208 .name = "MX25L6406E/MX25L6436E",
6209 .bustype = BUS_SPI,
6210 .manufacture_id = MACRONIX_ID,
6211 .model_id = MACRONIX_MX25L6405,
6212 .total_size = 8192,
6213 .page_size = 256,
6214 /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
6215 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6216 .tested = TEST_OK_PREW,
6217 .probe = probe_spi_rdid,
6218 .probe_timing = TIMING_ZERO,
6219 .block_erasers =
6220 {
6221 {
6222 .eraseblocks = { {4 * 1024, 2048} },
6223 .block_erase = spi_block_erase_20,
6224 }, {
6225 .eraseblocks = { {64 * 1024, 128} },
6226 .block_erase = spi_block_erase_d8,
6227 }, {
6228 .eraseblocks = { {8 * 1024 * 1024, 1} },
6229 .block_erase = spi_block_erase_60,
6230 }, {
6231 .eraseblocks = { {8 * 1024 * 1024, 1} },
6232 .block_erase = spi_block_erase_c7,
6233 }
6234 },
6235 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 for 36E is quad enable */
6236 .unlock = spi_disable_blockprotect,
6237 .write = spi_chip_write_256,
6238 .read = spi_chip_read,
6239 .voltage = {2700, 3600},
6240 },
6241
6242 {
6243 .vendor = "Macronix",
6244 .name = "MX25L6445E",
6245 .bustype = BUS_SPI,
6246 .manufacture_id = MACRONIX_ID,
6247 .model_id = MACRONIX_MX25L6405,
6248 .total_size = 8192,
6249 .page_size = 256,
6250 /* supports SFDP */
6251 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6253 .tested = TEST_OK_PREW,
6254 .probe = probe_spi_rdid,
6255 .probe_timing = TIMING_ZERO,
6256 .block_erasers =
6257 {
6258 {
6259 .eraseblocks = { {4 * 1024, 2048} },
6260 .block_erase = spi_block_erase_20,
6261 }, {
6262 .eraseblocks = { {32 * 1024, 256} },
6263 .block_erase = spi_block_erase_52,
6264 }, {
6265 .eraseblocks = { {64 * 1024, 128} },
6266 .block_erase = spi_block_erase_d8,
6267 }, {
6268 .eraseblocks = { {8 * 1024 * 1024, 1} },
6269 .block_erase = spi_block_erase_60,
6270 }, {
6271 .eraseblocks = { {8 * 1024 * 1024, 1} },
6272 .block_erase = spi_block_erase_c7,
6273 }
6274 },
6275 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6276 .unlock = spi_disable_blockprotect,
6277 .write = spi_chip_write_256,
6278 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6279 .voltage = {2700, 3600},
6280 },
6281
6282 {
6283 .vendor = "Macronix",
6284 .name = "MX25L12805(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006285 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006286 .manufacture_id = MACRONIX_ID,
6287 .model_id = MACRONIX_MX25L12805,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006288 .total_size = 16384,
6289 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006290 /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
6291 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00006292 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006293 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006294 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006295 .block_erasers =
6296 {
6297 {
6298 .eraseblocks = { {4 * 1024, 4096} },
6299 .block_erase = spi_block_erase_20,
6300 }, {
6301 .eraseblocks = { {64 * 1024, 256} },
6302 .block_erase = spi_block_erase_d8,
6303 }, {
6304 .eraseblocks = { {16 * 1024 * 1024, 1} },
6305 .block_erase = spi_block_erase_60,
6306 }, {
6307 .eraseblocks = { {16 * 1024 * 1024, 1} },
6308 .block_erase = spi_block_erase_c7,
6309 }
6310 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006311 .printlock = spi_prettyprint_status_register_default_bp3,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006312 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006313 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006314 .read = spi_chip_read, /* MX25L12805D: Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006315 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006316 },
6317
6318 {
6319 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00006320 .name = "MX25U1635E",
6321 .bustype = BUS_SPI,
6322 .manufacture_id = MACRONIX_ID,
6323 .model_id = MACRONIX_MX25U1635E,
6324 .total_size = 2048,
6325 .page_size = 256,
6326 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6327 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6328 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6329 .tested = TEST_UNTESTED,
6330 .probe = probe_spi_rdid,
6331 .probe_timing = TIMING_ZERO,
6332 .block_erasers =
6333 {
6334 {
6335 .eraseblocks = { {4 * 1024, 512} },
6336 .block_erase = spi_block_erase_20,
6337 }, {
6338 .eraseblocks = { {32 * 1024, 64} },
6339 .block_erase = spi_block_erase_52,
6340 }, {
6341 .eraseblocks = { {64 * 1024, 32} },
6342 .block_erase = spi_block_erase_d8,
6343 }, {
6344 .eraseblocks = { {2 * 1024 * 1024, 1} },
6345 .block_erase = spi_block_erase_60,
6346 }, {
6347 .eraseblocks = { {2 * 1024 * 1024, 1} },
6348 .block_erase = spi_block_erase_c7,
6349 }
6350 },
6351 /* TODO: security register */
6352 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6353 .unlock = spi_disable_blockprotect,
6354 .write = spi_chip_write_256,
6355 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6356 .voltage = {1650, 2000},
6357 },
6358
6359 {
6360 .vendor = "Macronix",
6361 .name = "MX25U3235E/F",
6362 .bustype = BUS_SPI,
6363 .manufacture_id = MACRONIX_ID,
6364 .model_id = MACRONIX_MX25U3235E,
6365 .total_size = 4096,
6366 .page_size = 256,
6367 /* F model supports SFDP */
6368 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6369 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6370 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6371 .tested = TEST_OK_PREW,
6372 .probe = probe_spi_rdid,
6373 .probe_timing = TIMING_ZERO,
6374 .block_erasers =
6375 {
6376 {
6377 .eraseblocks = { {4 * 1024, 1024} },
6378 .block_erase = spi_block_erase_20,
6379 }, {
6380 .eraseblocks = { {32 * 1024, 128} },
6381 .block_erase = spi_block_erase_52,
6382 }, {
6383 .eraseblocks = { {64 * 1024, 64} },
6384 .block_erase = spi_block_erase_d8,
6385 }, {
6386 .eraseblocks = { {4 * 1024 * 1024, 1} },
6387 .block_erase = spi_block_erase_60,
6388 }, {
6389 .eraseblocks = { {4 * 1024 * 1024, 1} },
6390 .block_erase = spi_block_erase_c7,
6391 }
6392 },
6393 /* TODO: security register */
6394 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6395 .unlock = spi_disable_blockprotect,
6396 .write = spi_chip_write_256,
6397 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6398 .voltage = {1650, 2000},
6399 },
6400
6401 {
6402 .vendor = "Macronix",
6403 .name = "MX25U6435E/F",
6404 .bustype = BUS_SPI,
6405 .manufacture_id = MACRONIX_ID,
6406 .model_id = MACRONIX_MX25U6435E,
6407 .total_size = 8192,
6408 .page_size = 256,
6409 /* F model supports SFDP */
6410 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6411 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6412 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6413 .tested = TEST_UNTESTED,
6414 .probe = probe_spi_rdid,
6415 .probe_timing = TIMING_ZERO,
6416 .block_erasers =
6417 {
6418 {
6419 .eraseblocks = { {4 * 1024, 2048} },
6420 .block_erase = spi_block_erase_20,
6421 }, {
6422 .eraseblocks = { {32 * 1024, 256} },
6423 .block_erase = spi_block_erase_52,
6424 }, {
6425 .eraseblocks = { {64 * 1024, 128} },
6426 .block_erase = spi_block_erase_d8,
6427 }, {
6428 .eraseblocks = { {8 * 1024 * 1024, 1} },
6429 .block_erase = spi_block_erase_60,
6430 }, {
6431 .eraseblocks = { {8 * 1024 * 1024, 1} },
6432 .block_erase = spi_block_erase_c7,
6433 }
6434 },
6435 /* TODO: security register */
6436 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6437 .unlock = spi_disable_blockprotect,
6438 .write = spi_chip_write_256,
6439 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6440 .voltage = {1650, 2000},
6441 },
6442
6443 {
6444 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00006445 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006446 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006447 .manufacture_id = MACRONIX_ID,
6448 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006449 .total_size = 128,
6450 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006451 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6452 .tested = TEST_UNTESTED,
6453 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006454 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006455 .block_erasers =
6456 {
6457 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006458 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006459 {8 * 1024, 1},
6460 {4 * 1024, 2},
6461 {8 * 1024, 2},
6462 {32 * 1024, 1},
6463 {64 * 1024, 1},
6464 },
Sean Nelson35727f72010-01-28 23:55:12 +00006465 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006466 }, {
6467 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006468 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006469 }
6470 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006471 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006472 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006473 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006474 },
6475
6476 {
6477 .vendor = "Macronix",
6478 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006479 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006480 .manufacture_id = MACRONIX_ID,
6481 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006482 .total_size = 128,
6483 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006484 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00006485 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006486 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006487 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006488 .block_erasers =
6489 {
6490 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006491 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006492 {64 * 1024, 1},
6493 {32 * 1024, 1},
6494 {8 * 1024, 2},
6495 {4 * 1024, 2},
6496 {8 * 1024, 1},
6497 },
Sean Nelson35727f72010-01-28 23:55:12 +00006498 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006499 }, {
6500 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006501 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006502 }
6503 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006504 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006505 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006506 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006507 },
6508
6509 {
6510 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006511 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006512 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006513 .manufacture_id = MACRONIX_ID,
6514 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006515 .total_size = 256,
6516 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006517 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006518 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006519 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006520 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006521 .block_erasers =
6522 {
6523 {
6524 .eraseblocks = {
6525 {16 * 1024, 1},
6526 {8 * 1024, 2},
6527 {32 * 1024, 1},
6528 {64 * 1024, 3},
6529 },
Sean Nelson35727f72010-01-28 23:55:12 +00006530 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006531 }, {
6532 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006533 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006534 },
6535 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006536 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006537 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006538 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006539 },
6540
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006541 {
6542 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006543 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006544 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006545 .manufacture_id = MACRONIX_ID,
6546 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006547 .total_size = 256,
6548 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006549 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00006550 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006551 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006552 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006553 .block_erasers =
6554 {
6555 {
6556 .eraseblocks = {
6557 {64 * 1024, 3},
6558 {32 * 1024, 1},
6559 {8 * 1024, 2},
6560 {16 * 1024, 1},
6561 },
Sean Nelson35727f72010-01-28 23:55:12 +00006562 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006563 }, {
6564 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006565 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006566 },
6567 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006568 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006569 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006570 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006571 },
6572
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006573 {
6574 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00006575 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006576 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006577 .manufacture_id = MACRONIX_ID,
6578 .model_id = MACRONIX_MX29F040,
6579 .total_size = 512,
6580 .page_size = 64 * 1024,
6581 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6582 .tested = TEST_UNTESTED,
6583 .probe = probe_jedec,
6584 .probe_timing = TIMING_ZERO,
6585 .block_erasers =
6586 {
6587 {
6588 .eraseblocks = { {64 * 1024, 8} },
6589 .block_erase = erase_sector_jedec,
6590 }, {
6591 .eraseblocks = { {512 * 1024, 1} },
6592 .block_erase = erase_chip_block_jedec,
6593 },
6594 },
6595 .write = write_jedec_1,
6596 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006597 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006598 },
6599
6600 {
6601 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00006602 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006603 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006604 .manufacture_id = MACRONIX_ID,
6605 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006606 .total_size = 512,
6607 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006608 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6609 .tested = TEST_UNTESTED,
6610 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006611 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006612 .block_erasers =
6613 {
6614 {
6615 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00006616 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006617 }, {
6618 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006619 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006620 },
6621 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006622 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006623 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006624 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00006625 },
6626
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006627 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00006628 .vendor = "Micron/Numonyx/ST",
6629 .name = "M25P05-A",
6630 .bustype = BUS_SPI,
6631 .manufacture_id = ST_ID,
6632 .model_id = ST_M25P05A,
6633 .total_size = 64,
6634 .page_size = 256,
6635 .feature_bits = FEATURE_WRSR_WREN,
6636 .tested = TEST_OK_PREW,
6637 .probe = probe_spi_rdid,
6638 .probe_timing = TIMING_ZERO,
6639 .block_erasers =
6640 {
6641 {
6642 .eraseblocks = { {32 * 1024, 2} },
6643 .block_erase = spi_block_erase_d8,
6644 }, {
6645 .eraseblocks = { {64 * 1024, 1} },
6646 .block_erase = spi_block_erase_c7,
6647 }
6648 },
6649 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6650 .unlock = spi_disable_blockprotect,
6651 .write = spi_chip_write_256,
6652 .read = spi_chip_read,
6653 .voltage = {2700, 3600},
6654 },
6655
6656 /* The ST M25P05 is a bit of a problem. It has the same ID as the
6657 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
6658 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
6659 * only is successful if RDID does not work.
6660 */
6661 {
6662 .vendor = "Micron/Numonyx/ST",
6663 .name = "M25P05",
6664 .bustype = BUS_SPI,
6665 .manufacture_id = 0, /* Not used. */
6666 .model_id = ST_M25P05_RES,
6667 .total_size = 64,
6668 .page_size = 256,
6669 .feature_bits = FEATURE_WRSR_WREN,
6670 .tested = TEST_UNTESTED,
6671 .probe = probe_spi_res1,
6672 .probe_timing = TIMING_ZERO,
6673 .block_erasers =
6674 {
6675 {
6676 .eraseblocks = { {32 * 1024, 2} },
6677 .block_erase = spi_block_erase_d8,
6678 }, {
6679 .eraseblocks = { {64 * 1024, 1} },
6680 .block_erase = spi_block_erase_c7,
6681 }
6682 },
6683 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6684 .unlock = spi_disable_blockprotect,
6685 .write = spi_chip_write_1, /* 128 */
6686 .read = spi_chip_read,
6687 .voltage = {2700, 3600},
6688 },
6689
6690 {
6691 .vendor = "Micron/Numonyx/ST",
6692 .name = "M25P10-A",
6693 .bustype = BUS_SPI,
6694 .manufacture_id = ST_ID,
6695 .model_id = ST_M25P10A,
6696 .total_size = 128,
6697 .page_size = 256,
6698 .feature_bits = FEATURE_WRSR_WREN,
6699 .tested = TEST_OK_PRE,
6700 .probe = probe_spi_rdid,
6701 .probe_timing = TIMING_ZERO,
6702 .block_erasers =
6703 {
6704 {
6705 .eraseblocks = { {32 * 1024, 4} },
6706 .block_erase = spi_block_erase_d8,
6707 }, {
6708 .eraseblocks = { {128 * 1024, 1} },
6709 .block_erase = spi_block_erase_c7,
6710 }
6711 },
6712 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6713 .unlock = spi_disable_blockprotect,
6714 .write = spi_chip_write_256,
6715 .read = spi_chip_read,
6716 .voltage = {2700, 3600},
6717 },
6718
6719 /* The ST M25P10 has the same problem as the M25P05. */
6720 {
6721 .vendor = "Micron/Numonyx/ST",
6722 .name = "M25P10",
6723 .bustype = BUS_SPI,
6724 .manufacture_id = 0, /* Not used. */
6725 .model_id = ST_M25P10_RES,
6726 .total_size = 128,
6727 .page_size = 256,
6728 .feature_bits = FEATURE_WRSR_WREN,
6729 .tested = TEST_UNTESTED,
6730 .probe = probe_spi_res1,
6731 .probe_timing = TIMING_ZERO,
6732 .block_erasers =
6733 {
6734 {
6735 .eraseblocks = { {32 * 1024, 4} },
6736 .block_erase = spi_block_erase_d8,
6737 }, {
6738 .eraseblocks = { {128 * 1024, 1} },
6739 .block_erase = spi_block_erase_c7,
6740 }
6741 },
6742 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6743 .unlock = spi_disable_blockprotect,
6744 .write = spi_chip_write_1, /* 128 */
6745 .read = spi_chip_read,
6746 .voltage = {2700, 3600},
6747 },
6748
6749 {
6750 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6751 .name = "M25P20",
6752 .bustype = BUS_SPI,
6753 .manufacture_id = ST_ID,
6754 .model_id = ST_M25P20,
6755 .total_size = 256,
6756 .page_size = 256,
6757 .feature_bits = FEATURE_WRSR_WREN,
6758 .tested = TEST_UNTESTED,
6759 .probe = probe_spi_rdid,
6760 .probe_timing = TIMING_ZERO,
6761 .block_erasers =
6762 {
6763 {
6764 .eraseblocks = { {64 * 1024, 4} },
6765 .block_erase = spi_block_erase_d8,
6766 }, {
6767 .eraseblocks = { {256 * 1024, 1} },
6768 .block_erase = spi_block_erase_c7,
6769 }
6770 },
6771 .printlock = spi_prettyprint_status_register_default_bp1,
6772 .unlock = spi_disable_blockprotect,
6773 .write = spi_chip_write_256,
6774 .read = spi_chip_read, /* Fast read (0x0B) supported */
6775 .voltage = {2700, 3600},
6776 },
6777
6778 {
6779 .vendor = "Micron/Numonyx/ST",
6780 .name = "M25P20-old",
6781 .bustype = BUS_SPI,
6782 .manufacture_id = 0, /* Not used. */
6783 .model_id = ST_M25P20_RES,
6784 .total_size = 256,
6785 .page_size = 256,
6786 .feature_bits = FEATURE_WRSR_WREN,
6787 .tested = TEST_OK_PREW,
6788 .probe = probe_spi_res1,
6789 .probe_timing = TIMING_ZERO,
6790 .block_erasers =
6791 {
6792 {
6793 .eraseblocks = { {64 * 1024, 4} },
6794 .block_erase = spi_block_erase_d8,
6795 }, {
6796 .eraseblocks = { {256 * 1024, 1} },
6797 .block_erase = spi_block_erase_c7,
6798 }
6799 },
6800 .printlock = spi_prettyprint_status_register_default_bp1,
6801 .unlock = spi_disable_blockprotect,
6802 .write = spi_chip_write_256,
6803 .read = spi_chip_read, /* Fast read (0x0B) supported */
6804 .voltage = {2700, 3600},
6805 },
6806
6807 {
6808 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6809 .name = "M25P40",
6810 .bustype = BUS_SPI,
6811 .manufacture_id = ST_ID,
6812 .model_id = ST_M25P40,
6813 .total_size = 512,
6814 .page_size = 256,
6815 .feature_bits = FEATURE_WRSR_WREN,
6816 .tested = TEST_OK_PREW,
6817 .probe = probe_spi_rdid,
6818 .probe_timing = TIMING_ZERO,
6819 .block_erasers =
6820 {
6821 {
6822 .eraseblocks = { {64 * 1024, 8} },
6823 .block_erase = spi_block_erase_d8,
6824 }, {
6825 .eraseblocks = { {512 * 1024, 1} },
6826 .block_erase = spi_block_erase_c7,
6827 }
6828 },
6829 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6830 .unlock = spi_disable_blockprotect,
6831 .write = spi_chip_write_256,
6832 .read = spi_chip_read,
6833 .voltage = {2700, 3600},
6834 },
6835
6836 {
6837 .vendor = "Micron/Numonyx/ST",
6838 .name = "M25P40-old",
6839 .bustype = BUS_SPI,
6840 .manufacture_id = 0, /* Not used. */
6841 .model_id = ST_M25P40_RES,
6842 .total_size = 512,
6843 .page_size = 256,
6844 .feature_bits = FEATURE_WRSR_WREN,
6845 .tested = TEST_UNTESTED,
6846 .probe = probe_spi_res1,
6847 .probe_timing = TIMING_ZERO,
6848 .block_erasers =
6849 {
6850 {
6851 .eraseblocks = { {64 * 1024, 8} },
6852 .block_erase = spi_block_erase_d8,
6853 }, {
6854 .eraseblocks = { {512 * 1024, 1} },
6855 .block_erase = spi_block_erase_c7,
6856 }
6857 },
6858 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6859 .unlock = spi_disable_blockprotect,
6860 .write = spi_chip_write_256,
6861 .read = spi_chip_read,
6862 },
6863
6864 {
6865 .vendor = "Micron/Numonyx/ST",
6866 .name = "M25P80",
6867 .bustype = BUS_SPI,
6868 .manufacture_id = ST_ID,
6869 .model_id = ST_M25P80,
6870 .total_size = 1024,
6871 .page_size = 256,
6872 .feature_bits = FEATURE_WRSR_WREN,
6873 .tested = TEST_OK_PREW,
6874 .probe = probe_spi_rdid,
6875 .probe_timing = TIMING_ZERO,
6876 .block_erasers =
6877 {
6878 {
6879 .eraseblocks = { {64 * 1024, 16} },
6880 .block_erase = spi_block_erase_d8,
6881 }, {
6882 .eraseblocks = { {1024 * 1024, 1} },
6883 .block_erase = spi_block_erase_c7,
6884 }
6885 },
6886 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6887 .unlock = spi_disable_blockprotect,
6888 .write = spi_chip_write_256,
6889 .read = spi_chip_read,
6890 .voltage = {2700, 3600},
6891 },
6892
6893 {
6894 .vendor = "Micron/Numonyx/ST",
6895 .name = "M25P16",
6896 .bustype = BUS_SPI,
6897 .manufacture_id = ST_ID,
6898 .model_id = ST_M25P16,
6899 .total_size = 2048,
6900 .page_size = 256,
6901 .feature_bits = FEATURE_WRSR_WREN,
6902 .tested = TEST_OK_PR,
6903 .probe = probe_spi_rdid,
6904 .probe_timing = TIMING_ZERO,
6905 .block_erasers =
6906 {
6907 {
6908 .eraseblocks = { {64 * 1024, 32} },
6909 .block_erase = spi_block_erase_d8,
6910 }, {
6911 .eraseblocks = { {2 * 1024 * 1024, 1} },
6912 .block_erase = spi_block_erase_c7,
6913 }
6914 },
6915 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6916 .unlock = spi_disable_blockprotect,
6917 .write = spi_chip_write_256,
6918 .read = spi_chip_read,
6919 .voltage = {2700, 3600},
6920 },
6921
6922 {
6923 .vendor = "Micron/Numonyx/ST",
6924 .name = "M25P32",
6925 .bustype = BUS_SPI,
6926 .manufacture_id = ST_ID,
6927 .model_id = ST_M25P32,
6928 .total_size = 4096,
6929 .page_size = 256,
6930 .feature_bits = FEATURE_WRSR_WREN,
6931 .tested = TEST_OK_PREW,
6932 .probe = probe_spi_rdid,
6933 .probe_timing = TIMING_ZERO,
6934 .block_erasers =
6935 {
6936 {
6937 .eraseblocks = { {64 * 1024, 64} },
6938 .block_erase = spi_block_erase_d8,
6939 }, {
6940 .eraseblocks = { {4 * 1024 * 1024, 1} },
6941 .block_erase = spi_block_erase_c7,
6942 }
6943 },
6944 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6945 .unlock = spi_disable_blockprotect,
6946 .write = spi_chip_write_256,
6947 .read = spi_chip_read,
6948 .voltage = {2700, 3600},
6949 },
6950
6951 {
6952 .vendor = "Micron/Numonyx/ST",
6953 .name = "M25P64",
6954 .bustype = BUS_SPI,
6955 .manufacture_id = ST_ID,
6956 .model_id = ST_M25P64,
6957 .total_size = 8192,
6958 .page_size = 256,
6959 .feature_bits = FEATURE_WRSR_WREN,
6960 .tested = TEST_OK_PREW,
6961 .probe = probe_spi_rdid,
6962 .probe_timing = TIMING_ZERO,
6963 .block_erasers =
6964 {
6965 {
6966 .eraseblocks = { {64 * 1024, 128} },
6967 .block_erase = spi_block_erase_d8,
6968 }, {
6969 .eraseblocks = { {8 * 1024 * 1024, 1} },
6970 .block_erase = spi_block_erase_c7,
6971 }
6972 },
6973 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6974 .unlock = spi_disable_blockprotect,
6975 .write = spi_chip_write_256,
6976 .read = spi_chip_read,
6977 .voltage = {2700, 3600},
6978 },
6979
6980 {
6981 .vendor = "Micron/Numonyx/ST",
6982 .name = "M25P128",
6983 .bustype = BUS_SPI,
6984 .manufacture_id = ST_ID,
6985 .model_id = ST_M25P128,
6986 .total_size = 16384,
6987 .page_size = 256,
6988 .feature_bits = FEATURE_WRSR_WREN,
6989 .tested = TEST_OK_PREW,
6990 .probe = probe_spi_rdid,
6991 .probe_timing = TIMING_ZERO,
6992 .block_erasers =
6993 {
6994 {
6995 .eraseblocks = { {256 * 1024, 64} },
6996 .block_erase = spi_block_erase_d8,
6997 }, {
6998 .eraseblocks = { {16 * 1024 * 1024, 1} },
6999 .block_erase = spi_block_erase_c7,
7000 }
7001 },
7002 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7003 .unlock = spi_disable_blockprotect,
7004 .write = spi_chip_write_256,
7005 .read = spi_chip_read,
7006 .voltage = {2700, 3600},
7007 },
7008
7009 {
7010 .vendor = "Micron/Numonyx/ST",
7011 .name = "M25PE10",
7012 .bustype = BUS_SPI,
7013 .manufacture_id = ST_ID,
7014 .model_id = ST_M25PE10,
7015 .total_size = 128,
7016 .page_size = 256,
7017 .feature_bits = FEATURE_WRSR_WREN,
7018 .tested = TEST_UNTESTED,
7019 .probe = probe_spi_rdid,
7020 .probe_timing = TIMING_ZERO,
7021 .block_erasers =
7022 {
7023 {
7024 .eraseblocks = { {4 * 1024, 32} },
7025 .block_erase = spi_block_erase_20,
7026 }, {
7027 .eraseblocks = { {64 * 1024, 2} },
7028 .block_erase = spi_block_erase_d8,
7029 }, {
7030 .eraseblocks = { {128 * 1024, 1} },
7031 .block_erase = spi_block_erase_c7,
7032 }
7033 },
7034 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7035 .unlock = spi_disable_blockprotect,
7036 .write = spi_chip_write_256,
7037 .read = spi_chip_read,
7038 .voltage = {2700, 3600},
7039 },
7040
7041 {
7042 .vendor = "Micron/Numonyx/ST",
7043 .name = "M25PE20",
7044 .bustype = BUS_SPI,
7045 .manufacture_id = ST_ID,
7046 .model_id = ST_M25PE20,
7047 .total_size = 256,
7048 .page_size = 256,
7049 .feature_bits = FEATURE_WRSR_WREN,
7050 .tested = TEST_UNTESTED,
7051 .probe = probe_spi_rdid,
7052 .probe_timing = TIMING_ZERO,
7053 .block_erasers =
7054 {
7055 {
7056 .eraseblocks = { {4 * 1024, 64} },
7057 .block_erase = spi_block_erase_20,
7058 }, {
7059 .eraseblocks = { {64 * 1024, 4} },
7060 .block_erase = spi_block_erase_d8,
7061 }, {
7062 .eraseblocks = { {256 * 1024, 1} },
7063 .block_erase = spi_block_erase_c7,
7064 }
7065 },
7066 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7067 .unlock = spi_disable_blockprotect,
7068 .write = spi_chip_write_256,
7069 .read = spi_chip_read,
7070 .voltage = {2700, 3600},
7071 },
7072
7073 {
7074 .vendor = "Micron/Numonyx/ST",
7075 .name = "M25PE40",
7076 .bustype = BUS_SPI,
7077 .manufacture_id = ST_ID,
7078 .model_id = ST_M25PE40,
7079 .total_size = 512,
7080 .page_size = 256,
7081 .feature_bits = FEATURE_WRSR_WREN,
7082 .tested = TEST_UNTESTED,
7083 .probe = probe_spi_rdid,
7084 .probe_timing = TIMING_ZERO,
7085 .block_erasers =
7086 {
7087 {
7088 .eraseblocks = { {4 * 1024, 128} },
7089 .block_erase = spi_block_erase_20,
7090 }, {
7091 .eraseblocks = { {64 * 1024, 8} },
7092 .block_erase = spi_block_erase_d8,
7093 }, {
7094 .eraseblocks = { {512 * 1024, 1} },
7095 .block_erase = spi_block_erase_c7,
7096 }
7097 },
7098 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7099 .unlock = spi_disable_blockprotect,
7100 .write = spi_chip_write_256,
7101 .read = spi_chip_read,
7102 .voltage = {2700, 3600},
7103 },
7104
7105 {
7106 .vendor = "Micron/Numonyx/ST",
7107 .name = "M25PE80",
7108 .bustype = BUS_SPI,
7109 .manufacture_id = ST_ID,
7110 .model_id = ST_M25PE80,
7111 .total_size = 1024,
7112 .page_size = 256,
7113 .feature_bits = FEATURE_WRSR_WREN,
7114 .tested = TEST_OK_PREW,
7115 .probe = probe_spi_rdid,
7116 .probe_timing = TIMING_ZERO,
7117 .block_erasers =
7118 {
7119 {
7120 .eraseblocks = { {4 * 1024, 256} },
7121 .block_erase = spi_block_erase_20,
7122 }, {
7123 .eraseblocks = { {64 * 1024, 16} },
7124 .block_erase = spi_block_erase_d8,
7125 }, {
7126 .eraseblocks = { {1024 * 1024, 1} },
7127 .block_erase = spi_block_erase_c7,
7128 }
7129 },
7130 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7131 .unlock = spi_disable_blockprotect,
7132 .write = spi_chip_write_256,
7133 .read = spi_chip_read,
7134 .voltage = {2700, 3600},
7135 },
7136
7137 {
7138 .vendor = "Micron/Numonyx/ST",
7139 .name = "M25PE16",
7140 .bustype = BUS_SPI,
7141 .manufacture_id = ST_ID,
7142 .model_id = ST_M25PE16,
7143 .total_size = 2048,
7144 .page_size = 256,
7145 .feature_bits = FEATURE_WRSR_WREN,
7146 .tested = TEST_UNTESTED,
7147 .probe = probe_spi_rdid,
7148 .probe_timing = TIMING_ZERO,
7149 .block_erasers =
7150 {
7151 {
7152 .eraseblocks = { {4 * 1024, 512} },
7153 .block_erase = spi_block_erase_20,
7154 }, {
7155 .eraseblocks = { {64 * 1024, 32} },
7156 .block_erase = spi_block_erase_d8,
7157 }, {
7158 .eraseblocks = { {2 * 1024 * 1024, 1} },
7159 .block_erase = spi_block_erase_c7,
7160 }
7161 },
7162 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7163 .unlock = spi_disable_blockprotect,
7164 .write = spi_chip_write_256,
7165 .read = spi_chip_read,
7166 .voltage = {2700, 3600},
7167 },
7168
7169 {
7170 .vendor = "Micron/Numonyx/ST",
7171 .name = "M25PX80",
7172 .bustype = BUS_SPI,
7173 .manufacture_id = ST_ID,
7174 .model_id = ST_M25PX80,
7175 .total_size = 1024,
7176 .page_size = 256,
7177 /* OTP: 64B total; read 0x4B, write 0x42 */
7178 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7179 .tested = TEST_OK_PREW,
7180 .probe = probe_spi_rdid,
7181 .probe_timing = TIMING_ZERO,
7182 .block_erasers = {
7183 {
7184 .eraseblocks = { { 4 * 1024, 256 } },
7185 .block_erase = spi_block_erase_20,
7186 }, {
7187 .eraseblocks = { {64 * 1024, 16} },
7188 .block_erase = spi_block_erase_d8,
7189 }, {
7190 .eraseblocks = { {1024 * 1024, 1} },
7191 .block_erase = spi_block_erase_c7,
7192 }
7193 },
7194 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7195 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7196 .write = spi_chip_write_256,
7197 .read = spi_chip_read,
7198 .voltage = {2700, 3600},
7199 },
7200
7201 {
7202 .vendor = "Micron/Numonyx/ST",
7203 .name = "M25PX16",
7204 .bustype = BUS_SPI,
7205 .manufacture_id = ST_ID,
7206 .model_id = ST_M25PX16,
7207 .total_size = 2048,
7208 .page_size = 256,
7209 /* OTP: 64B total; read 0x4B; write 0x42 */
7210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7211 .tested = TEST_OK_PREW,
7212 .probe = probe_spi_rdid,
7213 .probe_timing = TIMING_ZERO,
7214 .block_erasers =
7215 {
7216 {
7217 .eraseblocks = { { 4 * 1024, 512 } },
7218 .block_erase = spi_block_erase_20,
7219 }, {
7220 .eraseblocks = { {64 * 1024, 32} },
7221 .block_erase = spi_block_erase_d8,
7222 }, {
7223 .eraseblocks = { {2 * 1024 * 1024, 1} },
7224 .block_erase = spi_block_erase_c7,
7225 }
7226 },
7227 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7228 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7229 .write = spi_chip_write_256,
7230 .read = spi_chip_read,
7231 },
7232
7233 {
7234 .vendor = "Micron/Numonyx/ST",
7235 .name = "M25PX32",
7236 .bustype = BUS_SPI,
7237 .manufacture_id = ST_ID,
7238 .model_id = ST_M25PX32,
7239 .total_size = 4096,
7240 .page_size = 256,
7241 /* OTP: 64B total; read 0x4B; write 0x42 */
7242 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7243 .tested = TEST_OK_PRE,
7244 .probe = probe_spi_rdid,
7245 .probe_timing = TIMING_ZERO,
7246 .block_erasers =
7247 {
7248 {
7249 .eraseblocks = { { 4 * 1024, 1024 } },
7250 .block_erase = spi_block_erase_20,
7251 }, {
7252 .eraseblocks = { {64 * 1024, 64} },
7253 .block_erase = spi_block_erase_d8,
7254 }, {
7255 .eraseblocks = { {4 * 1024 * 1024, 1} },
7256 .block_erase = spi_block_erase_c7,
7257 }
7258 },
7259 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7260 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7261 .write = spi_chip_write_256,
7262 .read = spi_chip_read,
7263 .voltage = {2700, 3600},
7264 },
7265
7266 {
7267 .vendor = "Micron/Numonyx/ST",
7268 .name = "M25PX64",
7269 .bustype = BUS_SPI,
7270 .manufacture_id = ST_ID,
7271 .model_id = ST_M25PX64,
7272 .total_size = 8192,
7273 .page_size = 256,
7274 /* OTP: 64B total; read 0x4B; write 0x42 */
7275 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7276 .tested = TEST_OK_PRE,
7277 .probe = probe_spi_rdid,
7278 .probe_timing = TIMING_ZERO,
7279 .block_erasers =
7280 {
7281 {
7282 .eraseblocks = { { 4 * 1024, 2048 } },
7283 .block_erase = spi_block_erase_20,
7284 }, {
7285 .eraseblocks = { {64 * 1024, 128} },
7286 .block_erase = spi_block_erase_d8,
7287 }, {
7288 .eraseblocks = { {8 * 1024 * 1024, 1} },
7289 .block_erase = spi_block_erase_c7,
7290 }
7291 },
7292 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7293 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7294 .write = spi_chip_write_256,
7295 .read = spi_chip_read,
7296 },
7297
7298 {
7299 .vendor = "Micron/Numonyx/ST",
7300 .name = "M45PE10",
7301 .bustype = BUS_SPI,
7302 .manufacture_id = ST_ID,
7303 .model_id = ST_M45PE10,
7304 .total_size = 128,
7305 .page_size = 256,
7306 .tested = TEST_UNTESTED,
7307 .probe = probe_spi_rdid,
7308 .probe_timing = TIMING_ZERO,
7309 .block_erasers = {
7310 {
7311 .eraseblocks = { {256, 512} },
7312 .block_erase = spi_block_erase_db,
7313 }, {
7314 .eraseblocks = { {64 * 1024, 2} },
7315 .block_erase = spi_block_erase_d8,
7316 }
7317 },
7318 .printlock = spi_prettyprint_status_register_default_welwip,
7319 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7320 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7321 .read = spi_chip_read, /* Fast read (0x0B) supported */
7322 .voltage = {2700, 3600},
7323 },
7324
7325 {
7326 .vendor = "Micron/Numonyx/ST",
7327 .name = "M45PE20",
7328 .bustype = BUS_SPI,
7329 .manufacture_id = ST_ID,
7330 .model_id = ST_M45PE20,
7331 .total_size = 256,
7332 .page_size = 256,
7333 .tested = TEST_UNTESTED,
7334 .probe = probe_spi_rdid,
7335 .probe_timing = TIMING_ZERO,
7336 .block_erasers = {
7337 {
7338 .eraseblocks = { {256, 1024} },
7339 .block_erase = spi_block_erase_db,
7340 }, {
7341 .eraseblocks = { {64 * 1024, 4} },
7342 .block_erase = spi_block_erase_d8,
7343 }
7344 },
7345 .printlock = spi_prettyprint_status_register_default_welwip,
7346 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7347 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7348 .read = spi_chip_read, /* Fast read (0x0B) supported */
7349 .voltage = {2700, 3600},
7350 },
7351
7352 {
7353 .vendor = "Micron/Numonyx/ST",
7354 .name = "M45PE40",
7355 .bustype = BUS_SPI,
7356 .manufacture_id = ST_ID,
7357 .model_id = ST_M45PE40,
7358 .total_size = 512,
7359 .page_size = 256,
7360 .tested = TEST_UNTESTED,
7361 .probe = probe_spi_rdid,
7362 .probe_timing = TIMING_ZERO,
7363 .block_erasers = {
7364 {
7365 .eraseblocks = { {256, 2048} },
7366 .block_erase = spi_block_erase_db,
7367 }, {
7368 .eraseblocks = { {64 * 1024, 8} },
7369 .block_erase = spi_block_erase_d8,
7370 }
7371 },
7372 .printlock = spi_prettyprint_status_register_default_welwip,
7373 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7374 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7375 .read = spi_chip_read, /* Fast read (0x0B) supported */
7376 .voltage = {2700, 3600},
7377 },
7378
7379 {
7380 .vendor = "Micron/Numonyx/ST",
7381 .name = "M45PE80",
7382 .bustype = BUS_SPI,
7383 .manufacture_id = ST_ID,
7384 .model_id = ST_M45PE80,
7385 .total_size = 1024,
7386 .page_size = 256,
7387 .tested = TEST_UNTESTED,
7388 .probe = probe_spi_rdid,
7389 .probe_timing = TIMING_ZERO,
7390 .block_erasers = {
7391 {
7392 .eraseblocks = { {256, 4096} },
7393 .block_erase = spi_block_erase_db,
7394 }, {
7395 .eraseblocks = { {64 * 1024, 16} },
7396 .block_erase = spi_block_erase_d8,
7397 }
7398 },
7399 .printlock = spi_prettyprint_status_register_default_welwip,
7400 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7401 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7402 .read = spi_chip_read, /* Fast read (0x0B) supported */
7403 .voltage = {2700, 3600},
7404 },
7405
7406 {
7407 .vendor = "Micron/Numonyx/ST",
7408 .name = "M45PE16",
7409 .bustype = BUS_SPI,
7410 .manufacture_id = ST_ID,
7411 .model_id = ST_M45PE16,
7412 .total_size = 2048,
7413 .page_size = 256,
7414 .tested = TEST_UNTESTED,
7415 .probe = probe_spi_rdid,
7416 .probe_timing = TIMING_ZERO,
7417 .block_erasers = {
7418 {
7419 .eraseblocks = { {256, 8192} },
7420 .block_erase = spi_block_erase_db,
7421 }, {
7422 .eraseblocks = { {64 * 1024, 32} },
7423 .block_erase = spi_block_erase_d8,
7424 }
7425 },
7426 .printlock = spi_prettyprint_status_register_default_welwip,
7427 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7428 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7429 .read = spi_chip_read, /* Fast read (0x0B) supported */
7430 .voltage = {2700, 3600},
7431 },
7432
7433 {
7434 .vendor = "Micron/Numonyx/ST",
7435 .name = "N25Q016",
7436 .bustype = BUS_SPI,
7437 .manufacture_id = ST_ID,
7438 .model_id = ST_N25Q016__1E,
7439 .total_size = 2048,
7440 .page_size = 256,
7441 /* supports SFDP */
7442 /* OTP: 64B total; read 0x4B, write 0x42 */
7443 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7444 .tested = TEST_UNTESTED,
7445 .probe = probe_spi_rdid,
7446 .probe_timing = TIMING_ZERO,
7447 .block_erasers =
7448 {
7449 {
7450 .eraseblocks = { {4 * 1024, 512} },
7451 .block_erase = spi_block_erase_20,
7452 }, {
7453 .eraseblocks = { {32 * 1024, 64} },
7454 .block_erase = spi_block_erase_52,
7455 }, {
7456 .eraseblocks = { {64 * 1024, 32} },
7457 .block_erase = spi_block_erase_d8,
7458 }, {
7459 .eraseblocks = { {2 * 1024 * 1024, 1} },
7460 .block_erase = spi_block_erase_c7,
7461 }
7462 },
7463 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7464 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7465 .write = spi_chip_write_256, /* Multi I/O supported */
7466 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7467 .voltage = {1700, 2000},
7468 },
7469
7470 {
7471 .vendor = "Micron/Numonyx/ST",
7472 .name = "N25Q032..1E",
7473 .bustype = BUS_SPI,
7474 .manufacture_id = ST_ID,
7475 .model_id = ST_N25Q032__1E,
7476 .total_size = 4096,
7477 .page_size = 256,
7478 /* supports SFDP */
7479 /* OTP: 64B total; read 0x4B, write 0x42 */
7480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7481 .tested = TEST_UNTESTED,
7482 .probe = probe_spi_rdid,
7483 .probe_timing = TIMING_ZERO,
7484 .block_erasers =
7485 {
7486 {
7487 .eraseblocks = { {4 * 1024, 1024} },
7488 .block_erase = spi_block_erase_20,
7489 }, {
7490 .eraseblocks = { {64 * 1024, 64} },
7491 .block_erase = spi_block_erase_d8,
7492 }, {
7493 .eraseblocks = { {4 * 1024 * 1024, 1} },
7494 .block_erase = spi_block_erase_c7,
7495 }
7496 },
7497 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7498 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7499 .write = spi_chip_write_256, /* Multi I/O supported */
7500 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7501 .voltage = {1700, 2000},
7502 },
7503
7504 {
7505 .vendor = "Micron/Numonyx/ST",
7506 .name = "N25Q032..3E",
7507 .bustype = BUS_SPI,
7508 .manufacture_id = ST_ID,
7509 .model_id = ST_N25Q032__3E,
7510 .total_size = 4096,
7511 .page_size = 256,
7512 /* supports SFDP */
7513 /* OTP: 64B total; read 0x4B, write 0x42 */
7514 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7515 .tested = TEST_OK_PREW,
7516 .probe = probe_spi_rdid,
7517 .probe_timing = TIMING_ZERO,
7518 .block_erasers =
7519 {
7520 {
7521 .eraseblocks = { {4 * 1024, 1024} },
7522 .block_erase = spi_block_erase_20,
7523 }, {
7524 .eraseblocks = { {64 * 1024, 64} },
7525 .block_erase = spi_block_erase_d8,
7526 }, {
7527 .eraseblocks = { {4 * 1024 * 1024, 1} },
7528 .block_erase = spi_block_erase_c7,
7529 }
7530 },
7531 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7532 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7533 .write = spi_chip_write_256, /* Multi I/O supported */
7534 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7535 .voltage = {2700, 3600},
7536 },
7537
7538 {
7539 .vendor = "Micron/Numonyx/ST",
7540 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7541 .bustype = BUS_SPI,
7542 .manufacture_id = ST_ID,
7543 .model_id = ST_N25Q064__1E,
7544 .total_size = 8192,
7545 .page_size = 256,
7546 /* supports SFDP */
7547 /* OTP: 64B total; read 0x4B, write 0x42 */
7548 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7549 .tested = TEST_UNTESTED,
7550 .probe = probe_spi_rdid,
7551 .probe_timing = TIMING_ZERO,
7552 .block_erasers =
7553 {
7554 {
7555 .eraseblocks = { {4 * 1024, 2048 } },
7556 .block_erase = spi_block_erase_20,
7557 }, {
7558 .eraseblocks = { {64 * 1024, 128} },
7559 .block_erase = spi_block_erase_d8,
7560 }, {
7561 .eraseblocks = { {8 * 1024 * 1024, 1} },
7562 .block_erase = spi_block_erase_c7,
7563 }
7564 },
7565 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7566 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7567 .write = spi_chip_write_256, /* Multi I/O supported */
7568 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7569 .voltage = {1700, 2000},
7570 },
7571
7572 {
7573 .vendor = "Micron/Numonyx/ST",
7574 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7575 .bustype = BUS_SPI,
7576 .manufacture_id = ST_ID,
7577 .model_id = ST_N25Q064__3E,
7578 .total_size = 8192,
7579 .page_size = 256,
7580 /* supports SFDP */
7581 /* OTP: 64B total; read 0x4B, write 0x42 */
7582 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7583 .tested = TEST_OK_PREW,
7584 .probe = probe_spi_rdid,
7585 .probe_timing = TIMING_ZERO,
7586 .block_erasers =
7587 {
7588 {
7589 .eraseblocks = { {4 * 1024, 2048 } },
7590 .block_erase = spi_block_erase_20,
7591 }, {
7592 .eraseblocks = { {64 * 1024, 128} },
7593 .block_erase = spi_block_erase_d8,
7594 }, {
7595 .eraseblocks = { {8 * 1024 * 1024, 1} },
7596 .block_erase = spi_block_erase_c7,
7597 }
7598 },
7599 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7600 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7601 .write = spi_chip_write_256, /* Multi I/O supported */
7602 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7603 .voltage = {2700, 3600},
7604 },
7605
7606 {
7607 .vendor = "Micron/Numonyx/ST",
7608 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7609 .bustype = BUS_SPI,
7610 .manufacture_id = ST_ID,
7611 .model_id = ST_N25Q128__1E,
7612 .total_size = 16384,
7613 .page_size = 256,
7614 /* supports SFDP */
7615 /* OTP: 64B total; read 0x4B, write 0x42 */
7616 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7617 .tested = TEST_UNTESTED,
7618 .probe = probe_spi_rdid,
7619 .probe_timing = TIMING_ZERO,
7620 .block_erasers = {
7621 {
7622 .eraseblocks = { {4 * 1024, 4096 } },
7623 .block_erase = spi_block_erase_20,
7624 }, {
7625 .eraseblocks = { {64 * 1024, 256} },
7626 .block_erase = spi_block_erase_d8,
7627 }, {
7628 .eraseblocks = { {16384 * 1024, 1} },
7629 .block_erase = spi_block_erase_c7,
7630 }
7631 },
7632 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7633 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7634 .write = spi_chip_write_256, /* Multi I/O supported */
7635 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7636 .voltage = {1700, 2000},
7637 },
7638
7639 {
7640 .vendor = "Micron/Numonyx/ST",
7641 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7642 .bustype = BUS_SPI,
7643 .manufacture_id = ST_ID,
7644 .model_id = ST_N25Q128__3E,
7645 .total_size = 16384,
7646 .page_size = 256,
7647 /* supports SFDP */
7648 /* OTP: 64B total; read 0x4B, write 0x42 */
7649 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7650 .tested = TEST_OK_PREW,
7651 .probe = probe_spi_rdid,
7652 .probe_timing = TIMING_ZERO,
7653 .block_erasers = {
7654 {
7655 .eraseblocks = { {4 * 1024, 4096 } },
7656 .block_erase = spi_block_erase_20,
7657 }, {
7658 .eraseblocks = { {64 * 1024, 256} },
7659 .block_erase = spi_block_erase_d8,
7660 }, {
7661 .eraseblocks = { {16384 * 1024, 1} },
7662 .block_erase = spi_block_erase_c7,
7663 }
7664 },
7665 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7666 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7667 .write = spi_chip_write_256, /* Multi I/O supported */
7668 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7669 .voltage = {2700, 3600},
7670 },
7671
7672 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00007673 .vendor = "MoselVitelic",
7674 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007675 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007676 .manufacture_id = SYNCMOS_MVC_ID,
7677 .model_id = MVC_V29C51000B,
7678 .total_size = 64,
7679 .page_size = 512,
7680 .feature_bits = FEATURE_EITHER_RESET,
7681 .tested = TEST_UNTESTED,
7682 .probe = probe_jedec,
7683 .probe_timing = TIMING_ZERO,
7684 .block_erasers =
7685 {
7686 {
7687 .eraseblocks = { {512, 128} },
7688 .block_erase = erase_sector_jedec,
7689 }, {
7690 .eraseblocks = { {64 * 1024, 1} },
7691 .block_erase = erase_chip_block_jedec,
7692 },
7693 },
7694 .write = write_jedec_1,
7695 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007696 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007697 },
7698
7699 {
7700 .vendor = "MoselVitelic",
7701 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007702 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007703 .manufacture_id = SYNCMOS_MVC_ID,
7704 .model_id = MVC_V29C51000T,
7705 .total_size = 64,
7706 .page_size = 512,
7707 .feature_bits = FEATURE_EITHER_RESET,
7708 .tested = TEST_UNTESTED,
7709 .probe = probe_jedec,
7710 .probe_timing = TIMING_ZERO,
7711 .block_erasers =
7712 {
7713 {
7714 .eraseblocks = { {512, 128} },
7715 .block_erase = erase_sector_jedec,
7716 }, {
7717 .eraseblocks = { {64 * 1024, 1} },
7718 .block_erase = erase_chip_block_jedec,
7719 },
7720 },
7721 .write = write_jedec_1,
7722 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007723 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007724 },
7725
7726 {
7727 .vendor = "MoselVitelic",
7728 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007729 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007730 .manufacture_id = SYNCMOS_MVC_ID,
7731 .model_id = MVC_V29C51400B,
7732 .total_size = 512,
7733 .page_size = 1024,
7734 .feature_bits = FEATURE_EITHER_RESET,
7735 .tested = TEST_UNTESTED,
7736 .probe = probe_jedec,
7737 .probe_timing = TIMING_ZERO,
7738 .block_erasers =
7739 {
7740 {
7741 .eraseblocks = { {1024, 512} },
7742 .block_erase = erase_sector_jedec,
7743 }, {
7744 .eraseblocks = { {512 * 1024, 1} },
7745 .block_erase = erase_chip_block_jedec,
7746 },
7747 },
7748 .write = write_jedec_1,
7749 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007750 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007751 },
7752
7753 {
7754 .vendor = "MoselVitelic",
7755 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007756 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007757 .manufacture_id = SYNCMOS_MVC_ID,
7758 .model_id = MVC_V29C51400T,
7759 .total_size = 512,
7760 .page_size = 1024,
7761 .feature_bits = FEATURE_EITHER_RESET,
7762 .tested = TEST_UNTESTED,
7763 .probe = probe_jedec,
7764 .probe_timing = TIMING_ZERO,
7765 .block_erasers =
7766 {
7767 {
7768 .eraseblocks = { {1024, 512} },
7769 .block_erase = erase_sector_jedec,
7770 }, {
7771 .eraseblocks = { {512 * 1024, 1} },
7772 .block_erase = erase_chip_block_jedec,
7773 },
7774 },
7775 .write = write_jedec_1,
7776 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007777 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007778 },
7779
7780 {
7781 .vendor = "MoselVitelic",
7782 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007783 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007784 .manufacture_id = SYNCMOS_MVC_ID,
7785 .model_id = MVC_V29LC51000,
7786 .total_size = 64,
7787 .page_size = 512,
7788 .feature_bits = FEATURE_EITHER_RESET,
7789 .tested = TEST_UNTESTED,
7790 .probe = probe_jedec,
7791 .probe_timing = TIMING_ZERO,
7792 .block_erasers =
7793 {
7794 {
7795 .eraseblocks = { {512, 128} },
7796 .block_erase = erase_sector_jedec,
7797 }, {
7798 .eraseblocks = { {64 * 1024, 1} },
7799 .block_erase = erase_chip_block_jedec,
7800 },
7801 },
7802 .write = write_jedec_1,
7803 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007804 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007805 },
7806
7807 {
7808 .vendor = "MoselVitelic",
7809 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007810 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007811 .manufacture_id = SYNCMOS_MVC_ID,
7812 .model_id = MVC_V29LC51001,
7813 .total_size = 128,
7814 .page_size = 512,
7815 .feature_bits = FEATURE_EITHER_RESET,
7816 .tested = TEST_UNTESTED,
7817 .probe = probe_jedec,
7818 .probe_timing = TIMING_ZERO,
7819 .block_erasers =
7820 {
7821 {
7822 .eraseblocks = { {512, 256} },
7823 .block_erase = erase_sector_jedec,
7824 }, {
7825 .eraseblocks = { {128 * 1024, 1} },
7826 .block_erase = erase_chip_block_jedec,
7827 },
7828 },
7829 .write = write_jedec_1,
7830 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007831 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007832 },
7833
7834 {
7835 .vendor = "MoselVitelic",
7836 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007837 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007838 .manufacture_id = SYNCMOS_MVC_ID,
7839 .model_id = MVC_V29LC51002,
7840 .total_size = 256,
7841 .page_size = 512,
7842 .feature_bits = FEATURE_EITHER_RESET,
7843 .tested = TEST_UNTESTED,
7844 .probe = probe_jedec,
7845 .probe_timing = TIMING_ZERO,
7846 .block_erasers =
7847 {
7848 {
7849 .eraseblocks = { {512, 512} },
7850 .block_erase = erase_sector_jedec,
7851 }, {
7852 .eraseblocks = { {256 * 1024, 1} },
7853 .block_erase = erase_chip_block_jedec,
7854 },
7855 },
7856 .write = write_jedec_1,
7857 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007858 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007859 },
7860
7861 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00007862 .vendor = "Nantronics",
7863 .name = "N25S10",
7864 .bustype = BUS_SPI,
7865 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7866 .model_id = NANTRONICS_N25S10,
7867 .total_size = 128,
7868 .page_size = 256,
7869 .feature_bits = FEATURE_WRSR_WREN,
7870 .tested = TEST_UNTESTED,
7871 .probe = probe_spi_rdid,
7872 .probe_timing = TIMING_ZERO,
7873 .block_erasers =
7874 {
7875 {
7876 .eraseblocks = { {4 * 1024, 32} },
7877 .block_erase = spi_block_erase_20,
7878 }, {
7879 .eraseblocks = { {4 * 1024, 32} },
7880 .block_erase = spi_block_erase_d7,
7881 }, {
7882 .eraseblocks = { {32 * 1024, 4} },
7883 .block_erase = spi_block_erase_52,
7884 }, {
7885 .eraseblocks = { {64 * 1024, 2} },
7886 .block_erase = spi_block_erase_d8,
7887 }, {
7888 .eraseblocks = { {128 * 1024, 1} },
7889 .block_erase = spi_block_erase_60,
7890 }, {
7891 .eraseblocks = { {128 * 1024, 1} },
7892 .block_erase = spi_block_erase_c7,
7893 }
7894 },
7895 .printlock = spi_prettyprint_status_register_default_bp3,
7896 .unlock = spi_disable_blockprotect_bp3_srwd,
7897 .write = spi_chip_write_256,
7898 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7899 .voltage = {2700, 3600},
7900 },
7901
7902 {
7903 .vendor = "Nantronics",
7904 .name = "N25S20",
7905 .bustype = BUS_SPI,
7906 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7907 .model_id = NANTRONICS_N25S20,
7908 .total_size = 256,
7909 .page_size = 256,
7910 .feature_bits = FEATURE_WRSR_WREN,
7911 .tested = TEST_UNTESTED,
7912 .probe = probe_spi_rdid,
7913 .probe_timing = TIMING_ZERO,
7914 .block_erasers =
7915 {
7916 {
7917 .eraseblocks = { {4 * 1024, 64} },
7918 .block_erase = spi_block_erase_20,
7919 }, {
7920 .eraseblocks = { {4 * 1024, 64} },
7921 .block_erase = spi_block_erase_d7,
7922 }, {
7923 .eraseblocks = { {32 * 1024, 8} },
7924 .block_erase = spi_block_erase_52,
7925 }, {
7926 .eraseblocks = { {64 * 1024, 4} },
7927 .block_erase = spi_block_erase_d8,
7928 }, {
7929 .eraseblocks = { {256 * 1024, 1} },
7930 .block_erase = spi_block_erase_60,
7931 }, {
7932 .eraseblocks = { {256 * 1024, 1} },
7933 .block_erase = spi_block_erase_c7,
7934 }
7935 },
7936 .printlock = spi_prettyprint_status_register_default_bp3,
7937 .unlock = spi_disable_blockprotect_bp3_srwd,
7938 .write = spi_chip_write_256,
7939 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7940 .voltage = {2700, 3600},
7941 },
7942
7943 {
7944 .vendor = "Nantronics",
7945 .name = "N25S40",
7946 .bustype = BUS_SPI,
7947 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7948 .model_id = NANTRONICS_N25S40,
7949 .total_size = 512,
7950 .page_size = 256,
7951 .feature_bits = FEATURE_WRSR_WREN,
7952 .tested = TEST_UNTESTED,
7953 .probe = probe_spi_rdid,
7954 .probe_timing = TIMING_ZERO,
7955 .block_erasers =
7956 {
7957 {
7958 .eraseblocks = { {4 * 1024, 128} },
7959 .block_erase = spi_block_erase_20,
7960 }, {
7961 .eraseblocks = { {4 * 1024, 128} },
7962 .block_erase = spi_block_erase_d7,
7963 }, {
7964 .eraseblocks = { {32 * 1024, 16} },
7965 .block_erase = spi_block_erase_52,
7966 }, {
7967 .eraseblocks = { {64 * 1024, 8} },
7968 .block_erase = spi_block_erase_d8,
7969 }, {
7970 .eraseblocks = { {512 * 1024, 1} },
7971 .block_erase = spi_block_erase_60,
7972 }, {
7973 .eraseblocks = { {512 * 1024, 1} },
7974 .block_erase = spi_block_erase_c7,
7975 }
7976 },
7977 .printlock = spi_prettyprint_status_register_default_bp3,
7978 .unlock = spi_disable_blockprotect_bp3_srwd,
7979 .write = spi_chip_write_256,
7980 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7981 .voltage = {2700, 3600},
7982 },
7983
7984 {
7985 .vendor = "Nantronics",
7986 .name = "N25S80",
7987 .bustype = BUS_SPI,
7988 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7989 .model_id = NANTRONICS_N25S80,
7990 .total_size = 1024,
7991 .page_size = 256,
7992 .feature_bits = FEATURE_WRSR_WREN,
7993 .tested = TEST_UNTESTED,
7994 .probe = probe_spi_rdid,
7995 .probe_timing = TIMING_ZERO,
7996 .block_erasers =
7997 {
7998 {
7999 .eraseblocks = { {4 * 1024, 256} },
8000 .block_erase = spi_block_erase_20,
8001 }, {
8002 .eraseblocks = { {32 * 1024, 32} },
8003 .block_erase = spi_block_erase_52,
8004 }, {
8005 .eraseblocks = { {64 * 1024, 16} },
8006 .block_erase = spi_block_erase_d8,
8007 }, {
8008 .eraseblocks = { {1024 * 1024, 1} },
8009 .block_erase = spi_block_erase_60,
8010 }, {
8011 .eraseblocks = { {1024 * 1024, 1} },
8012 .block_erase = spi_block_erase_c7,
8013 }
8014 },
8015 .printlock = spi_prettyprint_status_register_default_bp3,
8016 .unlock = spi_disable_blockprotect_bp3_srwd,
8017 .write = spi_chip_write_256,
8018 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8019 .voltage = {2700, 3600},
8020 },
8021
8022 {
8023 .vendor = "Nantronics",
8024 .name = "N25S16",
8025 .bustype = BUS_SPI,
8026 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8027 .model_id = NANTRONICS_N25S16,
8028 .total_size = 2048,
8029 .page_size = 256,
8030 .feature_bits = FEATURE_WRSR_WREN,
8031 .tested = TEST_UNTESTED,
8032 .probe = probe_spi_rdid,
8033 .probe_timing = TIMING_ZERO,
8034 .block_erasers =
8035 {
8036 {
8037 .eraseblocks = { {4 * 1024, 512} },
8038 .block_erase = spi_block_erase_20,
8039 }, {
8040 .eraseblocks = { {64 * 1024, 32} },
8041 .block_erase = spi_block_erase_d8,
8042 }, {
8043 .eraseblocks = { {2048 * 1024, 1} },
8044 .block_erase = spi_block_erase_60,
8045 }, {
8046 .eraseblocks = { {2048 * 1024, 1} },
8047 .block_erase = spi_block_erase_c7,
8048 }
8049 },
8050 .printlock = spi_prettyprint_status_register_default_bp3,
8051 .unlock = spi_disable_blockprotect_bp3_srwd,
8052 .write = spi_chip_write_256,
8053 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8054 .voltage = {2700, 3600},
8055 },
8056
8057 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008058 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00008059 .name = "Pm25LD256C",
8060 .bustype = BUS_SPI,
8061 .manufacture_id = PMC_ID,
8062 .model_id = PMC_PM25LD256C,
8063 .total_size = 32,
8064 .page_size = 256,
8065 .feature_bits = FEATURE_WRSR_WREN,
8066 .tested = TEST_UNTESTED,
8067 .probe = probe_spi_rdid,
8068 .probe_timing = TIMING_ZERO,
8069 .block_erasers =
8070 {
8071 {
8072 .eraseblocks = { {4 * 1024, 8} },
8073 .block_erase = spi_block_erase_20,
8074 }, {
8075 .eraseblocks = { {4 * 1024, 8} },
8076 .block_erase = spi_block_erase_d7,
8077 }, {
8078 .eraseblocks = { {32 * 1024, 1} },
8079 .block_erase = spi_block_erase_d8,
8080 }, {
8081 .eraseblocks = { {32 * 1024, 1} },
8082 .block_erase = spi_block_erase_60,
8083 }, {
8084 .eraseblocks = { {32 * 1024, 1} },
8085 .block_erase = spi_block_erase_c7,
8086 }
8087 },
8088 .printlock = spi_prettyprint_status_register_default_bp2,
8089 .unlock = spi_disable_blockprotect,
8090 .write = spi_chip_write_256,
8091 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8092 .voltage = {2700, 3600},
8093 },
8094 {
8095 .vendor = "PMC",
8096 .name = "Pm25LD512(C)",
8097 .bustype = BUS_SPI,
8098 .manufacture_id = PMC_ID,
8099 .model_id = PMC_PM25LD512,
8100 .total_size = 64,
8101 .page_size = 256,
8102 .feature_bits = FEATURE_WRSR_WREN,
8103 .tested = TEST_OK_PREW,
8104 .probe = probe_spi_rdid,
8105 .probe_timing = TIMING_ZERO,
8106 .block_erasers =
8107 {
8108 {
8109 .eraseblocks = { {4 * 1024, 16} },
8110 .block_erase = spi_block_erase_20,
8111 }, {
8112 .eraseblocks = { {4 * 1024, 16} },
8113 .block_erase = spi_block_erase_d7,
8114 }, {
8115 .eraseblocks = { {32 * 1024, 2} },
8116 .block_erase = spi_block_erase_d8,
8117 }, {
8118 .eraseblocks = { {64 * 1024, 1} },
8119 .block_erase = spi_block_erase_60,
8120 }, {
8121 .eraseblocks = { {64 * 1024, 1} },
8122 .block_erase = spi_block_erase_c7,
8123 }
8124 },
8125 .printlock = spi_prettyprint_status_register_default_bp2,
8126 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8127 .write = spi_chip_write_256,
8128 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8129 .voltage = {2300, 3600},
8130 },
8131
8132 {
8133 .vendor = "PMC",
8134 .name = "Pm25LD010(C)",
8135 .bustype = BUS_SPI,
8136 .manufacture_id = PMC_ID,
8137 .model_id = PMC_PM25LD010,
8138 .total_size = 128,
8139 .page_size = 256,
8140 .feature_bits = FEATURE_WRSR_WREN,
8141 .tested = TEST_UNTESTED,
8142 .probe = probe_spi_rdid,
8143 .probe_timing = TIMING_ZERO,
8144 .block_erasers =
8145 {
8146 {
8147 .eraseblocks = { {4 * 1024, 32} },
8148 .block_erase = spi_block_erase_20,
8149 }, {
8150 .eraseblocks = { {4 * 1024, 32} },
8151 .block_erase = spi_block_erase_d7,
8152 }, {
8153 .eraseblocks = { {32 * 1024, 4} },
8154 .block_erase = spi_block_erase_d8,
8155 }, {
8156 .eraseblocks = { {128 * 1024, 1} },
8157 .block_erase = spi_block_erase_60,
8158 }, {
8159 .eraseblocks = { {128 * 1024, 1} },
8160 .block_erase = spi_block_erase_c7,
8161 }
8162 },
8163 .printlock = spi_prettyprint_status_register_default_bp2,
8164 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8165 .write = spi_chip_write_256,
8166 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8167 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
8168 },
8169
8170 {
8171 .vendor = "PMC",
8172 .name = "Pm25LD020(C)",
8173 .bustype = BUS_SPI,
8174 .manufacture_id = PMC_ID,
8175 .model_id = PMC_PM25LD020,
8176 .total_size = 256,
8177 .page_size = 256,
8178 .feature_bits = FEATURE_WRSR_WREN,
8179 .tested = TEST_UNTESTED,
8180 .probe = probe_spi_rdid,
8181 .probe_timing = TIMING_ZERO,
8182 .block_erasers =
8183 {
8184 {
8185 .eraseblocks = { {4 * 1024, 64} },
8186 .block_erase = spi_block_erase_20,
8187 }, {
8188 .eraseblocks = { {4 * 1024, 64} },
8189 .block_erase = spi_block_erase_d7,
8190 }, {
8191 .eraseblocks = { {64 * 1024, 4} },
8192 .block_erase = spi_block_erase_d8,
8193 }, {
8194 .eraseblocks = { {256 * 1024, 1} },
8195 .block_erase = spi_block_erase_60,
8196 }, {
8197 .eraseblocks = { {256 * 1024, 1} },
8198 .block_erase = spi_block_erase_c7,
8199 }
8200 },
8201 .printlock = spi_prettyprint_status_register_default_bp2,
8202 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8203 .write = spi_chip_write_256,
8204 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8205 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
8206 },
8207
8208 {
8209 .vendor = "PMC",
8210 .name = "Pm25LD040(C)",
8211 .bustype = BUS_SPI,
8212 .manufacture_id = PMC_ID,
8213 .model_id = PMC_PM25LV040,
8214 .total_size = 512,
8215 .page_size = 256,
8216 .feature_bits = FEATURE_WRSR_WREN,
8217 .tested = TEST_UNTESTED,
8218 .probe = probe_spi_rdid,
8219 .probe_timing = TIMING_ZERO,
8220 .block_erasers =
8221 {
8222 {
8223 .eraseblocks = { {4 * 1024, 128} },
8224 .block_erase = spi_block_erase_20,
8225 }, {
8226 .eraseblocks = { {4 * 1024, 128} },
8227 .block_erase = spi_block_erase_d7,
8228 }, {
8229 .eraseblocks = { {64 * 1024, 8} },
8230 .block_erase = spi_block_erase_d8,
8231 }, {
8232 .eraseblocks = { {512 * 1024, 1} },
8233 .block_erase = spi_block_erase_60,
8234 }, {
8235 .eraseblocks = { {512 * 1024, 1} },
8236 .block_erase = spi_block_erase_c7,
8237 }
8238 },
8239 .printlock = spi_prettyprint_status_register_default_bp2,
8240 .unlock = spi_disable_blockprotect,
8241 .write = spi_chip_write_256,
8242 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8243 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
8244 },
8245
8246{
8247 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008248 .name = "Pm25LV512(A)",
8249 .bustype = BUS_SPI,
8250 .manufacture_id = PMC_ID,
8251 .model_id = PMC_PM25LV512,
8252 .total_size = 64,
8253 .page_size = 256,
8254 .feature_bits = FEATURE_WRSR_WREN,
8255 .tested = TEST_UNTESTED,
8256 .probe = probe_spi_res3,
8257 .probe_timing = TIMING_ZERO,
8258 .block_erasers =
8259 {
8260 {
8261 .eraseblocks = { {4 * 1024, 16} },
8262 .block_erase = spi_block_erase_d7,
8263 }, {
8264 .eraseblocks = { {32 * 1024, 2} },
8265 .block_erase = spi_block_erase_d8,
8266 }, {
8267 .eraseblocks = { {64 * 1024, 1} },
8268 .block_erase = spi_block_erase_c7,
8269 }
8270 },
8271 .printlock = spi_prettyprint_status_register_default_bp1,
8272 .unlock = spi_disable_blockprotect,
8273 .write = spi_chip_write_256,
8274 .read = spi_chip_read, /* Fast read (0x0B) supported */
8275 .voltage = {2700, 3600},
8276 },
8277
8278 {
8279 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008280 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008281 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008282 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008283 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008284 .total_size = 128,
8285 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008286 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008287 .tested = TEST_UNTESTED,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008288 .probe = probe_spi_res3,
8289 .probe_timing = TIMING_ZERO,
8290 .block_erasers =
8291 {
8292 {
8293 .eraseblocks = { {4 * 1024, 32} },
8294 .block_erase = spi_block_erase_d7,
8295 }, {
8296 .eraseblocks = { {32 * 1024, 4} },
8297 .block_erase = spi_block_erase_d8,
8298 }, {
8299 .eraseblocks = { {128 * 1024, 1} },
8300 .block_erase = spi_block_erase_c7,
8301 }
8302 },
8303 .printlock = spi_prettyprint_status_register_default_bp1,
8304 .unlock = spi_disable_blockprotect,
8305 .write = spi_chip_write_256,
8306 .read = spi_chip_read, /* Fast read (0x0B) supported */
8307 .voltage = {2700, 3600},
8308 },
8309
8310 {
8311 .vendor = "PMC",
8312 .name = "Pm25LV010A",
8313 .bustype = BUS_SPI,
8314 .manufacture_id = PMC_ID,
8315 .model_id = PMC_PM25LV010,
8316 .total_size = 128,
8317 .page_size = 256,
8318 .feature_bits = FEATURE_WRSR_WREN,
8319 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008320 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008321 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008322 .block_erasers =
8323 {
8324 {
8325 .eraseblocks = { {4 * 1024, 32} },
8326 .block_erase = spi_block_erase_d7,
8327 }, {
8328 .eraseblocks = { {32 * 1024, 4} },
8329 .block_erase = spi_block_erase_d8,
8330 }, {
8331 .eraseblocks = { {128 * 1024, 1} },
8332 .block_erase = spi_block_erase_c7,
8333 }
8334 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008335 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008336 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008337 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008338 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008339 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008340 },
8341
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008342 {
8343 .vendor = "PMC",
8344 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008345 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008346 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008347 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008348 .total_size = 256,
8349 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008350 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008351 .tested = TEST_UNTESTED,
8352 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008353 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008354 .block_erasers =
8355 {
8356 {
8357 .eraseblocks = { {4 * 1024, 64} },
8358 .block_erase = spi_block_erase_d7,
8359 }, {
8360 .eraseblocks = { {64 * 1024, 4} },
8361 .block_erase = spi_block_erase_d8,
8362 }, {
8363 .eraseblocks = { {256 * 1024, 1} },
8364 .block_erase = spi_block_erase_c7,
8365 }
8366 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008367 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008368 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008369 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008370 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008371 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008372 },
8373
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008374 {
8375 .vendor = "PMC",
8376 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008377 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008378 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008379 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008380 .total_size = 512,
8381 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008382 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00008383 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008384 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008385 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008386 .block_erasers =
8387 {
8388 {
8389 .eraseblocks = { {4 * 1024, 128} },
8390 .block_erase = spi_block_erase_d7,
8391 }, {
8392 .eraseblocks = { {64 * 1024, 8} },
8393 .block_erase = spi_block_erase_d8,
8394 }, {
8395 .eraseblocks = { {512 * 1024, 1} },
8396 .block_erase = spi_block_erase_c7,
8397 }
8398 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008399 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008400 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008401 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008402 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008403 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008404 },
8405
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008406 {
8407 .vendor = "PMC",
8408 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008409 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008410 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008411 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008412 .total_size = 1024,
8413 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008414 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008415 .tested = TEST_UNTESTED,
8416 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008417 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008418 .block_erasers =
8419 {
8420 {
8421 .eraseblocks = { {4 * 1024, 256} },
8422 .block_erase = spi_block_erase_d7,
8423 }, {
8424 .eraseblocks = { {4 * 1024, 256} },
8425 .block_erase = spi_block_erase_20,
8426 }, {
8427 .eraseblocks = { {64 * 1024, 16} },
8428 .block_erase = spi_block_erase_d8,
8429 }, {
8430 .eraseblocks = { {1024 * 1024, 1} },
8431 .block_erase = spi_block_erase_60,
8432 }, {
8433 .eraseblocks = { {1024 * 1024, 1} },
8434 .block_erase = spi_block_erase_c7,
8435 }
8436 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008437 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008438 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008439 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008440 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008441 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008442 },
8443
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008444 {
8445 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008446 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008447 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008448 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008449 .model_id = PMC_PM25LV016B,
8450 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008451 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008452 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008453 .tested = TEST_UNTESTED,
8454 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008455 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008456 .block_erasers =
8457 {
8458 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008459 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00008460 .block_erase = spi_block_erase_d7,
8461 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008462 .eraseblocks = { {4 * 1024, 512} },
8463 .block_erase = spi_block_erase_20,
8464 }, {
8465 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00008466 .block_erase = spi_block_erase_d8,
8467 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008468 .eraseblocks = { {2 * 1024 * 1024, 1} },
8469 .block_erase = spi_block_erase_60,
8470 }, {
8471 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008472 .block_erase = spi_block_erase_c7,
8473 }
8474 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008475 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008476 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008477 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008478 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008479 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008480 },
8481
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008482 {
8483 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008484 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008485 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008486 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008487 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008488 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008489 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008490 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008491 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008492 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008493 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008494 .block_erasers =
8495 {
8496 {
8497 .eraseblocks = {
8498 {128 * 1024, 1},
8499 {96 * 1024, 1},
8500 {8 * 1024, 2},
8501 {16 * 1024, 1},
8502 },
Sean Nelson35727f72010-01-28 23:55:12 +00008503 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008504 }, {
8505 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008506 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008507 },
8508 },
Sean Nelson35727f72010-01-28 23:55:12 +00008509 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008510 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008511 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008512 },
8513
8514 {
8515 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008516 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008517 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008518 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008519 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008520 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008521 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008522 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008523 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00008524 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008525 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008526 .block_erasers =
8527 {
8528 {
8529 .eraseblocks = {
8530 {16 * 1024, 1},
8531 {8 * 1024, 2},
8532 {96 * 1024, 1},
8533 {128 * 1024, 1},
8534 },
Sean Nelson35727f72010-01-28 23:55:12 +00008535 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008536 }, {
8537 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008538 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008539 },
8540 },
Sean Nelson35727f72010-01-28 23:55:12 +00008541 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008542 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008543 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008544 },
8545
8546 {
8547 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008548 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008549 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008550 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008551 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008552 .total_size = 128,
8553 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00008554 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008555 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008556 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008557 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00008558 .block_erasers =
8559 {
8560 {
8561 .eraseblocks = { {4 * 1024, 32} },
8562 .block_erase = erase_sector_jedec,
8563 }, {
8564 .eraseblocks = { {64 * 1024, 2} },
8565 .block_erase = erase_block_jedec,
8566 }, {
8567 .eraseblocks = { {128 * 1024, 1} },
8568 .block_erase = erase_chip_block_jedec,
8569 }
8570 },
Sean Nelson35727f72010-01-28 23:55:12 +00008571 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008572 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008573 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008574 },
8575
8576 {
8577 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008578 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008579 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008580 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008581 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008582 .total_size = 256,
8583 .page_size = 4096,
8584 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8585 .tested = TEST_UNTESTED,
8586 .probe = probe_jedec,
8587 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8588 .block_erasers =
8589 {
8590 {
8591 .eraseblocks = { {4 * 1024, 64} },
8592 .block_erase = erase_sector_jedec,
8593 }, {
8594 .eraseblocks = { {64 * 1024, 4} },
8595 .block_erase = erase_block_jedec,
8596 }, {
8597 .eraseblocks = { {256 * 1024, 1} },
8598 .block_erase = erase_chip_block_jedec,
8599 }
8600 },
8601 .write = write_jedec_1,
8602 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008603 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008604 },
8605
8606 {
8607 .vendor = "PMC",
8608 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008609 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008610 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008611 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008612 .total_size = 512,
8613 .page_size = 4096,
8614 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008615 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008616 .probe = probe_jedec,
8617 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8618 .block_erasers =
8619 {
8620 {
8621 .eraseblocks = { {4 * 1024, 128} },
8622 .block_erase = erase_sector_jedec,
8623 }, {
8624 .eraseblocks = { {64 * 1024, 8} },
8625 .block_erase = erase_block_jedec,
8626 }, {
8627 .eraseblocks = { {512 * 1024, 1} },
8628 .block_erase = erase_chip_block_jedec,
8629 }
8630 },
8631 .write = write_jedec_1,
8632 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008633 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008634 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +00008635
8636 {
8637 .vendor = "PMC",
8638 .name = "Pm39LV512",
8639 .bustype = BUS_PARALLEL,
8640 .manufacture_id = PMC_ID_NOPREFIX,
8641 .model_id = PMC_PM39LV512,
8642 .total_size = 64,
8643 .page_size = 4096,
8644 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8645 .tested = TEST_OK_PREW,
8646 .probe = probe_jedec,
8647 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8648 .block_erasers =
8649 {
8650 {
8651 .eraseblocks = { {4 * 1024, 16} },
8652 .block_erase = erase_sector_jedec,
8653 }, {
8654 .eraseblocks = { {64 * 1024, 1} },
8655 .block_erase = erase_block_jedec,
8656 }, {
8657 .eraseblocks = { {64 * 1024, 1} },
8658 .block_erase = erase_chip_block_jedec,
8659 }
8660 },
8661 .write = write_jedec_1,
8662 .read = read_memmapped,
8663 .voltage = {2700, 3600},
8664 },
8665
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008666 {
8667 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008668 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008669 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008670 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008671 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008672 .total_size = 256,
8673 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008674 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunerd06d9412011-06-12 19:47:55 +00008675 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008676 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008677 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008678 .block_erasers =
8679 {
8680 {
8681 .eraseblocks = { {4 * 1024, 64} },
8682 .block_erase = erase_sector_jedec,
8683 }, {
8684 .eraseblocks = { {16 * 1024, 16} },
8685 .block_erase = erase_block_jedec,
8686 }, {
8687 .eraseblocks = { {256 * 1024, 1} },
8688 .block_erase = erase_chip_block_jedec,
8689 }
8690 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008691 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008692 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008693 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008694 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008695 },
8696
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008697 {
8698 .vendor = "PMC",
8699 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008700 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008701 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008702 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008703 .total_size = 512,
8704 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008705 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +00008706 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008707 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008708 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008709 .block_erasers =
8710 {
8711 {
8712 .eraseblocks = { {4 * 1024, 128} },
8713 .block_erase = erase_sector_jedec,
8714 }, {
8715 .eraseblocks = { {64 * 1024, 8} },
8716 .block_erase = erase_block_jedec,
8717 }, {
8718 .eraseblocks = { {512 * 1024, 1} },
8719 .block_erase = erase_chip_block_jedec,
8720 }
8721 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008722 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008723 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008724 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008725 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008726 },
8727
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008728 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00008729 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008730 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008731 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008732 .manufacture_id = SANYO_ID,
8733 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008734 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008735 .page_size = 256,
8736 .tested = TEST_UNTESTED,
8737 .probe = probe_spi_rdid,
8738 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008739 .block_erasers =
8740 {
8741 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008742 .eraseblocks = { {256, 1024} },
8743 .block_erase = spi_block_erase_db,
8744 }, {
8745 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +00008746 .block_erase = spi_block_erase_d8,
8747 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008748 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008749 .block_erase = spi_block_erase_c7,
8750 }
8751 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008752 .printlock = spi_prettyprint_status_register_default_welwip,
8753 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +00008754 .write = spi_chip_write_256,
8755 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008756 .voltage = {2700, 3600},
8757 },
8758
8759 {
8760 .vendor = "Sanyo",
8761 .name = "LE25FW403A",
8762 .bustype = BUS_SPI,
8763 .manufacture_id = SANYO_ID,
8764 .model_id = SANYO_LE25FW403A,
8765 .total_size = 512,
8766 .page_size = 256,
8767 .tested = TEST_UNTESTED,
8768 .probe = probe_spi_rdid,
8769 .probe_timing = TIMING_ZERO,
8770 .block_erasers = {
8771 {
8772 .eraseblocks = { {256, 2 * 1024} },
8773 .block_erase = spi_block_erase_db,
8774 }, {
8775 .eraseblocks = { {64 * 1024, 8} },
8776 .block_erase = spi_block_erase_d8,
8777 }, {
8778 .eraseblocks = { {512 * 1024, 1} },
8779 .block_erase = spi_block_erase_c7,
8780 }
8781 },
8782 .printlock = spi_prettyprint_status_register_default_welwip,
8783 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8784 .write = spi_chip_write_256,
8785 .read = spi_chip_read,
8786 .voltage = {2700, 3600},
8787 },
8788
8789 {
8790 .vendor = "Sanyo",
8791 .name = "LE25FW418A",
8792 .bustype = BUS_SPI,
8793 .manufacture_id = SANYO_ID,
8794 .model_id = SANYO_LE25FW418A,
8795 .total_size = 512,
8796 .page_size = 256,
8797 .feature_bits = FEATURE_WRSR_WREN,
8798 .tested = TEST_UNTESTED,
8799 .probe = probe_spi_res2,
8800 .probe_timing = TIMING_ZERO,
8801 .block_erasers = {
8802 {
8803 .eraseblocks = { {4 * 1024, 128} },
8804 .block_erase = spi_block_erase_d7,
8805 }, {
8806 .eraseblocks = { {64 * 1024, 8} },
8807 .block_erase = spi_block_erase_d8,
8808 }, {
8809 .eraseblocks = { {512 * 1024, 1} },
8810 .block_erase = spi_block_erase_c7,
8811 }
8812 },
8813 .printlock = spi_prettyprint_status_register_default_bp2,
8814 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8815 .write = spi_chip_write_256,
8816 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
8817 .voltage = {2700, 3600},
8818 },
8819
8820 {
8821 .vendor = "Sanyo",
8822 .name = "LE25FW806",
8823 .bustype = BUS_SPI,
8824 .manufacture_id = SANYO_ID,
8825 .model_id = SANYO_LE25FW806,
8826 .total_size = 1024,
8827 .page_size = 256,
8828 .feature_bits = FEATURE_WRSR_WREN,
8829 .tested = TEST_UNTESTED,
8830 .probe = probe_spi_res2,
8831 .probe_timing = TIMING_ZERO,
8832 .block_erasers = {
8833 {
8834 .eraseblocks = { {4 * 1024, 256} },
8835 .block_erase = spi_block_erase_20,
8836 }, {
8837 .eraseblocks = { {4 * 1024, 256} },
8838 .block_erase = spi_block_erase_d7,
8839 }, {
8840 .eraseblocks = { {64 * 1024, 16} },
8841 .block_erase = spi_block_erase_d8,
8842 }, {
8843 .eraseblocks = { {1024 * 1024, 1} },
8844 .block_erase = spi_block_erase_c7,
8845 }
8846 },
8847 .printlock = spi_prettyprint_status_register_default_bp2,
8848 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8849 .write = spi_chip_write_256,
8850 .read = spi_chip_read,
8851 .voltage = {2700, 3600},
8852 },
8853
8854 {
8855 .vendor = "Sanyo",
8856 .name = "LE25FW808",
8857 .bustype = BUS_SPI,
8858 .manufacture_id = SANYO_ID,
8859 .model_id = SANYO_LE25FW808,
8860 .total_size = 1024,
8861 .page_size = 256,
8862 .feature_bits = FEATURE_WRSR_WREN,
8863 .tested = TEST_UNTESTED,
8864 .probe = probe_spi_res2,
8865 .probe_timing = TIMING_ZERO,
8866 .block_erasers = {
8867 {
8868 .eraseblocks = { {8 * 1024, 128} },
8869 .block_erase = spi_block_erase_d7,
8870 }, {
8871 .eraseblocks = { {64 * 1024, 16} },
8872 .block_erase = spi_block_erase_d8,
8873 }, {
8874 .eraseblocks = { {1024 * 1024, 1} },
8875 .block_erase = spi_block_erase_c7,
8876 }
8877 },
8878 .printlock = spi_prettyprint_status_register_default_bp2,
8879 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8880 .write = spi_chip_write_256,
8881 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
8882 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +00008883 },
8884
8885 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008886 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +00008887 .name = "LH28F008BJT-BTLZ1",
8888 .bustype = BUS_PARALLEL,
8889 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +00008890 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +00008891 .total_size = 1024,
8892 .page_size = 64 * 1024,
8893 .tested = TEST_OK_PREW,
8894 .probe = probe_82802ab,
8895 .probe_timing = TIMING_ZERO,
8896 .block_erasers =
8897 {
8898 {
8899 .eraseblocks = {
8900 {8 * 1024, 8},
8901 {64 * 1024, 15}
8902 },
8903 .block_erase = erase_block_82802ab,
8904 }, {
8905 .eraseblocks = { {1024 * 1024, 1} },
8906 .block_erase = erase_sector_49lfxxxc,
8907 }
8908 },
8909 .unlock = unlock_lh28f008bjt,
8910 .write = write_82802ab,
8911 .read = read_memmapped,
8912 .voltage = {2700, 3600},
8913 },
8914
8915 {
8916 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008917 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008918 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008919 .manufacture_id = SHARP_ID,
8920 .model_id = SHARP_LHF00L04,
8921 .total_size = 1024,
8922 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00008923 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008924 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00008925 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008926 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008927 .block_erasers =
8928 {
8929 {
8930 .eraseblocks = {
8931 {64 * 1024, 15},
8932 {8 * 1024, 8}
8933 },
Sean Nelson28accc22010-03-19 18:47:06 +00008934 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008935 }, {
8936 .eraseblocks = {
8937 {1024 * 1024, 1}
8938 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00008939 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008940 },
8941 },
Sean Nelson28accc22010-03-19 18:47:06 +00008942 .unlock = unlock_82802ab,
8943 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008944 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008945 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008946 },
8947
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008948 {
8949 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +00008950 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008951 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00008952 .manufacture_id = SPANSION_ID,
8953 .model_id = SPANSION_S25FL004A,
8954 .total_size = 512,
8955 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008956 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00008957 .tested = TEST_UNTESTED,
8958 .probe = probe_spi_rdid,
8959 .probe_timing = TIMING_ZERO,
8960 .block_erasers =
8961 {
8962 {
8963 .eraseblocks = { {64 * 1024, 8} },
8964 .block_erase = spi_block_erase_d8,
8965 }, {
8966 .eraseblocks = { {512 * 1024, 1} },
8967 .block_erase = spi_block_erase_c7,
8968 }
8969 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008970 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00008971 .unlock = spi_disable_blockprotect,
8972 .write = spi_chip_write_256,
8973 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008974 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00008975 },
8976
8977 {
8978 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00008979 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008980 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +00008981 .manufacture_id = SPANSION_ID,
8982 .model_id = SPANSION_S25FL008A,
8983 .total_size = 1024,
8984 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008985 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00008986 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +00008987 .probe = probe_spi_rdid,
8988 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00008989 .block_erasers =
8990 {
8991 {
8992 .eraseblocks = { {64 * 1024, 16} },
8993 .block_erase = spi_block_erase_d8,
8994 }, {
8995 .eraseblocks = { {1024 * 1024, 1} },
8996 .block_erase = spi_block_erase_c7,
8997 }
8998 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008999 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009000 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00009001 .write = spi_chip_write_256,
9002 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009003 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +00009004 },
9005
9006 {
9007 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009008 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009009 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009010 .manufacture_id = SPANSION_ID,
9011 .model_id = SPANSION_S25FL016A,
9012 .total_size = 2048,
9013 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009014 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009015 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009016 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009017 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009018 .block_erasers =
9019 {
9020 {
9021 .eraseblocks = { {64 * 1024, 32} },
9022 .block_erase = spi_block_erase_d8,
9023 }, {
9024 .eraseblocks = { {2 * 1024 * 1024, 1} },
9025 .block_erase = spi_block_erase_c7,
9026 }
9027 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009028 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009029 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009030 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009031 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009032 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009033 },
9034
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009035 {
Rudy Hostf4e57772010-11-29 00:37:49 +00009036 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009037 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009038 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009039 .manufacture_id = SPANSION_ID,
9040 .model_id = SPANSION_S25FL032A,
9041 .total_size = 4096,
9042 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009043 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009044 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +00009045 .probe = probe_spi_rdid,
9046 .probe_timing = TIMING_ZERO,
9047 .block_erasers =
9048 {
9049 {
9050 .eraseblocks = { {64 * 1024, 64} },
9051 .block_erase = spi_block_erase_d8,
9052 }, {
9053 .eraseblocks = { {4 * 1024 * 1024, 1} },
9054 .block_erase = spi_block_erase_c7,
9055 }
9056 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009057 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009058 .unlock = spi_disable_blockprotect,
9059 .write = spi_chip_write_256,
9060 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009061 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009062 },
9063
9064 {
9065 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009066 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009067 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009068 .manufacture_id = SPANSION_ID,
9069 .model_id = SPANSION_S25FL064A,
9070 .total_size = 8192,
9071 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009072 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009073 .tested = TEST_OK_PREW,
9074 .probe = probe_spi_rdid,
9075 .probe_timing = TIMING_ZERO,
9076 .block_erasers =
9077 {
9078 {
9079 .eraseblocks = { {64 * 1024, 128} },
9080 .block_erase = spi_block_erase_d8,
9081 }, {
9082 .eraseblocks = { {8 * 1024 * 1024, 1} },
9083 .block_erase = spi_block_erase_c7,
9084 }
9085 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009086 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009087 .unlock = spi_disable_blockprotect,
9088 .write = spi_chip_write_256,
9089 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009090 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009091 },
9092
9093 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009094 .vendor = "Spansion",
9095 .name = "S25FL204K",
9096 .bustype = BUS_SPI,
9097 .manufacture_id = SPANSION_ID,
9098 .model_id = SPANSION_S25FL204,
9099 .total_size = 512,
9100 .page_size = 256,
9101 .feature_bits = FEATURE_WRSR_WREN,
9102 .tested = TEST_UNTESTED,
9103 .probe = probe_spi_rdid,
9104 .probe_timing = TIMING_ZERO,
9105 .block_erasers = {
9106 {
9107 .eraseblocks = { {4 * 1024, 128} },
9108 .block_erase = spi_block_erase_20,
9109 }, {
9110 .eraseblocks = { {64 * 1024, 8} },
9111 .block_erase = spi_block_erase_d8,
9112 }, {
9113 .eraseblocks = { { 512 * 1024, 1} },
9114 .block_erase = spi_block_erase_60,
9115 }, {
9116 .eraseblocks = { { 512 * 1024, 1} },
9117 .block_erase = spi_block_erase_c7,
9118 }
9119 },
9120 .printlock = spi_prettyprint_status_register_default_bp3,
9121 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9122 .write = spi_chip_write_256,
9123 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9124 .voltage = {2700, 3600},
9125 },
9126
9127 {
9128 .vendor = "Spansion",
9129 .name = "S25FL208K",
9130 .bustype = BUS_SPI,
9131 .manufacture_id = SPANSION_ID,
9132 .model_id = SPANSION_S25FL208,
9133 .total_size = 1024,
9134 .page_size = 256,
9135 .feature_bits = FEATURE_WRSR_WREN,
9136 .tested = TEST_UNTESTED,
9137 .probe = probe_spi_rdid,
9138 .probe_timing = TIMING_ZERO,
9139 .block_erasers = {
9140 {
9141 .eraseblocks = { {4 * 1024, 256} },
9142 .block_erase = spi_block_erase_20,
9143 }, {
9144 .eraseblocks = { {64 * 1024, 16} },
9145 .block_erase = spi_block_erase_d8,
9146 }, {
9147 .eraseblocks = { { 1024 * 1024, 1} },
9148 .block_erase = spi_block_erase_60,
9149 }, {
9150 .eraseblocks = { { 1024 * 1024, 1} },
9151 .block_erase = spi_block_erase_c7,
9152 }
9153 },
9154 .printlock = spi_prettyprint_status_register_default_bp3,
9155 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9156 .write = spi_chip_write_256,
9157 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9158 .voltage = {2700, 3600},
9159 },
9160
9161 {
9162 .vendor = "Spansion",
9163 .name = "S25FL116K/S25FL216K",
9164 .bustype = BUS_SPI,
9165 .manufacture_id = SPANSION_ID,
9166 .model_id = SPANSION_S25FL216,
9167 .total_size = 2048,
9168 .page_size = 256,
9169 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
9170 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9171 .tested = TEST_UNTESTED,
9172 .probe = probe_spi_rdid,
9173 .probe_timing = TIMING_ZERO,
9174 .block_erasers = {
9175 {
9176 .eraseblocks = { {4 * 1024, 512} },
9177 .block_erase = spi_block_erase_20,
9178 }, {
9179 .eraseblocks = { {64 * 1024, 32} },
9180 .block_erase = spi_block_erase_d8,
9181 }, {
9182 .eraseblocks = { { 2048 * 1024, 1} },
9183 .block_erase = spi_block_erase_60,
9184 }, {
9185 .eraseblocks = { { 2048 * 1024, 1} },
9186 .block_erase = spi_block_erase_c7,
9187 }
9188 },
9189 .printlock = spi_prettyprint_status_register_default_bp3,
9190 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9191 .write = spi_chip_write_256,
9192 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9193 .voltage = {2700, 3600},
9194 },
9195
9196 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00009197 .vendor = "Spansion",
9198 .name = "S25FL128S......0", /* uniform 256kB sectors */
9199 .bustype = BUS_SPI,
9200 .manufacture_id = SPANSION_ID,
9201 .model_id = SPANSION_S25FL128,
9202 .total_size = 16384,
9203 .page_size = 256,
9204 /* supports 4B addressing */
9205 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
9206 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9207 .tested = TEST_UNTESTED,
9208 .probe = probe_spi_rdid,
9209 .probe_timing = TIMING_ZERO,
9210 .block_erasers = {
9211 {
9212 .eraseblocks = { {4 * 1024, 4096} },
9213 .block_erase = spi_block_erase_20,
9214 }, {
9215 .eraseblocks = { {256 * 1024, 64} },
9216 .block_erase = spi_block_erase_d8,
9217 }, {
9218 .eraseblocks = { { 16384 * 1024, 1} },
9219 .block_erase = spi_block_erase_60,
9220 }, {
9221 .eraseblocks = { { 16384 * 1024, 1} },
9222 .block_erase = spi_block_erase_c7,
9223 }
9224 },
9225 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
9226 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
9227 .write = spi_chip_write_256, /* Multi I/O supported */
9228 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9229 .voltage = {2700, 3600},
9230 },
9231
9232 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009233 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +00009234 .name = "SST25LF040A",
9235 .bustype = BUS_SPI,
9236 .manufacture_id = SST_ID,
9237 .model_id = SST_SST25VF040_REMS,
9238 .total_size = 512,
9239 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009240 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +00009241 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +00009242 .probe = probe_spi_res2,
9243 .probe_timing = TIMING_ZERO,
9244 .block_erasers =
9245 {
9246 {
9247 .eraseblocks = { {4 * 1024, 128} },
9248 .block_erase = spi_block_erase_20,
9249 }, {
9250 .eraseblocks = { {32 * 1024, 16} },
9251 .block_erase = spi_block_erase_52,
9252 }, {
9253 .eraseblocks = { {512 * 1024, 1} },
9254 .block_erase = spi_block_erase_60,
9255 },
9256 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009257 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009258 .unlock = spi_disable_blockprotect,
9259 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9260 .read = spi_chip_read,
9261 .voltage = {3000, 3600},
9262 },
9263
9264 {
9265 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009266 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +00009267 .bustype = BUS_SPI,
9268 .manufacture_id = SST_ID,
9269 .model_id = SST_SST25VF080_REMS,
9270 .total_size = 1024,
9271 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009272 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +00009273 .tested = TEST_UNTESTED,
9274 .probe = probe_spi_res2,
9275 .probe_timing = TIMING_ZERO,
9276 .block_erasers =
9277 {
9278 {
9279 .eraseblocks = { {4 * 1024, 256} },
9280 .block_erase = spi_block_erase_20,
9281 }, {
9282 .eraseblocks = { {32 * 1024, 32} },
9283 .block_erase = spi_block_erase_52,
9284 }, {
9285 .eraseblocks = { {1024 * 1024, 1} },
9286 .block_erase = spi_block_erase_60,
9287 },
9288 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009289 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009290 .unlock = spi_disable_blockprotect,
9291 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9292 .read = spi_chip_read,
9293 .voltage = {3000, 3600},
9294 },
9295
9296 {
9297 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009298 .name = "SST25VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009299 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +00009300 .manufacture_id = SST_ID,
9301 .model_id = SST_SST25VF010_REMS,
9302 .total_size = 128,
9303 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009304 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +00009305 .tested = TEST_OK_PREW,
9306 .probe = probe_spi_rems,
9307 .probe_timing = TIMING_ZERO,
9308 .block_erasers =
9309 {
9310 {
9311 .eraseblocks = { {4 * 1024, 32} },
9312 .block_erase = spi_block_erase_20,
9313 }, {
9314 .eraseblocks = { {32 * 1024, 4} },
9315 .block_erase = spi_block_erase_52,
9316 }, {
9317 .eraseblocks = { {128 * 1024, 1} },
9318 .block_erase = spi_block_erase_60,
9319 },
9320 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009321 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +00009322 .unlock = spi_disable_blockprotect,
9323 .write = spi_chip_write_1,
9324 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009325 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +00009326 },
9327
9328 {
9329 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009330 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009331 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009332 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009333 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009334 .total_size = 2048,
9335 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009336 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +00009337 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009338 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009339 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009340 .block_erasers =
9341 {
9342 {
9343 .eraseblocks = { {4 * 1024, 512} },
9344 .block_erase = spi_block_erase_20,
9345 }, {
9346 .eraseblocks = { {32 * 1024, 64} },
9347 .block_erase = spi_block_erase_52,
9348 }, {
9349 .eraseblocks = { {64 * 1024, 32} },
9350 .block_erase = spi_block_erase_d8,
9351 }, {
9352 .eraseblocks = { {2 * 1024 * 1024, 1} },
9353 .block_erase = spi_block_erase_60,
9354 }, {
9355 .eraseblocks = { {2 * 1024 * 1024, 1} },
9356 .block_erase = spi_block_erase_c7,
9357 },
9358 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009359 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009360 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009361 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009362 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009363 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009364 },
9365
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009366 {
9367 .vendor = "SST",
9368 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009369 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009370 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009371 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009372 .total_size = 4096,
9373 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009374 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +00009375 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009376 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009377 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009378 .block_erasers =
9379 {
9380 {
9381 .eraseblocks = { {4 * 1024, 1024} },
9382 .block_erase = spi_block_erase_20,
9383 }, {
9384 .eraseblocks = { {32 * 1024, 128} },
9385 .block_erase = spi_block_erase_52,
9386 }, {
9387 .eraseblocks = { {64 * 1024, 64} },
9388 .block_erase = spi_block_erase_d8,
9389 }, {
9390 .eraseblocks = { {4 * 1024 * 1024, 1} },
9391 .block_erase = spi_block_erase_60,
9392 }, {
9393 .eraseblocks = { {4 * 1024 * 1024, 1} },
9394 .block_erase = spi_block_erase_c7,
9395 },
9396 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009397 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009398 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009399 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009400 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009401 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009402 },
9403
9404 {
9405 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009406 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009407 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009408 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009409 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009410 .total_size = 8192,
9411 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009412 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +00009413 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009414 .probe = probe_spi_rdid,
9415 .probe_timing = TIMING_ZERO,
9416 .block_erasers =
9417 {
9418 {
9419 .eraseblocks = { {4 * 1024, 2048} },
9420 .block_erase = spi_block_erase_20,
9421 }, {
9422 .eraseblocks = { {32 * 1024, 256} },
9423 .block_erase = spi_block_erase_52,
9424 }, {
9425 .eraseblocks = { {64 * 1024, 128} },
9426 .block_erase = spi_block_erase_d8,
9427 }, {
9428 .eraseblocks = { {8 * 1024 * 1024, 1} },
9429 .block_erase = spi_block_erase_60,
9430 }, {
9431 .eraseblocks = { {8 * 1024 * 1024, 1} },
9432 .block_erase = spi_block_erase_c7,
9433 },
9434 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009435 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009436 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009437 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009438 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009439 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009440 },
9441
9442 {
9443 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009444 .name = "SST25VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009445 .bustype = BUS_SPI,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009446 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009447 .model_id = SST_SST25VF040_REMS,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009448 .total_size = 512,
9449 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009450 .feature_bits = FEATURE_WRSR_EWSR,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009451 .tested = TEST_OK_PR,
9452 .probe = probe_spi_rems,
9453 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009454 .block_erasers =
9455 {
9456 {
9457 .eraseblocks = { {4 * 1024, 128} },
9458 .block_erase = spi_block_erase_20,
9459 }, {
9460 .eraseblocks = { {32 * 1024, 16} },
9461 .block_erase = spi_block_erase_52,
9462 }, {
9463 .eraseblocks = { {512 * 1024, 1} },
9464 .block_erase = spi_block_erase_60,
9465 },
9466 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009467 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009468 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009469 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009470 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009471 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009472 },
9473
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009474 {
9475 .vendor = "SST",
9476 .name = "SST25VF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009477 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009478 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009479 .model_id = SST_SST25VF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009480 .total_size = 512,
9481 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009482 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009483 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009484 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009485 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009486 .block_erasers =
9487 {
9488 {
9489 .eraseblocks = { {4 * 1024, 128} },
9490 .block_erase = spi_block_erase_20,
9491 }, {
9492 .eraseblocks = { {32 * 1024, 16} },
9493 .block_erase = spi_block_erase_52,
9494 }, {
9495 .eraseblocks = { {64 * 1024, 8} },
9496 .block_erase = spi_block_erase_d8,
9497 }, {
9498 .eraseblocks = { {512 * 1024, 1} },
9499 .block_erase = spi_block_erase_60,
9500 }, {
9501 .eraseblocks = { {512 * 1024, 1} },
9502 .block_erase = spi_block_erase_c7,
9503 },
9504 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009505 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009506 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009507 .write = spi_aai_write,
Zheng Bao0677dff2009-02-25 08:07:33 +00009508 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009509 .voltage = {2700, 3600},
Zheng Bao0677dff2009-02-25 08:07:33 +00009510 },
9511
9512 {
9513 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00009514 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009515 .bustype = BUS_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00009516 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009517 .model_id = SST_SST25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00009518 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009519 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009520 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009521 .tested = TEST_OK_PREW,
Peter Stugefd9217d2009-01-26 03:37:40 +00009522 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009523 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009524 .block_erasers =
9525 {
9526 {
9527 .eraseblocks = { {4 * 1024, 128} },
9528 .block_erase = spi_block_erase_20,
9529 }, {
9530 .eraseblocks = { {32 * 1024, 16} },
9531 .block_erase = spi_block_erase_52,
9532 }, {
9533 .eraseblocks = { {64 * 1024, 8} },
9534 .block_erase = spi_block_erase_d8,
9535 }, {
9536 .eraseblocks = { {512 * 1024, 1} },
9537 .block_erase = spi_block_erase_60,
9538 }, {
9539 .eraseblocks = { {512 * 1024, 1} },
9540 .block_erase = spi_block_erase_c7,
9541 },
9542 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009543 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009544 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009545 .write = spi_aai_write,
Peter Stugefd9217d2009-01-26 03:37:40 +00009546 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009547 .voltage = {2700, 3600},
Peter Stugefd9217d2009-01-26 03:37:40 +00009548 },
9549
9550 {
9551 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009552 .name = "SST25VF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009553 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009554 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009555 .model_id = SST_SST25VF080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009556 .total_size = 1024,
9557 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009558 .feature_bits = FEATURE_WRSR_EWSR,
John Schmergec965c2d2011-05-18 11:28:47 +00009559 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009560 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009561 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009562 .block_erasers =
9563 {
9564 {
9565 .eraseblocks = { {4 * 1024, 256} },
9566 .block_erase = spi_block_erase_20,
9567 }, {
9568 .eraseblocks = { {32 * 1024, 32} },
9569 .block_erase = spi_block_erase_52,
9570 }, {
9571 .eraseblocks = { {64 * 1024, 16} },
9572 .block_erase = spi_block_erase_d8,
9573 }, {
9574 .eraseblocks = { {1024 * 1024, 1} },
9575 .block_erase = spi_block_erase_60,
9576 }, {
9577 .eraseblocks = { {1024 * 1024, 1} },
9578 .block_erase = spi_block_erase_c7,
9579 },
9580 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009581 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009582 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009583 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009584 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009585 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009586 },
9587
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009588 {
9589 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +00009590 .name = "SST25WF512",
9591 .bustype = BUS_SPI,
9592 .manufacture_id = SST_ID,
9593 .model_id = SST_SST25WF512,
9594 .total_size = 64,
9595 .page_size = 256,
9596 .feature_bits = FEATURE_WRSR_EITHER,
9597 .tested = TEST_UNTESTED,
9598 .probe = probe_spi_rdid,
9599 .probe_timing = TIMING_ZERO,
9600 .block_erasers =
9601 {
9602 {
9603 .eraseblocks = { {4 * 1024, 16} },
9604 .block_erase = spi_block_erase_20,
9605 }, {
9606 .eraseblocks = { {32 * 1024, 2} },
9607 .block_erase = spi_block_erase_52,
9608 }, {
9609 .eraseblocks = { {1024 * 64, 1} },
9610 .block_erase = spi_block_erase_60,
9611 }, {
9612 .eraseblocks = { {1024 * 64, 1} },
9613 .block_erase = spi_block_erase_c7,
9614 },
9615 },
9616 .unlock = spi_disable_blockprotect,
9617 .write = spi_aai_write,
9618 .read = spi_chip_read, /* Fast read (0x0B) supported */
9619 .voltage = {1650, 1950},
9620 },
9621
9622 {
9623 .vendor = "SST",
9624 .name = "SST25WF010",
9625 .bustype = BUS_SPI,
9626 .manufacture_id = SST_ID,
9627 .model_id = SST_SST25WF010,
9628 .total_size = 128,
9629 .page_size = 256,
9630 .feature_bits = FEATURE_WRSR_EITHER,
9631 .tested = TEST_UNTESTED,
9632 .probe = probe_spi_rdid,
9633 .probe_timing = TIMING_ZERO,
9634 .block_erasers =
9635 {
9636 {
9637 .eraseblocks = { {4 * 1024, 32} },
9638 .block_erase = spi_block_erase_20,
9639 }, {
9640 .eraseblocks = { {32 * 1024, 4} },
9641 .block_erase = spi_block_erase_52,
9642 }, {
9643 .eraseblocks = { {1024 * 128, 1} },
9644 .block_erase = spi_block_erase_60,
9645 }, {
9646 .eraseblocks = { {1024 * 128, 1} },
9647 .block_erase = spi_block_erase_c7,
9648 },
9649 },
9650 .unlock = spi_disable_blockprotect,
9651 .write = spi_aai_write,
9652 .read = spi_chip_read, /* Fast read (0x0B) supported */
9653 .voltage = {1650, 1950},
9654 },
9655
9656 {
9657 .vendor = "SST",
9658 .name = "SST25WF020",
9659 .bustype = BUS_SPI,
9660 .manufacture_id = SST_ID,
9661 .model_id = SST_SST25WF020,
9662 .total_size = 256,
9663 .page_size = 256,
9664 .feature_bits = FEATURE_WRSR_EITHER,
9665 .tested = TEST_UNTESTED,
9666 .probe = probe_spi_rdid,
9667 .probe_timing = TIMING_ZERO,
9668 .block_erasers =
9669 {
9670 {
9671 .eraseblocks = { {4 * 1024, 64} },
9672 .block_erase = spi_block_erase_20,
9673 }, {
9674 .eraseblocks = { {32 * 1024, 8} },
9675 .block_erase = spi_block_erase_52,
9676 }, {
9677 .eraseblocks = { {64 * 1024, 4} },
9678 .block_erase = spi_block_erase_d8,
9679 }, {
9680 .eraseblocks = { {1024 * 256, 1} },
9681 .block_erase = spi_block_erase_60,
9682 }, {
9683 .eraseblocks = { {1024 * 256, 1} },
9684 .block_erase = spi_block_erase_c7,
9685 },
9686 },
9687 .unlock = spi_disable_blockprotect,
9688 .write = spi_aai_write,
9689 .read = spi_chip_read, /* Fast read (0x0B) supported */
9690 .voltage = {1650, 1950},
9691 },
9692
9693 {
9694 .vendor = "SST",
9695 .name = "SST25WF040",
9696 .bustype = BUS_SPI,
9697 .manufacture_id = SST_ID,
9698 .model_id = SST_SST25WF040,
9699 .total_size = 512,
9700 .page_size = 256,
9701 .feature_bits = FEATURE_WRSR_EITHER,
9702 .tested = TEST_UNTESTED,
9703 .probe = probe_spi_rdid,
9704 .probe_timing = TIMING_ZERO,
9705 .block_erasers =
9706 {
9707 {
9708 .eraseblocks = { {4 * 1024, 128} },
9709 .block_erase = spi_block_erase_20,
9710 }, {
9711 .eraseblocks = { {32 * 1024, 16} },
9712 .block_erase = spi_block_erase_52,
9713 }, {
9714 .eraseblocks = { {64 * 1024, 8} },
9715 .block_erase = spi_block_erase_d8,
9716 }, {
9717 .eraseblocks = { {1024 * 512, 1} },
9718 .block_erase = spi_block_erase_60,
9719 }, {
9720 .eraseblocks = { {1024 * 512, 1} },
9721 .block_erase = spi_block_erase_c7,
9722 },
9723 },
9724 .unlock = spi_disable_blockprotect,
9725 .write = spi_aai_write,
9726 .read = spi_chip_read, /* Fast read (0x0B) supported */
9727 .voltage = {1650, 1950},
9728 },
9729
9730 {
9731 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009732 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009733 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009734 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009735 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009736 .total_size = 512,
9737 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00009738 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009739 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009740 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +00009741 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009742 .block_erasers =
9743 {
9744 {
9745 .eraseblocks = { {128, 4096} },
9746 .block_erase = erase_sector_28sf040,
9747 }, {
9748 .eraseblocks = { {512 * 1024, 1} },
9749 .block_erase = erase_chip_28sf040,
9750 }
9751 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00009752 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009753 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009754 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009755 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009756 },
9757
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009758 {
9759 .vendor = "SST",
9760 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009761 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009762 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009763 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009764 .total_size = 128,
9765 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009766 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009767 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009768 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009769 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009770 .block_erasers =
9771 {
9772 {
9773 .eraseblocks = { {128 * 1024, 1} },
9774 .block_erase = erase_chip_block_jedec,
9775 }
9776 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009777 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009778 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009779 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009780 },
9781
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009782 {
9783 .vendor = "SST",
9784 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009785 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009786 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009787 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009788 .total_size = 128,
9789 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009790 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009791 .tested = TEST_UNTESTED,
9792 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009793 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009794 .block_erasers =
9795 {
9796 {
9797 .eraseblocks = { {128 * 1024, 1} },
9798 .block_erase = erase_chip_block_jedec,
9799 }
9800 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009801 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009802 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009803 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009804 },
9805
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009806 {
9807 .vendor = "SST",
9808 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009809 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009810 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009811 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009812 .total_size = 256,
9813 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009814 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009815 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009816 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009817 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009818 .block_erasers =
9819 {
9820 {
9821 .eraseblocks = { {256 * 1024, 1} },
9822 .block_erase = erase_chip_block_jedec,
9823 }
9824 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009825 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009827 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009828 },
9829
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009830 {
9831 .vendor = "SST",
9832 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009833 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009834 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009835 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009836 .total_size = 256,
9837 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009838 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009839 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009840 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009841 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009842 .block_erasers =
9843 {
9844 {
9845 .eraseblocks = { {256 * 1024, 1} },
9846 .block_erase = erase_chip_block_jedec,
9847 }
9848 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009849 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009850 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009851 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009852 },
9853
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009854 {
9855 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +00009856 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009857 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009858 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009859 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009860 .total_size = 64,
9861 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009862 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +00009863 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009864 .probe = probe_jedec,
9865 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +00009866 .block_erasers =
9867 {
9868 {
9869 .eraseblocks = { {4 * 1024, 16} },
9870 .block_erase = erase_sector_jedec,
9871 }, {
9872 .eraseblocks = { {64 * 1024, 1} },
9873 .block_erase = erase_chip_block_jedec,
9874 }
9875 },
Sean Nelson35727f72010-01-28 23:55:12 +00009876 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009877 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009878 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +00009879 },
9880
9881 {
9882 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009883 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009884 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009885 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009886 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009887 .total_size = 128,
9888 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009889 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +00009890 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009891 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00009892 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009893 .block_erasers =
9894 {
9895 {
9896 .eraseblocks = { {4 * 1024, 32} },
9897 .block_erase = erase_sector_jedec,
9898 }, {
9899 .eraseblocks = { {128 * 1024, 1} },
9900 .block_erase = erase_chip_block_jedec,
9901 }
9902 },
Sean Nelson35727f72010-01-28 23:55:12 +00009903 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009904 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009905 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009906 },
9907
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009908 {
9909 .vendor = "SST",
9910 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009911 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009912 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009913 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009914 .total_size = 256,
9915 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009916 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +00009917 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009918 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009919 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009920 .block_erasers =
9921 {
9922 {
9923 .eraseblocks = { {4 * 1024, 64} },
9924 .block_erase = erase_sector_jedec,
9925 }, {
9926 .eraseblocks = { {256 * 1024, 1} },
9927 .block_erase = erase_chip_block_jedec,
9928 }
9929 },
Sean Nelson35727f72010-01-28 23:55:12 +00009930 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009931 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009932 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009933 },
9934
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009935 {
9936 .vendor = "SST",
9937 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009938 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009939 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009940 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009941 .total_size = 512,
9942 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009943 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009944 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009945 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009946 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009947 .block_erasers =
9948 {
9949 {
9950 .eraseblocks = { {4 * 1024, 128} },
9951 .block_erase = erase_sector_jedec,
9952 }, {
9953 .eraseblocks = { {512 * 1024, 1} },
9954 .block_erase = erase_chip_block_jedec,
9955 }
9956 },
Sean Nelson35727f72010-01-28 23:55:12 +00009957 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009958 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009959 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009960 },
9961
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009962 {
9963 .vendor = "SST",
9964 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009965 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009966 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009967 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009968 .total_size = 64,
9969 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009970 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00009971 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009972 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009973 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009974 .block_erasers =
9975 {
9976 {
9977 .eraseblocks = { {4 * 1024, 16} },
9978 .block_erase = erase_sector_jedec,
9979 }, {
9980 .eraseblocks = { {64 * 1024, 1} },
9981 .block_erase = erase_chip_block_jedec,
9982 }
9983 },
Sean Nelson35727f72010-01-28 23:55:12 +00009984 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009985 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009986 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009987 },
9988
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009989 {
9990 .vendor = "SST",
9991 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009992 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009993 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009994 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009995 .total_size = 128,
9996 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009997 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00009998 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009999 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010000 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010001 .block_erasers =
10002 {
10003 {
10004 .eraseblocks = { {4 * 1024, 32} },
10005 .block_erase = erase_sector_jedec,
10006 }, {
10007 .eraseblocks = { {128 * 1024, 1} },
10008 .block_erase = erase_chip_block_jedec,
10009 }
10010 },
Sean Nelson35727f72010-01-28 23:55:12 +000010011 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010012 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010013 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010014 },
10015
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010016 {
10017 .vendor = "SST",
10018 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010019 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010020 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010021 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010022 .total_size = 256,
10023 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010024 .feature_bits = FEATURE_EITHER_RESET,
10025 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010026 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010027 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010028 .block_erasers =
10029 {
10030 {
10031 .eraseblocks = { {4 * 1024, 64} },
10032 .block_erase = erase_sector_jedec,
10033 }, {
10034 .eraseblocks = { {256 * 1024, 1} },
10035 .block_erase = erase_chip_block_jedec,
10036 }
10037 },
Sean Nelson35727f72010-01-28 23:55:12 +000010038 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010039 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010040 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010041 },
10042
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010043 {
10044 .vendor = "SST",
10045 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010046 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010047 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010048 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010049 .total_size = 512,
10050 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010051 .feature_bits = FEATURE_EITHER_RESET,
10052 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010053 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010054 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010055 .block_erasers =
10056 {
10057 {
10058 .eraseblocks = { {4 * 1024, 128} },
10059 .block_erase = erase_sector_jedec,
10060 }, {
10061 .eraseblocks = { {512 * 1024, 1} },
10062 .block_erase = erase_chip_block_jedec,
10063 }
10064 },
Sean Nelson35727f72010-01-28 23:55:12 +000010065 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010067 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000010068 },
FENG yu ningff692fb2008-12-08 18:15:10 +000010069
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010070 {
10071 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000010072 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010073 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000010074 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010075 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000010076 .total_size = 1024,
10077 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010078 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000010079 .tested = TEST_UNTESTED,
10080 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010081 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010082 .block_erasers =
10083 {
10084 {
10085 .eraseblocks = { {4 * 1024, 256} },
10086 .block_erase = erase_sector_jedec,
10087 }, {
10088 .eraseblocks = { {64 * 1024, 16} },
10089 .block_erase = erase_block_jedec,
10090 }, {
10091 .eraseblocks = { {1024 * 1024, 1} },
10092 .block_erase = erase_chip_block_jedec,
10093 }
10094 },
Sean Nelson35727f72010-01-28 23:55:12 +000010095 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010096 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010097 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000010098 },
10099
10100 {
10101 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010102 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010103 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010104 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010105 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010106 .total_size = 256,
10107 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010108 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010109 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010110 .probe = probe_jedec,
10111 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010112 .block_erasers =
10113 {
10114 {
10115 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010116 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010117 }, {
10118 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010119 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010120 }, {
10121 .eraseblocks = { {256 * 1024, 1} },
10122 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10123 }
10124 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010125 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010126 .unlock = unlock_sst_fwhub,
10127 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010128 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010129 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010130 },
10131
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010132 {
10133 .vendor = "SST",
10134 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010135 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010136 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010137 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010138 .total_size = 384,
10139 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010140 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000010141 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010142 .probe = probe_jedec,
10143 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010144 .block_erasers =
10145 {
10146 {
10147 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010148 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010149 }, {
10150 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010151 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010152 }, {
10153 .eraseblocks = { {384 * 1024, 1} },
10154 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10155 }
10156 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010157 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010158 .unlock = unlock_sst_fwhub,
10159 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010160 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010161 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010162 },
10163
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010164 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010165 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
10166 * and is only honored for 64k block erase, but not 4k sector erase.
10167 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010168 .vendor = "SST",
10169 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010170 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010171 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010172 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010173 .total_size = 512,
10174 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010175 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010176 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010177 .probe = probe_jedec,
10178 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010179 .block_erasers =
10180 {
10181 {
10182 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010183 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010184 }, {
10185 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010186 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010187 }, {
10188 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000010189 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010190 },
10191 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010192 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010193 .unlock = unlock_sst_fwhub,
10194 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010195 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010196 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010197 },
10198
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010199 {
10200 .vendor = "SST",
10201 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010202 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010203 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010204 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010205 .total_size = 512,
10206 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010207 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010208 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010209 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010210 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010211 .block_erasers =
10212 {
10213 {
10214 .eraseblocks = { {4 * 1024, 128} },
10215 .block_erase = erase_sector_49lfxxxc,
10216 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010217 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010218 {64 * 1024, 7},
10219 {32 * 1024, 1},
10220 {8 * 1024, 2},
10221 {16 * 1024, 1},
10222 },
Sean Nelson69e58112010-03-23 17:10:28 +000010223 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010224 }
10225 },
Sean Nelson69e58112010-03-23 17:10:28 +000010226 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010227 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010229 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010230 },
10231
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010232 {
10233 .vendor = "SST",
10234 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010235 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010236 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010237 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010238 .total_size = 1024,
10239 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010240 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010241 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010242 .probe = probe_jedec,
10243 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010244 .block_erasers =
10245 {
10246 {
10247 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010248 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010249 }, {
10250 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010251 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010252 }, {
10253 .eraseblocks = { {1024 * 1024, 1} },
10254 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10255 }
10256 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010257 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010258 .unlock = unlock_sst_fwhub,
10259 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010260 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010261 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010262 },
10263
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010264 {
10265 .vendor = "SST",
10266 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010267 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010268 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010269 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010270 .total_size = 1024,
10271 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010272 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010273 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010274 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010275 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010276 .block_erasers =
10277 {
10278 {
10279 .eraseblocks = { {4 * 1024, 256} },
10280 .block_erase = erase_sector_49lfxxxc,
10281 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010282 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010283 {64 * 1024, 15},
10284 {32 * 1024, 1},
10285 {8 * 1024, 2},
10286 {16 * 1024, 1},
10287 },
Sean Nelson69e58112010-03-23 17:10:28 +000010288 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010289 }
10290 },
Sean Nelson69e58112010-03-23 17:10:28 +000010291 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010292 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010293 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010294 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010295 },
10296
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010297 {
10298 .vendor = "SST",
10299 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010300 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010301 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010302 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010303 .total_size = 2048,
10304 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010305 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner2abab942012-04-27 20:41:23 +000010306 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010307 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010308 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010309 .block_erasers =
10310 {
10311 {
10312 .eraseblocks = { {4 * 1024, 512} },
10313 .block_erase = erase_sector_49lfxxxc,
10314 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010315 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010316 {64 * 1024, 31},
10317 {32 * 1024, 1},
10318 {8 * 1024, 2},
10319 {16 * 1024, 1},
10320 },
Sean Nelson69e58112010-03-23 17:10:28 +000010321 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010322 }
10323 },
Sean Nelson69e58112010-03-23 17:10:28 +000010324 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010325 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010326 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010327 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010328 },
10329
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010330 {
10331 .vendor = "SST",
10332 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010333 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010334 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010335 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010336 .total_size = 256,
10337 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010338 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000010339 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010340 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010341 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010342 .block_erasers =
10343 {
10344 {
10345 .eraseblocks = { {4 * 1024, 64} },
10346 .block_erase = erase_sector_jedec,
10347 }, {
10348 .eraseblocks = { {16 * 1024, 16} },
10349 .block_erase = erase_block_jedec,
10350 }, {
10351 .eraseblocks = { {256 * 1024, 1} },
10352 .block_erase = NULL,
10353 }
10354 },
Sean Nelson35727f72010-01-28 23:55:12 +000010355 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010356 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010357 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000010358 },
10359
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010360 {
10361 .vendor = "SST",
10362 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010363 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010364 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010365 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010366 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000010367 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010368 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010369 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010370 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010371 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010372 .block_erasers =
10373 {
10374 {
10375 .eraseblocks = { {4 * 1024, 64} },
10376 .block_erase = erase_sector_jedec,
10377 }, {
10378 .eraseblocks = { {16 * 1024, 16} },
10379 .block_erase = erase_block_jedec,
10380 }, {
10381 .eraseblocks = { {256 * 1024, 1} },
10382 .block_erase = NULL,
10383 }
10384 },
Sean Nelson35727f72010-01-28 23:55:12 +000010385 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010386 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010387 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010388 },
10389
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010390 {
10391 .vendor = "SST",
10392 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010393 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010394 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010395 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010396 .total_size = 512,
10397 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010398 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010399 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010400 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010401 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010402 .block_erasers =
10403 {
10404 {
10405 .eraseblocks = { {4 * 1024, 128} },
10406 .block_erase = erase_sector_jedec,
10407 }, {
10408 .eraseblocks = { {64 * 1024, 8} },
10409 .block_erase = erase_block_jedec,
10410 }, {
10411 .eraseblocks = { {512 * 1024, 1} },
10412 .block_erase = NULL,
10413 }
10414 },
Sean Nelson35727f72010-01-28 23:55:12 +000010415 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010416 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010417 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010418 },
10419
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010420 {
10421 .vendor = "SST",
10422 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010423 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010424 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010425 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010426 .total_size = 512,
10427 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010428 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010429 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010430 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010431 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010432 .block_erasers =
10433 {
10434 {
10435 .eraseblocks = { {4 * 1024, 128} },
10436 .block_erase = erase_sector_jedec,
10437 }, {
10438 .eraseblocks = { {64 * 1024, 8} },
10439 .block_erase = erase_block_jedec,
10440 }, {
10441 .eraseblocks = { {512 * 1024, 1} },
10442 .block_erase = NULL,
10443 }
10444 },
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010445 .unlock = unlock_82802ab,
Sean Nelson35727f72010-01-28 23:55:12 +000010446 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010447 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010448 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010449 },
10450
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010451 {
10452 .vendor = "SST",
10453 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010454 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010455 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010456 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010457 .total_size = 1024,
10458 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010459 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000010460 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010461 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010462 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010463 .block_erasers =
10464 {
10465 {
10466 .eraseblocks = { {4 * 1024, 256} },
10467 .block_erase = erase_sector_jedec,
10468 }, {
10469 .eraseblocks = { {64 * 1024, 16} },
10470 .block_erase = erase_block_jedec,
10471 }, {
10472 .eraseblocks = { {1024 * 1024, 1} },
10473 .block_erase = NULL,
10474 }
10475 },
Sean Nelson35727f72010-01-28 23:55:12 +000010476 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010477 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010478 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010479 },
10480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010481 {
10482 .vendor = "SST",
10483 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010484 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010485 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010486 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010487 .total_size = 2048,
10488 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010489 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010490 .tested = TEST_OK_PRE,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010491 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010492 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010493 .block_erasers =
10494 {
10495 {
10496 .eraseblocks = { {4 * 1024, 512} },
10497 .block_erase = erase_sector_49lfxxxc,
10498 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010499 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010500 {64 * 1024, 31},
10501 {32 * 1024, 1},
10502 {8 * 1024, 2},
10503 {16 * 1024, 1},
10504 },
Sean Nelson69e58112010-03-23 17:10:28 +000010505 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010506 }
10507 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000010508 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010509 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010510 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010511 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010512 },
10513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010514 {
10515 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010516 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010517 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010518 .manufacture_id = ST_ID,
10519 .model_id = ST_M29F002B,
10520 .total_size = 256,
10521 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010522 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010523 .tested = TEST_UNTESTED,
10524 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010525 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010526 .block_erasers =
10527 {
10528 {
10529 .eraseblocks = {
10530 {16 * 1024, 1},
10531 {8 * 1024, 2},
10532 {32 * 1024, 1},
10533 {64 * 1024, 3},
10534 },
10535 .block_erase = erase_sector_jedec,
10536 }, {
10537 .eraseblocks = { {256 * 1024, 1} },
10538 .block_erase = erase_chip_block_jedec,
10539 }
10540 },
Sean Nelson35727f72010-01-28 23:55:12 +000010541 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010542 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010543 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010544 },
10545
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010546 {
10547 .vendor = "ST",
10548 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010549 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010550 .manufacture_id = ST_ID,
10551 .model_id = ST_M29F002T,
10552 .total_size = 256,
10553 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010554 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010555 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010556 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010557 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010558 .block_erasers =
10559 {
10560 {
10561 .eraseblocks = {
10562 {64 * 1024, 3},
10563 {32 * 1024, 1},
10564 {8 * 1024, 2},
10565 {16 * 1024, 1},
10566 },
10567 .block_erase = erase_sector_jedec,
10568 }, {
10569 .eraseblocks = { {256 * 1024, 1} },
10570 .block_erase = erase_chip_block_jedec,
10571 }
10572 },
Sean Nelson35727f72010-01-28 23:55:12 +000010573 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010574 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010575 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010576 },
10577
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010578 {
10579 .vendor = "ST",
10580 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010581 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010582 .manufacture_id = ST_ID,
10583 .model_id = ST_M29F040B,
10584 .total_size = 512,
10585 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010586 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
10587 .tested = TEST_UNTESTED,
10588 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010589 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000010590 .block_erasers =
10591 {
10592 {
10593 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +000010594 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010595 }, {
10596 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010597 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010598 }
10599 },
Sean Nelson35727f72010-01-28 23:55:12 +000010600 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010601 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010602 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010603 },
10604
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010605 {
Sean Nelson35727f72010-01-28 23:55:12 +000010606 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010607 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010608 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010609 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010610 .manufacture_id = ST_ID,
10611 .model_id = ST_M29F400BB,
10612 .total_size = 512,
10613 .page_size = 64 * 1024,
10614 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010615 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010616 .probe = probe_m29f400bt,
10617 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
10618 .block_erasers =
10619 {
10620 {
10621 .eraseblocks = {
10622 {16 * 1024, 1},
10623 {8 * 1024, 2},
10624 {32 * 1024, 1},
10625 {64 * 1024, 7},
10626 },
10627 .block_erase = block_erase_m29f400bt,
10628 }, {
10629 .eraseblocks = { {512 * 1024, 1} },
10630 .block_erase = block_erase_chip_m29f400bt,
10631 }
10632 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010633 .write = write_m29f400bt,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010634 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010635 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010636 },
10637 {
10638 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
10639 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010640 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010641 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010642 .manufacture_id = ST_ID,
10643 .model_id = ST_M29F400BT,
10644 .total_size = 512,
10645 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010646 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010647 .tested = TEST_UNTESTED,
10648 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010649 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010650 .block_erasers =
10651 {
10652 {
10653 .eraseblocks = {
10654 {64 * 1024, 7},
10655 {32 * 1024, 1},
10656 {8 * 1024, 2},
10657 {16 * 1024, 1},
10658 },
10659 .block_erase = block_erase_m29f400bt,
10660 }, {
10661 .eraseblocks = { {512 * 1024, 1} },
10662 .block_erase = block_erase_chip_m29f400bt,
10663 }
10664 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010665 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010666 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010667 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010668 },
10669
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010670 {
10671 .vendor = "ST",
10672 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010673 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010674 .manufacture_id = ST_ID,
10675 .model_id = ST_M29W010B,
10676 .total_size = 128,
10677 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010678 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010679 .tested = TEST_UNTESTED,
10680 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010681 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010682 .block_erasers =
10683 {
10684 {
10685 .eraseblocks = { {16 * 1024, 8}, },
10686 .block_erase = erase_sector_jedec,
10687 }, {
10688 .eraseblocks = { {128 * 1024, 1} },
10689 .block_erase = erase_chip_block_jedec,
10690 }
10691 },
Sean Nelson35727f72010-01-28 23:55:12 +000010692 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010693 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010694 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010695 },
10696
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010697 {
10698 .vendor = "ST",
10699 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010700 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010701 .manufacture_id = ST_ID,
10702 .model_id = ST_M29W040B,
10703 .total_size = 512,
10704 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010705 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010706 .tested = TEST_UNTESTED,
10707 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010708 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010709 .block_erasers =
10710 {
10711 {
10712 .eraseblocks = { {64 * 1024, 8}, },
10713 .block_erase = erase_sector_jedec,
10714 }, {
10715 .eraseblocks = { {512 * 1024, 1} },
10716 .block_erase = erase_chip_block_jedec,
10717 }
10718 },
Sean Nelson35727f72010-01-28 23:55:12 +000010719 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010720 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010721 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010722 },
10723
Stefan Taunereb582572012-09-21 12:52:50 +000010724 {
10725 .vendor = "ST",
10726 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010727 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000010728 .manufacture_id = ST_ID,
10729 .model_id = ST_M29W512B,
10730 .total_size = 64,
10731 .page_size = 64 * 1024,
10732 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010733 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000010734 .probe = probe_jedec,
10735 .probe_timing = TIMING_ZERO,
10736 .block_erasers =
10737 {
10738 {
10739 .eraseblocks = { {64 * 1024, 1} },
10740 .block_erase = erase_chip_block_jedec,
10741 }
10742 },
10743 .write = write_jedec_1,
10744 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010745 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000010746 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000010747
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010748 {
10749 .vendor = "ST",
10750 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010751 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010752 .manufacture_id = ST_ID,
10753 .model_id = ST_M50FLW040A,
10754 .total_size = 512,
10755 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010756 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010757 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010758 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010759 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010760 .block_erasers =
10761 {
10762 {
Sean Nelson329bde72010-01-19 16:39:19 +000010763 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010764 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010765 {64 * 1024, 5}, /* block */
10766 {4 * 1024, 16}, /* sector */
10767 {4 * 1024, 16}, /* sector */
10768 },
10769 .block_erase = NULL,
10770 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010771 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010772 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010773 }
10774 },
Sean Nelson28accc22010-03-19 18:47:06 +000010775 .unlock = unlock_stm50flw0x0x,
10776 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010777 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010778 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010779 },
10780
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010781 {
10782 .vendor = "ST",
10783 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010784 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010785 .manufacture_id = ST_ID,
10786 .model_id = ST_M50FLW040B,
10787 .total_size = 512,
10788 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010789 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010790 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010791 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010792 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010793 .block_erasers =
10794 {
10795 {
Sean Nelson329bde72010-01-19 16:39:19 +000010796 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010797 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010798 {4 * 1024, 16}, /* sector */
10799 {64 * 1024, 5}, /* block */
10800 {4 * 1024, 16}, /* sector */
10801 },
10802 .block_erase = NULL,
10803 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010804 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010805 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010806 }
10807 },
Sean Nelson28accc22010-03-19 18:47:06 +000010808 .unlock = unlock_stm50flw0x0x,
10809 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010810 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010811 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010812 },
10813
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010814 {
10815 .vendor = "ST",
10816 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010817 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010818 .manufacture_id = ST_ID,
10819 .model_id = ST_M50FLW080A,
10820 .total_size = 1024,
10821 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010822 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010823 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000010824 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010825 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010826 .block_erasers =
10827 {
10828 {
Sean Nelson329bde72010-01-19 16:39:19 +000010829 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010830 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010831 {64 * 1024, 13}, /* block */
10832 {4 * 1024, 16}, /* sector */
10833 {4 * 1024, 16}, /* sector */
10834 },
10835 .block_erase = NULL,
10836 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010837 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010838 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010839 }
10840 },
Sean Nelson28accc22010-03-19 18:47:06 +000010841 .unlock = unlock_stm50flw0x0x,
10842 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010843 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010844 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010845 },
10846
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010847 {
10848 .vendor = "ST",
10849 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010850 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010851 .manufacture_id = ST_ID,
10852 .model_id = ST_M50FLW080B,
10853 .total_size = 1024,
10854 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010855 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010856 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010857 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010858 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010859 .block_erasers =
10860 {
10861 {
Sean Nelson329bde72010-01-19 16:39:19 +000010862 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010863 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010864 {4 * 1024, 16}, /* sector */
10865 {64 * 1024, 13}, /* block */
10866 {4 * 1024, 16}, /* sector */
10867 },
10868 .block_erase = NULL,
10869 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010870 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010871 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010872 }
10873 },
Sean Nelson28accc22010-03-19 18:47:06 +000010874 .unlock = unlock_stm50flw0x0x,
10875 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010876 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010877 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010878 },
10879
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010880 {
10881 .vendor = "ST",
10882 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010883 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010884 .manufacture_id = ST_ID,
10885 .model_id = ST_M50FW002,
10886 .total_size = 256,
10887 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010888 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010889 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010890 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010891 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010892 .block_erasers =
10893 {
10894 {
10895 .eraseblocks = {
10896 {64 * 1024, 3},
10897 {32 * 1024, 1},
10898 {8 * 1024, 2},
10899 {16 * 1024, 1},
10900 },
Sean Nelson28accc22010-03-19 18:47:06 +000010901 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010902 }
10903 },
Sean Nelson28accc22010-03-19 18:47:06 +000010904 .unlock = unlock_stm50flw0x0x,
10905 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010906 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010907 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010908 },
10909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010910 {
10911 .vendor = "ST",
10912 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010913 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010914 .manufacture_id = ST_ID,
10915 .model_id = ST_M50FW016,
10916 .total_size = 2048,
10917 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010918 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010919 .tested = TEST_UNTESTED,
10920 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010921 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010922 .block_erasers =
10923 {
10924 {
10925 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010926 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010927 }
10928 },
Sean Nelson28accc22010-03-19 18:47:06 +000010929 .unlock = unlock_stm50flw0x0x,
10930 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010931 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010932 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010933 },
10934
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010935 {
10936 .vendor = "ST",
10937 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010938 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010939 .manufacture_id = ST_ID,
10940 .model_id = ST_M50FW040,
10941 .total_size = 512,
10942 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010943 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000010944 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010945 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010946 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010947 .block_erasers =
10948 {
10949 {
10950 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010951 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010952 }
10953 },
Sean Nelson28accc22010-03-19 18:47:06 +000010954 .unlock = unlock_stm50flw0x0x,
10955 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010956 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010957 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010958 },
10959
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010960 {
10961 .vendor = "ST",
10962 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010963 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010964 .manufacture_id = ST_ID,
10965 .model_id = ST_M50FW080,
10966 .total_size = 1024,
10967 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010968 .feature_bits = FEATURE_REGISTERMAP,
Antony Rheneus0fbba982011-05-26 14:28:51 +000010969 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010970 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010971 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010972 .block_erasers =
10973 {
10974 {
10975 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010976 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010977 }
10978 },
Sean Nelson28accc22010-03-19 18:47:06 +000010979 .unlock = unlock_stm50flw0x0x,
10980 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010981 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010982 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010983 },
10984
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010985 {
10986 .vendor = "ST",
10987 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010988 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010989 .manufacture_id = ST_ID,
10990 .model_id = ST_M50LPW116,
10991 .total_size = 2048,
10992 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010993 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010994 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010995 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000010996 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010997 .block_erasers =
10998 {
10999 {
11000 .eraseblocks = {
11001 {4 * 1024, 16},
11002 {64 * 1024, 30},
11003 {32 * 1024, 1},
11004 {8 * 1024, 2},
11005 {16 * 1024, 1},
11006 },
Sean Nelson28accc22010-03-19 18:47:06 +000011007 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011008 }
11009 },
Sean Nelson28accc22010-03-19 18:47:06 +000011010 .unlock = unlock_stm50flw0x0x,
11011 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011012 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011013 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011014 },
11015
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011016 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011017 .vendor = "SyncMOS/MoselVitelic",
11018 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011019 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011020 .manufacture_id = SYNCMOS_MVC_ID,
11021 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011022 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011023 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000011024 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011025 .tested = TEST_UNTESTED,
11026 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011027 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011028 .block_erasers =
11029 {
11030 {
11031 .eraseblocks = { {512, 256} },
11032 .block_erase = erase_sector_jedec,
11033 }, {
11034 .eraseblocks = { {128 * 1024, 1} },
11035 .block_erase = erase_chip_block_jedec,
11036 },
11037 },
Sean Nelson35727f72010-01-28 23:55:12 +000011038 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011039 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011040 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011041 },
11042
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011043 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011044 .vendor = "SyncMOS/MoselVitelic",
11045 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011046 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011047 .manufacture_id = SYNCMOS_MVC_ID,
11048 .model_id = SM_MVC_29C51001T,
11049 .total_size = 128,
11050 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000011051 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011052 .tested = TEST_UNTESTED,
11053 .probe = probe_jedec,
11054 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11055 .block_erasers =
11056 {
11057 {
11058 .eraseblocks = { {512, 256} },
11059 .block_erase = erase_sector_jedec,
11060 }, {
11061 .eraseblocks = { {128 * 1024, 1} },
11062 .block_erase = erase_chip_block_jedec,
11063 },
11064 },
11065 .write = write_jedec_1,
11066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011067 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011068 },
11069
11070 {
11071 .vendor = "SyncMOS/MoselVitelic",
11072 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011073 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011074 .manufacture_id = SYNCMOS_MVC_ID,
11075 .model_id = SM_MVC_29C51002B,
11076 .total_size = 256,
11077 .page_size = 512,
11078 .feature_bits = FEATURE_EITHER_RESET,
11079 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011080 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011081 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011082 .block_erasers =
11083 {
11084 {
11085 .eraseblocks = { {512, 512} },
11086 .block_erase = erase_sector_jedec,
11087 }, {
11088 .eraseblocks = { {256 * 1024, 1} },
11089 .block_erase = erase_chip_block_jedec,
11090 },
11091 },
Sean Nelson35727f72010-01-28 23:55:12 +000011092 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011093 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000011094 },
11095
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011096 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011097 .vendor = "SyncMOS/MoselVitelic",
11098 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011099 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011100 .manufacture_id = SYNCMOS_MVC_ID,
11101 .model_id = SM_MVC_29C51002T,
11102 .total_size = 256,
11103 .page_size = 512,
11104 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011105 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011106 .probe = probe_jedec,
11107 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11108 .block_erasers =
11109 {
11110 {
11111 .eraseblocks = { {512, 512} },
11112 .block_erase = erase_sector_jedec,
11113 }, {
11114 .eraseblocks = { {256 * 1024, 1} },
11115 .block_erase = erase_chip_block_jedec,
11116 },
11117 },
11118 .write = write_jedec_1,
11119 .read = read_memmapped,
11120 },
11121
11122 {
11123 .vendor = "SyncMOS/MoselVitelic",
11124 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011125 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011126 .manufacture_id = SYNCMOS_MVC_ID,
11127 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011128 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011129 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011130 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011131 .tested = TEST_UNTESTED,
11132 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011133 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000011134 .block_erasers =
11135 {
11136 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011137 .eraseblocks = { {1024, 512} },
11138 .block_erase = erase_sector_jedec,
11139 }, {
11140 .eraseblocks = { {512 * 1024, 1} },
11141 .block_erase = erase_chip_block_jedec,
11142 },
11143 },
11144 .write = write_jedec_1,
11145 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011146 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011147 },
11148
11149 {
11150 .vendor = "SyncMOS/MoselVitelic",
11151 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011152 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011153 .manufacture_id = SYNCMOS_MVC_ID,
11154 .model_id = SM_MVC_29C51004T,
11155 .total_size = 512,
11156 .page_size = 1024,
11157 .feature_bits = FEATURE_EITHER_RESET,
11158 .tested = TEST_UNTESTED,
11159 .probe = probe_jedec,
11160 .probe_timing = TIMING_ZERO,
11161 .block_erasers =
11162 {
11163 {
11164 .eraseblocks = { {1024, 512} },
11165 .block_erase = erase_sector_jedec,
11166 }, {
11167 .eraseblocks = { {512 * 1024, 1} },
11168 .block_erase = erase_chip_block_jedec,
11169 },
11170 },
11171 .write = write_jedec_1,
11172 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011173 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011174 },
11175
11176 {
11177 .vendor = "SyncMOS/MoselVitelic",
11178 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011179 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011180 .manufacture_id = SYNCMOS_MVC_ID,
11181 .model_id = SM_MVC_29C31004B,
11182 .total_size = 512,
11183 .page_size = 1024,
11184 .feature_bits = FEATURE_EITHER_RESET,
11185 .tested = TEST_UNTESTED,
11186 .probe = probe_jedec,
11187 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11188 .block_erasers =
11189 {
11190 {
11191 .eraseblocks = { {1024, 512} },
11192 .block_erase = erase_sector_jedec,
11193 }, {
11194 .eraseblocks = { {512 * 1024, 1} },
11195 .block_erase = erase_chip_block_jedec,
11196 },
11197 },
11198 .write = write_jedec_1,
11199 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011200 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011201 },
11202
11203 {
11204 .vendor = "SyncMOS/MoselVitelic",
11205 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011206 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011207 .manufacture_id = SYNCMOS_MVC_ID,
11208 .model_id = SM_MVC_29C31004T,
11209 .total_size = 512,
11210 .page_size = 1024,
11211 .feature_bits = FEATURE_EITHER_RESET,
11212 .tested = TEST_UNTESTED,
11213 .probe = probe_jedec,
11214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11215 .block_erasers =
11216 {
11217 {
11218 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000011219 .block_erase = erase_sector_jedec,
11220 }, {
11221 .eraseblocks = { {512 * 1024, 1} },
11222 .block_erase = erase_chip_block_jedec,
11223 },
11224 },
Sean Nelson35727f72010-01-28 23:55:12 +000011225 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011226 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011227 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011228 },
11229
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011230 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011231 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011232 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011233 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011234 .manufacture_id = TI_OLD_ID,
11235 .model_id = TI_TMS29F002RB,
11236 .total_size = 256,
11237 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011238 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011239 .tested = TEST_UNTESTED,
11240 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011241 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011242 .block_erasers =
11243 {
11244 {
11245 .eraseblocks = {
11246 {16 * 1024, 1},
11247 {8 * 1024, 2},
11248 {32 * 1024, 1},
11249 {64 * 1024, 3},
11250 },
11251 .block_erase = erase_sector_jedec,
11252 }, {
11253 .eraseblocks = { {256 * 1024, 1} },
11254 .block_erase = erase_chip_block_jedec,
11255 },
11256 },
Sean Nelson35727f72010-01-28 23:55:12 +000011257 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011258 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011259 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011260 },
11261
11262 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011263 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011264 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011265 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011266 .manufacture_id = TI_OLD_ID,
11267 .model_id = TI_TMS29F002RT,
11268 .total_size = 256,
11269 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011270 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011271 .tested = TEST_UNTESTED,
11272 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011273 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011274 .block_erasers =
11275 {
11276 {
11277 .eraseblocks = {
11278 {64 * 1024, 3},
11279 {32 * 1024, 1},
11280 {8 * 1024, 2},
11281 {16 * 1024, 1},
11282 },
11283 .block_erase = erase_sector_jedec,
11284 }, {
11285 .eraseblocks = { {256 * 1024, 1} },
11286 .block_erase = erase_chip_block_jedec,
11287 },
11288 },
Sean Nelson35727f72010-01-28 23:55:12 +000011289 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011290 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011291 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011292 },
11293
11294 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011295 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011296 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011297 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011298 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011299 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011300 .total_size = 1024,
11301 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011302 /* supports SFDP */
11303 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011304 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011305 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011306 .probe = probe_spi_rdid,
11307 .probe_timing = TIMING_ZERO,
11308 .block_erasers =
11309 {
11310 {
11311 .eraseblocks = { {4 * 1024, 256} },
11312 .block_erase = spi_block_erase_20,
11313 }, {
11314 .eraseblocks = { {32 * 1024, 32} },
11315 .block_erase = spi_block_erase_52,
11316 }, {
11317 .eraseblocks = { {64 * 1024, 16} },
11318 .block_erase = spi_block_erase_d8,
11319 }, {
11320 .eraseblocks = { {1024 * 1024, 1} },
11321 .block_erase = spi_block_erase_60,
11322 }, {
11323 .eraseblocks = { {1024 * 1024, 1} },
11324 .block_erase = spi_block_erase_c7,
11325 }
11326 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011327 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011328 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011329 .write = spi_chip_write_256,
11330 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011331 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011332 },
11333
11334 {
11335 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011336 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011337 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011338 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011339 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011340 .total_size = 2048,
11341 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011342 /* supports SFDP */
11343 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011344 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000011345 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011346 .probe = probe_spi_rdid,
11347 .probe_timing = TIMING_ZERO,
11348 .block_erasers =
11349 {
11350 {
11351 .eraseblocks = { {4 * 1024, 512} },
11352 .block_erase = spi_block_erase_20,
11353 }, {
11354 .eraseblocks = { {32 * 1024, 64} },
11355 .block_erase = spi_block_erase_52,
11356 }, {
11357 .eraseblocks = { {64 * 1024, 32} },
11358 .block_erase = spi_block_erase_d8,
11359 }, {
11360 .eraseblocks = { {2 * 1024 * 1024, 1} },
11361 .block_erase = spi_block_erase_60,
11362 }, {
11363 .eraseblocks = { {2 * 1024 * 1024, 1} },
11364 .block_erase = spi_block_erase_c7,
11365 }
11366 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011367 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011368 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011369 .write = spi_chip_write_256,
11370 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011371 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011372 },
11373
11374 {
11375 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011376 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011377 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011378 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011379 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011380 .total_size = 4096,
11381 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011382 /* supports SFDP */
11383 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011384 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011385 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011386 .probe = probe_spi_rdid,
11387 .probe_timing = TIMING_ZERO,
11388 .block_erasers =
11389 {
11390 {
11391 .eraseblocks = { {4 * 1024, 1024} },
11392 .block_erase = spi_block_erase_20,
11393 }, {
11394 .eraseblocks = { {32 * 1024, 128} },
11395 .block_erase = spi_block_erase_52,
11396 }, {
11397 .eraseblocks = { {64 * 1024, 64} },
11398 .block_erase = spi_block_erase_d8,
11399 }, {
11400 .eraseblocks = { {4 * 1024 * 1024, 1} },
11401 .block_erase = spi_block_erase_60,
11402 }, {
11403 .eraseblocks = { {4 * 1024 * 1024, 1} },
11404 .block_erase = spi_block_erase_c7,
11405 }
11406 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011407 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011408 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011409 .write = spi_chip_write_256,
11410 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011411 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011412 },
11413
11414 {
11415 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011416 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011417 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000011418 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011419 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000011420 .total_size = 8192,
11421 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011422 /* supports SFDP */
11423 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011424 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011425 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000011426 .probe = probe_spi_rdid,
11427 .probe_timing = TIMING_ZERO,
11428 .block_erasers =
11429 {
11430 {
11431 .eraseblocks = { {4 * 1024, 2048} },
11432 .block_erase = spi_block_erase_20,
11433 }, {
11434 .eraseblocks = { {32 * 1024, 256} },
11435 .block_erase = spi_block_erase_52,
11436 }, {
11437 .eraseblocks = { {64 * 1024, 128} },
11438 .block_erase = spi_block_erase_d8,
11439 }, {
11440 .eraseblocks = { {8 * 1024 * 1024, 1} },
11441 .block_erase = spi_block_erase_60,
11442 }, {
11443 .eraseblocks = { {8 * 1024 * 1024, 1} },
11444 .block_erase = spi_block_erase_c7,
11445 }
11446 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011447 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011448 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000011449 .write = spi_chip_write_256,
11450 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011451 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000011452 },
11453
11454 {
11455 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011456 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011457 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011458 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011459 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011460 .total_size = 16384,
11461 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011462 /* supports SFDP */
11463 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011464 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011465 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011466 .probe = probe_spi_rdid,
11467 .probe_timing = TIMING_ZERO,
11468 .block_erasers =
11469 {
11470 {
11471 .eraseblocks = { {4 * 1024, 4096} },
11472 .block_erase = spi_block_erase_20,
11473 }, {
11474 .eraseblocks = { {32 * 1024, 512} },
11475 .block_erase = spi_block_erase_52,
11476 }, {
11477 .eraseblocks = { {64 * 1024, 256} },
11478 .block_erase = spi_block_erase_d8,
11479 }, {
11480 .eraseblocks = { {16 * 1024 * 1024, 1} },
11481 .block_erase = spi_block_erase_60,
11482 }, {
11483 .eraseblocks = { {16 * 1024 * 1024, 1} },
11484 .block_erase = spi_block_erase_c7,
11485 }
11486 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011487 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011488 .unlock = spi_disable_blockprotect,
11489 .write = spi_chip_write_256,
11490 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011491 .voltage = {2700, 3600},
11492 },
11493
11494 {
11495 .vendor = "Winbond",
11496 .name = "W25Q20.W",
11497 .bustype = BUS_SPI,
11498 .manufacture_id = WINBOND_NEX_ID,
11499 .model_id = WINBOND_NEX_W25Q20_W,
11500 .total_size = 256,
11501 .page_size = 256,
11502 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11503 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11504 .tested = TEST_UNTESTED,
11505 .probe = probe_spi_rdid,
11506 .probe_timing = TIMING_ZERO,
11507 .block_erasers =
11508 {
11509 {
11510 .eraseblocks = { {4 * 1024, 64} },
11511 .block_erase = spi_block_erase_20,
11512 }, {
11513 .eraseblocks = { {32 * 1024, 8} },
11514 .block_erase = spi_block_erase_52,
11515 }, {
11516 .eraseblocks = { {64 * 1024, 4} },
11517 .block_erase = spi_block_erase_d8,
11518 }, {
11519 .eraseblocks = { {256 * 1024, 1} },
11520 .block_erase = spi_block_erase_60,
11521 }, {
11522 .eraseblocks = { {256 * 1024, 1} },
11523 .block_erase = spi_block_erase_c7,
11524 }
11525 },
11526 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11527 .unlock = spi_disable_blockprotect,
11528 .write = spi_chip_write_256,
11529 .read = spi_chip_read,
11530 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11531 },
11532
11533 {
11534 .vendor = "Winbond",
11535 .name = "W25Q40.W",
11536 .bustype = BUS_SPI,
11537 .manufacture_id = WINBOND_NEX_ID,
11538 .model_id = WINBOND_NEX_W25Q40_W,
11539 .total_size = 512,
11540 .page_size = 256,
11541 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11542 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11543 .tested = TEST_UNTESTED,
11544 .probe = probe_spi_rdid,
11545 .probe_timing = TIMING_ZERO,
11546 .block_erasers =
11547 {
11548 {
11549 .eraseblocks = { {4 * 1024, 128} },
11550 .block_erase = spi_block_erase_20,
11551 }, {
11552 .eraseblocks = { {32 * 1024, 16} },
11553 .block_erase = spi_block_erase_52,
11554 }, {
11555 .eraseblocks = { {64 * 1024, 8} },
11556 .block_erase = spi_block_erase_d8,
11557 }, {
11558 .eraseblocks = { {512 * 1024, 1} },
11559 .block_erase = spi_block_erase_60,
11560 }, {
11561 .eraseblocks = { {512 * 1024, 1} },
11562 .block_erase = spi_block_erase_c7,
11563 }
11564 },
11565 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11566 .unlock = spi_disable_blockprotect,
11567 .write = spi_chip_write_256,
11568 .read = spi_chip_read,
11569 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11570 },
11571
11572 {
11573 .vendor = "Winbond",
11574 .name = "W25Q80.W",
11575 .bustype = BUS_SPI,
11576 .manufacture_id = WINBOND_NEX_ID,
11577 .model_id = WINBOND_NEX_W25Q80_W,
11578 .total_size = 1024,
11579 .page_size = 256,
11580 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11581 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11582 .tested = TEST_UNTESTED,
11583 .probe = probe_spi_rdid,
11584 .probe_timing = TIMING_ZERO,
11585 .block_erasers =
11586 {
11587 {
11588 .eraseblocks = { {4 * 1024, 256} },
11589 .block_erase = spi_block_erase_20,
11590 }, {
11591 .eraseblocks = { {32 * 1024, 32} },
11592 .block_erase = spi_block_erase_52,
11593 }, {
11594 .eraseblocks = { {64 * 1024, 16} },
11595 .block_erase = spi_block_erase_d8,
11596 }, {
11597 .eraseblocks = { {1 * 1024 * 1024, 1} },
11598 .block_erase = spi_block_erase_60,
11599 }, {
11600 .eraseblocks = { {1 * 1024 * 1024, 1} },
11601 .block_erase = spi_block_erase_c7,
11602 }
11603 },
11604 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11605 .unlock = spi_disable_blockprotect,
11606 .write = spi_chip_write_256,
11607 .read = spi_chip_read,
11608 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11609 },
11610
11611 {
11612 .vendor = "Winbond",
11613 .name = "W25Q16.W",
11614 .bustype = BUS_SPI,
11615 .manufacture_id = WINBOND_NEX_ID,
11616 .model_id = WINBOND_NEX_W25Q16_W,
11617 .total_size = 2048,
11618 .page_size = 256,
11619 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11620 /* QPI enable 0x38, disable 0xFF */
11621 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11622 .tested = TEST_UNTESTED,
11623 .probe = probe_spi_rdid,
11624 .probe_timing = TIMING_ZERO,
11625 .block_erasers =
11626 {
11627 {
11628 .eraseblocks = { {4 * 1024, 512} },
11629 .block_erase = spi_block_erase_20,
11630 }, {
11631 .eraseblocks = { {32 * 1024, 64} },
11632 .block_erase = spi_block_erase_52,
11633 }, {
11634 .eraseblocks = { {64 * 1024, 32} },
11635 .block_erase = spi_block_erase_d8,
11636 }, {
11637 .eraseblocks = { {2 * 1024 * 1024, 1} },
11638 .block_erase = spi_block_erase_60,
11639 }, {
11640 .eraseblocks = { {2 * 1024 * 1024, 1} },
11641 .block_erase = spi_block_erase_c7,
11642 }
11643 },
11644 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11645 .unlock = spi_disable_blockprotect,
11646 .write = spi_chip_write_256,
11647 .read = spi_chip_read,
11648 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11649 },
11650
11651 {
11652 .vendor = "Winbond",
11653 .name = "W25Q32.W",
11654 .bustype = BUS_SPI,
11655 .manufacture_id = WINBOND_NEX_ID,
11656 .model_id = WINBOND_NEX_W25Q32_W,
11657 .total_size = 4096,
11658 .page_size = 256,
11659 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11660 /* QPI enable 0x38, disable 0xFF */
11661 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11662 .tested = TEST_OK_PREW,
11663 .probe = probe_spi_rdid,
11664 .probe_timing = TIMING_ZERO,
11665 .block_erasers =
11666 {
11667 {
11668 .eraseblocks = { {4 * 1024, 1024} },
11669 .block_erase = spi_block_erase_20,
11670 }, {
11671 .eraseblocks = { {32 * 1024, 128} },
11672 .block_erase = spi_block_erase_52,
11673 }, {
11674 .eraseblocks = { {64 * 1024, 64} },
11675 .block_erase = spi_block_erase_d8,
11676 }, {
11677 .eraseblocks = { {4 * 1024 * 1024, 1} },
11678 .block_erase = spi_block_erase_60,
11679 }, {
11680 .eraseblocks = { {4 * 1024 * 1024, 1} },
11681 .block_erase = spi_block_erase_c7,
11682 }
11683 },
11684 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11685 .unlock = spi_disable_blockprotect,
11686 .write = spi_chip_write_256,
11687 .read = spi_chip_read,
11688 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11689 },
11690
11691 {
11692 .vendor = "Winbond",
11693 .name = "W25Q64.W",
11694 .bustype = BUS_SPI,
11695 .manufacture_id = WINBOND_NEX_ID,
11696 .model_id = WINBOND_NEX_W25Q64_W,
11697 .total_size = 8192,
11698 .page_size = 256,
11699 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11700 /* QPI enable 0x38, disable 0xFF */
11701 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011702 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011703 .probe = probe_spi_rdid,
11704 .probe_timing = TIMING_ZERO,
11705 .block_erasers =
11706 {
11707 {
11708 .eraseblocks = { {4 * 1024, 2048} },
11709 .block_erase = spi_block_erase_20,
11710 }, {
11711 .eraseblocks = { {32 * 1024, 256} },
11712 .block_erase = spi_block_erase_52,
11713 }, {
11714 .eraseblocks = { {64 * 1024, 128} },
11715 .block_erase = spi_block_erase_d8,
11716 }, {
11717 .eraseblocks = { {8 * 1024 * 1024, 1} },
11718 .block_erase = spi_block_erase_60,
11719 }, {
11720 .eraseblocks = { {8 * 1024 * 1024, 1} },
11721 .block_erase = spi_block_erase_c7,
11722 }
11723 },
11724 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11725 .unlock = spi_disable_blockprotect,
11726 .write = spi_chip_write_256,
11727 .read = spi_chip_read,
11728 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011729 },
11730
11731 {
11732 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011733 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011734 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011735 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011736 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011737 .total_size = 128,
11738 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011739 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011740 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011741 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011742 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011743 .block_erasers =
11744 {
11745 {
11746 .eraseblocks = { {4 * 1024, 32} },
11747 .block_erase = spi_block_erase_20,
11748 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011749 .eraseblocks = { {64 * 1024, 2} },
11750 .block_erase = spi_block_erase_d8,
11751 }, {
11752 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011753 .block_erase = spi_block_erase_c7,
11754 }
11755 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011756 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011757 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011758 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011759 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011760 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011761 },
11762
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011763 {
11764 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011765 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011766 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011767 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011768 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011769 .total_size = 256,
11770 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011771 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011772 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011773 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011774 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011775 .block_erasers =
11776 {
11777 {
11778 .eraseblocks = { {4 * 1024, 64} },
11779 .block_erase = spi_block_erase_20,
11780 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011781 .eraseblocks = { {64 * 1024, 4} },
11782 .block_erase = spi_block_erase_d8,
11783 }, {
11784 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011785 .block_erase = spi_block_erase_c7,
11786 }
11787 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011788 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011789 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011790 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011791 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011792 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011793 },
11794
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011795 {
11796 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011797 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011798 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011799 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011800 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011801 .total_size = 512,
11802 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011803 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000011804 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011805 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011806 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011807 .block_erasers =
11808 {
11809 {
11810 .eraseblocks = { {4 * 1024, 128} },
11811 .block_erase = spi_block_erase_20,
11812 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011813 .eraseblocks = { {64 * 1024, 8} },
11814 .block_erase = spi_block_erase_d8,
11815 }, {
11816 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011817 .block_erase = spi_block_erase_c7,
11818 }
11819 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011820 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011821 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011822 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011823 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011824 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011825 },
11826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011827 {
11828 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011829 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011830 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011831 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011832 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011833 .total_size = 1024,
11834 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011835 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000011836 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011837 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011838 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011839 .block_erasers =
11840 {
11841 {
11842 .eraseblocks = { {4 * 1024, 256} },
11843 .block_erase = spi_block_erase_20,
11844 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011845 .eraseblocks = { {64 * 1024, 16} },
11846 .block_erase = spi_block_erase_d8,
11847 }, {
11848 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011849 .block_erase = spi_block_erase_c7,
11850 }
11851 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011852 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011853 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011854 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011855 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011856 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011857 },
11858
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011859 {
11860 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011861 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011862 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000011863 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011864 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000011865 .total_size = 2048,
11866 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011867 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000011868 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000011869 .probe = probe_spi_rdid,
11870 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011871 .block_erasers =
11872 {
11873 {
11874 .eraseblocks = { {4 * 1024, 512} },
11875 .block_erase = spi_block_erase_20,
11876 }, {
11877 .eraseblocks = { {32 * 1024, 64} },
11878 .block_erase = spi_block_erase_52,
11879 }, {
11880 .eraseblocks = { {64 * 1024, 32} },
11881 .block_erase = spi_block_erase_d8,
11882 }, {
11883 .eraseblocks = { {2 * 1024 * 1024, 1} },
11884 .block_erase = spi_block_erase_60,
11885 }, {
11886 .eraseblocks = { {2 * 1024 * 1024, 1} },
11887 .block_erase = spi_block_erase_c7,
11888 }
11889 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011890 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011891 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000011892 .write = spi_chip_write_256,
11893 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011894 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000011895 },
11896
11897 {
11898 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011899 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011900 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000011901 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011902 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000011903 .total_size = 4096,
11904 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011905 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +000011906 .tested = TEST_OK_PROBE,
11907 .probe = probe_spi_rdid,
11908 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011909 .block_erasers =
11910 {
11911 {
11912 .eraseblocks = { {4 * 1024, 1024} },
11913 .block_erase = spi_block_erase_20,
11914 }, {
11915 .eraseblocks = { {32 * 1024, 128} },
11916 .block_erase = spi_block_erase_52,
11917 }, {
11918 .eraseblocks = { {64 * 1024, 64} },
11919 .block_erase = spi_block_erase_d8,
11920 }, {
11921 .eraseblocks = { {4 * 1024 * 1024, 1} },
11922 .block_erase = spi_block_erase_60,
11923 }, {
11924 .eraseblocks = { {4 * 1024 * 1024, 1} },
11925 .block_erase = spi_block_erase_c7,
11926 }
11927 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011928 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011929 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000011930 .write = spi_chip_write_256,
11931 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011932 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000011933 },
11934
11935 {
11936 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011937 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011938 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000011939 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011940 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000011941 .total_size = 8192,
11942 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011943 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011944 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000011945 .probe = probe_spi_rdid,
11946 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011947 .block_erasers =
11948 {
11949 {
11950 .eraseblocks = { {4 * 1024, 2048} },
11951 .block_erase = spi_block_erase_20,
11952 }, {
11953 .eraseblocks = { {32 * 1024, 256} },
11954 .block_erase = spi_block_erase_52,
11955 }, {
11956 .eraseblocks = { {64 * 1024, 128} },
11957 .block_erase = spi_block_erase_d8,
11958 }, {
11959 .eraseblocks = { {8 * 1024 * 1024, 1} },
11960 .block_erase = spi_block_erase_60,
11961 }, {
11962 .eraseblocks = { {8 * 1024 * 1024, 1} },
11963 .block_erase = spi_block_erase_c7,
11964 }
11965 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011966 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011967 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000011968 .write = spi_chip_write_256,
11969 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011970 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000011971 },
11972
11973 {
11974 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000011975 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011976 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000011977 .manufacture_id = WINBOND_ID,
11978 .model_id = WINBOND_W29C010,
11979 .total_size = 128,
11980 .page_size = 128,
11981 .feature_bits = FEATURE_LONG_RESET,
11982 .tested = TEST_OK_PRE,
11983 .probe = probe_w29ee011,
11984 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
11985 .block_erasers =
11986 {
11987 {
11988 .eraseblocks = { {128 * 1024, 1} },
11989 .block_erase = erase_chip_block_jedec,
11990 }
11991 },
11992 .write = write_jedec,
11993 .read = read_memmapped,
11994 },
11995
11996 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
11997 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000011998 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011999 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012000 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012001 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012002 .total_size = 128,
12003 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012004 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000012005 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012006 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012007 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012008 .block_erasers =
12009 {
12010 {
12011 .eraseblocks = { {128 * 1024, 1} },
12012 .block_erase = erase_chip_block_jedec,
12013 }
12014 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012015 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012016 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000012017 },
12018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012019 {
12020 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012021 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012022 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012023 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012024 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012025 .total_size = 256,
12026 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012027 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012028 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012029 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012030 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012031 .block_erasers =
12032 {
12033 {
12034 .eraseblocks = { {256 * 1024, 1} },
12035 .block_erase = erase_chip_block_jedec,
12036 }
12037 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012038 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012039 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012040 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012041 },
12042
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012043 {
12044 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012045 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012046 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012047 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012048 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012049 .total_size = 512,
12050 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000012051 .feature_bits = FEATURE_LONG_RESET,
12052 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012053 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012054 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012055 .block_erasers =
12056 {
12057 {
12058 .eraseblocks = { {512 * 1024, 1} },
12059 .block_erase = erase_chip_block_jedec,
12060 }
12061 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012062 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012063 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012064 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012065 },
12066
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012067 {
12068 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000012069 .name = "W39F010",
12070 .bustype = BUS_PARALLEL,
12071 .manufacture_id = WINBOND_ID,
12072 .model_id = WINBOND_W39F010,
12073 .total_size = 128,
12074 .page_size = 4 * 1024,
12075 .feature_bits = FEATURE_EITHER_RESET,
12076 .tested = TEST_OK_PREW,
12077 .probe = probe_jedec,
12078 .probe_timing = 10,
12079 .block_erasers =
12080 {
12081 {
12082 .eraseblocks = { {4 * 1024, 32} },
12083 .block_erase = erase_block_jedec,
12084 }, {
12085 .eraseblocks = { {128 * 1024, 1} },
12086 .block_erase = erase_chip_block_jedec,
12087 }
12088 },
12089 .printlock = printlock_w39f010,
12090 .write = write_jedec_1,
12091 .read = read_memmapped,
12092 .voltage = {4500, 5500},
12093 },
12094
12095 {
12096 .vendor = "Winbond",
12097 .name = "W39L010",
12098 .bustype = BUS_PARALLEL,
12099 .manufacture_id = WINBOND_ID,
12100 .model_id = WINBOND_W39L010,
12101 .total_size = 128,
12102 .page_size = 4 * 1024,
12103 .feature_bits = FEATURE_EITHER_RESET,
12104 .tested = TEST_UNTESTED,
12105 .probe = probe_jedec,
12106 .probe_timing = 10,
12107 .block_erasers =
12108 {
12109 {
12110 .eraseblocks = { {4 * 1024, 32} },
12111 .block_erase = erase_block_jedec,
12112 }, {
12113 .eraseblocks = { {128 * 1024, 1} },
12114 .block_erase = erase_chip_block_jedec,
12115 }
12116 },
12117 .printlock = printlock_w39l010,
12118 .write = write_jedec_1,
12119 .read = read_memmapped,
12120 .voltage = {3000, 3600},
12121 },
12122
12123 {
12124 .vendor = "Winbond",
12125 .name = "W39L020",
12126 .bustype = BUS_PARALLEL,
12127 .manufacture_id = WINBOND_ID,
12128 .model_id = WINBOND_W39L020,
12129 .total_size = 256,
12130 .page_size = 4 * 1024,
12131 .feature_bits = FEATURE_EITHER_RESET,
12132 .tested = TEST_UNTESTED,
12133 .probe = probe_jedec,
12134 .probe_timing = 10,
12135 .block_erasers =
12136 {
12137 {
12138 .eraseblocks = { {4 * 1024, 64} },
12139 .block_erase = erase_block_jedec,
12140 }, {
12141 .eraseblocks = { {64 * 1024, 4} },
12142 .block_erase = erase_sector_jedec,
12143 }, {
12144 .eraseblocks = { {256 * 1024, 1} },
12145 .block_erase = erase_chip_block_jedec,
12146 }
12147 },
12148 .printlock = printlock_w39l020,
12149 .write = write_jedec_1,
12150 .read = read_memmapped,
12151 .voltage = {3000, 3600},
12152 },
12153
12154 {
12155 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000012156 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012157 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000012158 .manufacture_id = WINBOND_ID,
12159 .model_id = WINBOND_W39L040,
12160 .total_size = 512,
12161 .page_size = 64 * 1024,
12162 .feature_bits = FEATURE_EITHER_RESET,
12163 .tested = TEST_OK_PR,
12164 .probe = probe_jedec,
12165 .probe_timing = 10,
12166 .block_erasers =
12167 {
12168 {
12169 .eraseblocks = { {4 * 1024, 128} },
12170 .block_erase = erase_block_jedec,
12171 }, {
12172 .eraseblocks = { {64 * 1024, 8} },
12173 .block_erase = erase_sector_jedec,
12174 }, {
12175 .eraseblocks = { {512 * 1024, 1} },
12176 .block_erase = erase_chip_block_jedec,
12177 }
12178 },
12179 .printlock = printlock_w39l040,
12180 .write = write_jedec_1,
12181 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012182 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000012183 },
12184
12185 {
12186 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012187 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012188 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012189 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012190 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012191 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012192 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012193 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012194 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012195 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000012196 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012197 .block_erasers =
12198 {
12199 {
12200 .eraseblocks = { {64 * 1024, 8} },
12201 .block_erase = erase_sector_jedec,
12202 }, {
12203 .eraseblocks = { {512 * 1024, 1} },
12204 .block_erase = erase_chip_block_jedec,
12205 }
12206 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012207 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000012208 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012209 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012210 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012211 },
12212
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012213 {
12214 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012215 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012216 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012217 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012218 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012219 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012220 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012221 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012222 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012223 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000012224 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012225 .block_erasers =
12226 {
12227 {
12228 .eraseblocks = { {64 * 1024, 8} },
12229 .block_erase = erase_sector_jedec,
12230 }, {
12231 .eraseblocks = { {512 * 1024, 1} },
12232 .block_erase = erase_chip_block_jedec,
12233 }
12234 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012235 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000012236 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012237 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012238 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012239 },
12240
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012241 {
12242 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012243 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012244 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012245 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012246 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012247 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012248 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012249 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012250 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000012251 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012252 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012253 .block_erasers =
12254 {
12255 {
12256 .eraseblocks = { {64 * 1024, 8} },
12257 .block_erase = erase_sector_jedec,
12258 }, {
12259 .eraseblocks = { {512 * 1024, 1} },
12260 .block_erase = erase_chip_block_jedec,
12261 }
12262 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000012263 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000012264 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012265 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012266 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012267 },
12268
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012269 {
12270 .vendor = "Winbond",
12271 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012272 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012273 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012274 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012275 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012276 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000012277 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012278 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012279 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012280 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012281 .block_erasers =
12282 {
12283 {
12284 .eraseblocks = { {4 * 1024, 128} },
12285 .block_erase = erase_block_jedec,
12286 }, {
12287 .eraseblocks = { {64 * 1024, 8} },
12288 .block_erase = erase_sector_jedec,
12289 }, {
12290 .eraseblocks = { {512 * 1024, 1} },
12291 .block_erase = erase_chip_block_jedec,
12292 }
12293 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012294 .printlock = printlock_w39v040fa,
Michael Karcherc9b63412010-05-30 16:55:18 +000012295 .unlock = unlock_sst_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +000012296 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012297 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012298 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012299 },
12300
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012301 {
12302 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012303 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012304 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012305 .manufacture_id = WINBOND_ID,
12306 .model_id = WINBOND_W39V040B,
12307 .total_size = 512,
12308 .page_size = 64 * 1024,
12309 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000012310 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012311 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012312 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012313 .block_erasers =
12314 {
12315 {
12316 .eraseblocks = { {64 * 1024, 8} },
12317 .block_erase = erase_sector_jedec,
12318 }, {
12319 .eraseblocks = { {512 * 1024, 1} },
12320 .block_erase = erase_chip_block_jedec,
12321 }
12322 },
12323 .printlock = printlock_w39v040fb,
Idwer Volleringecc67072010-12-26 23:55:12 +000012324 .unlock = unlock_w39v040fb,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012325 .write = write_jedec_1,
12326 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012327 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012328 },
12329
12330 {
12331 .vendor = "Winbond",
12332 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012333 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012334 .manufacture_id = WINBOND_ID,
12335 .model_id = WINBOND_W39V040C,
12336 .total_size = 512,
12337 .page_size = 64 * 1024,
12338 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000012339 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012340 .probe = probe_jedec,
12341 .probe_timing = 10,
12342 .block_erasers =
12343 {
12344 {
12345 .eraseblocks = { {64 * 1024, 8} },
12346 .block_erase = erase_sector_jedec,
12347 }, {
12348 .eraseblocks = { {512 * 1024, 1} },
12349 .block_erase = erase_chip_block_jedec,
12350 }
12351 },
12352 .printlock = printlock_w39v040fc,
12353 .write = write_jedec_1,
12354 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012355 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012356 },
12357
12358 {
12359 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012360 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012361 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012362 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012363 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012364 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012365 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012366 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000012367 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012368 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000012369 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012370 .block_erasers =
12371 {
12372 {
12373 .eraseblocks = { {64 * 1024, 16} },
12374 .block_erase = erase_sector_jedec,
12375 }, {
12376 .eraseblocks = { {1024 * 1024, 1} },
12377 .block_erase = erase_chip_block_jedec,
12378 }
12379 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012380 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000012381 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012382 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012383 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012384 },
12385
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012386 {
12387 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012388 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012389 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012390 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012391 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012392 .total_size = 256,
12393 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012394 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012395 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012396 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012397 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012398 .block_erasers =
12399 {
12400 {
12401 .eraseblocks = {
12402 {128 * 1024, 1},
12403 {96 * 1024, 1},
12404 {8 * 1024, 2},
12405 {16 * 1024, 1},
12406 },
12407 .block_erase = erase_sector_jedec,
12408 }, {
12409 .eraseblocks = { {256 * 1024, 1} },
12410 .block_erase = erase_chip_block_jedec,
12411 }
12412 },
Sean Nelson35727f72010-01-28 23:55:12 +000012413 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012414 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012415 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012416 },
12417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012418 {
12419 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012420 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012421 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012422 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012423 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012424 .total_size = 256,
12425 .page_size = 128,
12426 .feature_bits = FEATURE_EITHER_RESET,
12427 .tested = TEST_OK_PROBE,
12428 .probe = probe_jedec,
12429 .probe_timing = 10,
12430 .block_erasers =
12431 {
12432 {
12433 .eraseblocks = { {256 * 1024, 1} },
12434 .block_erase = erase_chip_block_jedec,
12435 }
12436 },
12437 .write = write_jedec_1,
12438 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012439 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012440 },
12441
12442 {
12443 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012444 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012445 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012446 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012447 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012448 .total_size = 256,
12449 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012450 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012451 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012452 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012453 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012454 .block_erasers =
12455 {
12456 {
12457 .eraseblocks = {
12458 {64 * 1024, 3},
12459 {32 * 1024, 1},
12460 {8 * 1024, 2},
12461 {16 * 1024, 1},
12462 },
12463 .block_erase = erase_sector_jedec,
12464 }, {
12465 .eraseblocks = { {256 * 1024, 1} },
12466 .block_erase = erase_chip_block_jedec,
12467 }
12468 },
Sean Nelson35727f72010-01-28 23:55:12 +000012469 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012470 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012471 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012472 },
12473
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012474 {
12475 .vendor = "Winbond",
12476 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012477 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012478 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012479 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012480 .total_size = 256,
12481 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012482 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000012483 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012484 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012485 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012486 .block_erasers =
12487 {
12488 {
12489 .eraseblocks = {
12490 {64 * 1024, 3},
12491 {32 * 1024, 1},
12492 {8 * 1024, 2},
12493 {16 * 1024, 1},
12494 },
12495 .block_erase = erase_sector_jedec,
12496 }, {
12497 .eraseblocks = { {256 * 1024, 1} },
12498 .block_erase = erase_chip_block_jedec,
12499 }
12500 },
Sean Nelson35727f72010-01-28 23:55:12 +000012501 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012502 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012503 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012504 },
12505
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012506 {
12507 .vendor = "Winbond",
12508 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012509 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012510 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012511 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012512 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012513 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012514 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012515 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012516 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012517 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012518 .block_erasers =
12519 {
12520 {
12521 .eraseblocks = { {64 * 1024, 16}, },
12522 .block_erase = erase_sector_jedec,
12523 }, {
12524 .eraseblocks = { {1024 * 1024, 1} },
12525 .block_erase = erase_chip_block_jedec,
12526 }
12527 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012528 .printlock = printlock_w39v080fa,
12529 .unlock = unlock_w39v080fa,
Sean Nelson35727f72010-01-28 23:55:12 +000012530 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012531 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012532 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012533 },
12534
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012535 {
12536 .vendor = "Winbond",
12537 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012538 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012539 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012540 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012541 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012542 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012543 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012544 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012545 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012546 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012547 .block_erasers =
12548 {
12549 {
12550 .eraseblocks = { {64 * 1024, 8}, },
12551 .block_erase = erase_sector_jedec,
12552 }, {
12553 .eraseblocks = { {512 * 1024, 1} },
12554 .block_erase = erase_chip_block_jedec,
12555 }
12556 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012557 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000012558 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012559 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012560 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012561 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012562
12563 {
12564 .vendor = "Unknown",
12565 .name = "SFDP-capable chip",
12566 .bustype = BUS_SPI,
12567 .manufacture_id = GENERIC_MANUF_ID,
12568 .model_id = SFDP_DEVICE_ID,
12569 /* We present our own "report this" text hence we do not
12570 * want the default "This flash part has status UNTESTED..."
12571 * text to be printed. */
12572 .tested = TEST_OK_PREW,
12573 .probe = probe_spi_sfdp,
12574 .unlock = spi_disable_blockprotect, /* is this safe? */
12575 .read = spi_chip_read,
12576 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000012577 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012578 /* Everything below will be set by the probing function. */
12579 .write = NULL,
12580 .total_size = 0,
12581 .page_size = 0,
12582 .feature_bits = 0,
12583 .block_erasers = {},
12584 },
FENG yu ningff692fb2008-12-08 18:15:10 +000012585
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012586 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000012587 .vendor = "Programmer",
12588 .name = "Opaque flash chip",
12589 .bustype = BUS_PROG,
12590 .manufacture_id = PROGMANUF_ID,
12591 .model_id = PROGDEV_ID,
12592 .total_size = 0,
12593 .page_size = 256,
12594 /* probe is assumed to work, rest will be filled in by probe */
12595 .tested = TEST_OK_PROBE,
12596 .probe = probe_opaque,
12597 /* eraseblock sizes will be set by the probing function */
12598 .block_erasers =
12599 {
12600 {
12601 .block_erase = erase_opaque,
12602 }
12603 },
12604 .write = write_opaque,
12605 .read = read_opaque,
12606 },
12607
12608 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012609 .vendor = "AMIC",
12610 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012611 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012612 .manufacture_id = AMIC_ID,
12613 .model_id = GENERIC_DEVICE_ID,
12614 .total_size = 0,
12615 .page_size = 256,
12616 .tested = TEST_BAD_PREW,
12617 .probe = probe_spi_rdid4,
12618 .probe_timing = TIMING_ZERO,
12619 .write = NULL,
12620 .read = NULL,
12621 },
12622
12623 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012624 .vendor = "Atmel",
12625 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012626 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012627 .manufacture_id = ATMEL_ID,
12628 .model_id = GENERIC_DEVICE_ID,
12629 .total_size = 0,
12630 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012631 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012632 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012633 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012634 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012635 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012636 },
12637
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012638 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000012639 .vendor = "Eon",
12640 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012641 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012642 .manufacture_id = EON_ID_NOPREFIX,
12643 .model_id = GENERIC_DEVICE_ID,
12644 .total_size = 0,
12645 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012646 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012647 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012648 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012649 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012650 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012651 },
12652
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012653 {
12654 .vendor = "Macronix",
12655 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012656 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012657 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012658 .model_id = GENERIC_DEVICE_ID,
12659 .total_size = 0,
12660 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012661 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012662 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012663 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012664 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012665 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012666 },
12667
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012668 {
12669 .vendor = "PMC",
12670 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012671 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012672 .manufacture_id = PMC_ID,
12673 .model_id = GENERIC_DEVICE_ID,
12674 .total_size = 0,
12675 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012676 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012677 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012678 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012679 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012680 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012681 },
12682
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012683 {
12684 .vendor = "SST",
12685 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012686 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012687 .manufacture_id = SST_ID,
12688 .model_id = GENERIC_DEVICE_ID,
12689 .total_size = 0,
12690 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012691 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012692 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012693 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012694 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012695 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012696 },
12697
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012698 {
12699 .vendor = "ST",
12700 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012701 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012702 .manufacture_id = ST_ID,
12703 .model_id = GENERIC_DEVICE_ID,
12704 .total_size = 0,
12705 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012706 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012707 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012708 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012709 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012710 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012711 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000012712
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012713 {
Sean Nelson118e1d62009-11-24 02:08:11 +000012714 .vendor = "Sanyo",
12715 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012716 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000012717 .manufacture_id = SANYO_ID,
12718 .model_id = GENERIC_DEVICE_ID,
12719 .total_size = 0,
12720 .page_size = 256,
12721 .tested = TEST_BAD_PREW,
12722 .probe = probe_spi_rdid,
12723 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000012724 .write = NULL,
12725 .read = NULL,
12726 },
12727
12728 {
Stefan Taunereb582572012-09-21 12:52:50 +000012729 .vendor = "Winbond",
12730 .name = "unknown Winbond (ex Nexcom) SPI chip",
12731 .bustype = BUS_SPI,
12732 .manufacture_id = WINBOND_NEX_ID,
12733 .model_id = GENERIC_DEVICE_ID,
12734 .total_size = 0,
12735 .page_size = 256,
12736 .tested = TEST_BAD_PREW,
12737 .probe = probe_spi_rdid,
12738 .probe_timing = TIMING_ZERO,
12739 .write = NULL,
12740 .read = NULL,
12741 },
12742
12743 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012744 .vendor = "Generic",
12745 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012746 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012747 .manufacture_id = GENERIC_MANUF_ID,
12748 .model_id = GENERIC_DEVICE_ID,
12749 .total_size = 0,
12750 .page_size = 256,
12751 .tested = TEST_BAD_PREW,
12752 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012753 .write = NULL,
12754 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000012755
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012756 {
12757 .vendor = "Generic",
12758 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012759 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012760 .manufacture_id = GENERIC_MANUF_ID,
12761 .model_id = GENERIC_DEVICE_ID,
12762 .total_size = 0,
12763 .page_size = 256,
12764 .tested = TEST_BAD_PREW,
12765 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012766 .write = NULL,
12767 },
12768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012769 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +000012770};