blob: deff6184477919aeedd40bc3e3c1101b428f44ce [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,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002340 .total_size = 128 /* or 132, determined from status register */,
2341 .page_size = 256 /* or 264, 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 */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002343 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2344 .feature_bits = FEATURE_OTP,
2345 .tested = TEST_UNTESTED,
2346 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002347 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002348 .block_erasers =
2349 {
2350 {
2351 .eraseblocks = { {256, 512} },
2352 .block_erase = spi_erase_at45db_page,
2353 }, {
2354 .eraseblocks = { {8 * 256, 512/8} },
2355 .block_erase = spi_erase_at45db_block,
2356 }, {
2357 .eraseblocks = {
2358 {8 * 256, 1},
2359 {120 * 256, 1},
2360 {128 * 256, 3},
2361 },
2362 .block_erase = spi_erase_at45db_sector
2363 }, {
2364 .eraseblocks = { {128 * 1024, 1} },
2365 .block_erase = spi_erase_at45db_chip,
2366 }
2367 },
2368 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2369 .printlock = spi_prettyprint_status_register_at45db,
2370 /* granularity will be set by the probing function. */
2371 .write = spi_write_at45db,
2372 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002373 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002374 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002375
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002376 {
2377 .vendor = "Atmel",
2378 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002379 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002381 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002382 .total_size = 256 /* or 264, determined from status register */,
2383 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002384 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002385 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2386 .feature_bits = FEATURE_OTP,
2387 .tested = TEST_UNTESTED,
2388 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002389 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002390 .block_erasers =
2391 {
2392 {
2393 .eraseblocks = { {256, 1024} },
2394 .block_erase = spi_erase_at45db_page,
2395 }, {
2396 .eraseblocks = { {8 * 256, 1024/8} },
2397 .block_erase = spi_erase_at45db_block,
2398 }, {
2399 .eraseblocks = {
2400 {8 * 256, 1},
2401 {120 * 256, 1},
2402 {128 * 256, 7},
2403 },
2404 .block_erase = spi_erase_at45db_sector
2405 }, {
2406 .eraseblocks = { {256 * 1024, 1} },
2407 .block_erase = spi_erase_at45db_chip,
2408 }
2409 },
2410 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2411 .printlock = spi_prettyprint_status_register_at45db,
2412 /* granularity will be set by the probing function. */
2413 .write = spi_write_at45db,
2414 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002415 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002416 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002418 {
2419 .vendor = "Atmel",
2420 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002421 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002422 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002423 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002424 .total_size = 512 /* or 528, determined from status register */,
2425 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002426 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002427 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2428 .feature_bits = FEATURE_OTP,
2429 .tested = TEST_OK_PREW,
2430 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002431 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002432 .block_erasers =
2433 {
2434 {
2435 .eraseblocks = { {256, 2048} },
2436 .block_erase = spi_erase_at45db_page,
2437 }, {
2438 .eraseblocks = { {8 * 256, 2048/8} },
2439 .block_erase = spi_erase_at45db_block,
2440 }, {
2441 .eraseblocks = {
2442 {8 * 256, 1},
2443 {248 * 256, 1},
2444 {256 * 256, 7},
2445 },
2446 .block_erase = spi_erase_at45db_sector
2447 }, {
2448 .eraseblocks = { {512 * 1024, 1} },
2449 .block_erase = spi_erase_at45db_chip,
2450 }
2451 },
2452 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2453 .printlock = spi_prettyprint_status_register_at45db,
2454 /* granularity will be set by the probing function. */
2455 .write = spi_write_at45db,
2456 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2457 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002458 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002459
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002460 {
2461 .vendor = "Atmel",
2462 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002463 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002464 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002465 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002466 .total_size = 1024 /* or 1056, determined from status register */,
2467 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002468 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002469 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2470 .feature_bits = FEATURE_OTP,
2471 .tested = TEST_UNTESTED,
2472 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002473 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002474 .block_erasers =
2475 {
2476 {
2477 .eraseblocks = { {256, 4096} },
2478 .block_erase = spi_erase_at45db_page,
2479 }, {
2480 .eraseblocks = { {8 * 256, 4096/8} },
2481 .block_erase = spi_erase_at45db_block,
2482 }, {
2483 .eraseblocks = {
2484 {8 * 256, 1},
2485 {248 * 256, 1},
2486 {256 * 256, 15},
2487 },
2488 .block_erase = spi_erase_at45db_sector
2489 }, {
2490 .eraseblocks = { {1024 * 1024, 1} },
2491 .block_erase = spi_erase_at45db_chip,
2492 }
2493 },
2494 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2495 .printlock = spi_prettyprint_status_register_at45db,
2496 /* granularity will be set by the probing function. */
2497 .write = spi_write_at45db,
2498 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002499 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002500 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002501
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002502 {
2503 .vendor = "Atmel",
2504 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002505 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002506 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002507 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002508 .total_size = 2048 /* or 2112, determined from status register */,
2509 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002510 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002511 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2512 .feature_bits = FEATURE_OTP,
2513 .tested = TEST_OK_PREW,
2514 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002515 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002516 .block_erasers =
2517 {
2518 {
2519 .eraseblocks = { {512, 4096} },
2520 .block_erase = spi_erase_at45db_page,
2521 }, {
2522 .eraseblocks = { {8 * 512, 4096/8} },
2523 .block_erase = spi_erase_at45db_block,
2524 }, {
2525 .eraseblocks = {
2526 {8 * 512, 1},
2527 {248 * 512, 1},
2528 {256 * 512, 15},
2529 },
2530 .block_erase = spi_erase_at45db_sector
2531 }, {
2532 .eraseblocks = { {2048 * 1024, 1} },
2533 .block_erase = spi_erase_at45db_chip,
2534 }
2535 },
2536 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2537 .printlock = spi_prettyprint_status_register_at45db,
2538 /* granularity will be set by the probing function. */
2539 .write = spi_write_at45db,
2540 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002541 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002542 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002543
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002544 {
2545 .vendor = "Atmel",
2546 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002547 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002548 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002549 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002550 .total_size = 4224 /* No power of two sizes */,
2551 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002552 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002553 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2554 .feature_bits = FEATURE_OTP,
2555 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002556 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002557 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002558 .block_erasers =
2559 {
2560 {
2561 .eraseblocks = { {528, 8192} },
2562 .block_erase = spi_erase_at45db_page,
2563 }, {
2564 .eraseblocks = { {8 * 528, 8192/8} },
2565 .block_erase = spi_erase_at45db_block,
2566 }, /* Although the datasheets describes sectors (which can be write protected)
2567 * there seems to be no erase functions for them.
2568 {
2569 .eraseblocks = {
2570 {8 * 528, 1},
2571 {120 * 528, 1},
2572 {128 * 528, 63},
2573 },
2574 .block_erase = spi_erase_at45db_sector
2575 }, */ {
2576 .eraseblocks = { {4224 * 1024, 1} },
2577 .block_erase = spi_erase_at45db_chip,
2578 }
2579 },
2580 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2581 .gran = write_gran_528bytes,
2582 .write = spi_write_at45db,
2583 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002584 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002585 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002586
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002587 {
2588 .vendor = "Atmel",
2589 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002590 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002591 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002592 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002593 .total_size = 4096 /* or 4224, determined from status register */,
2594 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002595 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002596 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002597 .feature_bits = FEATURE_OTP,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002598 .tested = TEST_UNTESTED,
2599 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002600 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002601 .block_erasers =
2602 {
2603 {
2604 .eraseblocks = { {512, 8192} },
2605 .block_erase = spi_erase_at45db_page,
2606 }, {
2607 .eraseblocks = { {8 * 512, 8192/8} },
2608 .block_erase = spi_erase_at45db_block,
2609 }, {
2610 .eraseblocks = {
2611 {8 * 512, 1},
2612 {120 * 512, 1},
2613 {128 * 512, 63},
2614 },
2615 .block_erase = spi_erase_at45db_sector
2616 }, {
2617 .eraseblocks = { {4096 * 1024, 1} },
2618 .block_erase = spi_erase_at45db_chip,
2619 }
2620 },
2621 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2622 .printlock = spi_prettyprint_status_register_at45db,
2623 /* granularity will be set by the probing function. */
2624 .write = spi_write_at45db,
2625 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2626 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2627 },
2628
2629 {
2630 .vendor = "Atmel",
2631 .name = "AT45DB321E",
2632 .bustype = BUS_SPI,
2633 .manufacture_id = ATMEL_ID,
2634 .model_id = ATMEL_AT45DB321C,
2635 .total_size = 4096 /* or 4224, determined from status register */,
2636 .page_size = 512 /* or 528, determined from status register */,
2637 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2638 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2639 .feature_bits = FEATURE_OTP,
2640 .tested = TEST_UNTESTED,
2641 .probe = probe_spi_at45db,
2642 .probe_timing = TIMING_ZERO,
2643 .block_erasers =
2644 {
2645 {
2646 .eraseblocks = { {512, 8192} },
2647 .block_erase = spi_erase_at45db_page,
2648 }, {
2649 .eraseblocks = { {8 * 512, 8192/8} },
2650 .block_erase = spi_erase_at45db_block,
2651 }, {
2652 .eraseblocks = {
2653 {8 * 512, 1},
2654 {120 * 512, 1},
2655 {128 * 512, 63},
2656 },
2657 .block_erase = spi_erase_at45db_sector
2658 }, {
2659 .eraseblocks = { {4096 * 1024, 1} },
2660 .block_erase = spi_erase_at45db_chip,
2661 }
2662 },
2663 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2664 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2665 /* granularity will be set by the probing function. */
2666 .write = spi_write_at45db,
2667 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2668 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002669 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002670
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002671 {
2672 .vendor = "Atmel",
2673 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002674 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002675 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002676 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002677 .total_size = 8192 /* or 8448, determined from status register */,
2678 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002679 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002680 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2681 .feature_bits = FEATURE_OTP,
2682 .tested = TEST_UNTESTED,
2683 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002684 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002685 .block_erasers =
2686 {
2687 {
2688 .eraseblocks = { {1024, 8192} },
2689 .block_erase = spi_erase_at45db_page,
2690 }, {
2691 .eraseblocks = { {8 * 1024, 8192/8} },
2692 .block_erase = spi_erase_at45db_block,
2693 }, {
2694 .eraseblocks = {
2695 {8 * 1024, 1},
2696 {248 * 1024, 1},
2697 {256 * 1024, 31},
2698 },
2699 .block_erase = spi_erase_at45db_sector
2700 }, {
2701 .eraseblocks = { {8192 * 1024, 1} },
2702 .block_erase = spi_erase_at45db_chip,
2703 }
2704 },
2705 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2706 .printlock = spi_prettyprint_status_register_at45db,
2707 /* granularity will be set by the probing function. */
2708 .write = spi_write_at45db,
2709 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002710 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002711 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002712
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002713 {
2714 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002715 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002716 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002717 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002718 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002719 .total_size = 64,
2720 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002721 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002722 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002723 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002724 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002725 .block_erasers =
2726 {
2727 {
2728 .eraseblocks = { {64 * 1024, 1} },
2729 .block_erase = erase_chip_block_jedec,
2730 }
2731 },
Sean Nelson35727f72010-01-28 23:55:12 +00002732 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002733 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002734 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002735 },
2736
2737 {
2738 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002739 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002740 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002741 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002742 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002743 .total_size = 256,
2744 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002745 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002746 .tested = TEST_UNTESTED,
2747 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002748 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002749 .block_erasers =
2750 {
2751 {
2752 .eraseblocks = {
2753 {16 * 1024, 1},
2754 {8 * 1024, 2},
2755 {96 * 1024, 1},
2756 {128 * 1024, 1},
2757 },
2758 .block_erase = erase_sector_jedec,
2759 }, {
2760 .eraseblocks = { {256 * 1024, 1} },
2761 .block_erase = erase_chip_block_jedec,
2762 }
2763 },
Sean Nelson35727f72010-01-28 23:55:12 +00002764 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002765 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002766 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002767 },
2768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002769 {
2770 .vendor = "Atmel",
2771 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002772 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002773 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002774 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002775 .total_size = 256,
2776 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002777 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002778 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002779 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002780 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002781 .block_erasers =
2782 {
2783 {
2784 .eraseblocks = {
2785 {128 * 1024, 1},
2786 {96 * 1024, 1},
2787 {8 * 1024, 2},
2788 {16 * 1024, 1},
2789 },
2790 .block_erase = erase_sector_jedec,
2791 }, {
2792 .eraseblocks = { {256 * 1024, 1} },
2793 .block_erase = erase_chip_block_jedec,
2794 }
2795 },
Sean Nelson35727f72010-01-28 23:55:12 +00002796 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002797 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002798 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002799 },
2800
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002801 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002802 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002803 .name = "AT49(H)F010",
2804 .bustype = BUS_PARALLEL,
2805 .manufacture_id = ATMEL_ID,
2806 .model_id = ATMEL_AT49F010,
2807 .total_size = 128,
2808 .page_size = 0, /* unused */
2809 .feature_bits = FEATURE_EITHER_RESET,
2810 .tested = TEST_OK_PREW,
2811 .probe = probe_jedec,
2812 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2813 .block_erasers =
2814 {
2815 {
2816 .eraseblocks = { {128 * 1024, 1} },
2817 .block_erase = erase_chip_block_jedec,
2818 }
2819 },
2820 .printlock = printlock_at49f,
2821 .write = write_jedec_1,
2822 .read = read_memmapped,
2823 .voltage = {4500, 5500},
2824 },
2825
2826 {
2827 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002828 .name = "AT49F020",
2829 .bustype = BUS_PARALLEL,
2830 .manufacture_id = ATMEL_ID,
2831 .model_id = ATMEL_AT49F020,
2832 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002833 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002834 .feature_bits = FEATURE_EITHER_RESET,
2835 .tested = TEST_OK_PRE,
2836 .probe = probe_jedec,
2837 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2838 .block_erasers =
2839 {
2840 {
2841 .eraseblocks = { {256 * 1024, 1} },
2842 .block_erase = erase_chip_block_jedec,
2843 }
2844 /* Chip features an optional permanent write protection
2845 * of the first 8 kB. The erase function is the same as
2846 * above, but 00000H to 01FFFH will not be erased.
2847 * FIXME: add another eraser when partial erasers are
2848 * supported.
2849 */
2850 },
2851 .printlock = printlock_at49f,
2852 .write = write_jedec_1,
2853 .read = read_memmapped,
2854 .voltage = {4500, 5500},
2855 },
2856
2857 {
2858 .vendor = "Atmel",
2859 .name = "AT49F040",
2860 .bustype = BUS_PARALLEL,
2861 .manufacture_id = ATMEL_ID,
2862 .model_id = ATMEL_AT49F040,
2863 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002864 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002865 .feature_bits = FEATURE_EITHER_RESET,
2866 .tested = TEST_UNTESTED,
2867 .probe = probe_jedec,
2868 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2869 .block_erasers =
2870 {
2871 {
2872 .eraseblocks = { {512 * 1024, 1} },
2873 .block_erase = erase_chip_block_jedec,
2874 }
2875 /* Chip features an optional permanent write protection
2876 * of the first 16 kB. The erase function is the same as
2877 * above, but 00000H to 03FFFH will not be erased.
2878 * FIXME: add another eraser when partial erasers are
2879 * supported.
2880 */
2881 },
2882 .printlock = printlock_at49f,
2883 .write = write_jedec_1,
2884 .read = read_memmapped,
2885 .voltage = {4500, 5500},
2886 },
2887
2888 {
2889 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002890 .name = "AT49F080",
2891 .bustype = BUS_PARALLEL,
2892 .manufacture_id = ATMEL_ID,
2893 .model_id = ATMEL_AT49F080,
2894 .total_size = 1024,
2895 .page_size = 0, /* unused */
2896 .feature_bits = FEATURE_EITHER_RESET,
2897 .tested = TEST_UNTESTED,
2898 .probe = probe_jedec,
2899 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2900 .block_erasers =
2901 {
2902 {
2903 .eraseblocks = { {1024 * 1024, 1} },
2904 .block_erase = erase_chip_block_jedec,
2905 }
2906 /* Chip features an optional permanent write protection
2907 * of the first 16 kB. The erase function is the same as
2908 * above, but 00000H to 03FFFH will not be erased.
2909 * FIXME: add another eraser when partial erasers are
2910 * supported.
2911 */
2912 },
2913 .printlock = printlock_at49f,
2914 .write = write_jedec_1,
2915 .read = read_memmapped,
2916 .voltage = {4500, 5500},
2917 },
2918
2919 {
2920 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
2921 .vendor = "Atmel",
2922 .name = "AT49F080T",
2923 .bustype = BUS_PARALLEL,
2924 .manufacture_id = ATMEL_ID,
2925 .model_id = ATMEL_AT49F080T,
2926 .total_size = 1024,
2927 .page_size = 0, /* unused */
2928 .feature_bits = FEATURE_EITHER_RESET,
2929 .tested = TEST_UNTESTED,
2930 .probe = probe_jedec,
2931 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2932 .block_erasers =
2933 {
2934 {
2935 .eraseblocks = { {1024 * 1024, 1} },
2936 .block_erase = erase_chip_block_jedec,
2937 }
2938 /* Chip features an optional permanent write protection
2939 * of the first 16 kB. The erase function is the same as
2940 * above, but FC000H to FFFFFH will not be erased.
2941 * FIXME: add another eraser when partial erasers are
2942 * supported.
2943 */
2944 },
2945 .printlock = printlock_at49f,
2946 .write = write_jedec_1,
2947 .read = read_memmapped,
2948 .voltage = {4500, 5500},
2949 },
2950
2951 {
2952 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00002953 .name = "AT49LH002",
2954 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2955 .manufacture_id = ATMEL_ID,
2956 .model_id = ATMEL_AT49LH002,
2957 .total_size = 256,
2958 .page_size = 0, /* unused */
2959 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2960 .tested = TEST_UNTESTED,
2961 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2962 .probe_timing = TIMING_FIXME,
2963 .block_erasers =
2964 {
2965 {
2966 .eraseblocks = {
2967 {64 * 1024, 3},
2968 {32 * 1024, 1},
2969 {8 * 1024, 2},
2970 {16 * 1024, 1},
2971 },
2972 .block_erase = erase_block_82802ab,
2973 }, {
2974 .eraseblocks = {
2975 {64 * 1024, 4},
2976 },
2977 .block_erase = NULL, /* TODO: Implement. */
2978 },
2979 },
2980 .printlock = NULL, /* TODO */
2981 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2982 .write = write_82802ab,
2983 .read = read_memmapped,
2984 .voltage = {3000, 3600},
2985 },
2986
2987 {
Andrew Morganca081462011-09-13 22:05:44 +00002988 .vendor = "Catalyst",
2989 .name = "CAT28F512",
2990 .bustype = BUS_PARALLEL,
2991 .manufacture_id = CATALYST_ID,
2992 .model_id = CATALYST_CAT28F512,
2993 .total_size = 64,
2994 .page_size = 0, /* unused */
2995 .feature_bits = 0,
2996 .tested = TEST_OK_PR,
2997 .probe = probe_jedec, /* FIXME! */
2998 .probe_timing = TIMING_ZERO,
2999 .block_erasers =
3000 {
3001 {
3002 .eraseblocks = { {64 * 1024, 1} },
3003 .block_erase = NULL, /* TODO */
3004 },
3005 },
3006 .write = NULL, /* TODO */
3007 .read = read_memmapped,
3008 .voltage = {4500, 5500},
3009 },
3010
3011 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003012 .vendor = "Bright",
3013 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003014 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003015 .manufacture_id = BRIGHT_ID,
3016 .model_id = BRIGHT_BM29F040,
3017 .total_size = 512,
3018 .page_size = 64 * 1024,
3019 .feature_bits = FEATURE_EITHER_RESET,
3020 .tested = TEST_OK_PR,
3021 .probe = probe_jedec,
3022 .probe_timing = TIMING_ZERO,
3023 .block_erasers =
3024 {
3025 {
3026 .eraseblocks = { {64 * 1024, 8} },
3027 .block_erase = erase_sector_jedec,
3028 }, {
3029 .eraseblocks = { {512 * 1024, 1} },
3030 .block_erase = erase_chip_block_jedec,
3031 },
3032 },
3033 .write = write_jedec_1,
3034 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003035 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003036 },
3037
3038 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003039 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003040 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003041 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003042 .manufacture_id = ESMT_ID,
3043 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003044 .total_size = 256,
3045 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003046 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003047 .tested = TEST_UNTESTED,
3048 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003049 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003050 .block_erasers =
3051 {
3052 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003053 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003054 {128 * 1024, 1},
3055 {96 * 1024, 1},
3056 {8 * 1024, 2},
3057 {16 * 1024, 1},
3058 },
3059 .block_erase = erase_sector_jedec,
3060 }, {
3061 .eraseblocks = { {256 * 1024, 1} },
3062 .block_erase = erase_chip_block_jedec,
3063 }
3064 },
Sean Nelson35727f72010-01-28 23:55:12 +00003065 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003067 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003068 },
3069
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003070 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003071 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003072 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003073 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003074 .manufacture_id = ESMT_ID,
3075 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003076 .total_size = 1024,
3077 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003078 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003079 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003080 .probe = probe_spi_rdid,
3081 .probe_timing = TIMING_ZERO,
3082 .block_erasers =
3083 {
3084 {
3085 .eraseblocks = { {4 * 1024, 256} },
3086 .block_erase = spi_block_erase_20,
3087 }, {
3088 .eraseblocks = { {64 * 1024, 16} },
3089 .block_erase = spi_block_erase_d8,
3090 }, {
3091 .eraseblocks = { {1024 * 1024, 1} },
3092 .block_erase = spi_block_erase_60,
3093 }, {
3094 .eraseblocks = { {1024 * 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,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003100 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003101 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003102 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003103 },
3104
3105 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003106 .vendor = "Eon",
3107 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003108 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003109 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003110 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003111 .total_size = 64,
3112 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003113 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +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 {4 * 1024, 2},
3122 {8 * 1024, 1},
3123 {16 * 1024, 1},
3124 {32 * 1024, 1},
3125 },
3126 .block_erase = spi_block_erase_d8,
3127 }, {
3128 .eraseblocks = { {64 * 1024, 1} },
3129 .block_erase = spi_block_erase_c7,
3130 }
3131 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003132 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003133 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003134 .write = spi_chip_write_256,
3135 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003136 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003137 },
3138
3139 {
3140 .vendor = "Eon",
3141 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003142 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003143 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003144 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003145 .total_size = 64,
3146 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003147 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003148 .tested = TEST_UNTESTED,
3149 .probe = probe_spi_rdid,
3150 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003151 .block_erasers =
3152 {
3153 {
3154 .eraseblocks = {
3155 {32 * 1024, 1},
3156 {16 * 1024, 1},
3157 {8 * 1024, 1},
3158 {4 * 1024, 2},
3159 },
3160 .block_erase = spi_block_erase_d8,
3161 }, {
3162 .eraseblocks = { {64 * 1024, 1} },
3163 .block_erase = spi_block_erase_c7,
3164 }
3165 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003166 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003167 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003168 .write = spi_chip_write_256,
3169 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003170 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003171 },
3172
3173 {
3174 .vendor = "Eon",
3175 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003176 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003177 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003178 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003179 .total_size = 128,
3180 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003181 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003182 .tested = TEST_UNTESTED,
3183 .probe = probe_spi_rdid,
3184 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003185 .block_erasers =
3186 {
3187 {
3188 .eraseblocks = {
3189 {4 * 1024, 2},
3190 {8 * 1024, 1},
3191 {16 * 1024, 1},
3192 {32 * 1024, 3},
3193 },
3194 .block_erase = spi_block_erase_d8,
3195 }, {
3196 .eraseblocks = { {128 * 1024, 1} },
3197 .block_erase = spi_block_erase_c7,
3198 }
3199 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003200 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003201 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003202 .write = spi_chip_write_256,
3203 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003204 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003205 },
3206
3207 {
3208 .vendor = "Eon",
3209 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003210 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003211 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003212 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003213 .total_size = 128,
3214 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003215 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003216 .tested = TEST_UNTESTED,
3217 .probe = probe_spi_rdid,
3218 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003219 .block_erasers =
3220 {
3221 {
3222 .eraseblocks = {
3223 {32 * 1024, 3},
3224 {16 * 1024, 1},
3225 {8 * 1024, 1},
3226 {4 * 1024, 2},
3227 },
3228 .block_erase = spi_block_erase_d8,
3229 }, {
3230 .eraseblocks = { {128 * 1024, 1} },
3231 .block_erase = spi_block_erase_c7,
3232 }
3233 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003234 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003235 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003236 .write = spi_chip_write_256,
3237 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003238 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003239 },
3240
3241 {
3242 .vendor = "Eon",
3243 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003244 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003245 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003246 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003247 .total_size = 256,
3248 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003249 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003250 .tested = TEST_UNTESTED,
3251 .probe = probe_spi_rdid,
3252 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003253 .block_erasers =
3254 {
3255 {
3256 .eraseblocks = {
3257 {4 * 1024, 2},
3258 {8 * 1024, 1},
3259 {16 * 1024, 1},
3260 {32 * 1024, 1},
3261 {64 * 1024, 3}
3262 },
3263 .block_erase = spi_block_erase_d8,
3264 }, {
3265 .eraseblocks = { {256 * 1024, 1} },
3266 .block_erase = spi_block_erase_c7,
3267 }
3268 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003269 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003270 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003271 .write = spi_chip_write_256,
3272 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003273 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003274 },
3275
3276 {
3277 .vendor = "Eon",
3278 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003279 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003280 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003281 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003282 .total_size = 256,
3283 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003284 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003285 .tested = TEST_UNTESTED,
3286 .probe = probe_spi_rdid,
3287 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003288 .block_erasers =
3289 {
3290 {
3291 .eraseblocks = {
3292 {64 * 1024, 3},
3293 {32 * 1024, 1},
3294 {16 * 1024, 1},
3295 {8 * 1024, 1},
3296 {4 * 1024, 2},
3297 },
3298 .block_erase = spi_block_erase_d8,
3299 }, {
3300 .eraseblocks = { {256 * 1024, 1} },
3301 .block_erase = spi_block_erase_c7,
3302 }
3303 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003304 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003305 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003306 .write = spi_chip_write_256,
3307 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003308 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003309 },
3310
3311 {
3312 .vendor = "Eon",
3313 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003314 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003315 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003316 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003317 .total_size = 512,
3318 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003319 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003320 .tested = TEST_UNTESTED,
3321 .probe = probe_spi_rdid,
3322 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003323 .block_erasers =
3324 {
3325 {
3326 .eraseblocks = {
3327 {4 * 1024, 2},
3328 {8 * 1024, 1},
3329 {16 * 1024, 1},
3330 {32 * 1024, 1},
3331 {64 * 1024, 7}
3332 },
3333 .block_erase = spi_block_erase_d8,
3334 }, {
3335 .eraseblocks = { {512 * 1024, 1} },
3336 .block_erase = spi_block_erase_c7,
3337 }
3338 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003339 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003340 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003341 .write = spi_chip_write_256,
3342 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003343 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003344 },
3345
3346 {
3347 .vendor = "Eon",
3348 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003349 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003350 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003351 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003352 .total_size = 512,
3353 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003354 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003355 .tested = TEST_UNTESTED,
3356 .probe = probe_spi_rdid,
3357 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003358 .block_erasers =
3359 {
3360 {
3361 .eraseblocks = {
3362 {64 * 1024, 7},
3363 {32 * 1024, 1},
3364 {16 * 1024, 1},
3365 {8 * 1024, 1},
3366 {4 * 1024, 2},
3367 },
3368 .block_erase = spi_block_erase_d8,
3369 }, {
3370 .eraseblocks = { {512 * 1024, 1} },
3371 .block_erase = spi_block_erase_c7,
3372 }
3373 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003374 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003375 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003376 .write = spi_chip_write_256,
3377 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003378 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003379 },
3380
3381 {
3382 .vendor = "Eon",
3383 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003384 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003385 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003386 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003387 .total_size = 1024,
3388 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003389 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003390 .tested = TEST_UNTESTED,
3391 .probe = probe_spi_rdid,
3392 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003393 .block_erasers =
3394 {
3395 {
3396 .eraseblocks = {
3397 {4 * 1024, 2},
3398 {8 * 1024, 1},
3399 {16 * 1024, 1},
3400 {32 * 1024, 1},
3401 {64 * 1024, 15}
3402 },
3403 .block_erase = spi_block_erase_d8,
3404 }, {
3405 .eraseblocks = { {1024 * 1024, 1} },
3406 .block_erase = spi_block_erase_c7,
3407 }
3408 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003409 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003410 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003411 .write = spi_chip_write_256,
3412 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003413 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003414 },
3415
3416 {
3417 .vendor = "Eon",
3418 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003419 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003420 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003421 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003422 .total_size = 1024,
3423 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003424 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003425 .tested = TEST_UNTESTED,
3426 .probe = probe_spi_rdid,
3427 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003428 .block_erasers =
3429 {
3430 {
3431 .eraseblocks = {
3432 {64 * 1024, 15},
3433 {32 * 1024, 1},
3434 {16 * 1024, 1},
3435 {8 * 1024, 1},
3436 {4 * 1024, 2},
3437 },
3438 .block_erase = spi_block_erase_d8,
3439 }, {
3440 .eraseblocks = { {1024 * 1024, 1} },
3441 .block_erase = spi_block_erase_c7,
3442 }
3443 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003444 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003445 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003446 .write = spi_chip_write_256,
3447 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003448 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003449 },
3450
3451 {
3452 .vendor = "Eon",
3453 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003454 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003455 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003456 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003457 .total_size = 2048,
3458 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003459 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003460 .tested = TEST_UNTESTED,
3461 .probe = probe_spi_rdid,
3462 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003463 .block_erasers =
3464 {
3465 {
3466 .eraseblocks = {
3467 {4 * 1024, 2},
3468 {8 * 1024, 1},
3469 {16 * 1024, 1},
3470 {32 * 1024, 1},
3471 {64 * 1024, 31},
3472 },
3473 .block_erase = spi_block_erase_d8,
3474 }, {
3475 .eraseblocks = { {2 * 1024 * 1024, 1} },
3476 .block_erase = spi_block_erase_c7,
3477 }
3478 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003479 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003480 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003481 .write = spi_chip_write_256,
3482 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003483 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003484 },
3485
3486 {
3487 .vendor = "Eon",
3488 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003489 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003490 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003491 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003492 .total_size = 2048,
3493 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003494 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003495 .tested = TEST_UNTESTED,
3496 .probe = probe_spi_rdid,
3497 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003498 .block_erasers =
3499 {
3500 {
3501 .eraseblocks = {
3502 {64 * 1024, 31},
3503 {32 * 1024, 1},
3504 {16 * 1024, 1},
3505 {8 * 1024, 1},
3506 {4 * 1024, 2},
3507 },
3508 .block_erase = spi_block_erase_d8,
3509 }, {
3510 .eraseblocks = { {2 * 1024 * 1024, 1} },
3511 .block_erase = spi_block_erase_c7,
3512 }
3513 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003514 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003515 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003516 .write = spi_chip_write_256,
3517 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003518 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003519 },
3520
3521 {
3522 .vendor = "Eon",
3523 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003524 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003525 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003526 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003527 .total_size = 4096,
3528 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003529 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003530 .tested = TEST_UNTESTED,
3531 .probe = probe_spi_rdid,
3532 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003533 .block_erasers =
3534 {
3535 {
3536 .eraseblocks = {
3537 {4 * 1024, 2},
3538 {8 * 1024, 1},
3539 {16 * 1024, 1},
3540 {32 * 1024, 1},
3541 {64 * 1024, 63},
3542 },
3543 .block_erase = spi_block_erase_d8,
3544 }, {
3545 .eraseblocks = { {4 * 1024 * 1024, 1} },
3546 .block_erase = spi_block_erase_c7,
3547 }
3548 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003549 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003550 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003551 .write = spi_chip_write_256,
3552 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003553 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003554 },
3555
3556 {
3557 .vendor = "Eon",
3558 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003559 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003560 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003561 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003562 .total_size = 4096,
3563 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003564 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003565 .tested = TEST_UNTESTED,
3566 .probe = probe_spi_rdid,
3567 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003568 .block_erasers =
3569 {
3570 {
3571 .eraseblocks = {
3572 {64 * 1024, 63},
3573 {32 * 1024, 1},
3574 {16 * 1024, 1},
3575 {8 * 1024, 1},
3576 {4 * 1024, 2},
3577 },
3578 .block_erase = spi_block_erase_d8,
3579 }, {
3580 .eraseblocks = { {4 * 1024 * 1024, 1} },
3581 .block_erase = spi_block_erase_c7,
3582 }
3583 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003584 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003585 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003586 .write = spi_chip_write_256,
3587 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003588 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003589 },
3590
3591 {
3592 .vendor = "Eon",
3593 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003594 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003595 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003596 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003597 .total_size = 8192,
3598 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003599 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003600 .tested = TEST_UNTESTED,
3601 .probe = probe_spi_rdid,
3602 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003603 .block_erasers =
3604 {
3605 {
3606 .eraseblocks = {
3607 {4 * 1024, 2},
3608 {8 * 1024, 1},
3609 {16 * 1024, 1},
3610 {32 * 1024, 1},
3611 {64 * 1024, 127},
3612 },
3613 .block_erase = spi_block_erase_d8,
3614 }, {
3615 .eraseblocks = { {8 * 1024 * 1024, 1} },
3616 .block_erase = spi_block_erase_c7,
3617 }
3618 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003619 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003620 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003621 .write = spi_chip_write_256,
3622 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003623 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003624 },
3625
3626 {
3627 .vendor = "Eon",
3628 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003629 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003630 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003631 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00003632 .total_size = 8192,
3633 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003634 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003635 .tested = TEST_UNTESTED,
3636 .probe = probe_spi_rdid,
3637 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003638 .block_erasers =
3639 {
3640 {
3641 .eraseblocks = {
3642 {64 * 1024, 127},
3643 {32 * 1024, 1},
3644 {16 * 1024, 1},
3645 {8 * 1024, 1},
3646 {4 * 1024, 2},
3647 },
3648 .block_erase = spi_block_erase_d8,
3649 }, {
3650 .eraseblocks = { {8 * 1024 * 1024, 1} },
3651 .block_erase = spi_block_erase_c7,
3652 }
3653 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003654 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003655 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003656 .write = spi_chip_write_256,
3657 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003658 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003659 },
3660
3661 {
3662 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003663 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003664 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003665 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003666 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003667 .total_size = 64,
3668 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003669 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00003670 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003671 .probe = probe_spi_rdid,
3672 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003673 .block_erasers =
3674 {
3675 {
3676 .eraseblocks = { {4 * 1024, 16} },
3677 .block_erase = spi_block_erase_20,
3678 }, {
3679 .eraseblocks = { {32 * 1024, 2} },
3680 .block_erase = spi_block_erase_d8,
3681 }, {
3682 .eraseblocks = { {32 * 1024, 2} },
3683 .block_erase = spi_block_erase_52,
3684 }, {
3685 .eraseblocks = { {64 * 1024, 1} },
3686 .block_erase = spi_block_erase_60,
3687 }, {
3688 .eraseblocks = { {64 * 1024, 1} },
3689 .block_erase = spi_block_erase_c7,
3690 }
3691 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003692 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003693 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003694 .write = spi_chip_write_256,
3695 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003696 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003697 },
3698
3699 {
3700 .vendor = "Eon",
3701 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003702 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003703 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003704 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003705 .total_size = 128,
3706 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003707 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003708 .tested = TEST_UNTESTED,
3709 .probe = probe_spi_rdid,
3710 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003711 .block_erasers =
3712 {
3713 {
3714 .eraseblocks = { {4 * 1024, 32} },
3715 .block_erase = spi_block_erase_20,
3716 }, {
3717 .eraseblocks = { {32 * 1024, 4} },
3718 .block_erase = spi_block_erase_d8,
3719 }, {
3720 .eraseblocks = { {32 * 1024, 4} },
3721 .block_erase = spi_block_erase_52,
3722 }, {
3723 .eraseblocks = { {128 * 1024, 1} },
3724 .block_erase = spi_block_erase_60,
3725 }, {
3726 .eraseblocks = { {128 * 1024, 1} },
3727 .block_erase = spi_block_erase_c7,
3728 }
3729 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003730 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003731 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003732 .write = spi_chip_write_256,
3733 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003734 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003735 },
3736
3737 {
3738 .vendor = "Eon",
3739 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003740 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003741 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003742 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003743 .total_size = 256,
3744 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003745 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003746 .tested = TEST_UNTESTED,
3747 .probe = probe_spi_rdid,
3748 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003749 .block_erasers =
3750 {
3751 {
3752 .eraseblocks = { {4 * 1024, 64} },
3753 .block_erase = spi_block_erase_20,
3754 }, {
3755 .eraseblocks = { {64 * 1024, 4} },
3756 .block_erase = spi_block_erase_d8,
3757 }, {
3758 .eraseblocks = { {64 * 1024, 4} },
3759 .block_erase = spi_block_erase_52,
3760 }, {
3761 .eraseblocks = { {256 * 1024, 1} },
3762 .block_erase = spi_block_erase_60,
3763 }, {
3764 .eraseblocks = { {256 * 1024, 1} },
3765 .block_erase = spi_block_erase_c7,
3766 }
3767 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003768 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003769 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003770 .write = spi_chip_write_256,
3771 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003772 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003773 },
3774
3775 {
3776 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003777 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003778 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003779 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003780 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003781 .total_size = 512,
3782 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003783 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00003784 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003785 .probe = probe_spi_rdid,
3786 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003787 .block_erasers =
3788 {
3789 {
Sean Nelson54596372010-01-09 05:30:14 +00003790 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003791 .block_erase = spi_block_erase_20,
3792 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003793 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003794 .block_erase = spi_block_erase_d8,
3795 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003796 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003797 .block_erase = spi_block_erase_60,
3798 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003799 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003800 .block_erase = spi_block_erase_c7,
3801 },
3802 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003803 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003804 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003805 .write = spi_chip_write_256,
3806 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003807 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003808 },
3809
3810 {
3811 .vendor = "Eon",
3812 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003813 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003814 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003815 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003816 .total_size = 1024,
3817 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003818 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00003819 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003820 .probe = probe_spi_rdid,
3821 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003822 .block_erasers =
3823 {
3824 {
3825 .eraseblocks = { {4 * 1024, 256} },
3826 .block_erase = spi_block_erase_20,
3827 }, {
3828 .eraseblocks = { {64 * 1024, 16} },
3829 .block_erase = spi_block_erase_d8,
3830 }, {
3831 .eraseblocks = { {1024 * 1024, 1} },
3832 .block_erase = spi_block_erase_60,
3833 }, {
3834 .eraseblocks = { {1024 * 1024, 1} },
3835 .block_erase = spi_block_erase_c7,
3836 }
3837 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003838 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003839 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003840 .write = spi_chip_write_256,
3841 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003842 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003843 },
3844
3845 {
3846 .vendor = "Eon",
3847 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003848 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003849 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003850 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003851 .total_size = 2048,
3852 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003853 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00003854 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003855 .probe = probe_spi_rdid,
3856 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003857 .block_erasers =
3858 {
3859 {
3860 .eraseblocks = { {4 * 1024, 512} },
3861 .block_erase = spi_block_erase_20,
3862 }, {
3863 .eraseblocks = { {64 * 1024, 32} },
3864 .block_erase = spi_block_erase_d8,
3865 }, {
3866 .eraseblocks = { {2 * 1024 * 1024, 1} },
3867 .block_erase = spi_block_erase_60,
3868 }, {
3869 .eraseblocks = { {2 * 1024 * 1024, 1} },
3870 .block_erase = spi_block_erase_c7,
3871 }
3872 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003873 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003874 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003875 .write = spi_chip_write_256,
3876 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003877 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003878 },
3879
3880 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003881 .vendor = "Eon",
3882 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003883 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003884 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003885 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003886 .total_size = 4096,
3887 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003888 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003889 .tested = TEST_UNTESTED,
3890 .probe = probe_spi_rdid,
3891 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003892 .block_erasers =
3893 {
3894 {
3895 .eraseblocks = { {4 * 1024, 1024} },
3896 .block_erase = spi_block_erase_20,
3897 }, {
3898 .eraseblocks = { {64 * 1024, 64} },
3899 .block_erase = spi_block_erase_d8,
3900 }, {
3901 .eraseblocks = { {4 * 1024 * 1024, 1} },
3902 .block_erase = spi_block_erase_60,
3903 }, {
3904 .eraseblocks = { {4 * 1024 * 1024, 1} },
3905 .block_erase = spi_block_erase_c7,
3906 }
3907 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003908 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003909 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003910 .write = spi_chip_write_256,
3911 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003912 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003913 },
3914
3915 {
Russ Dill3cd5a122010-03-05 08:44:11 +00003916 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00003917 .name = "EN25F64",
3918 .bustype = BUS_SPI,
3919 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00003920 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003921 .total_size = 8192,
3922 .page_size = 256,
3923 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00003924 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003925 .probe = probe_spi_rdid,
3926 .probe_timing = TIMING_ZERO,
3927 .block_erasers =
3928 {
3929 {
3930 .eraseblocks = { {4 * 1024, 2048} },
3931 .block_erase = spi_block_erase_20,
3932 }, {
3933 .eraseblocks = { {64 * 1024, 128} },
3934 .block_erase = spi_block_erase_d8,
3935 }, {
3936 .eraseblocks = { {8 * 1024 * 1024, 1} },
3937 .block_erase = spi_block_erase_60,
3938 }, {
3939 .eraseblocks = { {8 * 1024 * 1024, 1} },
3940 .block_erase = spi_block_erase_c7,
3941 }
3942 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003943 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00003944 .unlock = spi_disable_blockprotect,
3945 .write = spi_chip_write_256,
3946 .read = spi_chip_read,
3947 .voltage = {2700, 3600},
3948 },
3949
3950 {
3951 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00003952 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003953 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003954 .manufacture_id = EON_ID_NOPREFIX,
3955 .model_id = EON_EN25Q40,
3956 .total_size = 512,
3957 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003958 /* OTP: 256B total; enter 0x3A */
3959 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003960 .tested = TEST_UNTESTED,
3961 .probe = probe_spi_rdid,
3962 .probe_timing = TIMING_ZERO,
3963 .block_erasers =
3964 {
3965 {
3966 .eraseblocks = { {4 * 1024, 128} },
3967 .block_erase = spi_block_erase_20,
3968 }, {
3969 .eraseblocks = { {64 * 1024, 8} },
3970 .block_erase = spi_block_erase_d8,
3971 }, {
3972 .eraseblocks = { {512 * 1024, 1} },
3973 .block_erase = spi_block_erase_60,
3974 }, {
3975 .eraseblocks = { {512 * 1024, 1} },
3976 .block_erase = spi_block_erase_c7,
3977 }
3978 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003979 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003980 .unlock = spi_disable_blockprotect,
3981 .write = spi_chip_write_256,
3982 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003983 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003984 },
3985
3986 {
3987 .vendor = "Eon",
3988 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003989 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003990 .manufacture_id = EON_ID_NOPREFIX,
3991 .model_id = EON_EN25Q80,
3992 .total_size = 1024,
3993 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003994 /* OTP: 256B total; enter 0x3A */
3995 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003996 .tested = TEST_UNTESTED,
3997 .probe = probe_spi_rdid,
3998 .probe_timing = TIMING_ZERO,
3999 .block_erasers =
4000 {
4001 {
4002 .eraseblocks = { {4 * 1024, 256} },
4003 .block_erase = spi_block_erase_20,
4004 }, {
4005 .eraseblocks = { {64 * 1024, 16} },
4006 .block_erase = spi_block_erase_d8,
4007 }, {
4008 .eraseblocks = { {1024 * 1024, 1} },
4009 .block_erase = spi_block_erase_60,
4010 }, {
4011 .eraseblocks = { {1024 * 1024, 1} },
4012 .block_erase = spi_block_erase_c7,
4013 }
4014 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004015 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004016 .unlock = spi_disable_blockprotect,
4017 .write = spi_chip_write_256,
4018 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004019 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004020 },
4021
4022 {
4023 /* Note: EN25D16 is an evil twin which shares the model ID
4024 but has different write protection capabilities */
4025 .vendor = "Eon",
4026 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004027 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004028 .manufacture_id = EON_ID_NOPREFIX,
4029 .model_id = EON_EN25Q16,
4030 .total_size = 2048,
4031 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004032 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4033 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004034 .tested = TEST_UNTESTED,
4035 .probe = probe_spi_rdid,
4036 .probe_timing = TIMING_ZERO,
4037 .block_erasers =
4038 {
4039 {
4040 .eraseblocks = { {4 * 1024, 512} },
4041 .block_erase = spi_block_erase_20,
4042 }, {
4043 .eraseblocks = { {64 * 1024, 32} },
4044 .block_erase = spi_block_erase_d8,
4045 }, {
4046 /* not supported by Q16 version */
4047 .eraseblocks = { {64 * 1024, 32} },
4048 .block_erase = spi_block_erase_52,
4049 }, {
4050 .eraseblocks = { {2 * 1024 * 1024, 1} },
4051 .block_erase = spi_block_erase_60,
4052 }, {
4053 .eraseblocks = { {2 * 1024 * 1024, 1} },
4054 .block_erase = spi_block_erase_c7,
4055 }
4056 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004057 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004058 .unlock = spi_disable_blockprotect,
4059 .write = spi_chip_write_256,
4060 .read = spi_chip_read,
4061 .voltage = {2700, 3600},
4062 },
4063
4064 {
4065 .vendor = "Eon",
4066 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004067 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004068 .manufacture_id = EON_ID_NOPREFIX,
4069 .model_id = EON_EN25Q32,
4070 .total_size = 4096,
4071 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004072 /* OTP: 512B total; enter 0x3A */
4073 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004074 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004075 .probe = probe_spi_rdid,
4076 .probe_timing = TIMING_ZERO,
4077 .block_erasers =
4078 {
4079 {
4080 .eraseblocks = { {4 * 1024, 1024} },
4081 .block_erase = spi_block_erase_20,
4082 }, {
4083 .eraseblocks = { {64 * 1024, 64} },
4084 .block_erase = spi_block_erase_d8,
4085 }, {
4086 .eraseblocks = { {4 * 1024 * 1024, 1} },
4087 .block_erase = spi_block_erase_60,
4088 }, {
4089 .eraseblocks = { {4 * 1024 * 1024, 1} },
4090 .block_erase = spi_block_erase_c7,
4091 }
4092 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004093 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004094 .unlock = spi_disable_blockprotect,
4095 .write = spi_chip_write_256,
4096 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004097 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004098 },
4099
4100 {
4101 .vendor = "Eon",
4102 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004103 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004104 .manufacture_id = EON_ID_NOPREFIX,
4105 .model_id = EON_EN25Q64,
4106 .total_size = 8192,
4107 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004108 /* OTP: 512B total; enter 0x3A */
4109 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004110 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004111 .probe = probe_spi_rdid,
4112 .probe_timing = TIMING_ZERO,
4113 .block_erasers =
4114 {
4115 {
4116 .eraseblocks = { {4 * 1024, 2048} },
4117 .block_erase = spi_block_erase_20,
4118 }, {
4119 .eraseblocks = { {64 * 1024, 128} },
4120 .block_erase = spi_block_erase_d8,
4121 }, {
4122 .eraseblocks = { {8 * 1024 * 1024, 1} },
4123 .block_erase = spi_block_erase_60,
4124 }, {
4125 .eraseblocks = { {8 * 1024 * 1024, 1} },
4126 .block_erase = spi_block_erase_c7,
4127 }
4128 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004129 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004130 .unlock = spi_disable_blockprotect,
4131 .write = spi_chip_write_256,
4132 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004133 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004134 },
4135
4136 {
4137 .vendor = "Eon",
4138 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004139 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004140 .manufacture_id = EON_ID_NOPREFIX,
4141 .model_id = EON_EN25Q128,
4142 .total_size = 16384,
4143 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004144 /* OTP: 512B total; enter 0x3A */
4145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004146 .tested = TEST_UNTESTED,
4147 .probe = probe_spi_rdid,
4148 .probe_timing = TIMING_ZERO,
4149 .block_erasers =
4150 {
4151 {
4152 .eraseblocks = { {4 * 1024, 4096} },
4153 .block_erase = spi_block_erase_20,
4154 }, {
4155 .eraseblocks = { {64 * 1024, 256} },
4156 .block_erase = spi_block_erase_d8,
4157 }, {
4158 .eraseblocks = { {16 * 1024 * 1024, 1} },
4159 .block_erase = spi_block_erase_60,
4160 }, {
4161 .eraseblocks = { {16 * 1024 * 1024, 1} },
4162 .block_erase = spi_block_erase_c7,
4163 }
4164 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004165 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004166 .unlock = spi_disable_blockprotect,
4167 .write = spi_chip_write_256,
4168 .read = spi_chip_read,
4169 },
4170
4171 {
4172 .vendor = "Eon",
4173 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004174 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004175 .manufacture_id = EON_ID_NOPREFIX,
4176 .model_id = EON_EN25QH16,
4177 .total_size = 2048,
4178 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004179 /* supports SFDP */
4180 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004181 /* QPI enable 0x38, disable 0xFF */
4182 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00004183 .tested = TEST_OK_PR,
David Hendricks6d715302011-07-24 22:21:57 +00004184 .probe = probe_spi_rdid,
4185 .probe_timing = TIMING_ZERO,
4186 .block_erasers =
4187 {
4188 {
4189 .eraseblocks = { {4 * 1024, 512} },
4190 .block_erase = spi_block_erase_20,
4191 }, {
4192 .eraseblocks = { {64 * 1024, 32} },
4193 .block_erase = spi_block_erase_d8,
4194 }, {
4195 .eraseblocks = { {1024 * 2048, 1} },
4196 .block_erase = spi_block_erase_60,
4197 }, {
4198 .eraseblocks = { {1024 * 2048, 1} },
4199 .block_erase = spi_block_erase_c7,
4200 }
4201 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004202 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4203 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004204 .write = spi_chip_write_256,
4205 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004206 .voltage = {2700, 3600},
4207 },
4208
4209 {
4210 .vendor = "Eon",
4211 .name = "EN25QH32",
4212 .bustype = BUS_SPI,
4213 .manufacture_id = EON_ID_NOPREFIX,
4214 .model_id = EON_EN25QH32,
4215 .total_size = 4096,
4216 .page_size = 256,
4217 /* supports SFDP */
4218 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004219 /* QPI enable 0x38, disable 0xFF */
4220 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004221 .tested = TEST_UNTESTED,
4222 .probe = probe_spi_rdid,
4223 .probe_timing = TIMING_ZERO,
4224 .block_erasers =
4225 {
4226 {
4227 .eraseblocks = { {4 * 1024, 1024} },
4228 .block_erase = spi_block_erase_20,
4229 }, {
4230 .eraseblocks = { {64 * 1024, 64} },
4231 .block_erase = spi_block_erase_d8,
4232 }, {
4233 .eraseblocks = { {1024 * 4096, 1} },
4234 .block_erase = spi_block_erase_60,
4235 }, {
4236 .eraseblocks = { {1024 * 4096, 1} },
4237 .block_erase = spi_block_erase_c7,
4238 }
4239 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004240 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4241 .unlock = spi_disable_blockprotect_bp3_srwd,
4242 .write = spi_chip_write_256,
4243 .read = spi_chip_read,
4244 .voltage = {2700, 3600},
4245 },
4246
4247 {
4248 .vendor = "Eon",
4249 .name = "EN25QH64",
4250 .bustype = BUS_SPI,
4251 .manufacture_id = EON_ID_NOPREFIX,
4252 .model_id = EON_EN25QH64,
4253 .total_size = 8192,
4254 .page_size = 256,
4255 /* supports SFDP */
4256 /* OTP: 512B total; enter 0x3A */
4257 /* QPI enable 0x38, disable 0xFF */
4258 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4259 .tested = TEST_UNTESTED,
4260 .probe = probe_spi_rdid,
4261 .probe_timing = TIMING_ZERO,
4262 .block_erasers = {
4263 {
4264 .eraseblocks = { {4 * 1024, 2048} },
4265 .block_erase = spi_block_erase_20,
4266 }, {
4267 .eraseblocks = { {64 * 1024, 128} },
4268 .block_erase = spi_block_erase_d8,
4269 }, {
4270 .eraseblocks = { { 8192 * 1024, 1} },
4271 .block_erase = spi_block_erase_60,
4272 }, {
4273 .eraseblocks = { { 8192 * 1024, 1} },
4274 .block_erase = spi_block_erase_c7,
4275 }
4276 },
4277 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4278 .unlock = spi_disable_blockprotect_bp3_srwd,
4279 .write = spi_chip_write_256,
4280 .read = spi_chip_read,
4281 .voltage = {2700, 3600},
4282 },
4283
4284 {
4285 .vendor = "Eon",
4286 .name = "EN25QH128",
4287 .bustype = BUS_SPI,
4288 .manufacture_id = EON_ID_NOPREFIX,
4289 .model_id = EON_EN25QH128,
4290 .total_size = 16384,
4291 .page_size = 256,
4292 /* supports SFDP */
4293 /* OTP: 512B total; enter 0x3A */
4294 /* QPI enable 0x38, disable 0xFF */
4295 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4296 .tested = TEST_UNTESTED,
4297 .probe = probe_spi_rdid,
4298 .probe_timing = TIMING_ZERO,
4299 .block_erasers = {
4300 {
4301 .eraseblocks = { {4 * 1024, 4096} },
4302 .block_erase = spi_block_erase_20,
4303 }, {
4304 .eraseblocks = { {64 * 1024, 256} },
4305 .block_erase = spi_block_erase_d8,
4306 }, {
4307 .eraseblocks = { { 16384 * 1024, 1} },
4308 .block_erase = spi_block_erase_60,
4309 }, {
4310 .eraseblocks = { { 16384 * 1024, 1} },
4311 .block_erase = spi_block_erase_c7,
4312 }
4313 },
4314 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4315 .unlock = spi_disable_blockprotect_bp3_srwd,
4316 .write = spi_chip_write_256,
4317 .read = spi_chip_read,
4318 .voltage = {2700, 3600},
4319 },
4320
4321 {
4322 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004323 .name = "EN25S10",
4324 .bustype = BUS_SPI,
4325 .manufacture_id = EON_ID_NOPREFIX,
4326 .model_id = EON_EN25S10,
4327 .total_size = 128,
4328 .page_size = 256,
4329 /* OTP: 256B total; enter 0x3A */
4330 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4331 .tested = TEST_UNTESTED,
4332 .probe = probe_spi_rdid,
4333 .probe_timing = TIMING_ZERO,
4334 .block_erasers = {
4335 {
4336 .eraseblocks = { {4 * 1024, 32} },
4337 .block_erase = spi_block_erase_20,
4338 }, {
4339 .eraseblocks = { {32 * 1024, 4} },
4340 .block_erase = spi_block_erase_52,
4341 }, {
4342 .eraseblocks = { {128 * 1024, 1} },
4343 .block_erase = spi_block_erase_60,
4344 }, {
4345 .eraseblocks = { {128 * 1024, 1} },
4346 .block_erase = spi_block_erase_c7,
4347 }
4348 },
4349 .printlock = spi_prettyprint_status_register_default_bp2,
4350 .unlock = spi_disable_blockprotect,
4351 .write = spi_chip_write_256,
4352 .read = spi_chip_read,
4353 .voltage = {1650, 1950},
4354 },
4355
4356 {
4357 .vendor = "Eon",
4358 .name = "EN25S20",
4359 .bustype = BUS_SPI,
4360 .manufacture_id = EON_ID_NOPREFIX,
4361 .model_id = EON_EN25S20,
4362 .total_size = 256,
4363 .page_size = 256,
4364 /* OTP: 256B total; enter 0x3A */
4365 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4366 .tested = TEST_UNTESTED,
4367 .probe = probe_spi_rdid,
4368 .probe_timing = TIMING_ZERO,
4369 .block_erasers = {
4370 {
4371 .eraseblocks = { {4 * 1024, 64} },
4372 .block_erase = spi_block_erase_20,
4373 }, {
4374 .eraseblocks = { {64 * 1024, 4} },
4375 .block_erase = spi_block_erase_d8,
4376 }, {
4377 .eraseblocks = { {256 * 1024, 1} },
4378 .block_erase = spi_block_erase_60,
4379 }, {
4380 .eraseblocks = { {256 * 1024, 1} },
4381 .block_erase = spi_block_erase_c7,
4382 }
4383 },
4384 .printlock = spi_prettyprint_status_register_default_bp2,
4385 .unlock = spi_disable_blockprotect,
4386 .write = spi_chip_write_256,
4387 .read = spi_chip_read,
4388 .voltage = {1650, 1950},
4389 },
4390
4391 {
4392 .vendor = "Eon",
4393 .name = "EN25S40",
4394 .bustype = BUS_SPI,
4395 .manufacture_id = EON_ID_NOPREFIX,
4396 .model_id = EON_EN25S40,
4397 .total_size = 512,
4398 .page_size = 256,
4399 /* OTP: 256B total; enter 0x3A */
4400 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4401 .tested = TEST_UNTESTED,
4402 .probe = probe_spi_rdid,
4403 .probe_timing = TIMING_ZERO,
4404 .block_erasers = {
4405 {
4406 .eraseblocks = { {4 * 1024, 128} },
4407 .block_erase = spi_block_erase_20,
4408 }, {
4409 .eraseblocks = { {64 * 1024, 8} },
4410 .block_erase = spi_block_erase_d8,
4411 }, {
4412 .eraseblocks = { {512 * 1024, 1} },
4413 .block_erase = spi_block_erase_60,
4414 }, {
4415 .eraseblocks = { {512 * 1024, 1} },
4416 .block_erase = spi_block_erase_c7,
4417 }
4418 },
4419 .printlock = spi_prettyprint_status_register_default_bp2,
4420 .unlock = spi_disable_blockprotect,
4421 .write = spi_chip_write_256,
4422 .read = spi_chip_read,
4423 .voltage = {1650, 1950},
4424 },
4425
4426 {
4427 .vendor = "Eon",
4428 .name = "EN25S80",
4429 .bustype = BUS_SPI,
4430 .manufacture_id = EON_ID_NOPREFIX,
4431 .model_id = EON_EN25S80,
4432 .total_size = 1024,
4433 .page_size = 256,
4434 /* OTP: 256B total; enter 0x3A */
4435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4436 .tested = TEST_UNTESTED,
4437 .probe = probe_spi_rdid,
4438 .probe_timing = TIMING_ZERO,
4439 .block_erasers = {
4440 {
4441 .eraseblocks = { {4 * 1024, 256} },
4442 .block_erase = spi_block_erase_20,
4443 }, {
4444 .eraseblocks = { {64 * 1024, 16} },
4445 .block_erase = spi_block_erase_d8,
4446 }, {
4447 .eraseblocks = { {1024 * 1024, 1} },
4448 .block_erase = spi_block_erase_60,
4449 }, {
4450 .eraseblocks = { {1024 * 1024, 1} },
4451 .block_erase = spi_block_erase_c7,
4452 }
4453 },
4454 .printlock = spi_prettyprint_status_register_default_bp2,
4455 .unlock = spi_disable_blockprotect,
4456 .write = spi_chip_write_256,
4457 .read = spi_chip_read,
4458 .voltage = {1650, 1950},
4459 },
4460
4461 {
4462 .vendor = "Eon",
4463 .name = "EN25S16",
4464 .bustype = BUS_SPI,
4465 .manufacture_id = EON_ID_NOPREFIX,
4466 .model_id = EON_EN25S16,
4467 .total_size = 2048,
4468 .page_size = 256,
4469 /* OTP: 512B total; enter 0x3A */
4470 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4471 .tested = TEST_UNTESTED,
4472 .probe = probe_spi_rdid,
4473 .probe_timing = TIMING_ZERO,
4474 .block_erasers = {
4475 {
4476 .eraseblocks = { {4 * 1024, 512} },
4477 .block_erase = spi_block_erase_20,
4478 }, {
4479 .eraseblocks = { {64 * 1024, 32} },
4480 .block_erase = spi_block_erase_52,
4481 }, {
4482 .eraseblocks = { {32 * 1024, 64} },
4483 .block_erase = spi_block_erase_d8,
4484 }, {
4485 .eraseblocks = { {2048 * 1024, 1} },
4486 .block_erase = spi_block_erase_60,
4487 }, {
4488 .eraseblocks = { {2048 * 1024, 1} },
4489 .block_erase = spi_block_erase_c7,
4490 }
4491 },
4492 .printlock = spi_prettyprint_status_register_en25s_wp,
4493 .unlock = spi_disable_blockprotect_bp3_srwd,
4494 .write = spi_chip_write_256,
4495 .read = spi_chip_read,
4496 .voltage = {1650, 1950},
4497 },
4498
4499 {
4500 .vendor = "Eon",
4501 .name = "EN25S32",
4502 .bustype = BUS_SPI,
4503 .manufacture_id = EON_ID_NOPREFIX,
4504 .model_id = EON_EN25S32,
4505 .total_size = 4096,
4506 .page_size = 256,
4507 /* OTP: 512B total; enter 0x3A */
4508 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4509 .tested = TEST_UNTESTED,
4510 .probe = probe_spi_rdid,
4511 .probe_timing = TIMING_ZERO,
4512 .block_erasers = {
4513 {
4514 .eraseblocks = { {4 * 1024, 1024} },
4515 .block_erase = spi_block_erase_20,
4516 }, {
4517 .eraseblocks = { {32 * 1024, 128} },
4518 .block_erase = spi_block_erase_52,
4519 }, {
4520 .eraseblocks = { {64 * 1024, 64} },
4521 .block_erase = spi_block_erase_d8,
4522 }, {
4523 .eraseblocks = { {4096 * 1024, 1} },
4524 .block_erase = spi_block_erase_60,
4525 }, {
4526 .eraseblocks = { {4096 * 1024, 1} },
4527 .block_erase = spi_block_erase_c7,
4528 }
4529 },
4530 .printlock = spi_prettyprint_status_register_en25s_wp,
4531 .unlock = spi_disable_blockprotect_bp3_srwd,
4532 .write = spi_chip_write_256,
4533 .read = spi_chip_read,
4534 .voltage = {1650, 1950},
4535 },
4536
4537 {
4538 .vendor = "Eon",
4539 .name = "EN25S64",
4540 .bustype = BUS_SPI,
4541 .manufacture_id = EON_ID_NOPREFIX,
4542 .model_id = EON_EN25S64,
4543 .total_size = 8192,
4544 .page_size = 256,
4545 /* OTP: 512B total; enter 0x3A */
4546 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4547 .tested = TEST_UNTESTED,
4548 .probe = probe_spi_rdid,
4549 .probe_timing = TIMING_ZERO,
4550 .block_erasers = {
4551 {
4552 .eraseblocks = { {4 * 1024, 2048} },
4553 .block_erase = spi_block_erase_20,
4554 }, {
4555 .eraseblocks = { {64 * 1024, 128} },
4556 .block_erase = spi_block_erase_d8,
4557 }, {
4558 .eraseblocks = { {8192 * 1024, 1} },
4559 .block_erase = spi_block_erase_60,
4560 }, {
4561 .eraseblocks = { {8192 * 1024, 1} },
4562 .block_erase = spi_block_erase_c7,
4563 }
4564 },
4565 .printlock = spi_prettyprint_status_register_en25s_wp,
4566 .unlock = spi_disable_blockprotect_bp3_srwd,
4567 .write = spi_chip_write_256,
4568 .read = spi_chip_read,
4569 .voltage = {1650, 1950},
4570 },
4571
4572 {
4573 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00004574 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004575 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00004576 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004577 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00004578 .total_size = 128,
4579 .page_size = 128,
4580 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004581 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00004582 .probe = probe_jedec,
4583 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4584 .block_erasers =
4585 {
4586 {
4587 .eraseblocks = { {16 * 1024, 8} },
4588 .block_erase = erase_sector_jedec,
4589 },
4590 {
4591 .eraseblocks = { {128 * 1024, 1} },
4592 .block_erase = erase_chip_block_jedec,
4593 },
4594 },
4595 .write = write_jedec_1,
4596 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004597 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00004598 },
4599
4600 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004601 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004602 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004603 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004604 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004605 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004606 .total_size = 256,
4607 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004608 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004609 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004610 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004611 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004612 .block_erasers =
4613 {
4614 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004615 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004616 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004617 {8 * 1024, 2},
4618 {32 * 1024, 1},
4619 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004620 },
4621 .block_erase = erase_sector_jedec,
4622 }, {
4623 .eraseblocks = { {256 * 1024, 1} },
4624 .block_erase = erase_chip_block_jedec,
4625 },
4626 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004627 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004628 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004629 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004630 },
4631
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004632 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004633 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004634 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004635 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004636 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004637 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004638 .total_size = 256,
4639 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004640 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00004641 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004642 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004643 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004644 .block_erasers =
4645 {
4646 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004647 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004648 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004649 {32 * 1024, 1},
4650 {8 * 1024, 2},
4651 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004652 },
4653 .block_erase = erase_sector_jedec,
4654 }, {
4655 .eraseblocks = { {256 * 1024, 1} },
4656 .block_erase = erase_chip_block_jedec,
4657 },
4658 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004659 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004660 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004661 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004662 },
4663
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004664 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004665 .vendor = "Eon",
4666 .name = "EN29LV640B",
4667 .bustype = BUS_PARALLEL,
4668 .manufacture_id = EON_ID,
4669 .model_id = EON_EN29LV640B,
4670 .total_size = 8192,
4671 .page_size = 8192,
4672 .feature_bits = 0,
4673 .tested = TEST_OK_PREW,
4674 .probe = probe_en29lv640b,
4675 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4676 .block_erasers =
4677 {
4678 {
4679 .eraseblocks = {
4680 {8 * 1024, 8},
4681 {64 * 1024, 127},
4682 },
4683 .block_erase = block_erase_en29lv640b,
4684 }, {
4685 .eraseblocks = { {8 * 1024 * 1024, 1} },
4686 .block_erase = block_erase_chip_en29lv640b,
4687 },
4688 },
4689 .write = write_en29lv640b,
4690 .read = read_memmapped,
4691 .voltage = {2700, 3600},
4692 },
4693
4694 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004695 .vendor = "Fujitsu",
4696 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004697 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004698 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004699 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004700 .total_size = 512,
4701 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004702 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004703 .tested = TEST_UNTESTED,
4704 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004705 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004706 .block_erasers =
4707 {
4708 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004709 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004710 {16 * 1024, 1},
4711 {8 * 1024, 2},
4712 {32 * 1024, 1},
4713 {64 * 1024, 7},
4714 },
Sean Nelson35727f72010-01-28 23:55:12 +00004715 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004716 }, {
4717 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004718 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004719 },
4720 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004721 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004722 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004723 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004724 },
4725
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004726 {
4727 .vendor = "Fujitsu",
4728 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004729 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004730 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004731 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004732 .total_size = 512,
4733 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004734 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004735 .tested = TEST_UNTESTED,
4736 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004737 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004738 .block_erasers =
4739 {
4740 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004741 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004742 {64 * 1024, 7},
4743 {32 * 1024, 1},
4744 {8 * 1024, 2},
4745 {16 * 1024, 1},
4746 },
Sean Nelson35727f72010-01-28 23:55:12 +00004747 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004748 }, {
4749 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004750 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004751 },
4752 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004753 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004754 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004755 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004756 },
4757
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004758 {
Sean Nelson35727f72010-01-28 23:55:12 +00004759 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004760 .vendor = "Fujitsu",
4761 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004762 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004763 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004764 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004765 .total_size = 512,
4766 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004767 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004768 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004769 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004770 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004771 .block_erasers =
4772 {
4773 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004774 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004775 {16 * 1024, 1},
4776 {8 * 1024, 2},
4777 {32 * 1024, 1},
4778 {64 * 1024, 7},
4779 },
4780 .block_erase = block_erase_m29f400bt,
4781 }, {
4782 .eraseblocks = { {512 * 1024, 1} },
4783 .block_erase = block_erase_chip_m29f400bt,
4784 },
4785 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004786 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004787 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004788 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004789 },
4790
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004791 {
4792 .vendor = "Fujitsu",
4793 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004794 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004795 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004796 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004797 .total_size = 512,
4798 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004799 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004800 .tested = TEST_UNTESTED,
4801 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004802 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004803 .block_erasers =
4804 {
4805 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004806 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004807 {64 * 1024, 7},
4808 {32 * 1024, 1},
4809 {8 * 1024, 2},
4810 {16 * 1024, 1},
4811 },
4812 .block_erase = block_erase_m29f400bt,
4813 }, {
4814 .eraseblocks = { {512 * 1024, 1} },
4815 .block_erase = block_erase_chip_m29f400bt,
4816 },
4817 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00004818 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004819 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004820 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004821 },
4822
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004823 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00004824 .vendor = "Fujitsu",
4825 .name = "MBM29LV160BE",
4826 .bustype = BUS_PARALLEL,
4827 .manufacture_id = FUJITSU_ID,
4828 .model_id = FUJITSU_MBM29LV160BE,
4829 .total_size = 2 * 1024,
4830 .page_size = 0,
4831 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
4832 .tested = TEST_UNTESTED,
4833 .probe = probe_m29f400bt,
4834 .probe_timing = TIMING_IGNORED,
4835 .block_erasers =
4836 {
4837 {
4838 .eraseblocks = {
4839 {16 * 1024, 1},
4840 {8 * 1024, 2},
4841 {32 * 1024, 1},
4842 {64 * 1024, 31},
4843 },
4844 .block_erase = block_erase_m29f400bt,
4845 }, {
4846 .eraseblocks = { {2048 * 1024, 1} },
4847 .block_erase = block_erase_chip_m29f400bt,
4848 },
4849 },
4850 .write = write_m29f400bt, /* Supports a fast mode too */
4851 .read = read_memmapped,
4852 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
4853 },
4854
4855 {
4856 .vendor = "Fujitsu",
4857 .name = "MBM29LV160TE",
4858 .bustype = BUS_PARALLEL,
4859 .manufacture_id = FUJITSU_ID,
4860 .model_id = FUJITSU_MBM29LV160TE,
4861 .total_size = 2 * 1024,
4862 .page_size = 0,
4863 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
4864 .tested = TEST_UNTESTED,
4865 .probe = probe_m29f400bt,
4866 .probe_timing = TIMING_IGNORED,
4867 .block_erasers =
4868 {
4869 {
4870 .eraseblocks = {
4871 {64 * 1024, 31},
4872 {32 * 1024, 1},
4873 {8 * 1024, 2},
4874 {16 * 1024, 1},
4875 },
4876 .block_erase = block_erase_m29f400bt,
4877 }, {
4878 .eraseblocks = { {2048 * 1024, 1} },
4879 .block_erase = block_erase_chip_m29f400bt,
4880 },
4881 },
4882 .write = write_m29f400bt, /* Supports a fast mode too */
4883 .read = read_memmapped,
4884 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
4885 },
4886
4887 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004888 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004889 .name = "GD25LQ32",
4890 .bustype = BUS_SPI,
4891 .manufacture_id = GIGADEVICE_ID,
4892 .model_id = GIGADEVICE_GD25LQ32,
4893 .total_size = 4096,
4894 .page_size = 256,
4895 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
4896 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4897 .tested = TEST_OK_PREW,
4898 .probe = probe_spi_rdid,
4899 .probe_timing = TIMING_ZERO,
4900 .block_erasers =
4901 {
4902 {
4903 .eraseblocks = { {4 * 1024, 1024} },
4904 .block_erase = spi_block_erase_20,
4905 }, {
4906 .eraseblocks = { {32 * 1024, 128} },
4907 .block_erase = spi_block_erase_52,
4908 }, {
4909 .eraseblocks = { {64 * 1024, 64} },
4910 .block_erase = spi_block_erase_d8,
4911 }, {
4912 .eraseblocks = { {4 * 1024 * 1024, 1} },
4913 .block_erase = spi_block_erase_60,
4914 }, {
4915 .eraseblocks = { {4 * 1024 * 1024, 1} },
4916 .block_erase = spi_block_erase_c7,
4917 }
4918 },
4919 .printlock = spi_prettyprint_status_register_default_bp4,
4920 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4921 .write = spi_chip_write_256,
4922 .read = spi_chip_read,
4923 .voltage = {1700, 1950},
4924 },
4925
4926 {
4927 .vendor = "GigaDevice",
4928 .name = "GD25Q512",
4929 .bustype = BUS_SPI,
4930 .manufacture_id = GIGADEVICE_ID,
4931 .model_id = GIGADEVICE_GD25Q512,
4932 .total_size = 64,
4933 .page_size = 256,
4934 .feature_bits = FEATURE_WRSR_WREN,
4935 .tested = TEST_UNTESTED,
4936 .probe = probe_spi_rdid,
4937 .probe_timing = TIMING_ZERO,
4938 .block_erasers = {
4939 {
4940 .eraseblocks = { {4 * 1024, 16} },
4941 .block_erase = spi_block_erase_20,
4942 }, {
4943 .eraseblocks = { {32 * 1024, 2} },
4944 .block_erase = spi_block_erase_52,
4945 }, {
4946 .eraseblocks = { {64 * 1024, 1} },
4947 .block_erase = spi_block_erase_60,
4948 }, {
4949 .eraseblocks = { {64 * 1024, 1} },
4950 .block_erase = spi_block_erase_c7,
4951 }
4952 },
4953 .printlock = spi_prettyprint_status_register_default_bp4,
4954 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4955 .write = spi_chip_write_256,
4956 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4957 .voltage = {2700, 3600},
4958 },
4959
4960 {
4961 .vendor = "GigaDevice",
4962 .name = "GD25Q10",
4963 .bustype = BUS_SPI,
4964 .manufacture_id = GIGADEVICE_ID,
4965 .model_id = GIGADEVICE_GD25Q10,
4966 .total_size = 128,
4967 .page_size = 256,
4968 .feature_bits = FEATURE_WRSR_WREN,
4969 .tested = TEST_UNTESTED,
4970 .probe = probe_spi_rdid,
4971 .probe_timing = TIMING_ZERO,
4972 .block_erasers = {
4973 {
4974 .eraseblocks = { {4 * 1024, 32} },
4975 .block_erase = spi_block_erase_20,
4976 }, {
4977 .eraseblocks = { {32 * 1024, 4} },
4978 .block_erase = spi_block_erase_52,
4979 }, {
4980 .eraseblocks = { {64 * 1024, 2} },
4981 .block_erase = spi_block_erase_d8,
4982 }, {
4983 .eraseblocks = { {128 * 1024, 1} },
4984 .block_erase = spi_block_erase_60,
4985 }, {
4986 .eraseblocks = { {128 * 1024, 1} },
4987 .block_erase = spi_block_erase_c7,
4988 }
4989 },
4990 .printlock = spi_prettyprint_status_register_default_bp4,
4991 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4992 .write = spi_chip_write_256,
4993 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4994 .voltage = {2700, 3600},
4995 },
4996
4997 {
4998 .vendor = "GigaDevice",
4999 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005000 .bustype = BUS_SPI,
5001 .manufacture_id = GIGADEVICE_ID,
5002 .model_id = GIGADEVICE_GD25Q20,
5003 .total_size = 256,
5004 .page_size = 256,
5005 .feature_bits = FEATURE_WRSR_WREN,
5006 .tested = TEST_UNTESTED,
5007 .probe = probe_spi_rdid,
5008 .probe_timing = TIMING_ZERO,
5009 .block_erasers =
5010 {
5011 {
5012 .eraseblocks = { {4 * 1024, 64} },
5013 .block_erase = spi_block_erase_20,
5014 }, {
5015 .eraseblocks = { {32 * 1024, 8} },
5016 .block_erase = spi_block_erase_52,
5017 }, {
5018 .eraseblocks = { {64 * 1024, 4} },
5019 .block_erase = spi_block_erase_d8,
5020 }, {
5021 .eraseblocks = { {256 * 1024, 1} },
5022 .block_erase = spi_block_erase_60,
5023 }, {
5024 .eraseblocks = { {256 * 1024, 1} },
5025 .block_erase = spi_block_erase_c7,
5026 }
5027 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005028 .printlock = spi_prettyprint_status_register_default_bp4,
5029 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005030 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005031 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005032 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005033 },
5034
5035 {
5036 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005037 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005038 .bustype = BUS_SPI,
5039 .manufacture_id = GIGADEVICE_ID,
5040 .model_id = GIGADEVICE_GD25Q40,
5041 .total_size = 512,
5042 .page_size = 256,
5043 .feature_bits = FEATURE_WRSR_WREN,
5044 .tested = TEST_UNTESTED,
5045 .probe = probe_spi_rdid,
5046 .probe_timing = TIMING_ZERO,
5047 .block_erasers =
5048 {
5049 {
5050 .eraseblocks = { {4 * 1024, 128} },
5051 .block_erase = spi_block_erase_20,
5052 }, {
5053 .eraseblocks = { {32 * 1024, 16} },
5054 .block_erase = spi_block_erase_52,
5055 }, {
5056 .eraseblocks = { {64 * 1024, 8} },
5057 .block_erase = spi_block_erase_d8,
5058 }, {
5059 .eraseblocks = { {512 * 1024, 1} },
5060 .block_erase = spi_block_erase_60,
5061 }, {
5062 .eraseblocks = { {512 * 1024, 1} },
5063 .block_erase = spi_block_erase_c7,
5064 }
5065 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005066 .printlock = spi_prettyprint_status_register_default_bp4,
5067 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005068 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005069 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005070 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005071 },
5072
5073 {
5074 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005075 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005076 .bustype = BUS_SPI,
5077 .manufacture_id = GIGADEVICE_ID,
5078 .model_id = GIGADEVICE_GD25Q80,
5079 .total_size = 1024,
5080 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005081 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005082 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5083 .tested = TEST_OK_PREW,
5084 .probe = probe_spi_rdid,
5085 .probe_timing = TIMING_ZERO,
5086 .block_erasers =
5087 {
5088 {
5089 .eraseblocks = { {4 * 1024, 256} },
5090 .block_erase = spi_block_erase_20,
5091 }, {
5092 .eraseblocks = { {32 * 1024, 32} },
5093 .block_erase = spi_block_erase_52,
5094 }, {
5095 .eraseblocks = { {64 * 1024, 16} },
5096 .block_erase = spi_block_erase_d8,
5097 }, {
5098 .eraseblocks = { {1024 * 1024, 1} },
5099 .block_erase = spi_block_erase_60,
5100 }, {
5101 .eraseblocks = { {1024 * 1024, 1} },
5102 .block_erase = spi_block_erase_c7,
5103 }
5104 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005105 .printlock = spi_prettyprint_status_register_default_bp4,
5106 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005107 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005108 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005109 .voltage = {2700, 3600},
5110 },
5111
5112 {
5113 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005114 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005115 .bustype = BUS_SPI,
5116 .manufacture_id = GIGADEVICE_ID,
5117 .model_id = GIGADEVICE_GD25Q16,
5118 .total_size = 2048,
5119 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005120 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005121 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5122 .tested = TEST_UNTESTED,
5123 .probe = probe_spi_rdid,
5124 .probe_timing = TIMING_ZERO,
5125 .block_erasers =
5126 {
5127 {
5128 .eraseblocks = { {4 * 1024, 512} },
5129 .block_erase = spi_block_erase_20,
5130 }, {
5131 .eraseblocks = { {32 * 1024, 64} },
5132 .block_erase = spi_block_erase_52,
5133 }, {
5134 .eraseblocks = { {64 * 1024, 32} },
5135 .block_erase = spi_block_erase_d8,
5136 }, {
5137 .eraseblocks = { {2 * 1024 * 1024, 1} },
5138 .block_erase = spi_block_erase_60,
5139 }, {
5140 .eraseblocks = { {2 * 1024 * 1024, 1} },
5141 .block_erase = spi_block_erase_c7,
5142 }
5143 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005144 .printlock = spi_prettyprint_status_register_default_bp4,
5145 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005146 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005147 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005148 .voltage = {2700, 3600},
5149 },
5150
5151 {
5152 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005153 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005154 .bustype = BUS_SPI,
5155 .manufacture_id = GIGADEVICE_ID,
5156 .model_id = GIGADEVICE_GD25Q32,
5157 .total_size = 4096,
5158 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005159 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5161 .tested = TEST_UNTESTED,
5162 .probe = probe_spi_rdid,
5163 .probe_timing = TIMING_ZERO,
5164 .block_erasers =
5165 {
5166 {
5167 .eraseblocks = { {4 * 1024, 1024} },
5168 .block_erase = spi_block_erase_20,
5169 }, {
5170 .eraseblocks = { {32 * 1024, 128} },
5171 .block_erase = spi_block_erase_52,
5172 }, {
5173 .eraseblocks = { {64 * 1024, 64} },
5174 .block_erase = spi_block_erase_d8,
5175 }, {
5176 .eraseblocks = { {4 * 1024 * 1024, 1} },
5177 .block_erase = spi_block_erase_60,
5178 }, {
5179 .eraseblocks = { {4 * 1024 * 1024, 1} },
5180 .block_erase = spi_block_erase_c7,
5181 }
5182 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005183 .printlock = spi_prettyprint_status_register_default_bp4,
5184 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005185 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005186 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005187 .voltage = {2700, 3600},
5188 },
5189
5190 {
5191 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005192 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005193 .bustype = BUS_SPI,
5194 .manufacture_id = GIGADEVICE_ID,
5195 .model_id = GIGADEVICE_GD25Q64,
5196 .total_size = 8192,
5197 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005198 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005199 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00005200 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005201 .probe = probe_spi_rdid,
5202 .probe_timing = TIMING_ZERO,
5203 .block_erasers =
5204 {
5205 {
5206 .eraseblocks = { {4 * 1024, 2048} },
5207 .block_erase = spi_block_erase_20,
5208 }, {
5209 .eraseblocks = { {32 * 1024, 256} },
5210 .block_erase = spi_block_erase_52,
5211 }, {
5212 .eraseblocks = { {64 * 1024, 128} },
5213 .block_erase = spi_block_erase_d8,
5214 }, {
5215 .eraseblocks = { {8 * 1024 * 1024, 1} },
5216 .block_erase = spi_block_erase_60,
5217 }, {
5218 .eraseblocks = { {8 * 1024 * 1024, 1} },
5219 .block_erase = spi_block_erase_c7,
5220 }
5221 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005222 .printlock = spi_prettyprint_status_register_default_bp4,
5223 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005224 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005225 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00005226 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005227 },
5228
5229 {
5230 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005231 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005232 .bustype = BUS_SPI,
5233 .manufacture_id = GIGADEVICE_ID,
5234 .model_id = GIGADEVICE_GD25Q128,
5235 .total_size = 16384,
5236 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005237 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005238 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5239 .tested = TEST_UNTESTED,
5240 .probe = probe_spi_rdid,
5241 .probe_timing = TIMING_ZERO,
5242 .block_erasers =
5243 {
5244 {
5245 .eraseblocks = { {4 * 1024, 4096} },
5246 .block_erase = spi_block_erase_20,
5247 }, {
5248 .eraseblocks = { {32 * 1024, 512} },
5249 .block_erase = spi_block_erase_52,
5250 }, {
5251 .eraseblocks = { {64 * 1024, 256} },
5252 .block_erase = spi_block_erase_d8,
5253 }, {
5254 .eraseblocks = { {16 * 1024 * 1024, 1} },
5255 .block_erase = spi_block_erase_60,
5256 }, {
5257 .eraseblocks = { {16 * 1024 * 1024, 1} },
5258 .block_erase = spi_block_erase_c7,
5259 }
5260 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005261 .printlock = spi_prettyprint_status_register_default_bp4,
5262 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5263 .write = spi_chip_write_256,
5264 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5265 .voltage = {2700, 3600},
5266 },
5267
5268 {
5269 .vendor = "GigaDevice",
5270 .name = "GD25T80",
5271 .bustype = BUS_SPI,
5272 .manufacture_id = GIGADEVICE_ID,
5273 .model_id = GIGADEVICE_GD25T80,
5274 .total_size = 1024,
5275 .page_size = 256,
5276 /* OTP: 256B total; enter 0x3A */
5277 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5278 .tested = TEST_UNTESTED,
5279 .probe = probe_spi_rdid,
5280 .probe_timing = TIMING_ZERO,
5281 .block_erasers = {
5282 {
5283 .eraseblocks = { {4 * 1024, 256} },
5284 .block_erase = spi_block_erase_20,
5285 }, {
5286 .eraseblocks = { {64 * 1024, 16} },
5287 .block_erase = spi_block_erase_52,
5288 }, {
5289 .eraseblocks = { {64 * 1024, 16} },
5290 .block_erase = spi_block_erase_d8,
5291 }, {
5292 .eraseblocks = { {1024 * 1024, 1} },
5293 .block_erase = spi_block_erase_60,
5294 }, {
5295 .eraseblocks = { {1024 * 1024, 1} },
5296 .block_erase = spi_block_erase_c7,
5297 }
5298 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005299 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005300 .unlock = spi_disable_blockprotect,
5301 .write = spi_chip_write_256,
5302 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005303 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005304 },
5305
5306 {
David Borgc96a8bd2010-06-21 16:12:22 +00005307 .vendor = "Hyundai",
5308 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005309 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005310 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005311 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005312 .total_size = 256,
5313 .page_size = 256 * 1024,
5314 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005315 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005316 .probe = probe_jedec,
5317 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5318 .block_erasers =
5319 {
5320 {
5321 .eraseblocks = {
5322 {64 * 1024, 3},
5323 {32 * 1024, 1},
5324 {8 * 1024, 2},
5325 {16 * 1024, 1},
5326 },
5327 .block_erase = erase_sector_jedec,
5328 }, {
5329 .eraseblocks = { {256 * 1024, 1} },
5330 .block_erase = erase_chip_block_jedec,
5331 },
5332 },
5333 .write = write_jedec_1,
5334 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005335 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005336 },
5337
5338 {
5339 .vendor = "Hyundai",
5340 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005341 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005342 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005343 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005344 .total_size = 256,
5345 .page_size = 256 * 1024,
5346 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5347 .tested = TEST_UNTESTED,
5348 .probe = probe_jedec,
5349 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5350 .block_erasers =
5351 {
5352 {
5353 .eraseblocks = {
5354 {16 * 1024, 1},
5355 {8 * 1024, 2},
5356 {32 * 1024, 1},
5357 {64 * 1024, 3},
5358 },
5359 .block_erase = erase_sector_jedec,
5360 }, {
5361 .eraseblocks = { {256 * 1024, 1} },
5362 .block_erase = erase_chip_block_jedec,
5363 },
5364 },
5365 .write = write_jedec_1,
5366 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005367 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005368 },
5369
5370 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005371 .vendor = "Hyundai",
5372 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005373 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005374 .manufacture_id = HYUNDAI_ID,
5375 .model_id = HYUNDAI_HY29F040A,
5376 .total_size = 512,
5377 .page_size = 64 * 1024,
5378 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5379 .tested = TEST_UNTESTED,
5380 .probe = probe_jedec,
5381 .probe_timing = TIMING_ZERO,
5382 .block_erasers =
5383 {
5384 {
5385 .eraseblocks = { {64 * 1024, 8} },
5386 .block_erase = erase_sector_jedec,
5387 }, {
5388 .eraseblocks = { {512 * 1024, 1} },
5389 .block_erase = erase_chip_block_jedec,
5390 },
5391 },
5392 .write = write_jedec_1,
5393 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005394 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005395 },
5396
5397 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005398 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005399 .name = "25F160S33B8",
5400 .bustype = BUS_SPI,
5401 .manufacture_id = INTEL_ID,
5402 .model_id = INTEL_25F160S33B8,
5403 .total_size = 2048,
5404 .page_size = 256,
5405 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5406 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5407 .tested = TEST_UNTESTED,
5408 .probe = probe_spi_rdid,
5409 .probe_timing = TIMING_ZERO,
5410 .block_erasers =
5411 {
5412 {
5413 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5414 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5415 * have no effect on the memory contents, but sets a flag in the SR.
5416 .eraseblocks = {
5417 {8 * 1024, 8},
5418 {64 * 1024, 31} // inaccessible
5419 },
5420 .block_erase = spi_block_erase_40,
5421 }, { */
5422 .eraseblocks = { {64 * 1024, 32} },
5423 .block_erase = spi_block_erase_d8,
5424 }, {
5425 .eraseblocks = { {2 * 1024 * 1024, 1} },
5426 .block_erase = spi_block_erase_c7,
5427 }
5428 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005429 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5430 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005431 .write = spi_chip_write_256,
5432 .read = spi_chip_read, /* also fast read 0x0B */
5433 .voltage = {2700, 3600},
5434 },
5435
5436 {
5437 .vendor = "Intel",
5438 .name = "25F160S33T8",
5439 .bustype = BUS_SPI,
5440 .manufacture_id = INTEL_ID,
5441 .model_id = INTEL_25F160S33T8,
5442 .total_size = 2048,
5443 .page_size = 256,
5444 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5445 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5446 .tested = TEST_UNTESTED,
5447 .probe = probe_spi_rdid,
5448 .probe_timing = TIMING_ZERO,
5449 .block_erasers =
5450 {
5451 {
5452 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5453 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5454 * have no effect on the memory contents, but sets a flag in the SR.
5455 .eraseblocks = {
5456 {64 * 1024, 31}, // inaccessible
5457 {8 * 1024, 8}
5458 },
5459 .block_erase = spi_block_erase_40,
5460 }, { */
5461 .eraseblocks = { {64 * 1024, 32} },
5462 .block_erase = spi_block_erase_d8,
5463 }, {
5464 .eraseblocks = { {2 * 1024 * 1024, 1} },
5465 .block_erase = spi_block_erase_c7,
5466 }
5467 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005468 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5469 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005470 .write = spi_chip_write_256,
5471 .read = spi_chip_read, /* also fast read 0x0B */
5472 .voltage = {2700, 3600},
5473 },
5474
5475 {
5476 .vendor = "Intel",
5477 .name = "25F320S33B8",
5478 .bustype = BUS_SPI,
5479 .manufacture_id = INTEL_ID,
5480 .model_id = INTEL_25F320S33B8,
5481 .total_size = 4096,
5482 .page_size = 256,
5483 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5484 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5485 .tested = TEST_UNTESTED,
5486 .probe = probe_spi_rdid,
5487 .probe_timing = TIMING_ZERO,
5488 .block_erasers =
5489 {
5490 {
5491 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5492 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5493 * have no effect on the memory contents, but sets a flag in the SR.
5494 .eraseblocks = {
5495 {8 * 1024, 8},
5496 {64 * 1024, 63} // inaccessible
5497 },
5498 .block_erase = spi_block_erase_40,
5499 }, { */
5500 .eraseblocks = { {64 * 1024, 64} },
5501 .block_erase = spi_block_erase_d8,
5502 }, {
5503 .eraseblocks = { {4 * 1024 * 1024, 1} },
5504 .block_erase = spi_block_erase_c7,
5505 }
5506 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005507 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5508 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005509 .write = spi_chip_write_256,
5510 .read = spi_chip_read, /* also fast read 0x0B */
5511 .voltage = {2700, 3600},
5512 },
5513
5514 {
5515 .vendor = "Intel",
5516 .name = "25F320S33T8",
5517 .bustype = BUS_SPI,
5518 .manufacture_id = INTEL_ID,
5519 .model_id = INTEL_25F320S33T8,
5520 .total_size = 4096,
5521 .page_size = 256,
5522 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5524 .tested = TEST_UNTESTED,
5525 .probe = probe_spi_rdid,
5526 .probe_timing = TIMING_ZERO,
5527 .block_erasers =
5528 {
5529 {
5530 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5531 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5532 * have no effect on the memory contents, but sets a flag in the SR.
5533 .eraseblocks = {
5534 {64 * 1024, 63}, // inaccessible
5535 {8 * 1024, 8}
5536 },
5537 .block_erase = spi_block_erase_40,
5538 }, { */
5539 .eraseblocks = { {64 * 1024, 64} },
5540 .block_erase = spi_block_erase_d8,
5541 }, {
5542 .eraseblocks = { {4 * 1024 * 1024, 1} },
5543 .block_erase = spi_block_erase_c7,
5544 }
5545 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005546 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5547 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005548 .write = spi_chip_write_256,
5549 .read = spi_chip_read, /* also fast read 0x0B */
5550 .voltage = {2700, 3600},
5551 },
5552
5553 {
5554 .vendor = "Intel",
5555 .name = "25F640S33B8",
5556 .bustype = BUS_SPI,
5557 .manufacture_id = INTEL_ID,
5558 .model_id = INTEL_25F640S33B8,
5559 .total_size = 8192,
5560 .page_size = 256,
5561 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5562 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5563 .tested = TEST_UNTESTED,
5564 .probe = probe_spi_rdid,
5565 .probe_timing = TIMING_ZERO,
5566 .block_erasers =
5567 {
5568 {
5569 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5570 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5571 * have no effect on the memory contents, but sets a flag in the SR.
5572 .eraseblocks = {
5573 {8 * 1024, 8},
5574 {64 * 1024, 127} // inaccessible
5575 },
5576 .block_erase = spi_block_erase_40,
5577 }, { */
5578 .eraseblocks = { {64 * 1024, 128} },
5579 .block_erase = spi_block_erase_d8,
5580 }, {
5581 .eraseblocks = { {8 * 1024 * 1024, 1} },
5582 .block_erase = spi_block_erase_c7,
5583 }
5584 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005585 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5586 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005587 .write = spi_chip_write_256,
5588 .read = spi_chip_read, /* also fast read 0x0B */
5589 .voltage = {2700, 3600},
5590 },
5591
5592 {
5593 .vendor = "Intel",
5594 .name = "25F640S33T8",
5595 .bustype = BUS_SPI,
5596 .manufacture_id = INTEL_ID,
5597 .model_id = INTEL_25F640S33T8,
5598 .total_size = 8192,
5599 .page_size = 256,
5600 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5601 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5602 .tested = TEST_UNTESTED,
5603 .probe = probe_spi_rdid,
5604 .probe_timing = TIMING_ZERO,
5605 .block_erasers =
5606 {
5607 {
5608 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5609 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5610 * have no effect on the memory contents, but sets a flag in the SR.
5611 .eraseblocks = {
5612 {64 * 1024, 127}, // inaccessible
5613 {8 * 1024, 8}
5614 },
5615 .block_erase = spi_block_erase_40,
5616 }, { */
5617 .eraseblocks = { {64 * 1024, 128} },
5618 .block_erase = spi_block_erase_d8,
5619 }, {
5620 .eraseblocks = { {8 * 1024 * 1024, 1} },
5621 .block_erase = spi_block_erase_c7,
5622 }
5623 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005624 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5625 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005626 .write = spi_chip_write_256,
5627 .read = spi_chip_read, /* also fast read 0x0B */
5628 .voltage = {2700, 3600},
5629 },
5630
5631 {
5632 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005633 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005634 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005635 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005636 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005637 .total_size = 128,
5638 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00005639 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005640 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005641 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005642 .block_erasers =
5643 {
5644 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005645 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005646 {8 * 1024, 1},
5647 {4 * 1024, 2},
5648 {112 * 1024, 1},
5649 },
Sean Nelson28accc22010-03-19 18:47:06 +00005650 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005651 },
5652 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005653 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005654 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005655 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005656 },
5657
5658 {
5659 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005660 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005661 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005662 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005663 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005664 .total_size = 128,
5665 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005666 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005667 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005668 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005669 .block_erasers =
5670 {
5671 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005672 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005673 {112 * 1024, 1},
5674 {4 * 1024, 2},
5675 {8 * 1024, 1},
5676 },
Sean Nelson28accc22010-03-19 18:47:06 +00005677 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005678 },
5679 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005680 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005681 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005682 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005683 },
5684
5685 {
5686 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005687 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005688 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005689 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005690 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005691 .total_size = 256,
5692 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005693 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005694 .probe = probe_82802ab,
5695 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5696 .block_erasers =
5697 {
5698 {
5699 .eraseblocks = {
5700 {128 * 1024, 1},
5701 {96 * 1024, 1},
5702 {8 * 1024, 2},
5703 {16 * 1024, 1},
5704 },
5705 .block_erase = erase_block_82802ab,
5706 },
5707 },
5708 .write = write_82802ab,
5709 .read = read_memmapped,
5710 },
5711
5712 {
5713 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005714 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005715 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005716 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005717 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005718 .total_size = 512,
5719 .page_size = 256,
5720 .tested = TEST_UNTESTED,
5721 .probe = probe_82802ab,
5722 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005723 .block_erasers =
5724 {
5725 {
5726 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005727 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005728 },
5729 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005730 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005731 .write = write_82802ab,
5732 .read = read_memmapped,
5733 },
5734
5735 {
5736 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005737 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005738 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005739 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005740 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005741 .total_size = 512,
5742 .page_size = 128 * 1024, /* maximal block size */
5743 .tested = TEST_UNTESTED,
5744 .probe = probe_82802ab,
5745 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5746 .block_erasers =
5747 {
5748 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005749 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005750 {16 * 1024, 1},
5751 {8 * 1024, 2},
5752 {96 * 1024, 1},
5753 {128 * 1024, 3},
5754 },
5755 .block_erase = erase_block_82802ab,
5756 },
5757 },
5758 .write = write_82802ab,
5759 .read = read_memmapped,
5760 },
5761
5762 {
5763 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005764 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005765 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005766 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005767 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005768 .total_size = 512,
5769 .page_size = 128 * 1024, /* maximal block size */
5770 .tested = TEST_UNTESTED,
5771 .probe = probe_82802ab,
5772 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5773 .block_erasers =
5774 {
5775 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005776 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005777 {128 * 1024, 3},
5778 {96 * 1024, 1},
5779 {8 * 1024, 2},
5780 {16 * 1024, 1},
5781 },
5782 .block_erase = erase_block_82802ab,
5783 },
5784 },
5785 .write = write_82802ab,
5786 .read = read_memmapped,
5787 },
5788
5789 {
5790 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005791 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005792 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005793 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005794 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005795 .total_size = 512,
5796 .page_size = 128 * 1024, /* maximal block size */
5797 .feature_bits = FEATURE_ADDR_SHIFTED,
5798 .tested = TEST_UNTESTED,
5799 .probe = probe_82802ab,
5800 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5801 .block_erasers =
5802 {
5803 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005804 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005805 {16 * 1024, 1},
5806 {8 * 1024, 2},
5807 {96 * 1024, 1},
5808 {128 * 1024, 3},
5809 },
5810 .block_erase = erase_block_82802ab,
5811 },
5812 },
5813 .write = write_82802ab,
5814 .read = read_memmapped,
5815 },
5816
5817 {
5818 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005819 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005820 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005821 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005822 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005823 .total_size = 512,
5824 .page_size = 128 * 1024, /* maximal block size */
5825 .feature_bits = FEATURE_ADDR_SHIFTED,
5826 .tested = TEST_UNTESTED,
5827 .probe = probe_82802ab,
5828 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5829 .block_erasers =
5830 {
5831 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005832 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005833 {128 * 1024, 3},
5834 {96 * 1024, 1},
5835 {8 * 1024, 2},
5836 {16 * 1024, 1},
5837 },
5838 .block_erase = erase_block_82802ab,
5839 },
5840 },
5841 .write = write_82802ab,
5842 .read = read_memmapped,
5843 },
5844
5845 {
5846 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005847 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005848 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005849 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005850 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005851 .total_size = 512,
5852 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005853 .feature_bits = FEATURE_REGISTERMAP,
Stefan Taunerd06d9412011-06-12 19:47:55 +00005854 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005855 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005856 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005857 .block_erasers =
5858 {
5859 {
5860 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005861 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005862 },
5863 },
Sean Nelson28accc22010-03-19 18:47:06 +00005864 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005865 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005866 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005867 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005868 },
5869
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005870 {
5871 .vendor = "Intel",
5872 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005873 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005874 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005875 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005876 .total_size = 1024,
5877 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005878 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00005879 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005880 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005881 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005882 .block_erasers =
5883 {
5884 {
5885 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00005886 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005887 },
5888 },
Sean Nelson28accc22010-03-19 18:47:06 +00005889 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005890 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005891 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005892 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005893 },
5894
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005895 {
5896 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005897 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005898 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005899 .manufacture_id = MACRONIX_ID,
5900 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005901 .total_size = 64,
5902 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005903 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005904 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005905 .tested = TEST_UNTESTED,
5906 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005907 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005908 .block_erasers =
5909 {
5910 {
5911 .eraseblocks = { {4 * 1024, 16} },
5912 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005913 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005914 .eraseblocks = { {64 * 1024, 1} },
5915 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005916 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005917 .eraseblocks = { {64 * 1024, 1} },
5918 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005919 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005920 .eraseblocks = { {64 * 1024, 1} },
5921 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005922 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005923 .eraseblocks = { {64 * 1024, 1} },
5924 .block_erase = spi_block_erase_c7,
5925 },
5926 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005927 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005928 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005929 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005930 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
5931 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00005932 },
5933
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005934 {
5935 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005936 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005937 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005938 .manufacture_id = MACRONIX_ID,
5939 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005940 .total_size = 128,
5941 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005942 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005943 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00005944 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005945 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005946 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005947 .block_erasers =
5948 {
5949 {
5950 .eraseblocks = { {4 * 1024, 32} },
5951 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005952 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005953 .eraseblocks = { {64 * 1024, 2} },
5954 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005955 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005956 .eraseblocks = { {128 * 1024, 1} },
5957 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005958 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005959 .eraseblocks = { {128 * 1024, 1} },
5960 .block_erase = spi_block_erase_c7,
5961 },
5962 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005963 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005964 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005965 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005966 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005967 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005968 },
5969
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005970 {
5971 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005972 .name = "MX25L2005(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005973 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005974 .manufacture_id = MACRONIX_ID,
5975 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005976 .total_size = 256,
5977 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005978 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005979 .tested = TEST_UNTESTED,
5980 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005981 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005982 .block_erasers =
5983 {
5984 {
5985 .eraseblocks = { {4 * 1024, 64} },
5986 .block_erase = spi_block_erase_20,
5987 }, {
5988 .eraseblocks = { {64 * 1024, 4} },
5989 .block_erase = spi_block_erase_52,
5990 }, {
5991 .eraseblocks = { {64 * 1024, 4} },
5992 .block_erase = spi_block_erase_d8,
5993 }, {
5994 .eraseblocks = { {256 * 1024, 1} },
5995 .block_erase = spi_block_erase_60,
5996 }, {
5997 .eraseblocks = { {256 * 1024, 1} },
5998 .block_erase = spi_block_erase_c7,
5999 },
6000 },
Stefan Taunerf656e802013-02-02 15:35:44 +00006001 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006002 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006003 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006004 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006005 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006006 },
6007
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006008 {
6009 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006010 .name = "MX25L4005(A/C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006011 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006012 .manufacture_id = MACRONIX_ID,
6013 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006014 .total_size = 512,
6015 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006016 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00006017 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006018 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006019 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006020 .block_erasers =
6021 {
6022 {
6023 .eraseblocks = { {4 * 1024, 128} },
6024 .block_erase = spi_block_erase_20,
6025 }, {
6026 .eraseblocks = { {64 * 1024, 8} },
6027 .block_erase = spi_block_erase_52,
6028 }, {
6029 .eraseblocks = { {64 * 1024, 8} },
6030 .block_erase = spi_block_erase_d8,
6031 }, {
6032 .eraseblocks = { {512 * 1024, 1} },
6033 .block_erase = spi_block_erase_60,
6034 }, {
6035 .eraseblocks = { {512 * 1024, 1} },
6036 .block_erase = spi_block_erase_c7,
6037 },
6038 },
Stefan Taunerf656e802013-02-02 15:35:44 +00006039 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006040 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006041 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006042 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006043 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006044 },
6045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006046 {
6047 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006048 .name = "MX25L8005/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006049 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006050 .manufacture_id = MACRONIX_ID,
6051 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006052 .total_size = 1024,
6053 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006054 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00006055 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006056 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006057 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006058 .block_erasers =
6059 {
6060 {
6061 .eraseblocks = { {4 * 1024, 256} },
6062 .block_erase = spi_block_erase_20,
6063 }, {
6064 .eraseblocks = { {64 * 1024, 16} },
6065 .block_erase = spi_block_erase_52,
6066 }, {
6067 .eraseblocks = { {64 * 1024, 16} },
6068 .block_erase = spi_block_erase_d8,
6069 }, {
6070 .eraseblocks = { {1024 * 1024, 1} },
6071 .block_erase = spi_block_erase_60,
6072 }, {
6073 .eraseblocks = { {1024 * 1024, 1} },
6074 .block_erase = spi_block_erase_c7,
6075 },
6076 },
Stefan Taunerf656e802013-02-02 15:35:44 +00006077 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006078 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006079 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006080 .read = spi_chip_read, /* Fast read (0x0B) supported */
6081 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00006082 },
6083
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006084 {
6085 .vendor = "Macronix",
6086 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006087 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006088 .manufacture_id = MACRONIX_ID,
6089 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006090 .total_size = 2048,
6091 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006092 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00006093 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006094 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006095 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006096 .block_erasers =
6097 {
6098 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006099 .eraseblocks = { {64 * 1024, 32} },
6100 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006101 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006102 .eraseblocks = { {64 * 1024, 32} },
6103 .block_erase = spi_block_erase_d8,
6104 }, {
6105 .eraseblocks = { {2 * 1024 * 1024, 1} },
6106 .block_erase = spi_block_erase_60,
6107 }, {
6108 .eraseblocks = { {2 * 1024 * 1024, 1} },
6109 .block_erase = spi_block_erase_c7,
6110 },
6111 },
6112 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
6113 .unlock = spi_disable_blockprotect,
6114 .write = spi_chip_write_256,
6115 .read = spi_chip_read, /* Fast read (0x0B) supported */
6116 .voltage = {2700, 3600},
6117 },
6118
6119 {
6120 .vendor = "Macronix",
6121 .name = "MX25L1605A/MX25L1606E",
6122 .bustype = BUS_SPI,
6123 .manufacture_id = MACRONIX_ID,
6124 .model_id = MACRONIX_MX25L1605,
6125 .total_size = 2048,
6126 .page_size = 256,
6127 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
6128 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6129 .tested = TEST_OK_PREW,
6130 .probe = probe_spi_rdid,
6131 .probe_timing = TIMING_ZERO,
6132 .block_erasers =
6133 {
6134 {
6135 .eraseblocks = { {4 * 1024, 512} },
6136 .block_erase = spi_block_erase_20,
6137 }, {
6138 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006139 .block_erase = spi_block_erase_52,
6140 }, {
6141 .eraseblocks = { {64 * 1024, 32} },
6142 .block_erase = spi_block_erase_d8,
6143 }, {
6144 .eraseblocks = { {2 * 1024 * 1024, 1} },
6145 .block_erase = spi_block_erase_60,
6146 }, {
6147 .eraseblocks = { {2 * 1024 * 1024, 1} },
6148 .block_erase = spi_block_erase_c7,
6149 },
6150 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006151 .printlock = spi_prettyprint_status_register_default_bp3, /* MX25L1605A bp2 only */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006152 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006153 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006154 .read = spi_chip_read, /* Fast read (0x0B) supported */
6155 .voltage = {2700, 3600},
6156 },
6157
6158 {
6159 .vendor = "Macronix",
6160 .name = "MX25L1605D/MX25L1608D",
6161 .bustype = BUS_SPI,
6162 .manufacture_id = MACRONIX_ID,
6163 .model_id = MACRONIX_MX25L1605,
6164 .total_size = 2048,
6165 .page_size = 256,
6166 .feature_bits = FEATURE_WRSR_WREN,
6167 .tested = TEST_OK_PREW,
6168 .probe = probe_spi_rdid,
6169 .probe_timing = TIMING_ZERO,
6170 .block_erasers =
6171 {
6172 {
6173 .eraseblocks = { {4 * 1024, 512} },
6174 .block_erase = spi_block_erase_20,
6175 }, {
6176 .eraseblocks = { {64 * 1024, 32} },
6177 .block_erase = spi_block_erase_d8,
6178 }, {
6179 .eraseblocks = { {2 * 1024 * 1024, 1} },
6180 .block_erase = spi_block_erase_60,
6181 }, {
6182 .eraseblocks = { {2 * 1024 * 1024, 1} },
6183 .block_erase = spi_block_erase_c7,
6184 },
6185 },
6186 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: Continously Program (CP) mode */
6187 .unlock = spi_disable_blockprotect,
6188 .write = spi_chip_write_256,
6189 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006190 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006191 },
6192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006193 {
6194 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006195 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006196 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006197 .manufacture_id = MACRONIX_ID,
6198 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006199 .total_size = 2048,
6200 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006201 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6202 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006203 .tested = TEST_UNTESTED,
6204 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006205 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006206 .block_erasers =
6207 {
6208 {
6209 .eraseblocks = { {4 * 1024, 512} },
6210 .block_erase = spi_block_erase_20,
6211 }, {
6212 .eraseblocks = { {64 * 1024, 32} },
6213 .block_erase = spi_block_erase_d8,
6214 }, {
6215 .eraseblocks = { {2 * 1024 * 1024, 1} },
6216 .block_erase = spi_block_erase_60,
6217 }, {
6218 .eraseblocks = { {2 * 1024 * 1024, 1} },
6219 .block_erase = spi_block_erase_c7,
6220 }
6221 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006222 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006223 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006224 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006225 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006226 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006227 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00006228
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006229 {
6230 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00006231 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006232 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006233 .manufacture_id = MACRONIX_ID,
6234 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006235 .total_size = 2048,
6236 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006237 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6238 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006239 .tested = TEST_UNTESTED,
6240 .probe = probe_spi_rdid,
6241 .probe_timing = TIMING_ZERO,
6242 .block_erasers =
6243 {
6244 {
6245 .eraseblocks = { {4 * 1024, 512} },
6246 .block_erase = spi_block_erase_20,
6247 }, {
6248 .eraseblocks = { {64 * 1024, 32} },
6249 .block_erase = spi_block_erase_d8,
6250 }, {
6251 .eraseblocks = { {2 * 1024 * 1024, 1} },
6252 .block_erase = spi_block_erase_60,
6253 }, {
6254 .eraseblocks = { {2 * 1024 * 1024, 1} },
6255 .block_erase = spi_block_erase_c7,
6256 }
6257 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006258 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Stephan Guilloux3611b802010-09-13 19:59:28 +00006259 .unlock = spi_disable_blockprotect,
6260 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006261 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00006262 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00006263 },
6264
6265 {
6266 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006267 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006268 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006269 .manufacture_id = MACRONIX_ID,
6270 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006271 .total_size = 4096,
6272 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006273 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00006274 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006275 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006276 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006277 .block_erasers =
6278 {
6279 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006280 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006281 .block_erase = spi_block_erase_20,
6282 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006283 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006284 .block_erase = spi_block_erase_d8,
6285 }, {
6286 .eraseblocks = { {4 * 1024 * 1024, 1} },
6287 .block_erase = spi_block_erase_60,
6288 }, {
6289 .eraseblocks = { {4 * 1024 * 1024, 1} },
6290 .block_erase = spi_block_erase_c7,
6291 },
6292 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006293 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006294 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006295 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006296 .read = spi_chip_read, /* Fast read (0x0B) supported */
6297 .voltage = {2700, 3600},
6298 },
6299
6300 {
6301 .vendor = "Macronix",
6302 .name = "MX25L3205D/MX25L3208D",
6303 .bustype = BUS_SPI,
6304 .manufacture_id = MACRONIX_ID,
6305 .model_id = MACRONIX_MX25L3205,
6306 .total_size = 4096,
6307 .page_size = 256,
6308 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6309 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6310 .tested = TEST_OK_PREW,
6311 .probe = probe_spi_rdid,
6312 .probe_timing = TIMING_ZERO,
6313 .block_erasers =
6314 {
6315 {
6316 .eraseblocks = { {4 * 1024, 1024} },
6317 .block_erase = spi_block_erase_20,
6318 }, {
6319 .eraseblocks = { {64 * 1024, 64} },
6320 .block_erase = spi_block_erase_d8,
6321 }, {
6322 .eraseblocks = { {4 * 1024 * 1024, 1} },
6323 .block_erase = spi_block_erase_60,
6324 }, {
6325 .eraseblocks = { {4 * 1024 * 1024, 1} },
6326 .block_erase = spi_block_erase_c7,
6327 },
6328 },
6329 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: CP mode */
6330 .unlock = spi_disable_blockprotect,
6331 .write = spi_chip_write_256,
6332 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6333 .voltage = {2700, 3600},
6334 },
6335
6336 {
6337 .vendor = "Macronix",
6338 .name = "MX25L3206E",
6339 .bustype = BUS_SPI,
6340 .manufacture_id = MACRONIX_ID,
6341 .model_id = MACRONIX_MX25L3205,
6342 .total_size = 4096,
6343 .page_size = 256,
6344 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6345 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6346 .tested = TEST_OK_PREW,
6347 .probe = probe_spi_rdid,
6348 .probe_timing = TIMING_ZERO,
6349 .block_erasers =
6350 {
6351 {
6352 .eraseblocks = { {4 * 1024, 1024} },
6353 .block_erase = spi_block_erase_20,
6354 }, {
6355 .eraseblocks = { {64 * 1024, 64} },
6356 .block_erase = spi_block_erase_d8,
6357 }, {
6358 .eraseblocks = { {64 * 1024, 64} },
6359 .block_erase = spi_block_erase_52,
6360 }, {
6361 .eraseblocks = { {4 * 1024 * 1024, 1} },
6362 .block_erase = spi_block_erase_60,
6363 }, {
6364 .eraseblocks = { {4 * 1024 * 1024, 1} },
6365 .block_erase = spi_block_erase_c7,
6366 },
6367 },
6368 .printlock = spi_prettyprint_status_register_default_bp3,
6369 .unlock = spi_disable_blockprotect,
6370 .write = spi_chip_write_256,
6371 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006372 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006373 },
6374
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006375 {
6376 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006377 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006378 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006379 .manufacture_id = MACRONIX_ID,
6380 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006381 .total_size = 4096,
6382 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006383 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
6384 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006385 .tested = TEST_UNTESTED,
6386 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006387 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006388 .block_erasers =
6389 {
6390 {
6391 .eraseblocks = { {4 * 1024, 1024} },
6392 .block_erase = spi_block_erase_20,
6393 }, {
6394 .eraseblocks = { {64 * 1024, 64} },
6395 .block_erase = spi_block_erase_d8,
6396 }, {
6397 .eraseblocks = { {4 * 1024 * 1024, 1} },
6398 .block_erase = spi_block_erase_60,
6399 }, {
6400 .eraseblocks = { {4 * 1024 * 1024, 1} },
6401 .block_erase = spi_block_erase_c7,
6402 }
6403 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006404 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006405 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006406 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006407 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006408 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006409 },
6410
6411 {
6412 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006413 .name = "MX25L6405(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006414 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006415 .manufacture_id = MACRONIX_ID,
6416 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006417 .total_size = 8192,
6418 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006419 /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
6420 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Paul Menzelac427b22012-02-16 21:07:07 +00006421 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006422 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006423 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006424 .block_erasers =
6425 {
6426 {
6427 .eraseblocks = { {64 * 1024, 128} },
6428 .block_erase = spi_block_erase_20,
6429 }, {
6430 .eraseblocks = { {64 * 1024, 128} },
6431 .block_erase = spi_block_erase_d8,
6432 }, {
6433 .eraseblocks = { {8 * 1024 * 1024, 1} },
6434 .block_erase = spi_block_erase_60,
6435 }, {
6436 .eraseblocks = { {8 * 1024 * 1024, 1} },
6437 .block_erase = spi_block_erase_c7,
6438 }
6439 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006440 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 has different meanings */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006441 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006442 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006443 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006444 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006445 },
6446
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006447 {
6448 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006449 .name = "MX25L6406E/MX25L6436E",
6450 .bustype = BUS_SPI,
6451 .manufacture_id = MACRONIX_ID,
6452 .model_id = MACRONIX_MX25L6405,
6453 .total_size = 8192,
6454 .page_size = 256,
6455 /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
6456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6457 .tested = TEST_OK_PREW,
6458 .probe = probe_spi_rdid,
6459 .probe_timing = TIMING_ZERO,
6460 .block_erasers =
6461 {
6462 {
6463 .eraseblocks = { {4 * 1024, 2048} },
6464 .block_erase = spi_block_erase_20,
6465 }, {
6466 .eraseblocks = { {64 * 1024, 128} },
6467 .block_erase = spi_block_erase_d8,
6468 }, {
6469 .eraseblocks = { {8 * 1024 * 1024, 1} },
6470 .block_erase = spi_block_erase_60,
6471 }, {
6472 .eraseblocks = { {8 * 1024 * 1024, 1} },
6473 .block_erase = spi_block_erase_c7,
6474 }
6475 },
6476 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 for 36E is quad enable */
6477 .unlock = spi_disable_blockprotect,
6478 .write = spi_chip_write_256,
6479 .read = spi_chip_read,
6480 .voltage = {2700, 3600},
6481 },
6482
6483 {
6484 .vendor = "Macronix",
6485 .name = "MX25L6445E",
6486 .bustype = BUS_SPI,
6487 .manufacture_id = MACRONIX_ID,
6488 .model_id = MACRONIX_MX25L6405,
6489 .total_size = 8192,
6490 .page_size = 256,
6491 /* supports SFDP */
6492 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6493 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6494 .tested = TEST_OK_PREW,
6495 .probe = probe_spi_rdid,
6496 .probe_timing = TIMING_ZERO,
6497 .block_erasers =
6498 {
6499 {
6500 .eraseblocks = { {4 * 1024, 2048} },
6501 .block_erase = spi_block_erase_20,
6502 }, {
6503 .eraseblocks = { {32 * 1024, 256} },
6504 .block_erase = spi_block_erase_52,
6505 }, {
6506 .eraseblocks = { {64 * 1024, 128} },
6507 .block_erase = spi_block_erase_d8,
6508 }, {
6509 .eraseblocks = { {8 * 1024 * 1024, 1} },
6510 .block_erase = spi_block_erase_60,
6511 }, {
6512 .eraseblocks = { {8 * 1024 * 1024, 1} },
6513 .block_erase = spi_block_erase_c7,
6514 }
6515 },
6516 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6517 .unlock = spi_disable_blockprotect,
6518 .write = spi_chip_write_256,
6519 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6520 .voltage = {2700, 3600},
6521 },
6522
6523 {
6524 .vendor = "Macronix",
6525 .name = "MX25L12805(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006526 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006527 .manufacture_id = MACRONIX_ID,
6528 .model_id = MACRONIX_MX25L12805,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006529 .total_size = 16384,
6530 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006531 /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
6532 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00006533 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006534 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006535 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006536 .block_erasers =
6537 {
6538 {
6539 .eraseblocks = { {4 * 1024, 4096} },
6540 .block_erase = spi_block_erase_20,
6541 }, {
6542 .eraseblocks = { {64 * 1024, 256} },
6543 .block_erase = spi_block_erase_d8,
6544 }, {
6545 .eraseblocks = { {16 * 1024 * 1024, 1} },
6546 .block_erase = spi_block_erase_60,
6547 }, {
6548 .eraseblocks = { {16 * 1024 * 1024, 1} },
6549 .block_erase = spi_block_erase_c7,
6550 }
6551 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006552 .printlock = spi_prettyprint_status_register_default_bp3,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006553 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006554 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006555 .read = spi_chip_read, /* MX25L12805D: Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006556 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006557 },
6558
6559 {
6560 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00006561 .name = "MX25U1635E",
6562 .bustype = BUS_SPI,
6563 .manufacture_id = MACRONIX_ID,
6564 .model_id = MACRONIX_MX25U1635E,
6565 .total_size = 2048,
6566 .page_size = 256,
6567 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6568 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6569 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6570 .tested = TEST_UNTESTED,
6571 .probe = probe_spi_rdid,
6572 .probe_timing = TIMING_ZERO,
6573 .block_erasers =
6574 {
6575 {
6576 .eraseblocks = { {4 * 1024, 512} },
6577 .block_erase = spi_block_erase_20,
6578 }, {
6579 .eraseblocks = { {32 * 1024, 64} },
6580 .block_erase = spi_block_erase_52,
6581 }, {
6582 .eraseblocks = { {64 * 1024, 32} },
6583 .block_erase = spi_block_erase_d8,
6584 }, {
6585 .eraseblocks = { {2 * 1024 * 1024, 1} },
6586 .block_erase = spi_block_erase_60,
6587 }, {
6588 .eraseblocks = { {2 * 1024 * 1024, 1} },
6589 .block_erase = spi_block_erase_c7,
6590 }
6591 },
6592 /* TODO: security register */
6593 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6594 .unlock = spi_disable_blockprotect,
6595 .write = spi_chip_write_256,
6596 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6597 .voltage = {1650, 2000},
6598 },
6599
6600 {
6601 .vendor = "Macronix",
6602 .name = "MX25U3235E/F",
6603 .bustype = BUS_SPI,
6604 .manufacture_id = MACRONIX_ID,
6605 .model_id = MACRONIX_MX25U3235E,
6606 .total_size = 4096,
6607 .page_size = 256,
6608 /* F model supports SFDP */
6609 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6610 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6611 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6612 .tested = TEST_OK_PREW,
6613 .probe = probe_spi_rdid,
6614 .probe_timing = TIMING_ZERO,
6615 .block_erasers =
6616 {
6617 {
6618 .eraseblocks = { {4 * 1024, 1024} },
6619 .block_erase = spi_block_erase_20,
6620 }, {
6621 .eraseblocks = { {32 * 1024, 128} },
6622 .block_erase = spi_block_erase_52,
6623 }, {
6624 .eraseblocks = { {64 * 1024, 64} },
6625 .block_erase = spi_block_erase_d8,
6626 }, {
6627 .eraseblocks = { {4 * 1024 * 1024, 1} },
6628 .block_erase = spi_block_erase_60,
6629 }, {
6630 .eraseblocks = { {4 * 1024 * 1024, 1} },
6631 .block_erase = spi_block_erase_c7,
6632 }
6633 },
6634 /* TODO: security register */
6635 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6636 .unlock = spi_disable_blockprotect,
6637 .write = spi_chip_write_256,
6638 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6639 .voltage = {1650, 2000},
6640 },
6641
6642 {
6643 .vendor = "Macronix",
6644 .name = "MX25U6435E/F",
6645 .bustype = BUS_SPI,
6646 .manufacture_id = MACRONIX_ID,
6647 .model_id = MACRONIX_MX25U6435E,
6648 .total_size = 8192,
6649 .page_size = 256,
6650 /* F model supports SFDP */
6651 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6652 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6654 .tested = TEST_UNTESTED,
6655 .probe = probe_spi_rdid,
6656 .probe_timing = TIMING_ZERO,
6657 .block_erasers =
6658 {
6659 {
6660 .eraseblocks = { {4 * 1024, 2048} },
6661 .block_erase = spi_block_erase_20,
6662 }, {
6663 .eraseblocks = { {32 * 1024, 256} },
6664 .block_erase = spi_block_erase_52,
6665 }, {
6666 .eraseblocks = { {64 * 1024, 128} },
6667 .block_erase = spi_block_erase_d8,
6668 }, {
6669 .eraseblocks = { {8 * 1024 * 1024, 1} },
6670 .block_erase = spi_block_erase_60,
6671 }, {
6672 .eraseblocks = { {8 * 1024 * 1024, 1} },
6673 .block_erase = spi_block_erase_c7,
6674 }
6675 },
6676 /* TODO: security register */
6677 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6678 .unlock = spi_disable_blockprotect,
6679 .write = spi_chip_write_256,
6680 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6681 .voltage = {1650, 2000},
6682 },
6683
6684 {
6685 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00006686 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006687 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006688 .manufacture_id = MACRONIX_ID,
6689 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006690 .total_size = 128,
6691 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006692 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6693 .tested = TEST_UNTESTED,
6694 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006695 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006696 .block_erasers =
6697 {
6698 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006699 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006700 {8 * 1024, 1},
6701 {4 * 1024, 2},
6702 {8 * 1024, 2},
6703 {32 * 1024, 1},
6704 {64 * 1024, 1},
6705 },
Sean Nelson35727f72010-01-28 23:55:12 +00006706 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006707 }, {
6708 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006709 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006710 }
6711 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006712 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006713 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006714 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006715 },
6716
6717 {
6718 .vendor = "Macronix",
6719 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006720 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006721 .manufacture_id = MACRONIX_ID,
6722 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006723 .total_size = 128,
6724 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006725 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00006726 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006727 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006728 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006729 .block_erasers =
6730 {
6731 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006732 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006733 {64 * 1024, 1},
6734 {32 * 1024, 1},
6735 {8 * 1024, 2},
6736 {4 * 1024, 2},
6737 {8 * 1024, 1},
6738 },
Sean Nelson35727f72010-01-28 23:55:12 +00006739 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006740 }, {
6741 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006742 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006743 }
6744 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006745 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006746 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006747 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006748 },
6749
6750 {
6751 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006752 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006753 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006754 .manufacture_id = MACRONIX_ID,
6755 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006756 .total_size = 256,
6757 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006758 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006759 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006760 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006761 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006762 .block_erasers =
6763 {
6764 {
6765 .eraseblocks = {
6766 {16 * 1024, 1},
6767 {8 * 1024, 2},
6768 {32 * 1024, 1},
6769 {64 * 1024, 3},
6770 },
Sean Nelson35727f72010-01-28 23:55:12 +00006771 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006772 }, {
6773 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006774 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006775 },
6776 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006777 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006778 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006779 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006780 },
6781
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006782 {
6783 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006784 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006785 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006786 .manufacture_id = MACRONIX_ID,
6787 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006788 .total_size = 256,
6789 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006790 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00006791 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006792 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006793 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006794 .block_erasers =
6795 {
6796 {
6797 .eraseblocks = {
6798 {64 * 1024, 3},
6799 {32 * 1024, 1},
6800 {8 * 1024, 2},
6801 {16 * 1024, 1},
6802 },
Sean Nelson35727f72010-01-28 23:55:12 +00006803 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006804 }, {
6805 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006806 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006807 },
6808 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006809 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006810 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006811 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006812 },
6813
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006814 {
6815 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00006816 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006817 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006818 .manufacture_id = MACRONIX_ID,
6819 .model_id = MACRONIX_MX29F040,
6820 .total_size = 512,
6821 .page_size = 64 * 1024,
6822 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6823 .tested = TEST_UNTESTED,
6824 .probe = probe_jedec,
6825 .probe_timing = TIMING_ZERO,
6826 .block_erasers =
6827 {
6828 {
6829 .eraseblocks = { {64 * 1024, 8} },
6830 .block_erase = erase_sector_jedec,
6831 }, {
6832 .eraseblocks = { {512 * 1024, 1} },
6833 .block_erase = erase_chip_block_jedec,
6834 },
6835 },
6836 .write = write_jedec_1,
6837 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006838 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006839 },
6840
6841 {
6842 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00006843 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006844 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006845 .manufacture_id = MACRONIX_ID,
6846 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006847 .total_size = 512,
6848 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006849 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6850 .tested = TEST_UNTESTED,
6851 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006852 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006853 .block_erasers =
6854 {
6855 {
6856 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00006857 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006858 }, {
6859 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006860 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006861 },
6862 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006863 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006864 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006865 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00006866 },
6867
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006868 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00006869 .vendor = "Micron/Numonyx/ST",
6870 .name = "M25P05-A",
6871 .bustype = BUS_SPI,
6872 .manufacture_id = ST_ID,
6873 .model_id = ST_M25P05A,
6874 .total_size = 64,
6875 .page_size = 256,
6876 .feature_bits = FEATURE_WRSR_WREN,
6877 .tested = TEST_OK_PREW,
6878 .probe = probe_spi_rdid,
6879 .probe_timing = TIMING_ZERO,
6880 .block_erasers =
6881 {
6882 {
6883 .eraseblocks = { {32 * 1024, 2} },
6884 .block_erase = spi_block_erase_d8,
6885 }, {
6886 .eraseblocks = { {64 * 1024, 1} },
6887 .block_erase = spi_block_erase_c7,
6888 }
6889 },
6890 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6891 .unlock = spi_disable_blockprotect,
6892 .write = spi_chip_write_256,
6893 .read = spi_chip_read,
6894 .voltage = {2700, 3600},
6895 },
6896
6897 /* The ST M25P05 is a bit of a problem. It has the same ID as the
6898 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
6899 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
6900 * only is successful if RDID does not work.
6901 */
6902 {
6903 .vendor = "Micron/Numonyx/ST",
6904 .name = "M25P05",
6905 .bustype = BUS_SPI,
6906 .manufacture_id = 0, /* Not used. */
6907 .model_id = ST_M25P05_RES,
6908 .total_size = 64,
6909 .page_size = 256,
6910 .feature_bits = FEATURE_WRSR_WREN,
6911 .tested = TEST_UNTESTED,
6912 .probe = probe_spi_res1,
6913 .probe_timing = TIMING_ZERO,
6914 .block_erasers =
6915 {
6916 {
6917 .eraseblocks = { {32 * 1024, 2} },
6918 .block_erase = spi_block_erase_d8,
6919 }, {
6920 .eraseblocks = { {64 * 1024, 1} },
6921 .block_erase = spi_block_erase_c7,
6922 }
6923 },
6924 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6925 .unlock = spi_disable_blockprotect,
6926 .write = spi_chip_write_1, /* 128 */
6927 .read = spi_chip_read,
6928 .voltage = {2700, 3600},
6929 },
6930
6931 {
6932 .vendor = "Micron/Numonyx/ST",
6933 .name = "M25P10-A",
6934 .bustype = BUS_SPI,
6935 .manufacture_id = ST_ID,
6936 .model_id = ST_M25P10A,
6937 .total_size = 128,
6938 .page_size = 256,
6939 .feature_bits = FEATURE_WRSR_WREN,
6940 .tested = TEST_OK_PRE,
6941 .probe = probe_spi_rdid,
6942 .probe_timing = TIMING_ZERO,
6943 .block_erasers =
6944 {
6945 {
6946 .eraseblocks = { {32 * 1024, 4} },
6947 .block_erase = spi_block_erase_d8,
6948 }, {
6949 .eraseblocks = { {128 * 1024, 1} },
6950 .block_erase = spi_block_erase_c7,
6951 }
6952 },
6953 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6954 .unlock = spi_disable_blockprotect,
6955 .write = spi_chip_write_256,
6956 .read = spi_chip_read,
6957 .voltage = {2700, 3600},
6958 },
6959
6960 /* The ST M25P10 has the same problem as the M25P05. */
6961 {
6962 .vendor = "Micron/Numonyx/ST",
6963 .name = "M25P10",
6964 .bustype = BUS_SPI,
6965 .manufacture_id = 0, /* Not used. */
6966 .model_id = ST_M25P10_RES,
6967 .total_size = 128,
6968 .page_size = 256,
6969 .feature_bits = FEATURE_WRSR_WREN,
6970 .tested = TEST_UNTESTED,
6971 .probe = probe_spi_res1,
6972 .probe_timing = TIMING_ZERO,
6973 .block_erasers =
6974 {
6975 {
6976 .eraseblocks = { {32 * 1024, 4} },
6977 .block_erase = spi_block_erase_d8,
6978 }, {
6979 .eraseblocks = { {128 * 1024, 1} },
6980 .block_erase = spi_block_erase_c7,
6981 }
6982 },
6983 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6984 .unlock = spi_disable_blockprotect,
6985 .write = spi_chip_write_1, /* 128 */
6986 .read = spi_chip_read,
6987 .voltage = {2700, 3600},
6988 },
6989
6990 {
6991 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6992 .name = "M25P20",
6993 .bustype = BUS_SPI,
6994 .manufacture_id = ST_ID,
6995 .model_id = ST_M25P20,
6996 .total_size = 256,
6997 .page_size = 256,
6998 .feature_bits = FEATURE_WRSR_WREN,
6999 .tested = TEST_UNTESTED,
7000 .probe = probe_spi_rdid,
7001 .probe_timing = TIMING_ZERO,
7002 .block_erasers =
7003 {
7004 {
7005 .eraseblocks = { {64 * 1024, 4} },
7006 .block_erase = spi_block_erase_d8,
7007 }, {
7008 .eraseblocks = { {256 * 1024, 1} },
7009 .block_erase = spi_block_erase_c7,
7010 }
7011 },
7012 .printlock = spi_prettyprint_status_register_default_bp1,
7013 .unlock = spi_disable_blockprotect,
7014 .write = spi_chip_write_256,
7015 .read = spi_chip_read, /* Fast read (0x0B) supported */
7016 .voltage = {2700, 3600},
7017 },
7018
7019 {
7020 .vendor = "Micron/Numonyx/ST",
7021 .name = "M25P20-old",
7022 .bustype = BUS_SPI,
7023 .manufacture_id = 0, /* Not used. */
7024 .model_id = ST_M25P20_RES,
7025 .total_size = 256,
7026 .page_size = 256,
7027 .feature_bits = FEATURE_WRSR_WREN,
7028 .tested = TEST_OK_PREW,
7029 .probe = probe_spi_res1,
7030 .probe_timing = TIMING_ZERO,
7031 .block_erasers =
7032 {
7033 {
7034 .eraseblocks = { {64 * 1024, 4} },
7035 .block_erase = spi_block_erase_d8,
7036 }, {
7037 .eraseblocks = { {256 * 1024, 1} },
7038 .block_erase = spi_block_erase_c7,
7039 }
7040 },
7041 .printlock = spi_prettyprint_status_register_default_bp1,
7042 .unlock = spi_disable_blockprotect,
7043 .write = spi_chip_write_256,
7044 .read = spi_chip_read, /* Fast read (0x0B) supported */
7045 .voltage = {2700, 3600},
7046 },
7047
7048 {
7049 .vendor = "Micron/Numonyx/ST", /* Numonyx */
7050 .name = "M25P40",
7051 .bustype = BUS_SPI,
7052 .manufacture_id = ST_ID,
7053 .model_id = ST_M25P40,
7054 .total_size = 512,
7055 .page_size = 256,
7056 .feature_bits = FEATURE_WRSR_WREN,
7057 .tested = TEST_OK_PREW,
7058 .probe = probe_spi_rdid,
7059 .probe_timing = TIMING_ZERO,
7060 .block_erasers =
7061 {
7062 {
7063 .eraseblocks = { {64 * 1024, 8} },
7064 .block_erase = spi_block_erase_d8,
7065 }, {
7066 .eraseblocks = { {512 * 1024, 1} },
7067 .block_erase = spi_block_erase_c7,
7068 }
7069 },
7070 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7071 .unlock = spi_disable_blockprotect,
7072 .write = spi_chip_write_256,
7073 .read = spi_chip_read,
7074 .voltage = {2700, 3600},
7075 },
7076
7077 {
7078 .vendor = "Micron/Numonyx/ST",
7079 .name = "M25P40-old",
7080 .bustype = BUS_SPI,
7081 .manufacture_id = 0, /* Not used. */
7082 .model_id = ST_M25P40_RES,
7083 .total_size = 512,
7084 .page_size = 256,
7085 .feature_bits = FEATURE_WRSR_WREN,
7086 .tested = TEST_UNTESTED,
7087 .probe = probe_spi_res1,
7088 .probe_timing = TIMING_ZERO,
7089 .block_erasers =
7090 {
7091 {
7092 .eraseblocks = { {64 * 1024, 8} },
7093 .block_erase = spi_block_erase_d8,
7094 }, {
7095 .eraseblocks = { {512 * 1024, 1} },
7096 .block_erase = spi_block_erase_c7,
7097 }
7098 },
7099 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7100 .unlock = spi_disable_blockprotect,
7101 .write = spi_chip_write_256,
7102 .read = spi_chip_read,
7103 },
7104
7105 {
7106 .vendor = "Micron/Numonyx/ST",
7107 .name = "M25P80",
7108 .bustype = BUS_SPI,
7109 .manufacture_id = ST_ID,
7110 .model_id = ST_M25P80,
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 = { {64 * 1024, 16} },
7121 .block_erase = spi_block_erase_d8,
7122 }, {
7123 .eraseblocks = { {1024 * 1024, 1} },
7124 .block_erase = spi_block_erase_c7,
7125 }
7126 },
7127 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7128 .unlock = spi_disable_blockprotect,
7129 .write = spi_chip_write_256,
7130 .read = spi_chip_read,
7131 .voltage = {2700, 3600},
7132 },
7133
7134 {
7135 .vendor = "Micron/Numonyx/ST",
7136 .name = "M25P16",
7137 .bustype = BUS_SPI,
7138 .manufacture_id = ST_ID,
7139 .model_id = ST_M25P16,
7140 .total_size = 2048,
7141 .page_size = 256,
7142 .feature_bits = FEATURE_WRSR_WREN,
7143 .tested = TEST_OK_PR,
7144 .probe = probe_spi_rdid,
7145 .probe_timing = TIMING_ZERO,
7146 .block_erasers =
7147 {
7148 {
7149 .eraseblocks = { {64 * 1024, 32} },
7150 .block_erase = spi_block_erase_d8,
7151 }, {
7152 .eraseblocks = { {2 * 1024 * 1024, 1} },
7153 .block_erase = spi_block_erase_c7,
7154 }
7155 },
7156 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7157 .unlock = spi_disable_blockprotect,
7158 .write = spi_chip_write_256,
7159 .read = spi_chip_read,
7160 .voltage = {2700, 3600},
7161 },
7162
7163 {
7164 .vendor = "Micron/Numonyx/ST",
7165 .name = "M25P32",
7166 .bustype = BUS_SPI,
7167 .manufacture_id = ST_ID,
7168 .model_id = ST_M25P32,
7169 .total_size = 4096,
7170 .page_size = 256,
7171 .feature_bits = FEATURE_WRSR_WREN,
7172 .tested = TEST_OK_PREW,
7173 .probe = probe_spi_rdid,
7174 .probe_timing = TIMING_ZERO,
7175 .block_erasers =
7176 {
7177 {
7178 .eraseblocks = { {64 * 1024, 64} },
7179 .block_erase = spi_block_erase_d8,
7180 }, {
7181 .eraseblocks = { {4 * 1024 * 1024, 1} },
7182 .block_erase = spi_block_erase_c7,
7183 }
7184 },
7185 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7186 .unlock = spi_disable_blockprotect,
7187 .write = spi_chip_write_256,
7188 .read = spi_chip_read,
7189 .voltage = {2700, 3600},
7190 },
7191
7192 {
7193 .vendor = "Micron/Numonyx/ST",
7194 .name = "M25P64",
7195 .bustype = BUS_SPI,
7196 .manufacture_id = ST_ID,
7197 .model_id = ST_M25P64,
7198 .total_size = 8192,
7199 .page_size = 256,
7200 .feature_bits = FEATURE_WRSR_WREN,
7201 .tested = TEST_OK_PREW,
7202 .probe = probe_spi_rdid,
7203 .probe_timing = TIMING_ZERO,
7204 .block_erasers =
7205 {
7206 {
7207 .eraseblocks = { {64 * 1024, 128} },
7208 .block_erase = spi_block_erase_d8,
7209 }, {
7210 .eraseblocks = { {8 * 1024 * 1024, 1} },
7211 .block_erase = spi_block_erase_c7,
7212 }
7213 },
7214 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7215 .unlock = spi_disable_blockprotect,
7216 .write = spi_chip_write_256,
7217 .read = spi_chip_read,
7218 .voltage = {2700, 3600},
7219 },
7220
7221 {
7222 .vendor = "Micron/Numonyx/ST",
7223 .name = "M25P128",
7224 .bustype = BUS_SPI,
7225 .manufacture_id = ST_ID,
7226 .model_id = ST_M25P128,
7227 .total_size = 16384,
7228 .page_size = 256,
7229 .feature_bits = FEATURE_WRSR_WREN,
7230 .tested = TEST_OK_PREW,
7231 .probe = probe_spi_rdid,
7232 .probe_timing = TIMING_ZERO,
7233 .block_erasers =
7234 {
7235 {
7236 .eraseblocks = { {256 * 1024, 64} },
7237 .block_erase = spi_block_erase_d8,
7238 }, {
7239 .eraseblocks = { {16 * 1024 * 1024, 1} },
7240 .block_erase = spi_block_erase_c7,
7241 }
7242 },
7243 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
7244 .unlock = spi_disable_blockprotect,
7245 .write = spi_chip_write_256,
7246 .read = spi_chip_read,
7247 .voltage = {2700, 3600},
7248 },
7249
7250 {
7251 .vendor = "Micron/Numonyx/ST",
7252 .name = "M25PE10",
7253 .bustype = BUS_SPI,
7254 .manufacture_id = ST_ID,
7255 .model_id = ST_M25PE10,
7256 .total_size = 128,
7257 .page_size = 256,
7258 .feature_bits = FEATURE_WRSR_WREN,
7259 .tested = TEST_UNTESTED,
7260 .probe = probe_spi_rdid,
7261 .probe_timing = TIMING_ZERO,
7262 .block_erasers =
7263 {
7264 {
7265 .eraseblocks = { {4 * 1024, 32} },
7266 .block_erase = spi_block_erase_20,
7267 }, {
7268 .eraseblocks = { {64 * 1024, 2} },
7269 .block_erase = spi_block_erase_d8,
7270 }, {
7271 .eraseblocks = { {128 * 1024, 1} },
7272 .block_erase = spi_block_erase_c7,
7273 }
7274 },
7275 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7276 .unlock = spi_disable_blockprotect,
7277 .write = spi_chip_write_256,
7278 .read = spi_chip_read,
7279 .voltage = {2700, 3600},
7280 },
7281
7282 {
7283 .vendor = "Micron/Numonyx/ST",
7284 .name = "M25PE20",
7285 .bustype = BUS_SPI,
7286 .manufacture_id = ST_ID,
7287 .model_id = ST_M25PE20,
7288 .total_size = 256,
7289 .page_size = 256,
7290 .feature_bits = FEATURE_WRSR_WREN,
7291 .tested = TEST_UNTESTED,
7292 .probe = probe_spi_rdid,
7293 .probe_timing = TIMING_ZERO,
7294 .block_erasers =
7295 {
7296 {
7297 .eraseblocks = { {4 * 1024, 64} },
7298 .block_erase = spi_block_erase_20,
7299 }, {
7300 .eraseblocks = { {64 * 1024, 4} },
7301 .block_erase = spi_block_erase_d8,
7302 }, {
7303 .eraseblocks = { {256 * 1024, 1} },
7304 .block_erase = spi_block_erase_c7,
7305 }
7306 },
7307 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7308 .unlock = spi_disable_blockprotect,
7309 .write = spi_chip_write_256,
7310 .read = spi_chip_read,
7311 .voltage = {2700, 3600},
7312 },
7313
7314 {
7315 .vendor = "Micron/Numonyx/ST",
7316 .name = "M25PE40",
7317 .bustype = BUS_SPI,
7318 .manufacture_id = ST_ID,
7319 .model_id = ST_M25PE40,
7320 .total_size = 512,
7321 .page_size = 256,
7322 .feature_bits = FEATURE_WRSR_WREN,
7323 .tested = TEST_UNTESTED,
7324 .probe = probe_spi_rdid,
7325 .probe_timing = TIMING_ZERO,
7326 .block_erasers =
7327 {
7328 {
7329 .eraseblocks = { {4 * 1024, 128} },
7330 .block_erase = spi_block_erase_20,
7331 }, {
7332 .eraseblocks = { {64 * 1024, 8} },
7333 .block_erase = spi_block_erase_d8,
7334 }, {
7335 .eraseblocks = { {512 * 1024, 1} },
7336 .block_erase = spi_block_erase_c7,
7337 }
7338 },
7339 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7340 .unlock = spi_disable_blockprotect,
7341 .write = spi_chip_write_256,
7342 .read = spi_chip_read,
7343 .voltage = {2700, 3600},
7344 },
7345
7346 {
7347 .vendor = "Micron/Numonyx/ST",
7348 .name = "M25PE80",
7349 .bustype = BUS_SPI,
7350 .manufacture_id = ST_ID,
7351 .model_id = ST_M25PE80,
7352 .total_size = 1024,
7353 .page_size = 256,
7354 .feature_bits = FEATURE_WRSR_WREN,
7355 .tested = TEST_OK_PREW,
7356 .probe = probe_spi_rdid,
7357 .probe_timing = TIMING_ZERO,
7358 .block_erasers =
7359 {
7360 {
7361 .eraseblocks = { {4 * 1024, 256} },
7362 .block_erase = spi_block_erase_20,
7363 }, {
7364 .eraseblocks = { {64 * 1024, 16} },
7365 .block_erase = spi_block_erase_d8,
7366 }, {
7367 .eraseblocks = { {1024 * 1024, 1} },
7368 .block_erase = spi_block_erase_c7,
7369 }
7370 },
7371 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7372 .unlock = spi_disable_blockprotect,
7373 .write = spi_chip_write_256,
7374 .read = spi_chip_read,
7375 .voltage = {2700, 3600},
7376 },
7377
7378 {
7379 .vendor = "Micron/Numonyx/ST",
7380 .name = "M25PE16",
7381 .bustype = BUS_SPI,
7382 .manufacture_id = ST_ID,
7383 .model_id = ST_M25PE16,
7384 .total_size = 2048,
7385 .page_size = 256,
7386 .feature_bits = FEATURE_WRSR_WREN,
7387 .tested = TEST_UNTESTED,
7388 .probe = probe_spi_rdid,
7389 .probe_timing = TIMING_ZERO,
7390 .block_erasers =
7391 {
7392 {
7393 .eraseblocks = { {4 * 1024, 512} },
7394 .block_erase = spi_block_erase_20,
7395 }, {
7396 .eraseblocks = { {64 * 1024, 32} },
7397 .block_erase = spi_block_erase_d8,
7398 }, {
7399 .eraseblocks = { {2 * 1024 * 1024, 1} },
7400 .block_erase = spi_block_erase_c7,
7401 }
7402 },
7403 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7404 .unlock = spi_disable_blockprotect,
7405 .write = spi_chip_write_256,
7406 .read = spi_chip_read,
7407 .voltage = {2700, 3600},
7408 },
7409
7410 {
7411 .vendor = "Micron/Numonyx/ST",
7412 .name = "M25PX80",
7413 .bustype = BUS_SPI,
7414 .manufacture_id = ST_ID,
7415 .model_id = ST_M25PX80,
7416 .total_size = 1024,
7417 .page_size = 256,
7418 /* OTP: 64B total; read 0x4B, write 0x42 */
7419 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7420 .tested = TEST_OK_PREW,
7421 .probe = probe_spi_rdid,
7422 .probe_timing = TIMING_ZERO,
7423 .block_erasers = {
7424 {
7425 .eraseblocks = { { 4 * 1024, 256 } },
7426 .block_erase = spi_block_erase_20,
7427 }, {
7428 .eraseblocks = { {64 * 1024, 16} },
7429 .block_erase = spi_block_erase_d8,
7430 }, {
7431 .eraseblocks = { {1024 * 1024, 1} },
7432 .block_erase = spi_block_erase_c7,
7433 }
7434 },
7435 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7436 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7437 .write = spi_chip_write_256,
7438 .read = spi_chip_read,
7439 .voltage = {2700, 3600},
7440 },
7441
7442 {
7443 .vendor = "Micron/Numonyx/ST",
7444 .name = "M25PX16",
7445 .bustype = BUS_SPI,
7446 .manufacture_id = ST_ID,
7447 .model_id = ST_M25PX16,
7448 .total_size = 2048,
7449 .page_size = 256,
7450 /* OTP: 64B total; read 0x4B; write 0x42 */
7451 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7452 .tested = TEST_OK_PREW,
7453 .probe = probe_spi_rdid,
7454 .probe_timing = TIMING_ZERO,
7455 .block_erasers =
7456 {
7457 {
7458 .eraseblocks = { { 4 * 1024, 512 } },
7459 .block_erase = spi_block_erase_20,
7460 }, {
7461 .eraseblocks = { {64 * 1024, 32} },
7462 .block_erase = spi_block_erase_d8,
7463 }, {
7464 .eraseblocks = { {2 * 1024 * 1024, 1} },
7465 .block_erase = spi_block_erase_c7,
7466 }
7467 },
7468 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7469 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7470 .write = spi_chip_write_256,
7471 .read = spi_chip_read,
7472 },
7473
7474 {
7475 .vendor = "Micron/Numonyx/ST",
7476 .name = "M25PX32",
7477 .bustype = BUS_SPI,
7478 .manufacture_id = ST_ID,
7479 .model_id = ST_M25PX32,
7480 .total_size = 4096,
7481 .page_size = 256,
7482 /* OTP: 64B total; read 0x4B; write 0x42 */
7483 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7484 .tested = TEST_OK_PRE,
7485 .probe = probe_spi_rdid,
7486 .probe_timing = TIMING_ZERO,
7487 .block_erasers =
7488 {
7489 {
7490 .eraseblocks = { { 4 * 1024, 1024 } },
7491 .block_erase = spi_block_erase_20,
7492 }, {
7493 .eraseblocks = { {64 * 1024, 64} },
7494 .block_erase = spi_block_erase_d8,
7495 }, {
7496 .eraseblocks = { {4 * 1024 * 1024, 1} },
7497 .block_erase = spi_block_erase_c7,
7498 }
7499 },
7500 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7501 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7502 .write = spi_chip_write_256,
7503 .read = spi_chip_read,
7504 .voltage = {2700, 3600},
7505 },
7506
7507 {
7508 .vendor = "Micron/Numonyx/ST",
7509 .name = "M25PX64",
7510 .bustype = BUS_SPI,
7511 .manufacture_id = ST_ID,
7512 .model_id = ST_M25PX64,
7513 .total_size = 8192,
7514 .page_size = 256,
7515 /* OTP: 64B total; read 0x4B; write 0x42 */
7516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7517 .tested = TEST_OK_PRE,
7518 .probe = probe_spi_rdid,
7519 .probe_timing = TIMING_ZERO,
7520 .block_erasers =
7521 {
7522 {
7523 .eraseblocks = { { 4 * 1024, 2048 } },
7524 .block_erase = spi_block_erase_20,
7525 }, {
7526 .eraseblocks = { {64 * 1024, 128} },
7527 .block_erase = spi_block_erase_d8,
7528 }, {
7529 .eraseblocks = { {8 * 1024 * 1024, 1} },
7530 .block_erase = spi_block_erase_c7,
7531 }
7532 },
7533 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7534 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7535 .write = spi_chip_write_256,
7536 .read = spi_chip_read,
7537 },
7538
7539 {
7540 .vendor = "Micron/Numonyx/ST",
7541 .name = "M45PE10",
7542 .bustype = BUS_SPI,
7543 .manufacture_id = ST_ID,
7544 .model_id = ST_M45PE10,
7545 .total_size = 128,
7546 .page_size = 256,
7547 .tested = TEST_UNTESTED,
7548 .probe = probe_spi_rdid,
7549 .probe_timing = TIMING_ZERO,
7550 .block_erasers = {
7551 {
7552 .eraseblocks = { {256, 512} },
7553 .block_erase = spi_block_erase_db,
7554 }, {
7555 .eraseblocks = { {64 * 1024, 2} },
7556 .block_erase = spi_block_erase_d8,
7557 }
7558 },
7559 .printlock = spi_prettyprint_status_register_default_welwip,
7560 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7561 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7562 .read = spi_chip_read, /* Fast read (0x0B) supported */
7563 .voltage = {2700, 3600},
7564 },
7565
7566 {
7567 .vendor = "Micron/Numonyx/ST",
7568 .name = "M45PE20",
7569 .bustype = BUS_SPI,
7570 .manufacture_id = ST_ID,
7571 .model_id = ST_M45PE20,
7572 .total_size = 256,
7573 .page_size = 256,
7574 .tested = TEST_UNTESTED,
7575 .probe = probe_spi_rdid,
7576 .probe_timing = TIMING_ZERO,
7577 .block_erasers = {
7578 {
7579 .eraseblocks = { {256, 1024} },
7580 .block_erase = spi_block_erase_db,
7581 }, {
7582 .eraseblocks = { {64 * 1024, 4} },
7583 .block_erase = spi_block_erase_d8,
7584 }
7585 },
7586 .printlock = spi_prettyprint_status_register_default_welwip,
7587 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7588 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7589 .read = spi_chip_read, /* Fast read (0x0B) supported */
7590 .voltage = {2700, 3600},
7591 },
7592
7593 {
7594 .vendor = "Micron/Numonyx/ST",
7595 .name = "M45PE40",
7596 .bustype = BUS_SPI,
7597 .manufacture_id = ST_ID,
7598 .model_id = ST_M45PE40,
7599 .total_size = 512,
7600 .page_size = 256,
7601 .tested = TEST_UNTESTED,
7602 .probe = probe_spi_rdid,
7603 .probe_timing = TIMING_ZERO,
7604 .block_erasers = {
7605 {
7606 .eraseblocks = { {256, 2048} },
7607 .block_erase = spi_block_erase_db,
7608 }, {
7609 .eraseblocks = { {64 * 1024, 8} },
7610 .block_erase = spi_block_erase_d8,
7611 }
7612 },
7613 .printlock = spi_prettyprint_status_register_default_welwip,
7614 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7615 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7616 .read = spi_chip_read, /* Fast read (0x0B) supported */
7617 .voltage = {2700, 3600},
7618 },
7619
7620 {
7621 .vendor = "Micron/Numonyx/ST",
7622 .name = "M45PE80",
7623 .bustype = BUS_SPI,
7624 .manufacture_id = ST_ID,
7625 .model_id = ST_M45PE80,
7626 .total_size = 1024,
7627 .page_size = 256,
7628 .tested = TEST_UNTESTED,
7629 .probe = probe_spi_rdid,
7630 .probe_timing = TIMING_ZERO,
7631 .block_erasers = {
7632 {
7633 .eraseblocks = { {256, 4096} },
7634 .block_erase = spi_block_erase_db,
7635 }, {
7636 .eraseblocks = { {64 * 1024, 16} },
7637 .block_erase = spi_block_erase_d8,
7638 }
7639 },
7640 .printlock = spi_prettyprint_status_register_default_welwip,
7641 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7642 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7643 .read = spi_chip_read, /* Fast read (0x0B) supported */
7644 .voltage = {2700, 3600},
7645 },
7646
7647 {
7648 .vendor = "Micron/Numonyx/ST",
7649 .name = "M45PE16",
7650 .bustype = BUS_SPI,
7651 .manufacture_id = ST_ID,
7652 .model_id = ST_M45PE16,
7653 .total_size = 2048,
7654 .page_size = 256,
7655 .tested = TEST_UNTESTED,
7656 .probe = probe_spi_rdid,
7657 .probe_timing = TIMING_ZERO,
7658 .block_erasers = {
7659 {
7660 .eraseblocks = { {256, 8192} },
7661 .block_erase = spi_block_erase_db,
7662 }, {
7663 .eraseblocks = { {64 * 1024, 32} },
7664 .block_erase = spi_block_erase_d8,
7665 }
7666 },
7667 .printlock = spi_prettyprint_status_register_default_welwip,
7668 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7669 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7670 .read = spi_chip_read, /* Fast read (0x0B) supported */
7671 .voltage = {2700, 3600},
7672 },
7673
7674 {
7675 .vendor = "Micron/Numonyx/ST",
7676 .name = "N25Q016",
7677 .bustype = BUS_SPI,
7678 .manufacture_id = ST_ID,
7679 .model_id = ST_N25Q016__1E,
7680 .total_size = 2048,
7681 .page_size = 256,
7682 /* supports SFDP */
7683 /* OTP: 64B total; read 0x4B, write 0x42 */
7684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7685 .tested = TEST_UNTESTED,
7686 .probe = probe_spi_rdid,
7687 .probe_timing = TIMING_ZERO,
7688 .block_erasers =
7689 {
7690 {
7691 .eraseblocks = { {4 * 1024, 512} },
7692 .block_erase = spi_block_erase_20,
7693 }, {
7694 .eraseblocks = { {32 * 1024, 64} },
7695 .block_erase = spi_block_erase_52,
7696 }, {
7697 .eraseblocks = { {64 * 1024, 32} },
7698 .block_erase = spi_block_erase_d8,
7699 }, {
7700 .eraseblocks = { {2 * 1024 * 1024, 1} },
7701 .block_erase = spi_block_erase_c7,
7702 }
7703 },
7704 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7705 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7706 .write = spi_chip_write_256, /* Multi I/O supported */
7707 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7708 .voltage = {1700, 2000},
7709 },
7710
7711 {
7712 .vendor = "Micron/Numonyx/ST",
7713 .name = "N25Q032..1E",
7714 .bustype = BUS_SPI,
7715 .manufacture_id = ST_ID,
7716 .model_id = ST_N25Q032__1E,
7717 .total_size = 4096,
7718 .page_size = 256,
7719 /* supports SFDP */
7720 /* OTP: 64B total; read 0x4B, write 0x42 */
7721 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7722 .tested = TEST_UNTESTED,
7723 .probe = probe_spi_rdid,
7724 .probe_timing = TIMING_ZERO,
7725 .block_erasers =
7726 {
7727 {
7728 .eraseblocks = { {4 * 1024, 1024} },
7729 .block_erase = spi_block_erase_20,
7730 }, {
7731 .eraseblocks = { {64 * 1024, 64} },
7732 .block_erase = spi_block_erase_d8,
7733 }, {
7734 .eraseblocks = { {4 * 1024 * 1024, 1} },
7735 .block_erase = spi_block_erase_c7,
7736 }
7737 },
7738 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7739 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7740 .write = spi_chip_write_256, /* Multi I/O supported */
7741 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7742 .voltage = {1700, 2000},
7743 },
7744
7745 {
7746 .vendor = "Micron/Numonyx/ST",
7747 .name = "N25Q032..3E",
7748 .bustype = BUS_SPI,
7749 .manufacture_id = ST_ID,
7750 .model_id = ST_N25Q032__3E,
7751 .total_size = 4096,
7752 .page_size = 256,
7753 /* supports SFDP */
7754 /* OTP: 64B total; read 0x4B, write 0x42 */
7755 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7756 .tested = TEST_OK_PREW,
7757 .probe = probe_spi_rdid,
7758 .probe_timing = TIMING_ZERO,
7759 .block_erasers =
7760 {
7761 {
7762 .eraseblocks = { {4 * 1024, 1024} },
7763 .block_erase = spi_block_erase_20,
7764 }, {
7765 .eraseblocks = { {64 * 1024, 64} },
7766 .block_erase = spi_block_erase_d8,
7767 }, {
7768 .eraseblocks = { {4 * 1024 * 1024, 1} },
7769 .block_erase = spi_block_erase_c7,
7770 }
7771 },
7772 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7773 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7774 .write = spi_chip_write_256, /* Multi I/O supported */
7775 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7776 .voltage = {2700, 3600},
7777 },
7778
7779 {
7780 .vendor = "Micron/Numonyx/ST",
7781 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7782 .bustype = BUS_SPI,
7783 .manufacture_id = ST_ID,
7784 .model_id = ST_N25Q064__1E,
7785 .total_size = 8192,
7786 .page_size = 256,
7787 /* supports SFDP */
7788 /* OTP: 64B total; read 0x4B, write 0x42 */
7789 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7790 .tested = TEST_UNTESTED,
7791 .probe = probe_spi_rdid,
7792 .probe_timing = TIMING_ZERO,
7793 .block_erasers =
7794 {
7795 {
7796 .eraseblocks = { {4 * 1024, 2048 } },
7797 .block_erase = spi_block_erase_20,
7798 }, {
7799 .eraseblocks = { {64 * 1024, 128} },
7800 .block_erase = spi_block_erase_d8,
7801 }, {
7802 .eraseblocks = { {8 * 1024 * 1024, 1} },
7803 .block_erase = spi_block_erase_c7,
7804 }
7805 },
7806 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7807 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7808 .write = spi_chip_write_256, /* Multi I/O supported */
7809 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7810 .voltage = {1700, 2000},
7811 },
7812
7813 {
7814 .vendor = "Micron/Numonyx/ST",
7815 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7816 .bustype = BUS_SPI,
7817 .manufacture_id = ST_ID,
7818 .model_id = ST_N25Q064__3E,
7819 .total_size = 8192,
7820 .page_size = 256,
7821 /* supports SFDP */
7822 /* OTP: 64B total; read 0x4B, write 0x42 */
7823 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7824 .tested = TEST_OK_PREW,
7825 .probe = probe_spi_rdid,
7826 .probe_timing = TIMING_ZERO,
7827 .block_erasers =
7828 {
7829 {
7830 .eraseblocks = { {4 * 1024, 2048 } },
7831 .block_erase = spi_block_erase_20,
7832 }, {
7833 .eraseblocks = { {64 * 1024, 128} },
7834 .block_erase = spi_block_erase_d8,
7835 }, {
7836 .eraseblocks = { {8 * 1024 * 1024, 1} },
7837 .block_erase = spi_block_erase_c7,
7838 }
7839 },
7840 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7841 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7842 .write = spi_chip_write_256, /* Multi I/O supported */
7843 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7844 .voltage = {2700, 3600},
7845 },
7846
7847 {
7848 .vendor = "Micron/Numonyx/ST",
7849 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7850 .bustype = BUS_SPI,
7851 .manufacture_id = ST_ID,
7852 .model_id = ST_N25Q128__1E,
7853 .total_size = 16384,
7854 .page_size = 256,
7855 /* supports SFDP */
7856 /* OTP: 64B total; read 0x4B, write 0x42 */
7857 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7858 .tested = TEST_UNTESTED,
7859 .probe = probe_spi_rdid,
7860 .probe_timing = TIMING_ZERO,
7861 .block_erasers = {
7862 {
7863 .eraseblocks = { {4 * 1024, 4096 } },
7864 .block_erase = spi_block_erase_20,
7865 }, {
7866 .eraseblocks = { {64 * 1024, 256} },
7867 .block_erase = spi_block_erase_d8,
7868 }, {
7869 .eraseblocks = { {16384 * 1024, 1} },
7870 .block_erase = spi_block_erase_c7,
7871 }
7872 },
7873 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7874 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7875 .write = spi_chip_write_256, /* Multi I/O supported */
7876 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7877 .voltage = {1700, 2000},
7878 },
7879
7880 {
7881 .vendor = "Micron/Numonyx/ST",
7882 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7883 .bustype = BUS_SPI,
7884 .manufacture_id = ST_ID,
7885 .model_id = ST_N25Q128__3E,
7886 .total_size = 16384,
7887 .page_size = 256,
7888 /* supports SFDP */
7889 /* OTP: 64B total; read 0x4B, write 0x42 */
7890 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7891 .tested = TEST_OK_PREW,
7892 .probe = probe_spi_rdid,
7893 .probe_timing = TIMING_ZERO,
7894 .block_erasers = {
7895 {
7896 .eraseblocks = { {4 * 1024, 4096 } },
7897 .block_erase = spi_block_erase_20,
7898 }, {
7899 .eraseblocks = { {64 * 1024, 256} },
7900 .block_erase = spi_block_erase_d8,
7901 }, {
7902 .eraseblocks = { {16384 * 1024, 1} },
7903 .block_erase = spi_block_erase_c7,
7904 }
7905 },
7906 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7907 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7908 .write = spi_chip_write_256, /* Multi I/O supported */
7909 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7910 .voltage = {2700, 3600},
7911 },
7912
7913 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00007914 .vendor = "MoselVitelic",
7915 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007916 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007917 .manufacture_id = SYNCMOS_MVC_ID,
7918 .model_id = MVC_V29C51000B,
7919 .total_size = 64,
7920 .page_size = 512,
7921 .feature_bits = FEATURE_EITHER_RESET,
7922 .tested = TEST_UNTESTED,
7923 .probe = probe_jedec,
7924 .probe_timing = TIMING_ZERO,
7925 .block_erasers =
7926 {
7927 {
7928 .eraseblocks = { {512, 128} },
7929 .block_erase = erase_sector_jedec,
7930 }, {
7931 .eraseblocks = { {64 * 1024, 1} },
7932 .block_erase = erase_chip_block_jedec,
7933 },
7934 },
7935 .write = write_jedec_1,
7936 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007937 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007938 },
7939
7940 {
7941 .vendor = "MoselVitelic",
7942 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007943 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007944 .manufacture_id = SYNCMOS_MVC_ID,
7945 .model_id = MVC_V29C51000T,
7946 .total_size = 64,
7947 .page_size = 512,
7948 .feature_bits = FEATURE_EITHER_RESET,
7949 .tested = TEST_UNTESTED,
7950 .probe = probe_jedec,
7951 .probe_timing = TIMING_ZERO,
7952 .block_erasers =
7953 {
7954 {
7955 .eraseblocks = { {512, 128} },
7956 .block_erase = erase_sector_jedec,
7957 }, {
7958 .eraseblocks = { {64 * 1024, 1} },
7959 .block_erase = erase_chip_block_jedec,
7960 },
7961 },
7962 .write = write_jedec_1,
7963 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007964 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007965 },
7966
7967 {
7968 .vendor = "MoselVitelic",
7969 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007970 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007971 .manufacture_id = SYNCMOS_MVC_ID,
7972 .model_id = MVC_V29C51400B,
7973 .total_size = 512,
7974 .page_size = 1024,
7975 .feature_bits = FEATURE_EITHER_RESET,
7976 .tested = TEST_UNTESTED,
7977 .probe = probe_jedec,
7978 .probe_timing = TIMING_ZERO,
7979 .block_erasers =
7980 {
7981 {
7982 .eraseblocks = { {1024, 512} },
7983 .block_erase = erase_sector_jedec,
7984 }, {
7985 .eraseblocks = { {512 * 1024, 1} },
7986 .block_erase = erase_chip_block_jedec,
7987 },
7988 },
7989 .write = write_jedec_1,
7990 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007991 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007992 },
7993
7994 {
7995 .vendor = "MoselVitelic",
7996 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007997 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007998 .manufacture_id = SYNCMOS_MVC_ID,
7999 .model_id = MVC_V29C51400T,
8000 .total_size = 512,
8001 .page_size = 1024,
8002 .feature_bits = FEATURE_EITHER_RESET,
8003 .tested = TEST_UNTESTED,
8004 .probe = probe_jedec,
8005 .probe_timing = TIMING_ZERO,
8006 .block_erasers =
8007 {
8008 {
8009 .eraseblocks = { {1024, 512} },
8010 .block_erase = erase_sector_jedec,
8011 }, {
8012 .eraseblocks = { {512 * 1024, 1} },
8013 .block_erase = erase_chip_block_jedec,
8014 },
8015 },
8016 .write = write_jedec_1,
8017 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008018 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008019 },
8020
8021 {
8022 .vendor = "MoselVitelic",
8023 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008024 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008025 .manufacture_id = SYNCMOS_MVC_ID,
8026 .model_id = MVC_V29LC51000,
8027 .total_size = 64,
8028 .page_size = 512,
8029 .feature_bits = FEATURE_EITHER_RESET,
8030 .tested = TEST_UNTESTED,
8031 .probe = probe_jedec,
8032 .probe_timing = TIMING_ZERO,
8033 .block_erasers =
8034 {
8035 {
8036 .eraseblocks = { {512, 128} },
8037 .block_erase = erase_sector_jedec,
8038 }, {
8039 .eraseblocks = { {64 * 1024, 1} },
8040 .block_erase = erase_chip_block_jedec,
8041 },
8042 },
8043 .write = write_jedec_1,
8044 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008045 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008046 },
8047
8048 {
8049 .vendor = "MoselVitelic",
8050 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008051 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008052 .manufacture_id = SYNCMOS_MVC_ID,
8053 .model_id = MVC_V29LC51001,
8054 .total_size = 128,
8055 .page_size = 512,
8056 .feature_bits = FEATURE_EITHER_RESET,
8057 .tested = TEST_UNTESTED,
8058 .probe = probe_jedec,
8059 .probe_timing = TIMING_ZERO,
8060 .block_erasers =
8061 {
8062 {
8063 .eraseblocks = { {512, 256} },
8064 .block_erase = erase_sector_jedec,
8065 }, {
8066 .eraseblocks = { {128 * 1024, 1} },
8067 .block_erase = erase_chip_block_jedec,
8068 },
8069 },
8070 .write = write_jedec_1,
8071 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008072 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008073 },
8074
8075 {
8076 .vendor = "MoselVitelic",
8077 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008078 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008079 .manufacture_id = SYNCMOS_MVC_ID,
8080 .model_id = MVC_V29LC51002,
8081 .total_size = 256,
8082 .page_size = 512,
8083 .feature_bits = FEATURE_EITHER_RESET,
8084 .tested = TEST_UNTESTED,
8085 .probe = probe_jedec,
8086 .probe_timing = TIMING_ZERO,
8087 .block_erasers =
8088 {
8089 {
8090 .eraseblocks = { {512, 512} },
8091 .block_erase = erase_sector_jedec,
8092 }, {
8093 .eraseblocks = { {256 * 1024, 1} },
8094 .block_erase = erase_chip_block_jedec,
8095 },
8096 },
8097 .write = write_jedec_1,
8098 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008099 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008100 },
8101
8102 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008103 .vendor = "Nantronics",
8104 .name = "N25S10",
8105 .bustype = BUS_SPI,
8106 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8107 .model_id = NANTRONICS_N25S10,
8108 .total_size = 128,
8109 .page_size = 256,
8110 .feature_bits = FEATURE_WRSR_WREN,
8111 .tested = TEST_UNTESTED,
8112 .probe = probe_spi_rdid,
8113 .probe_timing = TIMING_ZERO,
8114 .block_erasers =
8115 {
8116 {
8117 .eraseblocks = { {4 * 1024, 32} },
8118 .block_erase = spi_block_erase_20,
8119 }, {
8120 .eraseblocks = { {4 * 1024, 32} },
8121 .block_erase = spi_block_erase_d7,
8122 }, {
8123 .eraseblocks = { {32 * 1024, 4} },
8124 .block_erase = spi_block_erase_52,
8125 }, {
8126 .eraseblocks = { {64 * 1024, 2} },
8127 .block_erase = spi_block_erase_d8,
8128 }, {
8129 .eraseblocks = { {128 * 1024, 1} },
8130 .block_erase = spi_block_erase_60,
8131 }, {
8132 .eraseblocks = { {128 * 1024, 1} },
8133 .block_erase = spi_block_erase_c7,
8134 }
8135 },
8136 .printlock = spi_prettyprint_status_register_default_bp3,
8137 .unlock = spi_disable_blockprotect_bp3_srwd,
8138 .write = spi_chip_write_256,
8139 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8140 .voltage = {2700, 3600},
8141 },
8142
8143 {
8144 .vendor = "Nantronics",
8145 .name = "N25S20",
8146 .bustype = BUS_SPI,
8147 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8148 .model_id = NANTRONICS_N25S20,
8149 .total_size = 256,
8150 .page_size = 256,
8151 .feature_bits = FEATURE_WRSR_WREN,
8152 .tested = TEST_UNTESTED,
8153 .probe = probe_spi_rdid,
8154 .probe_timing = TIMING_ZERO,
8155 .block_erasers =
8156 {
8157 {
8158 .eraseblocks = { {4 * 1024, 64} },
8159 .block_erase = spi_block_erase_20,
8160 }, {
8161 .eraseblocks = { {4 * 1024, 64} },
8162 .block_erase = spi_block_erase_d7,
8163 }, {
8164 .eraseblocks = { {32 * 1024, 8} },
8165 .block_erase = spi_block_erase_52,
8166 }, {
8167 .eraseblocks = { {64 * 1024, 4} },
8168 .block_erase = spi_block_erase_d8,
8169 }, {
8170 .eraseblocks = { {256 * 1024, 1} },
8171 .block_erase = spi_block_erase_60,
8172 }, {
8173 .eraseblocks = { {256 * 1024, 1} },
8174 .block_erase = spi_block_erase_c7,
8175 }
8176 },
8177 .printlock = spi_prettyprint_status_register_default_bp3,
8178 .unlock = spi_disable_blockprotect_bp3_srwd,
8179 .write = spi_chip_write_256,
8180 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8181 .voltage = {2700, 3600},
8182 },
8183
8184 {
8185 .vendor = "Nantronics",
8186 .name = "N25S40",
8187 .bustype = BUS_SPI,
8188 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8189 .model_id = NANTRONICS_N25S40,
8190 .total_size = 512,
8191 .page_size = 256,
8192 .feature_bits = FEATURE_WRSR_WREN,
8193 .tested = TEST_UNTESTED,
8194 .probe = probe_spi_rdid,
8195 .probe_timing = TIMING_ZERO,
8196 .block_erasers =
8197 {
8198 {
8199 .eraseblocks = { {4 * 1024, 128} },
8200 .block_erase = spi_block_erase_20,
8201 }, {
8202 .eraseblocks = { {4 * 1024, 128} },
8203 .block_erase = spi_block_erase_d7,
8204 }, {
8205 .eraseblocks = { {32 * 1024, 16} },
8206 .block_erase = spi_block_erase_52,
8207 }, {
8208 .eraseblocks = { {64 * 1024, 8} },
8209 .block_erase = spi_block_erase_d8,
8210 }, {
8211 .eraseblocks = { {512 * 1024, 1} },
8212 .block_erase = spi_block_erase_60,
8213 }, {
8214 .eraseblocks = { {512 * 1024, 1} },
8215 .block_erase = spi_block_erase_c7,
8216 }
8217 },
8218 .printlock = spi_prettyprint_status_register_default_bp3,
8219 .unlock = spi_disable_blockprotect_bp3_srwd,
8220 .write = spi_chip_write_256,
8221 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8222 .voltage = {2700, 3600},
8223 },
8224
8225 {
8226 .vendor = "Nantronics",
8227 .name = "N25S80",
8228 .bustype = BUS_SPI,
8229 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8230 .model_id = NANTRONICS_N25S80,
8231 .total_size = 1024,
8232 .page_size = 256,
8233 .feature_bits = FEATURE_WRSR_WREN,
8234 .tested = TEST_UNTESTED,
8235 .probe = probe_spi_rdid,
8236 .probe_timing = TIMING_ZERO,
8237 .block_erasers =
8238 {
8239 {
8240 .eraseblocks = { {4 * 1024, 256} },
8241 .block_erase = spi_block_erase_20,
8242 }, {
8243 .eraseblocks = { {32 * 1024, 32} },
8244 .block_erase = spi_block_erase_52,
8245 }, {
8246 .eraseblocks = { {64 * 1024, 16} },
8247 .block_erase = spi_block_erase_d8,
8248 }, {
8249 .eraseblocks = { {1024 * 1024, 1} },
8250 .block_erase = spi_block_erase_60,
8251 }, {
8252 .eraseblocks = { {1024 * 1024, 1} },
8253 .block_erase = spi_block_erase_c7,
8254 }
8255 },
8256 .printlock = spi_prettyprint_status_register_default_bp3,
8257 .unlock = spi_disable_blockprotect_bp3_srwd,
8258 .write = spi_chip_write_256,
8259 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8260 .voltage = {2700, 3600},
8261 },
8262
8263 {
8264 .vendor = "Nantronics",
8265 .name = "N25S16",
8266 .bustype = BUS_SPI,
8267 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8268 .model_id = NANTRONICS_N25S16,
8269 .total_size = 2048,
8270 .page_size = 256,
8271 .feature_bits = FEATURE_WRSR_WREN,
8272 .tested = TEST_UNTESTED,
8273 .probe = probe_spi_rdid,
8274 .probe_timing = TIMING_ZERO,
8275 .block_erasers =
8276 {
8277 {
8278 .eraseblocks = { {4 * 1024, 512} },
8279 .block_erase = spi_block_erase_20,
8280 }, {
8281 .eraseblocks = { {64 * 1024, 32} },
8282 .block_erase = spi_block_erase_d8,
8283 }, {
8284 .eraseblocks = { {2048 * 1024, 1} },
8285 .block_erase = spi_block_erase_60,
8286 }, {
8287 .eraseblocks = { {2048 * 1024, 1} },
8288 .block_erase = spi_block_erase_c7,
8289 }
8290 },
8291 .printlock = spi_prettyprint_status_register_default_bp3,
8292 .unlock = spi_disable_blockprotect_bp3_srwd,
8293 .write = spi_chip_write_256,
8294 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8295 .voltage = {2700, 3600},
8296 },
8297
8298 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008299 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00008300 .name = "Pm25LD256C",
8301 .bustype = BUS_SPI,
8302 .manufacture_id = PMC_ID,
8303 .model_id = PMC_PM25LD256C,
8304 .total_size = 32,
8305 .page_size = 256,
8306 .feature_bits = FEATURE_WRSR_WREN,
8307 .tested = TEST_UNTESTED,
8308 .probe = probe_spi_rdid,
8309 .probe_timing = TIMING_ZERO,
8310 .block_erasers =
8311 {
8312 {
8313 .eraseblocks = { {4 * 1024, 8} },
8314 .block_erase = spi_block_erase_20,
8315 }, {
8316 .eraseblocks = { {4 * 1024, 8} },
8317 .block_erase = spi_block_erase_d7,
8318 }, {
8319 .eraseblocks = { {32 * 1024, 1} },
8320 .block_erase = spi_block_erase_d8,
8321 }, {
8322 .eraseblocks = { {32 * 1024, 1} },
8323 .block_erase = spi_block_erase_60,
8324 }, {
8325 .eraseblocks = { {32 * 1024, 1} },
8326 .block_erase = spi_block_erase_c7,
8327 }
8328 },
8329 .printlock = spi_prettyprint_status_register_default_bp2,
8330 .unlock = spi_disable_blockprotect,
8331 .write = spi_chip_write_256,
8332 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8333 .voltage = {2700, 3600},
8334 },
8335 {
8336 .vendor = "PMC",
8337 .name = "Pm25LD512(C)",
8338 .bustype = BUS_SPI,
8339 .manufacture_id = PMC_ID,
8340 .model_id = PMC_PM25LD512,
8341 .total_size = 64,
8342 .page_size = 256,
8343 .feature_bits = FEATURE_WRSR_WREN,
8344 .tested = TEST_OK_PREW,
8345 .probe = probe_spi_rdid,
8346 .probe_timing = TIMING_ZERO,
8347 .block_erasers =
8348 {
8349 {
8350 .eraseblocks = { {4 * 1024, 16} },
8351 .block_erase = spi_block_erase_20,
8352 }, {
8353 .eraseblocks = { {4 * 1024, 16} },
8354 .block_erase = spi_block_erase_d7,
8355 }, {
8356 .eraseblocks = { {32 * 1024, 2} },
8357 .block_erase = spi_block_erase_d8,
8358 }, {
8359 .eraseblocks = { {64 * 1024, 1} },
8360 .block_erase = spi_block_erase_60,
8361 }, {
8362 .eraseblocks = { {64 * 1024, 1} },
8363 .block_erase = spi_block_erase_c7,
8364 }
8365 },
8366 .printlock = spi_prettyprint_status_register_default_bp2,
8367 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8368 .write = spi_chip_write_256,
8369 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8370 .voltage = {2300, 3600},
8371 },
8372
8373 {
8374 .vendor = "PMC",
8375 .name = "Pm25LD010(C)",
8376 .bustype = BUS_SPI,
8377 .manufacture_id = PMC_ID,
8378 .model_id = PMC_PM25LD010,
8379 .total_size = 128,
8380 .page_size = 256,
8381 .feature_bits = FEATURE_WRSR_WREN,
8382 .tested = TEST_UNTESTED,
8383 .probe = probe_spi_rdid,
8384 .probe_timing = TIMING_ZERO,
8385 .block_erasers =
8386 {
8387 {
8388 .eraseblocks = { {4 * 1024, 32} },
8389 .block_erase = spi_block_erase_20,
8390 }, {
8391 .eraseblocks = { {4 * 1024, 32} },
8392 .block_erase = spi_block_erase_d7,
8393 }, {
8394 .eraseblocks = { {32 * 1024, 4} },
8395 .block_erase = spi_block_erase_d8,
8396 }, {
8397 .eraseblocks = { {128 * 1024, 1} },
8398 .block_erase = spi_block_erase_60,
8399 }, {
8400 .eraseblocks = { {128 * 1024, 1} },
8401 .block_erase = spi_block_erase_c7,
8402 }
8403 },
8404 .printlock = spi_prettyprint_status_register_default_bp2,
8405 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8406 .write = spi_chip_write_256,
8407 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8408 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
8409 },
8410
8411 {
8412 .vendor = "PMC",
8413 .name = "Pm25LD020(C)",
8414 .bustype = BUS_SPI,
8415 .manufacture_id = PMC_ID,
8416 .model_id = PMC_PM25LD020,
8417 .total_size = 256,
8418 .page_size = 256,
8419 .feature_bits = FEATURE_WRSR_WREN,
8420 .tested = TEST_UNTESTED,
8421 .probe = probe_spi_rdid,
8422 .probe_timing = TIMING_ZERO,
8423 .block_erasers =
8424 {
8425 {
8426 .eraseblocks = { {4 * 1024, 64} },
8427 .block_erase = spi_block_erase_20,
8428 }, {
8429 .eraseblocks = { {4 * 1024, 64} },
8430 .block_erase = spi_block_erase_d7,
8431 }, {
8432 .eraseblocks = { {64 * 1024, 4} },
8433 .block_erase = spi_block_erase_d8,
8434 }, {
8435 .eraseblocks = { {256 * 1024, 1} },
8436 .block_erase = spi_block_erase_60,
8437 }, {
8438 .eraseblocks = { {256 * 1024, 1} },
8439 .block_erase = spi_block_erase_c7,
8440 }
8441 },
8442 .printlock = spi_prettyprint_status_register_default_bp2,
8443 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8444 .write = spi_chip_write_256,
8445 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8446 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
8447 },
8448
8449 {
8450 .vendor = "PMC",
8451 .name = "Pm25LD040(C)",
8452 .bustype = BUS_SPI,
8453 .manufacture_id = PMC_ID,
8454 .model_id = PMC_PM25LV040,
8455 .total_size = 512,
8456 .page_size = 256,
8457 .feature_bits = FEATURE_WRSR_WREN,
8458 .tested = TEST_UNTESTED,
8459 .probe = probe_spi_rdid,
8460 .probe_timing = TIMING_ZERO,
8461 .block_erasers =
8462 {
8463 {
8464 .eraseblocks = { {4 * 1024, 128} },
8465 .block_erase = spi_block_erase_20,
8466 }, {
8467 .eraseblocks = { {4 * 1024, 128} },
8468 .block_erase = spi_block_erase_d7,
8469 }, {
8470 .eraseblocks = { {64 * 1024, 8} },
8471 .block_erase = spi_block_erase_d8,
8472 }, {
8473 .eraseblocks = { {512 * 1024, 1} },
8474 .block_erase = spi_block_erase_60,
8475 }, {
8476 .eraseblocks = { {512 * 1024, 1} },
8477 .block_erase = spi_block_erase_c7,
8478 }
8479 },
8480 .printlock = spi_prettyprint_status_register_default_bp2,
8481 .unlock = spi_disable_blockprotect,
8482 .write = spi_chip_write_256,
8483 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8484 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
8485 },
8486
8487{
8488 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008489 .name = "Pm25LV512(A)",
8490 .bustype = BUS_SPI,
8491 .manufacture_id = PMC_ID,
8492 .model_id = PMC_PM25LV512,
8493 .total_size = 64,
8494 .page_size = 256,
8495 .feature_bits = FEATURE_WRSR_WREN,
8496 .tested = TEST_UNTESTED,
8497 .probe = probe_spi_res3,
8498 .probe_timing = TIMING_ZERO,
8499 .block_erasers =
8500 {
8501 {
8502 .eraseblocks = { {4 * 1024, 16} },
8503 .block_erase = spi_block_erase_d7,
8504 }, {
8505 .eraseblocks = { {32 * 1024, 2} },
8506 .block_erase = spi_block_erase_d8,
8507 }, {
8508 .eraseblocks = { {64 * 1024, 1} },
8509 .block_erase = spi_block_erase_c7,
8510 }
8511 },
8512 .printlock = spi_prettyprint_status_register_default_bp1,
8513 .unlock = spi_disable_blockprotect,
8514 .write = spi_chip_write_256,
8515 .read = spi_chip_read, /* Fast read (0x0B) supported */
8516 .voltage = {2700, 3600},
8517 },
8518
8519 {
8520 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008521 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008522 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008523 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008524 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008525 .total_size = 128,
8526 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008527 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008528 .tested = TEST_UNTESTED,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008529 .probe = probe_spi_res3,
8530 .probe_timing = TIMING_ZERO,
8531 .block_erasers =
8532 {
8533 {
8534 .eraseblocks = { {4 * 1024, 32} },
8535 .block_erase = spi_block_erase_d7,
8536 }, {
8537 .eraseblocks = { {32 * 1024, 4} },
8538 .block_erase = spi_block_erase_d8,
8539 }, {
8540 .eraseblocks = { {128 * 1024, 1} },
8541 .block_erase = spi_block_erase_c7,
8542 }
8543 },
8544 .printlock = spi_prettyprint_status_register_default_bp1,
8545 .unlock = spi_disable_blockprotect,
8546 .write = spi_chip_write_256,
8547 .read = spi_chip_read, /* Fast read (0x0B) supported */
8548 .voltage = {2700, 3600},
8549 },
8550
8551 {
8552 .vendor = "PMC",
8553 .name = "Pm25LV010A",
8554 .bustype = BUS_SPI,
8555 .manufacture_id = PMC_ID,
8556 .model_id = PMC_PM25LV010,
8557 .total_size = 128,
8558 .page_size = 256,
8559 .feature_bits = FEATURE_WRSR_WREN,
8560 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008561 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008562 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008563 .block_erasers =
8564 {
8565 {
8566 .eraseblocks = { {4 * 1024, 32} },
8567 .block_erase = spi_block_erase_d7,
8568 }, {
8569 .eraseblocks = { {32 * 1024, 4} },
8570 .block_erase = spi_block_erase_d8,
8571 }, {
8572 .eraseblocks = { {128 * 1024, 1} },
8573 .block_erase = spi_block_erase_c7,
8574 }
8575 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008576 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008577 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008578 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008579 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008580 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008581 },
8582
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008583 {
8584 .vendor = "PMC",
8585 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008586 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008587 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008588 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008589 .total_size = 256,
8590 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008591 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008592 .tested = TEST_UNTESTED,
8593 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008594 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008595 .block_erasers =
8596 {
8597 {
8598 .eraseblocks = { {4 * 1024, 64} },
8599 .block_erase = spi_block_erase_d7,
8600 }, {
8601 .eraseblocks = { {64 * 1024, 4} },
8602 .block_erase = spi_block_erase_d8,
8603 }, {
8604 .eraseblocks = { {256 * 1024, 1} },
8605 .block_erase = spi_block_erase_c7,
8606 }
8607 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008608 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008609 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008610 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008611 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008612 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008613 },
8614
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008615 {
8616 .vendor = "PMC",
8617 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008618 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008619 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008620 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008621 .total_size = 512,
8622 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008623 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00008624 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008625 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008626 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008627 .block_erasers =
8628 {
8629 {
8630 .eraseblocks = { {4 * 1024, 128} },
8631 .block_erase = spi_block_erase_d7,
8632 }, {
8633 .eraseblocks = { {64 * 1024, 8} },
8634 .block_erase = spi_block_erase_d8,
8635 }, {
8636 .eraseblocks = { {512 * 1024, 1} },
8637 .block_erase = spi_block_erase_c7,
8638 }
8639 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008640 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008641 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008642 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008643 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008644 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008645 },
8646
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008647 {
8648 .vendor = "PMC",
8649 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008650 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008651 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008652 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008653 .total_size = 1024,
8654 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008655 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008656 .tested = TEST_UNTESTED,
8657 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008658 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008659 .block_erasers =
8660 {
8661 {
8662 .eraseblocks = { {4 * 1024, 256} },
8663 .block_erase = spi_block_erase_d7,
8664 }, {
8665 .eraseblocks = { {4 * 1024, 256} },
8666 .block_erase = spi_block_erase_20,
8667 }, {
8668 .eraseblocks = { {64 * 1024, 16} },
8669 .block_erase = spi_block_erase_d8,
8670 }, {
8671 .eraseblocks = { {1024 * 1024, 1} },
8672 .block_erase = spi_block_erase_60,
8673 }, {
8674 .eraseblocks = { {1024 * 1024, 1} },
8675 .block_erase = spi_block_erase_c7,
8676 }
8677 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008678 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008679 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008680 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008681 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008682 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008683 },
8684
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008685 {
8686 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008687 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008688 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008689 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008690 .model_id = PMC_PM25LV016B,
8691 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008692 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008693 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008694 .tested = TEST_UNTESTED,
8695 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008696 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008697 .block_erasers =
8698 {
8699 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008700 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00008701 .block_erase = spi_block_erase_d7,
8702 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008703 .eraseblocks = { {4 * 1024, 512} },
8704 .block_erase = spi_block_erase_20,
8705 }, {
8706 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00008707 .block_erase = spi_block_erase_d8,
8708 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008709 .eraseblocks = { {2 * 1024 * 1024, 1} },
8710 .block_erase = spi_block_erase_60,
8711 }, {
8712 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008713 .block_erase = spi_block_erase_c7,
8714 }
8715 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008716 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008717 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008718 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008719 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008720 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008721 },
8722
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008723 {
8724 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008725 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008726 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008727 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008728 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008729 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008730 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008731 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008732 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008733 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008734 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008735 .block_erasers =
8736 {
8737 {
8738 .eraseblocks = {
8739 {128 * 1024, 1},
8740 {96 * 1024, 1},
8741 {8 * 1024, 2},
8742 {16 * 1024, 1},
8743 },
Sean Nelson35727f72010-01-28 23:55:12 +00008744 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008745 }, {
8746 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008747 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008748 },
8749 },
Sean Nelson35727f72010-01-28 23:55:12 +00008750 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008751 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008752 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008753 },
8754
8755 {
8756 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008757 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008758 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008759 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008760 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008761 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008762 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008763 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008764 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00008765 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008766 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008767 .block_erasers =
8768 {
8769 {
8770 .eraseblocks = {
8771 {16 * 1024, 1},
8772 {8 * 1024, 2},
8773 {96 * 1024, 1},
8774 {128 * 1024, 1},
8775 },
Sean Nelson35727f72010-01-28 23:55:12 +00008776 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008777 }, {
8778 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008779 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008780 },
8781 },
Sean Nelson35727f72010-01-28 23:55:12 +00008782 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008783 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008784 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008785 },
8786
8787 {
8788 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008789 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008790 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008791 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008792 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008793 .total_size = 128,
8794 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00008795 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008796 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008797 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008798 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00008799 .block_erasers =
8800 {
8801 {
8802 .eraseblocks = { {4 * 1024, 32} },
8803 .block_erase = erase_sector_jedec,
8804 }, {
8805 .eraseblocks = { {64 * 1024, 2} },
8806 .block_erase = erase_block_jedec,
8807 }, {
8808 .eraseblocks = { {128 * 1024, 1} },
8809 .block_erase = erase_chip_block_jedec,
8810 }
8811 },
Sean Nelson35727f72010-01-28 23:55:12 +00008812 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008813 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008814 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008815 },
8816
8817 {
8818 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008819 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008820 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008821 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008822 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008823 .total_size = 256,
8824 .page_size = 4096,
8825 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8826 .tested = TEST_UNTESTED,
8827 .probe = probe_jedec,
8828 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8829 .block_erasers =
8830 {
8831 {
8832 .eraseblocks = { {4 * 1024, 64} },
8833 .block_erase = erase_sector_jedec,
8834 }, {
8835 .eraseblocks = { {64 * 1024, 4} },
8836 .block_erase = erase_block_jedec,
8837 }, {
8838 .eraseblocks = { {256 * 1024, 1} },
8839 .block_erase = erase_chip_block_jedec,
8840 }
8841 },
8842 .write = write_jedec_1,
8843 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008844 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008845 },
8846
8847 {
8848 .vendor = "PMC",
8849 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008850 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008851 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008852 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008853 .total_size = 512,
8854 .page_size = 4096,
8855 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008856 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008857 .probe = probe_jedec,
8858 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8859 .block_erasers =
8860 {
8861 {
8862 .eraseblocks = { {4 * 1024, 128} },
8863 .block_erase = erase_sector_jedec,
8864 }, {
8865 .eraseblocks = { {64 * 1024, 8} },
8866 .block_erase = erase_block_jedec,
8867 }, {
8868 .eraseblocks = { {512 * 1024, 1} },
8869 .block_erase = erase_chip_block_jedec,
8870 }
8871 },
8872 .write = write_jedec_1,
8873 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008874 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008875 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +00008876
8877 {
8878 .vendor = "PMC",
8879 .name = "Pm39LV512",
8880 .bustype = BUS_PARALLEL,
8881 .manufacture_id = PMC_ID_NOPREFIX,
8882 .model_id = PMC_PM39LV512,
8883 .total_size = 64,
8884 .page_size = 4096,
8885 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8886 .tested = TEST_OK_PREW,
8887 .probe = probe_jedec,
8888 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8889 .block_erasers =
8890 {
8891 {
8892 .eraseblocks = { {4 * 1024, 16} },
8893 .block_erase = erase_sector_jedec,
8894 }, {
8895 .eraseblocks = { {64 * 1024, 1} },
8896 .block_erase = erase_block_jedec,
8897 }, {
8898 .eraseblocks = { {64 * 1024, 1} },
8899 .block_erase = erase_chip_block_jedec,
8900 }
8901 },
8902 .write = write_jedec_1,
8903 .read = read_memmapped,
8904 .voltage = {2700, 3600},
8905 },
8906
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008907 {
8908 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008909 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008910 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008911 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008912 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008913 .total_size = 256,
8914 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008915 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunerd06d9412011-06-12 19:47:55 +00008916 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008917 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008918 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008919 .block_erasers =
8920 {
8921 {
8922 .eraseblocks = { {4 * 1024, 64} },
8923 .block_erase = erase_sector_jedec,
8924 }, {
8925 .eraseblocks = { {16 * 1024, 16} },
8926 .block_erase = erase_block_jedec,
8927 }, {
8928 .eraseblocks = { {256 * 1024, 1} },
8929 .block_erase = erase_chip_block_jedec,
8930 }
8931 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008932 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008933 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008934 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008935 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008936 },
8937
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008938 {
8939 .vendor = "PMC",
8940 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008941 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008942 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008943 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008944 .total_size = 512,
8945 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008946 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +00008947 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008948 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008949 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008950 .block_erasers =
8951 {
8952 {
8953 .eraseblocks = { {4 * 1024, 128} },
8954 .block_erase = erase_sector_jedec,
8955 }, {
8956 .eraseblocks = { {64 * 1024, 8} },
8957 .block_erase = erase_block_jedec,
8958 }, {
8959 .eraseblocks = { {512 * 1024, 1} },
8960 .block_erase = erase_chip_block_jedec,
8961 }
8962 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008963 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008964 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008965 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008966 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008967 },
8968
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008969 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00008970 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008971 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008972 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008973 .manufacture_id = SANYO_ID,
8974 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008975 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008976 .page_size = 256,
8977 .tested = TEST_UNTESTED,
8978 .probe = probe_spi_rdid,
8979 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008980 .block_erasers =
8981 {
8982 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008983 .eraseblocks = { {256, 1024} },
8984 .block_erase = spi_block_erase_db,
8985 }, {
8986 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +00008987 .block_erase = spi_block_erase_d8,
8988 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008989 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008990 .block_erase = spi_block_erase_c7,
8991 }
8992 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008993 .printlock = spi_prettyprint_status_register_default_welwip,
8994 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +00008995 .write = spi_chip_write_256,
8996 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008997 .voltage = {2700, 3600},
8998 },
8999
9000 {
9001 .vendor = "Sanyo",
9002 .name = "LE25FW403A",
9003 .bustype = BUS_SPI,
9004 .manufacture_id = SANYO_ID,
9005 .model_id = SANYO_LE25FW403A,
9006 .total_size = 512,
9007 .page_size = 256,
9008 .tested = TEST_UNTESTED,
9009 .probe = probe_spi_rdid,
9010 .probe_timing = TIMING_ZERO,
9011 .block_erasers = {
9012 {
9013 .eraseblocks = { {256, 2 * 1024} },
9014 .block_erase = spi_block_erase_db,
9015 }, {
9016 .eraseblocks = { {64 * 1024, 8} },
9017 .block_erase = spi_block_erase_d8,
9018 }, {
9019 .eraseblocks = { {512 * 1024, 1} },
9020 .block_erase = spi_block_erase_c7,
9021 }
9022 },
9023 .printlock = spi_prettyprint_status_register_default_welwip,
9024 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9025 .write = spi_chip_write_256,
9026 .read = spi_chip_read,
9027 .voltage = {2700, 3600},
9028 },
9029
9030 {
9031 .vendor = "Sanyo",
9032 .name = "LE25FW418A",
9033 .bustype = BUS_SPI,
9034 .manufacture_id = SANYO_ID,
9035 .model_id = SANYO_LE25FW418A,
9036 .total_size = 512,
9037 .page_size = 256,
9038 .feature_bits = FEATURE_WRSR_WREN,
9039 .tested = TEST_UNTESTED,
9040 .probe = probe_spi_res2,
9041 .probe_timing = TIMING_ZERO,
9042 .block_erasers = {
9043 {
9044 .eraseblocks = { {4 * 1024, 128} },
9045 .block_erase = spi_block_erase_d7,
9046 }, {
9047 .eraseblocks = { {64 * 1024, 8} },
9048 .block_erase = spi_block_erase_d8,
9049 }, {
9050 .eraseblocks = { {512 * 1024, 1} },
9051 .block_erase = spi_block_erase_c7,
9052 }
9053 },
9054 .printlock = spi_prettyprint_status_register_default_bp2,
9055 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9056 .write = spi_chip_write_256,
9057 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
9058 .voltage = {2700, 3600},
9059 },
9060
9061 {
9062 .vendor = "Sanyo",
9063 .name = "LE25FW806",
9064 .bustype = BUS_SPI,
9065 .manufacture_id = SANYO_ID,
9066 .model_id = SANYO_LE25FW806,
9067 .total_size = 1024,
9068 .page_size = 256,
9069 .feature_bits = FEATURE_WRSR_WREN,
9070 .tested = TEST_UNTESTED,
9071 .probe = probe_spi_res2,
9072 .probe_timing = TIMING_ZERO,
9073 .block_erasers = {
9074 {
9075 .eraseblocks = { {4 * 1024, 256} },
9076 .block_erase = spi_block_erase_20,
9077 }, {
9078 .eraseblocks = { {4 * 1024, 256} },
9079 .block_erase = spi_block_erase_d7,
9080 }, {
9081 .eraseblocks = { {64 * 1024, 16} },
9082 .block_erase = spi_block_erase_d8,
9083 }, {
9084 .eraseblocks = { {1024 * 1024, 1} },
9085 .block_erase = spi_block_erase_c7,
9086 }
9087 },
9088 .printlock = spi_prettyprint_status_register_default_bp2,
9089 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9090 .write = spi_chip_write_256,
9091 .read = spi_chip_read,
9092 .voltage = {2700, 3600},
9093 },
9094
9095 {
9096 .vendor = "Sanyo",
9097 .name = "LE25FW808",
9098 .bustype = BUS_SPI,
9099 .manufacture_id = SANYO_ID,
9100 .model_id = SANYO_LE25FW808,
9101 .total_size = 1024,
9102 .page_size = 256,
9103 .feature_bits = FEATURE_WRSR_WREN,
9104 .tested = TEST_UNTESTED,
9105 .probe = probe_spi_res2,
9106 .probe_timing = TIMING_ZERO,
9107 .block_erasers = {
9108 {
9109 .eraseblocks = { {8 * 1024, 128} },
9110 .block_erase = spi_block_erase_d7,
9111 }, {
9112 .eraseblocks = { {64 * 1024, 16} },
9113 .block_erase = spi_block_erase_d8,
9114 }, {
9115 .eraseblocks = { {1024 * 1024, 1} },
9116 .block_erase = spi_block_erase_c7,
9117 }
9118 },
9119 .printlock = spi_prettyprint_status_register_default_bp2,
9120 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9121 .write = spi_chip_write_256,
9122 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
9123 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +00009124 },
9125
9126 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009127 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +00009128 .name = "LH28F008BJT-BTLZ1",
9129 .bustype = BUS_PARALLEL,
9130 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +00009131 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +00009132 .total_size = 1024,
9133 .page_size = 64 * 1024,
9134 .tested = TEST_OK_PREW,
9135 .probe = probe_82802ab,
9136 .probe_timing = TIMING_ZERO,
9137 .block_erasers =
9138 {
9139 {
9140 .eraseblocks = {
9141 {8 * 1024, 8},
9142 {64 * 1024, 15}
9143 },
9144 .block_erase = erase_block_82802ab,
9145 }, {
9146 .eraseblocks = { {1024 * 1024, 1} },
9147 .block_erase = erase_sector_49lfxxxc,
9148 }
9149 },
9150 .unlock = unlock_lh28f008bjt,
9151 .write = write_82802ab,
9152 .read = read_memmapped,
9153 .voltage = {2700, 3600},
9154 },
9155
9156 {
9157 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009158 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009159 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009160 .manufacture_id = SHARP_ID,
9161 .model_id = SHARP_LHF00L04,
9162 .total_size = 1024,
9163 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009164 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009165 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009166 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009167 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009168 .block_erasers =
9169 {
9170 {
9171 .eraseblocks = {
9172 {64 * 1024, 15},
9173 {8 * 1024, 8}
9174 },
Sean Nelson28accc22010-03-19 18:47:06 +00009175 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009176 }, {
9177 .eraseblocks = {
9178 {1024 * 1024, 1}
9179 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00009180 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009181 },
9182 },
Sean Nelson28accc22010-03-19 18:47:06 +00009183 .unlock = unlock_82802ab,
9184 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009185 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009186 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009187 },
9188
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009189 {
9190 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +00009191 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009192 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009193 .manufacture_id = SPANSION_ID,
9194 .model_id = SPANSION_S25FL004A,
9195 .total_size = 512,
9196 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009197 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009198 .tested = TEST_UNTESTED,
9199 .probe = probe_spi_rdid,
9200 .probe_timing = TIMING_ZERO,
9201 .block_erasers =
9202 {
9203 {
9204 .eraseblocks = { {64 * 1024, 8} },
9205 .block_erase = spi_block_erase_d8,
9206 }, {
9207 .eraseblocks = { {512 * 1024, 1} },
9208 .block_erase = spi_block_erase_c7,
9209 }
9210 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009211 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009212 .unlock = spi_disable_blockprotect,
9213 .write = spi_chip_write_256,
9214 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009215 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009216 },
9217
9218 {
9219 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00009220 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009221 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +00009222 .manufacture_id = SPANSION_ID,
9223 .model_id = SPANSION_S25FL008A,
9224 .total_size = 1024,
9225 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009226 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009227 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +00009228 .probe = probe_spi_rdid,
9229 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00009230 .block_erasers =
9231 {
9232 {
9233 .eraseblocks = { {64 * 1024, 16} },
9234 .block_erase = spi_block_erase_d8,
9235 }, {
9236 .eraseblocks = { {1024 * 1024, 1} },
9237 .block_erase = spi_block_erase_c7,
9238 }
9239 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009240 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009241 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00009242 .write = spi_chip_write_256,
9243 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009244 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +00009245 },
9246
9247 {
9248 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009249 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009250 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009251 .manufacture_id = SPANSION_ID,
9252 .model_id = SPANSION_S25FL016A,
9253 .total_size = 2048,
9254 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009255 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009256 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009257 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009258 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009259 .block_erasers =
9260 {
9261 {
9262 .eraseblocks = { {64 * 1024, 32} },
9263 .block_erase = spi_block_erase_d8,
9264 }, {
9265 .eraseblocks = { {2 * 1024 * 1024, 1} },
9266 .block_erase = spi_block_erase_c7,
9267 }
9268 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009269 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009270 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009271 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009272 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009273 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009274 },
9275
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009276 {
Rudy Hostf4e57772010-11-29 00:37:49 +00009277 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009278 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009279 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009280 .manufacture_id = SPANSION_ID,
9281 .model_id = SPANSION_S25FL032A,
9282 .total_size = 4096,
9283 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009284 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009285 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +00009286 .probe = probe_spi_rdid,
9287 .probe_timing = TIMING_ZERO,
9288 .block_erasers =
9289 {
9290 {
9291 .eraseblocks = { {64 * 1024, 64} },
9292 .block_erase = spi_block_erase_d8,
9293 }, {
9294 .eraseblocks = { {4 * 1024 * 1024, 1} },
9295 .block_erase = spi_block_erase_c7,
9296 }
9297 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009298 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009299 .unlock = spi_disable_blockprotect,
9300 .write = spi_chip_write_256,
9301 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009302 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009303 },
9304
9305 {
9306 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009307 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009308 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009309 .manufacture_id = SPANSION_ID,
9310 .model_id = SPANSION_S25FL064A,
9311 .total_size = 8192,
9312 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009313 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009314 .tested = TEST_OK_PREW,
9315 .probe = probe_spi_rdid,
9316 .probe_timing = TIMING_ZERO,
9317 .block_erasers =
9318 {
9319 {
9320 .eraseblocks = { {64 * 1024, 128} },
9321 .block_erase = spi_block_erase_d8,
9322 }, {
9323 .eraseblocks = { {8 * 1024 * 1024, 1} },
9324 .block_erase = spi_block_erase_c7,
9325 }
9326 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009327 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009328 .unlock = spi_disable_blockprotect,
9329 .write = spi_chip_write_256,
9330 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009331 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009332 },
9333
9334 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009335 .vendor = "Spansion",
9336 .name = "S25FL204K",
9337 .bustype = BUS_SPI,
9338 .manufacture_id = SPANSION_ID,
9339 .model_id = SPANSION_S25FL204,
9340 .total_size = 512,
9341 .page_size = 256,
9342 .feature_bits = FEATURE_WRSR_WREN,
9343 .tested = TEST_UNTESTED,
9344 .probe = probe_spi_rdid,
9345 .probe_timing = TIMING_ZERO,
9346 .block_erasers = {
9347 {
9348 .eraseblocks = { {4 * 1024, 128} },
9349 .block_erase = spi_block_erase_20,
9350 }, {
9351 .eraseblocks = { {64 * 1024, 8} },
9352 .block_erase = spi_block_erase_d8,
9353 }, {
9354 .eraseblocks = { { 512 * 1024, 1} },
9355 .block_erase = spi_block_erase_60,
9356 }, {
9357 .eraseblocks = { { 512 * 1024, 1} },
9358 .block_erase = spi_block_erase_c7,
9359 }
9360 },
9361 .printlock = spi_prettyprint_status_register_default_bp3,
9362 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9363 .write = spi_chip_write_256,
9364 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9365 .voltage = {2700, 3600},
9366 },
9367
9368 {
9369 .vendor = "Spansion",
9370 .name = "S25FL208K",
9371 .bustype = BUS_SPI,
9372 .manufacture_id = SPANSION_ID,
9373 .model_id = SPANSION_S25FL208,
9374 .total_size = 1024,
9375 .page_size = 256,
9376 .feature_bits = FEATURE_WRSR_WREN,
9377 .tested = TEST_UNTESTED,
9378 .probe = probe_spi_rdid,
9379 .probe_timing = TIMING_ZERO,
9380 .block_erasers = {
9381 {
9382 .eraseblocks = { {4 * 1024, 256} },
9383 .block_erase = spi_block_erase_20,
9384 }, {
9385 .eraseblocks = { {64 * 1024, 16} },
9386 .block_erase = spi_block_erase_d8,
9387 }, {
9388 .eraseblocks = { { 1024 * 1024, 1} },
9389 .block_erase = spi_block_erase_60,
9390 }, {
9391 .eraseblocks = { { 1024 * 1024, 1} },
9392 .block_erase = spi_block_erase_c7,
9393 }
9394 },
9395 .printlock = spi_prettyprint_status_register_default_bp3,
9396 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9397 .write = spi_chip_write_256,
9398 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9399 .voltage = {2700, 3600},
9400 },
9401
9402 {
9403 .vendor = "Spansion",
9404 .name = "S25FL116K/S25FL216K",
9405 .bustype = BUS_SPI,
9406 .manufacture_id = SPANSION_ID,
9407 .model_id = SPANSION_S25FL216,
9408 .total_size = 2048,
9409 .page_size = 256,
9410 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
9411 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9412 .tested = TEST_UNTESTED,
9413 .probe = probe_spi_rdid,
9414 .probe_timing = TIMING_ZERO,
9415 .block_erasers = {
9416 {
9417 .eraseblocks = { {4 * 1024, 512} },
9418 .block_erase = spi_block_erase_20,
9419 }, {
9420 .eraseblocks = { {64 * 1024, 32} },
9421 .block_erase = spi_block_erase_d8,
9422 }, {
9423 .eraseblocks = { { 2048 * 1024, 1} },
9424 .block_erase = spi_block_erase_60,
9425 }, {
9426 .eraseblocks = { { 2048 * 1024, 1} },
9427 .block_erase = spi_block_erase_c7,
9428 }
9429 },
9430 .printlock = spi_prettyprint_status_register_default_bp3,
9431 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9432 .write = spi_chip_write_256,
9433 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9434 .voltage = {2700, 3600},
9435 },
9436
9437 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00009438 .vendor = "Spansion",
9439 .name = "S25FL128S......0", /* uniform 256kB sectors */
9440 .bustype = BUS_SPI,
9441 .manufacture_id = SPANSION_ID,
9442 .model_id = SPANSION_S25FL128,
9443 .total_size = 16384,
9444 .page_size = 256,
9445 /* supports 4B addressing */
9446 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
9447 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9448 .tested = TEST_UNTESTED,
9449 .probe = probe_spi_rdid,
9450 .probe_timing = TIMING_ZERO,
9451 .block_erasers = {
9452 {
9453 .eraseblocks = { {4 * 1024, 4096} },
9454 .block_erase = spi_block_erase_20,
9455 }, {
9456 .eraseblocks = { {256 * 1024, 64} },
9457 .block_erase = spi_block_erase_d8,
9458 }, {
9459 .eraseblocks = { { 16384 * 1024, 1} },
9460 .block_erase = spi_block_erase_60,
9461 }, {
9462 .eraseblocks = { { 16384 * 1024, 1} },
9463 .block_erase = spi_block_erase_c7,
9464 }
9465 },
9466 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
9467 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
9468 .write = spi_chip_write_256, /* Multi I/O supported */
9469 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9470 .voltage = {2700, 3600},
9471 },
9472
9473 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009474 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +00009475 .name = "SST25LF040A",
9476 .bustype = BUS_SPI,
9477 .manufacture_id = SST_ID,
9478 .model_id = SST_SST25VF040_REMS,
9479 .total_size = 512,
9480 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009481 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +00009482 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +00009483 .probe = probe_spi_res2,
9484 .probe_timing = TIMING_ZERO,
9485 .block_erasers =
9486 {
9487 {
9488 .eraseblocks = { {4 * 1024, 128} },
9489 .block_erase = spi_block_erase_20,
9490 }, {
9491 .eraseblocks = { {32 * 1024, 16} },
9492 .block_erase = spi_block_erase_52,
9493 }, {
9494 .eraseblocks = { {512 * 1024, 1} },
9495 .block_erase = spi_block_erase_60,
9496 },
9497 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009498 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009499 .unlock = spi_disable_blockprotect,
9500 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9501 .read = spi_chip_read,
9502 .voltage = {3000, 3600},
9503 },
9504
9505 {
9506 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009507 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +00009508 .bustype = BUS_SPI,
9509 .manufacture_id = SST_ID,
9510 .model_id = SST_SST25VF080_REMS,
9511 .total_size = 1024,
9512 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009513 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +00009514 .tested = TEST_UNTESTED,
9515 .probe = probe_spi_res2,
9516 .probe_timing = TIMING_ZERO,
9517 .block_erasers =
9518 {
9519 {
9520 .eraseblocks = { {4 * 1024, 256} },
9521 .block_erase = spi_block_erase_20,
9522 }, {
9523 .eraseblocks = { {32 * 1024, 32} },
9524 .block_erase = spi_block_erase_52,
9525 }, {
9526 .eraseblocks = { {1024 * 1024, 1} },
9527 .block_erase = spi_block_erase_60,
9528 },
9529 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009530 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009531 .unlock = spi_disable_blockprotect,
9532 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9533 .read = spi_chip_read,
9534 .voltage = {3000, 3600},
9535 },
9536
9537 {
9538 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009539 .name = "SST25VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009540 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +00009541 .manufacture_id = SST_ID,
9542 .model_id = SST_SST25VF010_REMS,
9543 .total_size = 128,
9544 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009545 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +00009546 .tested = TEST_OK_PREW,
9547 .probe = probe_spi_rems,
9548 .probe_timing = TIMING_ZERO,
9549 .block_erasers =
9550 {
9551 {
9552 .eraseblocks = { {4 * 1024, 32} },
9553 .block_erase = spi_block_erase_20,
9554 }, {
9555 .eraseblocks = { {32 * 1024, 4} },
9556 .block_erase = spi_block_erase_52,
9557 }, {
9558 .eraseblocks = { {128 * 1024, 1} },
9559 .block_erase = spi_block_erase_60,
9560 },
9561 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009562 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +00009563 .unlock = spi_disable_blockprotect,
9564 .write = spi_chip_write_1,
9565 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009566 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +00009567 },
9568
9569 {
9570 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009571 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009572 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009573 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009574 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009575 .total_size = 2048,
9576 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009577 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +00009578 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009579 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009580 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009581 .block_erasers =
9582 {
9583 {
9584 .eraseblocks = { {4 * 1024, 512} },
9585 .block_erase = spi_block_erase_20,
9586 }, {
9587 .eraseblocks = { {32 * 1024, 64} },
9588 .block_erase = spi_block_erase_52,
9589 }, {
9590 .eraseblocks = { {64 * 1024, 32} },
9591 .block_erase = spi_block_erase_d8,
9592 }, {
9593 .eraseblocks = { {2 * 1024 * 1024, 1} },
9594 .block_erase = spi_block_erase_60,
9595 }, {
9596 .eraseblocks = { {2 * 1024 * 1024, 1} },
9597 .block_erase = spi_block_erase_c7,
9598 },
9599 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009600 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009601 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009602 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009603 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009604 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009605 },
9606
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009607 {
9608 .vendor = "SST",
9609 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009610 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009611 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009612 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009613 .total_size = 4096,
9614 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009615 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +00009616 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009617 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009618 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009619 .block_erasers =
9620 {
9621 {
9622 .eraseblocks = { {4 * 1024, 1024} },
9623 .block_erase = spi_block_erase_20,
9624 }, {
9625 .eraseblocks = { {32 * 1024, 128} },
9626 .block_erase = spi_block_erase_52,
9627 }, {
9628 .eraseblocks = { {64 * 1024, 64} },
9629 .block_erase = spi_block_erase_d8,
9630 }, {
9631 .eraseblocks = { {4 * 1024 * 1024, 1} },
9632 .block_erase = spi_block_erase_60,
9633 }, {
9634 .eraseblocks = { {4 * 1024 * 1024, 1} },
9635 .block_erase = spi_block_erase_c7,
9636 },
9637 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009638 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009639 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009640 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009641 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009642 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009643 },
9644
9645 {
9646 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009647 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009648 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009649 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009650 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009651 .total_size = 8192,
9652 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009653 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +00009654 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009655 .probe = probe_spi_rdid,
9656 .probe_timing = TIMING_ZERO,
9657 .block_erasers =
9658 {
9659 {
9660 .eraseblocks = { {4 * 1024, 2048} },
9661 .block_erase = spi_block_erase_20,
9662 }, {
9663 .eraseblocks = { {32 * 1024, 256} },
9664 .block_erase = spi_block_erase_52,
9665 }, {
9666 .eraseblocks = { {64 * 1024, 128} },
9667 .block_erase = spi_block_erase_d8,
9668 }, {
9669 .eraseblocks = { {8 * 1024 * 1024, 1} },
9670 .block_erase = spi_block_erase_60,
9671 }, {
9672 .eraseblocks = { {8 * 1024 * 1024, 1} },
9673 .block_erase = spi_block_erase_c7,
9674 },
9675 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009676 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009677 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009678 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009679 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009680 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009681 },
9682
9683 {
9684 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009685 .name = "SST25VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009686 .bustype = BUS_SPI,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009687 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009688 .model_id = SST_SST25VF040_REMS,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009689 .total_size = 512,
9690 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009691 .feature_bits = FEATURE_WRSR_EWSR,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009692 .tested = TEST_OK_PR,
9693 .probe = probe_spi_rems,
9694 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009695 .block_erasers =
9696 {
9697 {
9698 .eraseblocks = { {4 * 1024, 128} },
9699 .block_erase = spi_block_erase_20,
9700 }, {
9701 .eraseblocks = { {32 * 1024, 16} },
9702 .block_erase = spi_block_erase_52,
9703 }, {
9704 .eraseblocks = { {512 * 1024, 1} },
9705 .block_erase = spi_block_erase_60,
9706 },
9707 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009708 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009709 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009710 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009711 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009712 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009713 },
9714
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009715 {
9716 .vendor = "SST",
9717 .name = "SST25VF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009718 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009719 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009720 .model_id = SST_SST25VF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009721 .total_size = 512,
9722 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009723 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009724 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009725 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009726 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009727 .block_erasers =
9728 {
9729 {
9730 .eraseblocks = { {4 * 1024, 128} },
9731 .block_erase = spi_block_erase_20,
9732 }, {
9733 .eraseblocks = { {32 * 1024, 16} },
9734 .block_erase = spi_block_erase_52,
9735 }, {
9736 .eraseblocks = { {64 * 1024, 8} },
9737 .block_erase = spi_block_erase_d8,
9738 }, {
9739 .eraseblocks = { {512 * 1024, 1} },
9740 .block_erase = spi_block_erase_60,
9741 }, {
9742 .eraseblocks = { {512 * 1024, 1} },
9743 .block_erase = spi_block_erase_c7,
9744 },
9745 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009746 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009747 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009748 .write = spi_aai_write,
Zheng Bao0677dff2009-02-25 08:07:33 +00009749 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009750 .voltage = {2700, 3600},
Zheng Bao0677dff2009-02-25 08:07:33 +00009751 },
9752
9753 {
9754 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00009755 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009756 .bustype = BUS_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00009757 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009758 .model_id = SST_SST25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00009759 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009761 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009762 .tested = TEST_OK_PREW,
Peter Stugefd9217d2009-01-26 03:37:40 +00009763 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009764 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009765 .block_erasers =
9766 {
9767 {
9768 .eraseblocks = { {4 * 1024, 128} },
9769 .block_erase = spi_block_erase_20,
9770 }, {
9771 .eraseblocks = { {32 * 1024, 16} },
9772 .block_erase = spi_block_erase_52,
9773 }, {
9774 .eraseblocks = { {64 * 1024, 8} },
9775 .block_erase = spi_block_erase_d8,
9776 }, {
9777 .eraseblocks = { {512 * 1024, 1} },
9778 .block_erase = spi_block_erase_60,
9779 }, {
9780 .eraseblocks = { {512 * 1024, 1} },
9781 .block_erase = spi_block_erase_c7,
9782 },
9783 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009784 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009785 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009786 .write = spi_aai_write,
Peter Stugefd9217d2009-01-26 03:37:40 +00009787 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009788 .voltage = {2700, 3600},
Peter Stugefd9217d2009-01-26 03:37:40 +00009789 },
9790
9791 {
9792 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009793 .name = "SST25VF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009794 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009795 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009796 .model_id = SST_SST25VF080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009797 .total_size = 1024,
9798 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009799 .feature_bits = FEATURE_WRSR_EWSR,
John Schmergec965c2d2011-05-18 11:28:47 +00009800 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009801 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009802 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009803 .block_erasers =
9804 {
9805 {
9806 .eraseblocks = { {4 * 1024, 256} },
9807 .block_erase = spi_block_erase_20,
9808 }, {
9809 .eraseblocks = { {32 * 1024, 32} },
9810 .block_erase = spi_block_erase_52,
9811 }, {
9812 .eraseblocks = { {64 * 1024, 16} },
9813 .block_erase = spi_block_erase_d8,
9814 }, {
9815 .eraseblocks = { {1024 * 1024, 1} },
9816 .block_erase = spi_block_erase_60,
9817 }, {
9818 .eraseblocks = { {1024 * 1024, 1} },
9819 .block_erase = spi_block_erase_c7,
9820 },
9821 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009822 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009823 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009824 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009825 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009826 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009827 },
9828
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009829 {
9830 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +00009831 .name = "SST25WF512",
9832 .bustype = BUS_SPI,
9833 .manufacture_id = SST_ID,
9834 .model_id = SST_SST25WF512,
9835 .total_size = 64,
9836 .page_size = 256,
9837 .feature_bits = FEATURE_WRSR_EITHER,
9838 .tested = TEST_UNTESTED,
9839 .probe = probe_spi_rdid,
9840 .probe_timing = TIMING_ZERO,
9841 .block_erasers =
9842 {
9843 {
9844 .eraseblocks = { {4 * 1024, 16} },
9845 .block_erase = spi_block_erase_20,
9846 }, {
9847 .eraseblocks = { {32 * 1024, 2} },
9848 .block_erase = spi_block_erase_52,
9849 }, {
9850 .eraseblocks = { {1024 * 64, 1} },
9851 .block_erase = spi_block_erase_60,
9852 }, {
9853 .eraseblocks = { {1024 * 64, 1} },
9854 .block_erase = spi_block_erase_c7,
9855 },
9856 },
9857 .unlock = spi_disable_blockprotect,
9858 .write = spi_aai_write,
9859 .read = spi_chip_read, /* Fast read (0x0B) supported */
9860 .voltage = {1650, 1950},
9861 },
9862
9863 {
9864 .vendor = "SST",
9865 .name = "SST25WF010",
9866 .bustype = BUS_SPI,
9867 .manufacture_id = SST_ID,
9868 .model_id = SST_SST25WF010,
9869 .total_size = 128,
9870 .page_size = 256,
9871 .feature_bits = FEATURE_WRSR_EITHER,
9872 .tested = TEST_UNTESTED,
9873 .probe = probe_spi_rdid,
9874 .probe_timing = TIMING_ZERO,
9875 .block_erasers =
9876 {
9877 {
9878 .eraseblocks = { {4 * 1024, 32} },
9879 .block_erase = spi_block_erase_20,
9880 }, {
9881 .eraseblocks = { {32 * 1024, 4} },
9882 .block_erase = spi_block_erase_52,
9883 }, {
9884 .eraseblocks = { {1024 * 128, 1} },
9885 .block_erase = spi_block_erase_60,
9886 }, {
9887 .eraseblocks = { {1024 * 128, 1} },
9888 .block_erase = spi_block_erase_c7,
9889 },
9890 },
9891 .unlock = spi_disable_blockprotect,
9892 .write = spi_aai_write,
9893 .read = spi_chip_read, /* Fast read (0x0B) supported */
9894 .voltage = {1650, 1950},
9895 },
9896
9897 {
9898 .vendor = "SST",
9899 .name = "SST25WF020",
9900 .bustype = BUS_SPI,
9901 .manufacture_id = SST_ID,
9902 .model_id = SST_SST25WF020,
9903 .total_size = 256,
9904 .page_size = 256,
9905 .feature_bits = FEATURE_WRSR_EITHER,
9906 .tested = TEST_UNTESTED,
9907 .probe = probe_spi_rdid,
9908 .probe_timing = TIMING_ZERO,
9909 .block_erasers =
9910 {
9911 {
9912 .eraseblocks = { {4 * 1024, 64} },
9913 .block_erase = spi_block_erase_20,
9914 }, {
9915 .eraseblocks = { {32 * 1024, 8} },
9916 .block_erase = spi_block_erase_52,
9917 }, {
9918 .eraseblocks = { {64 * 1024, 4} },
9919 .block_erase = spi_block_erase_d8,
9920 }, {
9921 .eraseblocks = { {1024 * 256, 1} },
9922 .block_erase = spi_block_erase_60,
9923 }, {
9924 .eraseblocks = { {1024 * 256, 1} },
9925 .block_erase = spi_block_erase_c7,
9926 },
9927 },
9928 .unlock = spi_disable_blockprotect,
9929 .write = spi_aai_write,
9930 .read = spi_chip_read, /* Fast read (0x0B) supported */
9931 .voltage = {1650, 1950},
9932 },
9933
9934 {
9935 .vendor = "SST",
9936 .name = "SST25WF040",
9937 .bustype = BUS_SPI,
9938 .manufacture_id = SST_ID,
9939 .model_id = SST_SST25WF040,
9940 .total_size = 512,
9941 .page_size = 256,
9942 .feature_bits = FEATURE_WRSR_EITHER,
9943 .tested = TEST_UNTESTED,
9944 .probe = probe_spi_rdid,
9945 .probe_timing = TIMING_ZERO,
9946 .block_erasers =
9947 {
9948 {
9949 .eraseblocks = { {4 * 1024, 128} },
9950 .block_erase = spi_block_erase_20,
9951 }, {
9952 .eraseblocks = { {32 * 1024, 16} },
9953 .block_erase = spi_block_erase_52,
9954 }, {
9955 .eraseblocks = { {64 * 1024, 8} },
9956 .block_erase = spi_block_erase_d8,
9957 }, {
9958 .eraseblocks = { {1024 * 512, 1} },
9959 .block_erase = spi_block_erase_60,
9960 }, {
9961 .eraseblocks = { {1024 * 512, 1} },
9962 .block_erase = spi_block_erase_c7,
9963 },
9964 },
9965 .unlock = spi_disable_blockprotect,
9966 .write = spi_aai_write,
9967 .read = spi_chip_read, /* Fast read (0x0B) supported */
9968 .voltage = {1650, 1950},
9969 },
9970
9971 {
9972 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009973 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009974 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009975 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009976 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009977 .total_size = 512,
9978 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00009979 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009980 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009981 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +00009982 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009983 .block_erasers =
9984 {
9985 {
9986 .eraseblocks = { {128, 4096} },
9987 .block_erase = erase_sector_28sf040,
9988 }, {
9989 .eraseblocks = { {512 * 1024, 1} },
9990 .block_erase = erase_chip_28sf040,
9991 }
9992 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00009993 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009994 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009995 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009996 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009997 },
9998
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009999 {
10000 .vendor = "SST",
10001 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010002 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010003 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010004 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010005 .total_size = 128,
10006 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010007 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010008 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010009 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010010 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010011 .block_erasers =
10012 {
10013 {
10014 .eraseblocks = { {128 * 1024, 1} },
10015 .block_erase = erase_chip_block_jedec,
10016 }
10017 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010018 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010019 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010020 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010021 },
10022
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010023 {
10024 .vendor = "SST",
10025 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010026 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010027 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010028 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010029 .total_size = 128,
10030 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010031 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010032 .tested = TEST_UNTESTED,
10033 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010034 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010035 .block_erasers =
10036 {
10037 {
10038 .eraseblocks = { {128 * 1024, 1} },
10039 .block_erase = erase_chip_block_jedec,
10040 }
10041 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010042 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010043 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010044 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010045 },
10046
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010047 {
10048 .vendor = "SST",
10049 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010050 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010051 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010052 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010053 .total_size = 256,
10054 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010055 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010056 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010057 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010058 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010059 .block_erasers =
10060 {
10061 {
10062 .eraseblocks = { {256 * 1024, 1} },
10063 .block_erase = erase_chip_block_jedec,
10064 }
10065 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010066 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010067 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010068 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010069 },
10070
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010071 {
10072 .vendor = "SST",
10073 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010074 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010075 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010076 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010077 .total_size = 256,
10078 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010079 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010080 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010081 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010082 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010083 .block_erasers =
10084 {
10085 {
10086 .eraseblocks = { {256 * 1024, 1} },
10087 .block_erase = erase_chip_block_jedec,
10088 }
10089 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010090 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010091 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010092 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010093 },
10094
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010095 {
10096 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000010097 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010098 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010099 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010100 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010101 .total_size = 64,
10102 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010103 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000010104 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010105 .probe = probe_jedec,
10106 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000010107 .block_erasers =
10108 {
10109 {
10110 .eraseblocks = { {4 * 1024, 16} },
10111 .block_erase = erase_sector_jedec,
10112 }, {
10113 .eraseblocks = { {64 * 1024, 1} },
10114 .block_erase = erase_chip_block_jedec,
10115 }
10116 },
Sean Nelson35727f72010-01-28 23:55:12 +000010117 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010118 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010119 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000010120 },
10121
10122 {
10123 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010124 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010125 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010126 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010127 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010128 .total_size = 128,
10129 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010130 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000010131 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010132 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000010133 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010134 .block_erasers =
10135 {
10136 {
10137 .eraseblocks = { {4 * 1024, 32} },
10138 .block_erase = erase_sector_jedec,
10139 }, {
10140 .eraseblocks = { {128 * 1024, 1} },
10141 .block_erase = erase_chip_block_jedec,
10142 }
10143 },
Sean Nelson35727f72010-01-28 23:55:12 +000010144 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010145 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010146 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010147 },
10148
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010149 {
10150 .vendor = "SST",
10151 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010152 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010153 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010154 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010155 .total_size = 256,
10156 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010157 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000010158 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010159 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010160 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010161 .block_erasers =
10162 {
10163 {
10164 .eraseblocks = { {4 * 1024, 64} },
10165 .block_erase = erase_sector_jedec,
10166 }, {
10167 .eraseblocks = { {256 * 1024, 1} },
10168 .block_erase = erase_chip_block_jedec,
10169 }
10170 },
Sean Nelson35727f72010-01-28 23:55:12 +000010171 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010172 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010173 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010174 },
10175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010176 {
10177 .vendor = "SST",
10178 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010179 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010180 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010181 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010182 .total_size = 512,
10183 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010184 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010185 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010186 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010187 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010188 .block_erasers =
10189 {
10190 {
10191 .eraseblocks = { {4 * 1024, 128} },
10192 .block_erase = erase_sector_jedec,
10193 }, {
10194 .eraseblocks = { {512 * 1024, 1} },
10195 .block_erase = erase_chip_block_jedec,
10196 }
10197 },
Sean Nelson35727f72010-01-28 23:55:12 +000010198 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010199 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010200 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010201 },
10202
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010203 {
10204 .vendor = "SST",
10205 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010206 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010207 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010208 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010209 .total_size = 64,
10210 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010211 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000010212 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010213 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010214 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010215 .block_erasers =
10216 {
10217 {
10218 .eraseblocks = { {4 * 1024, 16} },
10219 .block_erase = erase_sector_jedec,
10220 }, {
10221 .eraseblocks = { {64 * 1024, 1} },
10222 .block_erase = erase_chip_block_jedec,
10223 }
10224 },
Sean Nelson35727f72010-01-28 23:55:12 +000010225 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010226 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010227 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010228 },
10229
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010230 {
10231 .vendor = "SST",
10232 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010233 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010234 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010235 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010236 .total_size = 128,
10237 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010238 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000010239 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010240 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010241 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010242 .block_erasers =
10243 {
10244 {
10245 .eraseblocks = { {4 * 1024, 32} },
10246 .block_erase = erase_sector_jedec,
10247 }, {
10248 .eraseblocks = { {128 * 1024, 1} },
10249 .block_erase = erase_chip_block_jedec,
10250 }
10251 },
Sean Nelson35727f72010-01-28 23:55:12 +000010252 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010253 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010254 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010255 },
10256
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010257 {
10258 .vendor = "SST",
10259 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010260 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010261 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010262 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010263 .total_size = 256,
10264 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010265 .feature_bits = FEATURE_EITHER_RESET,
10266 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010267 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010268 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010269 .block_erasers =
10270 {
10271 {
10272 .eraseblocks = { {4 * 1024, 64} },
10273 .block_erase = erase_sector_jedec,
10274 }, {
10275 .eraseblocks = { {256 * 1024, 1} },
10276 .block_erase = erase_chip_block_jedec,
10277 }
10278 },
Sean Nelson35727f72010-01-28 23:55:12 +000010279 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010280 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010281 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010282 },
10283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010284 {
10285 .vendor = "SST",
10286 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010287 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010288 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010289 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010290 .total_size = 512,
10291 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010292 .feature_bits = FEATURE_EITHER_RESET,
10293 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010294 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010295 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010296 .block_erasers =
10297 {
10298 {
10299 .eraseblocks = { {4 * 1024, 128} },
10300 .block_erase = erase_sector_jedec,
10301 }, {
10302 .eraseblocks = { {512 * 1024, 1} },
10303 .block_erase = erase_chip_block_jedec,
10304 }
10305 },
Sean Nelson35727f72010-01-28 23:55:12 +000010306 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010307 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010308 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000010309 },
FENG yu ningff692fb2008-12-08 18:15:10 +000010310
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010311 {
10312 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000010313 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010314 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000010315 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010316 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000010317 .total_size = 1024,
10318 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010319 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000010320 .tested = TEST_UNTESTED,
10321 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010322 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010323 .block_erasers =
10324 {
10325 {
10326 .eraseblocks = { {4 * 1024, 256} },
10327 .block_erase = erase_sector_jedec,
10328 }, {
10329 .eraseblocks = { {64 * 1024, 16} },
10330 .block_erase = erase_block_jedec,
10331 }, {
10332 .eraseblocks = { {1024 * 1024, 1} },
10333 .block_erase = erase_chip_block_jedec,
10334 }
10335 },
Sean Nelson35727f72010-01-28 23:55:12 +000010336 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010337 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010338 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000010339 },
10340
10341 {
10342 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010343 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010344 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010345 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010346 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010347 .total_size = 256,
10348 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010349 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010350 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010351 .probe = probe_jedec,
10352 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010353 .block_erasers =
10354 {
10355 {
10356 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010357 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010358 }, {
10359 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010360 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010361 }, {
10362 .eraseblocks = { {256 * 1024, 1} },
10363 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10364 }
10365 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010366 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010367 .unlock = unlock_sst_fwhub,
10368 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010369 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010370 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010371 },
10372
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010373 {
10374 .vendor = "SST",
10375 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010376 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010377 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010378 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010379 .total_size = 384,
10380 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010381 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000010382 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010383 .probe = probe_jedec,
10384 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010385 .block_erasers =
10386 {
10387 {
10388 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010389 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010390 }, {
10391 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010392 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010393 }, {
10394 .eraseblocks = { {384 * 1024, 1} },
10395 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10396 }
10397 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010398 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010399 .unlock = unlock_sst_fwhub,
10400 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010401 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010402 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010403 },
10404
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010405 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010406 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
10407 * and is only honored for 64k block erase, but not 4k sector erase.
10408 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010409 .vendor = "SST",
10410 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010411 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010412 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010413 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010414 .total_size = 512,
10415 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010416 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010417 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010418 .probe = probe_jedec,
10419 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010420 .block_erasers =
10421 {
10422 {
10423 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010424 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010425 }, {
10426 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010427 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010428 }, {
10429 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000010430 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010431 },
10432 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010433 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010434 .unlock = unlock_sst_fwhub,
10435 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010436 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010437 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010438 },
10439
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010440 {
10441 .vendor = "SST",
10442 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010443 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010444 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010445 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010446 .total_size = 512,
10447 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010448 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010449 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010450 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010451 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010452 .block_erasers =
10453 {
10454 {
10455 .eraseblocks = { {4 * 1024, 128} },
10456 .block_erase = erase_sector_49lfxxxc,
10457 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010458 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010459 {64 * 1024, 7},
10460 {32 * 1024, 1},
10461 {8 * 1024, 2},
10462 {16 * 1024, 1},
10463 },
Sean Nelson69e58112010-03-23 17:10:28 +000010464 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010465 }
10466 },
Sean Nelson69e58112010-03-23 17:10:28 +000010467 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010468 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010469 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010470 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010471 },
10472
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010473 {
10474 .vendor = "SST",
10475 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010476 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010477 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010478 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010479 .total_size = 1024,
10480 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010481 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010482 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010483 .probe = probe_jedec,
10484 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010485 .block_erasers =
10486 {
10487 {
10488 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010489 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010490 }, {
10491 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010492 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010493 }, {
10494 .eraseblocks = { {1024 * 1024, 1} },
10495 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10496 }
10497 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010498 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010499 .unlock = unlock_sst_fwhub,
10500 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010501 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010502 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010503 },
10504
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010505 {
10506 .vendor = "SST",
10507 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010508 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010509 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010510 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010511 .total_size = 1024,
10512 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010513 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010514 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010515 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010516 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010517 .block_erasers =
10518 {
10519 {
10520 .eraseblocks = { {4 * 1024, 256} },
10521 .block_erase = erase_sector_49lfxxxc,
10522 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010523 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010524 {64 * 1024, 15},
10525 {32 * 1024, 1},
10526 {8 * 1024, 2},
10527 {16 * 1024, 1},
10528 },
Sean Nelson69e58112010-03-23 17:10:28 +000010529 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010530 }
10531 },
Sean Nelson69e58112010-03-23 17:10:28 +000010532 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010533 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010534 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010535 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010536 },
10537
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010538 {
10539 .vendor = "SST",
10540 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010541 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010542 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010543 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010544 .total_size = 2048,
10545 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010546 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner2abab942012-04-27 20:41:23 +000010547 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010548 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010549 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010550 .block_erasers =
10551 {
10552 {
10553 .eraseblocks = { {4 * 1024, 512} },
10554 .block_erase = erase_sector_49lfxxxc,
10555 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010556 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010557 {64 * 1024, 31},
10558 {32 * 1024, 1},
10559 {8 * 1024, 2},
10560 {16 * 1024, 1},
10561 },
Sean Nelson69e58112010-03-23 17:10:28 +000010562 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010563 }
10564 },
Sean Nelson69e58112010-03-23 17:10:28 +000010565 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010566 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010567 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010568 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010569 },
10570
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010571 {
10572 .vendor = "SST",
10573 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010574 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010575 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010576 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010577 .total_size = 256,
10578 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010579 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000010580 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010581 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010582 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010583 .block_erasers =
10584 {
10585 {
10586 .eraseblocks = { {4 * 1024, 64} },
10587 .block_erase = erase_sector_jedec,
10588 }, {
10589 .eraseblocks = { {16 * 1024, 16} },
10590 .block_erase = erase_block_jedec,
10591 }, {
10592 .eraseblocks = { {256 * 1024, 1} },
10593 .block_erase = NULL,
10594 }
10595 },
Sean Nelson35727f72010-01-28 23:55:12 +000010596 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010597 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010598 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000010599 },
10600
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010601 {
10602 .vendor = "SST",
10603 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010604 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010605 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010606 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010607 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000010608 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010609 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010610 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010611 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010612 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010613 .block_erasers =
10614 {
10615 {
10616 .eraseblocks = { {4 * 1024, 64} },
10617 .block_erase = erase_sector_jedec,
10618 }, {
10619 .eraseblocks = { {16 * 1024, 16} },
10620 .block_erase = erase_block_jedec,
10621 }, {
10622 .eraseblocks = { {256 * 1024, 1} },
10623 .block_erase = NULL,
10624 }
10625 },
Sean Nelson35727f72010-01-28 23:55:12 +000010626 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010627 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010628 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010629 },
10630
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010631 {
10632 .vendor = "SST",
10633 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010634 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010635 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010636 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010637 .total_size = 512,
10638 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010639 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010640 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010641 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010642 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010643 .block_erasers =
10644 {
10645 {
10646 .eraseblocks = { {4 * 1024, 128} },
10647 .block_erase = erase_sector_jedec,
10648 }, {
10649 .eraseblocks = { {64 * 1024, 8} },
10650 .block_erase = erase_block_jedec,
10651 }, {
10652 .eraseblocks = { {512 * 1024, 1} },
10653 .block_erase = NULL,
10654 }
10655 },
Sean Nelson35727f72010-01-28 23:55:12 +000010656 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010657 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010658 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010659 },
10660
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010661 {
10662 .vendor = "SST",
10663 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010664 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010665 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010666 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010667 .total_size = 512,
10668 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010669 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010670 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010671 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010672 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010673 .block_erasers =
10674 {
10675 {
10676 .eraseblocks = { {4 * 1024, 128} },
10677 .block_erase = erase_sector_jedec,
10678 }, {
10679 .eraseblocks = { {64 * 1024, 8} },
10680 .block_erase = erase_block_jedec,
10681 }, {
10682 .eraseblocks = { {512 * 1024, 1} },
10683 .block_erase = NULL,
10684 }
10685 },
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010686 .unlock = unlock_82802ab,
Sean Nelson35727f72010-01-28 23:55:12 +000010687 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010688 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010689 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010690 },
10691
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010692 {
10693 .vendor = "SST",
10694 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010695 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010696 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010697 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010698 .total_size = 1024,
10699 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010700 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000010701 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010702 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010703 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010704 .block_erasers =
10705 {
10706 {
10707 .eraseblocks = { {4 * 1024, 256} },
10708 .block_erase = erase_sector_jedec,
10709 }, {
10710 .eraseblocks = { {64 * 1024, 16} },
10711 .block_erase = erase_block_jedec,
10712 }, {
10713 .eraseblocks = { {1024 * 1024, 1} },
10714 .block_erase = NULL,
10715 }
10716 },
Sean Nelson35727f72010-01-28 23:55:12 +000010717 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010718 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010719 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010720 },
10721
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010722 {
10723 .vendor = "SST",
10724 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010725 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010726 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010727 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010728 .total_size = 2048,
10729 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010730 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010731 .tested = TEST_OK_PRE,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010732 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010733 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010734 .block_erasers =
10735 {
10736 {
10737 .eraseblocks = { {4 * 1024, 512} },
10738 .block_erase = erase_sector_49lfxxxc,
10739 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010740 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010741 {64 * 1024, 31},
10742 {32 * 1024, 1},
10743 {8 * 1024, 2},
10744 {16 * 1024, 1},
10745 },
Sean Nelson69e58112010-03-23 17:10:28 +000010746 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010747 }
10748 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000010749 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010750 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010751 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010752 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010753 },
10754
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010755 {
10756 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010757 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010758 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010759 .manufacture_id = ST_ID,
10760 .model_id = ST_M29F002B,
10761 .total_size = 256,
10762 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010763 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010764 .tested = TEST_UNTESTED,
10765 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010766 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010767 .block_erasers =
10768 {
10769 {
10770 .eraseblocks = {
10771 {16 * 1024, 1},
10772 {8 * 1024, 2},
10773 {32 * 1024, 1},
10774 {64 * 1024, 3},
10775 },
10776 .block_erase = erase_sector_jedec,
10777 }, {
10778 .eraseblocks = { {256 * 1024, 1} },
10779 .block_erase = erase_chip_block_jedec,
10780 }
10781 },
Sean Nelson35727f72010-01-28 23:55:12 +000010782 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010783 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010784 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010785 },
10786
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010787 {
10788 .vendor = "ST",
10789 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010790 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010791 .manufacture_id = ST_ID,
10792 .model_id = ST_M29F002T,
10793 .total_size = 256,
10794 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010795 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010796 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010797 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010798 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010799 .block_erasers =
10800 {
10801 {
10802 .eraseblocks = {
10803 {64 * 1024, 3},
10804 {32 * 1024, 1},
10805 {8 * 1024, 2},
10806 {16 * 1024, 1},
10807 },
10808 .block_erase = erase_sector_jedec,
10809 }, {
10810 .eraseblocks = { {256 * 1024, 1} },
10811 .block_erase = erase_chip_block_jedec,
10812 }
10813 },
Sean Nelson35727f72010-01-28 23:55:12 +000010814 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010815 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010816 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010817 },
10818
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010819 {
10820 .vendor = "ST",
10821 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010822 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010823 .manufacture_id = ST_ID,
10824 .model_id = ST_M29F040B,
10825 .total_size = 512,
10826 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010827 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
10828 .tested = TEST_UNTESTED,
10829 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010830 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000010831 .block_erasers =
10832 {
10833 {
10834 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +000010835 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010836 }, {
10837 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010838 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010839 }
10840 },
Sean Nelson35727f72010-01-28 23:55:12 +000010841 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010842 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010843 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010844 },
10845
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010846 {
Sean Nelson35727f72010-01-28 23:55:12 +000010847 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010848 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010849 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010850 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010851 .manufacture_id = ST_ID,
10852 .model_id = ST_M29F400BB,
10853 .total_size = 512,
10854 .page_size = 64 * 1024,
10855 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010856 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010857 .probe = probe_m29f400bt,
10858 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
10859 .block_erasers =
10860 {
10861 {
10862 .eraseblocks = {
10863 {16 * 1024, 1},
10864 {8 * 1024, 2},
10865 {32 * 1024, 1},
10866 {64 * 1024, 7},
10867 },
10868 .block_erase = block_erase_m29f400bt,
10869 }, {
10870 .eraseblocks = { {512 * 1024, 1} },
10871 .block_erase = block_erase_chip_m29f400bt,
10872 }
10873 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010874 .write = write_m29f400bt,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010875 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010876 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010877 },
10878 {
10879 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
10880 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010881 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010882 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010883 .manufacture_id = ST_ID,
10884 .model_id = ST_M29F400BT,
10885 .total_size = 512,
10886 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010887 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010888 .tested = TEST_UNTESTED,
10889 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010890 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010891 .block_erasers =
10892 {
10893 {
10894 .eraseblocks = {
10895 {64 * 1024, 7},
10896 {32 * 1024, 1},
10897 {8 * 1024, 2},
10898 {16 * 1024, 1},
10899 },
10900 .block_erase = block_erase_m29f400bt,
10901 }, {
10902 .eraseblocks = { {512 * 1024, 1} },
10903 .block_erase = block_erase_chip_m29f400bt,
10904 }
10905 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010906 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010907 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010908 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010909 },
10910
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010911 {
10912 .vendor = "ST",
10913 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010914 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010915 .manufacture_id = ST_ID,
10916 .model_id = ST_M29W010B,
10917 .total_size = 128,
10918 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010919 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010920 .tested = TEST_UNTESTED,
10921 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010922 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010923 .block_erasers =
10924 {
10925 {
10926 .eraseblocks = { {16 * 1024, 8}, },
10927 .block_erase = erase_sector_jedec,
10928 }, {
10929 .eraseblocks = { {128 * 1024, 1} },
10930 .block_erase = erase_chip_block_jedec,
10931 }
10932 },
Sean Nelson35727f72010-01-28 23:55:12 +000010933 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010934 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010935 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010936 },
10937
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010938 {
10939 .vendor = "ST",
10940 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010941 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010942 .manufacture_id = ST_ID,
10943 .model_id = ST_M29W040B,
10944 .total_size = 512,
10945 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010946 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010947 .tested = TEST_UNTESTED,
10948 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010949 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010950 .block_erasers =
10951 {
10952 {
10953 .eraseblocks = { {64 * 1024, 8}, },
10954 .block_erase = erase_sector_jedec,
10955 }, {
10956 .eraseblocks = { {512 * 1024, 1} },
10957 .block_erase = erase_chip_block_jedec,
10958 }
10959 },
Sean Nelson35727f72010-01-28 23:55:12 +000010960 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010961 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010962 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010963 },
10964
Stefan Taunereb582572012-09-21 12:52:50 +000010965 {
10966 .vendor = "ST",
10967 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010968 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000010969 .manufacture_id = ST_ID,
10970 .model_id = ST_M29W512B,
10971 .total_size = 64,
10972 .page_size = 64 * 1024,
10973 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010974 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000010975 .probe = probe_jedec,
10976 .probe_timing = TIMING_ZERO,
10977 .block_erasers =
10978 {
10979 {
10980 .eraseblocks = { {64 * 1024, 1} },
10981 .block_erase = erase_chip_block_jedec,
10982 }
10983 },
10984 .write = write_jedec_1,
10985 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010986 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000010987 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000010988
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010989 {
10990 .vendor = "ST",
10991 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010992 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010993 .manufacture_id = ST_ID,
10994 .model_id = ST_M50FLW040A,
10995 .total_size = 512,
10996 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010997 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010998 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010999 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011000 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011001 .block_erasers =
11002 {
11003 {
Sean Nelson329bde72010-01-19 16:39:19 +000011004 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011005 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011006 {64 * 1024, 5}, /* block */
11007 {4 * 1024, 16}, /* sector */
11008 {4 * 1024, 16}, /* sector */
11009 },
11010 .block_erase = NULL,
11011 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011012 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011013 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011014 }
11015 },
Sean Nelson28accc22010-03-19 18:47:06 +000011016 .unlock = unlock_stm50flw0x0x,
11017 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011018 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011019 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011020 },
11021
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011022 {
11023 .vendor = "ST",
11024 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011025 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011026 .manufacture_id = ST_ID,
11027 .model_id = ST_M50FLW040B,
11028 .total_size = 512,
11029 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011030 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011031 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011032 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011033 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011034 .block_erasers =
11035 {
11036 {
Sean Nelson329bde72010-01-19 16:39:19 +000011037 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011038 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011039 {4 * 1024, 16}, /* sector */
11040 {64 * 1024, 5}, /* block */
11041 {4 * 1024, 16}, /* sector */
11042 },
11043 .block_erase = NULL,
11044 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011045 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011046 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011047 }
11048 },
Sean Nelson28accc22010-03-19 18:47:06 +000011049 .unlock = unlock_stm50flw0x0x,
11050 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011051 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011052 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011053 },
11054
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011055 {
11056 .vendor = "ST",
11057 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011058 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011059 .manufacture_id = ST_ID,
11060 .model_id = ST_M50FLW080A,
11061 .total_size = 1024,
11062 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011063 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011064 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000011065 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011066 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011067 .block_erasers =
11068 {
11069 {
Sean Nelson329bde72010-01-19 16:39:19 +000011070 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011071 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011072 {64 * 1024, 13}, /* block */
11073 {4 * 1024, 16}, /* sector */
11074 {4 * 1024, 16}, /* sector */
11075 },
11076 .block_erase = NULL,
11077 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011078 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011079 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011080 }
11081 },
Sean Nelson28accc22010-03-19 18:47:06 +000011082 .unlock = unlock_stm50flw0x0x,
11083 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011084 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011085 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011086 },
11087
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011088 {
11089 .vendor = "ST",
11090 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011091 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011092 .manufacture_id = ST_ID,
11093 .model_id = ST_M50FLW080B,
11094 .total_size = 1024,
11095 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011096 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011097 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011098 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011099 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011100 .block_erasers =
11101 {
11102 {
Sean Nelson329bde72010-01-19 16:39:19 +000011103 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011104 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011105 {4 * 1024, 16}, /* sector */
11106 {64 * 1024, 13}, /* block */
11107 {4 * 1024, 16}, /* sector */
11108 },
11109 .block_erase = NULL,
11110 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011111 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011112 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011113 }
11114 },
Sean Nelson28accc22010-03-19 18:47:06 +000011115 .unlock = unlock_stm50flw0x0x,
11116 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011117 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011118 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011119 },
11120
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011121 {
11122 .vendor = "ST",
11123 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011124 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011125 .manufacture_id = ST_ID,
11126 .model_id = ST_M50FW002,
11127 .total_size = 256,
11128 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011129 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011130 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011131 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011132 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011133 .block_erasers =
11134 {
11135 {
11136 .eraseblocks = {
11137 {64 * 1024, 3},
11138 {32 * 1024, 1},
11139 {8 * 1024, 2},
11140 {16 * 1024, 1},
11141 },
Sean Nelson28accc22010-03-19 18:47:06 +000011142 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011143 }
11144 },
Sean Nelson28accc22010-03-19 18:47:06 +000011145 .unlock = unlock_stm50flw0x0x,
11146 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011147 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011148 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011149 },
11150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011151 {
11152 .vendor = "ST",
11153 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011154 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011155 .manufacture_id = ST_ID,
11156 .model_id = ST_M50FW016,
11157 .total_size = 2048,
11158 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011159 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011160 .tested = TEST_UNTESTED,
11161 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011162 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011163 .block_erasers =
11164 {
11165 {
11166 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011167 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011168 }
11169 },
Sean Nelson28accc22010-03-19 18:47:06 +000011170 .unlock = unlock_stm50flw0x0x,
11171 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011172 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011173 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011174 },
11175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011176 {
11177 .vendor = "ST",
11178 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011179 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011180 .manufacture_id = ST_ID,
11181 .model_id = ST_M50FW040,
11182 .total_size = 512,
11183 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011184 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000011185 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011186 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011187 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011188 .block_erasers =
11189 {
11190 {
11191 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011192 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011193 }
11194 },
Sean Nelson28accc22010-03-19 18:47:06 +000011195 .unlock = unlock_stm50flw0x0x,
11196 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011197 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011198 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011199 },
11200
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011201 {
11202 .vendor = "ST",
11203 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011204 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011205 .manufacture_id = ST_ID,
11206 .model_id = ST_M50FW080,
11207 .total_size = 1024,
11208 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011209 .feature_bits = FEATURE_REGISTERMAP,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011210 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011211 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011212 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011213 .block_erasers =
11214 {
11215 {
11216 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011217 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011218 }
11219 },
Sean Nelson28accc22010-03-19 18:47:06 +000011220 .unlock = unlock_stm50flw0x0x,
11221 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011222 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011223 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011224 },
11225
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011226 {
11227 .vendor = "ST",
11228 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011229 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011230 .manufacture_id = ST_ID,
11231 .model_id = ST_M50LPW116,
11232 .total_size = 2048,
11233 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011234 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011235 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011236 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000011237 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011238 .block_erasers =
11239 {
11240 {
11241 .eraseblocks = {
11242 {4 * 1024, 16},
11243 {64 * 1024, 30},
11244 {32 * 1024, 1},
11245 {8 * 1024, 2},
11246 {16 * 1024, 1},
11247 },
Sean Nelson28accc22010-03-19 18:47:06 +000011248 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011249 }
11250 },
Sean Nelson28accc22010-03-19 18:47:06 +000011251 .unlock = unlock_stm50flw0x0x,
11252 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011253 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011254 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011255 },
11256
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011257 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011258 .vendor = "SyncMOS/MoselVitelic",
11259 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011260 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011261 .manufacture_id = SYNCMOS_MVC_ID,
11262 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011263 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011264 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000011265 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011266 .tested = TEST_UNTESTED,
11267 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011268 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011269 .block_erasers =
11270 {
11271 {
11272 .eraseblocks = { {512, 256} },
11273 .block_erase = erase_sector_jedec,
11274 }, {
11275 .eraseblocks = { {128 * 1024, 1} },
11276 .block_erase = erase_chip_block_jedec,
11277 },
11278 },
Sean Nelson35727f72010-01-28 23:55:12 +000011279 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011280 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011281 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011282 },
11283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011284 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011285 .vendor = "SyncMOS/MoselVitelic",
11286 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011287 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011288 .manufacture_id = SYNCMOS_MVC_ID,
11289 .model_id = SM_MVC_29C51001T,
11290 .total_size = 128,
11291 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000011292 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011293 .tested = TEST_UNTESTED,
11294 .probe = probe_jedec,
11295 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11296 .block_erasers =
11297 {
11298 {
11299 .eraseblocks = { {512, 256} },
11300 .block_erase = erase_sector_jedec,
11301 }, {
11302 .eraseblocks = { {128 * 1024, 1} },
11303 .block_erase = erase_chip_block_jedec,
11304 },
11305 },
11306 .write = write_jedec_1,
11307 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011308 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011309 },
11310
11311 {
11312 .vendor = "SyncMOS/MoselVitelic",
11313 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011314 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011315 .manufacture_id = SYNCMOS_MVC_ID,
11316 .model_id = SM_MVC_29C51002B,
11317 .total_size = 256,
11318 .page_size = 512,
11319 .feature_bits = FEATURE_EITHER_RESET,
11320 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011321 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011322 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011323 .block_erasers =
11324 {
11325 {
11326 .eraseblocks = { {512, 512} },
11327 .block_erase = erase_sector_jedec,
11328 }, {
11329 .eraseblocks = { {256 * 1024, 1} },
11330 .block_erase = erase_chip_block_jedec,
11331 },
11332 },
Sean Nelson35727f72010-01-28 23:55:12 +000011333 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011334 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000011335 },
11336
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011337 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011338 .vendor = "SyncMOS/MoselVitelic",
11339 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011340 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011341 .manufacture_id = SYNCMOS_MVC_ID,
11342 .model_id = SM_MVC_29C51002T,
11343 .total_size = 256,
11344 .page_size = 512,
11345 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011346 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011347 .probe = probe_jedec,
11348 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11349 .block_erasers =
11350 {
11351 {
11352 .eraseblocks = { {512, 512} },
11353 .block_erase = erase_sector_jedec,
11354 }, {
11355 .eraseblocks = { {256 * 1024, 1} },
11356 .block_erase = erase_chip_block_jedec,
11357 },
11358 },
11359 .write = write_jedec_1,
11360 .read = read_memmapped,
11361 },
11362
11363 {
11364 .vendor = "SyncMOS/MoselVitelic",
11365 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011366 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011367 .manufacture_id = SYNCMOS_MVC_ID,
11368 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011369 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011370 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011371 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011372 .tested = TEST_UNTESTED,
11373 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011374 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000011375 .block_erasers =
11376 {
11377 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011378 .eraseblocks = { {1024, 512} },
11379 .block_erase = erase_sector_jedec,
11380 }, {
11381 .eraseblocks = { {512 * 1024, 1} },
11382 .block_erase = erase_chip_block_jedec,
11383 },
11384 },
11385 .write = write_jedec_1,
11386 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011387 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011388 },
11389
11390 {
11391 .vendor = "SyncMOS/MoselVitelic",
11392 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011393 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011394 .manufacture_id = SYNCMOS_MVC_ID,
11395 .model_id = SM_MVC_29C51004T,
11396 .total_size = 512,
11397 .page_size = 1024,
11398 .feature_bits = FEATURE_EITHER_RESET,
11399 .tested = TEST_UNTESTED,
11400 .probe = probe_jedec,
11401 .probe_timing = TIMING_ZERO,
11402 .block_erasers =
11403 {
11404 {
11405 .eraseblocks = { {1024, 512} },
11406 .block_erase = erase_sector_jedec,
11407 }, {
11408 .eraseblocks = { {512 * 1024, 1} },
11409 .block_erase = erase_chip_block_jedec,
11410 },
11411 },
11412 .write = write_jedec_1,
11413 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011414 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011415 },
11416
11417 {
11418 .vendor = "SyncMOS/MoselVitelic",
11419 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011420 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011421 .manufacture_id = SYNCMOS_MVC_ID,
11422 .model_id = SM_MVC_29C31004B,
11423 .total_size = 512,
11424 .page_size = 1024,
11425 .feature_bits = FEATURE_EITHER_RESET,
11426 .tested = TEST_UNTESTED,
11427 .probe = probe_jedec,
11428 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11429 .block_erasers =
11430 {
11431 {
11432 .eraseblocks = { {1024, 512} },
11433 .block_erase = erase_sector_jedec,
11434 }, {
11435 .eraseblocks = { {512 * 1024, 1} },
11436 .block_erase = erase_chip_block_jedec,
11437 },
11438 },
11439 .write = write_jedec_1,
11440 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011441 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011442 },
11443
11444 {
11445 .vendor = "SyncMOS/MoselVitelic",
11446 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011447 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011448 .manufacture_id = SYNCMOS_MVC_ID,
11449 .model_id = SM_MVC_29C31004T,
11450 .total_size = 512,
11451 .page_size = 1024,
11452 .feature_bits = FEATURE_EITHER_RESET,
11453 .tested = TEST_UNTESTED,
11454 .probe = probe_jedec,
11455 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11456 .block_erasers =
11457 {
11458 {
11459 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000011460 .block_erase = erase_sector_jedec,
11461 }, {
11462 .eraseblocks = { {512 * 1024, 1} },
11463 .block_erase = erase_chip_block_jedec,
11464 },
11465 },
Sean Nelson35727f72010-01-28 23:55:12 +000011466 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011467 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011468 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011469 },
11470
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011471 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011472 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011473 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011474 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011475 .manufacture_id = TI_OLD_ID,
11476 .model_id = TI_TMS29F002RB,
11477 .total_size = 256,
11478 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011479 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011480 .tested = TEST_UNTESTED,
11481 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011482 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011483 .block_erasers =
11484 {
11485 {
11486 .eraseblocks = {
11487 {16 * 1024, 1},
11488 {8 * 1024, 2},
11489 {32 * 1024, 1},
11490 {64 * 1024, 3},
11491 },
11492 .block_erase = erase_sector_jedec,
11493 }, {
11494 .eraseblocks = { {256 * 1024, 1} },
11495 .block_erase = erase_chip_block_jedec,
11496 },
11497 },
Sean Nelson35727f72010-01-28 23:55:12 +000011498 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011499 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011500 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011501 },
11502
11503 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011504 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011505 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011506 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011507 .manufacture_id = TI_OLD_ID,
11508 .model_id = TI_TMS29F002RT,
11509 .total_size = 256,
11510 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011511 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011512 .tested = TEST_UNTESTED,
11513 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011514 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011515 .block_erasers =
11516 {
11517 {
11518 .eraseblocks = {
11519 {64 * 1024, 3},
11520 {32 * 1024, 1},
11521 {8 * 1024, 2},
11522 {16 * 1024, 1},
11523 },
11524 .block_erase = erase_sector_jedec,
11525 }, {
11526 .eraseblocks = { {256 * 1024, 1} },
11527 .block_erase = erase_chip_block_jedec,
11528 },
11529 },
Sean Nelson35727f72010-01-28 23:55:12 +000011530 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011531 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011532 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011533 },
11534
11535 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011536 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011537 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011538 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011539 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011540 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011541 .total_size = 1024,
11542 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011543 /* supports SFDP */
11544 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011545 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011546 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011547 .probe = probe_spi_rdid,
11548 .probe_timing = TIMING_ZERO,
11549 .block_erasers =
11550 {
11551 {
11552 .eraseblocks = { {4 * 1024, 256} },
11553 .block_erase = spi_block_erase_20,
11554 }, {
11555 .eraseblocks = { {32 * 1024, 32} },
11556 .block_erase = spi_block_erase_52,
11557 }, {
11558 .eraseblocks = { {64 * 1024, 16} },
11559 .block_erase = spi_block_erase_d8,
11560 }, {
11561 .eraseblocks = { {1024 * 1024, 1} },
11562 .block_erase = spi_block_erase_60,
11563 }, {
11564 .eraseblocks = { {1024 * 1024, 1} },
11565 .block_erase = spi_block_erase_c7,
11566 }
11567 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011568 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011569 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011570 .write = spi_chip_write_256,
11571 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011572 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011573 },
11574
11575 {
11576 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011577 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011578 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011579 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011580 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011581 .total_size = 2048,
11582 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011583 /* supports SFDP */
11584 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011585 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000011586 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011587 .probe = probe_spi_rdid,
11588 .probe_timing = TIMING_ZERO,
11589 .block_erasers =
11590 {
11591 {
11592 .eraseblocks = { {4 * 1024, 512} },
11593 .block_erase = spi_block_erase_20,
11594 }, {
11595 .eraseblocks = { {32 * 1024, 64} },
11596 .block_erase = spi_block_erase_52,
11597 }, {
11598 .eraseblocks = { {64 * 1024, 32} },
11599 .block_erase = spi_block_erase_d8,
11600 }, {
11601 .eraseblocks = { {2 * 1024 * 1024, 1} },
11602 .block_erase = spi_block_erase_60,
11603 }, {
11604 .eraseblocks = { {2 * 1024 * 1024, 1} },
11605 .block_erase = spi_block_erase_c7,
11606 }
11607 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011608 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011609 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011610 .write = spi_chip_write_256,
11611 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011612 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011613 },
11614
11615 {
11616 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011617 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011618 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011619 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011620 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011621 .total_size = 4096,
11622 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011623 /* supports SFDP */
11624 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011625 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011626 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011627 .probe = probe_spi_rdid,
11628 .probe_timing = TIMING_ZERO,
11629 .block_erasers =
11630 {
11631 {
11632 .eraseblocks = { {4 * 1024, 1024} },
11633 .block_erase = spi_block_erase_20,
11634 }, {
11635 .eraseblocks = { {32 * 1024, 128} },
11636 .block_erase = spi_block_erase_52,
11637 }, {
11638 .eraseblocks = { {64 * 1024, 64} },
11639 .block_erase = spi_block_erase_d8,
11640 }, {
11641 .eraseblocks = { {4 * 1024 * 1024, 1} },
11642 .block_erase = spi_block_erase_60,
11643 }, {
11644 .eraseblocks = { {4 * 1024 * 1024, 1} },
11645 .block_erase = spi_block_erase_c7,
11646 }
11647 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011648 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011649 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011650 .write = spi_chip_write_256,
11651 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011652 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011653 },
11654
11655 {
11656 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011657 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011658 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000011659 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011660 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000011661 .total_size = 8192,
11662 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011663 /* supports SFDP */
11664 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011665 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011666 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000011667 .probe = probe_spi_rdid,
11668 .probe_timing = TIMING_ZERO,
11669 .block_erasers =
11670 {
11671 {
11672 .eraseblocks = { {4 * 1024, 2048} },
11673 .block_erase = spi_block_erase_20,
11674 }, {
11675 .eraseblocks = { {32 * 1024, 256} },
11676 .block_erase = spi_block_erase_52,
11677 }, {
11678 .eraseblocks = { {64 * 1024, 128} },
11679 .block_erase = spi_block_erase_d8,
11680 }, {
11681 .eraseblocks = { {8 * 1024 * 1024, 1} },
11682 .block_erase = spi_block_erase_60,
11683 }, {
11684 .eraseblocks = { {8 * 1024 * 1024, 1} },
11685 .block_erase = spi_block_erase_c7,
11686 }
11687 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011688 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011689 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000011690 .write = spi_chip_write_256,
11691 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011692 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000011693 },
11694
11695 {
11696 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011697 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011698 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011699 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011700 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011701 .total_size = 16384,
11702 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011703 /* supports SFDP */
11704 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011705 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011706 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011707 .probe = probe_spi_rdid,
11708 .probe_timing = TIMING_ZERO,
11709 .block_erasers =
11710 {
11711 {
11712 .eraseblocks = { {4 * 1024, 4096} },
11713 .block_erase = spi_block_erase_20,
11714 }, {
11715 .eraseblocks = { {32 * 1024, 512} },
11716 .block_erase = spi_block_erase_52,
11717 }, {
11718 .eraseblocks = { {64 * 1024, 256} },
11719 .block_erase = spi_block_erase_d8,
11720 }, {
11721 .eraseblocks = { {16 * 1024 * 1024, 1} },
11722 .block_erase = spi_block_erase_60,
11723 }, {
11724 .eraseblocks = { {16 * 1024 * 1024, 1} },
11725 .block_erase = spi_block_erase_c7,
11726 }
11727 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011728 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011729 .unlock = spi_disable_blockprotect,
11730 .write = spi_chip_write_256,
11731 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011732 .voltage = {2700, 3600},
11733 },
11734
11735 {
11736 .vendor = "Winbond",
11737 .name = "W25Q20.W",
11738 .bustype = BUS_SPI,
11739 .manufacture_id = WINBOND_NEX_ID,
11740 .model_id = WINBOND_NEX_W25Q20_W,
11741 .total_size = 256,
11742 .page_size = 256,
11743 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11744 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11745 .tested = TEST_UNTESTED,
11746 .probe = probe_spi_rdid,
11747 .probe_timing = TIMING_ZERO,
11748 .block_erasers =
11749 {
11750 {
11751 .eraseblocks = { {4 * 1024, 64} },
11752 .block_erase = spi_block_erase_20,
11753 }, {
11754 .eraseblocks = { {32 * 1024, 8} },
11755 .block_erase = spi_block_erase_52,
11756 }, {
11757 .eraseblocks = { {64 * 1024, 4} },
11758 .block_erase = spi_block_erase_d8,
11759 }, {
11760 .eraseblocks = { {256 * 1024, 1} },
11761 .block_erase = spi_block_erase_60,
11762 }, {
11763 .eraseblocks = { {256 * 1024, 1} },
11764 .block_erase = spi_block_erase_c7,
11765 }
11766 },
11767 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11768 .unlock = spi_disable_blockprotect,
11769 .write = spi_chip_write_256,
11770 .read = spi_chip_read,
11771 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11772 },
11773
11774 {
11775 .vendor = "Winbond",
11776 .name = "W25Q40.W",
11777 .bustype = BUS_SPI,
11778 .manufacture_id = WINBOND_NEX_ID,
11779 .model_id = WINBOND_NEX_W25Q40_W,
11780 .total_size = 512,
11781 .page_size = 256,
11782 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11783 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11784 .tested = TEST_UNTESTED,
11785 .probe = probe_spi_rdid,
11786 .probe_timing = TIMING_ZERO,
11787 .block_erasers =
11788 {
11789 {
11790 .eraseblocks = { {4 * 1024, 128} },
11791 .block_erase = spi_block_erase_20,
11792 }, {
11793 .eraseblocks = { {32 * 1024, 16} },
11794 .block_erase = spi_block_erase_52,
11795 }, {
11796 .eraseblocks = { {64 * 1024, 8} },
11797 .block_erase = spi_block_erase_d8,
11798 }, {
11799 .eraseblocks = { {512 * 1024, 1} },
11800 .block_erase = spi_block_erase_60,
11801 }, {
11802 .eraseblocks = { {512 * 1024, 1} },
11803 .block_erase = spi_block_erase_c7,
11804 }
11805 },
11806 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11807 .unlock = spi_disable_blockprotect,
11808 .write = spi_chip_write_256,
11809 .read = spi_chip_read,
11810 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11811 },
11812
11813 {
11814 .vendor = "Winbond",
11815 .name = "W25Q80.W",
11816 .bustype = BUS_SPI,
11817 .manufacture_id = WINBOND_NEX_ID,
11818 .model_id = WINBOND_NEX_W25Q80_W,
11819 .total_size = 1024,
11820 .page_size = 256,
11821 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11822 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11823 .tested = TEST_UNTESTED,
11824 .probe = probe_spi_rdid,
11825 .probe_timing = TIMING_ZERO,
11826 .block_erasers =
11827 {
11828 {
11829 .eraseblocks = { {4 * 1024, 256} },
11830 .block_erase = spi_block_erase_20,
11831 }, {
11832 .eraseblocks = { {32 * 1024, 32} },
11833 .block_erase = spi_block_erase_52,
11834 }, {
11835 .eraseblocks = { {64 * 1024, 16} },
11836 .block_erase = spi_block_erase_d8,
11837 }, {
11838 .eraseblocks = { {1 * 1024 * 1024, 1} },
11839 .block_erase = spi_block_erase_60,
11840 }, {
11841 .eraseblocks = { {1 * 1024 * 1024, 1} },
11842 .block_erase = spi_block_erase_c7,
11843 }
11844 },
11845 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11846 .unlock = spi_disable_blockprotect,
11847 .write = spi_chip_write_256,
11848 .read = spi_chip_read,
11849 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11850 },
11851
11852 {
11853 .vendor = "Winbond",
11854 .name = "W25Q16.W",
11855 .bustype = BUS_SPI,
11856 .manufacture_id = WINBOND_NEX_ID,
11857 .model_id = WINBOND_NEX_W25Q16_W,
11858 .total_size = 2048,
11859 .page_size = 256,
11860 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11861 /* QPI enable 0x38, disable 0xFF */
11862 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11863 .tested = TEST_UNTESTED,
11864 .probe = probe_spi_rdid,
11865 .probe_timing = TIMING_ZERO,
11866 .block_erasers =
11867 {
11868 {
11869 .eraseblocks = { {4 * 1024, 512} },
11870 .block_erase = spi_block_erase_20,
11871 }, {
11872 .eraseblocks = { {32 * 1024, 64} },
11873 .block_erase = spi_block_erase_52,
11874 }, {
11875 .eraseblocks = { {64 * 1024, 32} },
11876 .block_erase = spi_block_erase_d8,
11877 }, {
11878 .eraseblocks = { {2 * 1024 * 1024, 1} },
11879 .block_erase = spi_block_erase_60,
11880 }, {
11881 .eraseblocks = { {2 * 1024 * 1024, 1} },
11882 .block_erase = spi_block_erase_c7,
11883 }
11884 },
11885 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11886 .unlock = spi_disable_blockprotect,
11887 .write = spi_chip_write_256,
11888 .read = spi_chip_read,
11889 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11890 },
11891
11892 {
11893 .vendor = "Winbond",
11894 .name = "W25Q32.W",
11895 .bustype = BUS_SPI,
11896 .manufacture_id = WINBOND_NEX_ID,
11897 .model_id = WINBOND_NEX_W25Q32_W,
11898 .total_size = 4096,
11899 .page_size = 256,
11900 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11901 /* QPI enable 0x38, disable 0xFF */
11902 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11903 .tested = TEST_OK_PREW,
11904 .probe = probe_spi_rdid,
11905 .probe_timing = TIMING_ZERO,
11906 .block_erasers =
11907 {
11908 {
11909 .eraseblocks = { {4 * 1024, 1024} },
11910 .block_erase = spi_block_erase_20,
11911 }, {
11912 .eraseblocks = { {32 * 1024, 128} },
11913 .block_erase = spi_block_erase_52,
11914 }, {
11915 .eraseblocks = { {64 * 1024, 64} },
11916 .block_erase = spi_block_erase_d8,
11917 }, {
11918 .eraseblocks = { {4 * 1024 * 1024, 1} },
11919 .block_erase = spi_block_erase_60,
11920 }, {
11921 .eraseblocks = { {4 * 1024 * 1024, 1} },
11922 .block_erase = spi_block_erase_c7,
11923 }
11924 },
11925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11926 .unlock = spi_disable_blockprotect,
11927 .write = spi_chip_write_256,
11928 .read = spi_chip_read,
11929 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11930 },
11931
11932 {
11933 .vendor = "Winbond",
11934 .name = "W25Q64.W",
11935 .bustype = BUS_SPI,
11936 .manufacture_id = WINBOND_NEX_ID,
11937 .model_id = WINBOND_NEX_W25Q64_W,
11938 .total_size = 8192,
11939 .page_size = 256,
11940 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11941 /* QPI enable 0x38, disable 0xFF */
11942 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011943 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011944 .probe = probe_spi_rdid,
11945 .probe_timing = TIMING_ZERO,
11946 .block_erasers =
11947 {
11948 {
11949 .eraseblocks = { {4 * 1024, 2048} },
11950 .block_erase = spi_block_erase_20,
11951 }, {
11952 .eraseblocks = { {32 * 1024, 256} },
11953 .block_erase = spi_block_erase_52,
11954 }, {
11955 .eraseblocks = { {64 * 1024, 128} },
11956 .block_erase = spi_block_erase_d8,
11957 }, {
11958 .eraseblocks = { {8 * 1024 * 1024, 1} },
11959 .block_erase = spi_block_erase_60,
11960 }, {
11961 .eraseblocks = { {8 * 1024 * 1024, 1} },
11962 .block_erase = spi_block_erase_c7,
11963 }
11964 },
11965 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11966 .unlock = spi_disable_blockprotect,
11967 .write = spi_chip_write_256,
11968 .read = spi_chip_read,
11969 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011970 },
11971
11972 {
11973 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011974 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011975 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011976 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011977 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011978 .total_size = 128,
11979 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011980 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011981 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011982 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011983 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011984 .block_erasers =
11985 {
11986 {
11987 .eraseblocks = { {4 * 1024, 32} },
11988 .block_erase = spi_block_erase_20,
11989 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011990 .eraseblocks = { {64 * 1024, 2} },
11991 .block_erase = spi_block_erase_d8,
11992 }, {
11993 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011994 .block_erase = spi_block_erase_c7,
11995 }
11996 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011997 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011998 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011999 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012000 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012001 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012002 },
12003
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012004 {
12005 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012006 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012007 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012008 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012009 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012010 .total_size = 256,
12011 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012012 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012013 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012014 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012015 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012016 .block_erasers =
12017 {
12018 {
12019 .eraseblocks = { {4 * 1024, 64} },
12020 .block_erase = spi_block_erase_20,
12021 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012022 .eraseblocks = { {64 * 1024, 4} },
12023 .block_erase = spi_block_erase_d8,
12024 }, {
12025 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012026 .block_erase = spi_block_erase_c7,
12027 }
12028 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012029 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012030 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012031 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012032 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012033 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012034 },
12035
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012036 {
12037 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012038 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012039 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012040 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012041 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012042 .total_size = 512,
12043 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012044 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000012045 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012046 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012047 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012048 .block_erasers =
12049 {
12050 {
12051 .eraseblocks = { {4 * 1024, 128} },
12052 .block_erase = spi_block_erase_20,
12053 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012054 .eraseblocks = { {64 * 1024, 8} },
12055 .block_erase = spi_block_erase_d8,
12056 }, {
12057 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012058 .block_erase = spi_block_erase_c7,
12059 }
12060 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012061 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012062 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012063 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012064 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012065 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012066 },
12067
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012068 {
12069 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012070 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012071 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012072 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012073 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012074 .total_size = 1024,
12075 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012076 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000012077 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012078 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012079 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012080 .block_erasers =
12081 {
12082 {
12083 .eraseblocks = { {4 * 1024, 256} },
12084 .block_erase = spi_block_erase_20,
12085 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012086 .eraseblocks = { {64 * 1024, 16} },
12087 .block_erase = spi_block_erase_d8,
12088 }, {
12089 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012090 .block_erase = spi_block_erase_c7,
12091 }
12092 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012093 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012094 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012095 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012096 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012097 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012098 },
12099
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012100 {
12101 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012102 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012103 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000012104 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012105 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000012106 .total_size = 2048,
12107 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012108 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000012109 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000012110 .probe = probe_spi_rdid,
12111 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012112 .block_erasers =
12113 {
12114 {
12115 .eraseblocks = { {4 * 1024, 512} },
12116 .block_erase = spi_block_erase_20,
12117 }, {
12118 .eraseblocks = { {32 * 1024, 64} },
12119 .block_erase = spi_block_erase_52,
12120 }, {
12121 .eraseblocks = { {64 * 1024, 32} },
12122 .block_erase = spi_block_erase_d8,
12123 }, {
12124 .eraseblocks = { {2 * 1024 * 1024, 1} },
12125 .block_erase = spi_block_erase_60,
12126 }, {
12127 .eraseblocks = { {2 * 1024 * 1024, 1} },
12128 .block_erase = spi_block_erase_c7,
12129 }
12130 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012131 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012132 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000012133 .write = spi_chip_write_256,
12134 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012135 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000012136 },
12137
12138 {
12139 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012140 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012141 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000012142 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012143 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000012144 .total_size = 4096,
12145 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012146 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +000012147 .tested = TEST_OK_PROBE,
12148 .probe = probe_spi_rdid,
12149 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012150 .block_erasers =
12151 {
12152 {
12153 .eraseblocks = { {4 * 1024, 1024} },
12154 .block_erase = spi_block_erase_20,
12155 }, {
12156 .eraseblocks = { {32 * 1024, 128} },
12157 .block_erase = spi_block_erase_52,
12158 }, {
12159 .eraseblocks = { {64 * 1024, 64} },
12160 .block_erase = spi_block_erase_d8,
12161 }, {
12162 .eraseblocks = { {4 * 1024 * 1024, 1} },
12163 .block_erase = spi_block_erase_60,
12164 }, {
12165 .eraseblocks = { {4 * 1024 * 1024, 1} },
12166 .block_erase = spi_block_erase_c7,
12167 }
12168 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012169 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012170 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000012171 .write = spi_chip_write_256,
12172 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012173 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000012174 },
12175
12176 {
12177 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012178 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012179 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000012180 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012181 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000012182 .total_size = 8192,
12183 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012184 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012185 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000012186 .probe = probe_spi_rdid,
12187 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012188 .block_erasers =
12189 {
12190 {
12191 .eraseblocks = { {4 * 1024, 2048} },
12192 .block_erase = spi_block_erase_20,
12193 }, {
12194 .eraseblocks = { {32 * 1024, 256} },
12195 .block_erase = spi_block_erase_52,
12196 }, {
12197 .eraseblocks = { {64 * 1024, 128} },
12198 .block_erase = spi_block_erase_d8,
12199 }, {
12200 .eraseblocks = { {8 * 1024 * 1024, 1} },
12201 .block_erase = spi_block_erase_60,
12202 }, {
12203 .eraseblocks = { {8 * 1024 * 1024, 1} },
12204 .block_erase = spi_block_erase_c7,
12205 }
12206 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012207 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012208 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000012209 .write = spi_chip_write_256,
12210 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012211 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000012212 },
12213
12214 {
12215 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000012216 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012217 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000012218 .manufacture_id = WINBOND_ID,
12219 .model_id = WINBOND_W29C010,
12220 .total_size = 128,
12221 .page_size = 128,
12222 .feature_bits = FEATURE_LONG_RESET,
12223 .tested = TEST_OK_PRE,
12224 .probe = probe_w29ee011,
12225 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
12226 .block_erasers =
12227 {
12228 {
12229 .eraseblocks = { {128 * 1024, 1} },
12230 .block_erase = erase_chip_block_jedec,
12231 }
12232 },
12233 .write = write_jedec,
12234 .read = read_memmapped,
12235 },
12236
12237 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
12238 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012239 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012240 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012241 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012242 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012243 .total_size = 128,
12244 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012245 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000012246 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012247 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012248 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012249 .block_erasers =
12250 {
12251 {
12252 .eraseblocks = { {128 * 1024, 1} },
12253 .block_erase = erase_chip_block_jedec,
12254 }
12255 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012256 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012257 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000012258 },
12259
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012260 {
12261 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012262 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012263 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012264 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012265 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012266 .total_size = 256,
12267 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012268 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012269 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012270 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012271 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012272 .block_erasers =
12273 {
12274 {
12275 .eraseblocks = { {256 * 1024, 1} },
12276 .block_erase = erase_chip_block_jedec,
12277 }
12278 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012279 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012280 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012281 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012282 },
12283
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012284 {
12285 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012286 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012287 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012288 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012289 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012290 .total_size = 512,
12291 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000012292 .feature_bits = FEATURE_LONG_RESET,
12293 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012294 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012295 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012296 .block_erasers =
12297 {
12298 {
12299 .eraseblocks = { {512 * 1024, 1} },
12300 .block_erase = erase_chip_block_jedec,
12301 }
12302 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012303 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012304 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012305 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012306 },
12307
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012308 {
12309 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000012310 .name = "W39F010",
12311 .bustype = BUS_PARALLEL,
12312 .manufacture_id = WINBOND_ID,
12313 .model_id = WINBOND_W39F010,
12314 .total_size = 128,
12315 .page_size = 4 * 1024,
12316 .feature_bits = FEATURE_EITHER_RESET,
12317 .tested = TEST_OK_PREW,
12318 .probe = probe_jedec,
12319 .probe_timing = 10,
12320 .block_erasers =
12321 {
12322 {
12323 .eraseblocks = { {4 * 1024, 32} },
12324 .block_erase = erase_block_jedec,
12325 }, {
12326 .eraseblocks = { {128 * 1024, 1} },
12327 .block_erase = erase_chip_block_jedec,
12328 }
12329 },
12330 .printlock = printlock_w39f010,
12331 .write = write_jedec_1,
12332 .read = read_memmapped,
12333 .voltage = {4500, 5500},
12334 },
12335
12336 {
12337 .vendor = "Winbond",
12338 .name = "W39L010",
12339 .bustype = BUS_PARALLEL,
12340 .manufacture_id = WINBOND_ID,
12341 .model_id = WINBOND_W39L010,
12342 .total_size = 128,
12343 .page_size = 4 * 1024,
12344 .feature_bits = FEATURE_EITHER_RESET,
12345 .tested = TEST_UNTESTED,
12346 .probe = probe_jedec,
12347 .probe_timing = 10,
12348 .block_erasers =
12349 {
12350 {
12351 .eraseblocks = { {4 * 1024, 32} },
12352 .block_erase = erase_block_jedec,
12353 }, {
12354 .eraseblocks = { {128 * 1024, 1} },
12355 .block_erase = erase_chip_block_jedec,
12356 }
12357 },
12358 .printlock = printlock_w39l010,
12359 .write = write_jedec_1,
12360 .read = read_memmapped,
12361 .voltage = {3000, 3600},
12362 },
12363
12364 {
12365 .vendor = "Winbond",
12366 .name = "W39L020",
12367 .bustype = BUS_PARALLEL,
12368 .manufacture_id = WINBOND_ID,
12369 .model_id = WINBOND_W39L020,
12370 .total_size = 256,
12371 .page_size = 4 * 1024,
12372 .feature_bits = FEATURE_EITHER_RESET,
12373 .tested = TEST_UNTESTED,
12374 .probe = probe_jedec,
12375 .probe_timing = 10,
12376 .block_erasers =
12377 {
12378 {
12379 .eraseblocks = { {4 * 1024, 64} },
12380 .block_erase = erase_block_jedec,
12381 }, {
12382 .eraseblocks = { {64 * 1024, 4} },
12383 .block_erase = erase_sector_jedec,
12384 }, {
12385 .eraseblocks = { {256 * 1024, 1} },
12386 .block_erase = erase_chip_block_jedec,
12387 }
12388 },
12389 .printlock = printlock_w39l020,
12390 .write = write_jedec_1,
12391 .read = read_memmapped,
12392 .voltage = {3000, 3600},
12393 },
12394
12395 {
12396 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000012397 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012398 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000012399 .manufacture_id = WINBOND_ID,
12400 .model_id = WINBOND_W39L040,
12401 .total_size = 512,
12402 .page_size = 64 * 1024,
12403 .feature_bits = FEATURE_EITHER_RESET,
12404 .tested = TEST_OK_PR,
12405 .probe = probe_jedec,
12406 .probe_timing = 10,
12407 .block_erasers =
12408 {
12409 {
12410 .eraseblocks = { {4 * 1024, 128} },
12411 .block_erase = erase_block_jedec,
12412 }, {
12413 .eraseblocks = { {64 * 1024, 8} },
12414 .block_erase = erase_sector_jedec,
12415 }, {
12416 .eraseblocks = { {512 * 1024, 1} },
12417 .block_erase = erase_chip_block_jedec,
12418 }
12419 },
12420 .printlock = printlock_w39l040,
12421 .write = write_jedec_1,
12422 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012423 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000012424 },
12425
12426 {
12427 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012428 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012429 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012430 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012431 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012432 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012433 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012434 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012435 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012436 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000012437 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012438 .block_erasers =
12439 {
12440 {
12441 .eraseblocks = { {64 * 1024, 8} },
12442 .block_erase = erase_sector_jedec,
12443 }, {
12444 .eraseblocks = { {512 * 1024, 1} },
12445 .block_erase = erase_chip_block_jedec,
12446 }
12447 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012448 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000012449 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012450 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012451 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012452 },
12453
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012454 {
12455 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012456 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012457 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012458 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012459 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012460 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012461 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012462 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012463 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012464 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000012465 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012466 .block_erasers =
12467 {
12468 {
12469 .eraseblocks = { {64 * 1024, 8} },
12470 .block_erase = erase_sector_jedec,
12471 }, {
12472 .eraseblocks = { {512 * 1024, 1} },
12473 .block_erase = erase_chip_block_jedec,
12474 }
12475 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012476 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000012477 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012478 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012479 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012480 },
12481
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012482 {
12483 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012484 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012485 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012486 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012487 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012488 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012489 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012490 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012491 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000012492 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012493 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012494 .block_erasers =
12495 {
12496 {
12497 .eraseblocks = { {64 * 1024, 8} },
12498 .block_erase = erase_sector_jedec,
12499 }, {
12500 .eraseblocks = { {512 * 1024, 1} },
12501 .block_erase = erase_chip_block_jedec,
12502 }
12503 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000012504 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000012505 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012506 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012507 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012508 },
12509
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012510 {
12511 .vendor = "Winbond",
12512 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012513 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012514 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012515 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012516 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012517 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000012518 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012519 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012520 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012521 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012522 .block_erasers =
12523 {
12524 {
12525 .eraseblocks = { {4 * 1024, 128} },
12526 .block_erase = erase_block_jedec,
12527 }, {
12528 .eraseblocks = { {64 * 1024, 8} },
12529 .block_erase = erase_sector_jedec,
12530 }, {
12531 .eraseblocks = { {512 * 1024, 1} },
12532 .block_erase = erase_chip_block_jedec,
12533 }
12534 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012535 .printlock = printlock_w39v040fa,
Michael Karcherc9b63412010-05-30 16:55:18 +000012536 .unlock = unlock_sst_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +000012537 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012538 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012539 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012540 },
12541
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012542 {
12543 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012544 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012545 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012546 .manufacture_id = WINBOND_ID,
12547 .model_id = WINBOND_W39V040B,
12548 .total_size = 512,
12549 .page_size = 64 * 1024,
12550 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000012551 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012552 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012553 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012554 .block_erasers =
12555 {
12556 {
12557 .eraseblocks = { {64 * 1024, 8} },
12558 .block_erase = erase_sector_jedec,
12559 }, {
12560 .eraseblocks = { {512 * 1024, 1} },
12561 .block_erase = erase_chip_block_jedec,
12562 }
12563 },
12564 .printlock = printlock_w39v040fb,
Idwer Volleringecc67072010-12-26 23:55:12 +000012565 .unlock = unlock_w39v040fb,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012566 .write = write_jedec_1,
12567 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012568 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012569 },
12570
12571 {
12572 .vendor = "Winbond",
12573 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012574 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012575 .manufacture_id = WINBOND_ID,
12576 .model_id = WINBOND_W39V040C,
12577 .total_size = 512,
12578 .page_size = 64 * 1024,
12579 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000012580 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012581 .probe = probe_jedec,
12582 .probe_timing = 10,
12583 .block_erasers =
12584 {
12585 {
12586 .eraseblocks = { {64 * 1024, 8} },
12587 .block_erase = erase_sector_jedec,
12588 }, {
12589 .eraseblocks = { {512 * 1024, 1} },
12590 .block_erase = erase_chip_block_jedec,
12591 }
12592 },
12593 .printlock = printlock_w39v040fc,
12594 .write = write_jedec_1,
12595 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012596 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012597 },
12598
12599 {
12600 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012601 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012602 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012603 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012604 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012605 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012606 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012607 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000012608 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012609 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000012610 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012611 .block_erasers =
12612 {
12613 {
12614 .eraseblocks = { {64 * 1024, 16} },
12615 .block_erase = erase_sector_jedec,
12616 }, {
12617 .eraseblocks = { {1024 * 1024, 1} },
12618 .block_erase = erase_chip_block_jedec,
12619 }
12620 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012621 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000012622 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012623 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012624 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012625 },
12626
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012627 {
12628 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012629 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012630 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012631 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012632 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012633 .total_size = 256,
12634 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012635 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012636 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012637 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012638 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012639 .block_erasers =
12640 {
12641 {
12642 .eraseblocks = {
12643 {128 * 1024, 1},
12644 {96 * 1024, 1},
12645 {8 * 1024, 2},
12646 {16 * 1024, 1},
12647 },
12648 .block_erase = erase_sector_jedec,
12649 }, {
12650 .eraseblocks = { {256 * 1024, 1} },
12651 .block_erase = erase_chip_block_jedec,
12652 }
12653 },
Sean Nelson35727f72010-01-28 23:55:12 +000012654 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012655 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012656 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012657 },
12658
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012659 {
12660 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012661 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012662 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012663 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012664 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012665 .total_size = 256,
12666 .page_size = 128,
12667 .feature_bits = FEATURE_EITHER_RESET,
12668 .tested = TEST_OK_PROBE,
12669 .probe = probe_jedec,
12670 .probe_timing = 10,
12671 .block_erasers =
12672 {
12673 {
12674 .eraseblocks = { {256 * 1024, 1} },
12675 .block_erase = erase_chip_block_jedec,
12676 }
12677 },
12678 .write = write_jedec_1,
12679 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012680 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012681 },
12682
12683 {
12684 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012685 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012686 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012687 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012688 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012689 .total_size = 256,
12690 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012691 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012692 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012693 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012694 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012695 .block_erasers =
12696 {
12697 {
12698 .eraseblocks = {
12699 {64 * 1024, 3},
12700 {32 * 1024, 1},
12701 {8 * 1024, 2},
12702 {16 * 1024, 1},
12703 },
12704 .block_erase = erase_sector_jedec,
12705 }, {
12706 .eraseblocks = { {256 * 1024, 1} },
12707 .block_erase = erase_chip_block_jedec,
12708 }
12709 },
Sean Nelson35727f72010-01-28 23:55:12 +000012710 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012711 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012712 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012713 },
12714
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012715 {
12716 .vendor = "Winbond",
12717 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012718 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012719 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012720 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012721 .total_size = 256,
12722 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012723 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000012724 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012725 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012726 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012727 .block_erasers =
12728 {
12729 {
12730 .eraseblocks = {
12731 {64 * 1024, 3},
12732 {32 * 1024, 1},
12733 {8 * 1024, 2},
12734 {16 * 1024, 1},
12735 },
12736 .block_erase = erase_sector_jedec,
12737 }, {
12738 .eraseblocks = { {256 * 1024, 1} },
12739 .block_erase = erase_chip_block_jedec,
12740 }
12741 },
Sean Nelson35727f72010-01-28 23:55:12 +000012742 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012743 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012744 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012745 },
12746
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012747 {
12748 .vendor = "Winbond",
12749 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012750 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012751 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012752 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012753 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012754 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012755 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012756 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012757 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012758 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012759 .block_erasers =
12760 {
12761 {
12762 .eraseblocks = { {64 * 1024, 16}, },
12763 .block_erase = erase_sector_jedec,
12764 }, {
12765 .eraseblocks = { {1024 * 1024, 1} },
12766 .block_erase = erase_chip_block_jedec,
12767 }
12768 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012769 .printlock = printlock_w39v080fa,
12770 .unlock = unlock_w39v080fa,
Sean Nelson35727f72010-01-28 23:55:12 +000012771 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012772 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012773 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012774 },
12775
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012776 {
12777 .vendor = "Winbond",
12778 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012779 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012780 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012781 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012782 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012783 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012784 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012785 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012786 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012787 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012788 .block_erasers =
12789 {
12790 {
12791 .eraseblocks = { {64 * 1024, 8}, },
12792 .block_erase = erase_sector_jedec,
12793 }, {
12794 .eraseblocks = { {512 * 1024, 1} },
12795 .block_erase = erase_chip_block_jedec,
12796 }
12797 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012798 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000012799 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012800 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012801 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012802 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012803
12804 {
12805 .vendor = "Unknown",
12806 .name = "SFDP-capable chip",
12807 .bustype = BUS_SPI,
12808 .manufacture_id = GENERIC_MANUF_ID,
12809 .model_id = SFDP_DEVICE_ID,
12810 /* We present our own "report this" text hence we do not
12811 * want the default "This flash part has status UNTESTED..."
12812 * text to be printed. */
12813 .tested = TEST_OK_PREW,
12814 .probe = probe_spi_sfdp,
12815 .unlock = spi_disable_blockprotect, /* is this safe? */
12816 .read = spi_chip_read,
12817 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000012818 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012819 /* Everything below will be set by the probing function. */
12820 .write = NULL,
12821 .total_size = 0,
12822 .page_size = 0,
12823 .feature_bits = 0,
12824 .block_erasers = {},
12825 },
FENG yu ningff692fb2008-12-08 18:15:10 +000012826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012827 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000012828 .vendor = "Programmer",
12829 .name = "Opaque flash chip",
12830 .bustype = BUS_PROG,
12831 .manufacture_id = PROGMANUF_ID,
12832 .model_id = PROGDEV_ID,
12833 .total_size = 0,
12834 .page_size = 256,
12835 /* probe is assumed to work, rest will be filled in by probe */
12836 .tested = TEST_OK_PROBE,
12837 .probe = probe_opaque,
12838 /* eraseblock sizes will be set by the probing function */
12839 .block_erasers =
12840 {
12841 {
12842 .block_erase = erase_opaque,
12843 }
12844 },
12845 .write = write_opaque,
12846 .read = read_opaque,
12847 },
12848
12849 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012850 .vendor = "AMIC",
12851 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012852 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012853 .manufacture_id = AMIC_ID,
12854 .model_id = GENERIC_DEVICE_ID,
12855 .total_size = 0,
12856 .page_size = 256,
12857 .tested = TEST_BAD_PREW,
12858 .probe = probe_spi_rdid4,
12859 .probe_timing = TIMING_ZERO,
12860 .write = NULL,
12861 .read = NULL,
12862 },
12863
12864 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012865 .vendor = "Atmel",
12866 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012867 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012868 .manufacture_id = ATMEL_ID,
12869 .model_id = GENERIC_DEVICE_ID,
12870 .total_size = 0,
12871 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012872 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012873 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012874 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012875 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012876 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012877 },
12878
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012879 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000012880 .vendor = "Eon",
12881 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012882 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012883 .manufacture_id = EON_ID_NOPREFIX,
12884 .model_id = GENERIC_DEVICE_ID,
12885 .total_size = 0,
12886 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012887 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012888 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012889 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012890 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012891 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012892 },
12893
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012894 {
12895 .vendor = "Macronix",
12896 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012897 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012898 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012899 .model_id = GENERIC_DEVICE_ID,
12900 .total_size = 0,
12901 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012902 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012903 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012904 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012905 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012906 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012907 },
12908
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012909 {
12910 .vendor = "PMC",
12911 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012912 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012913 .manufacture_id = PMC_ID,
12914 .model_id = GENERIC_DEVICE_ID,
12915 .total_size = 0,
12916 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012917 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012918 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012919 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012920 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012921 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012922 },
12923
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012924 {
12925 .vendor = "SST",
12926 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012927 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012928 .manufacture_id = SST_ID,
12929 .model_id = GENERIC_DEVICE_ID,
12930 .total_size = 0,
12931 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012932 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012933 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012934 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012935 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012936 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012937 },
12938
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012939 {
12940 .vendor = "ST",
12941 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012942 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012943 .manufacture_id = ST_ID,
12944 .model_id = GENERIC_DEVICE_ID,
12945 .total_size = 0,
12946 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012947 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012948 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012949 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012950 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012951 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012952 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000012953
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012954 {
Sean Nelson118e1d62009-11-24 02:08:11 +000012955 .vendor = "Sanyo",
12956 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012957 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000012958 .manufacture_id = SANYO_ID,
12959 .model_id = GENERIC_DEVICE_ID,
12960 .total_size = 0,
12961 .page_size = 256,
12962 .tested = TEST_BAD_PREW,
12963 .probe = probe_spi_rdid,
12964 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000012965 .write = NULL,
12966 .read = NULL,
12967 },
12968
12969 {
Stefan Taunereb582572012-09-21 12:52:50 +000012970 .vendor = "Winbond",
12971 .name = "unknown Winbond (ex Nexcom) SPI chip",
12972 .bustype = BUS_SPI,
12973 .manufacture_id = WINBOND_NEX_ID,
12974 .model_id = GENERIC_DEVICE_ID,
12975 .total_size = 0,
12976 .page_size = 256,
12977 .tested = TEST_BAD_PREW,
12978 .probe = probe_spi_rdid,
12979 .probe_timing = TIMING_ZERO,
12980 .write = NULL,
12981 .read = NULL,
12982 },
12983
12984 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012985 .vendor = "Generic",
12986 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012987 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012988 .manufacture_id = GENERIC_MANUF_ID,
12989 .model_id = GENERIC_DEVICE_ID,
12990 .total_size = 0,
12991 .page_size = 256,
12992 .tested = TEST_BAD_PREW,
12993 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012994 .write = NULL,
12995 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000012996
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012997 {
12998 .vendor = "Generic",
12999 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013000 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013001 .manufacture_id = GENERIC_MANUF_ID,
13002 .model_id = GENERIC_DEVICE_ID,
13003 .total_size = 0,
13004 .page_size = 256,
13005 .tested = TEST_BAD_PREW,
13006 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013007 .write = NULL,
13008 },
13009
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013010 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +000013011};