blob: e8ac78930addd3b3fc3d03c5375537062d64cfe3 [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 Tauner12f3d512014-05-27 21:27:27 +0000567 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000601 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000636 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000671 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000706 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000741 .printlock = spi_prettyprint_status_register_bp1_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000781 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000816 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000851 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000889 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000927 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000959 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +0000991 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +00001023 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +00001055 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +00001087 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Tauner12f3d512014-05-27 21:27:27 +00001119 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001278 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001279 .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,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001358 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001359 .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,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001385 .tested = TEST_OK_PR,
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 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001398 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001399 .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",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001712 .name = "AT25DL081",
1713 .bustype = BUS_SPI,
1714 .manufacture_id = ATMEL_ID,
1715 .model_id = ATMEL_AT25DF081,
1716 .total_size = 1024,
1717 .page_size = 256,
1718 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1720 .tested = TEST_UNTESTED,
1721 .probe = probe_spi_rdid,
1722 .probe_timing = TIMING_ZERO,
1723 .block_erasers =
1724 {
1725 {
1726 .eraseblocks = { {4 * 1024, 256} },
1727 .block_erase = spi_block_erase_20,
1728 }, {
1729 .eraseblocks = { {32 * 1024, 32} },
1730 .block_erase = spi_block_erase_52,
1731 }, {
1732 .eraseblocks = { {64 * 1024, 16} },
1733 .block_erase = spi_block_erase_d8,
1734 }, {
1735 .eraseblocks = { {1 * 1024 * 1024, 1} },
1736 .block_erase = spi_block_erase_60,
1737 }, {
1738 .eraseblocks = { {1 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_c7,
1740 }
1741 },
1742 .printlock = spi_prettyprint_status_register_at25df_sec,
1743 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1744 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1745 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1746 .voltage = {1650, 1950},
1747 },
1748
1749 {
1750 .vendor = "Atmel",
1751 .name = "AT25DL161",
1752 .bustype = BUS_SPI,
1753 .manufacture_id = ATMEL_ID,
1754 .model_id = ATMEL_AT25DL161,
1755 .total_size = 2048,
1756 .page_size = 256,
1757 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1758 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1759 .tested = TEST_UNTESTED,
1760 .probe = probe_spi_rdid,
1761 .probe_timing = TIMING_ZERO,
1762 .block_erasers =
1763 {
1764 {
1765 .eraseblocks = { {4 * 1024, 512} },
1766 .block_erase = spi_block_erase_20,
1767 }, {
1768 .eraseblocks = { {32 * 1024, 64} },
1769 .block_erase = spi_block_erase_52,
1770 }, {
1771 .eraseblocks = { {64 * 1024, 32} },
1772 .block_erase = spi_block_erase_d8,
1773 }, {
1774 .eraseblocks = { {2 * 1024 * 1024, 1} },
1775 .block_erase = spi_block_erase_60,
1776 }, {
1777 .eraseblocks = { {2 * 1024 * 1024, 1} },
1778 .block_erase = spi_block_erase_c7,
1779 }
1780 },
1781 .printlock = spi_prettyprint_status_register_at25df_sec,
1782 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1783 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1784 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1785 .voltage = {1650, 1950},
1786 },
1787
1788 {
1789 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001790 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001792 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001793 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001794 .total_size = 2048,
1795 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001796 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1797 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001798 .tested = TEST_UNTESTED,
1799 .probe = probe_spi_rdid,
1800 .probe_timing = TIMING_ZERO,
1801 .block_erasers =
1802 {
1803 {
1804 .eraseblocks = { {4 * 1024, 512} },
1805 .block_erase = spi_block_erase_20,
1806 }, {
1807 .eraseblocks = { {32 * 1024, 64} },
1808 .block_erase = spi_block_erase_52,
1809 }, {
1810 .eraseblocks = { {64 * 1024, 32} },
1811 .block_erase = spi_block_erase_d8,
1812 }, {
1813 .eraseblocks = { {2 * 1024 * 1024, 1} },
1814 .block_erase = spi_block_erase_60,
1815 }, {
1816 .eraseblocks = { {2 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_c7,
1818 }
1819 },
1820 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001821 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001822 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001823 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001824 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001825 },
1826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001827 {
1828 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001829 .name = "AT25F512",
1830 .bustype = BUS_SPI,
1831 .manufacture_id = ATMEL_ID,
1832 .model_id = ATMEL_AT25F512,
1833 .total_size = 64,
1834 .page_size = 256,
1835 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001836 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001837 .probe = probe_spi_at25f,
1838 .probe_timing = TIMING_ZERO,
1839 .block_erasers =
1840 {
1841 {
1842 .eraseblocks = { {32 * 1024, 2} },
1843 .block_erase = spi_block_erase_52,
1844 }, {
1845 .eraseblocks = { {64 * 1024, 1} },
1846 .block_erase = spi_block_erase_62,
1847 }
1848 },
1849 .printlock = spi_prettyprint_status_register_at25f,
1850 .unlock = spi_disable_blockprotect_at25f,
1851 .write = spi_chip_write_256,
1852 .read = spi_chip_read,
1853 .voltage = {2700, 3600},
1854 },
1855
1856 {
1857 .vendor = "Atmel",
1858 .name = "AT25F512A",
1859 .bustype = BUS_SPI,
1860 .manufacture_id = ATMEL_ID,
1861 .model_id = ATMEL_AT25F512A,
1862 .total_size = 64,
1863 .page_size = 128,
1864 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001865 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001866 .probe = probe_spi_at25f,
1867 .probe_timing = TIMING_ZERO,
1868 .block_erasers =
1869 {
1870 {
1871 .eraseblocks = { {32 * 1024, 2} },
1872 .block_erase = spi_block_erase_52,
1873 }, {
1874 .eraseblocks = { {64 * 1024, 1} },
1875 .block_erase = spi_block_erase_62,
1876 }
1877 },
1878 .printlock = spi_prettyprint_status_register_at25f512a,
1879 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1880 .unlock = spi_disable_blockprotect_at25f512a,
1881 .write = spi_chip_write_256,
1882 .read = spi_chip_read,
1883 .voltage = {2700, 3600},
1884 },
1885
1886 {
1887 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001888 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001889 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001890 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001891 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001892 .total_size = 64,
1893 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001894 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1895 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001896 .tested = TEST_UNTESTED,
1897 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001898 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001899 .block_erasers =
1900 {
1901 {
1902 .eraseblocks = { {4 * 1024, 16} },
1903 .block_erase = spi_block_erase_20,
1904 }, {
1905 .eraseblocks = { {32 * 1024, 2} },
1906 .block_erase = spi_block_erase_52,
1907 }, {
1908 .eraseblocks = { {32 * 1024, 2} },
1909 .block_erase = spi_block_erase_d8,
1910 }, {
1911 .eraseblocks = { {64 * 1024, 1} },
1912 .block_erase = spi_block_erase_60,
1913 }, {
1914 .eraseblocks = { {64 * 1024, 1} },
1915 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001916 }, {
1917 .eraseblocks = { {64 * 1024, 1} },
1918 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00001919 }
1920 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00001921 .printlock = spi_prettyprint_status_register_at25f512b,
1922 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001923 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001924 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001925 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001926 },
1927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001928 {
1929 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001930 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1931 * All other properties seem to be the same.*/
1932 .name = "AT25F1024(A)",
1933 .bustype = BUS_SPI,
1934 .manufacture_id = ATMEL_ID,
1935 .model_id = ATMEL_AT25F1024,
1936 .total_size = 128,
1937 .page_size = 256,
1938 .feature_bits = FEATURE_WRSR_WREN,
1939 .tested = TEST_OK_PREW,
1940 .probe = probe_spi_at25f,
1941 .probe_timing = TIMING_ZERO,
1942 .block_erasers =
1943 {
1944 {
1945 .eraseblocks = { {32 * 1024, 4} },
1946 .block_erase = spi_block_erase_52,
1947 }, {
1948 .eraseblocks = { {128 * 1024, 1} },
1949 .block_erase = spi_block_erase_62,
1950 }
1951 },
1952 .printlock = spi_prettyprint_status_register_at25f,
1953 .unlock = spi_disable_blockprotect_at25f,
1954 .write = spi_chip_write_256,
1955 .read = spi_chip_read,
1956 .voltage = {2700, 3600},
1957 },
1958
1959 {
1960 .vendor = "Atmel",
1961 .name = "AT25F2048",
1962 .bustype = BUS_SPI,
1963 .manufacture_id = ATMEL_ID,
1964 .model_id = ATMEL_AT25F2048,
1965 .total_size = 256,
1966 .page_size = 256,
1967 .feature_bits = FEATURE_WRSR_WREN,
1968 .tested = TEST_UNTESTED,
1969 .probe = probe_spi_at25f,
1970 .probe_timing = TIMING_ZERO,
1971 .block_erasers =
1972 {
1973 {
1974 .eraseblocks = { {64 * 1024, 4} },
1975 .block_erase = spi_block_erase_52,
1976 }, {
1977 .eraseblocks = { {256 * 1024, 1} },
1978 .block_erase = spi_block_erase_62,
1979 }
1980 },
1981 .printlock = spi_prettyprint_status_register_at25f,
1982 .unlock = spi_disable_blockprotect_at25f,
1983 .write = spi_chip_write_256,
1984 .read = spi_chip_read,
1985 .voltage = {2700, 3600},
1986 },
1987
1988 {
1989 .vendor = "Atmel",
1990 .name = "AT25F4096",
1991 .bustype = BUS_SPI,
1992 .manufacture_id = ATMEL_ID,
1993 .model_id = ATMEL_AT25F4096,
1994 .total_size = 512,
1995 .page_size = 256,
1996 .feature_bits = FEATURE_WRSR_WREN,
1997 .tested = TEST_UNTESTED,
1998 .probe = probe_spi_at25f,
1999 .probe_timing = TIMING_ZERO,
2000 .block_erasers =
2001 {
2002 {
2003 .eraseblocks = { {64 * 1024, 8} },
2004 .block_erase = spi_block_erase_52,
2005 }, {
2006 .eraseblocks = { {512 * 1024, 1} },
2007 .block_erase = spi_block_erase_62,
2008 }
2009 },
2010 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002011 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2012 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002013 .write = spi_chip_write_256,
2014 .read = spi_chip_read,
2015 .voltage = {2700, 3600},
2016 },
2017
2018 {
2019 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002020 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002021 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002022 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002023 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002024 .total_size = 128,
2025 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002026 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002027 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002028 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002029 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002030 .block_erasers =
2031 {
2032 {
2033 .eraseblocks = { {4 * 1024, 32} },
2034 .block_erase = spi_block_erase_20,
2035 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002036 .eraseblocks = { {4 * 1024, 32} },
2037 .block_erase = spi_block_erase_d7,
2038 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002039 .eraseblocks = { {32 * 1024, 4} },
2040 .block_erase = spi_block_erase_52,
2041 }, {
2042 .eraseblocks = { {32 * 1024, 4} },
2043 .block_erase = spi_block_erase_d8,
2044 }, {
2045 .eraseblocks = { {128 * 1024, 1} },
2046 .block_erase = spi_block_erase_60,
2047 }, {
2048 .eraseblocks = { {128 * 1024, 1} },
2049 .block_erase = spi_block_erase_c7,
2050 }
2051 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002052 .printlock = spi_prettyprint_status_register_at25fs010,
2053 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002054 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002055 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002056 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002057 },
2058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002059 {
2060 .vendor = "Atmel",
2061 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002062 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002063 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002064 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002065 .total_size = 512,
2066 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002067 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002068 .tested = TEST_UNTESTED,
2069 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002070 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002071 .block_erasers =
2072 {
2073 {
2074 .eraseblocks = { {4 * 1024, 128} },
2075 .block_erase = spi_block_erase_20,
2076 }, {
2077 .eraseblocks = { {64 * 1024, 8} },
2078 .block_erase = spi_block_erase_52,
2079 }, {
2080 .eraseblocks = { {64 * 1024, 8} },
2081 .block_erase = spi_block_erase_d8,
2082 }, {
2083 .eraseblocks = { {512 * 1024, 1} },
2084 .block_erase = spi_block_erase_60,
2085 }, {
2086 .eraseblocks = { {512 * 1024, 1} },
2087 .block_erase = spi_block_erase_c7,
2088 }
2089 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002090 .printlock = spi_prettyprint_status_register_at25fs040,
2091 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002092 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002093 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002094 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002095 },
2096
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002097 {
2098 .vendor = "Atmel",
2099 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002100 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002101 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002102 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002103 .total_size = 512,
2104 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002105 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002106 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002107 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002108 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002109 .block_erasers =
2110 {
2111 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002112 .eraseblocks = { {256, 2048} },
2113 .block_erase = spi_block_erase_81,
2114 }, {
2115 .eraseblocks = { {2 * 1024, 256} },
2116 .block_erase = spi_block_erase_50,
2117 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002118 .eraseblocks = { {4 * 1024, 128} },
2119 .block_erase = spi_block_erase_20,
2120 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002121 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002122 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002123 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002124 .write = spi_chip_write_1,
2125 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002126 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002127 },
2128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002129 {
2130 .vendor = "Atmel",
2131 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002132 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002133 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002134 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002135 .total_size = 1024,
2136 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002137 .feature_bits = FEATURE_WRSR_WREN,
2138 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002139 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002140 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002141 .block_erasers =
2142 {
2143 {
2144 .eraseblocks = { {4 * 1024, 256} },
2145 .block_erase = spi_block_erase_20,
2146 }, {
2147 .eraseblocks = { {32 * 1024, 32} },
2148 .block_erase = spi_block_erase_52,
2149 }, {
2150 .eraseblocks = { {64 * 1024, 16} },
2151 .block_erase = spi_block_erase_d8,
2152 }, {
2153 .eraseblocks = { {1024 * 1024, 1} },
2154 .block_erase = spi_block_erase_60,
2155 }, {
2156 .eraseblocks = { {1024 * 1024, 1} },
2157 .block_erase = spi_block_erase_c7,
2158 }
2159 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002160 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002161 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002162 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002163 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002164 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002165 },
2166
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002167 {
2168 .vendor = "Atmel",
2169 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002170 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002171 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002172 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002173 .total_size = 2048,
2174 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002175 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00002176 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002177 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002178 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002179 .block_erasers =
2180 {
2181 {
2182 .eraseblocks = { {4 * 1024, 512} },
2183 .block_erase = spi_block_erase_20,
2184 }, {
2185 .eraseblocks = { {32 * 1024, 64} },
2186 .block_erase = spi_block_erase_52,
2187 }, {
2188 .eraseblocks = { {64 * 1024, 32} },
2189 .block_erase = spi_block_erase_d8,
2190 }, {
2191 .eraseblocks = { {2 * 1024 * 1024, 1} },
2192 .block_erase = spi_block_erase_60,
2193 }, {
2194 .eraseblocks = { {2 * 1024 * 1024, 1} },
2195 .block_erase = spi_block_erase_c7,
2196 }
2197 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002198 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002199 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002200 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002201 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002202 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002203 },
2204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002205 {
2206 .vendor = "Atmel",
2207 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002208 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002209 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002210 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002211 .total_size = 2048,
2212 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002213 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002214 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002215 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002216 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002217 .block_erasers =
2218 {
2219 {
2220 .eraseblocks = { {4 * 1024, 512} },
2221 .block_erase = spi_block_erase_20,
2222 }, {
2223 .eraseblocks = { {32 * 1024, 64} },
2224 .block_erase = spi_block_erase_52,
2225 }, {
2226 .eraseblocks = { {64 * 1024, 32} },
2227 .block_erase = spi_block_erase_d8,
2228 }, {
2229 .eraseblocks = { {2 * 1024 * 1024, 1} },
2230 .block_erase = spi_block_erase_60,
2231 }, {
2232 .eraseblocks = { {2 * 1024 * 1024, 1} },
2233 .block_erase = spi_block_erase_c7,
2234 }
2235 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002236 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002237 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002238 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002239 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002240 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002241 },
2242
2243 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002244 /*{
2245 .vendor = "Atmel",
2246 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002247 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002248 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002249 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002250 .total_size = 4096,
2251 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002252 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002253 .tested = TEST_UNTESTED,
2254 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002255 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002256 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002257 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002258 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002259 .read = spi_chip_read,
2260 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002261
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002262 {
2263 .vendor = "Atmel",
2264 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002265 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002266 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002267 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002268 .total_size = 512,
2269 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002270 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002271 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002272 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002273 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002274 .block_erasers =
2275 {
2276 {
2277 .eraseblocks = { {4 * 1024, 128} },
2278 .block_erase = spi_block_erase_20,
2279 }, {
2280 .eraseblocks = { {32 * 1024, 16} },
2281 .block_erase = spi_block_erase_52,
2282 }, {
2283 .eraseblocks = { {64 * 1024, 8} },
2284 .block_erase = spi_block_erase_d8,
2285 }, {
2286 .eraseblocks = { {512 * 1024, 1} },
2287 .block_erase = spi_block_erase_60,
2288 }, {
2289 .eraseblocks = { {512 * 1024, 1} },
2290 .block_erase = spi_block_erase_c7,
2291 }
2292 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002294 .write = NULL /* Incompatible Page write */,
2295 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002296 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002297 },
2298
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002299 {
2300 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002301 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002302 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002303 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002304 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002305 .total_size = 64,
2306 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002307 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002308 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002309 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002310 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002311 .block_erasers =
2312 {
2313 {
2314 .eraseblocks = { {64 * 1024, 1} },
2315 .block_erase = erase_chip_block_jedec,
2316 }
2317 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002318 .write = write_jedec,
2319 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002320 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002321 },
2322
2323 {
2324 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002325 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002326 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002327 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002328 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002329 .total_size = 128,
2330 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002331 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002332 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002333 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002334 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002335 .block_erasers =
2336 {
2337 {
2338 .eraseblocks = { {128 * 1024, 1} },
2339 .block_erase = erase_chip_block_jedec,
2340 }
2341 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002342 .write = write_jedec, /* FIXME */
2343 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002344 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002345 },
2346
2347 {
2348 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002349 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002350 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002351 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002352 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002353 .total_size = 256,
2354 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002355 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002356 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002357 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002358 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002359 .block_erasers =
2360 {
2361 {
2362 .eraseblocks = { {256 * 1024, 1} },
2363 .block_erase = erase_chip_block_jedec,
2364 }
2365 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002366 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002367 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002368 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002369 },
2370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002371 {
2372 .vendor = "Atmel",
2373 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002374 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002375 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002376 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002377 .total_size = 512,
2378 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002379 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .tested = TEST_UNTESTED,
2381 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002382 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002383 .block_erasers =
2384 {
2385 {
2386 .eraseblocks = { {512 * 1024, 1} },
2387 .block_erase = erase_chip_block_jedec,
2388 }
2389 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002390 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002392 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002393 },
2394
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002395 {
2396 .vendor = "Atmel",
2397 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002398 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002399 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002400 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002401 .total_size = 16896 /* No power of two sizes */,
2402 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002403 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002404 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2405 .feature_bits = FEATURE_OTP,
2406 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002407 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002408 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002409 .block_erasers =
2410 {
2411 {
2412 .eraseblocks = {
2413 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2414 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2415 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2416 },
2417 .block_erase = spi_erase_at45cs_sector,
2418 }
2419 },
2420 .printlock = spi_prettyprint_status_register_plain,
2421 .gran = write_gran_1056bytes,
2422 .write = spi_write_at45db,
2423 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002424 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002425 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002426
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002427 {
2428 .vendor = "Atmel",
2429 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002430 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002431 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002432 .model_id = ATMEL_AT45DB011D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002433 .total_size = 128 /* or 132, determined from status register */,
2434 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002435 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002436 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2437 .feature_bits = FEATURE_OTP,
2438 .tested = TEST_UNTESTED,
2439 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002440 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002441 .block_erasers =
2442 {
2443 {
2444 .eraseblocks = { {256, 512} },
2445 .block_erase = spi_erase_at45db_page,
2446 }, {
2447 .eraseblocks = { {8 * 256, 512/8} },
2448 .block_erase = spi_erase_at45db_block,
2449 }, {
2450 .eraseblocks = {
2451 {8 * 256, 1},
2452 {120 * 256, 1},
2453 {128 * 256, 3},
2454 },
2455 .block_erase = spi_erase_at45db_sector
2456 }, {
2457 .eraseblocks = { {128 * 1024, 1} },
2458 .block_erase = spi_erase_at45db_chip,
2459 }
2460 },
2461 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2462 .printlock = spi_prettyprint_status_register_at45db,
2463 /* granularity will be set by the probing function. */
2464 .write = spi_write_at45db,
2465 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002466 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002467 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002468
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002469 {
2470 .vendor = "Atmel",
2471 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002472 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002473 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002474 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002475 .total_size = 256 /* or 264, determined from status register */,
2476 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002477 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002478 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2479 .feature_bits = FEATURE_OTP,
2480 .tested = TEST_UNTESTED,
2481 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002482 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002483 .block_erasers =
2484 {
2485 {
2486 .eraseblocks = { {256, 1024} },
2487 .block_erase = spi_erase_at45db_page,
2488 }, {
2489 .eraseblocks = { {8 * 256, 1024/8} },
2490 .block_erase = spi_erase_at45db_block,
2491 }, {
2492 .eraseblocks = {
2493 {8 * 256, 1},
2494 {120 * 256, 1},
2495 {128 * 256, 7},
2496 },
2497 .block_erase = spi_erase_at45db_sector
2498 }, {
2499 .eraseblocks = { {256 * 1024, 1} },
2500 .block_erase = spi_erase_at45db_chip,
2501 }
2502 },
2503 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2504 .printlock = spi_prettyprint_status_register_at45db,
2505 /* granularity will be set by the probing function. */
2506 .write = spi_write_at45db,
2507 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002508 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002509 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002510
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002511 {
2512 .vendor = "Atmel",
2513 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002514 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002515 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002516 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002517 .total_size = 512 /* or 528, determined from status register */,
2518 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002519 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002520 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2521 .feature_bits = FEATURE_OTP,
2522 .tested = TEST_OK_PREW,
2523 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002524 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002525 .block_erasers =
2526 {
2527 {
2528 .eraseblocks = { {256, 2048} },
2529 .block_erase = spi_erase_at45db_page,
2530 }, {
2531 .eraseblocks = { {8 * 256, 2048/8} },
2532 .block_erase = spi_erase_at45db_block,
2533 }, {
2534 .eraseblocks = {
2535 {8 * 256, 1},
2536 {248 * 256, 1},
2537 {256 * 256, 7},
2538 },
2539 .block_erase = spi_erase_at45db_sector
2540 }, {
2541 .eraseblocks = { {512 * 1024, 1} },
2542 .block_erase = spi_erase_at45db_chip,
2543 }
2544 },
2545 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2546 .printlock = spi_prettyprint_status_register_at45db,
2547 /* granularity will be set by the probing function. */
2548 .write = spi_write_at45db,
2549 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2550 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002551 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002552
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002553 {
2554 .vendor = "Atmel",
2555 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002556 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002557 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002558 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002559 .total_size = 1024 /* or 1056, determined from status register */,
2560 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002561 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002562 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2563 .feature_bits = FEATURE_OTP,
2564 .tested = TEST_UNTESTED,
2565 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002566 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002567 .block_erasers =
2568 {
2569 {
2570 .eraseblocks = { {256, 4096} },
2571 .block_erase = spi_erase_at45db_page,
2572 }, {
2573 .eraseblocks = { {8 * 256, 4096/8} },
2574 .block_erase = spi_erase_at45db_block,
2575 }, {
2576 .eraseblocks = {
2577 {8 * 256, 1},
2578 {248 * 256, 1},
2579 {256 * 256, 15},
2580 },
2581 .block_erase = spi_erase_at45db_sector
2582 }, {
2583 .eraseblocks = { {1024 * 1024, 1} },
2584 .block_erase = spi_erase_at45db_chip,
2585 }
2586 },
2587 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2588 .printlock = spi_prettyprint_status_register_at45db,
2589 /* granularity will be set by the probing function. */
2590 .write = spi_write_at45db,
2591 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002592 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002593 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002595 {
2596 .vendor = "Atmel",
2597 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002600 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002601 .total_size = 2048 /* or 2112, determined from status register */,
2602 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002603 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002604 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2605 .feature_bits = FEATURE_OTP,
2606 .tested = TEST_OK_PREW,
2607 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002608 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002609 .block_erasers =
2610 {
2611 {
2612 .eraseblocks = { {512, 4096} },
2613 .block_erase = spi_erase_at45db_page,
2614 }, {
2615 .eraseblocks = { {8 * 512, 4096/8} },
2616 .block_erase = spi_erase_at45db_block,
2617 }, {
2618 .eraseblocks = {
2619 {8 * 512, 1},
2620 {248 * 512, 1},
2621 {256 * 512, 15},
2622 },
2623 .block_erase = spi_erase_at45db_sector
2624 }, {
2625 .eraseblocks = { {2048 * 1024, 1} },
2626 .block_erase = spi_erase_at45db_chip,
2627 }
2628 },
2629 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2630 .printlock = spi_prettyprint_status_register_at45db,
2631 /* granularity will be set by the probing function. */
2632 .write = spi_write_at45db,
2633 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002634 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002635 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002636
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002637 {
2638 .vendor = "Atmel",
2639 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002640 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002641 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002642 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002643 .total_size = 4224 /* No power of two sizes */,
2644 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002645 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002646 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2647 .feature_bits = FEATURE_OTP,
2648 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002649 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002650 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002651 .block_erasers =
2652 {
2653 {
2654 .eraseblocks = { {528, 8192} },
2655 .block_erase = spi_erase_at45db_page,
2656 }, {
2657 .eraseblocks = { {8 * 528, 8192/8} },
2658 .block_erase = spi_erase_at45db_block,
2659 }, /* Although the datasheets describes sectors (which can be write protected)
2660 * there seems to be no erase functions for them.
2661 {
2662 .eraseblocks = {
2663 {8 * 528, 1},
2664 {120 * 528, 1},
2665 {128 * 528, 63},
2666 },
2667 .block_erase = spi_erase_at45db_sector
2668 }, */ {
2669 .eraseblocks = { {4224 * 1024, 1} },
2670 .block_erase = spi_erase_at45db_chip,
2671 }
2672 },
2673 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2674 .gran = write_gran_528bytes,
2675 .write = spi_write_at45db,
2676 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002677 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002678 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002679
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002680 {
2681 .vendor = "Atmel",
2682 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002683 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002684 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002685 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002686 .total_size = 4096 /* or 4224, determined from status register */,
2687 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002688 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002689 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002690 .feature_bits = FEATURE_OTP,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002691 .tested = TEST_UNTESTED,
2692 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002693 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002694 .block_erasers =
2695 {
2696 {
2697 .eraseblocks = { {512, 8192} },
2698 .block_erase = spi_erase_at45db_page,
2699 }, {
2700 .eraseblocks = { {8 * 512, 8192/8} },
2701 .block_erase = spi_erase_at45db_block,
2702 }, {
2703 .eraseblocks = {
2704 {8 * 512, 1},
2705 {120 * 512, 1},
2706 {128 * 512, 63},
2707 },
2708 .block_erase = spi_erase_at45db_sector
2709 }, {
2710 .eraseblocks = { {4096 * 1024, 1} },
2711 .block_erase = spi_erase_at45db_chip,
2712 }
2713 },
2714 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2715 .printlock = spi_prettyprint_status_register_at45db,
2716 /* granularity will be set by the probing function. */
2717 .write = spi_write_at45db,
2718 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2719 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2720 },
2721
2722 {
2723 .vendor = "Atmel",
2724 .name = "AT45DB321E",
2725 .bustype = BUS_SPI,
2726 .manufacture_id = ATMEL_ID,
2727 .model_id = ATMEL_AT45DB321C,
2728 .total_size = 4096 /* or 4224, determined from status register */,
2729 .page_size = 512 /* or 528, determined from status register */,
2730 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2731 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2732 .feature_bits = FEATURE_OTP,
2733 .tested = TEST_UNTESTED,
2734 .probe = probe_spi_at45db,
2735 .probe_timing = TIMING_ZERO,
2736 .block_erasers =
2737 {
2738 {
2739 .eraseblocks = { {512, 8192} },
2740 .block_erase = spi_erase_at45db_page,
2741 }, {
2742 .eraseblocks = { {8 * 512, 8192/8} },
2743 .block_erase = spi_erase_at45db_block,
2744 }, {
2745 .eraseblocks = {
2746 {8 * 512, 1},
2747 {120 * 512, 1},
2748 {128 * 512, 63},
2749 },
2750 .block_erase = spi_erase_at45db_sector
2751 }, {
2752 .eraseblocks = { {4096 * 1024, 1} },
2753 .block_erase = spi_erase_at45db_chip,
2754 }
2755 },
2756 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2757 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2758 /* granularity will be set by the probing function. */
2759 .write = spi_write_at45db,
2760 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2761 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002762 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002763
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002764 {
2765 .vendor = "Atmel",
2766 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002767 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002768 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002769 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002770 .total_size = 8192 /* or 8448, determined from status register */,
2771 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002772 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002773 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2774 .feature_bits = FEATURE_OTP,
2775 .tested = TEST_UNTESTED,
2776 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002777 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002778 .block_erasers =
2779 {
2780 {
2781 .eraseblocks = { {1024, 8192} },
2782 .block_erase = spi_erase_at45db_page,
2783 }, {
2784 .eraseblocks = { {8 * 1024, 8192/8} },
2785 .block_erase = spi_erase_at45db_block,
2786 }, {
2787 .eraseblocks = {
2788 {8 * 1024, 1},
2789 {248 * 1024, 1},
2790 {256 * 1024, 31},
2791 },
2792 .block_erase = spi_erase_at45db_sector
2793 }, {
2794 .eraseblocks = { {8192 * 1024, 1} },
2795 .block_erase = spi_erase_at45db_chip,
2796 }
2797 },
2798 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2799 .printlock = spi_prettyprint_status_register_at45db,
2800 /* granularity will be set by the probing function. */
2801 .write = spi_write_at45db,
2802 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002803 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002804 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002805
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002806 {
2807 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002808 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002809 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002810 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002811 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002812 .total_size = 64,
2813 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002814 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002815 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002816 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002817 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002818 .block_erasers =
2819 {
2820 {
2821 .eraseblocks = { {64 * 1024, 1} },
2822 .block_erase = erase_chip_block_jedec,
2823 }
2824 },
Sean Nelson35727f72010-01-28 23:55:12 +00002825 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002827 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002828 },
2829
2830 {
2831 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002832 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002833 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002834 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002835 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002836 .total_size = 256,
2837 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002838 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002839 .tested = TEST_UNTESTED,
2840 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002842 .block_erasers =
2843 {
2844 {
2845 .eraseblocks = {
2846 {16 * 1024, 1},
2847 {8 * 1024, 2},
2848 {96 * 1024, 1},
2849 {128 * 1024, 1},
2850 },
2851 .block_erase = erase_sector_jedec,
2852 }, {
2853 .eraseblocks = { {256 * 1024, 1} },
2854 .block_erase = erase_chip_block_jedec,
2855 }
2856 },
Sean Nelson35727f72010-01-28 23:55:12 +00002857 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002858 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002859 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002860 },
2861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002862 {
2863 .vendor = "Atmel",
2864 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002865 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002866 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002867 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002868 .total_size = 256,
2869 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002870 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002871 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002872 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002873 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002874 .block_erasers =
2875 {
2876 {
2877 .eraseblocks = {
2878 {128 * 1024, 1},
2879 {96 * 1024, 1},
2880 {8 * 1024, 2},
2881 {16 * 1024, 1},
2882 },
2883 .block_erase = erase_sector_jedec,
2884 }, {
2885 .eraseblocks = { {256 * 1024, 1} },
2886 .block_erase = erase_chip_block_jedec,
2887 }
2888 },
Sean Nelson35727f72010-01-28 23:55:12 +00002889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002890 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002891 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002892 },
2893
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002894 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002895 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002896 .name = "AT49(H)F010",
2897 .bustype = BUS_PARALLEL,
2898 .manufacture_id = ATMEL_ID,
2899 .model_id = ATMEL_AT49F010,
2900 .total_size = 128,
2901 .page_size = 0, /* unused */
2902 .feature_bits = FEATURE_EITHER_RESET,
2903 .tested = TEST_OK_PREW,
2904 .probe = probe_jedec,
2905 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2906 .block_erasers =
2907 {
2908 {
2909 .eraseblocks = { {128 * 1024, 1} },
2910 .block_erase = erase_chip_block_jedec,
2911 }
2912 },
2913 .printlock = printlock_at49f,
2914 .write = write_jedec_1,
2915 .read = read_memmapped,
2916 .voltage = {4500, 5500},
2917 },
2918
2919 {
2920 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002921 .name = "AT49F020",
2922 .bustype = BUS_PARALLEL,
2923 .manufacture_id = ATMEL_ID,
2924 .model_id = ATMEL_AT49F020,
2925 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002926 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002927 .feature_bits = FEATURE_EITHER_RESET,
2928 .tested = TEST_OK_PRE,
2929 .probe = probe_jedec,
2930 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2931 .block_erasers =
2932 {
2933 {
2934 .eraseblocks = { {256 * 1024, 1} },
2935 .block_erase = erase_chip_block_jedec,
2936 }
2937 /* Chip features an optional permanent write protection
2938 * of the first 8 kB. The erase function is the same as
2939 * above, but 00000H to 01FFFH will not be erased.
2940 * FIXME: add another eraser when partial erasers are
2941 * supported.
2942 */
2943 },
2944 .printlock = printlock_at49f,
2945 .write = write_jedec_1,
2946 .read = read_memmapped,
2947 .voltage = {4500, 5500},
2948 },
2949
2950 {
2951 .vendor = "Atmel",
2952 .name = "AT49F040",
2953 .bustype = BUS_PARALLEL,
2954 .manufacture_id = ATMEL_ID,
2955 .model_id = ATMEL_AT49F040,
2956 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002957 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002958 .feature_bits = FEATURE_EITHER_RESET,
2959 .tested = TEST_UNTESTED,
2960 .probe = probe_jedec,
2961 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2962 .block_erasers =
2963 {
2964 {
2965 .eraseblocks = { {512 * 1024, 1} },
2966 .block_erase = erase_chip_block_jedec,
2967 }
2968 /* Chip features an optional permanent write protection
2969 * of the first 16 kB. The erase function is the same as
2970 * above, but 00000H to 03FFFH will not be erased.
2971 * FIXME: add another eraser when partial erasers are
2972 * supported.
2973 */
2974 },
2975 .printlock = printlock_at49f,
2976 .write = write_jedec_1,
2977 .read = read_memmapped,
2978 .voltage = {4500, 5500},
2979 },
2980
2981 {
2982 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002983 .name = "AT49F080",
2984 .bustype = BUS_PARALLEL,
2985 .manufacture_id = ATMEL_ID,
2986 .model_id = ATMEL_AT49F080,
2987 .total_size = 1024,
2988 .page_size = 0, /* unused */
2989 .feature_bits = FEATURE_EITHER_RESET,
2990 .tested = TEST_UNTESTED,
2991 .probe = probe_jedec,
2992 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2993 .block_erasers =
2994 {
2995 {
2996 .eraseblocks = { {1024 * 1024, 1} },
2997 .block_erase = erase_chip_block_jedec,
2998 }
2999 /* Chip features an optional permanent write protection
3000 * of the first 16 kB. The erase function is the same as
3001 * above, but 00000H to 03FFFH will not be erased.
3002 * FIXME: add another eraser when partial erasers are
3003 * supported.
3004 */
3005 },
3006 .printlock = printlock_at49f,
3007 .write = write_jedec_1,
3008 .read = read_memmapped,
3009 .voltage = {4500, 5500},
3010 },
3011
3012 {
3013 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3014 .vendor = "Atmel",
3015 .name = "AT49F080T",
3016 .bustype = BUS_PARALLEL,
3017 .manufacture_id = ATMEL_ID,
3018 .model_id = ATMEL_AT49F080T,
3019 .total_size = 1024,
3020 .page_size = 0, /* unused */
3021 .feature_bits = FEATURE_EITHER_RESET,
3022 .tested = TEST_UNTESTED,
3023 .probe = probe_jedec,
3024 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3025 .block_erasers =
3026 {
3027 {
3028 .eraseblocks = { {1024 * 1024, 1} },
3029 .block_erase = erase_chip_block_jedec,
3030 }
3031 /* Chip features an optional permanent write protection
3032 * of the first 16 kB. The erase function is the same as
3033 * above, but FC000H to FFFFFH will not be erased.
3034 * FIXME: add another eraser when partial erasers are
3035 * supported.
3036 */
3037 },
3038 .printlock = printlock_at49f,
3039 .write = write_jedec_1,
3040 .read = read_memmapped,
3041 .voltage = {4500, 5500},
3042 },
3043
3044 {
3045 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003046 .name = "AT49LH002",
3047 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3048 .manufacture_id = ATMEL_ID,
3049 .model_id = ATMEL_AT49LH002,
3050 .total_size = 256,
3051 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003052 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003053 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003054 .probe = probe_82802ab,
3055 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003056 .block_erasers =
3057 {
3058 {
3059 .eraseblocks = {
3060 {64 * 1024, 3},
3061 {32 * 1024, 1},
3062 {8 * 1024, 2},
3063 {16 * 1024, 1},
3064 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003065 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003066 }, {
3067 .eraseblocks = {
3068 {64 * 1024, 4},
3069 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003070 .block_erase = erase_block_82802ab,
3071 },
3072 },
3073 .printlock = printlock_regspace2_block_eraser_0,
3074 .unlock = unlock_regspace2_block_eraser_0,
3075 .write = write_82802ab,
3076 .read = read_memmapped,
3077 .voltage = {3000, 3600},
3078 },
3079
3080 {
3081 .vendor = "Atmel",
3082 .name = "AT49LH00B4",
3083 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3084 .manufacture_id = ATMEL_ID,
3085 .model_id = ATMEL_AT49LH00B4,
3086 .total_size = 512,
3087 .page_size = 0, /* unused */
3088 .feature_bits = FEATURE_REGISTERMAP,
3089 .tested = TEST_UNTESTED,
3090 .probe = probe_82802ab,
3091 .probe_timing = TIMING_ZERO,
3092 .block_erasers =
3093 {
3094 {
3095 .eraseblocks = {
3096 {8 * 1024, 2},
3097 {16 * 1024, 1},
3098 {32 * 1024, 1},
3099 {64 * 1024, 7},
3100 },
3101 .block_erase = NULL, /* TODO: Implement. */
3102 }, {
3103 .eraseblocks = {
3104 {64 * 1024, 8},
3105 },
3106 .block_erase = erase_block_82802ab,
3107 },
3108 },
3109 .printlock = printlock_regspace2_block_eraser_0,
3110 .unlock = unlock_regspace2_block_eraser_0,
3111 .write = write_82802ab,
3112 .read = read_memmapped,
3113 .voltage = {3000, 3600},
3114 },
3115
3116 {
3117 .vendor = "Atmel",
3118 .name = "AT49LH004",
3119 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3120 .manufacture_id = ATMEL_ID,
3121 .model_id = ATMEL_AT49LH004,
3122 .total_size = 512,
3123 .page_size = 0, /* unused */
3124 .feature_bits = FEATURE_REGISTERMAP,
3125 .tested = TEST_UNTESTED,
3126 .probe = probe_82802ab,
3127 .probe_timing = TIMING_ZERO,
3128 .block_erasers =
3129 {
3130 {
3131 .eraseblocks = {
3132 {64 * 1024, 7},
3133 {32 * 1024, 1},
3134 {8 * 1024, 2},
3135 {16 * 1024, 1},
3136 },
3137 .block_erase = erase_block_82802ab,
3138 }, {
3139 .eraseblocks = {
3140 {64 * 1024, 8},
3141 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003142 .block_erase = NULL, /* TODO: Implement. */
3143 },
3144 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003145 .printlock = printlock_regspace2_block_eraser_0,
3146 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003147 .write = write_82802ab,
3148 .read = read_memmapped,
3149 .voltage = {3000, 3600},
3150 },
3151
3152 {
Andrew Morganca081462011-09-13 22:05:44 +00003153 .vendor = "Catalyst",
3154 .name = "CAT28F512",
3155 .bustype = BUS_PARALLEL,
3156 .manufacture_id = CATALYST_ID,
3157 .model_id = CATALYST_CAT28F512,
3158 .total_size = 64,
3159 .page_size = 0, /* unused */
3160 .feature_bits = 0,
3161 .tested = TEST_OK_PR,
3162 .probe = probe_jedec, /* FIXME! */
3163 .probe_timing = TIMING_ZERO,
3164 .block_erasers =
3165 {
3166 {
3167 .eraseblocks = { {64 * 1024, 1} },
3168 .block_erase = NULL, /* TODO */
3169 },
3170 },
3171 .write = NULL, /* TODO */
3172 .read = read_memmapped,
3173 .voltage = {4500, 5500},
3174 },
3175
3176 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003177 .vendor = "Bright",
3178 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003179 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003180 .manufacture_id = BRIGHT_ID,
3181 .model_id = BRIGHT_BM29F040,
3182 .total_size = 512,
3183 .page_size = 64 * 1024,
3184 .feature_bits = FEATURE_EITHER_RESET,
3185 .tested = TEST_OK_PR,
3186 .probe = probe_jedec,
3187 .probe_timing = TIMING_ZERO,
3188 .block_erasers =
3189 {
3190 {
3191 .eraseblocks = { {64 * 1024, 8} },
3192 .block_erase = erase_sector_jedec,
3193 }, {
3194 .eraseblocks = { {512 * 1024, 1} },
3195 .block_erase = erase_chip_block_jedec,
3196 },
3197 },
3198 .write = write_jedec_1,
3199 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003200 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003201 },
3202
3203 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003204 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003205 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003206 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003207 .manufacture_id = ESMT_ID,
3208 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003209 .total_size = 256,
3210 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003211 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003212 .tested = TEST_UNTESTED,
3213 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003215 .block_erasers =
3216 {
3217 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003218 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003219 {128 * 1024, 1},
3220 {96 * 1024, 1},
3221 {8 * 1024, 2},
3222 {16 * 1024, 1},
3223 },
3224 .block_erase = erase_sector_jedec,
3225 }, {
3226 .eraseblocks = { {256 * 1024, 1} },
3227 .block_erase = erase_chip_block_jedec,
3228 }
3229 },
Sean Nelson35727f72010-01-28 23:55:12 +00003230 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003231 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003232 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003233 },
3234
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003235 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003236 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003237 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003238 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003239 .manufacture_id = ESMT_ID,
3240 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003241 .total_size = 1024,
3242 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003243 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003244 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003245 .probe = probe_spi_rdid,
3246 .probe_timing = TIMING_ZERO,
3247 .block_erasers =
3248 {
3249 {
3250 .eraseblocks = { {4 * 1024, 256} },
3251 .block_erase = spi_block_erase_20,
3252 }, {
3253 .eraseblocks = { {64 * 1024, 16} },
3254 .block_erase = spi_block_erase_d8,
3255 }, {
3256 .eraseblocks = { {1024 * 1024, 1} },
3257 .block_erase = spi_block_erase_60,
3258 }, {
3259 .eraseblocks = { {1024 * 1024, 1} },
3260 .block_erase = spi_block_erase_c7,
3261 }
3262 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003264 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003265 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003266 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003267 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003268 },
3269
3270 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003271 .vendor = "ESMT",
3272 .name = "F25L32PA",
3273 .bustype = BUS_SPI,
3274 .manufacture_id = ESMT_ID,
3275 .model_id = ESMT_F25L32PA,
3276 .total_size = 4096,
3277 .page_size = 256,
3278 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3279 .tested = TEST_UNTESTED,
3280 .probe = probe_spi_rdid,
3281 .probe_timing = TIMING_ZERO,
3282 .block_erasers =
3283 {
3284 {
3285 .eraseblocks = { {4 * 1024, 1024} },
3286 .block_erase = spi_block_erase_20,
3287 }, {
3288 .eraseblocks = { {64 * 1024, 64} },
3289 .block_erase = spi_block_erase_d8,
3290 }, {
3291 .eraseblocks = { {4 * 1024 * 1024, 1} },
3292 .block_erase = spi_block_erase_60,
3293 }, {
3294 .eraseblocks = { {4 * 1024 * 1024, 1} },
3295 .block_erase = spi_block_erase_c7,
3296 }
3297 },
3298 .printlock = spi_prettyprint_status_register_bp2_bpl,
3299 .unlock = spi_disable_blockprotect,
3300 .write = spi_chip_write_256,
3301 .read = spi_chip_read,
3302 .voltage = {2700, 3600},
3303 },
3304
3305 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003306 .vendor = "Eon",
3307 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003308 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003309 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003310 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003311 .total_size = 64,
3312 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003313 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003314 .tested = TEST_UNTESTED,
3315 .probe = probe_spi_rdid,
3316 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003317 .block_erasers =
3318 {
3319 {
3320 .eraseblocks = {
3321 {4 * 1024, 2},
3322 {8 * 1024, 1},
3323 {16 * 1024, 1},
3324 {32 * 1024, 1},
3325 },
3326 .block_erase = spi_block_erase_d8,
3327 }, {
3328 .eraseblocks = { {64 * 1024, 1} },
3329 .block_erase = spi_block_erase_c7,
3330 }
3331 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003332 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003333 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003334 .write = spi_chip_write_256,
3335 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003336 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003337 },
3338
3339 {
3340 .vendor = "Eon",
3341 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003342 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003343 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003344 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003345 .total_size = 64,
3346 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003347 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003348 .tested = TEST_UNTESTED,
3349 .probe = probe_spi_rdid,
3350 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003351 .block_erasers =
3352 {
3353 {
3354 .eraseblocks = {
3355 {32 * 1024, 1},
3356 {16 * 1024, 1},
3357 {8 * 1024, 1},
3358 {4 * 1024, 2},
3359 },
3360 .block_erase = spi_block_erase_d8,
3361 }, {
3362 .eraseblocks = { {64 * 1024, 1} },
3363 .block_erase = spi_block_erase_c7,
3364 }
3365 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003366 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003367 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003368 .write = spi_chip_write_256,
3369 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003370 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003371 },
3372
3373 {
3374 .vendor = "Eon",
3375 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003376 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003377 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003378 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003379 .total_size = 128,
3380 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003381 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003382 .tested = TEST_UNTESTED,
3383 .probe = probe_spi_rdid,
3384 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003385 .block_erasers =
3386 {
3387 {
3388 .eraseblocks = {
3389 {4 * 1024, 2},
3390 {8 * 1024, 1},
3391 {16 * 1024, 1},
3392 {32 * 1024, 3},
3393 },
3394 .block_erase = spi_block_erase_d8,
3395 }, {
3396 .eraseblocks = { {128 * 1024, 1} },
3397 .block_erase = spi_block_erase_c7,
3398 }
3399 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003400 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003401 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003402 .write = spi_chip_write_256,
3403 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003404 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003405 },
3406
3407 {
3408 .vendor = "Eon",
3409 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003410 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003411 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003412 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003413 .total_size = 128,
3414 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003415 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003416 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003417 .probe = probe_spi_rdid,
3418 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003419 .block_erasers =
3420 {
3421 {
3422 .eraseblocks = {
3423 {32 * 1024, 3},
3424 {16 * 1024, 1},
3425 {8 * 1024, 1},
3426 {4 * 1024, 2},
3427 },
3428 .block_erase = spi_block_erase_d8,
3429 }, {
3430 .eraseblocks = { {128 * 1024, 1} },
3431 .block_erase = spi_block_erase_c7,
3432 }
3433 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003434 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003435 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003436 .write = spi_chip_write_256,
3437 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003438 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003439 },
3440
3441 {
3442 .vendor = "Eon",
3443 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003444 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003445 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003446 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003447 .total_size = 256,
3448 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003449 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003450 .tested = TEST_UNTESTED,
3451 .probe = probe_spi_rdid,
3452 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003453 .block_erasers =
3454 {
3455 {
3456 .eraseblocks = {
3457 {4 * 1024, 2},
3458 {8 * 1024, 1},
3459 {16 * 1024, 1},
3460 {32 * 1024, 1},
3461 {64 * 1024, 3}
3462 },
3463 .block_erase = spi_block_erase_d8,
3464 }, {
3465 .eraseblocks = { {256 * 1024, 1} },
3466 .block_erase = spi_block_erase_c7,
3467 }
3468 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003469 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003470 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003471 .write = spi_chip_write_256,
3472 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003473 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003474 },
3475
3476 {
3477 .vendor = "Eon",
3478 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003479 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003480 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003481 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003482 .total_size = 256,
3483 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003484 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003485 .tested = TEST_UNTESTED,
3486 .probe = probe_spi_rdid,
3487 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003488 .block_erasers =
3489 {
3490 {
3491 .eraseblocks = {
3492 {64 * 1024, 3},
3493 {32 * 1024, 1},
3494 {16 * 1024, 1},
3495 {8 * 1024, 1},
3496 {4 * 1024, 2},
3497 },
3498 .block_erase = spi_block_erase_d8,
3499 }, {
3500 .eraseblocks = { {256 * 1024, 1} },
3501 .block_erase = spi_block_erase_c7,
3502 }
3503 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003504 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003505 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003506 .write = spi_chip_write_256,
3507 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003508 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003509 },
3510
3511 {
3512 .vendor = "Eon",
3513 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003514 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003515 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003516 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003517 .total_size = 512,
3518 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003519 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003520 .tested = TEST_UNTESTED,
3521 .probe = probe_spi_rdid,
3522 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003523 .block_erasers =
3524 {
3525 {
3526 .eraseblocks = {
3527 {4 * 1024, 2},
3528 {8 * 1024, 1},
3529 {16 * 1024, 1},
3530 {32 * 1024, 1},
3531 {64 * 1024, 7}
3532 },
3533 .block_erase = spi_block_erase_d8,
3534 }, {
3535 .eraseblocks = { {512 * 1024, 1} },
3536 .block_erase = spi_block_erase_c7,
3537 }
3538 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003539 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003540 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003541 .write = spi_chip_write_256,
3542 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003543 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003544 },
3545
3546 {
3547 .vendor = "Eon",
3548 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003549 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003550 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003551 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003552 .total_size = 512,
3553 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003554 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003555 .tested = TEST_UNTESTED,
3556 .probe = probe_spi_rdid,
3557 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003558 .block_erasers =
3559 {
3560 {
3561 .eraseblocks = {
3562 {64 * 1024, 7},
3563 {32 * 1024, 1},
3564 {16 * 1024, 1},
3565 {8 * 1024, 1},
3566 {4 * 1024, 2},
3567 },
3568 .block_erase = spi_block_erase_d8,
3569 }, {
3570 .eraseblocks = { {512 * 1024, 1} },
3571 .block_erase = spi_block_erase_c7,
3572 }
3573 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003574 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003575 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003576 .write = spi_chip_write_256,
3577 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003578 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003579 },
3580
3581 {
3582 .vendor = "Eon",
3583 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003584 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003585 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003586 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003587 .total_size = 1024,
3588 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003589 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003590 .tested = TEST_UNTESTED,
3591 .probe = probe_spi_rdid,
3592 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003593 .block_erasers =
3594 {
3595 {
3596 .eraseblocks = {
3597 {4 * 1024, 2},
3598 {8 * 1024, 1},
3599 {16 * 1024, 1},
3600 {32 * 1024, 1},
3601 {64 * 1024, 15}
3602 },
3603 .block_erase = spi_block_erase_d8,
3604 }, {
3605 .eraseblocks = { {1024 * 1024, 1} },
3606 .block_erase = spi_block_erase_c7,
3607 }
3608 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003609 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003610 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003611 .write = spi_chip_write_256,
3612 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003613 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003614 },
3615
3616 {
3617 .vendor = "Eon",
3618 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003619 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003620 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003621 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003622 .total_size = 1024,
3623 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003624 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003625 .tested = TEST_UNTESTED,
3626 .probe = probe_spi_rdid,
3627 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003628 .block_erasers =
3629 {
3630 {
3631 .eraseblocks = {
3632 {64 * 1024, 15},
3633 {32 * 1024, 1},
3634 {16 * 1024, 1},
3635 {8 * 1024, 1},
3636 {4 * 1024, 2},
3637 },
3638 .block_erase = spi_block_erase_d8,
3639 }, {
3640 .eraseblocks = { {1024 * 1024, 1} },
3641 .block_erase = spi_block_erase_c7,
3642 }
3643 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003644 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003645 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003646 .write = spi_chip_write_256,
3647 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003648 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003649 },
3650
3651 {
3652 .vendor = "Eon",
3653 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003654 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003655 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003656 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003657 .total_size = 2048,
3658 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003659 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003660 .tested = TEST_UNTESTED,
3661 .probe = probe_spi_rdid,
3662 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003663 .block_erasers =
3664 {
3665 {
3666 .eraseblocks = {
3667 {4 * 1024, 2},
3668 {8 * 1024, 1},
3669 {16 * 1024, 1},
3670 {32 * 1024, 1},
3671 {64 * 1024, 31},
3672 },
3673 .block_erase = spi_block_erase_d8,
3674 }, {
3675 .eraseblocks = { {2 * 1024 * 1024, 1} },
3676 .block_erase = spi_block_erase_c7,
3677 }
3678 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003679 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003680 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003681 .write = spi_chip_write_256,
3682 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003683 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003684 },
3685
3686 {
3687 .vendor = "Eon",
3688 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003689 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003690 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003691 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003692 .total_size = 2048,
3693 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003694 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003695 .tested = TEST_UNTESTED,
3696 .probe = probe_spi_rdid,
3697 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003698 .block_erasers =
3699 {
3700 {
3701 .eraseblocks = {
3702 {64 * 1024, 31},
3703 {32 * 1024, 1},
3704 {16 * 1024, 1},
3705 {8 * 1024, 1},
3706 {4 * 1024, 2},
3707 },
3708 .block_erase = spi_block_erase_d8,
3709 }, {
3710 .eraseblocks = { {2 * 1024 * 1024, 1} },
3711 .block_erase = spi_block_erase_c7,
3712 }
3713 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003714 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003715 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003716 .write = spi_chip_write_256,
3717 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003718 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003719 },
3720
3721 {
3722 .vendor = "Eon",
3723 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003724 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003725 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003726 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003727 .total_size = 4096,
3728 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003729 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003730 .tested = TEST_UNTESTED,
3731 .probe = probe_spi_rdid,
3732 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003733 .block_erasers =
3734 {
3735 {
3736 .eraseblocks = {
3737 {4 * 1024, 2},
3738 {8 * 1024, 1},
3739 {16 * 1024, 1},
3740 {32 * 1024, 1},
3741 {64 * 1024, 63},
3742 },
3743 .block_erase = spi_block_erase_d8,
3744 }, {
3745 .eraseblocks = { {4 * 1024 * 1024, 1} },
3746 .block_erase = spi_block_erase_c7,
3747 }
3748 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003749 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003750 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003751 .write = spi_chip_write_256,
3752 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003753 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003754 },
3755
3756 {
3757 .vendor = "Eon",
3758 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003759 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003760 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003761 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003762 .total_size = 4096,
3763 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003764 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003765 .tested = TEST_UNTESTED,
3766 .probe = probe_spi_rdid,
3767 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003768 .block_erasers =
3769 {
3770 {
3771 .eraseblocks = {
3772 {64 * 1024, 63},
3773 {32 * 1024, 1},
3774 {16 * 1024, 1},
3775 {8 * 1024, 1},
3776 {4 * 1024, 2},
3777 },
3778 .block_erase = spi_block_erase_d8,
3779 }, {
3780 .eraseblocks = { {4 * 1024 * 1024, 1} },
3781 .block_erase = spi_block_erase_c7,
3782 }
3783 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003784 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003785 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003786 .write = spi_chip_write_256,
3787 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003788 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003789 },
3790
3791 {
3792 .vendor = "Eon",
3793 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003794 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003795 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003796 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003797 .total_size = 8192,
3798 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003799 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003800 .tested = TEST_UNTESTED,
3801 .probe = probe_spi_rdid,
3802 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003803 .block_erasers =
3804 {
3805 {
3806 .eraseblocks = {
3807 {4 * 1024, 2},
3808 {8 * 1024, 1},
3809 {16 * 1024, 1},
3810 {32 * 1024, 1},
3811 {64 * 1024, 127},
3812 },
3813 .block_erase = spi_block_erase_d8,
3814 }, {
3815 .eraseblocks = { {8 * 1024 * 1024, 1} },
3816 .block_erase = spi_block_erase_c7,
3817 }
3818 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003819 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003820 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003821 .write = spi_chip_write_256,
3822 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003823 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003824 },
3825
3826 {
3827 .vendor = "Eon",
3828 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003829 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003830 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003831 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00003832 .total_size = 8192,
3833 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003834 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003835 .tested = TEST_UNTESTED,
3836 .probe = probe_spi_rdid,
3837 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003838 .block_erasers =
3839 {
3840 {
3841 .eraseblocks = {
3842 {64 * 1024, 127},
3843 {32 * 1024, 1},
3844 {16 * 1024, 1},
3845 {8 * 1024, 1},
3846 {4 * 1024, 2},
3847 },
3848 .block_erase = spi_block_erase_d8,
3849 }, {
3850 .eraseblocks = { {8 * 1024 * 1024, 1} },
3851 .block_erase = spi_block_erase_c7,
3852 }
3853 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003854 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003855 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003856 .write = spi_chip_write_256,
3857 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003858 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003859 },
3860
3861 {
3862 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003863 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003864 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003865 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003866 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003867 .total_size = 64,
3868 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003869 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00003870 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003871 .probe = probe_spi_rdid,
3872 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003873 .block_erasers =
3874 {
3875 {
3876 .eraseblocks = { {4 * 1024, 16} },
3877 .block_erase = spi_block_erase_20,
3878 }, {
3879 .eraseblocks = { {32 * 1024, 2} },
3880 .block_erase = spi_block_erase_d8,
3881 }, {
3882 .eraseblocks = { {32 * 1024, 2} },
3883 .block_erase = spi_block_erase_52,
3884 }, {
3885 .eraseblocks = { {64 * 1024, 1} },
3886 .block_erase = spi_block_erase_60,
3887 }, {
3888 .eraseblocks = { {64 * 1024, 1} },
3889 .block_erase = spi_block_erase_c7,
3890 }
3891 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003892 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003893 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003894 .write = spi_chip_write_256,
3895 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003896 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003897 },
3898
3899 {
3900 .vendor = "Eon",
3901 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003902 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003903 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003904 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003905 .total_size = 128,
3906 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003907 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003908 .tested = TEST_UNTESTED,
3909 .probe = probe_spi_rdid,
3910 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003911 .block_erasers =
3912 {
3913 {
3914 .eraseblocks = { {4 * 1024, 32} },
3915 .block_erase = spi_block_erase_20,
3916 }, {
3917 .eraseblocks = { {32 * 1024, 4} },
3918 .block_erase = spi_block_erase_d8,
3919 }, {
3920 .eraseblocks = { {32 * 1024, 4} },
3921 .block_erase = spi_block_erase_52,
3922 }, {
3923 .eraseblocks = { {128 * 1024, 1} },
3924 .block_erase = spi_block_erase_60,
3925 }, {
3926 .eraseblocks = { {128 * 1024, 1} },
3927 .block_erase = spi_block_erase_c7,
3928 }
3929 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003930 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003931 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003932 .write = spi_chip_write_256,
3933 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003934 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003935 },
3936
3937 {
3938 .vendor = "Eon",
3939 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003940 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003941 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003942 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003943 .total_size = 256,
3944 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003945 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003946 .tested = TEST_UNTESTED,
3947 .probe = probe_spi_rdid,
3948 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003949 .block_erasers =
3950 {
3951 {
3952 .eraseblocks = { {4 * 1024, 64} },
3953 .block_erase = spi_block_erase_20,
3954 }, {
3955 .eraseblocks = { {64 * 1024, 4} },
3956 .block_erase = spi_block_erase_d8,
3957 }, {
3958 .eraseblocks = { {64 * 1024, 4} },
3959 .block_erase = spi_block_erase_52,
3960 }, {
3961 .eraseblocks = { {256 * 1024, 1} },
3962 .block_erase = spi_block_erase_60,
3963 }, {
3964 .eraseblocks = { {256 * 1024, 1} },
3965 .block_erase = spi_block_erase_c7,
3966 }
3967 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003968 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003969 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003970 .write = spi_chip_write_256,
3971 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003972 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003973 },
3974
3975 {
3976 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003977 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003978 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003979 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003980 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003981 .total_size = 512,
3982 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003983 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00003984 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003985 .probe = probe_spi_rdid,
3986 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003987 .block_erasers =
3988 {
3989 {
Sean Nelson54596372010-01-09 05:30:14 +00003990 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003991 .block_erase = spi_block_erase_20,
3992 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003993 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003994 .block_erase = spi_block_erase_d8,
3995 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003996 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003997 .block_erase = spi_block_erase_60,
3998 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003999 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004000 .block_erase = spi_block_erase_c7,
4001 },
4002 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004003 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004004 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004005 .write = spi_chip_write_256,
4006 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004007 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004008 },
4009
4010 {
4011 .vendor = "Eon",
4012 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004013 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004014 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004015 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004016 .total_size = 1024,
4017 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004018 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004019 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004020 .probe = probe_spi_rdid,
4021 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004022 .block_erasers =
4023 {
4024 {
4025 .eraseblocks = { {4 * 1024, 256} },
4026 .block_erase = spi_block_erase_20,
4027 }, {
4028 .eraseblocks = { {64 * 1024, 16} },
4029 .block_erase = spi_block_erase_d8,
4030 }, {
4031 .eraseblocks = { {1024 * 1024, 1} },
4032 .block_erase = spi_block_erase_60,
4033 }, {
4034 .eraseblocks = { {1024 * 1024, 1} },
4035 .block_erase = spi_block_erase_c7,
4036 }
4037 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004038 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004039 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004040 .write = spi_chip_write_256,
4041 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004042 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004043 },
4044
4045 {
4046 .vendor = "Eon",
4047 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004048 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004049 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004050 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004051 .total_size = 2048,
4052 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004053 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004054 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004055 .probe = probe_spi_rdid,
4056 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004057 .block_erasers =
4058 {
4059 {
4060 .eraseblocks = { {4 * 1024, 512} },
4061 .block_erase = spi_block_erase_20,
4062 }, {
4063 .eraseblocks = { {64 * 1024, 32} },
4064 .block_erase = spi_block_erase_d8,
4065 }, {
4066 .eraseblocks = { {2 * 1024 * 1024, 1} },
4067 .block_erase = spi_block_erase_60,
4068 }, {
4069 .eraseblocks = { {2 * 1024 * 1024, 1} },
4070 .block_erase = spi_block_erase_c7,
4071 }
4072 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004073 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004074 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004075 .write = spi_chip_write_256,
4076 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004077 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004078 },
4079
4080 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004081 .vendor = "Eon",
4082 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004083 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004084 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004085 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004086 .total_size = 4096,
4087 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004088 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004089 .tested = TEST_UNTESTED,
4090 .probe = probe_spi_rdid,
4091 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004092 .block_erasers =
4093 {
4094 {
4095 .eraseblocks = { {4 * 1024, 1024} },
4096 .block_erase = spi_block_erase_20,
4097 }, {
4098 .eraseblocks = { {64 * 1024, 64} },
4099 .block_erase = spi_block_erase_d8,
4100 }, {
4101 .eraseblocks = { {4 * 1024 * 1024, 1} },
4102 .block_erase = spi_block_erase_60,
4103 }, {
4104 .eraseblocks = { {4 * 1024 * 1024, 1} },
4105 .block_erase = spi_block_erase_c7,
4106 }
4107 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004108 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004109 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004110 .write = spi_chip_write_256,
4111 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004112 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004113 },
4114
4115 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004116 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004117 .name = "EN25F64",
4118 .bustype = BUS_SPI,
4119 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004120 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004121 .total_size = 8192,
4122 .page_size = 256,
4123 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004124 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004125 .probe = probe_spi_rdid,
4126 .probe_timing = TIMING_ZERO,
4127 .block_erasers =
4128 {
4129 {
4130 .eraseblocks = { {4 * 1024, 2048} },
4131 .block_erase = spi_block_erase_20,
4132 }, {
4133 .eraseblocks = { {64 * 1024, 128} },
4134 .block_erase = spi_block_erase_d8,
4135 }, {
4136 .eraseblocks = { {8 * 1024 * 1024, 1} },
4137 .block_erase = spi_block_erase_60,
4138 }, {
4139 .eraseblocks = { {8 * 1024 * 1024, 1} },
4140 .block_erase = spi_block_erase_c7,
4141 }
4142 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004143 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004144 .unlock = spi_disable_blockprotect,
4145 .write = spi_chip_write_256,
4146 .read = spi_chip_read,
4147 .voltage = {2700, 3600},
4148 },
4149
4150 {
4151 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004152 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004153 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004154 .manufacture_id = EON_ID_NOPREFIX,
4155 .model_id = EON_EN25Q40,
4156 .total_size = 512,
4157 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004158 /* OTP: 256B total; enter 0x3A */
4159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers =
4164 {
4165 {
4166 .eraseblocks = { {4 * 1024, 128} },
4167 .block_erase = spi_block_erase_20,
4168 }, {
4169 .eraseblocks = { {64 * 1024, 8} },
4170 .block_erase = spi_block_erase_d8,
4171 }, {
4172 .eraseblocks = { {512 * 1024, 1} },
4173 .block_erase = spi_block_erase_60,
4174 }, {
4175 .eraseblocks = { {512 * 1024, 1} },
4176 .block_erase = spi_block_erase_c7,
4177 }
4178 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004179 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004180 .unlock = spi_disable_blockprotect,
4181 .write = spi_chip_write_256,
4182 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004183 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004184 },
4185
4186 {
4187 .vendor = "Eon",
4188 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004189 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004190 .manufacture_id = EON_ID_NOPREFIX,
4191 .model_id = EON_EN25Q80,
4192 .total_size = 1024,
4193 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004194 /* OTP: 256B total; enter 0x3A */
4195 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004196 .tested = TEST_UNTESTED,
4197 .probe = probe_spi_rdid,
4198 .probe_timing = TIMING_ZERO,
4199 .block_erasers =
4200 {
4201 {
4202 .eraseblocks = { {4 * 1024, 256} },
4203 .block_erase = spi_block_erase_20,
4204 }, {
4205 .eraseblocks = { {64 * 1024, 16} },
4206 .block_erase = spi_block_erase_d8,
4207 }, {
4208 .eraseblocks = { {1024 * 1024, 1} },
4209 .block_erase = spi_block_erase_60,
4210 }, {
4211 .eraseblocks = { {1024 * 1024, 1} },
4212 .block_erase = spi_block_erase_c7,
4213 }
4214 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004215 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004216 .unlock = spi_disable_blockprotect,
4217 .write = spi_chip_write_256,
4218 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004219 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004220 },
4221
4222 {
4223 /* Note: EN25D16 is an evil twin which shares the model ID
4224 but has different write protection capabilities */
4225 .vendor = "Eon",
4226 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004227 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004228 .manufacture_id = EON_ID_NOPREFIX,
4229 .model_id = EON_EN25Q16,
4230 .total_size = 2048,
4231 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004232 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4233 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004234 .tested = TEST_UNTESTED,
4235 .probe = probe_spi_rdid,
4236 .probe_timing = TIMING_ZERO,
4237 .block_erasers =
4238 {
4239 {
4240 .eraseblocks = { {4 * 1024, 512} },
4241 .block_erase = spi_block_erase_20,
4242 }, {
4243 .eraseblocks = { {64 * 1024, 32} },
4244 .block_erase = spi_block_erase_d8,
4245 }, {
4246 /* not supported by Q16 version */
4247 .eraseblocks = { {64 * 1024, 32} },
4248 .block_erase = spi_block_erase_52,
4249 }, {
4250 .eraseblocks = { {2 * 1024 * 1024, 1} },
4251 .block_erase = spi_block_erase_60,
4252 }, {
4253 .eraseblocks = { {2 * 1024 * 1024, 1} },
4254 .block_erase = spi_block_erase_c7,
4255 }
4256 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004257 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004258 .unlock = spi_disable_blockprotect,
4259 .write = spi_chip_write_256,
4260 .read = spi_chip_read,
4261 .voltage = {2700, 3600},
4262 },
4263
4264 {
4265 .vendor = "Eon",
4266 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004267 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004268 .manufacture_id = EON_ID_NOPREFIX,
4269 .model_id = EON_EN25Q32,
4270 .total_size = 4096,
4271 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004272 /* OTP: 512B total; enter 0x3A */
4273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004274 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004275 .probe = probe_spi_rdid,
4276 .probe_timing = TIMING_ZERO,
4277 .block_erasers =
4278 {
4279 {
4280 .eraseblocks = { {4 * 1024, 1024} },
4281 .block_erase = spi_block_erase_20,
4282 }, {
4283 .eraseblocks = { {64 * 1024, 64} },
4284 .block_erase = spi_block_erase_d8,
4285 }, {
4286 .eraseblocks = { {4 * 1024 * 1024, 1} },
4287 .block_erase = spi_block_erase_60,
4288 }, {
4289 .eraseblocks = { {4 * 1024 * 1024, 1} },
4290 .block_erase = spi_block_erase_c7,
4291 }
4292 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004294 .unlock = spi_disable_blockprotect,
4295 .write = spi_chip_write_256,
4296 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004297 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004298 },
4299
4300 {
4301 .vendor = "Eon",
4302 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004303 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004304 .manufacture_id = EON_ID_NOPREFIX,
4305 .model_id = EON_EN25Q64,
4306 .total_size = 8192,
4307 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004308 /* OTP: 512B total; enter 0x3A */
4309 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004310 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004311 .probe = probe_spi_rdid,
4312 .probe_timing = TIMING_ZERO,
4313 .block_erasers =
4314 {
4315 {
4316 .eraseblocks = { {4 * 1024, 2048} },
4317 .block_erase = spi_block_erase_20,
4318 }, {
4319 .eraseblocks = { {64 * 1024, 128} },
4320 .block_erase = spi_block_erase_d8,
4321 }, {
4322 .eraseblocks = { {8 * 1024 * 1024, 1} },
4323 .block_erase = spi_block_erase_60,
4324 }, {
4325 .eraseblocks = { {8 * 1024 * 1024, 1} },
4326 .block_erase = spi_block_erase_c7,
4327 }
4328 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004329 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004330 .unlock = spi_disable_blockprotect,
4331 .write = spi_chip_write_256,
4332 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004333 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004334 },
4335
4336 {
4337 .vendor = "Eon",
4338 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004339 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004340 .manufacture_id = EON_ID_NOPREFIX,
4341 .model_id = EON_EN25Q128,
4342 .total_size = 16384,
4343 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004344 /* OTP: 512B total; enter 0x3A */
4345 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004346 .tested = TEST_UNTESTED,
4347 .probe = probe_spi_rdid,
4348 .probe_timing = TIMING_ZERO,
4349 .block_erasers =
4350 {
4351 {
4352 .eraseblocks = { {4 * 1024, 4096} },
4353 .block_erase = spi_block_erase_20,
4354 }, {
4355 .eraseblocks = { {64 * 1024, 256} },
4356 .block_erase = spi_block_erase_d8,
4357 }, {
4358 .eraseblocks = { {16 * 1024 * 1024, 1} },
4359 .block_erase = spi_block_erase_60,
4360 }, {
4361 .eraseblocks = { {16 * 1024 * 1024, 1} },
4362 .block_erase = spi_block_erase_c7,
4363 }
4364 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004365 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004366 .unlock = spi_disable_blockprotect,
4367 .write = spi_chip_write_256,
4368 .read = spi_chip_read,
4369 },
4370
4371 {
4372 .vendor = "Eon",
4373 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004374 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004375 .manufacture_id = EON_ID_NOPREFIX,
4376 .model_id = EON_EN25QH16,
4377 .total_size = 2048,
4378 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004379 /* supports SFDP */
4380 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004381 /* QPI enable 0x38, disable 0xFF */
4382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00004383 .tested = TEST_OK_PR,
David Hendricks6d715302011-07-24 22:21:57 +00004384 .probe = probe_spi_rdid,
4385 .probe_timing = TIMING_ZERO,
4386 .block_erasers =
4387 {
4388 {
4389 .eraseblocks = { {4 * 1024, 512} },
4390 .block_erase = spi_block_erase_20,
4391 }, {
4392 .eraseblocks = { {64 * 1024, 32} },
4393 .block_erase = spi_block_erase_d8,
4394 }, {
4395 .eraseblocks = { {1024 * 2048, 1} },
4396 .block_erase = spi_block_erase_60,
4397 }, {
4398 .eraseblocks = { {1024 * 2048, 1} },
4399 .block_erase = spi_block_erase_c7,
4400 }
4401 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004402 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004403 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004404 .write = spi_chip_write_256,
4405 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004406 .voltage = {2700, 3600},
4407 },
4408
4409 {
4410 .vendor = "Eon",
4411 .name = "EN25QH32",
4412 .bustype = BUS_SPI,
4413 .manufacture_id = EON_ID_NOPREFIX,
4414 .model_id = EON_EN25QH32,
4415 .total_size = 4096,
4416 .page_size = 256,
4417 /* supports SFDP */
4418 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004419 /* QPI enable 0x38, disable 0xFF */
4420 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004421 .tested = TEST_UNTESTED,
4422 .probe = probe_spi_rdid,
4423 .probe_timing = TIMING_ZERO,
4424 .block_erasers =
4425 {
4426 {
4427 .eraseblocks = { {4 * 1024, 1024} },
4428 .block_erase = spi_block_erase_20,
4429 }, {
4430 .eraseblocks = { {64 * 1024, 64} },
4431 .block_erase = spi_block_erase_d8,
4432 }, {
4433 .eraseblocks = { {1024 * 4096, 1} },
4434 .block_erase = spi_block_erase_60,
4435 }, {
4436 .eraseblocks = { {1024 * 4096, 1} },
4437 .block_erase = spi_block_erase_c7,
4438 }
4439 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004440 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004441 .unlock = spi_disable_blockprotect_bp3_srwd,
4442 .write = spi_chip_write_256,
4443 .read = spi_chip_read,
4444 .voltage = {2700, 3600},
4445 },
4446
4447 {
4448 .vendor = "Eon",
4449 .name = "EN25QH64",
4450 .bustype = BUS_SPI,
4451 .manufacture_id = EON_ID_NOPREFIX,
4452 .model_id = EON_EN25QH64,
4453 .total_size = 8192,
4454 .page_size = 256,
4455 /* supports SFDP */
4456 /* OTP: 512B total; enter 0x3A */
4457 /* QPI enable 0x38, disable 0xFF */
4458 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004459 .tested = TEST_OK_PR,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004460 .probe = probe_spi_rdid,
4461 .probe_timing = TIMING_ZERO,
4462 .block_erasers = {
4463 {
4464 .eraseblocks = { {4 * 1024, 2048} },
4465 .block_erase = spi_block_erase_20,
4466 }, {
4467 .eraseblocks = { {64 * 1024, 128} },
4468 .block_erase = spi_block_erase_d8,
4469 }, {
4470 .eraseblocks = { { 8192 * 1024, 1} },
4471 .block_erase = spi_block_erase_60,
4472 }, {
4473 .eraseblocks = { { 8192 * 1024, 1} },
4474 .block_erase = spi_block_erase_c7,
4475 }
4476 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004477 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004478 .unlock = spi_disable_blockprotect_bp3_srwd,
4479 .write = spi_chip_write_256,
4480 .read = spi_chip_read,
4481 .voltage = {2700, 3600},
4482 },
4483
4484 {
4485 .vendor = "Eon",
4486 .name = "EN25QH128",
4487 .bustype = BUS_SPI,
4488 .manufacture_id = EON_ID_NOPREFIX,
4489 .model_id = EON_EN25QH128,
4490 .total_size = 16384,
4491 .page_size = 256,
4492 /* supports SFDP */
4493 /* OTP: 512B total; enter 0x3A */
4494 /* QPI enable 0x38, disable 0xFF */
4495 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4496 .tested = TEST_UNTESTED,
4497 .probe = probe_spi_rdid,
4498 .probe_timing = TIMING_ZERO,
4499 .block_erasers = {
4500 {
4501 .eraseblocks = { {4 * 1024, 4096} },
4502 .block_erase = spi_block_erase_20,
4503 }, {
4504 .eraseblocks = { {64 * 1024, 256} },
4505 .block_erase = spi_block_erase_d8,
4506 }, {
4507 .eraseblocks = { { 16384 * 1024, 1} },
4508 .block_erase = spi_block_erase_60,
4509 }, {
4510 .eraseblocks = { { 16384 * 1024, 1} },
4511 .block_erase = spi_block_erase_c7,
4512 }
4513 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004514 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004515 .unlock = spi_disable_blockprotect_bp3_srwd,
4516 .write = spi_chip_write_256,
4517 .read = spi_chip_read,
4518 .voltage = {2700, 3600},
4519 },
4520
4521 {
4522 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004523 .name = "EN25S10",
4524 .bustype = BUS_SPI,
4525 .manufacture_id = EON_ID_NOPREFIX,
4526 .model_id = EON_EN25S10,
4527 .total_size = 128,
4528 .page_size = 256,
4529 /* OTP: 256B total; enter 0x3A */
4530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4531 .tested = TEST_UNTESTED,
4532 .probe = probe_spi_rdid,
4533 .probe_timing = TIMING_ZERO,
4534 .block_erasers = {
4535 {
4536 .eraseblocks = { {4 * 1024, 32} },
4537 .block_erase = spi_block_erase_20,
4538 }, {
4539 .eraseblocks = { {32 * 1024, 4} },
4540 .block_erase = spi_block_erase_52,
4541 }, {
4542 .eraseblocks = { {128 * 1024, 1} },
4543 .block_erase = spi_block_erase_60,
4544 }, {
4545 .eraseblocks = { {128 * 1024, 1} },
4546 .block_erase = spi_block_erase_c7,
4547 }
4548 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004549 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004550 .unlock = spi_disable_blockprotect,
4551 .write = spi_chip_write_256,
4552 .read = spi_chip_read,
4553 .voltage = {1650, 1950},
4554 },
4555
4556 {
4557 .vendor = "Eon",
4558 .name = "EN25S20",
4559 .bustype = BUS_SPI,
4560 .manufacture_id = EON_ID_NOPREFIX,
4561 .model_id = EON_EN25S20,
4562 .total_size = 256,
4563 .page_size = 256,
4564 /* OTP: 256B total; enter 0x3A */
4565 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4566 .tested = TEST_UNTESTED,
4567 .probe = probe_spi_rdid,
4568 .probe_timing = TIMING_ZERO,
4569 .block_erasers = {
4570 {
4571 .eraseblocks = { {4 * 1024, 64} },
4572 .block_erase = spi_block_erase_20,
4573 }, {
4574 .eraseblocks = { {64 * 1024, 4} },
4575 .block_erase = spi_block_erase_d8,
4576 }, {
4577 .eraseblocks = { {256 * 1024, 1} },
4578 .block_erase = spi_block_erase_60,
4579 }, {
4580 .eraseblocks = { {256 * 1024, 1} },
4581 .block_erase = spi_block_erase_c7,
4582 }
4583 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004584 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004585 .unlock = spi_disable_blockprotect,
4586 .write = spi_chip_write_256,
4587 .read = spi_chip_read,
4588 .voltage = {1650, 1950},
4589 },
4590
4591 {
4592 .vendor = "Eon",
4593 .name = "EN25S40",
4594 .bustype = BUS_SPI,
4595 .manufacture_id = EON_ID_NOPREFIX,
4596 .model_id = EON_EN25S40,
4597 .total_size = 512,
4598 .page_size = 256,
4599 /* OTP: 256B total; enter 0x3A */
4600 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4601 .tested = TEST_UNTESTED,
4602 .probe = probe_spi_rdid,
4603 .probe_timing = TIMING_ZERO,
4604 .block_erasers = {
4605 {
4606 .eraseblocks = { {4 * 1024, 128} },
4607 .block_erase = spi_block_erase_20,
4608 }, {
4609 .eraseblocks = { {64 * 1024, 8} },
4610 .block_erase = spi_block_erase_d8,
4611 }, {
4612 .eraseblocks = { {512 * 1024, 1} },
4613 .block_erase = spi_block_erase_60,
4614 }, {
4615 .eraseblocks = { {512 * 1024, 1} },
4616 .block_erase = spi_block_erase_c7,
4617 }
4618 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004619 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004620 .unlock = spi_disable_blockprotect,
4621 .write = spi_chip_write_256,
4622 .read = spi_chip_read,
4623 .voltage = {1650, 1950},
4624 },
4625
4626 {
4627 .vendor = "Eon",
4628 .name = "EN25S80",
4629 .bustype = BUS_SPI,
4630 .manufacture_id = EON_ID_NOPREFIX,
4631 .model_id = EON_EN25S80,
4632 .total_size = 1024,
4633 .page_size = 256,
4634 /* OTP: 256B total; enter 0x3A */
4635 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4636 .tested = TEST_UNTESTED,
4637 .probe = probe_spi_rdid,
4638 .probe_timing = TIMING_ZERO,
4639 .block_erasers = {
4640 {
4641 .eraseblocks = { {4 * 1024, 256} },
4642 .block_erase = spi_block_erase_20,
4643 }, {
4644 .eraseblocks = { {64 * 1024, 16} },
4645 .block_erase = spi_block_erase_d8,
4646 }, {
4647 .eraseblocks = { {1024 * 1024, 1} },
4648 .block_erase = spi_block_erase_60,
4649 }, {
4650 .eraseblocks = { {1024 * 1024, 1} },
4651 .block_erase = spi_block_erase_c7,
4652 }
4653 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004654 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004655 .unlock = spi_disable_blockprotect,
4656 .write = spi_chip_write_256,
4657 .read = spi_chip_read,
4658 .voltage = {1650, 1950},
4659 },
4660
4661 {
4662 .vendor = "Eon",
4663 .name = "EN25S16",
4664 .bustype = BUS_SPI,
4665 .manufacture_id = EON_ID_NOPREFIX,
4666 .model_id = EON_EN25S16,
4667 .total_size = 2048,
4668 .page_size = 256,
4669 /* OTP: 512B total; enter 0x3A */
4670 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4671 .tested = TEST_UNTESTED,
4672 .probe = probe_spi_rdid,
4673 .probe_timing = TIMING_ZERO,
4674 .block_erasers = {
4675 {
4676 .eraseblocks = { {4 * 1024, 512} },
4677 .block_erase = spi_block_erase_20,
4678 }, {
4679 .eraseblocks = { {64 * 1024, 32} },
4680 .block_erase = spi_block_erase_52,
4681 }, {
4682 .eraseblocks = { {32 * 1024, 64} },
4683 .block_erase = spi_block_erase_d8,
4684 }, {
4685 .eraseblocks = { {2048 * 1024, 1} },
4686 .block_erase = spi_block_erase_60,
4687 }, {
4688 .eraseblocks = { {2048 * 1024, 1} },
4689 .block_erase = spi_block_erase_c7,
4690 }
4691 },
4692 .printlock = spi_prettyprint_status_register_en25s_wp,
4693 .unlock = spi_disable_blockprotect_bp3_srwd,
4694 .write = spi_chip_write_256,
4695 .read = spi_chip_read,
4696 .voltage = {1650, 1950},
4697 },
4698
4699 {
4700 .vendor = "Eon",
4701 .name = "EN25S32",
4702 .bustype = BUS_SPI,
4703 .manufacture_id = EON_ID_NOPREFIX,
4704 .model_id = EON_EN25S32,
4705 .total_size = 4096,
4706 .page_size = 256,
4707 /* OTP: 512B total; enter 0x3A */
4708 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4709 .tested = TEST_UNTESTED,
4710 .probe = probe_spi_rdid,
4711 .probe_timing = TIMING_ZERO,
4712 .block_erasers = {
4713 {
4714 .eraseblocks = { {4 * 1024, 1024} },
4715 .block_erase = spi_block_erase_20,
4716 }, {
4717 .eraseblocks = { {32 * 1024, 128} },
4718 .block_erase = spi_block_erase_52,
4719 }, {
4720 .eraseblocks = { {64 * 1024, 64} },
4721 .block_erase = spi_block_erase_d8,
4722 }, {
4723 .eraseblocks = { {4096 * 1024, 1} },
4724 .block_erase = spi_block_erase_60,
4725 }, {
4726 .eraseblocks = { {4096 * 1024, 1} },
4727 .block_erase = spi_block_erase_c7,
4728 }
4729 },
4730 .printlock = spi_prettyprint_status_register_en25s_wp,
4731 .unlock = spi_disable_blockprotect_bp3_srwd,
4732 .write = spi_chip_write_256,
4733 .read = spi_chip_read,
4734 .voltage = {1650, 1950},
4735 },
4736
4737 {
4738 .vendor = "Eon",
4739 .name = "EN25S64",
4740 .bustype = BUS_SPI,
4741 .manufacture_id = EON_ID_NOPREFIX,
4742 .model_id = EON_EN25S64,
4743 .total_size = 8192,
4744 .page_size = 256,
4745 /* OTP: 512B total; enter 0x3A */
4746 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4747 .tested = TEST_UNTESTED,
4748 .probe = probe_spi_rdid,
4749 .probe_timing = TIMING_ZERO,
4750 .block_erasers = {
4751 {
4752 .eraseblocks = { {4 * 1024, 2048} },
4753 .block_erase = spi_block_erase_20,
4754 }, {
4755 .eraseblocks = { {64 * 1024, 128} },
4756 .block_erase = spi_block_erase_d8,
4757 }, {
4758 .eraseblocks = { {8192 * 1024, 1} },
4759 .block_erase = spi_block_erase_60,
4760 }, {
4761 .eraseblocks = { {8192 * 1024, 1} },
4762 .block_erase = spi_block_erase_c7,
4763 }
4764 },
4765 .printlock = spi_prettyprint_status_register_en25s_wp,
4766 .unlock = spi_disable_blockprotect_bp3_srwd,
4767 .write = spi_chip_write_256,
4768 .read = spi_chip_read,
4769 .voltage = {1650, 1950},
4770 },
4771
4772 {
4773 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00004774 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004775 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00004776 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004777 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00004778 .total_size = 128,
4779 .page_size = 128,
4780 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004781 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00004782 .probe = probe_jedec,
4783 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4784 .block_erasers =
4785 {
4786 {
4787 .eraseblocks = { {16 * 1024, 8} },
4788 .block_erase = erase_sector_jedec,
4789 },
4790 {
4791 .eraseblocks = { {128 * 1024, 1} },
4792 .block_erase = erase_chip_block_jedec,
4793 },
4794 },
4795 .write = write_jedec_1,
4796 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004797 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00004798 },
4799
4800 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004801 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004802 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004803 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004804 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004805 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004806 .total_size = 256,
4807 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004808 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004809 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004810 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004811 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004812 .block_erasers =
4813 {
4814 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004815 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004816 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004817 {8 * 1024, 2},
4818 {32 * 1024, 1},
4819 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004820 },
4821 .block_erase = erase_sector_jedec,
4822 }, {
4823 .eraseblocks = { {256 * 1024, 1} },
4824 .block_erase = erase_chip_block_jedec,
4825 },
4826 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004827 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004828 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004829 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004830 },
4831
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004832 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004833 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004834 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004835 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004836 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004837 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004838 .total_size = 256,
4839 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004840 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00004841 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004842 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004843 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004844 .block_erasers =
4845 {
4846 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004847 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004848 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004849 {32 * 1024, 1},
4850 {8 * 1024, 2},
4851 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004852 },
4853 .block_erase = erase_sector_jedec,
4854 }, {
4855 .eraseblocks = { {256 * 1024, 1} },
4856 .block_erase = erase_chip_block_jedec,
4857 },
4858 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004859 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004860 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004861 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004862 },
4863
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004864 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004865 .vendor = "Eon",
4866 .name = "EN29LV640B",
4867 .bustype = BUS_PARALLEL,
4868 .manufacture_id = EON_ID,
4869 .model_id = EON_EN29LV640B,
4870 .total_size = 8192,
4871 .page_size = 8192,
4872 .feature_bits = 0,
4873 .tested = TEST_OK_PREW,
4874 .probe = probe_en29lv640b,
4875 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4876 .block_erasers =
4877 {
4878 {
4879 .eraseblocks = {
4880 {8 * 1024, 8},
4881 {64 * 1024, 127},
4882 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00004883 .block_erase = erase_block_shifted_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004884 }, {
4885 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00004886 .block_erase = erase_chip_block_shifted_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004887 },
4888 },
4889 .write = write_en29lv640b,
4890 .read = read_memmapped,
4891 .voltage = {2700, 3600},
4892 },
4893
4894 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004895 .vendor = "Fujitsu",
4896 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004897 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004898 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004899 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004900 .total_size = 512,
4901 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004902 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004903 .tested = TEST_UNTESTED,
4904 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004905 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004906 .block_erasers =
4907 {
4908 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004909 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004910 {16 * 1024, 1},
4911 {8 * 1024, 2},
4912 {32 * 1024, 1},
4913 {64 * 1024, 7},
4914 },
Sean Nelson35727f72010-01-28 23:55:12 +00004915 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004916 }, {
4917 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004918 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004919 },
4920 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004921 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004922 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004923 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004924 },
4925
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004926 {
4927 .vendor = "Fujitsu",
4928 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004929 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004930 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004931 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004932 .total_size = 512,
4933 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004934 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004935 .tested = TEST_UNTESTED,
4936 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004937 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004938 .block_erasers =
4939 {
4940 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004941 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004942 {64 * 1024, 7},
4943 {32 * 1024, 1},
4944 {8 * 1024, 2},
4945 {16 * 1024, 1},
4946 },
Sean Nelson35727f72010-01-28 23:55:12 +00004947 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004948 }, {
4949 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004950 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004951 },
4952 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004953 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004954 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004955 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004956 },
4957
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004958 {
Sean Nelson35727f72010-01-28 23:55:12 +00004959 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004960 .vendor = "Fujitsu",
4961 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004962 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004963 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004964 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004965 .total_size = 512,
4966 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004967 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004968 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004969 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004970 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004971 .block_erasers =
4972 {
4973 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004974 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004975 {16 * 1024, 1},
4976 {8 * 1024, 2},
4977 {32 * 1024, 1},
4978 {64 * 1024, 7},
4979 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00004980 .block_erase = erase_block_shifted_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004981 }, {
4982 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00004983 .block_erase = erase_chip_block_shifted_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004984 },
4985 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004986 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004987 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004988 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004989 },
4990
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004991 {
4992 .vendor = "Fujitsu",
4993 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004994 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004995 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004996 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004997 .total_size = 512,
4998 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004999 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005000 .tested = TEST_UNTESTED,
5001 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00005002 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005003 .block_erasers =
5004 {
5005 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005006 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005007 {64 * 1024, 7},
5008 {32 * 1024, 1},
5009 {8 * 1024, 2},
5010 {16 * 1024, 1},
5011 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005012 .block_erase = erase_block_shifted_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005013 }, {
5014 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005015 .block_erase = erase_chip_block_shifted_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005016 },
5017 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00005018 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005019 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005020 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005021 },
5022
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005023 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005024 .vendor = "Fujitsu",
5025 .name = "MBM29LV160BE",
5026 .bustype = BUS_PARALLEL,
5027 .manufacture_id = FUJITSU_ID,
5028 .model_id = FUJITSU_MBM29LV160BE,
5029 .total_size = 2 * 1024,
5030 .page_size = 0,
5031 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5032 .tested = TEST_UNTESTED,
5033 .probe = probe_m29f400bt,
5034 .probe_timing = TIMING_IGNORED,
5035 .block_erasers =
5036 {
5037 {
5038 .eraseblocks = {
5039 {16 * 1024, 1},
5040 {8 * 1024, 2},
5041 {32 * 1024, 1},
5042 {64 * 1024, 31},
5043 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005044 .block_erase = erase_block_shifted_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005045 }, {
5046 .eraseblocks = { {2048 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005047 .block_erase = erase_chip_block_shifted_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005048 },
5049 },
5050 .write = write_m29f400bt, /* Supports a fast mode too */
5051 .read = read_memmapped,
5052 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5053 },
5054
5055 {
5056 .vendor = "Fujitsu",
5057 .name = "MBM29LV160TE",
5058 .bustype = BUS_PARALLEL,
5059 .manufacture_id = FUJITSU_ID,
5060 .model_id = FUJITSU_MBM29LV160TE,
5061 .total_size = 2 * 1024,
5062 .page_size = 0,
5063 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5064 .tested = TEST_UNTESTED,
5065 .probe = probe_m29f400bt,
5066 .probe_timing = TIMING_IGNORED,
5067 .block_erasers =
5068 {
5069 {
5070 .eraseblocks = {
5071 {64 * 1024, 31},
5072 {32 * 1024, 1},
5073 {8 * 1024, 2},
5074 {16 * 1024, 1},
5075 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005076 .block_erase = erase_block_shifted_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005077 }, {
5078 .eraseblocks = { {2048 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +00005079 .block_erase = erase_chip_block_shifted_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005080 },
5081 },
5082 .write = write_m29f400bt, /* Supports a fast mode too */
5083 .read = read_memmapped,
5084 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5085 },
5086
5087 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005088 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005089 .name = "GD25LQ32",
5090 .bustype = BUS_SPI,
5091 .manufacture_id = GIGADEVICE_ID,
5092 .model_id = GIGADEVICE_GD25LQ32,
5093 .total_size = 4096,
5094 .page_size = 256,
5095 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5096 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5097 .tested = TEST_OK_PREW,
5098 .probe = probe_spi_rdid,
5099 .probe_timing = TIMING_ZERO,
5100 .block_erasers =
5101 {
5102 {
5103 .eraseblocks = { {4 * 1024, 1024} },
5104 .block_erase = spi_block_erase_20,
5105 }, {
5106 .eraseblocks = { {32 * 1024, 128} },
5107 .block_erase = spi_block_erase_52,
5108 }, {
5109 .eraseblocks = { {64 * 1024, 64} },
5110 .block_erase = spi_block_erase_d8,
5111 }, {
5112 .eraseblocks = { {4 * 1024 * 1024, 1} },
5113 .block_erase = spi_block_erase_60,
5114 }, {
5115 .eraseblocks = { {4 * 1024 * 1024, 1} },
5116 .block_erase = spi_block_erase_c7,
5117 }
5118 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005119 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005120 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5121 .write = spi_chip_write_256,
5122 .read = spi_chip_read,
5123 .voltage = {1700, 1950},
5124 },
5125
5126 {
5127 .vendor = "GigaDevice",
5128 .name = "GD25Q512",
5129 .bustype = BUS_SPI,
5130 .manufacture_id = GIGADEVICE_ID,
5131 .model_id = GIGADEVICE_GD25Q512,
5132 .total_size = 64,
5133 .page_size = 256,
5134 .feature_bits = FEATURE_WRSR_WREN,
5135 .tested = TEST_UNTESTED,
5136 .probe = probe_spi_rdid,
5137 .probe_timing = TIMING_ZERO,
5138 .block_erasers = {
5139 {
5140 .eraseblocks = { {4 * 1024, 16} },
5141 .block_erase = spi_block_erase_20,
5142 }, {
5143 .eraseblocks = { {32 * 1024, 2} },
5144 .block_erase = spi_block_erase_52,
5145 }, {
5146 .eraseblocks = { {64 * 1024, 1} },
5147 .block_erase = spi_block_erase_60,
5148 }, {
5149 .eraseblocks = { {64 * 1024, 1} },
5150 .block_erase = spi_block_erase_c7,
5151 }
5152 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005153 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005154 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5155 .write = spi_chip_write_256,
5156 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5157 .voltage = {2700, 3600},
5158 },
5159
5160 {
5161 .vendor = "GigaDevice",
5162 .name = "GD25Q10",
5163 .bustype = BUS_SPI,
5164 .manufacture_id = GIGADEVICE_ID,
5165 .model_id = GIGADEVICE_GD25Q10,
5166 .total_size = 128,
5167 .page_size = 256,
5168 .feature_bits = FEATURE_WRSR_WREN,
5169 .tested = TEST_UNTESTED,
5170 .probe = probe_spi_rdid,
5171 .probe_timing = TIMING_ZERO,
5172 .block_erasers = {
5173 {
5174 .eraseblocks = { {4 * 1024, 32} },
5175 .block_erase = spi_block_erase_20,
5176 }, {
5177 .eraseblocks = { {32 * 1024, 4} },
5178 .block_erase = spi_block_erase_52,
5179 }, {
5180 .eraseblocks = { {64 * 1024, 2} },
5181 .block_erase = spi_block_erase_d8,
5182 }, {
5183 .eraseblocks = { {128 * 1024, 1} },
5184 .block_erase = spi_block_erase_60,
5185 }, {
5186 .eraseblocks = { {128 * 1024, 1} },
5187 .block_erase = spi_block_erase_c7,
5188 }
5189 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005190 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005191 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5192 .write = spi_chip_write_256,
5193 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5194 .voltage = {2700, 3600},
5195 },
5196
5197 {
5198 .vendor = "GigaDevice",
5199 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005200 .bustype = BUS_SPI,
5201 .manufacture_id = GIGADEVICE_ID,
5202 .model_id = GIGADEVICE_GD25Q20,
5203 .total_size = 256,
5204 .page_size = 256,
5205 .feature_bits = FEATURE_WRSR_WREN,
5206 .tested = TEST_UNTESTED,
5207 .probe = probe_spi_rdid,
5208 .probe_timing = TIMING_ZERO,
5209 .block_erasers =
5210 {
5211 {
5212 .eraseblocks = { {4 * 1024, 64} },
5213 .block_erase = spi_block_erase_20,
5214 }, {
5215 .eraseblocks = { {32 * 1024, 8} },
5216 .block_erase = spi_block_erase_52,
5217 }, {
5218 .eraseblocks = { {64 * 1024, 4} },
5219 .block_erase = spi_block_erase_d8,
5220 }, {
5221 .eraseblocks = { {256 * 1024, 1} },
5222 .block_erase = spi_block_erase_60,
5223 }, {
5224 .eraseblocks = { {256 * 1024, 1} },
5225 .block_erase = spi_block_erase_c7,
5226 }
5227 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005228 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005229 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005230 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005231 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005232 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005233 },
5234
5235 {
5236 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005237 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005238 .bustype = BUS_SPI,
5239 .manufacture_id = GIGADEVICE_ID,
5240 .model_id = GIGADEVICE_GD25Q40,
5241 .total_size = 512,
5242 .page_size = 256,
5243 .feature_bits = FEATURE_WRSR_WREN,
5244 .tested = TEST_UNTESTED,
5245 .probe = probe_spi_rdid,
5246 .probe_timing = TIMING_ZERO,
5247 .block_erasers =
5248 {
5249 {
5250 .eraseblocks = { {4 * 1024, 128} },
5251 .block_erase = spi_block_erase_20,
5252 }, {
5253 .eraseblocks = { {32 * 1024, 16} },
5254 .block_erase = spi_block_erase_52,
5255 }, {
5256 .eraseblocks = { {64 * 1024, 8} },
5257 .block_erase = spi_block_erase_d8,
5258 }, {
5259 .eraseblocks = { {512 * 1024, 1} },
5260 .block_erase = spi_block_erase_60,
5261 }, {
5262 .eraseblocks = { {512 * 1024, 1} },
5263 .block_erase = spi_block_erase_c7,
5264 }
5265 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005266 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005267 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005268 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005269 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005270 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005271 },
5272
5273 {
5274 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005275 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005276 .bustype = BUS_SPI,
5277 .manufacture_id = GIGADEVICE_ID,
5278 .model_id = GIGADEVICE_GD25Q80,
5279 .total_size = 1024,
5280 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005281 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5283 .tested = TEST_OK_PREW,
5284 .probe = probe_spi_rdid,
5285 .probe_timing = TIMING_ZERO,
5286 .block_erasers =
5287 {
5288 {
5289 .eraseblocks = { {4 * 1024, 256} },
5290 .block_erase = spi_block_erase_20,
5291 }, {
5292 .eraseblocks = { {32 * 1024, 32} },
5293 .block_erase = spi_block_erase_52,
5294 }, {
5295 .eraseblocks = { {64 * 1024, 16} },
5296 .block_erase = spi_block_erase_d8,
5297 }, {
5298 .eraseblocks = { {1024 * 1024, 1} },
5299 .block_erase = spi_block_erase_60,
5300 }, {
5301 .eraseblocks = { {1024 * 1024, 1} },
5302 .block_erase = spi_block_erase_c7,
5303 }
5304 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005305 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005306 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005307 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005308 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005309 .voltage = {2700, 3600},
5310 },
5311
5312 {
5313 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005314 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005315 .bustype = BUS_SPI,
5316 .manufacture_id = GIGADEVICE_ID,
5317 .model_id = GIGADEVICE_GD25Q16,
5318 .total_size = 2048,
5319 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005320 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005321 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5322 .tested = TEST_UNTESTED,
5323 .probe = probe_spi_rdid,
5324 .probe_timing = TIMING_ZERO,
5325 .block_erasers =
5326 {
5327 {
5328 .eraseblocks = { {4 * 1024, 512} },
5329 .block_erase = spi_block_erase_20,
5330 }, {
5331 .eraseblocks = { {32 * 1024, 64} },
5332 .block_erase = spi_block_erase_52,
5333 }, {
5334 .eraseblocks = { {64 * 1024, 32} },
5335 .block_erase = spi_block_erase_d8,
5336 }, {
5337 .eraseblocks = { {2 * 1024 * 1024, 1} },
5338 .block_erase = spi_block_erase_60,
5339 }, {
5340 .eraseblocks = { {2 * 1024 * 1024, 1} },
5341 .block_erase = spi_block_erase_c7,
5342 }
5343 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005344 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005345 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005346 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005347 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005348 .voltage = {2700, 3600},
5349 },
5350
5351 {
5352 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005353 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005354 .bustype = BUS_SPI,
5355 .manufacture_id = GIGADEVICE_ID,
5356 .model_id = GIGADEVICE_GD25Q32,
5357 .total_size = 4096,
5358 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005359 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00005361 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005362 .probe = probe_spi_rdid,
5363 .probe_timing = TIMING_ZERO,
5364 .block_erasers =
5365 {
5366 {
5367 .eraseblocks = { {4 * 1024, 1024} },
5368 .block_erase = spi_block_erase_20,
5369 }, {
5370 .eraseblocks = { {32 * 1024, 128} },
5371 .block_erase = spi_block_erase_52,
5372 }, {
5373 .eraseblocks = { {64 * 1024, 64} },
5374 .block_erase = spi_block_erase_d8,
5375 }, {
5376 .eraseblocks = { {4 * 1024 * 1024, 1} },
5377 .block_erase = spi_block_erase_60,
5378 }, {
5379 .eraseblocks = { {4 * 1024 * 1024, 1} },
5380 .block_erase = spi_block_erase_c7,
5381 }
5382 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005383 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005384 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005385 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005386 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005387 .voltage = {2700, 3600},
5388 },
5389
5390 {
5391 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005392 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005393 .bustype = BUS_SPI,
5394 .manufacture_id = GIGADEVICE_ID,
5395 .model_id = GIGADEVICE_GD25Q64,
5396 .total_size = 8192,
5397 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005398 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005399 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00005400 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005401 .probe = probe_spi_rdid,
5402 .probe_timing = TIMING_ZERO,
5403 .block_erasers =
5404 {
5405 {
5406 .eraseblocks = { {4 * 1024, 2048} },
5407 .block_erase = spi_block_erase_20,
5408 }, {
5409 .eraseblocks = { {32 * 1024, 256} },
5410 .block_erase = spi_block_erase_52,
5411 }, {
5412 .eraseblocks = { {64 * 1024, 128} },
5413 .block_erase = spi_block_erase_d8,
5414 }, {
5415 .eraseblocks = { {8 * 1024 * 1024, 1} },
5416 .block_erase = spi_block_erase_60,
5417 }, {
5418 .eraseblocks = { {8 * 1024 * 1024, 1} },
5419 .block_erase = spi_block_erase_c7,
5420 }
5421 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005422 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005423 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005424 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005425 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00005426 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005427 },
5428
5429 {
5430 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005431 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005432 .bustype = BUS_SPI,
5433 .manufacture_id = GIGADEVICE_ID,
5434 .model_id = GIGADEVICE_GD25Q128,
5435 .total_size = 16384,
5436 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005437 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005438 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5439 .tested = TEST_UNTESTED,
5440 .probe = probe_spi_rdid,
5441 .probe_timing = TIMING_ZERO,
5442 .block_erasers =
5443 {
5444 {
5445 .eraseblocks = { {4 * 1024, 4096} },
5446 .block_erase = spi_block_erase_20,
5447 }, {
5448 .eraseblocks = { {32 * 1024, 512} },
5449 .block_erase = spi_block_erase_52,
5450 }, {
5451 .eraseblocks = { {64 * 1024, 256} },
5452 .block_erase = spi_block_erase_d8,
5453 }, {
5454 .eraseblocks = { {16 * 1024 * 1024, 1} },
5455 .block_erase = spi_block_erase_60,
5456 }, {
5457 .eraseblocks = { {16 * 1024 * 1024, 1} },
5458 .block_erase = spi_block_erase_c7,
5459 }
5460 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005461 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005462 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5463 .write = spi_chip_write_256,
5464 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5465 .voltage = {2700, 3600},
5466 },
5467
5468 {
5469 .vendor = "GigaDevice",
5470 .name = "GD25T80",
5471 .bustype = BUS_SPI,
5472 .manufacture_id = GIGADEVICE_ID,
5473 .model_id = GIGADEVICE_GD25T80,
5474 .total_size = 1024,
5475 .page_size = 256,
5476 /* OTP: 256B total; enter 0x3A */
5477 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5478 .tested = TEST_UNTESTED,
5479 .probe = probe_spi_rdid,
5480 .probe_timing = TIMING_ZERO,
5481 .block_erasers = {
5482 {
5483 .eraseblocks = { {4 * 1024, 256} },
5484 .block_erase = spi_block_erase_20,
5485 }, {
5486 .eraseblocks = { {64 * 1024, 16} },
5487 .block_erase = spi_block_erase_52,
5488 }, {
5489 .eraseblocks = { {64 * 1024, 16} },
5490 .block_erase = spi_block_erase_d8,
5491 }, {
5492 .eraseblocks = { {1024 * 1024, 1} },
5493 .block_erase = spi_block_erase_60,
5494 }, {
5495 .eraseblocks = { {1024 * 1024, 1} },
5496 .block_erase = spi_block_erase_c7,
5497 }
5498 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005499 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005500 .unlock = spi_disable_blockprotect,
5501 .write = spi_chip_write_256,
5502 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005503 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005504 },
5505
5506 {
David Borgc96a8bd2010-06-21 16:12:22 +00005507 .vendor = "Hyundai",
5508 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005509 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005510 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005511 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005512 .total_size = 256,
5513 .page_size = 256 * 1024,
5514 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005515 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005516 .probe = probe_jedec,
5517 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5518 .block_erasers =
5519 {
5520 {
5521 .eraseblocks = {
5522 {64 * 1024, 3},
5523 {32 * 1024, 1},
5524 {8 * 1024, 2},
5525 {16 * 1024, 1},
5526 },
5527 .block_erase = erase_sector_jedec,
5528 }, {
5529 .eraseblocks = { {256 * 1024, 1} },
5530 .block_erase = erase_chip_block_jedec,
5531 },
5532 },
5533 .write = write_jedec_1,
5534 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005535 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005536 },
5537
5538 {
5539 .vendor = "Hyundai",
5540 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005541 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005542 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005543 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005544 .total_size = 256,
5545 .page_size = 256 * 1024,
5546 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5547 .tested = TEST_UNTESTED,
5548 .probe = probe_jedec,
5549 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5550 .block_erasers =
5551 {
5552 {
5553 .eraseblocks = {
5554 {16 * 1024, 1},
5555 {8 * 1024, 2},
5556 {32 * 1024, 1},
5557 {64 * 1024, 3},
5558 },
5559 .block_erase = erase_sector_jedec,
5560 }, {
5561 .eraseblocks = { {256 * 1024, 1} },
5562 .block_erase = erase_chip_block_jedec,
5563 },
5564 },
5565 .write = write_jedec_1,
5566 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005567 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005568 },
5569
5570 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005571 .vendor = "Hyundai",
5572 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005573 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005574 .manufacture_id = HYUNDAI_ID,
5575 .model_id = HYUNDAI_HY29F040A,
5576 .total_size = 512,
5577 .page_size = 64 * 1024,
5578 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5579 .tested = TEST_UNTESTED,
5580 .probe = probe_jedec,
5581 .probe_timing = TIMING_ZERO,
5582 .block_erasers =
5583 {
5584 {
5585 .eraseblocks = { {64 * 1024, 8} },
5586 .block_erase = erase_sector_jedec,
5587 }, {
5588 .eraseblocks = { {512 * 1024, 1} },
5589 .block_erase = erase_chip_block_jedec,
5590 },
5591 },
5592 .write = write_jedec_1,
5593 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005594 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005595 },
5596
5597 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005598 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005599 .name = "25F160S33B8",
5600 .bustype = BUS_SPI,
5601 .manufacture_id = INTEL_ID,
5602 .model_id = INTEL_25F160S33B8,
5603 .total_size = 2048,
5604 .page_size = 256,
5605 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5606 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5607 .tested = TEST_UNTESTED,
5608 .probe = probe_spi_rdid,
5609 .probe_timing = TIMING_ZERO,
5610 .block_erasers =
5611 {
5612 {
5613 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5614 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5615 * have no effect on the memory contents, but sets a flag in the SR.
5616 .eraseblocks = {
5617 {8 * 1024, 8},
5618 {64 * 1024, 31} // inaccessible
5619 },
5620 .block_erase = spi_block_erase_40,
5621 }, { */
5622 .eraseblocks = { {64 * 1024, 32} },
5623 .block_erase = spi_block_erase_d8,
5624 }, {
5625 .eraseblocks = { {2 * 1024 * 1024, 1} },
5626 .block_erase = spi_block_erase_c7,
5627 }
5628 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005629 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5630 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005631 .write = spi_chip_write_256,
5632 .read = spi_chip_read, /* also fast read 0x0B */
5633 .voltage = {2700, 3600},
5634 },
5635
5636 {
5637 .vendor = "Intel",
5638 .name = "25F160S33T8",
5639 .bustype = BUS_SPI,
5640 .manufacture_id = INTEL_ID,
5641 .model_id = INTEL_25F160S33T8,
5642 .total_size = 2048,
5643 .page_size = 256,
5644 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5645 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5646 .tested = TEST_UNTESTED,
5647 .probe = probe_spi_rdid,
5648 .probe_timing = TIMING_ZERO,
5649 .block_erasers =
5650 {
5651 {
5652 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5653 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5654 * have no effect on the memory contents, but sets a flag in the SR.
5655 .eraseblocks = {
5656 {64 * 1024, 31}, // inaccessible
5657 {8 * 1024, 8}
5658 },
5659 .block_erase = spi_block_erase_40,
5660 }, { */
5661 .eraseblocks = { {64 * 1024, 32} },
5662 .block_erase = spi_block_erase_d8,
5663 }, {
5664 .eraseblocks = { {2 * 1024 * 1024, 1} },
5665 .block_erase = spi_block_erase_c7,
5666 }
5667 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005668 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5669 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005670 .write = spi_chip_write_256,
5671 .read = spi_chip_read, /* also fast read 0x0B */
5672 .voltage = {2700, 3600},
5673 },
5674
5675 {
5676 .vendor = "Intel",
5677 .name = "25F320S33B8",
5678 .bustype = BUS_SPI,
5679 .manufacture_id = INTEL_ID,
5680 .model_id = INTEL_25F320S33B8,
5681 .total_size = 4096,
5682 .page_size = 256,
5683 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5685 .tested = TEST_UNTESTED,
5686 .probe = probe_spi_rdid,
5687 .probe_timing = TIMING_ZERO,
5688 .block_erasers =
5689 {
5690 {
5691 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5692 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5693 * have no effect on the memory contents, but sets a flag in the SR.
5694 .eraseblocks = {
5695 {8 * 1024, 8},
5696 {64 * 1024, 63} // inaccessible
5697 },
5698 .block_erase = spi_block_erase_40,
5699 }, { */
5700 .eraseblocks = { {64 * 1024, 64} },
5701 .block_erase = spi_block_erase_d8,
5702 }, {
5703 .eraseblocks = { {4 * 1024 * 1024, 1} },
5704 .block_erase = spi_block_erase_c7,
5705 }
5706 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005707 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5708 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005709 .write = spi_chip_write_256,
5710 .read = spi_chip_read, /* also fast read 0x0B */
5711 .voltage = {2700, 3600},
5712 },
5713
5714 {
5715 .vendor = "Intel",
5716 .name = "25F320S33T8",
5717 .bustype = BUS_SPI,
5718 .manufacture_id = INTEL_ID,
5719 .model_id = INTEL_25F320S33T8,
5720 .total_size = 4096,
5721 .page_size = 256,
5722 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5723 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5724 .tested = TEST_UNTESTED,
5725 .probe = probe_spi_rdid,
5726 .probe_timing = TIMING_ZERO,
5727 .block_erasers =
5728 {
5729 {
5730 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5731 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5732 * have no effect on the memory contents, but sets a flag in the SR.
5733 .eraseblocks = {
5734 {64 * 1024, 63}, // inaccessible
5735 {8 * 1024, 8}
5736 },
5737 .block_erase = spi_block_erase_40,
5738 }, { */
5739 .eraseblocks = { {64 * 1024, 64} },
5740 .block_erase = spi_block_erase_d8,
5741 }, {
5742 .eraseblocks = { {4 * 1024 * 1024, 1} },
5743 .block_erase = spi_block_erase_c7,
5744 }
5745 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005746 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5747 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005748 .write = spi_chip_write_256,
5749 .read = spi_chip_read, /* also fast read 0x0B */
5750 .voltage = {2700, 3600},
5751 },
5752
5753 {
5754 .vendor = "Intel",
5755 .name = "25F640S33B8",
5756 .bustype = BUS_SPI,
5757 .manufacture_id = INTEL_ID,
5758 .model_id = INTEL_25F640S33B8,
5759 .total_size = 8192,
5760 .page_size = 256,
5761 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5762 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5763 .tested = TEST_UNTESTED,
5764 .probe = probe_spi_rdid,
5765 .probe_timing = TIMING_ZERO,
5766 .block_erasers =
5767 {
5768 {
5769 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5770 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5771 * have no effect on the memory contents, but sets a flag in the SR.
5772 .eraseblocks = {
5773 {8 * 1024, 8},
5774 {64 * 1024, 127} // inaccessible
5775 },
5776 .block_erase = spi_block_erase_40,
5777 }, { */
5778 .eraseblocks = { {64 * 1024, 128} },
5779 .block_erase = spi_block_erase_d8,
5780 }, {
5781 .eraseblocks = { {8 * 1024 * 1024, 1} },
5782 .block_erase = spi_block_erase_c7,
5783 }
5784 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005785 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5786 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005787 .write = spi_chip_write_256,
5788 .read = spi_chip_read, /* also fast read 0x0B */
5789 .voltage = {2700, 3600},
5790 },
5791
5792 {
5793 .vendor = "Intel",
5794 .name = "25F640S33T8",
5795 .bustype = BUS_SPI,
5796 .manufacture_id = INTEL_ID,
5797 .model_id = INTEL_25F640S33T8,
5798 .total_size = 8192,
5799 .page_size = 256,
5800 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5802 .tested = TEST_UNTESTED,
5803 .probe = probe_spi_rdid,
5804 .probe_timing = TIMING_ZERO,
5805 .block_erasers =
5806 {
5807 {
5808 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5809 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5810 * have no effect on the memory contents, but sets a flag in the SR.
5811 .eraseblocks = {
5812 {64 * 1024, 127}, // inaccessible
5813 {8 * 1024, 8}
5814 },
5815 .block_erase = spi_block_erase_40,
5816 }, { */
5817 .eraseblocks = { {64 * 1024, 128} },
5818 .block_erase = spi_block_erase_d8,
5819 }, {
5820 .eraseblocks = { {8 * 1024 * 1024, 1} },
5821 .block_erase = spi_block_erase_c7,
5822 }
5823 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005824 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5825 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005826 .write = spi_chip_write_256,
5827 .read = spi_chip_read, /* also fast read 0x0B */
5828 .voltage = {2700, 3600},
5829 },
5830
5831 {
5832 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005833 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005834 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005835 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005836 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005837 .total_size = 128,
5838 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00005839 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005840 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005842 .block_erasers =
5843 {
5844 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005845 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005846 {8 * 1024, 1},
5847 {4 * 1024, 2},
5848 {112 * 1024, 1},
5849 },
Sean Nelson28accc22010-03-19 18:47:06 +00005850 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005851 },
5852 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005853 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005854 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005855 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005856 },
5857
5858 {
5859 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005860 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005861 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005862 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005863 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005864 .total_size = 128,
5865 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005866 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005867 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005868 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005869 .block_erasers =
5870 {
5871 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005872 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005873 {112 * 1024, 1},
5874 {4 * 1024, 2},
5875 {8 * 1024, 1},
5876 },
Sean Nelson28accc22010-03-19 18:47:06 +00005877 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005878 },
5879 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005880 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005881 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005882 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005883 },
5884
5885 {
5886 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005887 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005888 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005889 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005890 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005891 .total_size = 256,
5892 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005893 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005894 .probe = probe_82802ab,
5895 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5896 .block_erasers =
5897 {
5898 {
5899 .eraseblocks = {
5900 {128 * 1024, 1},
5901 {96 * 1024, 1},
5902 {8 * 1024, 2},
5903 {16 * 1024, 1},
5904 },
5905 .block_erase = erase_block_82802ab,
5906 },
5907 },
5908 .write = write_82802ab,
5909 .read = read_memmapped,
5910 },
5911
5912 {
5913 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005914 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005915 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005916 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005917 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005918 .total_size = 512,
5919 .page_size = 256,
5920 .tested = TEST_UNTESTED,
5921 .probe = probe_82802ab,
5922 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005923 .block_erasers =
5924 {
5925 {
5926 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005927 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005928 },
5929 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005930 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005931 .write = write_82802ab,
5932 .read = read_memmapped,
5933 },
5934
5935 {
5936 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005937 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005938 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005939 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005940 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005941 .total_size = 512,
5942 .page_size = 128 * 1024, /* maximal block size */
5943 .tested = TEST_UNTESTED,
5944 .probe = probe_82802ab,
5945 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5946 .block_erasers =
5947 {
5948 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005949 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005950 {16 * 1024, 1},
5951 {8 * 1024, 2},
5952 {96 * 1024, 1},
5953 {128 * 1024, 3},
5954 },
5955 .block_erase = erase_block_82802ab,
5956 },
5957 },
5958 .write = write_82802ab,
5959 .read = read_memmapped,
5960 },
5961
5962 {
5963 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005964 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005965 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005966 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005967 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005968 .total_size = 512,
5969 .page_size = 128 * 1024, /* maximal block size */
5970 .tested = TEST_UNTESTED,
5971 .probe = probe_82802ab,
5972 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5973 .block_erasers =
5974 {
5975 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005976 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005977 {128 * 1024, 3},
5978 {96 * 1024, 1},
5979 {8 * 1024, 2},
5980 {16 * 1024, 1},
5981 },
5982 .block_erase = erase_block_82802ab,
5983 },
5984 },
5985 .write = write_82802ab,
5986 .read = read_memmapped,
5987 },
5988
5989 {
5990 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005991 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005992 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005993 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005994 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005995 .total_size = 512,
5996 .page_size = 128 * 1024, /* maximal block size */
5997 .feature_bits = FEATURE_ADDR_SHIFTED,
5998 .tested = TEST_UNTESTED,
5999 .probe = probe_82802ab,
6000 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6001 .block_erasers =
6002 {
6003 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006004 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006005 {16 * 1024, 1},
6006 {8 * 1024, 2},
6007 {96 * 1024, 1},
6008 {128 * 1024, 3},
6009 },
6010 .block_erase = erase_block_82802ab,
6011 },
6012 },
6013 .write = write_82802ab,
6014 .read = read_memmapped,
6015 },
6016
6017 {
6018 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006019 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006020 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006021 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006022 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006023 .total_size = 512,
6024 .page_size = 128 * 1024, /* maximal block size */
6025 .feature_bits = FEATURE_ADDR_SHIFTED,
6026 .tested = TEST_UNTESTED,
6027 .probe = probe_82802ab,
6028 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6029 .block_erasers =
6030 {
6031 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006032 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006033 {128 * 1024, 3},
6034 {96 * 1024, 1},
6035 {8 * 1024, 2},
6036 {16 * 1024, 1},
6037 },
6038 .block_erase = erase_block_82802ab,
6039 },
6040 },
6041 .write = write_82802ab,
6042 .read = read_memmapped,
6043 },
6044
6045 {
6046 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006047 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006048 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006049 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006050 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006051 .total_size = 512,
6052 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006053 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006054 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006055 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006056 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006057 .block_erasers =
6058 {
6059 {
6060 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006061 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006062 },
6063 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006064 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006065 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006067 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006068 },
6069
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006070 {
6071 .vendor = "Intel",
6072 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006073 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006074 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006075 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006076 .total_size = 1024,
6077 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006078 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006079 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006080 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006081 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006082 .block_erasers =
6083 {
6084 {
6085 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00006086 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006087 },
6088 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006089 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006090 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006091 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006092 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006093 },
6094
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006095 {
6096 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006097 .name = "MX23L3254",
6098 .bustype = BUS_SPI,
6099 .manufacture_id = MACRONIX_ID,
6100 .model_id = MACRONIX_MX23L3254,
6101 .total_size = 4096,
6102 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00006103 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006104 .probe = probe_spi_rdid,
6105 .probe_timing = TIMING_ZERO,
6106 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
6107 .read = spi_chip_read, /* Fast read (0x0B) supported */
6108 .voltage = {3000, 3600},
6109 },
6110
6111 {
6112 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006113 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006114 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006115 .manufacture_id = MACRONIX_ID,
6116 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006117 .total_size = 64,
6118 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006119 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006120 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006121 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006122 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006123 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006124 .block_erasers =
6125 {
6126 {
6127 .eraseblocks = { {4 * 1024, 16} },
6128 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006129 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006130 .eraseblocks = { {64 * 1024, 1} },
6131 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006132 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006133 .eraseblocks = { {64 * 1024, 1} },
6134 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006135 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006136 .eraseblocks = { {64 * 1024, 1} },
6137 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006138 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006139 .eraseblocks = { {64 * 1024, 1} },
6140 .block_erase = spi_block_erase_c7,
6141 },
6142 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006143 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006144 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006145 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006146 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
6147 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00006148 },
6149
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006150 {
6151 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006152 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006153 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006154 .manufacture_id = MACRONIX_ID,
6155 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006156 .total_size = 128,
6157 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006158 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006159 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00006160 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006161 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006162 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006163 .block_erasers =
6164 {
6165 {
6166 .eraseblocks = { {4 * 1024, 32} },
6167 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006168 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006169 .eraseblocks = { {64 * 1024, 2} },
6170 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006171 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006172 .eraseblocks = { {128 * 1024, 1} },
6173 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006174 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006175 .eraseblocks = { {128 * 1024, 1} },
6176 .block_erase = spi_block_erase_c7,
6177 },
6178 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006179 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006180 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006181 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006182 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006183 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006184 },
6185
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006186 {
6187 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006188 .name = "MX25L2005(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006189 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006190 .manufacture_id = MACRONIX_ID,
6191 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006192 .total_size = 256,
6193 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006194 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006195 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006196 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006197 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006198 .block_erasers =
6199 {
6200 {
6201 .eraseblocks = { {4 * 1024, 64} },
6202 .block_erase = spi_block_erase_20,
6203 }, {
6204 .eraseblocks = { {64 * 1024, 4} },
6205 .block_erase = spi_block_erase_52,
6206 }, {
6207 .eraseblocks = { {64 * 1024, 4} },
6208 .block_erase = spi_block_erase_d8,
6209 }, {
6210 .eraseblocks = { {256 * 1024, 1} },
6211 .block_erase = spi_block_erase_60,
6212 }, {
6213 .eraseblocks = { {256 * 1024, 1} },
6214 .block_erase = spi_block_erase_c7,
6215 },
6216 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006217 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006218 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006219 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006220 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006221 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006222 },
6223
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006224 {
6225 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006226 .name = "MX25L4005(A/C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006227 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006228 .manufacture_id = MACRONIX_ID,
6229 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006230 .total_size = 512,
6231 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006232 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00006233 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006234 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006235 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006236 .block_erasers =
6237 {
6238 {
6239 .eraseblocks = { {4 * 1024, 128} },
6240 .block_erase = spi_block_erase_20,
6241 }, {
6242 .eraseblocks = { {64 * 1024, 8} },
6243 .block_erase = spi_block_erase_52,
6244 }, {
6245 .eraseblocks = { {64 * 1024, 8} },
6246 .block_erase = spi_block_erase_d8,
6247 }, {
6248 .eraseblocks = { {512 * 1024, 1} },
6249 .block_erase = spi_block_erase_60,
6250 }, {
6251 .eraseblocks = { {512 * 1024, 1} },
6252 .block_erase = spi_block_erase_c7,
6253 },
6254 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006255 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006256 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006257 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006258 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006259 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006260 },
6261
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006262 {
6263 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006264 .name = "MX25L8005/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006265 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006266 .manufacture_id = MACRONIX_ID,
6267 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006268 .total_size = 1024,
6269 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006270 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00006271 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006272 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006273 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006274 .block_erasers =
6275 {
6276 {
6277 .eraseblocks = { {4 * 1024, 256} },
6278 .block_erase = spi_block_erase_20,
6279 }, {
6280 .eraseblocks = { {64 * 1024, 16} },
6281 .block_erase = spi_block_erase_52,
6282 }, {
6283 .eraseblocks = { {64 * 1024, 16} },
6284 .block_erase = spi_block_erase_d8,
6285 }, {
6286 .eraseblocks = { {1024 * 1024, 1} },
6287 .block_erase = spi_block_erase_60,
6288 }, {
6289 .eraseblocks = { {1024 * 1024, 1} },
6290 .block_erase = spi_block_erase_c7,
6291 },
6292 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006293 .printlock = spi_prettyprint_status_register_bp2_srwd,
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 Taunerf656e802013-02-02 15:35:44 +00006296 .read = spi_chip_read, /* Fast read (0x0B) supported */
6297 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00006298 },
6299
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006300 {
6301 .vendor = "Macronix",
6302 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006303 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006304 .manufacture_id = MACRONIX_ID,
6305 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006306 .total_size = 2048,
6307 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006308 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00006309 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006310 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006311 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006312 .block_erasers =
6313 {
6314 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006315 .eraseblocks = { {64 * 1024, 32} },
6316 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006317 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006318 .eraseblocks = { {64 * 1024, 32} },
6319 .block_erase = spi_block_erase_d8,
6320 }, {
6321 .eraseblocks = { {2 * 1024 * 1024, 1} },
6322 .block_erase = spi_block_erase_60,
6323 }, {
6324 .eraseblocks = { {2 * 1024 * 1024, 1} },
6325 .block_erase = spi_block_erase_c7,
6326 },
6327 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006328 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00006329 .unlock = spi_disable_blockprotect,
6330 .write = spi_chip_write_256,
6331 .read = spi_chip_read, /* Fast read (0x0B) supported */
6332 .voltage = {2700, 3600},
6333 },
6334
6335 {
6336 .vendor = "Macronix",
6337 .name = "MX25L1605A/MX25L1606E",
6338 .bustype = BUS_SPI,
6339 .manufacture_id = MACRONIX_ID,
6340 .model_id = MACRONIX_MX25L1605,
6341 .total_size = 2048,
6342 .page_size = 256,
6343 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
6344 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6345 .tested = TEST_OK_PREW,
6346 .probe = probe_spi_rdid,
6347 .probe_timing = TIMING_ZERO,
6348 .block_erasers =
6349 {
6350 {
6351 .eraseblocks = { {4 * 1024, 512} },
6352 .block_erase = spi_block_erase_20,
6353 }, {
6354 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006355 .block_erase = spi_block_erase_52,
6356 }, {
6357 .eraseblocks = { {64 * 1024, 32} },
6358 .block_erase = spi_block_erase_d8,
6359 }, {
6360 .eraseblocks = { {2 * 1024 * 1024, 1} },
6361 .block_erase = spi_block_erase_60,
6362 }, {
6363 .eraseblocks = { {2 * 1024 * 1024, 1} },
6364 .block_erase = spi_block_erase_c7,
6365 },
6366 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006367 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006368 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006369 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006370 .read = spi_chip_read, /* Fast read (0x0B) supported */
6371 .voltage = {2700, 3600},
6372 },
6373
6374 {
6375 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006376 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00006377 .bustype = BUS_SPI,
6378 .manufacture_id = MACRONIX_ID,
6379 .model_id = MACRONIX_MX25L1605,
6380 .total_size = 2048,
6381 .page_size = 256,
6382 .feature_bits = FEATURE_WRSR_WREN,
6383 .tested = TEST_OK_PREW,
6384 .probe = probe_spi_rdid,
6385 .probe_timing = TIMING_ZERO,
6386 .block_erasers =
6387 {
6388 {
6389 .eraseblocks = { {4 * 1024, 512} },
6390 .block_erase = spi_block_erase_20,
6391 }, {
6392 .eraseblocks = { {64 * 1024, 32} },
6393 .block_erase = spi_block_erase_d8,
6394 }, {
6395 .eraseblocks = { {2 * 1024 * 1024, 1} },
6396 .block_erase = spi_block_erase_60,
6397 }, {
6398 .eraseblocks = { {2 * 1024 * 1024, 1} },
6399 .block_erase = spi_block_erase_c7,
6400 },
6401 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006402 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continously Program (CP) mode */
Stefan Tauner226037d2013-03-16 01:22:12 +00006403 .unlock = spi_disable_blockprotect,
6404 .write = spi_chip_write_256,
6405 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006406 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006407 },
6408
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006409 {
6410 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006411 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006412 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006413 .manufacture_id = MACRONIX_ID,
6414 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006415 .total_size = 2048,
6416 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006417 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6418 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006419 .tested = TEST_UNTESTED,
6420 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006421 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006422 .block_erasers =
6423 {
6424 {
6425 .eraseblocks = { {4 * 1024, 512} },
6426 .block_erase = spi_block_erase_20,
6427 }, {
6428 .eraseblocks = { {64 * 1024, 32} },
6429 .block_erase = spi_block_erase_d8,
6430 }, {
6431 .eraseblocks = { {2 * 1024 * 1024, 1} },
6432 .block_erase = spi_block_erase_60,
6433 }, {
6434 .eraseblocks = { {2 * 1024 * 1024, 1} },
6435 .block_erase = spi_block_erase_c7,
6436 }
6437 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006438 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006439 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006440 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006441 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006442 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006443 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00006444
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006445 {
6446 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00006447 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006448 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006449 .manufacture_id = MACRONIX_ID,
6450 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006451 .total_size = 2048,
6452 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006453 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6454 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006455 .tested = TEST_UNTESTED,
6456 .probe = probe_spi_rdid,
6457 .probe_timing = TIMING_ZERO,
6458 .block_erasers =
6459 {
6460 {
6461 .eraseblocks = { {4 * 1024, 512} },
6462 .block_erase = spi_block_erase_20,
6463 }, {
6464 .eraseblocks = { {64 * 1024, 32} },
6465 .block_erase = spi_block_erase_d8,
6466 }, {
6467 .eraseblocks = { {2 * 1024 * 1024, 1} },
6468 .block_erase = spi_block_erase_60,
6469 }, {
6470 .eraseblocks = { {2 * 1024 * 1024, 1} },
6471 .block_erase = spi_block_erase_c7,
6472 }
6473 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006474 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stephan Guilloux3611b802010-09-13 19:59:28 +00006475 .unlock = spi_disable_blockprotect,
6476 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006477 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00006478 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00006479 },
6480
6481 {
6482 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006483 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006484 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006485 .manufacture_id = MACRONIX_ID,
6486 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006487 .total_size = 4096,
6488 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006489 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00006490 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006491 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006492 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006493 .block_erasers =
6494 {
6495 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006496 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006497 .block_erase = spi_block_erase_20,
6498 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006499 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006500 .block_erase = spi_block_erase_d8,
6501 }, {
6502 .eraseblocks = { {4 * 1024 * 1024, 1} },
6503 .block_erase = spi_block_erase_60,
6504 }, {
6505 .eraseblocks = { {4 * 1024 * 1024, 1} },
6506 .block_erase = spi_block_erase_c7,
6507 },
6508 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006509 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006510 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006511 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006512 .read = spi_chip_read, /* Fast read (0x0B) supported */
6513 .voltage = {2700, 3600},
6514 },
6515
6516 {
6517 .vendor = "Macronix",
6518 .name = "MX25L3205D/MX25L3208D",
6519 .bustype = BUS_SPI,
6520 .manufacture_id = MACRONIX_ID,
6521 .model_id = MACRONIX_MX25L3205,
6522 .total_size = 4096,
6523 .page_size = 256,
6524 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6525 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6526 .tested = TEST_OK_PREW,
6527 .probe = probe_spi_rdid,
6528 .probe_timing = TIMING_ZERO,
6529 .block_erasers =
6530 {
6531 {
6532 .eraseblocks = { {4 * 1024, 1024} },
6533 .block_erase = spi_block_erase_20,
6534 }, {
6535 .eraseblocks = { {64 * 1024, 64} },
6536 .block_erase = spi_block_erase_d8,
6537 }, {
6538 .eraseblocks = { {4 * 1024 * 1024, 1} },
6539 .block_erase = spi_block_erase_60,
6540 }, {
6541 .eraseblocks = { {4 * 1024 * 1024, 1} },
6542 .block_erase = spi_block_erase_c7,
6543 },
6544 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006545 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: CP mode */
Stefan Tauner226037d2013-03-16 01:22:12 +00006546 .unlock = spi_disable_blockprotect,
6547 .write = spi_chip_write_256,
6548 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6549 .voltage = {2700, 3600},
6550 },
6551
6552 {
6553 .vendor = "Macronix",
6554 .name = "MX25L3206E",
6555 .bustype = BUS_SPI,
6556 .manufacture_id = MACRONIX_ID,
6557 .model_id = MACRONIX_MX25L3205,
6558 .total_size = 4096,
6559 .page_size = 256,
6560 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6561 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6562 .tested = TEST_OK_PREW,
6563 .probe = probe_spi_rdid,
6564 .probe_timing = TIMING_ZERO,
6565 .block_erasers =
6566 {
6567 {
6568 .eraseblocks = { {4 * 1024, 1024} },
6569 .block_erase = spi_block_erase_20,
6570 }, {
6571 .eraseblocks = { {64 * 1024, 64} },
6572 .block_erase = spi_block_erase_d8,
6573 }, {
6574 .eraseblocks = { {64 * 1024, 64} },
6575 .block_erase = spi_block_erase_52,
6576 }, {
6577 .eraseblocks = { {4 * 1024 * 1024, 1} },
6578 .block_erase = spi_block_erase_60,
6579 }, {
6580 .eraseblocks = { {4 * 1024 * 1024, 1} },
6581 .block_erase = spi_block_erase_c7,
6582 },
6583 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006584 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00006585 .unlock = spi_disable_blockprotect,
6586 .write = spi_chip_write_256,
6587 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006588 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006589 },
6590
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006591 {
6592 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006593 .name = "MX25L3273E",
6594 .bustype = BUS_SPI,
6595 .manufacture_id = MACRONIX_ID,
6596 .model_id = MACRONIX_MX25L3205,
6597 .total_size = 4096,
6598 .page_size = 256,
6599 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6600 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6601 .tested = TEST_UNTESTED,
6602 .probe = probe_spi_rdid,
6603 .probe_timing = TIMING_ZERO,
6604 .block_erasers =
6605 {
6606 {
6607 .eraseblocks = { {4 * 1024, 1024} },
6608 .block_erase = spi_block_erase_20,
6609 }, {
6610 .eraseblocks = { {32 * 1024, 128} },
6611 .block_erase = spi_block_erase_52,
6612 }, {
6613 .eraseblocks = { {64 * 1024, 64} },
6614 .block_erase = spi_block_erase_d8,
6615 }, {
6616 .eraseblocks = { {4 * 1024 * 1024, 1} },
6617 .block_erase = spi_block_erase_60,
6618 }, {
6619 .eraseblocks = { {4 * 1024 * 1024, 1} },
6620 .block_erase = spi_block_erase_c7,
6621 },
6622 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006623 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006624 .unlock = spi_disable_blockprotect,
6625 .write = spi_chip_write_256,
6626 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6627 .voltage = {2700, 3600},
6628 },
6629
6630 {
6631 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006632 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006633 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006634 .manufacture_id = MACRONIX_ID,
6635 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006636 .total_size = 4096,
6637 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006638 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
6639 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006640 .tested = TEST_UNTESTED,
6641 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006642 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006643 .block_erasers =
6644 {
6645 {
6646 .eraseblocks = { {4 * 1024, 1024} },
6647 .block_erase = spi_block_erase_20,
6648 }, {
6649 .eraseblocks = { {64 * 1024, 64} },
6650 .block_erase = spi_block_erase_d8,
6651 }, {
6652 .eraseblocks = { {4 * 1024 * 1024, 1} },
6653 .block_erase = spi_block_erase_60,
6654 }, {
6655 .eraseblocks = { {4 * 1024 * 1024, 1} },
6656 .block_erase = spi_block_erase_c7,
6657 }
6658 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006659 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006660 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006661 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006662 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006663 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006664 },
6665
6666 {
6667 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006668 .name = "MX25L6405(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006669 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006670 .manufacture_id = MACRONIX_ID,
6671 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006672 .total_size = 8192,
6673 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006674 /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
6675 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Paul Menzelac427b22012-02-16 21:07:07 +00006676 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006677 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006678 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006679 .block_erasers =
6680 {
6681 {
6682 .eraseblocks = { {64 * 1024, 128} },
6683 .block_erase = spi_block_erase_20,
6684 }, {
6685 .eraseblocks = { {64 * 1024, 128} },
6686 .block_erase = spi_block_erase_d8,
6687 }, {
6688 .eraseblocks = { {8 * 1024 * 1024, 1} },
6689 .block_erase = spi_block_erase_60,
6690 }, {
6691 .eraseblocks = { {8 * 1024 * 1024, 1} },
6692 .block_erase = spi_block_erase_c7,
6693 }
6694 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006695 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 has different meanings */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006696 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006697 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006698 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006699 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006700 },
6701
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006702 {
6703 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006704 .name = "MX25L6406E/MX25L6436E",
6705 .bustype = BUS_SPI,
6706 .manufacture_id = MACRONIX_ID,
6707 .model_id = MACRONIX_MX25L6405,
6708 .total_size = 8192,
6709 .page_size = 256,
6710 /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
6711 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6712 .tested = TEST_OK_PREW,
6713 .probe = probe_spi_rdid,
6714 .probe_timing = TIMING_ZERO,
6715 .block_erasers =
6716 {
6717 {
6718 .eraseblocks = { {4 * 1024, 2048} },
6719 .block_erase = spi_block_erase_20,
6720 }, {
6721 .eraseblocks = { {64 * 1024, 128} },
6722 .block_erase = spi_block_erase_d8,
6723 }, {
6724 .eraseblocks = { {8 * 1024 * 1024, 1} },
6725 .block_erase = spi_block_erase_60,
6726 }, {
6727 .eraseblocks = { {8 * 1024 * 1024, 1} },
6728 .block_erase = spi_block_erase_c7,
6729 }
6730 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006731 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 for 36E is quad enable */
Stefan Tauner226037d2013-03-16 01:22:12 +00006732 .unlock = spi_disable_blockprotect,
6733 .write = spi_chip_write_256,
6734 .read = spi_chip_read,
6735 .voltage = {2700, 3600},
6736 },
6737
6738 {
6739 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006740 .name = "MX25L6445E/MX25L6473E",
Stefan Tauner226037d2013-03-16 01:22:12 +00006741 .bustype = BUS_SPI,
6742 .manufacture_id = MACRONIX_ID,
6743 .model_id = MACRONIX_MX25L6405,
6744 .total_size = 8192,
6745 .page_size = 256,
6746 /* supports SFDP */
6747 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6749 .tested = TEST_OK_PREW,
6750 .probe = probe_spi_rdid,
6751 .probe_timing = TIMING_ZERO,
6752 .block_erasers =
6753 {
6754 {
6755 .eraseblocks = { {4 * 1024, 2048} },
6756 .block_erase = spi_block_erase_20,
6757 }, {
6758 .eraseblocks = { {32 * 1024, 256} },
6759 .block_erase = spi_block_erase_52,
6760 }, {
6761 .eraseblocks = { {64 * 1024, 128} },
6762 .block_erase = spi_block_erase_d8,
6763 }, {
6764 .eraseblocks = { {8 * 1024 * 1024, 1} },
6765 .block_erase = spi_block_erase_60,
6766 }, {
6767 .eraseblocks = { {8 * 1024 * 1024, 1} },
6768 .block_erase = spi_block_erase_c7,
6769 }
6770 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006771 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner226037d2013-03-16 01:22:12 +00006772 .unlock = spi_disable_blockprotect,
6773 .write = spi_chip_write_256,
6774 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6775 .voltage = {2700, 3600},
6776 },
6777
6778 {
6779 .vendor = "Macronix",
6780 .name = "MX25L12805(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006781 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006782 .manufacture_id = MACRONIX_ID,
6783 .model_id = MACRONIX_MX25L12805,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006784 .total_size = 16384,
6785 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006786 /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
6787 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00006788 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006789 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006790 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006791 .block_erasers =
6792 {
6793 {
6794 .eraseblocks = { {4 * 1024, 4096} },
6795 .block_erase = spi_block_erase_20,
6796 }, {
6797 .eraseblocks = { {64 * 1024, 256} },
6798 .block_erase = spi_block_erase_d8,
6799 }, {
6800 .eraseblocks = { {16 * 1024 * 1024, 1} },
6801 .block_erase = spi_block_erase_60,
6802 }, {
6803 .eraseblocks = { {16 * 1024 * 1024, 1} },
6804 .block_erase = spi_block_erase_c7,
6805 }
6806 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006807 .printlock = spi_prettyprint_status_register_bp3_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006808 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006809 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006810 .read = spi_chip_read, /* MX25L12805D: Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006811 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006812 },
6813
6814 {
6815 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00006816 .name = "MX25U1635E",
6817 .bustype = BUS_SPI,
6818 .manufacture_id = MACRONIX_ID,
6819 .model_id = MACRONIX_MX25U1635E,
6820 .total_size = 2048,
6821 .page_size = 256,
6822 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6823 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6824 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6825 .tested = TEST_UNTESTED,
6826 .probe = probe_spi_rdid,
6827 .probe_timing = TIMING_ZERO,
6828 .block_erasers =
6829 {
6830 {
6831 .eraseblocks = { {4 * 1024, 512} },
6832 .block_erase = spi_block_erase_20,
6833 }, {
6834 .eraseblocks = { {32 * 1024, 64} },
6835 .block_erase = spi_block_erase_52,
6836 }, {
6837 .eraseblocks = { {64 * 1024, 32} },
6838 .block_erase = spi_block_erase_d8,
6839 }, {
6840 .eraseblocks = { {2 * 1024 * 1024, 1} },
6841 .block_erase = spi_block_erase_60,
6842 }, {
6843 .eraseblocks = { {2 * 1024 * 1024, 1} },
6844 .block_erase = spi_block_erase_c7,
6845 }
6846 },
6847 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00006848 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00006849 .unlock = spi_disable_blockprotect,
6850 .write = spi_chip_write_256,
6851 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6852 .voltage = {1650, 2000},
6853 },
6854
6855 {
6856 .vendor = "Macronix",
6857 .name = "MX25U3235E/F",
6858 .bustype = BUS_SPI,
6859 .manufacture_id = MACRONIX_ID,
6860 .model_id = MACRONIX_MX25U3235E,
6861 .total_size = 4096,
6862 .page_size = 256,
6863 /* F model supports SFDP */
6864 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6865 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6866 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6867 .tested = TEST_OK_PREW,
6868 .probe = probe_spi_rdid,
6869 .probe_timing = TIMING_ZERO,
6870 .block_erasers =
6871 {
6872 {
6873 .eraseblocks = { {4 * 1024, 1024} },
6874 .block_erase = spi_block_erase_20,
6875 }, {
6876 .eraseblocks = { {32 * 1024, 128} },
6877 .block_erase = spi_block_erase_52,
6878 }, {
6879 .eraseblocks = { {64 * 1024, 64} },
6880 .block_erase = spi_block_erase_d8,
6881 }, {
6882 .eraseblocks = { {4 * 1024 * 1024, 1} },
6883 .block_erase = spi_block_erase_60,
6884 }, {
6885 .eraseblocks = { {4 * 1024 * 1024, 1} },
6886 .block_erase = spi_block_erase_c7,
6887 }
6888 },
6889 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00006890 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00006891 .unlock = spi_disable_blockprotect,
6892 .write = spi_chip_write_256,
6893 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6894 .voltage = {1650, 2000},
6895 },
6896
6897 {
6898 .vendor = "Macronix",
6899 .name = "MX25U6435E/F",
6900 .bustype = BUS_SPI,
6901 .manufacture_id = MACRONIX_ID,
6902 .model_id = MACRONIX_MX25U6435E,
6903 .total_size = 8192,
6904 .page_size = 256,
6905 /* F model supports SFDP */
6906 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6907 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6908 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6909 .tested = TEST_UNTESTED,
6910 .probe = probe_spi_rdid,
6911 .probe_timing = TIMING_ZERO,
6912 .block_erasers =
6913 {
6914 {
6915 .eraseblocks = { {4 * 1024, 2048} },
6916 .block_erase = spi_block_erase_20,
6917 }, {
6918 .eraseblocks = { {32 * 1024, 256} },
6919 .block_erase = spi_block_erase_52,
6920 }, {
6921 .eraseblocks = { {64 * 1024, 128} },
6922 .block_erase = spi_block_erase_d8,
6923 }, {
6924 .eraseblocks = { {8 * 1024 * 1024, 1} },
6925 .block_erase = spi_block_erase_60,
6926 }, {
6927 .eraseblocks = { {8 * 1024 * 1024, 1} },
6928 .block_erase = spi_block_erase_c7,
6929 }
6930 },
6931 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00006932 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00006933 .unlock = spi_disable_blockprotect,
6934 .write = spi_chip_write_256,
6935 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6936 .voltage = {1650, 2000},
6937 },
6938
6939 {
6940 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00006941 .name = "MX25U12835F",
6942 .bustype = BUS_SPI,
6943 .manufacture_id = MACRONIX_ID,
6944 .model_id = MACRONIX_MX25U12835E,
6945 .total_size = 16384,
6946 .page_size = 256,
6947 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6948 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6949 .tested = TEST_UNTESTED,
6950 .probe = probe_spi_rdid,
6951 .probe_timing = TIMING_ZERO,
6952 .block_erasers =
6953 {
6954 {
6955 .eraseblocks = { {4 * 1024, 4096} },
6956 .block_erase = spi_block_erase_20,
6957 }, {
6958 .eraseblocks = { {32 * 1024, 512} },
6959 .block_erase = spi_block_erase_52,
6960 }, {
6961 .eraseblocks = { {64 * 1024, 256} },
6962 .block_erase = spi_block_erase_d8,
6963 }, {
6964 .eraseblocks = { {16 * 1024 * 1024, 1} },
6965 .block_erase = spi_block_erase_60,
6966 }, {
6967 .eraseblocks = { {16 * 1024 * 1024, 1} },
6968 .block_erase = spi_block_erase_c7,
6969 }
6970 },
6971 /* TODO: security register */
6972 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
6973 .unlock = spi_disable_blockprotect_bp3_srwd,
6974 .write = spi_chip_write_256, /* Multi I/O supported */
6975 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6976 .voltage = {1650, 2000},
6977 },
6978
6979 {
6980 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00006981 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006982 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006983 .manufacture_id = MACRONIX_ID,
6984 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006985 .total_size = 128,
6986 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006987 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6988 .tested = TEST_UNTESTED,
6989 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006990 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006991 .block_erasers =
6992 {
6993 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006994 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006995 {8 * 1024, 1},
6996 {4 * 1024, 2},
6997 {8 * 1024, 2},
6998 {32 * 1024, 1},
6999 {64 * 1024, 1},
7000 },
Sean Nelson35727f72010-01-28 23:55:12 +00007001 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007002 }, {
7003 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007004 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007005 }
7006 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007007 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007008 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007009 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007010 },
7011
7012 {
7013 .vendor = "Macronix",
7014 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007015 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007016 .manufacture_id = MACRONIX_ID,
7017 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007018 .total_size = 128,
7019 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007020 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00007021 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007022 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007023 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007024 .block_erasers =
7025 {
7026 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007027 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007028 {64 * 1024, 1},
7029 {32 * 1024, 1},
7030 {8 * 1024, 2},
7031 {4 * 1024, 2},
7032 {8 * 1024, 1},
7033 },
Sean Nelson35727f72010-01-28 23:55:12 +00007034 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007035 }, {
7036 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007037 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007038 }
7039 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007040 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007041 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007042 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007043 },
7044
7045 {
7046 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007047 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007048 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007049 .manufacture_id = MACRONIX_ID,
7050 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007051 .total_size = 256,
7052 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007053 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007054 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00007055 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007056 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007057 .block_erasers =
7058 {
7059 {
7060 .eraseblocks = {
7061 {16 * 1024, 1},
7062 {8 * 1024, 2},
7063 {32 * 1024, 1},
7064 {64 * 1024, 3},
7065 },
Sean Nelson35727f72010-01-28 23:55:12 +00007066 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007067 }, {
7068 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007069 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007070 },
7071 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007072 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007073 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007074 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007075 },
7076
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007077 {
7078 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007079 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007080 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007081 .manufacture_id = MACRONIX_ID,
7082 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007083 .total_size = 256,
7084 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007085 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00007086 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007087 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007088 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007089 .block_erasers =
7090 {
7091 {
7092 .eraseblocks = {
7093 {64 * 1024, 3},
7094 {32 * 1024, 1},
7095 {8 * 1024, 2},
7096 {16 * 1024, 1},
7097 },
Sean Nelson35727f72010-01-28 23:55:12 +00007098 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007099 }, {
7100 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007101 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007102 },
7103 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007104 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007105 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007106 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007107 },
7108
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007109 {
7110 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00007111 .name = "MX29F022(N)B",
7112 .bustype = BUS_PARALLEL,
7113 .manufacture_id = MACRONIX_ID,
7114 .model_id = MACRONIX_MX29F022B,
7115 .total_size = 256,
7116 .page_size = 0, /* unused */
7117 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7118 .tested = TEST_UNTESTED,
7119 .probe = probe_jedec,
7120 .probe_timing = TIMING_ZERO,
7121 .block_erasers =
7122 {
7123 {
7124 .eraseblocks = {
7125 {16 * 1024, 1},
7126 {8 * 1024, 2},
7127 {32 * 1024, 1},
7128 {64 * 1024, 3},
7129 },
7130 .block_erase = erase_sector_jedec,
7131 }, {
7132 .eraseblocks = { {256 * 1024, 1} },
7133 .block_erase = erase_chip_block_jedec,
7134 }
7135 },
7136 .write = write_jedec_1,
7137 .read = read_memmapped,
7138 .voltage = {4500, 5500},
7139 },
7140
7141 {
7142 .vendor = "Macronix",
7143 .name = "MX29F022(N)T",
7144 .bustype = BUS_PARALLEL,
7145 .manufacture_id = MACRONIX_ID,
7146 .model_id = MACRONIX_MX29F022T,
7147 .total_size = 256,
7148 .page_size = 0, /* unused */
7149 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7150 .tested = TEST_OK_PREW,
7151 .probe = probe_jedec,
7152 .probe_timing = TIMING_ZERO,
7153 .block_erasers =
7154 {
7155 {
7156 .eraseblocks = {
7157 {64 * 1024, 3},
7158 {32 * 1024, 1},
7159 {8 * 1024, 2},
7160 {16 * 1024, 1},
7161 },
7162 .block_erase = erase_sector_jedec,
7163 }, {
7164 .eraseblocks = { {256 * 1024, 1} },
7165 .block_erase = erase_chip_block_jedec,
7166 }
7167 },
7168 .write = write_jedec_1,
7169 .read = read_memmapped,
7170 .voltage = {4500, 5500},
7171 },
7172
7173 {
7174 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00007175 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007176 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007177 .manufacture_id = MACRONIX_ID,
7178 .model_id = MACRONIX_MX29F040,
7179 .total_size = 512,
7180 .page_size = 64 * 1024,
7181 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7182 .tested = TEST_UNTESTED,
7183 .probe = probe_jedec,
7184 .probe_timing = TIMING_ZERO,
7185 .block_erasers =
7186 {
7187 {
7188 .eraseblocks = { {64 * 1024, 8} },
7189 .block_erase = erase_sector_jedec,
7190 }, {
7191 .eraseblocks = { {512 * 1024, 1} },
7192 .block_erase = erase_chip_block_jedec,
7193 },
7194 },
7195 .write = write_jedec_1,
7196 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007197 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00007198 },
7199
7200 {
7201 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00007202 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007203 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007204 .manufacture_id = MACRONIX_ID,
7205 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007206 .total_size = 512,
7207 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007208 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7209 .tested = TEST_UNTESTED,
7210 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007211 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007212 .block_erasers =
7213 {
7214 {
7215 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00007216 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007217 }, {
7218 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007219 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007220 },
7221 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007222 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007223 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007224 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00007225 },
7226
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007227 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007228 .vendor = "Micron/Numonyx/ST",
7229 .name = "M25P05-A",
7230 .bustype = BUS_SPI,
7231 .manufacture_id = ST_ID,
7232 .model_id = ST_M25P05A,
7233 .total_size = 64,
7234 .page_size = 256,
7235 .feature_bits = FEATURE_WRSR_WREN,
7236 .tested = TEST_OK_PREW,
7237 .probe = probe_spi_rdid,
7238 .probe_timing = TIMING_ZERO,
7239 .block_erasers =
7240 {
7241 {
7242 .eraseblocks = { {32 * 1024, 2} },
7243 .block_erase = spi_block_erase_d8,
7244 }, {
7245 .eraseblocks = { {64 * 1024, 1} },
7246 .block_erase = spi_block_erase_c7,
7247 }
7248 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007249 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007250 .unlock = spi_disable_blockprotect,
7251 .write = spi_chip_write_256,
7252 .read = spi_chip_read,
7253 .voltage = {2700, 3600},
7254 },
7255
7256 /* The ST M25P05 is a bit of a problem. It has the same ID as the
7257 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
7258 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
7259 * only is successful if RDID does not work.
7260 */
7261 {
7262 .vendor = "Micron/Numonyx/ST",
7263 .name = "M25P05",
7264 .bustype = BUS_SPI,
7265 .manufacture_id = 0, /* Not used. */
7266 .model_id = ST_M25P05_RES,
7267 .total_size = 64,
7268 .page_size = 256,
7269 .feature_bits = FEATURE_WRSR_WREN,
7270 .tested = TEST_UNTESTED,
7271 .probe = probe_spi_res1,
7272 .probe_timing = TIMING_ZERO,
7273 .block_erasers =
7274 {
7275 {
7276 .eraseblocks = { {32 * 1024, 2} },
7277 .block_erase = spi_block_erase_d8,
7278 }, {
7279 .eraseblocks = { {64 * 1024, 1} },
7280 .block_erase = spi_block_erase_c7,
7281 }
7282 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007283 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007284 .unlock = spi_disable_blockprotect,
7285 .write = spi_chip_write_1, /* 128 */
7286 .read = spi_chip_read,
7287 .voltage = {2700, 3600},
7288 },
7289
7290 {
7291 .vendor = "Micron/Numonyx/ST",
7292 .name = "M25P10-A",
7293 .bustype = BUS_SPI,
7294 .manufacture_id = ST_ID,
7295 .model_id = ST_M25P10A,
7296 .total_size = 128,
7297 .page_size = 256,
7298 .feature_bits = FEATURE_WRSR_WREN,
7299 .tested = TEST_OK_PRE,
7300 .probe = probe_spi_rdid,
7301 .probe_timing = TIMING_ZERO,
7302 .block_erasers =
7303 {
7304 {
7305 .eraseblocks = { {32 * 1024, 4} },
7306 .block_erase = spi_block_erase_d8,
7307 }, {
7308 .eraseblocks = { {128 * 1024, 1} },
7309 .block_erase = spi_block_erase_c7,
7310 }
7311 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007312 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007313 .unlock = spi_disable_blockprotect,
7314 .write = spi_chip_write_256,
7315 .read = spi_chip_read,
7316 .voltage = {2700, 3600},
7317 },
7318
7319 /* The ST M25P10 has the same problem as the M25P05. */
7320 {
7321 .vendor = "Micron/Numonyx/ST",
7322 .name = "M25P10",
7323 .bustype = BUS_SPI,
7324 .manufacture_id = 0, /* Not used. */
7325 .model_id = ST_M25P10_RES,
7326 .total_size = 128,
7327 .page_size = 256,
7328 .feature_bits = FEATURE_WRSR_WREN,
7329 .tested = TEST_UNTESTED,
7330 .probe = probe_spi_res1,
7331 .probe_timing = TIMING_ZERO,
7332 .block_erasers =
7333 {
7334 {
7335 .eraseblocks = { {32 * 1024, 4} },
7336 .block_erase = spi_block_erase_d8,
7337 }, {
7338 .eraseblocks = { {128 * 1024, 1} },
7339 .block_erase = spi_block_erase_c7,
7340 }
7341 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007342 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007343 .unlock = spi_disable_blockprotect,
7344 .write = spi_chip_write_1, /* 128 */
7345 .read = spi_chip_read,
7346 .voltage = {2700, 3600},
7347 },
7348
7349 {
7350 .vendor = "Micron/Numonyx/ST", /* Numonyx */
7351 .name = "M25P20",
7352 .bustype = BUS_SPI,
7353 .manufacture_id = ST_ID,
7354 .model_id = ST_M25P20,
7355 .total_size = 256,
7356 .page_size = 256,
7357 .feature_bits = FEATURE_WRSR_WREN,
7358 .tested = TEST_UNTESTED,
7359 .probe = probe_spi_rdid,
7360 .probe_timing = TIMING_ZERO,
7361 .block_erasers =
7362 {
7363 {
7364 .eraseblocks = { {64 * 1024, 4} },
7365 .block_erase = spi_block_erase_d8,
7366 }, {
7367 .eraseblocks = { {256 * 1024, 1} },
7368 .block_erase = spi_block_erase_c7,
7369 }
7370 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007371 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007372 .unlock = spi_disable_blockprotect,
7373 .write = spi_chip_write_256,
7374 .read = spi_chip_read, /* Fast read (0x0B) supported */
7375 .voltage = {2700, 3600},
7376 },
7377
7378 {
7379 .vendor = "Micron/Numonyx/ST",
7380 .name = "M25P20-old",
7381 .bustype = BUS_SPI,
7382 .manufacture_id = 0, /* Not used. */
7383 .model_id = ST_M25P20_RES,
7384 .total_size = 256,
7385 .page_size = 256,
7386 .feature_bits = FEATURE_WRSR_WREN,
7387 .tested = TEST_OK_PREW,
7388 .probe = probe_spi_res1,
7389 .probe_timing = TIMING_ZERO,
7390 .block_erasers =
7391 {
7392 {
7393 .eraseblocks = { {64 * 1024, 4} },
7394 .block_erase = spi_block_erase_d8,
7395 }, {
7396 .eraseblocks = { {256 * 1024, 1} },
7397 .block_erase = spi_block_erase_c7,
7398 }
7399 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007400 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007401 .unlock = spi_disable_blockprotect,
7402 .write = spi_chip_write_256,
7403 .read = spi_chip_read, /* Fast read (0x0B) supported */
7404 .voltage = {2700, 3600},
7405 },
7406
7407 {
7408 .vendor = "Micron/Numonyx/ST", /* Numonyx */
7409 .name = "M25P40",
7410 .bustype = BUS_SPI,
7411 .manufacture_id = ST_ID,
7412 .model_id = ST_M25P40,
7413 .total_size = 512,
7414 .page_size = 256,
7415 .feature_bits = FEATURE_WRSR_WREN,
7416 .tested = TEST_OK_PREW,
7417 .probe = probe_spi_rdid,
7418 .probe_timing = TIMING_ZERO,
7419 .block_erasers =
7420 {
7421 {
7422 .eraseblocks = { {64 * 1024, 8} },
7423 .block_erase = spi_block_erase_d8,
7424 }, {
7425 .eraseblocks = { {512 * 1024, 1} },
7426 .block_erase = spi_block_erase_c7,
7427 }
7428 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007429 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007430 .unlock = spi_disable_blockprotect,
7431 .write = spi_chip_write_256,
7432 .read = spi_chip_read,
7433 .voltage = {2700, 3600},
7434 },
7435
7436 {
7437 .vendor = "Micron/Numonyx/ST",
7438 .name = "M25P40-old",
7439 .bustype = BUS_SPI,
7440 .manufacture_id = 0, /* Not used. */
7441 .model_id = ST_M25P40_RES,
7442 .total_size = 512,
7443 .page_size = 256,
7444 .feature_bits = FEATURE_WRSR_WREN,
7445 .tested = TEST_UNTESTED,
7446 .probe = probe_spi_res1,
7447 .probe_timing = TIMING_ZERO,
7448 .block_erasers =
7449 {
7450 {
7451 .eraseblocks = { {64 * 1024, 8} },
7452 .block_erase = spi_block_erase_d8,
7453 }, {
7454 .eraseblocks = { {512 * 1024, 1} },
7455 .block_erase = spi_block_erase_c7,
7456 }
7457 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007458 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007459 .unlock = spi_disable_blockprotect,
7460 .write = spi_chip_write_256,
7461 .read = spi_chip_read,
7462 },
7463
7464 {
7465 .vendor = "Micron/Numonyx/ST",
7466 .name = "M25P80",
7467 .bustype = BUS_SPI,
7468 .manufacture_id = ST_ID,
7469 .model_id = ST_M25P80,
7470 .total_size = 1024,
7471 .page_size = 256,
7472 .feature_bits = FEATURE_WRSR_WREN,
7473 .tested = TEST_OK_PREW,
7474 .probe = probe_spi_rdid,
7475 .probe_timing = TIMING_ZERO,
7476 .block_erasers =
7477 {
7478 {
7479 .eraseblocks = { {64 * 1024, 16} },
7480 .block_erase = spi_block_erase_d8,
7481 }, {
7482 .eraseblocks = { {1024 * 1024, 1} },
7483 .block_erase = spi_block_erase_c7,
7484 }
7485 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007486 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007487 .unlock = spi_disable_blockprotect,
7488 .write = spi_chip_write_256,
7489 .read = spi_chip_read,
7490 .voltage = {2700, 3600},
7491 },
7492
7493 {
7494 .vendor = "Micron/Numonyx/ST",
7495 .name = "M25P16",
7496 .bustype = BUS_SPI,
7497 .manufacture_id = ST_ID,
7498 .model_id = ST_M25P16,
7499 .total_size = 2048,
7500 .page_size = 256,
7501 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007502 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007503 .probe = probe_spi_rdid,
7504 .probe_timing = TIMING_ZERO,
7505 .block_erasers =
7506 {
7507 {
7508 .eraseblocks = { {64 * 1024, 32} },
7509 .block_erase = spi_block_erase_d8,
7510 }, {
7511 .eraseblocks = { {2 * 1024 * 1024, 1} },
7512 .block_erase = spi_block_erase_c7,
7513 }
7514 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007515 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007516 .unlock = spi_disable_blockprotect,
7517 .write = spi_chip_write_256,
7518 .read = spi_chip_read,
7519 .voltage = {2700, 3600},
7520 },
7521
7522 {
7523 .vendor = "Micron/Numonyx/ST",
7524 .name = "M25P32",
7525 .bustype = BUS_SPI,
7526 .manufacture_id = ST_ID,
7527 .model_id = ST_M25P32,
7528 .total_size = 4096,
7529 .page_size = 256,
7530 .feature_bits = FEATURE_WRSR_WREN,
7531 .tested = TEST_OK_PREW,
7532 .probe = probe_spi_rdid,
7533 .probe_timing = TIMING_ZERO,
7534 .block_erasers =
7535 {
7536 {
7537 .eraseblocks = { {64 * 1024, 64} },
7538 .block_erase = spi_block_erase_d8,
7539 }, {
7540 .eraseblocks = { {4 * 1024 * 1024, 1} },
7541 .block_erase = spi_block_erase_c7,
7542 }
7543 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007544 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007545 .unlock = spi_disable_blockprotect,
7546 .write = spi_chip_write_256,
7547 .read = spi_chip_read,
7548 .voltage = {2700, 3600},
7549 },
7550
7551 {
7552 .vendor = "Micron/Numonyx/ST",
7553 .name = "M25P64",
7554 .bustype = BUS_SPI,
7555 .manufacture_id = ST_ID,
7556 .model_id = ST_M25P64,
7557 .total_size = 8192,
7558 .page_size = 256,
7559 .feature_bits = FEATURE_WRSR_WREN,
7560 .tested = TEST_OK_PREW,
7561 .probe = probe_spi_rdid,
7562 .probe_timing = TIMING_ZERO,
7563 .block_erasers =
7564 {
7565 {
7566 .eraseblocks = { {64 * 1024, 128} },
7567 .block_erase = spi_block_erase_d8,
7568 }, {
7569 .eraseblocks = { {8 * 1024 * 1024, 1} },
7570 .block_erase = spi_block_erase_c7,
7571 }
7572 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007573 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007574 .unlock = spi_disable_blockprotect,
7575 .write = spi_chip_write_256,
7576 .read = spi_chip_read,
7577 .voltage = {2700, 3600},
7578 },
7579
7580 {
7581 .vendor = "Micron/Numonyx/ST",
7582 .name = "M25P128",
7583 .bustype = BUS_SPI,
7584 .manufacture_id = ST_ID,
7585 .model_id = ST_M25P128,
7586 .total_size = 16384,
7587 .page_size = 256,
7588 .feature_bits = FEATURE_WRSR_WREN,
7589 .tested = TEST_OK_PREW,
7590 .probe = probe_spi_rdid,
7591 .probe_timing = TIMING_ZERO,
7592 .block_erasers =
7593 {
7594 {
7595 .eraseblocks = { {256 * 1024, 64} },
7596 .block_erase = spi_block_erase_d8,
7597 }, {
7598 .eraseblocks = { {16 * 1024 * 1024, 1} },
7599 .block_erase = spi_block_erase_c7,
7600 }
7601 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007602 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007603 .unlock = spi_disable_blockprotect,
7604 .write = spi_chip_write_256,
7605 .read = spi_chip_read,
7606 .voltage = {2700, 3600},
7607 },
7608
7609 {
7610 .vendor = "Micron/Numonyx/ST",
7611 .name = "M25PE10",
7612 .bustype = BUS_SPI,
7613 .manufacture_id = ST_ID,
7614 .model_id = ST_M25PE10,
7615 .total_size = 128,
7616 .page_size = 256,
7617 .feature_bits = FEATURE_WRSR_WREN,
7618 .tested = TEST_UNTESTED,
7619 .probe = probe_spi_rdid,
7620 .probe_timing = TIMING_ZERO,
7621 .block_erasers =
7622 {
7623 {
7624 .eraseblocks = { {4 * 1024, 32} },
7625 .block_erase = spi_block_erase_20,
7626 }, {
7627 .eraseblocks = { {64 * 1024, 2} },
7628 .block_erase = spi_block_erase_d8,
7629 }, {
7630 .eraseblocks = { {128 * 1024, 1} },
7631 .block_erase = spi_block_erase_c7,
7632 }
7633 },
7634 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7635 .unlock = spi_disable_blockprotect,
7636 .write = spi_chip_write_256,
7637 .read = spi_chip_read,
7638 .voltage = {2700, 3600},
7639 },
7640
7641 {
7642 .vendor = "Micron/Numonyx/ST",
7643 .name = "M25PE20",
7644 .bustype = BUS_SPI,
7645 .manufacture_id = ST_ID,
7646 .model_id = ST_M25PE20,
7647 .total_size = 256,
7648 .page_size = 256,
7649 .feature_bits = FEATURE_WRSR_WREN,
7650 .tested = TEST_UNTESTED,
7651 .probe = probe_spi_rdid,
7652 .probe_timing = TIMING_ZERO,
7653 .block_erasers =
7654 {
7655 {
7656 .eraseblocks = { {4 * 1024, 64} },
7657 .block_erase = spi_block_erase_20,
7658 }, {
7659 .eraseblocks = { {64 * 1024, 4} },
7660 .block_erase = spi_block_erase_d8,
7661 }, {
7662 .eraseblocks = { {256 * 1024, 1} },
7663 .block_erase = spi_block_erase_c7,
7664 }
7665 },
7666 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7667 .unlock = spi_disable_blockprotect,
7668 .write = spi_chip_write_256,
7669 .read = spi_chip_read,
7670 .voltage = {2700, 3600},
7671 },
7672
7673 {
7674 .vendor = "Micron/Numonyx/ST",
7675 .name = "M25PE40",
7676 .bustype = BUS_SPI,
7677 .manufacture_id = ST_ID,
7678 .model_id = ST_M25PE40,
7679 .total_size = 512,
7680 .page_size = 256,
7681 .feature_bits = FEATURE_WRSR_WREN,
7682 .tested = TEST_UNTESTED,
7683 .probe = probe_spi_rdid,
7684 .probe_timing = TIMING_ZERO,
7685 .block_erasers =
7686 {
7687 {
7688 .eraseblocks = { {4 * 1024, 128} },
7689 .block_erase = spi_block_erase_20,
7690 }, {
7691 .eraseblocks = { {64 * 1024, 8} },
7692 .block_erase = spi_block_erase_d8,
7693 }, {
7694 .eraseblocks = { {512 * 1024, 1} },
7695 .block_erase = spi_block_erase_c7,
7696 }
7697 },
7698 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7699 .unlock = spi_disable_blockprotect,
7700 .write = spi_chip_write_256,
7701 .read = spi_chip_read,
7702 .voltage = {2700, 3600},
7703 },
7704
7705 {
7706 .vendor = "Micron/Numonyx/ST",
7707 .name = "M25PE80",
7708 .bustype = BUS_SPI,
7709 .manufacture_id = ST_ID,
7710 .model_id = ST_M25PE80,
7711 .total_size = 1024,
7712 .page_size = 256,
7713 .feature_bits = FEATURE_WRSR_WREN,
7714 .tested = TEST_OK_PREW,
7715 .probe = probe_spi_rdid,
7716 .probe_timing = TIMING_ZERO,
7717 .block_erasers =
7718 {
7719 {
7720 .eraseblocks = { {4 * 1024, 256} },
7721 .block_erase = spi_block_erase_20,
7722 }, {
7723 .eraseblocks = { {64 * 1024, 16} },
7724 .block_erase = spi_block_erase_d8,
7725 }, {
7726 .eraseblocks = { {1024 * 1024, 1} },
7727 .block_erase = spi_block_erase_c7,
7728 }
7729 },
7730 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7731 .unlock = spi_disable_blockprotect,
7732 .write = spi_chip_write_256,
7733 .read = spi_chip_read,
7734 .voltage = {2700, 3600},
7735 },
7736
7737 {
7738 .vendor = "Micron/Numonyx/ST",
7739 .name = "M25PE16",
7740 .bustype = BUS_SPI,
7741 .manufacture_id = ST_ID,
7742 .model_id = ST_M25PE16,
7743 .total_size = 2048,
7744 .page_size = 256,
7745 .feature_bits = FEATURE_WRSR_WREN,
7746 .tested = TEST_UNTESTED,
7747 .probe = probe_spi_rdid,
7748 .probe_timing = TIMING_ZERO,
7749 .block_erasers =
7750 {
7751 {
7752 .eraseblocks = { {4 * 1024, 512} },
7753 .block_erase = spi_block_erase_20,
7754 }, {
7755 .eraseblocks = { {64 * 1024, 32} },
7756 .block_erase = spi_block_erase_d8,
7757 }, {
7758 .eraseblocks = { {2 * 1024 * 1024, 1} },
7759 .block_erase = spi_block_erase_c7,
7760 }
7761 },
7762 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7763 .unlock = spi_disable_blockprotect,
7764 .write = spi_chip_write_256,
7765 .read = spi_chip_read,
7766 .voltage = {2700, 3600},
7767 },
7768
7769 {
7770 .vendor = "Micron/Numonyx/ST",
7771 .name = "M25PX80",
7772 .bustype = BUS_SPI,
7773 .manufacture_id = ST_ID,
7774 .model_id = ST_M25PX80,
7775 .total_size = 1024,
7776 .page_size = 256,
7777 /* OTP: 64B total; read 0x4B, write 0x42 */
7778 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7779 .tested = TEST_OK_PREW,
7780 .probe = probe_spi_rdid,
7781 .probe_timing = TIMING_ZERO,
7782 .block_erasers = {
7783 {
7784 .eraseblocks = { { 4 * 1024, 256 } },
7785 .block_erase = spi_block_erase_20,
7786 }, {
7787 .eraseblocks = { {64 * 1024, 16} },
7788 .block_erase = spi_block_erase_d8,
7789 }, {
7790 .eraseblocks = { {1024 * 1024, 1} },
7791 .block_erase = spi_block_erase_c7,
7792 }
7793 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007794 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007795 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7796 .write = spi_chip_write_256,
7797 .read = spi_chip_read,
7798 .voltage = {2700, 3600},
7799 },
7800
7801 {
7802 .vendor = "Micron/Numonyx/ST",
7803 .name = "M25PX16",
7804 .bustype = BUS_SPI,
7805 .manufacture_id = ST_ID,
7806 .model_id = ST_M25PX16,
7807 .total_size = 2048,
7808 .page_size = 256,
7809 /* OTP: 64B total; read 0x4B; write 0x42 */
7810 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7811 .tested = TEST_OK_PREW,
7812 .probe = probe_spi_rdid,
7813 .probe_timing = TIMING_ZERO,
7814 .block_erasers =
7815 {
7816 {
7817 .eraseblocks = { { 4 * 1024, 512 } },
7818 .block_erase = spi_block_erase_20,
7819 }, {
7820 .eraseblocks = { {64 * 1024, 32} },
7821 .block_erase = spi_block_erase_d8,
7822 }, {
7823 .eraseblocks = { {2 * 1024 * 1024, 1} },
7824 .block_erase = spi_block_erase_c7,
7825 }
7826 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007827 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007828 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7829 .write = spi_chip_write_256,
7830 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007831 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007832 },
7833
7834 {
7835 .vendor = "Micron/Numonyx/ST",
7836 .name = "M25PX32",
7837 .bustype = BUS_SPI,
7838 .manufacture_id = ST_ID,
7839 .model_id = ST_M25PX32,
7840 .total_size = 4096,
7841 .page_size = 256,
7842 /* OTP: 64B total; read 0x4B; write 0x42 */
7843 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7844 .tested = TEST_OK_PRE,
7845 .probe = probe_spi_rdid,
7846 .probe_timing = TIMING_ZERO,
7847 .block_erasers =
7848 {
7849 {
7850 .eraseblocks = { { 4 * 1024, 1024 } },
7851 .block_erase = spi_block_erase_20,
7852 }, {
7853 .eraseblocks = { {64 * 1024, 64} },
7854 .block_erase = spi_block_erase_d8,
7855 }, {
7856 .eraseblocks = { {4 * 1024 * 1024, 1} },
7857 .block_erase = spi_block_erase_c7,
7858 }
7859 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007860 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007861 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7862 .write = spi_chip_write_256,
7863 .read = spi_chip_read,
7864 .voltage = {2700, 3600},
7865 },
7866
7867 {
7868 .vendor = "Micron/Numonyx/ST",
7869 .name = "M25PX64",
7870 .bustype = BUS_SPI,
7871 .manufacture_id = ST_ID,
7872 .model_id = ST_M25PX64,
7873 .total_size = 8192,
7874 .page_size = 256,
7875 /* OTP: 64B total; read 0x4B; write 0x42 */
7876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007877 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007878 .probe = probe_spi_rdid,
7879 .probe_timing = TIMING_ZERO,
7880 .block_erasers =
7881 {
7882 {
7883 .eraseblocks = { { 4 * 1024, 2048 } },
7884 .block_erase = spi_block_erase_20,
7885 }, {
7886 .eraseblocks = { {64 * 1024, 128} },
7887 .block_erase = spi_block_erase_d8,
7888 }, {
7889 .eraseblocks = { {8 * 1024 * 1024, 1} },
7890 .block_erase = spi_block_erase_c7,
7891 }
7892 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007893 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007894 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7895 .write = spi_chip_write_256,
7896 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007897 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007898 },
7899
7900 {
7901 .vendor = "Micron/Numonyx/ST",
7902 .name = "M45PE10",
7903 .bustype = BUS_SPI,
7904 .manufacture_id = ST_ID,
7905 .model_id = ST_M45PE10,
7906 .total_size = 128,
7907 .page_size = 256,
7908 .tested = TEST_UNTESTED,
7909 .probe = probe_spi_rdid,
7910 .probe_timing = TIMING_ZERO,
7911 .block_erasers = {
7912 {
7913 .eraseblocks = { {256, 512} },
7914 .block_erase = spi_block_erase_db,
7915 }, {
7916 .eraseblocks = { {64 * 1024, 2} },
7917 .block_erase = spi_block_erase_d8,
7918 }
7919 },
7920 .printlock = spi_prettyprint_status_register_default_welwip,
7921 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7922 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7923 .read = spi_chip_read, /* Fast read (0x0B) supported */
7924 .voltage = {2700, 3600},
7925 },
7926
7927 {
7928 .vendor = "Micron/Numonyx/ST",
7929 .name = "M45PE20",
7930 .bustype = BUS_SPI,
7931 .manufacture_id = ST_ID,
7932 .model_id = ST_M45PE20,
7933 .total_size = 256,
7934 .page_size = 256,
7935 .tested = TEST_UNTESTED,
7936 .probe = probe_spi_rdid,
7937 .probe_timing = TIMING_ZERO,
7938 .block_erasers = {
7939 {
7940 .eraseblocks = { {256, 1024} },
7941 .block_erase = spi_block_erase_db,
7942 }, {
7943 .eraseblocks = { {64 * 1024, 4} },
7944 .block_erase = spi_block_erase_d8,
7945 }
7946 },
7947 .printlock = spi_prettyprint_status_register_default_welwip,
7948 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7949 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7950 .read = spi_chip_read, /* Fast read (0x0B) supported */
7951 .voltage = {2700, 3600},
7952 },
7953
7954 {
7955 .vendor = "Micron/Numonyx/ST",
7956 .name = "M45PE40",
7957 .bustype = BUS_SPI,
7958 .manufacture_id = ST_ID,
7959 .model_id = ST_M45PE40,
7960 .total_size = 512,
7961 .page_size = 256,
7962 .tested = TEST_UNTESTED,
7963 .probe = probe_spi_rdid,
7964 .probe_timing = TIMING_ZERO,
7965 .block_erasers = {
7966 {
7967 .eraseblocks = { {256, 2048} },
7968 .block_erase = spi_block_erase_db,
7969 }, {
7970 .eraseblocks = { {64 * 1024, 8} },
7971 .block_erase = spi_block_erase_d8,
7972 }
7973 },
7974 .printlock = spi_prettyprint_status_register_default_welwip,
7975 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7976 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7977 .read = spi_chip_read, /* Fast read (0x0B) supported */
7978 .voltage = {2700, 3600},
7979 },
7980
7981 {
7982 .vendor = "Micron/Numonyx/ST",
7983 .name = "M45PE80",
7984 .bustype = BUS_SPI,
7985 .manufacture_id = ST_ID,
7986 .model_id = ST_M45PE80,
7987 .total_size = 1024,
7988 .page_size = 256,
7989 .tested = TEST_UNTESTED,
7990 .probe = probe_spi_rdid,
7991 .probe_timing = TIMING_ZERO,
7992 .block_erasers = {
7993 {
7994 .eraseblocks = { {256, 4096} },
7995 .block_erase = spi_block_erase_db,
7996 }, {
7997 .eraseblocks = { {64 * 1024, 16} },
7998 .block_erase = spi_block_erase_d8,
7999 }
8000 },
8001 .printlock = spi_prettyprint_status_register_default_welwip,
8002 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8003 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8004 .read = spi_chip_read, /* Fast read (0x0B) supported */
8005 .voltage = {2700, 3600},
8006 },
8007
8008 {
8009 .vendor = "Micron/Numonyx/ST",
8010 .name = "M45PE16",
8011 .bustype = BUS_SPI,
8012 .manufacture_id = ST_ID,
8013 .model_id = ST_M45PE16,
8014 .total_size = 2048,
8015 .page_size = 256,
8016 .tested = TEST_UNTESTED,
8017 .probe = probe_spi_rdid,
8018 .probe_timing = TIMING_ZERO,
8019 .block_erasers = {
8020 {
8021 .eraseblocks = { {256, 8192} },
8022 .block_erase = spi_block_erase_db,
8023 }, {
8024 .eraseblocks = { {64 * 1024, 32} },
8025 .block_erase = spi_block_erase_d8,
8026 }
8027 },
8028 .printlock = spi_prettyprint_status_register_default_welwip,
8029 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8030 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8031 .read = spi_chip_read, /* Fast read (0x0B) supported */
8032 .voltage = {2700, 3600},
8033 },
8034
8035 {
8036 .vendor = "Micron/Numonyx/ST",
8037 .name = "N25Q016",
8038 .bustype = BUS_SPI,
8039 .manufacture_id = ST_ID,
8040 .model_id = ST_N25Q016__1E,
8041 .total_size = 2048,
8042 .page_size = 256,
8043 /* supports SFDP */
8044 /* OTP: 64B total; read 0x4B, write 0x42 */
8045 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8046 .tested = TEST_UNTESTED,
8047 .probe = probe_spi_rdid,
8048 .probe_timing = TIMING_ZERO,
8049 .block_erasers =
8050 {
8051 {
8052 .eraseblocks = { {4 * 1024, 512} },
8053 .block_erase = spi_block_erase_20,
8054 }, {
8055 .eraseblocks = { {32 * 1024, 64} },
8056 .block_erase = spi_block_erase_52,
8057 }, {
8058 .eraseblocks = { {64 * 1024, 32} },
8059 .block_erase = spi_block_erase_d8,
8060 }, {
8061 .eraseblocks = { {2 * 1024 * 1024, 1} },
8062 .block_erase = spi_block_erase_c7,
8063 }
8064 },
8065 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8066 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8067 .write = spi_chip_write_256, /* Multi I/O supported */
8068 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8069 .voltage = {1700, 2000},
8070 },
8071
8072 {
8073 .vendor = "Micron/Numonyx/ST",
8074 .name = "N25Q032..1E",
8075 .bustype = BUS_SPI,
8076 .manufacture_id = ST_ID,
8077 .model_id = ST_N25Q032__1E,
8078 .total_size = 4096,
8079 .page_size = 256,
8080 /* supports SFDP */
8081 /* OTP: 64B total; read 0x4B, write 0x42 */
8082 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8083 .tested = TEST_UNTESTED,
8084 .probe = probe_spi_rdid,
8085 .probe_timing = TIMING_ZERO,
8086 .block_erasers =
8087 {
8088 {
8089 .eraseblocks = { {4 * 1024, 1024} },
8090 .block_erase = spi_block_erase_20,
8091 }, {
8092 .eraseblocks = { {64 * 1024, 64} },
8093 .block_erase = spi_block_erase_d8,
8094 }, {
8095 .eraseblocks = { {4 * 1024 * 1024, 1} },
8096 .block_erase = spi_block_erase_c7,
8097 }
8098 },
8099 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8100 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8101 .write = spi_chip_write_256, /* Multi I/O supported */
8102 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8103 .voltage = {1700, 2000},
8104 },
8105
8106 {
8107 .vendor = "Micron/Numonyx/ST",
8108 .name = "N25Q032..3E",
8109 .bustype = BUS_SPI,
8110 .manufacture_id = ST_ID,
8111 .model_id = ST_N25Q032__3E,
8112 .total_size = 4096,
8113 .page_size = 256,
8114 /* supports SFDP */
8115 /* OTP: 64B total; read 0x4B, write 0x42 */
8116 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8117 .tested = TEST_OK_PREW,
8118 .probe = probe_spi_rdid,
8119 .probe_timing = TIMING_ZERO,
8120 .block_erasers =
8121 {
8122 {
8123 .eraseblocks = { {4 * 1024, 1024} },
8124 .block_erase = spi_block_erase_20,
8125 }, {
8126 .eraseblocks = { {64 * 1024, 64} },
8127 .block_erase = spi_block_erase_d8,
8128 }, {
8129 .eraseblocks = { {4 * 1024 * 1024, 1} },
8130 .block_erase = spi_block_erase_c7,
8131 }
8132 },
8133 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8134 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8135 .write = spi_chip_write_256, /* Multi I/O supported */
8136 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8137 .voltage = {2700, 3600},
8138 },
8139
8140 {
8141 .vendor = "Micron/Numonyx/ST",
8142 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
8143 .bustype = BUS_SPI,
8144 .manufacture_id = ST_ID,
8145 .model_id = ST_N25Q064__1E,
8146 .total_size = 8192,
8147 .page_size = 256,
8148 /* supports SFDP */
8149 /* OTP: 64B total; read 0x4B, write 0x42 */
8150 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008151 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008152 .probe = probe_spi_rdid,
8153 .probe_timing = TIMING_ZERO,
8154 .block_erasers =
8155 {
8156 {
8157 .eraseblocks = { {4 * 1024, 2048 } },
8158 .block_erase = spi_block_erase_20,
8159 }, {
8160 .eraseblocks = { {64 * 1024, 128} },
8161 .block_erase = spi_block_erase_d8,
8162 }, {
8163 .eraseblocks = { {8 * 1024 * 1024, 1} },
8164 .block_erase = spi_block_erase_c7,
8165 }
8166 },
8167 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8168 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8169 .write = spi_chip_write_256, /* Multi I/O supported */
8170 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8171 .voltage = {1700, 2000},
8172 },
8173
8174 {
8175 .vendor = "Micron/Numonyx/ST",
8176 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
8177 .bustype = BUS_SPI,
8178 .manufacture_id = ST_ID,
8179 .model_id = ST_N25Q064__3E,
8180 .total_size = 8192,
8181 .page_size = 256,
8182 /* supports SFDP */
8183 /* OTP: 64B total; read 0x4B, write 0x42 */
8184 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8185 .tested = TEST_OK_PREW,
8186 .probe = probe_spi_rdid,
8187 .probe_timing = TIMING_ZERO,
8188 .block_erasers =
8189 {
8190 {
8191 .eraseblocks = { {4 * 1024, 2048 } },
8192 .block_erase = spi_block_erase_20,
8193 }, {
8194 .eraseblocks = { {64 * 1024, 128} },
8195 .block_erase = spi_block_erase_d8,
8196 }, {
8197 .eraseblocks = { {8 * 1024 * 1024, 1} },
8198 .block_erase = spi_block_erase_c7,
8199 }
8200 },
8201 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8202 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8203 .write = spi_chip_write_256, /* Multi I/O supported */
8204 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8205 .voltage = {2700, 3600},
8206 },
8207
8208 {
8209 .vendor = "Micron/Numonyx/ST",
8210 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
8211 .bustype = BUS_SPI,
8212 .manufacture_id = ST_ID,
8213 .model_id = ST_N25Q128__1E,
8214 .total_size = 16384,
8215 .page_size = 256,
8216 /* supports SFDP */
8217 /* OTP: 64B total; read 0x4B, write 0x42 */
8218 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8219 .tested = TEST_UNTESTED,
8220 .probe = probe_spi_rdid,
8221 .probe_timing = TIMING_ZERO,
8222 .block_erasers = {
8223 {
8224 .eraseblocks = { {4 * 1024, 4096 } },
8225 .block_erase = spi_block_erase_20,
8226 }, {
8227 .eraseblocks = { {64 * 1024, 256} },
8228 .block_erase = spi_block_erase_d8,
8229 }, {
8230 .eraseblocks = { {16384 * 1024, 1} },
8231 .block_erase = spi_block_erase_c7,
8232 }
8233 },
8234 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8235 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8236 .write = spi_chip_write_256, /* Multi I/O supported */
8237 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8238 .voltage = {1700, 2000},
8239 },
8240
8241 {
8242 .vendor = "Micron/Numonyx/ST",
8243 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
8244 .bustype = BUS_SPI,
8245 .manufacture_id = ST_ID,
8246 .model_id = ST_N25Q128__3E,
8247 .total_size = 16384,
8248 .page_size = 256,
8249 /* supports SFDP */
8250 /* OTP: 64B total; read 0x4B, write 0x42 */
8251 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8252 .tested = TEST_OK_PREW,
8253 .probe = probe_spi_rdid,
8254 .probe_timing = TIMING_ZERO,
8255 .block_erasers = {
8256 {
8257 .eraseblocks = { {4 * 1024, 4096 } },
8258 .block_erase = spi_block_erase_20,
8259 }, {
8260 .eraseblocks = { {64 * 1024, 256} },
8261 .block_erase = spi_block_erase_d8,
8262 }, {
8263 .eraseblocks = { {16384 * 1024, 1} },
8264 .block_erase = spi_block_erase_c7,
8265 }
8266 },
8267 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8268 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8269 .write = spi_chip_write_256, /* Multi I/O supported */
8270 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8271 .voltage = {2700, 3600},
8272 },
8273
8274 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00008275 .vendor = "MoselVitelic",
8276 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008277 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008278 .manufacture_id = SYNCMOS_MVC_ID,
8279 .model_id = MVC_V29C51000B,
8280 .total_size = 64,
8281 .page_size = 512,
8282 .feature_bits = FEATURE_EITHER_RESET,
8283 .tested = TEST_UNTESTED,
8284 .probe = probe_jedec,
8285 .probe_timing = TIMING_ZERO,
8286 .block_erasers =
8287 {
8288 {
8289 .eraseblocks = { {512, 128} },
8290 .block_erase = erase_sector_jedec,
8291 }, {
8292 .eraseblocks = { {64 * 1024, 1} },
8293 .block_erase = erase_chip_block_jedec,
8294 },
8295 },
8296 .write = write_jedec_1,
8297 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008298 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008299 },
8300
8301 {
8302 .vendor = "MoselVitelic",
8303 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008304 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008305 .manufacture_id = SYNCMOS_MVC_ID,
8306 .model_id = MVC_V29C51000T,
8307 .total_size = 64,
8308 .page_size = 512,
8309 .feature_bits = FEATURE_EITHER_RESET,
8310 .tested = TEST_UNTESTED,
8311 .probe = probe_jedec,
8312 .probe_timing = TIMING_ZERO,
8313 .block_erasers =
8314 {
8315 {
8316 .eraseblocks = { {512, 128} },
8317 .block_erase = erase_sector_jedec,
8318 }, {
8319 .eraseblocks = { {64 * 1024, 1} },
8320 .block_erase = erase_chip_block_jedec,
8321 },
8322 },
8323 .write = write_jedec_1,
8324 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008325 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008326 },
8327
8328 {
8329 .vendor = "MoselVitelic",
8330 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008331 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008332 .manufacture_id = SYNCMOS_MVC_ID,
8333 .model_id = MVC_V29C51400B,
8334 .total_size = 512,
8335 .page_size = 1024,
8336 .feature_bits = FEATURE_EITHER_RESET,
8337 .tested = TEST_UNTESTED,
8338 .probe = probe_jedec,
8339 .probe_timing = TIMING_ZERO,
8340 .block_erasers =
8341 {
8342 {
8343 .eraseblocks = { {1024, 512} },
8344 .block_erase = erase_sector_jedec,
8345 }, {
8346 .eraseblocks = { {512 * 1024, 1} },
8347 .block_erase = erase_chip_block_jedec,
8348 },
8349 },
8350 .write = write_jedec_1,
8351 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008352 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008353 },
8354
8355 {
8356 .vendor = "MoselVitelic",
8357 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008358 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008359 .manufacture_id = SYNCMOS_MVC_ID,
8360 .model_id = MVC_V29C51400T,
8361 .total_size = 512,
8362 .page_size = 1024,
8363 .feature_bits = FEATURE_EITHER_RESET,
8364 .tested = TEST_UNTESTED,
8365 .probe = probe_jedec,
8366 .probe_timing = TIMING_ZERO,
8367 .block_erasers =
8368 {
8369 {
8370 .eraseblocks = { {1024, 512} },
8371 .block_erase = erase_sector_jedec,
8372 }, {
8373 .eraseblocks = { {512 * 1024, 1} },
8374 .block_erase = erase_chip_block_jedec,
8375 },
8376 },
8377 .write = write_jedec_1,
8378 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008379 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008380 },
8381
8382 {
8383 .vendor = "MoselVitelic",
8384 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008385 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008386 .manufacture_id = SYNCMOS_MVC_ID,
8387 .model_id = MVC_V29LC51000,
8388 .total_size = 64,
8389 .page_size = 512,
8390 .feature_bits = FEATURE_EITHER_RESET,
8391 .tested = TEST_UNTESTED,
8392 .probe = probe_jedec,
8393 .probe_timing = TIMING_ZERO,
8394 .block_erasers =
8395 {
8396 {
8397 .eraseblocks = { {512, 128} },
8398 .block_erase = erase_sector_jedec,
8399 }, {
8400 .eraseblocks = { {64 * 1024, 1} },
8401 .block_erase = erase_chip_block_jedec,
8402 },
8403 },
8404 .write = write_jedec_1,
8405 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008406 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008407 },
8408
8409 {
8410 .vendor = "MoselVitelic",
8411 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008412 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008413 .manufacture_id = SYNCMOS_MVC_ID,
8414 .model_id = MVC_V29LC51001,
8415 .total_size = 128,
8416 .page_size = 512,
8417 .feature_bits = FEATURE_EITHER_RESET,
8418 .tested = TEST_UNTESTED,
8419 .probe = probe_jedec,
8420 .probe_timing = TIMING_ZERO,
8421 .block_erasers =
8422 {
8423 {
8424 .eraseblocks = { {512, 256} },
8425 .block_erase = erase_sector_jedec,
8426 }, {
8427 .eraseblocks = { {128 * 1024, 1} },
8428 .block_erase = erase_chip_block_jedec,
8429 },
8430 },
8431 .write = write_jedec_1,
8432 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008433 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008434 },
8435
8436 {
8437 .vendor = "MoselVitelic",
8438 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008439 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008440 .manufacture_id = SYNCMOS_MVC_ID,
8441 .model_id = MVC_V29LC51002,
8442 .total_size = 256,
8443 .page_size = 512,
8444 .feature_bits = FEATURE_EITHER_RESET,
8445 .tested = TEST_UNTESTED,
8446 .probe = probe_jedec,
8447 .probe_timing = TIMING_ZERO,
8448 .block_erasers =
8449 {
8450 {
8451 .eraseblocks = { {512, 512} },
8452 .block_erase = erase_sector_jedec,
8453 }, {
8454 .eraseblocks = { {256 * 1024, 1} },
8455 .block_erase = erase_chip_block_jedec,
8456 },
8457 },
8458 .write = write_jedec_1,
8459 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008460 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008461 },
8462
8463 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008464 .vendor = "Nantronics",
8465 .name = "N25S10",
8466 .bustype = BUS_SPI,
8467 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8468 .model_id = NANTRONICS_N25S10,
8469 .total_size = 128,
8470 .page_size = 256,
8471 .feature_bits = FEATURE_WRSR_WREN,
8472 .tested = TEST_UNTESTED,
8473 .probe = probe_spi_rdid,
8474 .probe_timing = TIMING_ZERO,
8475 .block_erasers =
8476 {
8477 {
8478 .eraseblocks = { {4 * 1024, 32} },
8479 .block_erase = spi_block_erase_20,
8480 }, {
8481 .eraseblocks = { {4 * 1024, 32} },
8482 .block_erase = spi_block_erase_d7,
8483 }, {
8484 .eraseblocks = { {32 * 1024, 4} },
8485 .block_erase = spi_block_erase_52,
8486 }, {
8487 .eraseblocks = { {64 * 1024, 2} },
8488 .block_erase = spi_block_erase_d8,
8489 }, {
8490 .eraseblocks = { {128 * 1024, 1} },
8491 .block_erase = spi_block_erase_60,
8492 }, {
8493 .eraseblocks = { {128 * 1024, 1} },
8494 .block_erase = spi_block_erase_c7,
8495 }
8496 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008497 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008498 .unlock = spi_disable_blockprotect_bp3_srwd,
8499 .write = spi_chip_write_256,
8500 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8501 .voltage = {2700, 3600},
8502 },
8503
8504 {
8505 .vendor = "Nantronics",
8506 .name = "N25S20",
8507 .bustype = BUS_SPI,
8508 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8509 .model_id = NANTRONICS_N25S20,
8510 .total_size = 256,
8511 .page_size = 256,
8512 .feature_bits = FEATURE_WRSR_WREN,
8513 .tested = TEST_UNTESTED,
8514 .probe = probe_spi_rdid,
8515 .probe_timing = TIMING_ZERO,
8516 .block_erasers =
8517 {
8518 {
8519 .eraseblocks = { {4 * 1024, 64} },
8520 .block_erase = spi_block_erase_20,
8521 }, {
8522 .eraseblocks = { {4 * 1024, 64} },
8523 .block_erase = spi_block_erase_d7,
8524 }, {
8525 .eraseblocks = { {32 * 1024, 8} },
8526 .block_erase = spi_block_erase_52,
8527 }, {
8528 .eraseblocks = { {64 * 1024, 4} },
8529 .block_erase = spi_block_erase_d8,
8530 }, {
8531 .eraseblocks = { {256 * 1024, 1} },
8532 .block_erase = spi_block_erase_60,
8533 }, {
8534 .eraseblocks = { {256 * 1024, 1} },
8535 .block_erase = spi_block_erase_c7,
8536 }
8537 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008538 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008539 .unlock = spi_disable_blockprotect_bp3_srwd,
8540 .write = spi_chip_write_256,
8541 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8542 .voltage = {2700, 3600},
8543 },
8544
8545 {
8546 .vendor = "Nantronics",
8547 .name = "N25S40",
8548 .bustype = BUS_SPI,
8549 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8550 .model_id = NANTRONICS_N25S40,
8551 .total_size = 512,
8552 .page_size = 256,
8553 .feature_bits = FEATURE_WRSR_WREN,
8554 .tested = TEST_UNTESTED,
8555 .probe = probe_spi_rdid,
8556 .probe_timing = TIMING_ZERO,
8557 .block_erasers =
8558 {
8559 {
8560 .eraseblocks = { {4 * 1024, 128} },
8561 .block_erase = spi_block_erase_20,
8562 }, {
8563 .eraseblocks = { {4 * 1024, 128} },
8564 .block_erase = spi_block_erase_d7,
8565 }, {
8566 .eraseblocks = { {32 * 1024, 16} },
8567 .block_erase = spi_block_erase_52,
8568 }, {
8569 .eraseblocks = { {64 * 1024, 8} },
8570 .block_erase = spi_block_erase_d8,
8571 }, {
8572 .eraseblocks = { {512 * 1024, 1} },
8573 .block_erase = spi_block_erase_60,
8574 }, {
8575 .eraseblocks = { {512 * 1024, 1} },
8576 .block_erase = spi_block_erase_c7,
8577 }
8578 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008579 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008580 .unlock = spi_disable_blockprotect_bp3_srwd,
8581 .write = spi_chip_write_256,
8582 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8583 .voltage = {2700, 3600},
8584 },
8585
8586 {
8587 .vendor = "Nantronics",
8588 .name = "N25S80",
8589 .bustype = BUS_SPI,
8590 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8591 .model_id = NANTRONICS_N25S80,
8592 .total_size = 1024,
8593 .page_size = 256,
8594 .feature_bits = FEATURE_WRSR_WREN,
8595 .tested = TEST_UNTESTED,
8596 .probe = probe_spi_rdid,
8597 .probe_timing = TIMING_ZERO,
8598 .block_erasers =
8599 {
8600 {
8601 .eraseblocks = { {4 * 1024, 256} },
8602 .block_erase = spi_block_erase_20,
8603 }, {
8604 .eraseblocks = { {32 * 1024, 32} },
8605 .block_erase = spi_block_erase_52,
8606 }, {
8607 .eraseblocks = { {64 * 1024, 16} },
8608 .block_erase = spi_block_erase_d8,
8609 }, {
8610 .eraseblocks = { {1024 * 1024, 1} },
8611 .block_erase = spi_block_erase_60,
8612 }, {
8613 .eraseblocks = { {1024 * 1024, 1} },
8614 .block_erase = spi_block_erase_c7,
8615 }
8616 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008617 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008618 .unlock = spi_disable_blockprotect_bp3_srwd,
8619 .write = spi_chip_write_256,
8620 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8621 .voltage = {2700, 3600},
8622 },
8623
8624 {
8625 .vendor = "Nantronics",
8626 .name = "N25S16",
8627 .bustype = BUS_SPI,
8628 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8629 .model_id = NANTRONICS_N25S16,
8630 .total_size = 2048,
8631 .page_size = 256,
8632 .feature_bits = FEATURE_WRSR_WREN,
8633 .tested = TEST_UNTESTED,
8634 .probe = probe_spi_rdid,
8635 .probe_timing = TIMING_ZERO,
8636 .block_erasers =
8637 {
8638 {
8639 .eraseblocks = { {4 * 1024, 512} },
8640 .block_erase = spi_block_erase_20,
8641 }, {
8642 .eraseblocks = { {64 * 1024, 32} },
8643 .block_erase = spi_block_erase_d8,
8644 }, {
8645 .eraseblocks = { {2048 * 1024, 1} },
8646 .block_erase = spi_block_erase_60,
8647 }, {
8648 .eraseblocks = { {2048 * 1024, 1} },
8649 .block_erase = spi_block_erase_c7,
8650 }
8651 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008652 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008653 .unlock = spi_disable_blockprotect_bp3_srwd,
8654 .write = spi_chip_write_256,
8655 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8656 .voltage = {2700, 3600},
8657 },
8658
8659 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008660 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00008661 .name = "Pm25LD256C",
8662 .bustype = BUS_SPI,
8663 .manufacture_id = PMC_ID,
8664 .model_id = PMC_PM25LD256C,
8665 .total_size = 32,
8666 .page_size = 256,
8667 .feature_bits = FEATURE_WRSR_WREN,
8668 .tested = TEST_UNTESTED,
8669 .probe = probe_spi_rdid,
8670 .probe_timing = TIMING_ZERO,
8671 .block_erasers =
8672 {
8673 {
8674 .eraseblocks = { {4 * 1024, 8} },
8675 .block_erase = spi_block_erase_20,
8676 }, {
8677 .eraseblocks = { {4 * 1024, 8} },
8678 .block_erase = spi_block_erase_d7,
8679 }, {
8680 .eraseblocks = { {32 * 1024, 1} },
8681 .block_erase = spi_block_erase_d8,
8682 }, {
8683 .eraseblocks = { {32 * 1024, 1} },
8684 .block_erase = spi_block_erase_60,
8685 }, {
8686 .eraseblocks = { {32 * 1024, 1} },
8687 .block_erase = spi_block_erase_c7,
8688 }
8689 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008690 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00008691 .unlock = spi_disable_blockprotect,
8692 .write = spi_chip_write_256,
8693 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8694 .voltage = {2700, 3600},
8695 },
8696 {
8697 .vendor = "PMC",
8698 .name = "Pm25LD512(C)",
8699 .bustype = BUS_SPI,
8700 .manufacture_id = PMC_ID,
8701 .model_id = PMC_PM25LD512,
8702 .total_size = 64,
8703 .page_size = 256,
8704 .feature_bits = FEATURE_WRSR_WREN,
8705 .tested = TEST_OK_PREW,
8706 .probe = probe_spi_rdid,
8707 .probe_timing = TIMING_ZERO,
8708 .block_erasers =
8709 {
8710 {
8711 .eraseblocks = { {4 * 1024, 16} },
8712 .block_erase = spi_block_erase_20,
8713 }, {
8714 .eraseblocks = { {4 * 1024, 16} },
8715 .block_erase = spi_block_erase_d7,
8716 }, {
8717 .eraseblocks = { {32 * 1024, 2} },
8718 .block_erase = spi_block_erase_d8,
8719 }, {
8720 .eraseblocks = { {64 * 1024, 1} },
8721 .block_erase = spi_block_erase_60,
8722 }, {
8723 .eraseblocks = { {64 * 1024, 1} },
8724 .block_erase = spi_block_erase_c7,
8725 }
8726 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008727 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00008728 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8729 .write = spi_chip_write_256,
8730 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8731 .voltage = {2300, 3600},
8732 },
8733
8734 {
8735 .vendor = "PMC",
8736 .name = "Pm25LD010(C)",
8737 .bustype = BUS_SPI,
8738 .manufacture_id = PMC_ID,
8739 .model_id = PMC_PM25LD010,
8740 .total_size = 128,
8741 .page_size = 256,
8742 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008743 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +00008744 .probe = probe_spi_rdid,
8745 .probe_timing = TIMING_ZERO,
8746 .block_erasers =
8747 {
8748 {
8749 .eraseblocks = { {4 * 1024, 32} },
8750 .block_erase = spi_block_erase_20,
8751 }, {
8752 .eraseblocks = { {4 * 1024, 32} },
8753 .block_erase = spi_block_erase_d7,
8754 }, {
8755 .eraseblocks = { {32 * 1024, 4} },
8756 .block_erase = spi_block_erase_d8,
8757 }, {
8758 .eraseblocks = { {128 * 1024, 1} },
8759 .block_erase = spi_block_erase_60,
8760 }, {
8761 .eraseblocks = { {128 * 1024, 1} },
8762 .block_erase = spi_block_erase_c7,
8763 }
8764 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008765 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00008766 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8767 .write = spi_chip_write_256,
8768 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8769 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
8770 },
8771
8772 {
8773 .vendor = "PMC",
8774 .name = "Pm25LD020(C)",
8775 .bustype = BUS_SPI,
8776 .manufacture_id = PMC_ID,
8777 .model_id = PMC_PM25LD020,
8778 .total_size = 256,
8779 .page_size = 256,
8780 .feature_bits = FEATURE_WRSR_WREN,
8781 .tested = TEST_UNTESTED,
8782 .probe = probe_spi_rdid,
8783 .probe_timing = TIMING_ZERO,
8784 .block_erasers =
8785 {
8786 {
8787 .eraseblocks = { {4 * 1024, 64} },
8788 .block_erase = spi_block_erase_20,
8789 }, {
8790 .eraseblocks = { {4 * 1024, 64} },
8791 .block_erase = spi_block_erase_d7,
8792 }, {
8793 .eraseblocks = { {64 * 1024, 4} },
8794 .block_erase = spi_block_erase_d8,
8795 }, {
8796 .eraseblocks = { {256 * 1024, 1} },
8797 .block_erase = spi_block_erase_60,
8798 }, {
8799 .eraseblocks = { {256 * 1024, 1} },
8800 .block_erase = spi_block_erase_c7,
8801 }
8802 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008803 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00008804 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8805 .write = spi_chip_write_256,
8806 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8807 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
8808 },
8809
8810 {
8811 .vendor = "PMC",
8812 .name = "Pm25LD040(C)",
8813 .bustype = BUS_SPI,
8814 .manufacture_id = PMC_ID,
8815 .model_id = PMC_PM25LV040,
8816 .total_size = 512,
8817 .page_size = 256,
8818 .feature_bits = FEATURE_WRSR_WREN,
8819 .tested = TEST_UNTESTED,
8820 .probe = probe_spi_rdid,
8821 .probe_timing = TIMING_ZERO,
8822 .block_erasers =
8823 {
8824 {
8825 .eraseblocks = { {4 * 1024, 128} },
8826 .block_erase = spi_block_erase_20,
8827 }, {
8828 .eraseblocks = { {4 * 1024, 128} },
8829 .block_erase = spi_block_erase_d7,
8830 }, {
8831 .eraseblocks = { {64 * 1024, 8} },
8832 .block_erase = spi_block_erase_d8,
8833 }, {
8834 .eraseblocks = { {512 * 1024, 1} },
8835 .block_erase = spi_block_erase_60,
8836 }, {
8837 .eraseblocks = { {512 * 1024, 1} },
8838 .block_erase = spi_block_erase_c7,
8839 }
8840 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008841 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00008842 .unlock = spi_disable_blockprotect,
8843 .write = spi_chip_write_256,
8844 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8845 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
8846 },
8847
8848{
8849 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008850 .name = "Pm25LV512(A)",
8851 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00008852 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008853 .model_id = PMC_PM25LV512,
8854 .total_size = 64,
8855 .page_size = 256,
8856 .feature_bits = FEATURE_WRSR_WREN,
8857 .tested = TEST_UNTESTED,
Stefan Taunerbecda742014-05-30 19:34:00 +00008858 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008859 .probe_timing = TIMING_ZERO,
8860 .block_erasers =
8861 {
8862 {
8863 .eraseblocks = { {4 * 1024, 16} },
8864 .block_erase = spi_block_erase_d7,
8865 }, {
8866 .eraseblocks = { {32 * 1024, 2} },
8867 .block_erase = spi_block_erase_d8,
8868 }, {
8869 .eraseblocks = { {64 * 1024, 1} },
8870 .block_erase = spi_block_erase_c7,
8871 }
8872 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008873 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008874 .unlock = spi_disable_blockprotect,
8875 .write = spi_chip_write_256,
8876 .read = spi_chip_read, /* Fast read (0x0B) supported */
8877 .voltage = {2700, 3600},
8878 },
8879
8880 {
8881 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008882 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008883 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00008884 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008885 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008886 .total_size = 128,
8887 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008888 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +00008889 .tested = TEST_OK_PREW,
8890 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008891 .probe_timing = TIMING_ZERO,
8892 .block_erasers =
8893 {
8894 {
8895 .eraseblocks = { {4 * 1024, 32} },
8896 .block_erase = spi_block_erase_d7,
8897 }, {
8898 .eraseblocks = { {32 * 1024, 4} },
8899 .block_erase = spi_block_erase_d8,
8900 }, {
8901 .eraseblocks = { {128 * 1024, 1} },
8902 .block_erase = spi_block_erase_c7,
8903 }
8904 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008905 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008906 .unlock = spi_disable_blockprotect,
8907 .write = spi_chip_write_256,
8908 .read = spi_chip_read, /* Fast read (0x0B) supported */
8909 .voltage = {2700, 3600},
8910 },
8911
8912 {
8913 .vendor = "PMC",
8914 .name = "Pm25LV010A",
8915 .bustype = BUS_SPI,
8916 .manufacture_id = PMC_ID,
8917 .model_id = PMC_PM25LV010,
8918 .total_size = 128,
8919 .page_size = 256,
8920 .feature_bits = FEATURE_WRSR_WREN,
8921 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008922 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008923 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008924 .block_erasers =
8925 {
8926 {
8927 .eraseblocks = { {4 * 1024, 32} },
8928 .block_erase = spi_block_erase_d7,
8929 }, {
8930 .eraseblocks = { {32 * 1024, 4} },
8931 .block_erase = spi_block_erase_d8,
8932 }, {
8933 .eraseblocks = { {128 * 1024, 1} },
8934 .block_erase = spi_block_erase_c7,
8935 }
8936 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008937 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008938 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008939 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008940 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008941 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008942 },
8943
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008944 {
8945 .vendor = "PMC",
8946 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008947 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008948 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008949 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008950 .total_size = 256,
8951 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008952 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008953 .tested = TEST_UNTESTED,
8954 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008955 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008956 .block_erasers =
8957 {
8958 {
8959 .eraseblocks = { {4 * 1024, 64} },
8960 .block_erase = spi_block_erase_d7,
8961 }, {
8962 .eraseblocks = { {64 * 1024, 4} },
8963 .block_erase = spi_block_erase_d8,
8964 }, {
8965 .eraseblocks = { {256 * 1024, 1} },
8966 .block_erase = spi_block_erase_c7,
8967 }
8968 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008969 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008970 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008971 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008972 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008973 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008974 },
8975
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008976 {
8977 .vendor = "PMC",
8978 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008979 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008980 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008981 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008982 .total_size = 512,
8983 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008984 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00008985 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008986 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008987 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008988 .block_erasers =
8989 {
8990 {
8991 .eraseblocks = { {4 * 1024, 128} },
8992 .block_erase = spi_block_erase_d7,
8993 }, {
8994 .eraseblocks = { {64 * 1024, 8} },
8995 .block_erase = spi_block_erase_d8,
8996 }, {
8997 .eraseblocks = { {512 * 1024, 1} },
8998 .block_erase = spi_block_erase_c7,
8999 }
9000 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009001 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009002 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009003 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009004 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009005 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009006 },
9007
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009008 {
9009 .vendor = "PMC",
9010 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009011 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009012 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009013 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009014 .total_size = 1024,
9015 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009016 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009017 .tested = TEST_UNTESTED,
9018 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009019 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009020 .block_erasers =
9021 {
9022 {
9023 .eraseblocks = { {4 * 1024, 256} },
9024 .block_erase = spi_block_erase_d7,
9025 }, {
9026 .eraseblocks = { {4 * 1024, 256} },
9027 .block_erase = spi_block_erase_20,
9028 }, {
9029 .eraseblocks = { {64 * 1024, 16} },
9030 .block_erase = spi_block_erase_d8,
9031 }, {
9032 .eraseblocks = { {1024 * 1024, 1} },
9033 .block_erase = spi_block_erase_60,
9034 }, {
9035 .eraseblocks = { {1024 * 1024, 1} },
9036 .block_erase = spi_block_erase_c7,
9037 }
9038 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009039 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009040 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009041 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009042 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009043 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009044 },
9045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009046 {
9047 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009048 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009049 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009050 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009051 .model_id = PMC_PM25LV016B,
9052 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009053 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009054 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009055 .tested = TEST_UNTESTED,
9056 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009057 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009058 .block_erasers =
9059 {
9060 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009061 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00009062 .block_erase = spi_block_erase_d7,
9063 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009064 .eraseblocks = { {4 * 1024, 512} },
9065 .block_erase = spi_block_erase_20,
9066 }, {
9067 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00009068 .block_erase = spi_block_erase_d8,
9069 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009070 .eraseblocks = { {2 * 1024 * 1024, 1} },
9071 .block_erase = spi_block_erase_60,
9072 }, {
9073 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00009074 .block_erase = spi_block_erase_c7,
9075 }
9076 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009077 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009078 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009079 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009080 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00009081 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009082 },
9083
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009084 {
9085 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009086 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009087 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009088 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009089 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009090 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009091 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009092 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009093 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009094 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009095 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009096 .block_erasers =
9097 {
9098 {
9099 .eraseblocks = {
9100 {128 * 1024, 1},
9101 {96 * 1024, 1},
9102 {8 * 1024, 2},
9103 {16 * 1024, 1},
9104 },
Sean Nelson35727f72010-01-28 23:55:12 +00009105 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009106 }, {
9107 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009108 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009109 },
9110 },
Sean Nelson35727f72010-01-28 23:55:12 +00009111 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009112 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009113 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009114 },
9115
9116 {
9117 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009118 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009119 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009120 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009121 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009122 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009123 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009124 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009125 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009126 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009127 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009128 .block_erasers =
9129 {
9130 {
9131 .eraseblocks = {
9132 {16 * 1024, 1},
9133 {8 * 1024, 2},
9134 {96 * 1024, 1},
9135 {128 * 1024, 1},
9136 },
Sean Nelson35727f72010-01-28 23:55:12 +00009137 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009138 }, {
9139 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009140 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009141 },
9142 },
Sean Nelson35727f72010-01-28 23:55:12 +00009143 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009144 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009145 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009146 },
9147
9148 {
9149 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009150 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009151 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009152 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009153 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009154 .total_size = 128,
9155 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009156 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009157 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009158 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009159 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00009160 .block_erasers =
9161 {
9162 {
9163 .eraseblocks = { {4 * 1024, 32} },
9164 .block_erase = erase_sector_jedec,
9165 }, {
9166 .eraseblocks = { {64 * 1024, 2} },
9167 .block_erase = erase_block_jedec,
9168 }, {
9169 .eraseblocks = { {128 * 1024, 1} },
9170 .block_erase = erase_chip_block_jedec,
9171 }
9172 },
Sean Nelson35727f72010-01-28 23:55:12 +00009173 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009175 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009176 },
9177
9178 {
9179 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009180 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009181 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009182 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009183 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009184 .total_size = 256,
9185 .page_size = 4096,
9186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
9187 .tested = TEST_UNTESTED,
9188 .probe = probe_jedec,
9189 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9190 .block_erasers =
9191 {
9192 {
9193 .eraseblocks = { {4 * 1024, 64} },
9194 .block_erase = erase_sector_jedec,
9195 }, {
9196 .eraseblocks = { {64 * 1024, 4} },
9197 .block_erase = erase_block_jedec,
9198 }, {
9199 .eraseblocks = { {256 * 1024, 1} },
9200 .block_erase = erase_chip_block_jedec,
9201 }
9202 },
9203 .write = write_jedec_1,
9204 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009205 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009206 },
9207
9208 {
9209 .vendor = "PMC",
9210 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009211 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009212 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009213 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009214 .total_size = 512,
9215 .page_size = 4096,
9216 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009217 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009218 .probe = probe_jedec,
9219 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9220 .block_erasers =
9221 {
9222 {
9223 .eraseblocks = { {4 * 1024, 128} },
9224 .block_erase = erase_sector_jedec,
9225 }, {
9226 .eraseblocks = { {64 * 1024, 8} },
9227 .block_erase = erase_block_jedec,
9228 }, {
9229 .eraseblocks = { {512 * 1024, 1} },
9230 .block_erase = erase_chip_block_jedec,
9231 }
9232 },
9233 .write = write_jedec_1,
9234 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009235 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009236 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +00009237
9238 {
9239 .vendor = "PMC",
9240 .name = "Pm39LV512",
9241 .bustype = BUS_PARALLEL,
9242 .manufacture_id = PMC_ID_NOPREFIX,
9243 .model_id = PMC_PM39LV512,
9244 .total_size = 64,
9245 .page_size = 4096,
9246 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
9247 .tested = TEST_OK_PREW,
9248 .probe = probe_jedec,
9249 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9250 .block_erasers =
9251 {
9252 {
9253 .eraseblocks = { {4 * 1024, 16} },
9254 .block_erase = erase_sector_jedec,
9255 }, {
9256 .eraseblocks = { {64 * 1024, 1} },
9257 .block_erase = erase_block_jedec,
9258 }, {
9259 .eraseblocks = { {64 * 1024, 1} },
9260 .block_erase = erase_chip_block_jedec,
9261 }
9262 },
9263 .write = write_jedec_1,
9264 .read = read_memmapped,
9265 .voltage = {2700, 3600},
9266 },
9267
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009268 {
9269 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009270 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009271 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009272 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009273 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009274 .total_size = 256,
9275 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009276 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009277 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00009278 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009279 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00009280 .block_erasers =
9281 {
9282 {
9283 .eraseblocks = { {4 * 1024, 64} },
9284 .block_erase = erase_sector_jedec,
9285 }, {
9286 .eraseblocks = { {16 * 1024, 16} },
9287 .block_erase = erase_block_jedec,
9288 }, {
9289 .eraseblocks = { {256 * 1024, 1} },
9290 .block_erase = erase_chip_block_jedec,
9291 }
9292 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009293 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +00009294 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009295 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009296 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009297 },
9298
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009299 {
9300 .vendor = "PMC",
9301 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009302 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009303 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009304 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009305 .total_size = 512,
9306 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009307 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009308 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00009309 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009310 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00009311 .block_erasers =
9312 {
9313 {
9314 .eraseblocks = { {4 * 1024, 128} },
9315 .block_erase = erase_sector_jedec,
9316 }, {
9317 .eraseblocks = { {64 * 1024, 8} },
9318 .block_erase = erase_block_jedec,
9319 }, {
9320 .eraseblocks = { {512 * 1024, 1} },
9321 .block_erase = erase_chip_block_jedec,
9322 }
9323 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009324 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +00009325 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009326 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009327 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009328 },
9329
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009330 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00009331 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +00009332 .name = "LE25FW106",
9333 .bustype = BUS_SPI,
9334 .manufacture_id = SANYO_ID,
9335 .model_id = SANYO_LE25FW106,
9336 .total_size = 128,
9337 .page_size = 256,
9338 .feature_bits = FEATURE_WRSR_WREN,
9339 .tested = TEST_OK_PREW,
9340 .probe = probe_spi_res2,
9341 .probe_timing = TIMING_ZERO,
9342 .block_erasers = {
9343 {
9344 .eraseblocks = { {2 * 1024, 64} },
9345 .block_erase = spi_block_erase_d7,
9346 }, {
9347 .eraseblocks = { {32 * 1024, 4} },
9348 .block_erase = spi_block_erase_d8,
9349 }, {
9350 .eraseblocks = { {128 * 1024, 1} },
9351 .block_erase = spi_block_erase_c7,
9352 }
9353 },
9354 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
9355 .unlock = spi_disable_blockprotect_bp1_srwd,
9356 .write = spi_chip_write_256,
9357 .read = spi_chip_read,
9358 .voltage = {2700, 3600},
9359 },
9360
9361 {
9362 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +00009363 .name = "LE25FW406A",
9364 .bustype = BUS_SPI,
9365 .manufacture_id = SANYO_ID,
9366 .model_id = SANYO_LE25FW406A,
9367 .total_size = 512,
9368 .page_size = 256,
9369 .feature_bits = FEATURE_WRSR_WREN,
9370 .tested = TEST_OK_PREW,
9371 .probe = probe_spi_res2,
9372 .probe_timing = TIMING_ZERO,
9373 .block_erasers = {
9374 {
9375 .eraseblocks = { {4 * 1024, 128} },
9376 .block_erase = spi_block_erase_d7,
9377 }, {
9378 .eraseblocks = { {64 * 1024, 8} },
9379 .block_erase = spi_block_erase_d8,
9380 }, {
9381 .eraseblocks = { {512 * 1024, 1} },
9382 .block_erase = spi_block_erase_c7,
9383 }
9384 },
9385 .printlock = spi_prettyprint_status_register_plain,
9386 .unlock = spi_disable_blockprotect,
9387 .write = spi_chip_write_256,
9388 .read = spi_chip_read,
9389 .voltage = {2700, 3600},
9390 },
9391
9392 {
9393 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +00009394 .name = "LE25FU406B",
9395 .bustype = BUS_SPI,
9396 .manufacture_id = SANYO_ID,
9397 .model_id = SANYO_LE25FU406B,
9398 .total_size = 512,
9399 .page_size = 256,
9400 .feature_bits = FEATURE_WRSR_WREN,
9401 .tested = TEST_OK_PREW,
9402 .probe = probe_spi_res2,
9403 .probe_timing = TIMING_ZERO,
9404 .block_erasers = {
9405 {
9406 .eraseblocks = { {4 * 1024, 128} },
9407 .block_erase = spi_block_erase_d7,
9408 }, {
9409 .eraseblocks = { {64 * 1024, 8} },
9410 .block_erase = spi_block_erase_d8,
9411 }, {
9412 .eraseblocks = { {512 * 1024, 1} },
9413 .block_erase = spi_block_erase_c7,
9414 }
9415 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009416 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +00009417 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9418 .write = spi_chip_write_256,
9419 .read = spi_chip_read,
9420 .voltage = {2300, 3600},
9421 },
9422
9423 {
9424 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009425 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009426 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +00009427 .manufacture_id = SANYO_ID,
9428 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009429 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +00009430 .page_size = 256,
9431 .tested = TEST_UNTESTED,
9432 .probe = probe_spi_rdid,
9433 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009434 .block_erasers =
9435 {
9436 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009437 .eraseblocks = { {256, 1024} },
9438 .block_erase = spi_block_erase_db,
9439 }, {
9440 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +00009441 .block_erase = spi_block_erase_d8,
9442 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009443 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00009444 .block_erase = spi_block_erase_c7,
9445 }
9446 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009447 .printlock = spi_prettyprint_status_register_default_welwip,
9448 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +00009449 .write = spi_chip_write_256,
9450 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009451 .voltage = {2700, 3600},
9452 },
9453
9454 {
9455 .vendor = "Sanyo",
9456 .name = "LE25FW403A",
9457 .bustype = BUS_SPI,
9458 .manufacture_id = SANYO_ID,
9459 .model_id = SANYO_LE25FW403A,
9460 .total_size = 512,
9461 .page_size = 256,
9462 .tested = TEST_UNTESTED,
9463 .probe = probe_spi_rdid,
9464 .probe_timing = TIMING_ZERO,
9465 .block_erasers = {
9466 {
9467 .eraseblocks = { {256, 2 * 1024} },
9468 .block_erase = spi_block_erase_db,
9469 }, {
9470 .eraseblocks = { {64 * 1024, 8} },
9471 .block_erase = spi_block_erase_d8,
9472 }, {
9473 .eraseblocks = { {512 * 1024, 1} },
9474 .block_erase = spi_block_erase_c7,
9475 }
9476 },
9477 .printlock = spi_prettyprint_status_register_default_welwip,
9478 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9479 .write = spi_chip_write_256,
9480 .read = spi_chip_read,
9481 .voltage = {2700, 3600},
9482 },
9483
9484 {
9485 .vendor = "Sanyo",
9486 .name = "LE25FW418A",
9487 .bustype = BUS_SPI,
9488 .manufacture_id = SANYO_ID,
9489 .model_id = SANYO_LE25FW418A,
9490 .total_size = 512,
9491 .page_size = 256,
9492 .feature_bits = FEATURE_WRSR_WREN,
9493 .tested = TEST_UNTESTED,
9494 .probe = probe_spi_res2,
9495 .probe_timing = TIMING_ZERO,
9496 .block_erasers = {
9497 {
9498 .eraseblocks = { {4 * 1024, 128} },
9499 .block_erase = spi_block_erase_d7,
9500 }, {
9501 .eraseblocks = { {64 * 1024, 8} },
9502 .block_erase = spi_block_erase_d8,
9503 }, {
9504 .eraseblocks = { {512 * 1024, 1} },
9505 .block_erase = spi_block_erase_c7,
9506 }
9507 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009508 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009509 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9510 .write = spi_chip_write_256,
9511 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
9512 .voltage = {2700, 3600},
9513 },
9514
9515 {
9516 .vendor = "Sanyo",
9517 .name = "LE25FW806",
9518 .bustype = BUS_SPI,
9519 .manufacture_id = SANYO_ID,
9520 .model_id = SANYO_LE25FW806,
9521 .total_size = 1024,
9522 .page_size = 256,
9523 .feature_bits = FEATURE_WRSR_WREN,
9524 .tested = TEST_UNTESTED,
9525 .probe = probe_spi_res2,
9526 .probe_timing = TIMING_ZERO,
9527 .block_erasers = {
9528 {
9529 .eraseblocks = { {4 * 1024, 256} },
9530 .block_erase = spi_block_erase_20,
9531 }, {
9532 .eraseblocks = { {4 * 1024, 256} },
9533 .block_erase = spi_block_erase_d7,
9534 }, {
9535 .eraseblocks = { {64 * 1024, 16} },
9536 .block_erase = spi_block_erase_d8,
9537 }, {
9538 .eraseblocks = { {1024 * 1024, 1} },
9539 .block_erase = spi_block_erase_c7,
9540 }
9541 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009542 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009543 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9544 .write = spi_chip_write_256,
9545 .read = spi_chip_read,
9546 .voltage = {2700, 3600},
9547 },
9548
9549 {
9550 .vendor = "Sanyo",
9551 .name = "LE25FW808",
9552 .bustype = BUS_SPI,
9553 .manufacture_id = SANYO_ID,
9554 .model_id = SANYO_LE25FW808,
9555 .total_size = 1024,
9556 .page_size = 256,
9557 .feature_bits = FEATURE_WRSR_WREN,
9558 .tested = TEST_UNTESTED,
9559 .probe = probe_spi_res2,
9560 .probe_timing = TIMING_ZERO,
9561 .block_erasers = {
9562 {
9563 .eraseblocks = { {8 * 1024, 128} },
9564 .block_erase = spi_block_erase_d7,
9565 }, {
9566 .eraseblocks = { {64 * 1024, 16} },
9567 .block_erase = spi_block_erase_d8,
9568 }, {
9569 .eraseblocks = { {1024 * 1024, 1} },
9570 .block_erase = spi_block_erase_c7,
9571 }
9572 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009573 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009574 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9575 .write = spi_chip_write_256,
9576 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
9577 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +00009578 },
9579
9580 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009581 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +00009582 .name = "LH28F008BJT-BTLZ1",
9583 .bustype = BUS_PARALLEL,
9584 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +00009585 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +00009586 .total_size = 1024,
9587 .page_size = 64 * 1024,
9588 .tested = TEST_OK_PREW,
9589 .probe = probe_82802ab,
9590 .probe_timing = TIMING_ZERO,
9591 .block_erasers =
9592 {
9593 {
9594 .eraseblocks = {
9595 {8 * 1024, 8},
9596 {64 * 1024, 15}
9597 },
9598 .block_erase = erase_block_82802ab,
9599 }, {
9600 .eraseblocks = { {1024 * 1024, 1} },
9601 .block_erase = erase_sector_49lfxxxc,
9602 }
9603 },
9604 .unlock = unlock_lh28f008bjt,
9605 .write = write_82802ab,
9606 .read = read_memmapped,
9607 .voltage = {2700, 3600},
9608 },
9609
9610 {
9611 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009612 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009613 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009614 .manufacture_id = SHARP_ID,
9615 .model_id = SHARP_LHF00L04,
9616 .total_size = 1024,
9617 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009618 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009619 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009620 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009621 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009622 .block_erasers =
9623 {
9624 {
9625 .eraseblocks = {
9626 {64 * 1024, 15},
9627 {8 * 1024, 8}
9628 },
Sean Nelson28accc22010-03-19 18:47:06 +00009629 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009630 }, {
9631 .eraseblocks = {
9632 {1024 * 1024, 1}
9633 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00009634 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00009635 },
9636 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009637 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +00009638 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009639 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009640 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009641 },
9642
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009643 {
9644 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +00009645 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009646 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009647 .manufacture_id = SPANSION_ID,
9648 .model_id = SPANSION_S25FL004A,
9649 .total_size = 512,
9650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009651 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009652 .tested = TEST_UNTESTED,
9653 .probe = probe_spi_rdid,
9654 .probe_timing = TIMING_ZERO,
9655 .block_erasers =
9656 {
9657 {
9658 .eraseblocks = { {64 * 1024, 8} },
9659 .block_erase = spi_block_erase_d8,
9660 }, {
9661 .eraseblocks = { {512 * 1024, 1} },
9662 .block_erase = spi_block_erase_c7,
9663 }
9664 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009665 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009666 .unlock = spi_disable_blockprotect,
9667 .write = spi_chip_write_256,
9668 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009669 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009670 },
9671
9672 {
9673 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00009674 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009675 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +00009676 .manufacture_id = SPANSION_ID,
9677 .model_id = SPANSION_S25FL008A,
9678 .total_size = 1024,
9679 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009680 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009681 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +00009682 .probe = probe_spi_rdid,
9683 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00009684 .block_erasers =
9685 {
9686 {
9687 .eraseblocks = { {64 * 1024, 16} },
9688 .block_erase = spi_block_erase_d8,
9689 }, {
9690 .eraseblocks = { {1024 * 1024, 1} },
9691 .block_erase = spi_block_erase_c7,
9692 }
9693 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009694 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009695 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00009696 .write = spi_chip_write_256,
9697 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009698 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +00009699 },
9700
9701 {
9702 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009703 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009704 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009705 .manufacture_id = SPANSION_ID,
9706 .model_id = SPANSION_S25FL016A,
9707 .total_size = 2048,
9708 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009709 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009710 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009711 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009712 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009713 .block_erasers =
9714 {
9715 {
9716 .eraseblocks = { {64 * 1024, 32} },
9717 .block_erase = spi_block_erase_d8,
9718 }, {
9719 .eraseblocks = { {2 * 1024 * 1024, 1} },
9720 .block_erase = spi_block_erase_c7,
9721 }
9722 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009723 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009724 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009725 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009726 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009727 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009728 },
9729
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009730 {
Rudy Hostf4e57772010-11-29 00:37:49 +00009731 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009732 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009733 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009734 .manufacture_id = SPANSION_ID,
9735 .model_id = SPANSION_S25FL032A,
9736 .total_size = 4096,
9737 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009738 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009739 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +00009740 .probe = probe_spi_rdid,
9741 .probe_timing = TIMING_ZERO,
9742 .block_erasers =
9743 {
9744 {
9745 .eraseblocks = { {64 * 1024, 64} },
9746 .block_erase = spi_block_erase_d8,
9747 }, {
9748 .eraseblocks = { {4 * 1024 * 1024, 1} },
9749 .block_erase = spi_block_erase_c7,
9750 }
9751 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009752 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009753 .unlock = spi_disable_blockprotect,
9754 .write = spi_chip_write_256,
9755 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009756 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009757 },
9758
9759 {
9760 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009761 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009762 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009763 .manufacture_id = SPANSION_ID,
9764 .model_id = SPANSION_S25FL064A,
9765 .total_size = 8192,
9766 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009767 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009768 .tested = TEST_OK_PREW,
9769 .probe = probe_spi_rdid,
9770 .probe_timing = TIMING_ZERO,
9771 .block_erasers =
9772 {
9773 {
9774 .eraseblocks = { {64 * 1024, 128} },
9775 .block_erase = spi_block_erase_d8,
9776 }, {
9777 .eraseblocks = { {8 * 1024 * 1024, 1} },
9778 .block_erase = spi_block_erase_c7,
9779 }
9780 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009781 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009782 .unlock = spi_disable_blockprotect,
9783 .write = spi_chip_write_256,
9784 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009785 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009786 },
9787
9788 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009789 .vendor = "Spansion",
9790 .name = "S25FL204K",
9791 .bustype = BUS_SPI,
9792 .manufacture_id = SPANSION_ID,
9793 .model_id = SPANSION_S25FL204,
9794 .total_size = 512,
9795 .page_size = 256,
9796 .feature_bits = FEATURE_WRSR_WREN,
9797 .tested = TEST_UNTESTED,
9798 .probe = probe_spi_rdid,
9799 .probe_timing = TIMING_ZERO,
9800 .block_erasers = {
9801 {
9802 .eraseblocks = { {4 * 1024, 128} },
9803 .block_erase = spi_block_erase_20,
9804 }, {
9805 .eraseblocks = { {64 * 1024, 8} },
9806 .block_erase = spi_block_erase_d8,
9807 }, {
9808 .eraseblocks = { { 512 * 1024, 1} },
9809 .block_erase = spi_block_erase_60,
9810 }, {
9811 .eraseblocks = { { 512 * 1024, 1} },
9812 .block_erase = spi_block_erase_c7,
9813 }
9814 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009815 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009816 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9817 .write = spi_chip_write_256,
9818 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9819 .voltage = {2700, 3600},
9820 },
9821
9822 {
9823 .vendor = "Spansion",
9824 .name = "S25FL208K",
9825 .bustype = BUS_SPI,
9826 .manufacture_id = SPANSION_ID,
9827 .model_id = SPANSION_S25FL208,
9828 .total_size = 1024,
9829 .page_size = 256,
9830 .feature_bits = FEATURE_WRSR_WREN,
9831 .tested = TEST_UNTESTED,
9832 .probe = probe_spi_rdid,
9833 .probe_timing = TIMING_ZERO,
9834 .block_erasers = {
9835 {
9836 .eraseblocks = { {4 * 1024, 256} },
9837 .block_erase = spi_block_erase_20,
9838 }, {
9839 .eraseblocks = { {64 * 1024, 16} },
9840 .block_erase = spi_block_erase_d8,
9841 }, {
9842 .eraseblocks = { { 1024 * 1024, 1} },
9843 .block_erase = spi_block_erase_60,
9844 }, {
9845 .eraseblocks = { { 1024 * 1024, 1} },
9846 .block_erase = spi_block_erase_c7,
9847 }
9848 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009849 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009850 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9851 .write = spi_chip_write_256,
9852 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9853 .voltage = {2700, 3600},
9854 },
9855
9856 {
9857 .vendor = "Spansion",
9858 .name = "S25FL116K/S25FL216K",
9859 .bustype = BUS_SPI,
9860 .manufacture_id = SPANSION_ID,
9861 .model_id = SPANSION_S25FL216,
9862 .total_size = 2048,
9863 .page_size = 256,
9864 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
9865 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9866 .tested = TEST_UNTESTED,
9867 .probe = probe_spi_rdid,
9868 .probe_timing = TIMING_ZERO,
9869 .block_erasers = {
9870 {
9871 .eraseblocks = { {4 * 1024, 512} },
9872 .block_erase = spi_block_erase_20,
9873 }, {
9874 .eraseblocks = { {64 * 1024, 32} },
9875 .block_erase = spi_block_erase_d8,
9876 }, {
9877 .eraseblocks = { { 2048 * 1024, 1} },
9878 .block_erase = spi_block_erase_60,
9879 }, {
9880 .eraseblocks = { { 2048 * 1024, 1} },
9881 .block_erase = spi_block_erase_c7,
9882 }
9883 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009884 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009885 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9886 .write = spi_chip_write_256,
9887 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9888 .voltage = {2700, 3600},
9889 },
9890
9891 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00009892 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +00009893 .name = "S25FL132K",
9894 .bustype = BUS_SPI,
9895 .manufacture_id = SPANSION_ID,
9896 .model_id = SPANSION_S25FL132K,
9897 .total_size = 4096,
9898 .page_size = 256,
9899 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
9900 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9901 .tested = TEST_UNTESTED,
9902 .probe = probe_spi_rdid,
9903 .probe_timing = TIMING_ZERO,
9904 .block_erasers = {
9905 {
9906 .eraseblocks = { {4 * 1024, 1024} },
9907 .block_erase = spi_block_erase_20,
9908 }, {
9909 .eraseblocks = { {64 * 1024, 64} },
9910 .block_erase = spi_block_erase_d8,
9911 }, {
9912 .eraseblocks = { { 4096 * 1024, 1} },
9913 .block_erase = spi_block_erase_60,
9914 }, {
9915 .eraseblocks = { { 4096 * 1024, 1} },
9916 .block_erase = spi_block_erase_c7,
9917 }
9918 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009919 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +00009920 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
9921 .write = spi_chip_write_256,
9922 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9923 .voltage = {2700, 3600},
9924 },
9925
9926 {
9927 .vendor = "Spansion",
9928 .name = "S25FL164K",
9929 .bustype = BUS_SPI,
9930 .manufacture_id = SPANSION_ID,
9931 .model_id = SPANSION_S25FL164K,
9932 .total_size = 8192,
9933 .page_size = 256,
9934 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
9935 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9936 .tested = TEST_OK_PREW,
9937 .probe = probe_spi_rdid,
9938 .probe_timing = TIMING_ZERO,
9939 .block_erasers = {
9940 {
9941 .eraseblocks = { {4 * 1024, 2048} },
9942 .block_erase = spi_block_erase_20,
9943 }, {
9944 .eraseblocks = { {64 * 1024, 128} },
9945 .block_erase = spi_block_erase_d8,
9946 }, {
9947 .eraseblocks = { { 8192 * 1024, 1} },
9948 .block_erase = spi_block_erase_60,
9949 }, {
9950 .eraseblocks = { { 8192 * 1024, 1} },
9951 .block_erase = spi_block_erase_c7,
9952 }
9953 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009954 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +00009955 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
9956 .write = spi_chip_write_256,
9957 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9958 .voltage = {2700, 3600},
9959 },
9960
9961 {
9962 .vendor = "Spansion",
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00009963 .name = "S25FL128S......0", /* uniform 256kB sectors */
9964 .bustype = BUS_SPI,
9965 .manufacture_id = SPANSION_ID,
9966 .model_id = SPANSION_S25FL128,
9967 .total_size = 16384,
9968 .page_size = 256,
9969 /* supports 4B addressing */
9970 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
9971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9972 .tested = TEST_UNTESTED,
9973 .probe = probe_spi_rdid,
9974 .probe_timing = TIMING_ZERO,
9975 .block_erasers = {
9976 {
9977 .eraseblocks = { {4 * 1024, 4096} },
9978 .block_erase = spi_block_erase_20,
9979 }, {
9980 .eraseblocks = { {256 * 1024, 64} },
9981 .block_erase = spi_block_erase_d8,
9982 }, {
9983 .eraseblocks = { { 16384 * 1024, 1} },
9984 .block_erase = spi_block_erase_60,
9985 }, {
9986 .eraseblocks = { { 16384 * 1024, 1} },
9987 .block_erase = spi_block_erase_c7,
9988 }
9989 },
9990 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
9991 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
9992 .write = spi_chip_write_256, /* Multi I/O supported */
9993 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9994 .voltage = {2700, 3600},
9995 },
9996
9997 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009998 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +00009999 .name = "SST25LF020A",
10000 .bustype = BUS_SPI,
10001 .manufacture_id = SST_ID,
10002 .model_id = SST_SST25VF020_REMS,
10003 .total_size = 256,
10004 .page_size = 256,
10005 .feature_bits = FEATURE_WRSR_EWSR,
10006 .tested = TEST_OK_PREW,
10007 .probe = probe_spi_rems,
10008 .probe_timing = TIMING_ZERO,
10009 .block_erasers =
10010 {
10011 {
10012 .eraseblocks = { {4 * 1024, 64} },
10013 .block_erase = spi_block_erase_20,
10014 }, {
10015 .eraseblocks = { {32 * 1024, 8} },
10016 .block_erase = spi_block_erase_52,
10017 }, {
10018 .eraseblocks = { {256 * 1024, 1} },
10019 .block_erase = spi_block_erase_60,
10020 },
10021 },
10022 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10023 .unlock = spi_disable_blockprotect,
10024 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10025 .read = spi_chip_read, /* Fast read (0x0B) supported */
10026 .voltage = {2700, 3600},
10027 },
10028
10029 {
10030 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000010031 .name = "SST25LF040A",
10032 .bustype = BUS_SPI,
10033 .manufacture_id = SST_ID,
10034 .model_id = SST_SST25VF040_REMS,
10035 .total_size = 512,
10036 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010037 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000010038 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000010039 .probe = probe_spi_res2,
10040 .probe_timing = TIMING_ZERO,
10041 .block_erasers =
10042 {
10043 {
10044 .eraseblocks = { {4 * 1024, 128} },
10045 .block_erase = spi_block_erase_20,
10046 }, {
10047 .eraseblocks = { {32 * 1024, 16} },
10048 .block_erase = spi_block_erase_52,
10049 }, {
10050 .eraseblocks = { {512 * 1024, 1} },
10051 .block_erase = spi_block_erase_60,
10052 },
10053 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010054 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000010055 .unlock = spi_disable_blockprotect,
10056 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10057 .read = spi_chip_read,
10058 .voltage = {3000, 3600},
10059 },
10060
10061 {
10062 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010063 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000010064 .bustype = BUS_SPI,
10065 .manufacture_id = SST_ID,
10066 .model_id = SST_SST25VF080_REMS,
10067 .total_size = 1024,
10068 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010069 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000010070 .tested = TEST_UNTESTED,
10071 .probe = probe_spi_res2,
10072 .probe_timing = TIMING_ZERO,
10073 .block_erasers =
10074 {
10075 {
10076 .eraseblocks = { {4 * 1024, 256} },
10077 .block_erase = spi_block_erase_20,
10078 }, {
10079 .eraseblocks = { {32 * 1024, 32} },
10080 .block_erase = spi_block_erase_52,
10081 }, {
10082 .eraseblocks = { {1024 * 1024, 1} },
10083 .block_erase = spi_block_erase_60,
10084 },
10085 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010086 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000010087 .unlock = spi_disable_blockprotect,
10088 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10089 .read = spi_chip_read,
10090 .voltage = {3000, 3600},
10091 },
10092
10093 {
10094 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000010095 .name = "SST25VF512A",
10096 .bustype = BUS_SPI,
10097 .manufacture_id = SST_ID,
10098 .model_id = SST_SST25VF512A_REMS,
10099 .total_size = 64,
10100 .page_size = 256,
10101 .feature_bits = FEATURE_WRSR_EWSR,
10102 .tested = TEST_OK_PREW,
10103 .probe = probe_spi_rems,
10104 .probe_timing = TIMING_ZERO,
10105 .block_erasers =
10106 {
10107 {
10108 .eraseblocks = { {4 * 1024, 16} },
10109 .block_erase = spi_block_erase_20,
10110 }, {
10111 .eraseblocks = { {32 * 1024, 2} },
10112 .block_erase = spi_block_erase_52,
10113 }, {
10114 .eraseblocks = { {32 * 1024, 2} },
10115 .block_erase = spi_block_erase_d8,
10116 }, {
10117 .eraseblocks = { {64 * 1024, 1} },
10118 .block_erase = spi_block_erase_60,
10119 }, {
10120 .eraseblocks = { {64 * 1024, 1} },
10121 .block_erase = spi_block_erase_c7,
10122 },
10123 },
10124 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10125 .unlock = spi_disable_blockprotect,
10126 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10127 .read = spi_chip_read, /* Fast read (0x0B) supported */
10128 .voltage = {2700, 3600},
10129 },
10130
10131 {
10132 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010133 .name = "SST25VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010134 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000010135 .manufacture_id = SST_ID,
10136 .model_id = SST_SST25VF010_REMS,
10137 .total_size = 128,
10138 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010139 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000010140 .tested = TEST_OK_PREW,
10141 .probe = probe_spi_rems,
10142 .probe_timing = TIMING_ZERO,
10143 .block_erasers =
10144 {
10145 {
10146 .eraseblocks = { {4 * 1024, 32} },
10147 .block_erase = spi_block_erase_20,
10148 }, {
10149 .eraseblocks = { {32 * 1024, 4} },
10150 .block_erase = spi_block_erase_52,
10151 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000010152 .eraseblocks = { {32 * 1024, 4} },
10153 .block_erase = spi_block_erase_d8,
10154 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000010155 .eraseblocks = { {128 * 1024, 1} },
10156 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000010157 }, {
10158 .eraseblocks = { {128 * 1024, 1} },
10159 .block_erase = spi_block_erase_c7,
10160 },
10161 },
10162 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10163 .unlock = spi_disable_blockprotect,
10164 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10165 .read = spi_chip_read, /* Fast read (0x0B) supported */
10166 .voltage = {2700, 3600},
10167 },
10168
10169 {
10170 .vendor = "SST",
10171 .name = "SST25VF020",
10172 .bustype = BUS_SPI,
10173 .manufacture_id = SST_ID,
10174 .model_id = SST_SST25VF020_REMS,
10175 .total_size = 256,
10176 .page_size = 256,
10177 .feature_bits = FEATURE_WRSR_EWSR,
10178 .tested = TEST_UNTESTED,
10179 .probe = probe_spi_rems,
10180 .probe_timing = TIMING_ZERO,
10181 .block_erasers =
10182 {
10183 {
10184 .eraseblocks = { {4 * 1024, 64} },
10185 .block_erase = spi_block_erase_20,
10186 }, {
10187 .eraseblocks = { {32 * 1024, 8} },
10188 .block_erase = spi_block_erase_52,
10189 }, {
10190 .eraseblocks = { {256 * 1024, 1} },
10191 .block_erase = spi_block_erase_60,
10192 },
10193 },
10194 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10195 .unlock = spi_disable_blockprotect,
10196 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10197 .read = spi_chip_read, /* only */
10198 .voltage = {2700, 3600},
10199 },
10200
10201 {
10202 .vendor = "SST",
10203 .name = "SST25VF020B",
10204 .bustype = BUS_SPI,
10205 .manufacture_id = SST_ID,
10206 .model_id = SST_SST25VF020B,
10207 .total_size = 256,
10208 .page_size = 256,
10209 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010210 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000010211 .probe = probe_spi_rdid,
10212 .probe_timing = TIMING_ZERO,
10213 .block_erasers =
10214 {
10215 {
10216 .eraseblocks = { {4 * 1024, 64} },
10217 .block_erase = spi_block_erase_20,
10218 }, {
10219 .eraseblocks = { {32 * 1024, 8} },
10220 .block_erase = spi_block_erase_52,
10221 }, {
10222 .eraseblocks = { {64 * 1024, 4} },
10223 .block_erase = spi_block_erase_d8,
10224 }, {
10225 .eraseblocks = { {256 * 1024, 1} },
10226 .block_erase = spi_block_erase_60,
10227 }, {
10228 .eraseblocks = { {256 * 1024, 1} },
10229 .block_erase = spi_block_erase_c7,
10230 },
10231 },
10232 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
10233 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
10234 .write = spi_aai_write, /* AAI supported (0xAD) */
10235 .read = spi_chip_read, /* Fast read (0x0B) supported */
10236 .voltage = {2700, 3600},
10237 },
10238
10239 {
10240 .vendor = "SST",
10241 .name = "SST25VF040",
10242 .bustype = BUS_SPI,
10243 .manufacture_id = SST_ID,
10244 .model_id = SST_SST25VF040_REMS,
10245 .total_size = 512,
10246 .page_size = 256,
10247 .feature_bits = FEATURE_WRSR_EWSR,
10248 .tested = TEST_OK_PR,
10249 .probe = probe_spi_rems,
10250 .probe_timing = TIMING_ZERO,
10251 .block_erasers =
10252 {
10253 {
10254 .eraseblocks = { {4 * 1024, 128} },
10255 .block_erase = spi_block_erase_20,
10256 }, {
10257 .eraseblocks = { {32 * 1024, 16} },
10258 .block_erase = spi_block_erase_52,
10259 }, {
10260 .eraseblocks = { {512 * 1024, 1} },
10261 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000010262 },
10263 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010264 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000010265 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000010266 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10267 .read = spi_chip_read,
10268 .voltage = {2700, 3600},
10269 },
10270
10271 {
10272 .vendor = "SST",
10273 .name = "SST25VF040B",
10274 .bustype = BUS_SPI,
10275 .manufacture_id = SST_ID,
10276 .model_id = SST_SST25VF040B,
10277 .total_size = 512,
10278 .page_size = 256,
10279 .feature_bits = FEATURE_WRSR_EWSR,
10280 .tested = TEST_OK_PREW,
10281 .probe = probe_spi_rdid,
10282 .probe_timing = TIMING_ZERO,
10283 .block_erasers =
10284 {
10285 {
10286 .eraseblocks = { {4 * 1024, 128} },
10287 .block_erase = spi_block_erase_20,
10288 }, {
10289 .eraseblocks = { {32 * 1024, 16} },
10290 .block_erase = spi_block_erase_52,
10291 }, {
10292 .eraseblocks = { {64 * 1024, 8} },
10293 .block_erase = spi_block_erase_d8,
10294 }, {
10295 .eraseblocks = { {512 * 1024, 1} },
10296 .block_erase = spi_block_erase_60,
10297 }, {
10298 .eraseblocks = { {512 * 1024, 1} },
10299 .block_erase = spi_block_erase_c7,
10300 },
10301 },
10302 .printlock = spi_prettyprint_status_register_sst25vf040b,
10303 .unlock = spi_disable_blockprotect,
10304 .write = spi_aai_write, /* AAI supported (0xAD) */
10305 .read = spi_chip_read, /* Fast read (0x0B) supported */
10306 .voltage = {2700, 3600},
10307 },
10308
10309 {
10310 .vendor = "SST",
10311 .name = "SST25VF040B.REMS",
10312 .bustype = BUS_SPI,
10313 .manufacture_id = SST_ID,
10314 .model_id = SST_SST25VF040B_REMS,
10315 .total_size = 512,
10316 .page_size = 256,
10317 .feature_bits = FEATURE_WRSR_EWSR,
10318 .tested = TEST_OK_PREW,
10319 .probe = probe_spi_rems,
10320 .probe_timing = TIMING_ZERO,
10321 .block_erasers =
10322 {
10323 {
10324 .eraseblocks = { {4 * 1024, 128} },
10325 .block_erase = spi_block_erase_20,
10326 }, {
10327 .eraseblocks = { {32 * 1024, 16} },
10328 .block_erase = spi_block_erase_52,
10329 }, {
10330 .eraseblocks = { {64 * 1024, 8} },
10331 .block_erase = spi_block_erase_d8,
10332 }, {
10333 .eraseblocks = { {512 * 1024, 1} },
10334 .block_erase = spi_block_erase_60,
10335 }, {
10336 .eraseblocks = { {512 * 1024, 1} },
10337 .block_erase = spi_block_erase_c7,
10338 },
10339 },
10340 .printlock = spi_prettyprint_status_register_sst25vf040b,
10341 .unlock = spi_disable_blockprotect,
10342 .write = spi_aai_write,
10343 .read = spi_chip_read,
10344 .voltage = {2700, 3600},
10345 },
10346
10347 {
10348 .vendor = "SST",
10349 .name = "SST25VF080B",
10350 .bustype = BUS_SPI,
10351 .manufacture_id = SST_ID,
10352 .model_id = SST_SST25VF080B,
10353 .total_size = 1024,
10354 .page_size = 256,
10355 .feature_bits = FEATURE_WRSR_EWSR,
10356 .tested = TEST_OK_PREW,
10357 .probe = probe_spi_rdid,
10358 .probe_timing = TIMING_ZERO,
10359 .block_erasers =
10360 {
10361 {
10362 .eraseblocks = { {4 * 1024, 256} },
10363 .block_erase = spi_block_erase_20,
10364 }, {
10365 .eraseblocks = { {32 * 1024, 32} },
10366 .block_erase = spi_block_erase_52,
10367 }, {
10368 .eraseblocks = { {64 * 1024, 16} },
10369 .block_erase = spi_block_erase_d8,
10370 }, {
10371 .eraseblocks = { {1024 * 1024, 1} },
10372 .block_erase = spi_block_erase_60,
10373 }, {
10374 .eraseblocks = { {1024 * 1024, 1} },
10375 .block_erase = spi_block_erase_c7,
10376 },
10377 },
10378 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
10379 .unlock = spi_disable_blockprotect,
10380 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000010381 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010382 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000010383 },
10384
10385 {
10386 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010387 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010388 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010389 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010390 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010391 .total_size = 2048,
10392 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010393 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000010394 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010395 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010396 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000010397 .block_erasers =
10398 {
10399 {
10400 .eraseblocks = { {4 * 1024, 512} },
10401 .block_erase = spi_block_erase_20,
10402 }, {
10403 .eraseblocks = { {32 * 1024, 64} },
10404 .block_erase = spi_block_erase_52,
10405 }, {
10406 .eraseblocks = { {64 * 1024, 32} },
10407 .block_erase = spi_block_erase_d8,
10408 }, {
10409 .eraseblocks = { {2 * 1024 * 1024, 1} },
10410 .block_erase = spi_block_erase_60,
10411 }, {
10412 .eraseblocks = { {2 * 1024 * 1024, 1} },
10413 .block_erase = spi_block_erase_c7,
10414 },
10415 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010416 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010417 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000010418 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010419 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010420 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010421 },
10422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010423 {
10424 .vendor = "SST",
10425 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010426 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010427 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010428 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010429 .total_size = 4096,
10430 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010431 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000010432 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010433 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010434 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000010435 .block_erasers =
10436 {
10437 {
10438 .eraseblocks = { {4 * 1024, 1024} },
10439 .block_erase = spi_block_erase_20,
10440 }, {
10441 .eraseblocks = { {32 * 1024, 128} },
10442 .block_erase = spi_block_erase_52,
10443 }, {
10444 .eraseblocks = { {64 * 1024, 64} },
10445 .block_erase = spi_block_erase_d8,
10446 }, {
10447 .eraseblocks = { {4 * 1024 * 1024, 1} },
10448 .block_erase = spi_block_erase_60,
10449 }, {
10450 .eraseblocks = { {4 * 1024 * 1024, 1} },
10451 .block_erase = spi_block_erase_c7,
10452 },
10453 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010454 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010455 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000010456 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000010457 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010458 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000010459 },
10460
10461 {
10462 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010463 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010464 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010465 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010466 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010467 .total_size = 8192,
10468 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010469 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000010470 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010471 .probe = probe_spi_rdid,
10472 .probe_timing = TIMING_ZERO,
10473 .block_erasers =
10474 {
10475 {
10476 .eraseblocks = { {4 * 1024, 2048} },
10477 .block_erase = spi_block_erase_20,
10478 }, {
10479 .eraseblocks = { {32 * 1024, 256} },
10480 .block_erase = spi_block_erase_52,
10481 }, {
10482 .eraseblocks = { {64 * 1024, 128} },
10483 .block_erase = spi_block_erase_d8,
10484 }, {
10485 .eraseblocks = { {8 * 1024 * 1024, 1} },
10486 .block_erase = spi_block_erase_60,
10487 }, {
10488 .eraseblocks = { {8 * 1024 * 1024, 1} },
10489 .block_erase = spi_block_erase_c7,
10490 },
10491 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010492 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010493 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000010494 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010495 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010496 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000010497 },
10498
10499 {
10500 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000010501 .name = "SST25WF512",
10502 .bustype = BUS_SPI,
10503 .manufacture_id = SST_ID,
10504 .model_id = SST_SST25WF512,
10505 .total_size = 64,
10506 .page_size = 256,
10507 .feature_bits = FEATURE_WRSR_EITHER,
10508 .tested = TEST_UNTESTED,
10509 .probe = probe_spi_rdid,
10510 .probe_timing = TIMING_ZERO,
10511 .block_erasers =
10512 {
10513 {
10514 .eraseblocks = { {4 * 1024, 16} },
10515 .block_erase = spi_block_erase_20,
10516 }, {
10517 .eraseblocks = { {32 * 1024, 2} },
10518 .block_erase = spi_block_erase_52,
10519 }, {
10520 .eraseblocks = { {1024 * 64, 1} },
10521 .block_erase = spi_block_erase_60,
10522 }, {
10523 .eraseblocks = { {1024 * 64, 1} },
10524 .block_erase = spi_block_erase_c7,
10525 },
10526 },
Jason Harper43ddef02014-05-04 00:55:24 +000010527 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
10528 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000010529 .write = spi_aai_write,
10530 .read = spi_chip_read, /* Fast read (0x0B) supported */
10531 .voltage = {1650, 1950},
10532 },
10533
10534 {
10535 .vendor = "SST",
10536 .name = "SST25WF010",
10537 .bustype = BUS_SPI,
10538 .manufacture_id = SST_ID,
10539 .model_id = SST_SST25WF010,
10540 .total_size = 128,
10541 .page_size = 256,
10542 .feature_bits = FEATURE_WRSR_EITHER,
10543 .tested = TEST_UNTESTED,
10544 .probe = probe_spi_rdid,
10545 .probe_timing = TIMING_ZERO,
10546 .block_erasers =
10547 {
10548 {
10549 .eraseblocks = { {4 * 1024, 32} },
10550 .block_erase = spi_block_erase_20,
10551 }, {
10552 .eraseblocks = { {32 * 1024, 4} },
10553 .block_erase = spi_block_erase_52,
10554 }, {
10555 .eraseblocks = { {1024 * 128, 1} },
10556 .block_erase = spi_block_erase_60,
10557 }, {
10558 .eraseblocks = { {1024 * 128, 1} },
10559 .block_erase = spi_block_erase_c7,
10560 },
10561 },
Jason Harper43ddef02014-05-04 00:55:24 +000010562 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
10563 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000010564 .write = spi_aai_write,
10565 .read = spi_chip_read, /* Fast read (0x0B) supported */
10566 .voltage = {1650, 1950},
10567 },
10568
10569 {
10570 .vendor = "SST",
10571 .name = "SST25WF020",
10572 .bustype = BUS_SPI,
10573 .manufacture_id = SST_ID,
10574 .model_id = SST_SST25WF020,
10575 .total_size = 256,
10576 .page_size = 256,
10577 .feature_bits = FEATURE_WRSR_EITHER,
10578 .tested = TEST_UNTESTED,
10579 .probe = probe_spi_rdid,
10580 .probe_timing = TIMING_ZERO,
10581 .block_erasers =
10582 {
10583 {
10584 .eraseblocks = { {4 * 1024, 64} },
10585 .block_erase = spi_block_erase_20,
10586 }, {
10587 .eraseblocks = { {32 * 1024, 8} },
10588 .block_erase = spi_block_erase_52,
10589 }, {
10590 .eraseblocks = { {64 * 1024, 4} },
10591 .block_erase = spi_block_erase_d8,
10592 }, {
10593 .eraseblocks = { {1024 * 256, 1} },
10594 .block_erase = spi_block_erase_60,
10595 }, {
10596 .eraseblocks = { {1024 * 256, 1} },
10597 .block_erase = spi_block_erase_c7,
10598 },
10599 },
Jason Harper43ddef02014-05-04 00:55:24 +000010600 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
10601 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000010602 .write = spi_aai_write,
10603 .read = spi_chip_read, /* Fast read (0x0B) supported */
10604 .voltage = {1650, 1950},
10605 },
10606
10607 {
10608 .vendor = "SST",
10609 .name = "SST25WF040",
10610 .bustype = BUS_SPI,
10611 .manufacture_id = SST_ID,
10612 .model_id = SST_SST25WF040,
10613 .total_size = 512,
10614 .page_size = 256,
10615 .feature_bits = FEATURE_WRSR_EITHER,
10616 .tested = TEST_UNTESTED,
10617 .probe = probe_spi_rdid,
10618 .probe_timing = TIMING_ZERO,
10619 .block_erasers =
10620 {
10621 {
10622 .eraseblocks = { {4 * 1024, 128} },
10623 .block_erase = spi_block_erase_20,
10624 }, {
10625 .eraseblocks = { {32 * 1024, 16} },
10626 .block_erase = spi_block_erase_52,
10627 }, {
10628 .eraseblocks = { {64 * 1024, 8} },
10629 .block_erase = spi_block_erase_d8,
10630 }, {
10631 .eraseblocks = { {1024 * 512, 1} },
10632 .block_erase = spi_block_erase_60,
10633 }, {
10634 .eraseblocks = { {1024 * 512, 1} },
10635 .block_erase = spi_block_erase_c7,
10636 },
10637 },
Jason Harper43ddef02014-05-04 00:55:24 +000010638 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
10639 .unlock = spi_disable_blockprotect_bp2_srwd,
10640 .write = spi_aai_write,
10641 .read = spi_chip_read, /* Fast read (0x0B) supported */
10642 .voltage = {1650, 1950},
10643 },
10644
10645 {
10646 .vendor = "SST",
10647 .name = "SST25WF080",
10648 .bustype = BUS_SPI,
10649 .manufacture_id = SST_ID,
10650 .model_id = SST_SST25WF080,
10651 .total_size = 1024,
10652 .page_size = 256,
10653 .feature_bits = FEATURE_WRSR_EITHER,
10654 .tested = TEST_OK_PREW,
10655 .probe = probe_spi_rdid,
10656 .probe_timing = TIMING_ZERO,
10657 .block_erasers =
10658 {
10659 {
10660 .eraseblocks = { {4 * 1024, 256} },
10661 .block_erase = spi_block_erase_20,
10662 }, {
10663 .eraseblocks = { {32 * 1024, 32} },
10664 .block_erase = spi_block_erase_52,
10665 }, {
10666 .eraseblocks = { {64 * 1024, 16} },
10667 .block_erase = spi_block_erase_d8,
10668 }, {
10669 .eraseblocks = { {1024 * 1024, 1} },
10670 .block_erase = spi_block_erase_60,
10671 }, {
10672 .eraseblocks = { {1024 * 1024, 1} },
10673 .block_erase = spi_block_erase_c7,
10674 },
10675 },
10676 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
10677 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000010678 .write = spi_aai_write,
10679 .read = spi_chip_read, /* Fast read (0x0B) supported */
10680 .voltage = {1650, 1950},
10681 },
10682
10683 {
10684 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010685 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010686 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010687 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010688 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010689 .total_size = 512,
10690 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000010691 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010692 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010693 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010694 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010695 .block_erasers =
10696 {
10697 {
10698 .eraseblocks = { {128, 4096} },
10699 .block_erase = erase_sector_28sf040,
10700 }, {
10701 .eraseblocks = { {512 * 1024, 1} },
10702 .block_erase = erase_chip_28sf040,
10703 }
10704 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010705 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010706 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010707 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010708 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010709 },
10710
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010711 {
10712 .vendor = "SST",
10713 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010714 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010715 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010716 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010717 .total_size = 128,
10718 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010719 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010720 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010721 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010722 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010723 .block_erasers =
10724 {
10725 {
10726 .eraseblocks = { {128 * 1024, 1} },
10727 .block_erase = erase_chip_block_jedec,
10728 }
10729 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010730 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010731 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010732 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010733 },
10734
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010735 {
10736 .vendor = "SST",
10737 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010738 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010739 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010740 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010741 .total_size = 128,
10742 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010743 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010744 .tested = TEST_UNTESTED,
10745 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010746 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010747 .block_erasers =
10748 {
10749 {
10750 .eraseblocks = { {128 * 1024, 1} },
10751 .block_erase = erase_chip_block_jedec,
10752 }
10753 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010754 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010755 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010756 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010757 },
10758
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010759 {
10760 .vendor = "SST",
10761 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010762 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010763 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010764 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010765 .total_size = 256,
10766 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010767 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010768 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010769 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010770 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010771 .block_erasers =
10772 {
10773 {
10774 .eraseblocks = { {256 * 1024, 1} },
10775 .block_erase = erase_chip_block_jedec,
10776 }
10777 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010778 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010779 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010780 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010781 },
10782
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010783 {
10784 .vendor = "SST",
10785 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010786 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010787 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010788 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010789 .total_size = 256,
10790 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000010791 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010792 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010793 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010794 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010795 .block_erasers =
10796 {
10797 {
10798 .eraseblocks = { {256 * 1024, 1} },
10799 .block_erase = erase_chip_block_jedec,
10800 }
10801 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010802 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010803 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010804 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010805 },
10806
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010807 {
10808 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000010809 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010810 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010811 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010812 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010813 .total_size = 64,
10814 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010815 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000010816 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010817 .probe = probe_jedec,
10818 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000010819 .block_erasers =
10820 {
10821 {
10822 .eraseblocks = { {4 * 1024, 16} },
10823 .block_erase = erase_sector_jedec,
10824 }, {
10825 .eraseblocks = { {64 * 1024, 1} },
10826 .block_erase = erase_chip_block_jedec,
10827 }
10828 },
Sean Nelson35727f72010-01-28 23:55:12 +000010829 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000010830 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010831 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000010832 },
10833
10834 {
10835 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010836 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010837 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010838 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010839 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010840 .total_size = 128,
10841 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010842 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000010843 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010844 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000010845 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010846 .block_erasers =
10847 {
10848 {
10849 .eraseblocks = { {4 * 1024, 32} },
10850 .block_erase = erase_sector_jedec,
10851 }, {
10852 .eraseblocks = { {128 * 1024, 1} },
10853 .block_erase = erase_chip_block_jedec,
10854 }
10855 },
Sean Nelson35727f72010-01-28 23:55:12 +000010856 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010857 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010858 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010859 },
10860
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010861 {
10862 .vendor = "SST",
10863 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010864 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010865 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010866 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010867 .total_size = 256,
10868 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010869 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000010870 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010871 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010872 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010873 .block_erasers =
10874 {
10875 {
10876 .eraseblocks = { {4 * 1024, 64} },
10877 .block_erase = erase_sector_jedec,
10878 }, {
10879 .eraseblocks = { {256 * 1024, 1} },
10880 .block_erase = erase_chip_block_jedec,
10881 }
10882 },
Sean Nelson35727f72010-01-28 23:55:12 +000010883 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010884 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010885 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010886 },
10887
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010888 {
10889 .vendor = "SST",
10890 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010891 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010892 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010893 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010894 .total_size = 512,
10895 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010896 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010897 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010898 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010899 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010900 .block_erasers =
10901 {
10902 {
10903 .eraseblocks = { {4 * 1024, 128} },
10904 .block_erase = erase_sector_jedec,
10905 }, {
10906 .eraseblocks = { {512 * 1024, 1} },
10907 .block_erase = erase_chip_block_jedec,
10908 }
10909 },
Sean Nelson35727f72010-01-28 23:55:12 +000010910 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010911 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010912 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010913 },
10914
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010915 {
10916 .vendor = "SST",
10917 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010918 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010919 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010920 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010921 .total_size = 64,
10922 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010923 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000010924 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010925 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010926 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010927 .block_erasers =
10928 {
10929 {
10930 .eraseblocks = { {4 * 1024, 16} },
10931 .block_erase = erase_sector_jedec,
10932 }, {
10933 .eraseblocks = { {64 * 1024, 1} },
10934 .block_erase = erase_chip_block_jedec,
10935 }
10936 },
Sean Nelson35727f72010-01-28 23:55:12 +000010937 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010938 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010939 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010940 },
10941
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010942 {
10943 .vendor = "SST",
10944 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010945 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010946 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010947 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010948 .total_size = 128,
10949 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010950 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000010951 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010952 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010953 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010954 .block_erasers =
10955 {
10956 {
10957 .eraseblocks = { {4 * 1024, 32} },
10958 .block_erase = erase_sector_jedec,
10959 }, {
10960 .eraseblocks = { {128 * 1024, 1} },
10961 .block_erase = erase_chip_block_jedec,
10962 }
10963 },
Sean Nelson35727f72010-01-28 23:55:12 +000010964 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010965 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010966 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010967 },
10968
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010969 {
10970 .vendor = "SST",
10971 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010972 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010973 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010974 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010975 .total_size = 256,
10976 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010977 .feature_bits = FEATURE_EITHER_RESET,
10978 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010979 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010980 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010981 .block_erasers =
10982 {
10983 {
10984 .eraseblocks = { {4 * 1024, 64} },
10985 .block_erase = erase_sector_jedec,
10986 }, {
10987 .eraseblocks = { {256 * 1024, 1} },
10988 .block_erase = erase_chip_block_jedec,
10989 }
10990 },
Sean Nelson35727f72010-01-28 23:55:12 +000010991 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010992 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010993 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010994 },
10995
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010996 {
10997 .vendor = "SST",
10998 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010999 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011000 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011001 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011002 .total_size = 512,
11003 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011004 .feature_bits = FEATURE_EITHER_RESET,
11005 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011006 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011007 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011008 .block_erasers =
11009 {
11010 {
11011 .eraseblocks = { {4 * 1024, 128} },
11012 .block_erase = erase_sector_jedec,
11013 }, {
11014 .eraseblocks = { {512 * 1024, 1} },
11015 .block_erase = erase_chip_block_jedec,
11016 }
11017 },
Sean Nelson35727f72010-01-28 23:55:12 +000011018 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011019 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011020 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000011021 },
FENG yu ningff692fb2008-12-08 18:15:10 +000011022
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011023 {
11024 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000011025 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011026 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000011027 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011028 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000011029 .total_size = 1024,
11030 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011031 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000011032 .tested = TEST_UNTESTED,
11033 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011034 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011035 .block_erasers =
11036 {
11037 {
11038 .eraseblocks = { {4 * 1024, 256} },
11039 .block_erase = erase_sector_jedec,
11040 }, {
11041 .eraseblocks = { {64 * 1024, 16} },
11042 .block_erase = erase_block_jedec,
11043 }, {
11044 .eraseblocks = { {1024 * 1024, 1} },
11045 .block_erase = erase_chip_block_jedec,
11046 }
11047 },
Sean Nelson35727f72010-01-28 23:55:12 +000011048 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011049 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011050 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000011051 },
11052
11053 {
11054 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011055 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011056 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011057 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011058 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011059 .total_size = 256,
11060 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011061 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000011062 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011063 .probe = probe_jedec,
11064 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011065 .block_erasers =
11066 {
11067 {
11068 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011069 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011070 }, {
11071 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011072 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011073 }, {
11074 .eraseblocks = { {256 * 1024, 1} },
11075 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11076 }
11077 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011078 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011079 .unlock = unlock_sst_fwhub,
11080 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011081 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011082 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011083 },
11084
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011085 {
11086 .vendor = "SST",
11087 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011088 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011089 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011090 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011091 .total_size = 384,
11092 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011093 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000011094 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011095 .probe = probe_jedec,
11096 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011097 .block_erasers =
11098 {
11099 {
11100 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011101 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011102 }, {
11103 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011104 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011105 }, {
11106 .eraseblocks = { {384 * 1024, 1} },
11107 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11108 }
11109 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011110 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011111 .unlock = unlock_sst_fwhub,
11112 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011113 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011114 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011115 },
11116
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011117 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011118 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
11119 * and is only honored for 64k block erase, but not 4k sector erase.
11120 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011121 .vendor = "SST",
11122 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011123 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011124 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011125 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011126 .total_size = 512,
11127 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011128 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000011129 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011130 .probe = probe_jedec,
11131 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011132 .block_erasers =
11133 {
11134 {
11135 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011136 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011137 }, {
11138 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011139 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011140 }, {
11141 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000011142 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011143 },
11144 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011145 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011146 .unlock = unlock_sst_fwhub,
11147 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011148 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011149 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011150 },
11151
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011152 {
11153 .vendor = "SST",
11154 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011155 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011156 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011157 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011158 .total_size = 512,
11159 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011160 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011161 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011162 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011163 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011164 .block_erasers =
11165 {
11166 {
11167 .eraseblocks = { {4 * 1024, 128} },
11168 .block_erase = erase_sector_49lfxxxc,
11169 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011170 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011171 {64 * 1024, 7},
11172 {32 * 1024, 1},
11173 {8 * 1024, 2},
11174 {16 * 1024, 1},
11175 },
Sean Nelson69e58112010-03-23 17:10:28 +000011176 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011177 }
11178 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011179 .printlock = printlock_regspace2_block_eraser_1,
11180 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011181 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011182 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011183 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011184 },
11185
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011186 {
11187 .vendor = "SST",
11188 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011189 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011190 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011191 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011192 .total_size = 1024,
11193 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011194 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011195 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011196 .probe = probe_jedec,
11197 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011198 .block_erasers =
11199 {
11200 {
11201 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011202 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011203 }, {
11204 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011205 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011206 }, {
11207 .eraseblocks = { {1024 * 1024, 1} },
11208 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11209 }
11210 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011211 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011212 .unlock = unlock_sst_fwhub,
11213 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011214 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011215 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011216 },
11217
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011218 {
11219 .vendor = "SST",
11220 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011221 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011222 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011223 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011224 .total_size = 1024,
11225 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011226 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011227 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011228 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011229 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011230 .block_erasers =
11231 {
11232 {
11233 .eraseblocks = { {4 * 1024, 256} },
11234 .block_erase = erase_sector_49lfxxxc,
11235 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011236 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011237 {64 * 1024, 15},
11238 {32 * 1024, 1},
11239 {8 * 1024, 2},
11240 {16 * 1024, 1},
11241 },
Sean Nelson69e58112010-03-23 17:10:28 +000011242 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011243 }
11244 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011245 .printlock = printlock_regspace2_block_eraser_1,
11246 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011247 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011248 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011249 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011250 },
11251
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011252 {
11253 .vendor = "SST",
11254 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011255 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011256 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011257 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011258 .total_size = 2048,
11259 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011260 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011261 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011262 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011263 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011264 .block_erasers =
11265 {
11266 {
11267 .eraseblocks = { {4 * 1024, 512} },
11268 .block_erase = erase_sector_49lfxxxc,
11269 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011270 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011271 {64 * 1024, 31},
11272 {32 * 1024, 1},
11273 {8 * 1024, 2},
11274 {16 * 1024, 1},
11275 },
Sean Nelson69e58112010-03-23 17:10:28 +000011276 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011277 }
11278 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011279 .printlock = printlock_regspace2_block_eraser_1,
11280 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011281 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011282 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011283 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011284 },
11285
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011286 {
11287 .vendor = "SST",
11288 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011289 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011290 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011291 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011292 .total_size = 256,
11293 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011294 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000011295 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011296 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011297 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011298 .block_erasers =
11299 {
11300 {
11301 .eraseblocks = { {4 * 1024, 64} },
11302 .block_erase = erase_sector_jedec,
11303 }, {
11304 .eraseblocks = { {16 * 1024, 16} },
11305 .block_erase = erase_block_jedec,
11306 }, {
11307 .eraseblocks = { {256 * 1024, 1} },
11308 .block_erase = NULL,
11309 }
11310 },
Sean Nelson35727f72010-01-28 23:55:12 +000011311 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011312 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011313 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000011314 },
11315
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011316 {
11317 .vendor = "SST",
11318 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011319 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011320 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011321 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011322 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000011323 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011324 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011325 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011326 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011327 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011328 .block_erasers =
11329 {
11330 {
11331 .eraseblocks = { {4 * 1024, 64} },
11332 .block_erase = erase_sector_jedec,
11333 }, {
11334 .eraseblocks = { {16 * 1024, 16} },
11335 .block_erase = erase_block_jedec,
11336 }, {
11337 .eraseblocks = { {256 * 1024, 1} },
11338 .block_erase = NULL,
11339 }
11340 },
Sean Nelson35727f72010-01-28 23:55:12 +000011341 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011342 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011343 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011344 },
11345
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011346 {
11347 .vendor = "SST",
11348 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011349 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011350 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011351 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011352 .total_size = 512,
11353 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011354 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011355 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011356 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011357 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011358 .block_erasers =
11359 {
11360 {
11361 .eraseblocks = { {4 * 1024, 128} },
11362 .block_erase = erase_sector_jedec,
11363 }, {
11364 .eraseblocks = { {64 * 1024, 8} },
11365 .block_erase = erase_block_jedec,
11366 }, {
11367 .eraseblocks = { {512 * 1024, 1} },
11368 .block_erase = NULL,
11369 }
11370 },
Sean Nelson35727f72010-01-28 23:55:12 +000011371 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011372 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011373 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011374 },
11375
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011376 {
11377 .vendor = "SST",
11378 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011379 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011380 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011381 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011382 .total_size = 512,
11383 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000011384 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011385 .tested = TEST_OK_PR,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011386 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011387 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011388 .block_erasers =
11389 {
11390 {
11391 .eraseblocks = { {4 * 1024, 128} },
11392 .block_erase = erase_sector_jedec,
11393 }, {
11394 .eraseblocks = { {64 * 1024, 8} },
11395 .block_erase = erase_block_jedec,
11396 }, {
11397 .eraseblocks = { {512 * 1024, 1} },
11398 .block_erase = NULL,
11399 }
11400 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011401 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000011402 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011403 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011404 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011405 },
11406
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011407 {
11408 .vendor = "SST",
11409 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011410 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011411 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011412 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011413 .total_size = 1024,
11414 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011415 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000011416 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011417 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011418 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011419 .block_erasers =
11420 {
11421 {
11422 .eraseblocks = { {4 * 1024, 256} },
11423 .block_erase = erase_sector_jedec,
11424 }, {
11425 .eraseblocks = { {64 * 1024, 16} },
11426 .block_erase = erase_block_jedec,
11427 }, {
11428 .eraseblocks = { {1024 * 1024, 1} },
11429 .block_erase = NULL,
11430 }
11431 },
Sean Nelson35727f72010-01-28 23:55:12 +000011432 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011433 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011434 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011435 },
11436
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011437 {
11438 .vendor = "SST",
11439 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011440 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011441 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011442 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011443 .total_size = 2048,
11444 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011445 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011446 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011447 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011448 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011449 .block_erasers =
11450 {
11451 {
11452 .eraseblocks = { {4 * 1024, 512} },
11453 .block_erase = erase_sector_49lfxxxc,
11454 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011455 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011456 {64 * 1024, 31},
11457 {32 * 1024, 1},
11458 {8 * 1024, 2},
11459 {16 * 1024, 1},
11460 },
Sean Nelson69e58112010-03-23 17:10:28 +000011461 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011462 }
11463 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011464 .printlock = printlock_regspace2_block_eraser_1,
11465 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011466 .write = write_82802ab,
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 {
11472 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011473 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011474 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011475 .manufacture_id = ST_ID,
11476 .model_id = ST_M29F002B,
11477 .total_size = 256,
11478 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011479 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +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 Hailfinger03b4e712009-05-08 12:49:03 +000011499 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011500 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000011501 },
11502
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011503 {
11504 .vendor = "ST",
11505 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011506 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011507 .manufacture_id = ST_ID,
11508 .model_id = ST_M29F002T,
11509 .total_size = 256,
11510 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011511 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011512 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011513 .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 Hailfinger03b4e712009-05-08 12:49:03 +000011531 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011532 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000011533 },
11534
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011535 {
11536 .vendor = "ST",
11537 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011538 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011539 .manufacture_id = ST_ID,
11540 .model_id = ST_M29F040B,
11541 .total_size = 512,
11542 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011543 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
11544 .tested = TEST_UNTESTED,
11545 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000011546 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000011547 .block_erasers =
11548 {
11549 {
11550 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +000011551 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000011552 }, {
11553 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000011554 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000011555 }
11556 },
Sean Nelson35727f72010-01-28 23:55:12 +000011557 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011558 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011559 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011560 },
11561
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011562 {
Sean Nelson35727f72010-01-28 23:55:12 +000011563 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011564 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011565 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011566 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011567 .manufacture_id = ST_ID,
11568 .model_id = ST_M29F400BB,
11569 .total_size = 512,
11570 .page_size = 64 * 1024,
11571 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011572 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011573 .probe = probe_m29f400bt,
11574 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
11575 .block_erasers =
11576 {
11577 {
11578 .eraseblocks = {
11579 {16 * 1024, 1},
11580 {8 * 1024, 2},
11581 {32 * 1024, 1},
11582 {64 * 1024, 7},
11583 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +000011584 .block_erase = erase_block_shifted_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011585 }, {
11586 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +000011587 .block_erase = erase_chip_block_shifted_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011588 }
11589 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011590 .write = write_m29f400bt,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011591 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011592 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011593 },
11594 {
11595 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
11596 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011597 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011598 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011599 .manufacture_id = ST_ID,
11600 .model_id = ST_M29F400BT,
11601 .total_size = 512,
11602 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011603 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011604 .tested = TEST_UNTESTED,
11605 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011606 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011607 .block_erasers =
11608 {
11609 {
11610 .eraseblocks = {
11611 {64 * 1024, 7},
11612 {32 * 1024, 1},
11613 {8 * 1024, 2},
11614 {16 * 1024, 1},
11615 },
Stefan Taunerf2756fa2014-06-01 02:21:02 +000011616 .block_erase = erase_block_shifted_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000011617 }, {
11618 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerf2756fa2014-06-01 02:21:02 +000011619 .block_erase = erase_chip_block_shifted_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000011620 }
11621 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000011622 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011623 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011624 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011625 },
11626
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011627 {
11628 .vendor = "ST",
11629 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011630 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011631 .manufacture_id = ST_ID,
11632 .model_id = ST_M29W010B,
11633 .total_size = 128,
11634 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011635 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011636 .tested = TEST_UNTESTED,
11637 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011638 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011639 .block_erasers =
11640 {
11641 {
11642 .eraseblocks = { {16 * 1024, 8}, },
11643 .block_erase = erase_sector_jedec,
11644 }, {
11645 .eraseblocks = { {128 * 1024, 1} },
11646 .block_erase = erase_chip_block_jedec,
11647 }
11648 },
Sean Nelson35727f72010-01-28 23:55:12 +000011649 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011650 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011651 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011652 },
11653
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011654 {
11655 .vendor = "ST",
11656 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011657 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011658 .manufacture_id = ST_ID,
11659 .model_id = ST_M29W040B,
11660 .total_size = 512,
11661 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011662 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011663 .tested = TEST_UNTESTED,
11664 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011665 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011666 .block_erasers =
11667 {
11668 {
11669 .eraseblocks = { {64 * 1024, 8}, },
11670 .block_erase = erase_sector_jedec,
11671 }, {
11672 .eraseblocks = { {512 * 1024, 1} },
11673 .block_erase = erase_chip_block_jedec,
11674 }
11675 },
Sean Nelson35727f72010-01-28 23:55:12 +000011676 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011677 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011678 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011679 },
11680
Stefan Taunereb582572012-09-21 12:52:50 +000011681 {
11682 .vendor = "ST",
11683 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011684 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000011685 .manufacture_id = ST_ID,
11686 .model_id = ST_M29W512B,
11687 .total_size = 64,
11688 .page_size = 64 * 1024,
11689 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011690 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000011691 .probe = probe_jedec,
11692 .probe_timing = TIMING_ZERO,
11693 .block_erasers =
11694 {
11695 {
11696 .eraseblocks = { {64 * 1024, 1} },
11697 .block_erase = erase_chip_block_jedec,
11698 }
11699 },
11700 .write = write_jedec_1,
11701 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011702 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000011703 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000011704
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011705 {
11706 .vendor = "ST",
11707 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011708 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011709 .manufacture_id = ST_ID,
11710 .model_id = ST_M50FLW040A,
11711 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000011712 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011713 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011714 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011715 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011716 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011717 .block_erasers =
11718 {
11719 {
Sean Nelson329bde72010-01-19 16:39:19 +000011720 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011721 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011722 {64 * 1024, 5}, /* block */
11723 {4 * 1024, 16}, /* sector */
11724 {4 * 1024, 16}, /* sector */
11725 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000011726 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000011727 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011728 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011729 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011730 }
11731 },
Sean Nelson28accc22010-03-19 18:47:06 +000011732 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011733 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011734 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011735 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011736 },
11737
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011738 {
11739 .vendor = "ST",
11740 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011741 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011742 .manufacture_id = ST_ID,
11743 .model_id = ST_M50FLW040B,
11744 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000011745 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011746 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011747 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011748 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011749 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011750 .block_erasers =
11751 {
11752 {
Sean Nelson329bde72010-01-19 16:39:19 +000011753 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011754 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011755 {4 * 1024, 16}, /* sector */
11756 {64 * 1024, 5}, /* block */
11757 {4 * 1024, 16}, /* sector */
11758 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000011759 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000011760 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011761 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011762 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011763 }
11764 },
Sean Nelson28accc22010-03-19 18:47:06 +000011765 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011766 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011767 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011768 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011769 },
11770
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011771 {
11772 .vendor = "ST",
11773 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011774 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011775 .manufacture_id = ST_ID,
11776 .model_id = ST_M50FLW080A,
11777 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000011778 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011779 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011780 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000011781 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011782 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011783 .block_erasers =
11784 {
11785 {
Sean Nelson329bde72010-01-19 16:39:19 +000011786 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011787 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011788 {64 * 1024, 13}, /* block */
11789 {4 * 1024, 16}, /* sector */
11790 {4 * 1024, 16}, /* sector */
11791 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000011792 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000011793 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011794 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011795 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011796 }
11797 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011798 .printlock = printlock_regspace2_block_eraser_0,
11799 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000011800 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011801 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011802 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011803 },
11804
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011805 {
11806 .vendor = "ST",
11807 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011808 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011809 .manufacture_id = ST_ID,
11810 .model_id = ST_M50FLW080B,
11811 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000011812 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011813 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011814 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011815 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000011816 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000011817 .block_erasers =
11818 {
11819 {
Sean Nelson329bde72010-01-19 16:39:19 +000011820 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000011821 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000011822 {4 * 1024, 16}, /* sector */
11823 {64 * 1024, 13}, /* block */
11824 {4 * 1024, 16}, /* sector */
11825 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000011826 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000011827 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000011828 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011829 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011830 }
11831 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011832 .printlock = printlock_regspace2_block_eraser_0,
11833 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000011834 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011835 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011836 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011837 },
11838
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011839 {
11840 .vendor = "ST",
11841 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011842 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011843 .manufacture_id = ST_ID,
11844 .model_id = ST_M50FW002,
11845 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000011846 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011847 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011848 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000011849 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011850 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011851 .block_erasers =
11852 {
11853 {
11854 .eraseblocks = {
11855 {64 * 1024, 3},
11856 {32 * 1024, 1},
11857 {8 * 1024, 2},
11858 {16 * 1024, 1},
11859 },
Sean Nelson28accc22010-03-19 18:47:06 +000011860 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011861 }, {
11862 .eraseblocks = { {256 * 1024, 1}, },
11863 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000011864 }
11865 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011866 .printlock = printlock_regspace2_block_eraser_0,
11867 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000011868 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011869 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011870 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011871 },
11872
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011873 {
11874 .vendor = "ST",
11875 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011876 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011877 .manufacture_id = ST_ID,
11878 .model_id = ST_M50FW016,
11879 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000011880 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011881 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011882 .tested = TEST_UNTESTED,
11883 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011884 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011885 .block_erasers =
11886 {
11887 {
11888 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011889 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011890 }
11891 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011892 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000011893 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011894 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011895 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011896 },
11897
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011898 {
11899 .vendor = "ST",
11900 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011901 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011902 .manufacture_id = ST_ID,
11903 .model_id = ST_M50FW040,
11904 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000011905 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011906 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000011907 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011908 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011909 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011910 .block_erasers =
11911 {
11912 {
11913 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011914 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011915 }
11916 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011917 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000011918 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011919 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011920 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011921 },
11922
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011923 {
11924 .vendor = "ST",
11925 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011926 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011927 .manufacture_id = ST_ID,
11928 .model_id = ST_M50FW080,
11929 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000011930 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011931 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011932 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011933 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011934 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000011935 .block_erasers =
11936 {
11937 {
11938 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000011939 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011940 }
11941 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011942 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000011943 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011944 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011945 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000011946 },
11947
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011948 {
11949 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000011950 .name = "M50LPW080",
11951 .bustype = BUS_LPC, /* A/A Mux */
11952 .manufacture_id = ST_ID,
11953 .model_id = ST_M50LPW080,
11954 .total_size = 1024,
11955 .page_size = 0,
11956 .feature_bits = FEATURE_REGISTERMAP,
11957 .tested = TEST_UNTESTED,
11958 .probe = probe_82802ab,
11959 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11960 .block_erasers =
11961 {
11962 {
11963 .eraseblocks = { {64 * 1024, 16}, },
11964 .block_erase = erase_block_82802ab,
11965 }
11966 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011967 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000011968 .write = write_82802ab,
11969 .read = read_memmapped,
11970 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
11971 },
11972
11973 {
11974 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011975 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011976 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011977 .manufacture_id = ST_ID,
11978 .model_id = ST_M50LPW116,
11979 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000011980 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011981 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011982 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000011983 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000011984 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011985 .block_erasers =
11986 {
11987 {
11988 .eraseblocks = {
11989 {4 * 1024, 16},
11990 {64 * 1024, 30},
11991 {32 * 1024, 1},
11992 {8 * 1024, 2},
11993 {16 * 1024, 1},
11994 },
Sean Nelson28accc22010-03-19 18:47:06 +000011995 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000011996 }
11997 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011998 .printlock = printlock_regspace2_block_eraser_0,
11999 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012000 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012001 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012002 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012003 },
12004
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012005 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012006 .vendor = "SyncMOS/MoselVitelic",
12007 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012008 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012009 .manufacture_id = SYNCMOS_MVC_ID,
12010 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012011 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012012 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000012013 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012014 .tested = TEST_UNTESTED,
12015 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012016 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012017 .block_erasers =
12018 {
12019 {
12020 .eraseblocks = { {512, 256} },
12021 .block_erase = erase_sector_jedec,
12022 }, {
12023 .eraseblocks = { {128 * 1024, 1} },
12024 .block_erase = erase_chip_block_jedec,
12025 },
12026 },
Sean Nelson35727f72010-01-28 23:55:12 +000012027 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012028 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012029 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012030 },
12031
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012032 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012033 .vendor = "SyncMOS/MoselVitelic",
12034 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012035 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012036 .manufacture_id = SYNCMOS_MVC_ID,
12037 .model_id = SM_MVC_29C51001T,
12038 .total_size = 128,
12039 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000012040 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012041 .tested = TEST_UNTESTED,
12042 .probe = probe_jedec,
12043 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12044 .block_erasers =
12045 {
12046 {
12047 .eraseblocks = { {512, 256} },
12048 .block_erase = erase_sector_jedec,
12049 }, {
12050 .eraseblocks = { {128 * 1024, 1} },
12051 .block_erase = erase_chip_block_jedec,
12052 },
12053 },
12054 .write = write_jedec_1,
12055 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012056 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012057 },
12058
12059 {
12060 .vendor = "SyncMOS/MoselVitelic",
12061 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012062 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012063 .manufacture_id = SYNCMOS_MVC_ID,
12064 .model_id = SM_MVC_29C51002B,
12065 .total_size = 256,
12066 .page_size = 512,
12067 .feature_bits = FEATURE_EITHER_RESET,
12068 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012069 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012070 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012071 .block_erasers =
12072 {
12073 {
12074 .eraseblocks = { {512, 512} },
12075 .block_erase = erase_sector_jedec,
12076 }, {
12077 .eraseblocks = { {256 * 1024, 1} },
12078 .block_erase = erase_chip_block_jedec,
12079 },
12080 },
Sean Nelson35727f72010-01-28 23:55:12 +000012081 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012082 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000012083 },
12084
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012085 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012086 .vendor = "SyncMOS/MoselVitelic",
12087 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012088 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012089 .manufacture_id = SYNCMOS_MVC_ID,
12090 .model_id = SM_MVC_29C51002T,
12091 .total_size = 256,
12092 .page_size = 512,
12093 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012094 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012095 .probe = probe_jedec,
12096 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12097 .block_erasers =
12098 {
12099 {
12100 .eraseblocks = { {512, 512} },
12101 .block_erase = erase_sector_jedec,
12102 }, {
12103 .eraseblocks = { {256 * 1024, 1} },
12104 .block_erase = erase_chip_block_jedec,
12105 },
12106 },
12107 .write = write_jedec_1,
12108 .read = read_memmapped,
12109 },
12110
12111 {
12112 .vendor = "SyncMOS/MoselVitelic",
12113 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012114 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012115 .manufacture_id = SYNCMOS_MVC_ID,
12116 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012117 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012118 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012119 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012120 .tested = TEST_UNTESTED,
12121 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012122 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000012123 .block_erasers =
12124 {
12125 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012126 .eraseblocks = { {1024, 512} },
12127 .block_erase = erase_sector_jedec,
12128 }, {
12129 .eraseblocks = { {512 * 1024, 1} },
12130 .block_erase = erase_chip_block_jedec,
12131 },
12132 },
12133 .write = write_jedec_1,
12134 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012135 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012136 },
12137
12138 {
12139 .vendor = "SyncMOS/MoselVitelic",
12140 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012141 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012142 .manufacture_id = SYNCMOS_MVC_ID,
12143 .model_id = SM_MVC_29C51004T,
12144 .total_size = 512,
12145 .page_size = 1024,
12146 .feature_bits = FEATURE_EITHER_RESET,
12147 .tested = TEST_UNTESTED,
12148 .probe = probe_jedec,
12149 .probe_timing = TIMING_ZERO,
12150 .block_erasers =
12151 {
12152 {
12153 .eraseblocks = { {1024, 512} },
12154 .block_erase = erase_sector_jedec,
12155 }, {
12156 .eraseblocks = { {512 * 1024, 1} },
12157 .block_erase = erase_chip_block_jedec,
12158 },
12159 },
12160 .write = write_jedec_1,
12161 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012162 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012163 },
12164
12165 {
12166 .vendor = "SyncMOS/MoselVitelic",
12167 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012168 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012169 .manufacture_id = SYNCMOS_MVC_ID,
12170 .model_id = SM_MVC_29C31004B,
12171 .total_size = 512,
12172 .page_size = 1024,
12173 .feature_bits = FEATURE_EITHER_RESET,
12174 .tested = TEST_UNTESTED,
12175 .probe = probe_jedec,
12176 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12177 .block_erasers =
12178 {
12179 {
12180 .eraseblocks = { {1024, 512} },
12181 .block_erase = erase_sector_jedec,
12182 }, {
12183 .eraseblocks = { {512 * 1024, 1} },
12184 .block_erase = erase_chip_block_jedec,
12185 },
12186 },
12187 .write = write_jedec_1,
12188 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012189 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012190 },
12191
12192 {
12193 .vendor = "SyncMOS/MoselVitelic",
12194 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012195 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012196 .manufacture_id = SYNCMOS_MVC_ID,
12197 .model_id = SM_MVC_29C31004T,
12198 .total_size = 512,
12199 .page_size = 1024,
12200 .feature_bits = FEATURE_EITHER_RESET,
12201 .tested = TEST_UNTESTED,
12202 .probe = probe_jedec,
12203 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12204 .block_erasers =
12205 {
12206 {
12207 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012208 .block_erase = erase_sector_jedec,
12209 }, {
12210 .eraseblocks = { {512 * 1024, 1} },
12211 .block_erase = erase_chip_block_jedec,
12212 },
12213 },
Sean Nelson35727f72010-01-28 23:55:12 +000012214 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012215 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012216 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012217 },
12218
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012219 {
Uwe Hermanna106d152009-05-27 23:17:40 +000012220 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012221 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012222 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012223 .manufacture_id = TI_OLD_ID,
12224 .model_id = TI_TMS29F002RB,
12225 .total_size = 256,
12226 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000012227 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012228 .tested = TEST_UNTESTED,
12229 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012230 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012231 .block_erasers =
12232 {
12233 {
12234 .eraseblocks = {
12235 {16 * 1024, 1},
12236 {8 * 1024, 2},
12237 {32 * 1024, 1},
12238 {64 * 1024, 3},
12239 },
12240 .block_erase = erase_sector_jedec,
12241 }, {
12242 .eraseblocks = { {256 * 1024, 1} },
12243 .block_erase = erase_chip_block_jedec,
12244 },
12245 },
Sean Nelson35727f72010-01-28 23:55:12 +000012246 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012247 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012248 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012249 },
12250
12251 {
Uwe Hermanna106d152009-05-27 23:17:40 +000012252 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012253 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012254 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012255 .manufacture_id = TI_OLD_ID,
12256 .model_id = TI_TMS29F002RT,
12257 .total_size = 256,
12258 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000012259 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012260 .tested = TEST_UNTESTED,
12261 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012262 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012263 .block_erasers =
12264 {
12265 {
12266 .eraseblocks = {
12267 {64 * 1024, 3},
12268 {32 * 1024, 1},
12269 {8 * 1024, 2},
12270 {16 * 1024, 1},
12271 },
12272 .block_erase = erase_sector_jedec,
12273 }, {
12274 .eraseblocks = { {256 * 1024, 1} },
12275 .block_erase = erase_chip_block_jedec,
12276 },
12277 },
Sean Nelson35727f72010-01-28 23:55:12 +000012278 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012279 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012280 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012281 },
12282
12283 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012284 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012285 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012286 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012287 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012288 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012289 .total_size = 1024,
12290 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012291 /* supports SFDP */
12292 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012293 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000012294 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012295 .probe = probe_spi_rdid,
12296 .probe_timing = TIMING_ZERO,
12297 .block_erasers =
12298 {
12299 {
12300 .eraseblocks = { {4 * 1024, 256} },
12301 .block_erase = spi_block_erase_20,
12302 }, {
12303 .eraseblocks = { {32 * 1024, 32} },
12304 .block_erase = spi_block_erase_52,
12305 }, {
12306 .eraseblocks = { {64 * 1024, 16} },
12307 .block_erase = spi_block_erase_d8,
12308 }, {
12309 .eraseblocks = { {1024 * 1024, 1} },
12310 .block_erase = spi_block_erase_60,
12311 }, {
12312 .eraseblocks = { {1024 * 1024, 1} },
12313 .block_erase = spi_block_erase_c7,
12314 }
12315 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012316 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012317 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012318 .write = spi_chip_write_256,
12319 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012320 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000012321 },
12322
12323 {
12324 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012325 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012326 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012327 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012328 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012329 .total_size = 2048,
12330 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012331 /* supports SFDP */
12332 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000012334 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012335 .probe = probe_spi_rdid,
12336 .probe_timing = TIMING_ZERO,
12337 .block_erasers =
12338 {
12339 {
12340 .eraseblocks = { {4 * 1024, 512} },
12341 .block_erase = spi_block_erase_20,
12342 }, {
12343 .eraseblocks = { {32 * 1024, 64} },
12344 .block_erase = spi_block_erase_52,
12345 }, {
12346 .eraseblocks = { {64 * 1024, 32} },
12347 .block_erase = spi_block_erase_d8,
12348 }, {
12349 .eraseblocks = { {2 * 1024 * 1024, 1} },
12350 .block_erase = spi_block_erase_60,
12351 }, {
12352 .eraseblocks = { {2 * 1024 * 1024, 1} },
12353 .block_erase = spi_block_erase_c7,
12354 }
12355 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012356 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012357 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012358 .write = spi_chip_write_256,
12359 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012360 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000012361 },
12362
12363 {
12364 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012365 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012366 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012367 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012368 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012369 .total_size = 4096,
12370 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012371 /* supports SFDP */
12372 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012373 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000012374 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012375 .probe = probe_spi_rdid,
12376 .probe_timing = TIMING_ZERO,
12377 .block_erasers =
12378 {
12379 {
12380 .eraseblocks = { {4 * 1024, 1024} },
12381 .block_erase = spi_block_erase_20,
12382 }, {
12383 .eraseblocks = { {32 * 1024, 128} },
12384 .block_erase = spi_block_erase_52,
12385 }, {
12386 .eraseblocks = { {64 * 1024, 64} },
12387 .block_erase = spi_block_erase_d8,
12388 }, {
12389 .eraseblocks = { {4 * 1024 * 1024, 1} },
12390 .block_erase = spi_block_erase_60,
12391 }, {
12392 .eraseblocks = { {4 * 1024 * 1024, 1} },
12393 .block_erase = spi_block_erase_c7,
12394 }
12395 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012396 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012397 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012398 .write = spi_chip_write_256,
12399 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012400 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000012401 },
12402
12403 {
12404 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012405 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012406 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000012407 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012408 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000012409 .total_size = 8192,
12410 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012411 /* supports SFDP */
12412 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000012414 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000012415 .probe = probe_spi_rdid,
12416 .probe_timing = TIMING_ZERO,
12417 .block_erasers =
12418 {
12419 {
12420 .eraseblocks = { {4 * 1024, 2048} },
12421 .block_erase = spi_block_erase_20,
12422 }, {
12423 .eraseblocks = { {32 * 1024, 256} },
12424 .block_erase = spi_block_erase_52,
12425 }, {
12426 .eraseblocks = { {64 * 1024, 128} },
12427 .block_erase = spi_block_erase_d8,
12428 }, {
12429 .eraseblocks = { {8 * 1024 * 1024, 1} },
12430 .block_erase = spi_block_erase_60,
12431 }, {
12432 .eraseblocks = { {8 * 1024 * 1024, 1} },
12433 .block_erase = spi_block_erase_c7,
12434 }
12435 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012436 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012437 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000012438 .write = spi_chip_write_256,
12439 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012440 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000012441 },
12442
12443 {
12444 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012445 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012446 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012447 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012448 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012449 .total_size = 16384,
12450 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012451 /* supports SFDP */
12452 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012453 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012454 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012455 .probe = probe_spi_rdid,
12456 .probe_timing = TIMING_ZERO,
12457 .block_erasers =
12458 {
12459 {
12460 .eraseblocks = { {4 * 1024, 4096} },
12461 .block_erase = spi_block_erase_20,
12462 }, {
12463 .eraseblocks = { {32 * 1024, 512} },
12464 .block_erase = spi_block_erase_52,
12465 }, {
12466 .eraseblocks = { {64 * 1024, 256} },
12467 .block_erase = spi_block_erase_d8,
12468 }, {
12469 .eraseblocks = { {16 * 1024 * 1024, 1} },
12470 .block_erase = spi_block_erase_60,
12471 }, {
12472 .eraseblocks = { {16 * 1024 * 1024, 1} },
12473 .block_erase = spi_block_erase_c7,
12474 }
12475 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012476 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000012477 .unlock = spi_disable_blockprotect,
12478 .write = spi_chip_write_256,
12479 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012480 .voltage = {2700, 3600},
12481 },
12482
12483 {
12484 .vendor = "Winbond",
12485 .name = "W25Q20.W",
12486 .bustype = BUS_SPI,
12487 .manufacture_id = WINBOND_NEX_ID,
12488 .model_id = WINBOND_NEX_W25Q20_W,
12489 .total_size = 256,
12490 .page_size = 256,
12491 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12492 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12493 .tested = TEST_UNTESTED,
12494 .probe = probe_spi_rdid,
12495 .probe_timing = TIMING_ZERO,
12496 .block_erasers =
12497 {
12498 {
12499 .eraseblocks = { {4 * 1024, 64} },
12500 .block_erase = spi_block_erase_20,
12501 }, {
12502 .eraseblocks = { {32 * 1024, 8} },
12503 .block_erase = spi_block_erase_52,
12504 }, {
12505 .eraseblocks = { {64 * 1024, 4} },
12506 .block_erase = spi_block_erase_d8,
12507 }, {
12508 .eraseblocks = { {256 * 1024, 1} },
12509 .block_erase = spi_block_erase_60,
12510 }, {
12511 .eraseblocks = { {256 * 1024, 1} },
12512 .block_erase = spi_block_erase_c7,
12513 }
12514 },
12515 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12516 .unlock = spi_disable_blockprotect,
12517 .write = spi_chip_write_256,
12518 .read = spi_chip_read,
12519 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
12520 },
12521
12522 {
12523 .vendor = "Winbond",
12524 .name = "W25Q40.W",
12525 .bustype = BUS_SPI,
12526 .manufacture_id = WINBOND_NEX_ID,
12527 .model_id = WINBOND_NEX_W25Q40_W,
12528 .total_size = 512,
12529 .page_size = 256,
12530 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12531 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12532 .tested = TEST_UNTESTED,
12533 .probe = probe_spi_rdid,
12534 .probe_timing = TIMING_ZERO,
12535 .block_erasers =
12536 {
12537 {
12538 .eraseblocks = { {4 * 1024, 128} },
12539 .block_erase = spi_block_erase_20,
12540 }, {
12541 .eraseblocks = { {32 * 1024, 16} },
12542 .block_erase = spi_block_erase_52,
12543 }, {
12544 .eraseblocks = { {64 * 1024, 8} },
12545 .block_erase = spi_block_erase_d8,
12546 }, {
12547 .eraseblocks = { {512 * 1024, 1} },
12548 .block_erase = spi_block_erase_60,
12549 }, {
12550 .eraseblocks = { {512 * 1024, 1} },
12551 .block_erase = spi_block_erase_c7,
12552 }
12553 },
12554 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12555 .unlock = spi_disable_blockprotect,
12556 .write = spi_chip_write_256,
12557 .read = spi_chip_read,
12558 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
12559 },
12560
12561 {
12562 .vendor = "Winbond",
12563 .name = "W25Q80.W",
12564 .bustype = BUS_SPI,
12565 .manufacture_id = WINBOND_NEX_ID,
12566 .model_id = WINBOND_NEX_W25Q80_W,
12567 .total_size = 1024,
12568 .page_size = 256,
12569 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12570 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12571 .tested = TEST_UNTESTED,
12572 .probe = probe_spi_rdid,
12573 .probe_timing = TIMING_ZERO,
12574 .block_erasers =
12575 {
12576 {
12577 .eraseblocks = { {4 * 1024, 256} },
12578 .block_erase = spi_block_erase_20,
12579 }, {
12580 .eraseblocks = { {32 * 1024, 32} },
12581 .block_erase = spi_block_erase_52,
12582 }, {
12583 .eraseblocks = { {64 * 1024, 16} },
12584 .block_erase = spi_block_erase_d8,
12585 }, {
12586 .eraseblocks = { {1 * 1024 * 1024, 1} },
12587 .block_erase = spi_block_erase_60,
12588 }, {
12589 .eraseblocks = { {1 * 1024 * 1024, 1} },
12590 .block_erase = spi_block_erase_c7,
12591 }
12592 },
12593 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12594 .unlock = spi_disable_blockprotect,
12595 .write = spi_chip_write_256,
12596 .read = spi_chip_read,
12597 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
12598 },
12599
12600 {
12601 .vendor = "Winbond",
12602 .name = "W25Q16.W",
12603 .bustype = BUS_SPI,
12604 .manufacture_id = WINBOND_NEX_ID,
12605 .model_id = WINBOND_NEX_W25Q16_W,
12606 .total_size = 2048,
12607 .page_size = 256,
12608 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12609 /* QPI enable 0x38, disable 0xFF */
12610 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
12611 .tested = TEST_UNTESTED,
12612 .probe = probe_spi_rdid,
12613 .probe_timing = TIMING_ZERO,
12614 .block_erasers =
12615 {
12616 {
12617 .eraseblocks = { {4 * 1024, 512} },
12618 .block_erase = spi_block_erase_20,
12619 }, {
12620 .eraseblocks = { {32 * 1024, 64} },
12621 .block_erase = spi_block_erase_52,
12622 }, {
12623 .eraseblocks = { {64 * 1024, 32} },
12624 .block_erase = spi_block_erase_d8,
12625 }, {
12626 .eraseblocks = { {2 * 1024 * 1024, 1} },
12627 .block_erase = spi_block_erase_60,
12628 }, {
12629 .eraseblocks = { {2 * 1024 * 1024, 1} },
12630 .block_erase = spi_block_erase_c7,
12631 }
12632 },
12633 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12634 .unlock = spi_disable_blockprotect,
12635 .write = spi_chip_write_256,
12636 .read = spi_chip_read,
12637 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
12638 },
12639
12640 {
12641 .vendor = "Winbond",
12642 .name = "W25Q32.W",
12643 .bustype = BUS_SPI,
12644 .manufacture_id = WINBOND_NEX_ID,
12645 .model_id = WINBOND_NEX_W25Q32_W,
12646 .total_size = 4096,
12647 .page_size = 256,
12648 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12649 /* QPI enable 0x38, disable 0xFF */
12650 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
12651 .tested = TEST_OK_PREW,
12652 .probe = probe_spi_rdid,
12653 .probe_timing = TIMING_ZERO,
12654 .block_erasers =
12655 {
12656 {
12657 .eraseblocks = { {4 * 1024, 1024} },
12658 .block_erase = spi_block_erase_20,
12659 }, {
12660 .eraseblocks = { {32 * 1024, 128} },
12661 .block_erase = spi_block_erase_52,
12662 }, {
12663 .eraseblocks = { {64 * 1024, 64} },
12664 .block_erase = spi_block_erase_d8,
12665 }, {
12666 .eraseblocks = { {4 * 1024 * 1024, 1} },
12667 .block_erase = spi_block_erase_60,
12668 }, {
12669 .eraseblocks = { {4 * 1024 * 1024, 1} },
12670 .block_erase = spi_block_erase_c7,
12671 }
12672 },
12673 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12674 .unlock = spi_disable_blockprotect,
12675 .write = spi_chip_write_256,
12676 .read = spi_chip_read,
12677 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
12678 },
12679
12680 {
12681 .vendor = "Winbond",
12682 .name = "W25Q64.W",
12683 .bustype = BUS_SPI,
12684 .manufacture_id = WINBOND_NEX_ID,
12685 .model_id = WINBOND_NEX_W25Q64_W,
12686 .total_size = 8192,
12687 .page_size = 256,
12688 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12689 /* QPI enable 0x38, disable 0xFF */
12690 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012691 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012692 .probe = probe_spi_rdid,
12693 .probe_timing = TIMING_ZERO,
12694 .block_erasers =
12695 {
12696 {
12697 .eraseblocks = { {4 * 1024, 2048} },
12698 .block_erase = spi_block_erase_20,
12699 }, {
12700 .eraseblocks = { {32 * 1024, 256} },
12701 .block_erase = spi_block_erase_52,
12702 }, {
12703 .eraseblocks = { {64 * 1024, 128} },
12704 .block_erase = spi_block_erase_d8,
12705 }, {
12706 .eraseblocks = { {8 * 1024 * 1024, 1} },
12707 .block_erase = spi_block_erase_60,
12708 }, {
12709 .eraseblocks = { {8 * 1024 * 1024, 1} },
12710 .block_erase = spi_block_erase_c7,
12711 }
12712 },
12713 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12714 .unlock = spi_disable_blockprotect,
12715 .write = spi_chip_write_256,
12716 .read = spi_chip_read,
12717 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000012718 },
12719
12720 {
12721 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012722 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012723 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012724 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012725 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012726 .total_size = 128,
12727 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012728 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012729 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012730 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012731 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012732 .block_erasers =
12733 {
12734 {
12735 .eraseblocks = { {4 * 1024, 32} },
12736 .block_erase = spi_block_erase_20,
12737 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012738 .eraseblocks = { {64 * 1024, 2} },
12739 .block_erase = spi_block_erase_d8,
12740 }, {
12741 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012742 .block_erase = spi_block_erase_c7,
12743 }
12744 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012745 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012746 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012747 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012748 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012749 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012750 },
12751
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012752 {
12753 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012754 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012755 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012756 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012757 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012758 .total_size = 256,
12759 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012760 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012761 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012762 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012763 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012764 .block_erasers =
12765 {
12766 {
12767 .eraseblocks = { {4 * 1024, 64} },
12768 .block_erase = spi_block_erase_20,
12769 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012770 .eraseblocks = { {64 * 1024, 4} },
12771 .block_erase = spi_block_erase_d8,
12772 }, {
12773 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012774 .block_erase = spi_block_erase_c7,
12775 }
12776 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012777 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012778 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012779 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012780 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012781 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012782 },
12783
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012784 {
12785 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012786 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012787 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012788 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012789 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012790 .total_size = 512,
12791 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012792 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000012793 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012794 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012795 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012796 .block_erasers =
12797 {
12798 {
12799 .eraseblocks = { {4 * 1024, 128} },
12800 .block_erase = spi_block_erase_20,
12801 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012802 .eraseblocks = { {64 * 1024, 8} },
12803 .block_erase = spi_block_erase_d8,
12804 }, {
12805 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012806 .block_erase = spi_block_erase_c7,
12807 }
12808 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012809 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012810 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012811 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012812 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012813 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012814 },
12815
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012816 {
12817 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012818 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012819 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012820 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012821 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012822 .total_size = 1024,
12823 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012824 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000012825 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012826 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012827 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012828 .block_erasers =
12829 {
12830 {
12831 .eraseblocks = { {4 * 1024, 256} },
12832 .block_erase = spi_block_erase_20,
12833 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012834 .eraseblocks = { {64 * 1024, 16} },
12835 .block_erase = spi_block_erase_d8,
12836 }, {
12837 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012838 .block_erase = spi_block_erase_c7,
12839 }
12840 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012841 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012842 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012843 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012844 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012845 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012846 },
12847
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012848 {
12849 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012850 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012851 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000012852 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012853 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000012854 .total_size = 2048,
12855 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012856 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000012857 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000012858 .probe = probe_spi_rdid,
12859 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012860 .block_erasers =
12861 {
12862 {
12863 .eraseblocks = { {4 * 1024, 512} },
12864 .block_erase = spi_block_erase_20,
12865 }, {
12866 .eraseblocks = { {32 * 1024, 64} },
12867 .block_erase = spi_block_erase_52,
12868 }, {
12869 .eraseblocks = { {64 * 1024, 32} },
12870 .block_erase = spi_block_erase_d8,
12871 }, {
12872 .eraseblocks = { {2 * 1024 * 1024, 1} },
12873 .block_erase = spi_block_erase_60,
12874 }, {
12875 .eraseblocks = { {2 * 1024 * 1024, 1} },
12876 .block_erase = spi_block_erase_c7,
12877 }
12878 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012879 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012880 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000012881 .write = spi_chip_write_256,
12882 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012883 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000012884 },
12885
12886 {
12887 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012888 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012889 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000012890 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012891 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000012892 .total_size = 4096,
12893 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012894 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012895 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000012896 .probe = probe_spi_rdid,
12897 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012898 .block_erasers =
12899 {
12900 {
12901 .eraseblocks = { {4 * 1024, 1024} },
12902 .block_erase = spi_block_erase_20,
12903 }, {
12904 .eraseblocks = { {32 * 1024, 128} },
12905 .block_erase = spi_block_erase_52,
12906 }, {
12907 .eraseblocks = { {64 * 1024, 64} },
12908 .block_erase = spi_block_erase_d8,
12909 }, {
12910 .eraseblocks = { {4 * 1024 * 1024, 1} },
12911 .block_erase = spi_block_erase_60,
12912 }, {
12913 .eraseblocks = { {4 * 1024 * 1024, 1} },
12914 .block_erase = spi_block_erase_c7,
12915 }
12916 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012917 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012918 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000012919 .write = spi_chip_write_256,
12920 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012921 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000012922 },
12923
12924 {
12925 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012926 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012927 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000012928 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012929 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000012930 .total_size = 8192,
12931 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000012932 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012933 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000012934 .probe = probe_spi_rdid,
12935 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012936 .block_erasers =
12937 {
12938 {
12939 .eraseblocks = { {4 * 1024, 2048} },
12940 .block_erase = spi_block_erase_20,
12941 }, {
12942 .eraseblocks = { {32 * 1024, 256} },
12943 .block_erase = spi_block_erase_52,
12944 }, {
12945 .eraseblocks = { {64 * 1024, 128} },
12946 .block_erase = spi_block_erase_d8,
12947 }, {
12948 .eraseblocks = { {8 * 1024 * 1024, 1} },
12949 .block_erase = spi_block_erase_60,
12950 }, {
12951 .eraseblocks = { {8 * 1024 * 1024, 1} },
12952 .block_erase = spi_block_erase_c7,
12953 }
12954 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000012955 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012956 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000012957 .write = spi_chip_write_256,
12958 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012959 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000012960 },
12961
12962 {
12963 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000012964 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012965 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000012966 .manufacture_id = WINBOND_ID,
12967 .model_id = WINBOND_W29C010,
12968 .total_size = 128,
12969 .page_size = 128,
12970 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012971 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000012972 .probe = probe_w29ee011,
12973 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
12974 .block_erasers =
12975 {
12976 {
12977 .eraseblocks = { {128 * 1024, 1} },
12978 .block_erase = erase_chip_block_jedec,
12979 }
12980 },
12981 .write = write_jedec,
12982 .read = read_memmapped,
12983 },
12984
12985 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
12986 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012987 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012988 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012989 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012990 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012991 .total_size = 128,
12992 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012993 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000012994 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012995 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012996 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012997 .block_erasers =
12998 {
12999 {
13000 .eraseblocks = { {128 * 1024, 1} },
13001 .block_erase = erase_chip_block_jedec,
13002 }
13003 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013004 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013005 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000013006 },
13007
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013008 {
13009 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013010 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013011 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013012 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013013 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013014 .total_size = 256,
13015 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013016 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013017 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013018 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013019 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013020 .block_erasers =
13021 {
13022 {
13023 .eraseblocks = { {256 * 1024, 1} },
13024 .block_erase = erase_chip_block_jedec,
13025 }
13026 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013027 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013028 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013029 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013030 },
13031
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013032 {
13033 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013034 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013035 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013036 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013037 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013038 .total_size = 512,
13039 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013040 .feature_bits = FEATURE_LONG_RESET,
13041 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013042 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013043 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013044 .block_erasers =
13045 {
13046 {
13047 .eraseblocks = { {512 * 1024, 1} },
13048 .block_erase = erase_chip_block_jedec,
13049 }
13050 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013051 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013052 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013053 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013054 },
13055
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013056 {
13057 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000013058 .name = "W39F010",
13059 .bustype = BUS_PARALLEL,
13060 .manufacture_id = WINBOND_ID,
13061 .model_id = WINBOND_W39F010,
13062 .total_size = 128,
13063 .page_size = 4 * 1024,
13064 .feature_bits = FEATURE_EITHER_RESET,
13065 .tested = TEST_OK_PREW,
13066 .probe = probe_jedec,
13067 .probe_timing = 10,
13068 .block_erasers =
13069 {
13070 {
13071 .eraseblocks = { {4 * 1024, 32} },
13072 .block_erase = erase_block_jedec,
13073 }, {
13074 .eraseblocks = { {128 * 1024, 1} },
13075 .block_erase = erase_chip_block_jedec,
13076 }
13077 },
13078 .printlock = printlock_w39f010,
13079 .write = write_jedec_1,
13080 .read = read_memmapped,
13081 .voltage = {4500, 5500},
13082 },
13083
13084 {
13085 .vendor = "Winbond",
13086 .name = "W39L010",
13087 .bustype = BUS_PARALLEL,
13088 .manufacture_id = WINBOND_ID,
13089 .model_id = WINBOND_W39L010,
13090 .total_size = 128,
13091 .page_size = 4 * 1024,
13092 .feature_bits = FEATURE_EITHER_RESET,
13093 .tested = TEST_UNTESTED,
13094 .probe = probe_jedec,
13095 .probe_timing = 10,
13096 .block_erasers =
13097 {
13098 {
13099 .eraseblocks = { {4 * 1024, 32} },
13100 .block_erase = erase_block_jedec,
13101 }, {
13102 .eraseblocks = { {128 * 1024, 1} },
13103 .block_erase = erase_chip_block_jedec,
13104 }
13105 },
13106 .printlock = printlock_w39l010,
13107 .write = write_jedec_1,
13108 .read = read_memmapped,
13109 .voltage = {3000, 3600},
13110 },
13111
13112 {
13113 .vendor = "Winbond",
13114 .name = "W39L020",
13115 .bustype = BUS_PARALLEL,
13116 .manufacture_id = WINBOND_ID,
13117 .model_id = WINBOND_W39L020,
13118 .total_size = 256,
13119 .page_size = 4 * 1024,
13120 .feature_bits = FEATURE_EITHER_RESET,
13121 .tested = TEST_UNTESTED,
13122 .probe = probe_jedec,
13123 .probe_timing = 10,
13124 .block_erasers =
13125 {
13126 {
13127 .eraseblocks = { {4 * 1024, 64} },
13128 .block_erase = erase_block_jedec,
13129 }, {
13130 .eraseblocks = { {64 * 1024, 4} },
13131 .block_erase = erase_sector_jedec,
13132 }, {
13133 .eraseblocks = { {256 * 1024, 1} },
13134 .block_erase = erase_chip_block_jedec,
13135 }
13136 },
13137 .printlock = printlock_w39l020,
13138 .write = write_jedec_1,
13139 .read = read_memmapped,
13140 .voltage = {3000, 3600},
13141 },
13142
13143 {
13144 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000013145 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013146 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000013147 .manufacture_id = WINBOND_ID,
13148 .model_id = WINBOND_W39L040,
13149 .total_size = 512,
13150 .page_size = 64 * 1024,
13151 .feature_bits = FEATURE_EITHER_RESET,
13152 .tested = TEST_OK_PR,
13153 .probe = probe_jedec,
13154 .probe_timing = 10,
13155 .block_erasers =
13156 {
13157 {
13158 .eraseblocks = { {4 * 1024, 128} },
13159 .block_erase = erase_block_jedec,
13160 }, {
13161 .eraseblocks = { {64 * 1024, 8} },
13162 .block_erase = erase_sector_jedec,
13163 }, {
13164 .eraseblocks = { {512 * 1024, 1} },
13165 .block_erase = erase_chip_block_jedec,
13166 }
13167 },
13168 .printlock = printlock_w39l040,
13169 .write = write_jedec_1,
13170 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013171 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000013172 },
13173
13174 {
13175 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013176 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013177 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013178 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013179 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013180 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000013181 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013182 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000013183 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013184 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000013185 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013186 .block_erasers =
13187 {
13188 {
13189 .eraseblocks = { {64 * 1024, 8} },
13190 .block_erase = erase_sector_jedec,
13191 }, {
13192 .eraseblocks = { {512 * 1024, 1} },
13193 .block_erase = erase_chip_block_jedec,
13194 }
13195 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013196 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000013197 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013198 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013199 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013200 },
13201
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013202 {
13203 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013204 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013205 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013206 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013207 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013208 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000013209 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013210 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013211 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013212 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000013213 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013214 .block_erasers =
13215 {
13216 {
13217 .eraseblocks = { {64 * 1024, 8} },
13218 .block_erase = erase_sector_jedec,
13219 }, {
13220 .eraseblocks = { {512 * 1024, 1} },
13221 .block_erase = erase_chip_block_jedec,
13222 }
13223 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013224 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000013225 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013226 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013227 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013228 },
13229
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013230 {
13231 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013232 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013233 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013234 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013235 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013236 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000013237 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013238 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013239 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000013240 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013241 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013242 .block_erasers =
13243 {
13244 {
13245 .eraseblocks = { {64 * 1024, 8} },
13246 .block_erase = erase_sector_jedec,
13247 }, {
13248 .eraseblocks = { {512 * 1024, 1} },
13249 .block_erase = erase_chip_block_jedec,
13250 }
13251 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000013252 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000013253 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013254 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013255 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013256 },
13257
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013258 {
13259 .vendor = "Winbond",
13260 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013261 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013262 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013263 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013264 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000013265 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000013266 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013267 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013268 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013269 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013270 .block_erasers =
13271 {
13272 {
13273 .eraseblocks = { {4 * 1024, 128} },
13274 .block_erase = erase_block_jedec,
13275 }, {
13276 .eraseblocks = { {64 * 1024, 8} },
13277 .block_erase = erase_sector_jedec,
13278 }, {
13279 .eraseblocks = { {512 * 1024, 1} },
13280 .block_erase = erase_chip_block_jedec,
13281 }
13282 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013283 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013284 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000013285 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013286 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013287 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013288 },
13289
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013290 {
13291 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013292 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013293 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013294 .manufacture_id = WINBOND_ID,
13295 .model_id = WINBOND_W39V040B,
13296 .total_size = 512,
13297 .page_size = 64 * 1024,
13298 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013299 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013300 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013301 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013302 .block_erasers =
13303 {
13304 {
13305 .eraseblocks = { {64 * 1024, 8} },
13306 .block_erase = erase_sector_jedec,
13307 }, {
13308 .eraseblocks = { {512 * 1024, 1} },
13309 .block_erase = erase_chip_block_jedec,
13310 }
13311 },
13312 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013313 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013314 .write = write_jedec_1,
13315 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013316 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013317 },
13318
13319 {
13320 .vendor = "Winbond",
13321 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013322 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013323 .manufacture_id = WINBOND_ID,
13324 .model_id = WINBOND_W39V040C,
13325 .total_size = 512,
13326 .page_size = 64 * 1024,
13327 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000013328 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013329 .probe = probe_jedec,
13330 .probe_timing = 10,
13331 .block_erasers =
13332 {
13333 {
13334 .eraseblocks = { {64 * 1024, 8} },
13335 .block_erase = erase_sector_jedec,
13336 }, {
13337 .eraseblocks = { {512 * 1024, 1} },
13338 .block_erase = erase_chip_block_jedec,
13339 }
13340 },
13341 .printlock = printlock_w39v040fc,
13342 .write = write_jedec_1,
13343 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013344 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013345 },
13346
13347 {
13348 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013349 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013350 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013351 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013352 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013353 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000013354 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013355 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000013356 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013357 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000013358 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013359 .block_erasers =
13360 {
13361 {
13362 .eraseblocks = { {64 * 1024, 16} },
13363 .block_erase = erase_sector_jedec,
13364 }, {
13365 .eraseblocks = { {1024 * 1024, 1} },
13366 .block_erase = erase_chip_block_jedec,
13367 }
13368 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013369 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000013370 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013371 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013372 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013373 },
13374
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013375 {
13376 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013377 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013378 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013379 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013380 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013381 .total_size = 256,
13382 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013383 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000013384 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013385 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013386 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013387 .block_erasers =
13388 {
13389 {
13390 .eraseblocks = {
13391 {128 * 1024, 1},
13392 {96 * 1024, 1},
13393 {8 * 1024, 2},
13394 {16 * 1024, 1},
13395 },
13396 .block_erase = erase_sector_jedec,
13397 }, {
13398 .eraseblocks = { {256 * 1024, 1} },
13399 .block_erase = erase_chip_block_jedec,
13400 }
13401 },
Sean Nelson35727f72010-01-28 23:55:12 +000013402 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013403 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013404 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013405 },
13406
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013407 {
13408 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000013409 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013410 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000013411 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013412 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000013413 .total_size = 256,
13414 .page_size = 128,
13415 .feature_bits = FEATURE_EITHER_RESET,
13416 .tested = TEST_OK_PROBE,
13417 .probe = probe_jedec,
13418 .probe_timing = 10,
13419 .block_erasers =
13420 {
13421 {
13422 .eraseblocks = { {256 * 1024, 1} },
13423 .block_erase = erase_chip_block_jedec,
13424 }
13425 },
13426 .write = write_jedec_1,
13427 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013428 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000013429 },
13430
13431 {
13432 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013433 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013434 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013435 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013436 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013437 .total_size = 256,
13438 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013439 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013440 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013441 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013442 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013443 .block_erasers =
13444 {
13445 {
13446 .eraseblocks = {
13447 {64 * 1024, 3},
13448 {32 * 1024, 1},
13449 {8 * 1024, 2},
13450 {16 * 1024, 1},
13451 },
13452 .block_erase = erase_sector_jedec,
13453 }, {
13454 .eraseblocks = { {256 * 1024, 1} },
13455 .block_erase = erase_chip_block_jedec,
13456 }
13457 },
Sean Nelson35727f72010-01-28 23:55:12 +000013458 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013459 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013460 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013461 },
13462
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013463 {
13464 .vendor = "Winbond",
13465 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013466 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013467 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013468 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013469 .total_size = 256,
13470 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013471 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000013472 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013473 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013474 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013475 .block_erasers =
13476 {
13477 {
13478 .eraseblocks = {
13479 {64 * 1024, 3},
13480 {32 * 1024, 1},
13481 {8 * 1024, 2},
13482 {16 * 1024, 1},
13483 },
13484 .block_erase = erase_sector_jedec,
13485 }, {
13486 .eraseblocks = { {256 * 1024, 1} },
13487 .block_erase = erase_chip_block_jedec,
13488 }
13489 },
Sean Nelson35727f72010-01-28 23:55:12 +000013490 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013491 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013492 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013493 },
13494
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013495 {
13496 .vendor = "Winbond",
13497 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013498 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013499 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013500 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013501 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000013502 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013503 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013504 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013505 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013506 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013507 .block_erasers =
13508 {
13509 {
13510 .eraseblocks = { {64 * 1024, 16}, },
13511 .block_erase = erase_sector_jedec,
13512 }, {
13513 .eraseblocks = { {1024 * 1024, 1} },
13514 .block_erase = erase_chip_block_jedec,
13515 }
13516 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013517 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013518 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000013519 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013520 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013521 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000013522 },
13523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013524 {
13525 .vendor = "Winbond",
13526 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013527 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013528 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013529 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013530 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000013531 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013532 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013533 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013534 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013535 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013536 .block_erasers =
13537 {
13538 {
13539 .eraseblocks = { {64 * 1024, 8}, },
13540 .block_erase = erase_sector_jedec,
13541 }, {
13542 .eraseblocks = { {512 * 1024, 1} },
13543 .block_erase = erase_chip_block_jedec,
13544 }
13545 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000013546 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000013547 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013548 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013549 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000013550 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000013551
13552 {
13553 .vendor = "Unknown",
13554 .name = "SFDP-capable chip",
13555 .bustype = BUS_SPI,
13556 .manufacture_id = GENERIC_MANUF_ID,
13557 .model_id = SFDP_DEVICE_ID,
13558 /* We present our own "report this" text hence we do not
13559 * want the default "This flash part has status UNTESTED..."
13560 * text to be printed. */
13561 .tested = TEST_OK_PREW,
13562 .probe = probe_spi_sfdp,
13563 .unlock = spi_disable_blockprotect, /* is this safe? */
13564 .read = spi_chip_read,
13565 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000013566 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000013567 /* Everything below will be set by the probing function. */
13568 .write = NULL,
13569 .total_size = 0,
13570 .page_size = 0,
13571 .feature_bits = 0,
13572 .block_erasers = {},
13573 },
FENG yu ningff692fb2008-12-08 18:15:10 +000013574
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013575 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000013576 .vendor = "Programmer",
13577 .name = "Opaque flash chip",
13578 .bustype = BUS_PROG,
13579 .manufacture_id = PROGMANUF_ID,
13580 .model_id = PROGDEV_ID,
13581 .total_size = 0,
13582 .page_size = 256,
13583 /* probe is assumed to work, rest will be filled in by probe */
13584 .tested = TEST_OK_PROBE,
13585 .probe = probe_opaque,
13586 /* eraseblock sizes will be set by the probing function */
13587 .block_erasers =
13588 {
13589 {
13590 .block_erase = erase_opaque,
13591 }
13592 },
13593 .write = write_opaque,
13594 .read = read_opaque,
13595 },
13596
13597 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000013598 .vendor = "AMIC",
13599 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013600 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000013601 .manufacture_id = AMIC_ID,
13602 .model_id = GENERIC_DEVICE_ID,
13603 .total_size = 0,
13604 .page_size = 256,
13605 .tested = TEST_BAD_PREW,
13606 .probe = probe_spi_rdid4,
13607 .probe_timing = TIMING_ZERO,
13608 .write = NULL,
13609 .read = NULL,
13610 },
13611
13612 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013613 .vendor = "Atmel",
13614 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013615 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013616 .manufacture_id = ATMEL_ID,
13617 .model_id = GENERIC_DEVICE_ID,
13618 .total_size = 0,
13619 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013620 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013621 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013622 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013623 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013624 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013625 },
13626
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013627 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000013628 .vendor = "Eon",
13629 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013630 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013631 .manufacture_id = EON_ID_NOPREFIX,
13632 .model_id = GENERIC_DEVICE_ID,
13633 .total_size = 0,
13634 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013635 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013636 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013637 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013638 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013639 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013640 },
13641
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013642 {
13643 .vendor = "Macronix",
13644 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013645 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013646 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013647 .model_id = GENERIC_DEVICE_ID,
13648 .total_size = 0,
13649 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013650 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013651 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013652 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013653 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013654 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013655 },
13656
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013657 {
13658 .vendor = "PMC",
13659 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013660 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013661 .manufacture_id = PMC_ID,
13662 .model_id = GENERIC_DEVICE_ID,
13663 .total_size = 0,
13664 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013665 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013666 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013667 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013668 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013669 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013670 },
13671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013672 {
13673 .vendor = "SST",
13674 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013676 .manufacture_id = SST_ID,
13677 .model_id = GENERIC_DEVICE_ID,
13678 .total_size = 0,
13679 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013680 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013681 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013682 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013683 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013684 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013685 },
13686
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013687 {
13688 .vendor = "ST",
13689 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013690 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013691 .manufacture_id = ST_ID,
13692 .model_id = GENERIC_DEVICE_ID,
13693 .total_size = 0,
13694 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000013695 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013696 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013697 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013698 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013699 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000013700 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000013701
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013702 {
Sean Nelson118e1d62009-11-24 02:08:11 +000013703 .vendor = "Sanyo",
13704 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013705 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000013706 .manufacture_id = SANYO_ID,
13707 .model_id = GENERIC_DEVICE_ID,
13708 .total_size = 0,
13709 .page_size = 256,
13710 .tested = TEST_BAD_PREW,
13711 .probe = probe_spi_rdid,
13712 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000013713 .write = NULL,
13714 .read = NULL,
13715 },
13716
13717 {
Stefan Taunereb582572012-09-21 12:52:50 +000013718 .vendor = "Winbond",
13719 .name = "unknown Winbond (ex Nexcom) SPI chip",
13720 .bustype = BUS_SPI,
13721 .manufacture_id = WINBOND_NEX_ID,
13722 .model_id = GENERIC_DEVICE_ID,
13723 .total_size = 0,
13724 .page_size = 256,
13725 .tested = TEST_BAD_PREW,
13726 .probe = probe_spi_rdid,
13727 .probe_timing = TIMING_ZERO,
13728 .write = NULL,
13729 .read = NULL,
13730 },
13731
13732 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013733 .vendor = "Generic",
13734 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013735 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013736 .manufacture_id = GENERIC_MANUF_ID,
13737 .model_id = GENERIC_DEVICE_ID,
13738 .total_size = 0,
13739 .page_size = 256,
13740 .tested = TEST_BAD_PREW,
13741 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013742 .write = NULL,
13743 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000013744
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013745 {
13746 .vendor = "Generic",
13747 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013748 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013749 .manufacture_id = GENERIC_MANUF_ID,
13750 .model_id = GENERIC_DEVICE_ID,
13751 .total_size = 0,
13752 .page_size = 256,
13753 .tested = TEST_BAD_PREW,
13754 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000013755 .write = NULL,
13756 },
13757
Stefan Tauner96658be2014-05-26 22:05:31 +000013758 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000013759};
Stefan Tauner96658be2014-05-26 22:05:31 +000013760
13761const unsigned int flashchips_size = ARRAY_SIZE(flashchips);