blob: a693290e854442b9dde19256fa87999d37b24cf9 [file] [log] [blame]
Ollie Lho184a4042005-11-26 21:55:36 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ollie Lho184a4042005-11-26 21:55:36 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
Stefan Reinauer4c390c82008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Sean Nelsonc57a9202010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Uwe Hermannd1107642007-08-29 17:52:32 +00009 *
Stefan Reinauerce532972007-05-23 17:20:56 +000010 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
Ollie Lho184a4042005-11-26 21:55:36 +000014 *
Stefan Reinauerce532972007-05-23 17:20:56 +000015 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
Ollie Lho184a4042005-11-26 21:55:36 +000019 *
Stefan Reinauerce532972007-05-23 17:20:56 +000020 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
Uwe Hermannd1107642007-08-29 17:52:32 +000022 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ollie Lho184a4042005-11-26 21:55:36 +000023 */
24
25#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000026#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000027#include "chipdrivers.h"
Ollie Lho184a4042005-11-26 21:55:36 +000028
Uwe Hermannfc425e82008-03-16 02:06:25 +000029/**
Uwe Hermanna9720402009-05-21 15:55:46 +000030 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000031 *
Stefan Tauner0554ca52013-07-25 22:54:25 +000032 * Please keep the list sorted by vendor name and chip family, so that the output of 'flashrom -L' is roughly
33 * alphabetically sorted. Within families keep them in order of density.
Uwe Hermannfc425e82008-03-16 02:06:25 +000034 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000035const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000036
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000037 /*
38 * .vendor = Vendor name
39 * .name = Chip name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000048 * .block_erasers[] = Array of erase layouts and erase functions
49 * {
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
52 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000053 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000055 * .write = Chip write function
56 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000057 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000058 */
59
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000060 {
61 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000062 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000064 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000065 .model_id = AMD_AM29F010B, /* Same as Am29F010A */
Uwe Hermanna8b37272009-06-19 15:54:39 +000066 .total_size = 128,
67 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000068 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000069 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000070 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000071 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000072 .block_erasers =
73 {
74 {
75 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000076 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000077 }, {
78 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000079 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000080 },
81 },
Sean Nelson35727f72010-01-28 23:55:12 +000082 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +000083 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000084 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +000085 },
86
87 {
88 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000089 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000090 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000091 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000092 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000093 .total_size = 256,
94 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000095 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000096 .tested = TEST_UNTESTED,
97 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000098 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000099 .block_erasers =
100 {
101 {
102 .eraseblocks = {
103 {16 * 1024, 1},
104 {8 * 1024, 2},
105 {32 * 1024, 1},
106 {64 * 1024, 3},
107 },
108 .block_erase = erase_sector_jedec,
109 }, {
110 .eraseblocks = { {256 * 1024, 1} },
111 .block_erase = erase_chip_block_jedec,
112 },
113 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000114 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000115 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000116 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000117 },
118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000119 {
120 .vendor = "AMD",
121 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000122 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000124 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000125 .total_size = 256,
126 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000127 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000129 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000130 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000131 .block_erasers =
132 {
133 {
134 .eraseblocks = {
135 {64 * 1024, 3},
136 {32 * 1024, 1},
137 {8 * 1024, 2},
138 {16 * 1024, 1},
139 },
140 .block_erase = erase_sector_jedec,
141 }, {
142 .eraseblocks = { {256 * 1024, 1} },
143 .block_erase = erase_chip_block_jedec,
144 },
145 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000146 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000147 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000148 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000149 },
150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000151 {
152 .vendor = "AMD",
153 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000154 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000155 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000156 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000157 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000158 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000159 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000160 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000161 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000162 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000163 .block_erasers =
164 {
165 {
166 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000167 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000168 }, {
169 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000170 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000171 },
172 },
Sean Nelson35727f72010-01-28 23:55:12 +0000173 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000175 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000176 },
177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 {
179 .vendor = "AMD",
180 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000181 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000182 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000183 .model_id = AMD_AM29F040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000184 .total_size = 512,
185 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187 .tested = TEST_UNTESTED,
188 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000189 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000190 .block_erasers =
191 {
192 {
193 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000195 }, {
196 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000197 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000198 },
199 },
Sean Nelson35727f72010-01-28 23:55:12 +0000200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000201 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000202 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000203 },
204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000205 {
206 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000207 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000208 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000209 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000210 .model_id = AMD_AM29F080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000211 .total_size = 1024,
212 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000213 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000216 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000217 .block_erasers =
218 {
219 {
220 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000221 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000222 }, {
223 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000224 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000225 },
226 },
Sean Nelson35727f72010-01-28 23:55:12 +0000227 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000229 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000230 },
231
232 {
233 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000234 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000235 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000236 .manufacture_id = AMD_ID,
237 .model_id = AMD_AM29LV001BB,
238 .total_size = 128,
239 .page_size = 64 * 1024, /* unused */
240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_OK_PREW,
242 .probe = probe_jedec,
243 .probe_timing = TIMING_ZERO,
244 .block_erasers =
245 {
246 {
247 .eraseblocks = {
248 {8 * 1024, 1},
249 {4 * 1024, 2},
250 {16 * 1024, 7},
251 },
252 .block_erase = erase_sector_jedec,
253 }, {
254 .eraseblocks = { {128 * 1024, 1} },
255 .block_erase = erase_chip_block_jedec,
256 },
257 },
258 .write = write_jedec_1,
259 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000260 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000261 },
262
263 {
264 .vendor = "AMD",
265 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000266 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000267 .manufacture_id = AMD_ID,
268 .model_id = AMD_AM29LV001BT,
269 .total_size = 128,
270 .page_size = 64 * 1024, /* unused */
271 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272 .tested = TEST_UNTESTED,
273 .probe = probe_jedec,
274 .probe_timing = TIMING_ZERO,
275 .block_erasers =
276 {
277 {
278 .eraseblocks = {
279 {16 * 1024, 7},
280 {4 * 1024, 2},
281 {8 * 1024, 1},
282 },
283 .block_erase = erase_sector_jedec,
284 }, {
285 .eraseblocks = { {128 * 1024, 1} },
286 .block_erase = erase_chip_block_jedec,
287 },
288 },
289 .write = write_jedec_1,
290 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000291 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000292 },
293
294 {
295 .vendor = "AMD",
296 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000297 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000298 .manufacture_id = AMD_ID,
299 .model_id = AMD_AM29LV002BB,
300 .total_size = 256,
301 .page_size = 64 * 1024, /* unused */
302 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303 .tested = TEST_UNTESTED,
304 .probe = probe_jedec,
305 .probe_timing = TIMING_ZERO,
306 .block_erasers =
307 {
308 {
309 .eraseblocks = {
310 {16 * 1024, 1},
311 {8 * 1024, 2},
312 {32 * 1024, 1},
313 {64 * 1024, 3},
314 },
315 .block_erase = erase_sector_jedec,
316 }, {
317 .eraseblocks = { {256 * 1024, 1} },
318 .block_erase = erase_chip_block_jedec,
319 },
320 },
321 .write = write_jedec_1,
322 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000323 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000324 },
325
326 {
327 .vendor = "AMD",
328 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000329 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000330 .manufacture_id = AMD_ID,
331 .model_id = AMD_AM29LV002BT,
332 .total_size = 256,
333 .page_size = 64 * 1024, /* unused */
334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335 .tested = TEST_UNTESTED,
336 .probe = probe_jedec,
337 .probe_timing = TIMING_ZERO,
338 .block_erasers =
339 {
340 {
341 .eraseblocks = {
342 {64 * 1024, 3},
343 {32 * 1024, 1},
344 {8 * 1024, 2},
345 {16 * 1024, 1},
346 },
347 .block_erase = erase_sector_jedec,
348 }, {
349 .eraseblocks = { {256 * 1024, 1} },
350 .block_erase = erase_chip_block_jedec,
351 },
352 },
353 .write = write_jedec_1,
354 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000355 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000356 },
357
358 {
359 .vendor = "AMD",
360 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000361 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000362 .manufacture_id = AMD_ID,
363 .model_id = AMD_AM29LV004BB,
364 .total_size = 512,
365 .page_size = 64 * 1024, /* unused */
366 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367 .tested = TEST_UNTESTED,
368 .probe = probe_jedec,
369 .probe_timing = TIMING_ZERO,
370 .block_erasers =
371 {
372 {
373 .eraseblocks = {
374 {16 * 1024, 1},
375 {8 * 1024, 2},
376 {32 * 1024, 1},
377 {64 * 1024, 7},
378 },
379 .block_erase = erase_sector_jedec,
380 }, {
381 .eraseblocks = { {512 * 1024, 1} },
382 .block_erase = erase_chip_block_jedec,
383 },
384 },
385 .write = write_jedec_1,
386 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000387 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000388 },
389
390 {
391 .vendor = "AMD",
392 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000393 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000394 .manufacture_id = AMD_ID,
395 .model_id = AMD_AM29LV004BT,
396 .total_size = 512,
397 .page_size = 64 * 1024, /* unused */
398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399 .tested = TEST_UNTESTED,
400 .probe = probe_jedec,
401 .probe_timing = TIMING_ZERO,
402 .block_erasers =
403 {
404 {
405 .eraseblocks = {
406 {64 * 1024, 7},
407 {32 * 1024, 1},
408 {8 * 1024, 2},
409 {16 * 1024, 1},
410 },
411 .block_erase = erase_sector_jedec,
412 }, {
413 .eraseblocks = { {512 * 1024, 1} },
414 .block_erase = erase_chip_block_jedec,
415 },
416 },
417 .write = write_jedec_1,
418 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000419 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000420 },
421
422 {
423 .vendor = "AMD",
424 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000425 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000426 .manufacture_id = AMD_ID,
427 .model_id = AMD_AM29LV008BB,
428 .total_size = 1024,
429 .page_size = 64 * 1024, /* unused */
430 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000431 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000432 .probe = probe_jedec,
433 .probe_timing = TIMING_ZERO,
434 .block_erasers =
435 {
436 {
437 .eraseblocks = {
438 {16 * 1024, 1},
439 {8 * 1024, 2},
440 {32 * 1024, 1},
441 {64 * 1024, 15},
442 },
443 .block_erase = erase_sector_jedec,
444 }, {
445 .eraseblocks = { {1024 * 1024, 1} },
446 .block_erase = erase_chip_block_jedec,
447 },
448 },
449 .write = write_jedec_1,
450 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000451 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000452 },
453
454 {
455 .vendor = "AMD",
456 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000457 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000458 .manufacture_id = AMD_ID,
459 .model_id = AMD_AM29LV008BT,
460 .total_size = 1024,
461 .page_size = 64 * 1024, /* unused */
462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463 .tested = TEST_UNTESTED,
464 .probe = probe_jedec,
465 .probe_timing = TIMING_ZERO,
466 .block_erasers =
467 {
468 {
469 .eraseblocks = {
470 {64 * 1024, 15},
471 {32 * 1024, 1},
472 {8 * 1024, 2},
473 {16 * 1024, 1},
474 },
475 .block_erase = erase_sector_jedec,
476 }, {
477 .eraseblocks = { {1024 * 1024, 1} },
478 .block_erase = erase_chip_block_jedec,
479 },
480 },
481 .write = write_jedec_1,
482 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000483 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000484 },
485
486 {
487 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000488 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000489 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000490 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000491 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000492 .total_size = 512,
493 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000495 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000496 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000497 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000498 .block_erasers =
499 {
500 {
501 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000502 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000503 }, {
504 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000505 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000506 },
507 },
Sean Nelson35727f72010-01-28 23:55:12 +0000508 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000509 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000510 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000511 },
512
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000513 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000514 .vendor = "AMD",
515 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000516 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000517 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000518 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000519 .total_size = 1024,
520 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000522 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000523 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000524 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000525 .block_erasers =
526 {
527 {
528 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000529 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000530 }, {
531 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000532 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000533 },
534 },
Sean Nelson35727f72010-01-28 23:55:12 +0000535 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000536 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000537 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000538 },
539
540 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000541 .vendor = "AMIC",
542 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000543 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000544 .manufacture_id = AMIC_ID,
545 .model_id = AMIC_A25L05PT,
546 .total_size = 64,
547 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000548 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000549 .tested = TEST_UNTESTED,
550 .probe = probe_spi_rdid4,
551 .probe_timing = TIMING_ZERO,
552 .block_erasers =
553 {
554 {
555 .eraseblocks = {
556 {32 * 1024, 1},
557 {16 * 1024, 1},
558 {8 * 1024, 1},
559 {4 * 1024, 2},
560 },
561 .block_erase = spi_block_erase_d8,
562 }, {
563 .eraseblocks = { {64 * 1024, 1} },
564 .block_erase = spi_block_erase_c7,
565 }
566 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000567 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000568 .unlock = spi_disable_blockprotect,
569 .write = spi_chip_write_256,
570 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000571 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000572 },
573
574 {
575 .vendor = "AMIC",
576 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000577 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000578 .manufacture_id = AMIC_ID,
579 .model_id = AMIC_A25L05PU,
580 .total_size = 64,
581 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000582 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000583 .tested = TEST_UNTESTED,
584 .probe = probe_spi_rdid4,
585 .probe_timing = TIMING_ZERO,
586 .block_erasers =
587 {
588 {
589 .eraseblocks = {
590 {4 * 1024, 2},
591 {8 * 1024, 1},
592 {16 * 1024, 1},
593 {32 * 1024, 1},
594 },
595 .block_erase = spi_block_erase_d8,
596 }, {
597 .eraseblocks = { {64 * 1024, 1} },
598 .block_erase = spi_block_erase_c7,
599 }
600 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000601 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000602 .unlock = spi_disable_blockprotect,
603 .write = spi_chip_write_256,
604 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000605 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000606 },
607
608 {
609 .vendor = "AMIC",
610 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000611 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000612 .manufacture_id = AMIC_ID,
613 .model_id = AMIC_A25L10PT,
614 .total_size = 128,
615 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000616 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000617 .tested = TEST_UNTESTED,
618 .probe = probe_spi_rdid4,
619 .probe_timing = TIMING_ZERO,
620 .block_erasers =
621 {
622 {
623 .eraseblocks = {
624 {64 * 1024, 1},
625 {32 * 1024, 1},
626 {16 * 1024, 1},
627 {8 * 1024, 1},
628 {4 * 1024, 2},
629 },
630 .block_erase = spi_block_erase_d8,
631 }, {
632 .eraseblocks = { {128 * 1024, 1} },
633 .block_erase = spi_block_erase_c7,
634 }
635 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000636 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000637 .unlock = spi_disable_blockprotect,
638 .write = spi_chip_write_256,
639 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000640 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000641 },
642
643 {
644 .vendor = "AMIC",
645 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000646 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000647 .manufacture_id = AMIC_ID,
648 .model_id = AMIC_A25L10PU,
649 .total_size = 128,
650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000652 .tested = TEST_UNTESTED,
653 .probe = probe_spi_rdid4,
654 .probe_timing = TIMING_ZERO,
655 .block_erasers =
656 {
657 {
658 .eraseblocks = {
659 {4 * 1024, 2},
660 {8 * 1024, 1},
661 {16 * 1024, 1},
662 {32 * 1024, 1},
663 {64 * 1024, 1},
664 },
665 .block_erase = spi_block_erase_d8,
666 }, {
667 .eraseblocks = { {128 * 1024, 1} },
668 .block_erase = spi_block_erase_c7,
669 }
670 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000671 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000672 .unlock = spi_disable_blockprotect,
673 .write = spi_chip_write_256,
674 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000675 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000676 },
677
678 {
679 .vendor = "AMIC",
680 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000681 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000682 .manufacture_id = AMIC_ID,
683 .model_id = AMIC_A25L20PT,
684 .total_size = 256,
685 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000686 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000687 .tested = TEST_UNTESTED,
688 .probe = probe_spi_rdid4,
689 .probe_timing = TIMING_ZERO,
690 .block_erasers =
691 {
692 {
693 .eraseblocks = {
694 {64 * 1024, 3},
695 {32 * 1024, 1},
696 {16 * 1024, 1},
697 {8 * 1024, 1},
698 {4 * 1024, 2},
699 },
700 .block_erase = spi_block_erase_d8,
701 }, {
702 .eraseblocks = { {256 * 1024, 1} },
703 .block_erase = spi_block_erase_c7,
704 }
705 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000706 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000710 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000711 },
712
713 {
714 .vendor = "AMIC",
715 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000716 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000717 .manufacture_id = AMIC_ID,
718 .model_id = AMIC_A25L20PU,
719 .total_size = 256,
720 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000721 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000722 .tested = TEST_UNTESTED,
723 .probe = probe_spi_rdid4,
724 .probe_timing = TIMING_ZERO,
725 .block_erasers =
726 {
727 {
728 .eraseblocks = {
729 {4 * 1024, 2},
730 {8 * 1024, 1},
731 {16 * 1024, 1},
732 {32 * 1024, 1},
733 {64 * 1024, 3},
734 },
735 .block_erase = spi_block_erase_d8,
736 }, {
737 .eraseblocks = { {256 * 1024, 1} },
738 .block_erase = spi_block_erase_c7,
739 }
740 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000741 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000742 .unlock = spi_disable_blockprotect,
743 .write = spi_chip_write_256,
744 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000745 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000746 },
747
748 /* The A25L40P{T,U} chips are distinguished by their
749 * erase block layouts, but without any distinction in RDID.
750 * This inexplicable quirk was verified by Rudolf Marek
751 * and discussed on the flashrom mailing list on 2010-07-12.
752 */
753 {
754 .vendor = "AMIC",
755 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000756 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000757 .manufacture_id = AMIC_ID,
758 .model_id = AMIC_A25L40PT,
759 .total_size = 512,
760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000761 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000762 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000763 .probe = probe_spi_rdid4,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = {
769 {64 * 1024, 7},
770 {32 * 1024, 1},
771 {16 * 1024, 1},
772 {8 * 1024, 1},
773 {4 * 1024, 2},
774 },
775 .block_erase = spi_block_erase_d8,
776 }, {
777 .eraseblocks = { {512 * 1024, 1} },
778 .block_erase = spi_block_erase_c7,
779 }
780 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000781 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000782 .unlock = spi_disable_blockprotect,
783 .write = spi_chip_write_256,
784 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000785 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000786 },
787
788 {
789 .vendor = "AMIC",
790 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000792 .manufacture_id = AMIC_ID,
793 .model_id = AMIC_A25L40PU,
794 .total_size = 512,
795 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000796 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000797 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000798 .probe = probe_spi_rdid4,
799 .probe_timing = TIMING_ZERO,
800 .block_erasers =
801 {
802 {
803 .eraseblocks = {
804 {4 * 1024, 2},
805 {8 * 1024, 1},
806 {16 * 1024, 1},
807 {32 * 1024, 1},
808 {64 * 1024, 7},
809 },
810 .block_erase = spi_block_erase_d8,
811 }, {
812 .eraseblocks = { {512 * 1024, 1} },
813 .block_erase = spi_block_erase_c7,
814 }
815 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000816 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000817 .unlock = spi_disable_blockprotect,
818 .write = spi_chip_write_256,
819 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000820 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000821 },
822
823 {
824 .vendor = "AMIC",
825 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000826 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000827 .manufacture_id = AMIC_ID,
828 .model_id = AMIC_A25L80P,
829 .total_size = 1024,
830 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000831 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000832 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000833 .probe = probe_spi_rdid4,
834 .probe_timing = TIMING_ZERO,
835 .block_erasers =
836 {
837 {
838 .eraseblocks = {
839 {4 * 1024, 2},
840 {8 * 1024, 1},
841 {16 * 1024, 1},
842 {32 * 1024, 1},
843 {64 * 1024, 15},
844 },
845 .block_erase = spi_block_erase_d8,
846 }, {
847 .eraseblocks = { {1024 * 1024, 1} },
848 .block_erase = spi_block_erase_c7,
849 }
850 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000851 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000852 .unlock = spi_disable_blockprotect,
853 .write = spi_chip_write_256,
854 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000855 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000856 },
857
858 {
859 .vendor = "AMIC",
860 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000861 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000862 .manufacture_id = AMIC_ID,
863 .model_id = AMIC_A25L16PT,
864 .total_size = 2048,
865 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000866 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000867 .tested = TEST_UNTESTED,
868 .probe = probe_spi_rdid4,
869 .probe_timing = TIMING_ZERO,
870 .block_erasers =
871 {
872 {
873 .eraseblocks = {
874 {64 * 1024, 31},
875 {32 * 1024, 1},
876 {16 * 1024, 1},
877 {8 * 1024, 1},
878 {4 * 1024, 2},
879 },
880 .block_erase = spi_block_erase_d8,
881 }, {
882 .eraseblocks = { {2048 * 1024, 1} },
883 .block_erase = spi_block_erase_60,
884 }, {
885 .eraseblocks = { {2048 * 1024, 1} },
886 .block_erase = spi_block_erase_c7,
887 }
888 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000889 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000890 .unlock = spi_disable_blockprotect,
891 .write = spi_chip_write_256,
892 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000893 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000894 },
895
896 {
897 .vendor = "AMIC",
898 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000899 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000900 .manufacture_id = AMIC_ID,
901 .model_id = AMIC_A25L16PU,
902 .total_size = 2048,
903 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000904 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000905 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000906 .probe = probe_spi_rdid4,
907 .probe_timing = TIMING_ZERO,
908 .block_erasers =
909 {
910 {
911 .eraseblocks = {
912 {4 * 1024, 2},
913 {8 * 1024, 1},
914 {16 * 1024, 1},
915 {32 * 1024, 1},
916 {64 * 1024, 31},
917 },
918 .block_erase = spi_block_erase_d8,
919 }, {
920 .eraseblocks = { {2048 * 1024, 1} },
921 .block_erase = spi_block_erase_60,
922 }, {
923 .eraseblocks = { {2048 * 1024, 1} },
924 .block_erase = spi_block_erase_c7,
925 }
926 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000927 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000928 .unlock = spi_disable_blockprotect,
929 .write = spi_chip_write_256,
930 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000931 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000932 },
933
934 {
935 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +0000936 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000937 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000938 .manufacture_id = AMIC_ID_NOPREFIX,
939 .model_id = AMIC_A25L512,
940 .total_size = 64,
941 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000942 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000943 .tested = TEST_UNTESTED,
944 .probe = probe_spi_rdid,
945 .probe_timing = TIMING_ZERO,
946 .block_erasers =
947 {
948 {
949 .eraseblocks = { { 4 * 1024, 16 } },
950 .block_erase = spi_block_erase_20,
951 }, {
952 .eraseblocks = { { 64 * 1024, 1 } },
953 .block_erase = spi_block_erase_d8,
954 }, {
955 .eraseblocks = { { 64 * 1024, 1 } },
956 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000957 }
Dan Lenski11617122010-07-29 15:00:40 +0000958 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000959 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +0000960 .unlock = spi_disable_blockprotect,
961 .write = spi_chip_write_256,
962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000963 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000964 },
965
966 {
967 .vendor = "AMIC",
968 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000969 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000970 .manufacture_id = AMIC_ID_NOPREFIX,
971 .model_id = AMIC_A25L010,
972 .total_size = 128,
973 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000974 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000975 .tested = TEST_UNTESTED,
976 .probe = probe_spi_rdid,
977 .probe_timing = TIMING_ZERO,
978 .block_erasers =
979 {
980 {
981 .eraseblocks = { { 4 * 1024, 32 } },
982 .block_erase = spi_block_erase_20,
983 }, {
984 .eraseblocks = { { 64 * 1024, 2 } },
985 .block_erase = spi_block_erase_d8,
986 }, {
987 .eraseblocks = { { 128 * 1024, 1 } },
988 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000989 }
Dan Lenski11617122010-07-29 15:00:40 +0000990 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +0000991 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +0000992 .unlock = spi_disable_blockprotect,
993 .write = spi_chip_write_256,
994 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000995 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000996 },
997
998 {
999 .vendor = "AMIC",
1000 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001001 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001002 .manufacture_id = AMIC_ID_NOPREFIX,
1003 .model_id = AMIC_A25L020,
1004 .total_size = 256,
1005 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001006 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001007 .tested = TEST_UNTESTED,
1008 .probe = probe_spi_rdid,
1009 .probe_timing = TIMING_ZERO,
1010 .block_erasers =
1011 {
1012 {
1013 .eraseblocks = { { 4 * 1024, 64 } },
1014 .block_erase = spi_block_erase_20,
1015 }, {
1016 .eraseblocks = { { 64 * 1024, 4 } },
1017 .block_erase = spi_block_erase_d8,
1018 }, {
1019 .eraseblocks = { { 256 * 1024, 1 } },
1020 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001021 }
Dan Lenski11617122010-07-29 15:00:40 +00001022 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001023 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001027 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001028 },
1029
1030 {
1031 .vendor = "AMIC",
1032 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001033 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001034 .manufacture_id = AMIC_ID_NOPREFIX,
1035 .model_id = AMIC_A25L040,
1036 .total_size = 512,
1037 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001038 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = { { 4 * 1024, 128 } },
1046 .block_erase = spi_block_erase_20,
1047 }, {
1048 .eraseblocks = { { 64 * 1024, 8 } },
1049 .block_erase = spi_block_erase_d8,
1050 }, {
1051 .eraseblocks = { { 512 * 1024, 1 } },
1052 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001053 }
Dan Lenski11617122010-07-29 15:00:40 +00001054 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001055 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001056 .unlock = spi_disable_blockprotect,
1057 .write = spi_chip_write_256,
1058 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001059 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001060 },
1061
1062 {
1063 .vendor = "AMIC",
1064 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001065 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001066 .manufacture_id = AMIC_ID_NOPREFIX,
1067 .model_id = AMIC_A25L080,
1068 .total_size = 1024,
1069 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001070 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001071 .tested = TEST_UNTESTED,
1072 .probe = probe_spi_rdid,
1073 .probe_timing = TIMING_ZERO,
1074 .block_erasers =
1075 {
1076 {
1077 .eraseblocks = { { 4 * 1024, 256 } },
1078 .block_erase = spi_block_erase_20,
1079 }, {
1080 .eraseblocks = { { 64 * 1024, 16 } },
1081 .block_erase = spi_block_erase_d8,
1082 }, {
1083 .eraseblocks = { { 1024 * 1024, 1 } },
1084 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001085 }
Dan Lenski11617122010-07-29 15:00:40 +00001086 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001087 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001088 .unlock = spi_disable_blockprotect,
1089 .write = spi_chip_write_256,
1090 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001091 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001092 },
1093
1094 {
1095 .vendor = "AMIC",
1096 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001097 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001098 .manufacture_id = AMIC_ID_NOPREFIX,
1099 .model_id = AMIC_A25L016,
1100 .total_size = 2048,
1101 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001102 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001103 .tested = TEST_UNTESTED,
1104 .probe = probe_spi_rdid,
1105 .probe_timing = TIMING_ZERO,
1106 .block_erasers =
1107 {
1108 {
1109 .eraseblocks = { { 4 * 1024, 512 } },
1110 .block_erase = spi_block_erase_20,
1111 }, {
1112 .eraseblocks = { { 64 * 1024, 32 } },
1113 .block_erase = spi_block_erase_d8,
1114 }, {
1115 .eraseblocks = { { 2048 * 1024, 1 } },
1116 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001117 }
Dan Lenski11617122010-07-29 15:00:40 +00001118 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00001119 .printlock = spi_prettyprint_status_register_default_bp2,
Dan Lenski11617122010-07-29 15:00:40 +00001120 .unlock = spi_disable_blockprotect,
1121 .write = spi_chip_write_256,
1122 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001123 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001124 },
1125
1126 {
1127 .vendor = "AMIC",
1128 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001129 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001130 .manufacture_id = AMIC_ID_NOPREFIX,
1131 .model_id = AMIC_A25L032,
1132 .total_size = 4096,
1133 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001134 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001136 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001137 .probe = probe_spi_rdid,
1138 .probe_timing = TIMING_ZERO,
1139 .block_erasers =
1140 {
1141 {
1142 .eraseblocks = { { 4 * 1024, 1024 } },
1143 .block_erase = spi_block_erase_20,
1144 }, {
1145 .eraseblocks = { { 64 * 1024, 64 } },
1146 .block_erase = spi_block_erase_52,
1147 }, {
1148 .eraseblocks = { { 64 * 1024, 64 } },
1149 .block_erase = spi_block_erase_d8,
1150 }, {
1151 .eraseblocks = { { 4096 * 1024, 1 } },
1152 .block_erase = spi_block_erase_60,
1153 }, {
1154 .eraseblocks = { { 4096 * 1024, 1 } },
1155 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001156 }
Dan Lenski11617122010-07-29 15:00:40 +00001157 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001158 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1159 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001160 .write = spi_chip_write_256,
1161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001162 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001163 },
1164
1165 {
1166 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001167 .name = "A25LQ16",
1168 .bustype = BUS_SPI,
1169 .manufacture_id = AMIC_ID_NOPREFIX,
1170 .model_id = AMIC_A25LQ16,
1171 .total_size = 2048,
1172 .page_size = 256,
1173 /* supports SFDP */
1174 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1176 .tested = TEST_UNTESTED,
1177 .probe = probe_spi_rdid,
1178 .probe_timing = TIMING_ZERO,
1179 .block_erasers = {
1180 {
1181 .eraseblocks = { { 4 * 1024, 512 } },
1182 .block_erase = spi_block_erase_20,
1183 }, {
1184 .eraseblocks = { { 64 * 1024, 32 } },
1185 .block_erase = spi_block_erase_52,
1186 }, {
1187 .eraseblocks = { { 64 * 1024, 32 } },
1188 .block_erase = spi_block_erase_d8,
1189 }, {
1190 .eraseblocks = { { 2048 * 1024, 1 } },
1191 .block_erase = spi_block_erase_60,
1192 }, {
1193 .eraseblocks = { { 2048 * 1024, 1 } },
1194 .block_erase = spi_block_erase_c7,
1195 }
1196 },
1197 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1198 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1199 .write = spi_chip_write_256,
1200 .read = spi_chip_read,
1201 .voltage = {2700, 3600},
1202 },
1203
1204 {
1205 .vendor = "AMIC",
1206 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001207 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001208 .manufacture_id = AMIC_ID_NOPREFIX,
1209 .model_id = AMIC_A25LQ032,
1210 .total_size = 4096,
1211 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001212 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001213 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001215 .tested = TEST_UNTESTED,
1216 .probe = probe_spi_rdid,
1217 .probe_timing = TIMING_ZERO,
1218 .block_erasers =
1219 {
1220 {
1221 .eraseblocks = { { 4 * 1024, 1024 } },
1222 .block_erase = spi_block_erase_20,
1223 }, {
1224 .eraseblocks = { { 64 * 1024, 64 } },
1225 .block_erase = spi_block_erase_52,
1226 }, {
1227 .eraseblocks = { { 64 * 1024, 64 } },
1228 .block_erase = spi_block_erase_d8,
1229 }, {
1230 .eraseblocks = { { 4096 * 1024, 1 } },
1231 .block_erase = spi_block_erase_60,
1232 }, {
1233 .eraseblocks = { { 4096 * 1024, 1 } },
1234 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001235 }
Dan Lenski11617122010-07-29 15:00:40 +00001236 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001237 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1238 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1239 .write = spi_chip_write_256,
1240 .read = spi_chip_read,
1241 .voltage = {2700, 3600},
1242 },
1243
1244 {
1245 .vendor = "AMIC",
1246 .name = "A25LQ64",
1247 .bustype = BUS_SPI,
1248 .manufacture_id = AMIC_ID_NOPREFIX,
1249 .model_id = AMIC_A25LQ032,
1250 .total_size = 8192,
1251 .page_size = 256,
1252 /* supports SFDP */
1253 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1254 /* QPI enable 0x35, disable 0xF5 */
1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1256 .tested = TEST_UNTESTED,
1257 .probe = probe_spi_rdid,
1258 .probe_timing = TIMING_ZERO,
1259 .block_erasers =
1260 {
1261 {
1262 .eraseblocks = { { 4 * 1024, 2048 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 32 * 1024, 256 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 128 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 8192 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 8192 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
1276 }
1277 },
1278 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enhance (sic!) */
1279 .unlock = spi_disable_blockprotect,
Dan Lenski11617122010-07-29 15:00:40 +00001280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001282 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001283 },
1284
1285 {
1286 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001287 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001288 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A29002B,
1291 .total_size = 256,
1292 .page_size = 64 * 1024,
1293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1294 .tested = TEST_UNTESTED,
1295 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001296 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001297 .block_erasers =
1298 {
1299 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001300 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001301 {16 * 1024, 1},
1302 {8 * 1024, 2},
1303 {32 * 1024, 1},
1304 {64 * 1024, 3},
1305 },
1306 .block_erase = erase_sector_jedec,
1307 }, {
1308 .eraseblocks = { {256 * 1024, 1} },
1309 .block_erase = erase_chip_block_jedec,
1310 },
1311 },
1312 .write = write_jedec_1,
1313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001314 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001315 },
1316
1317 {
1318 .vendor = "AMIC",
1319 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001320 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001321 .manufacture_id = AMIC_ID_NOPREFIX,
1322 .model_id = AMIC_A29002T,
1323 .total_size = 256,
1324 .page_size = 64 * 1024,
1325 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001326 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001327 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001328 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001329 .block_erasers =
1330 {
1331 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001332 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001333 {64 * 1024, 3},
1334 {32 * 1024, 1},
1335 {8 * 1024, 2},
1336 {16 * 1024, 1},
1337 },
1338 .block_erase = erase_sector_jedec,
1339 }, {
1340 .eraseblocks = { {256 * 1024, 1} },
1341 .block_erase = erase_chip_block_jedec,
1342 },
1343 },
1344 .write = write_jedec_1,
1345 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001346 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001347 },
1348
1349 {
1350 .vendor = "AMIC",
1351 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001352 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001353 .manufacture_id = AMIC_ID_NOPREFIX,
1354 .model_id = AMIC_A29040B,
1355 .total_size = 512,
1356 .page_size = 64 * 1024,
1357 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1358 .tested = TEST_UNTESTED,
1359 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001360 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001361 .block_erasers =
1362 {
1363 {
1364 .eraseblocks = { {64 * 1024, 8} },
1365 .block_erase = erase_sector_jedec,
1366 }, {
1367 .eraseblocks = { {512 * 1024, 1} },
1368 .block_erase = erase_chip_block_jedec,
1369 },
1370 },
1371 .write = write_jedec_1,
1372 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001373 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001374 },
1375
1376 {
1377 .vendor = "AMIC",
1378 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001379 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001380 .manufacture_id = AMIC_ID_NOPREFIX,
1381 .model_id = AMIC_A49LF040A,
1382 .total_size = 512,
1383 .page_size = 64 * 1024,
1384 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00001385 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001386 .probe = probe_jedec,
1387 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1388 .block_erasers =
1389 {
1390 {
1391 .eraseblocks = { {64 * 1024, 8} },
1392 .block_erase = erase_block_jedec,
1393 }, {
1394 .eraseblocks = { {512 * 1024, 1} },
1395 .block_erase = erase_chip_block_jedec,
1396 }
1397 },
1398 .unlock = unlock_49fl00x,
1399 .write = write_jedec_1,
1400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001401 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 },
1403
1404 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001405 .vendor = "Atmel",
1406 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001407 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001408 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001409 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001410 .total_size = 256,
1411 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001412 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001414 .tested = TEST_UNTESTED,
1415 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001416 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001417 .block_erasers =
1418 {
1419 {
1420 .eraseblocks = { {4 * 1024, 64} },
1421 .block_erase = spi_block_erase_20,
1422 }, {
1423 .eraseblocks = { {32 * 1024, 8} },
1424 .block_erase = spi_block_erase_52,
1425 }, {
1426 .eraseblocks = { {64 * 1024, 4} },
1427 .block_erase = spi_block_erase_d8,
1428 }, {
1429 .eraseblocks = { {256 * 1024, 1} },
1430 .block_erase = spi_block_erase_60,
1431 }, {
1432 .eraseblocks = { {256 * 1024, 1} },
1433 .block_erase = spi_block_erase_c7,
1434 }
1435 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001436 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001437 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001438 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001439 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001440 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001441 },
1442
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001443 {
1444 .vendor = "Atmel",
1445 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001446 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001447 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001448 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001449 .total_size = 512,
1450 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001451 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001452 .tested = TEST_UNTESTED,
1453 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001454 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001455 .block_erasers =
1456 {
1457 {
1458 .eraseblocks = { {4 * 1024, 128} },
1459 .block_erase = spi_block_erase_20,
1460 }, {
1461 .eraseblocks = { {32 * 1024, 16} },
1462 .block_erase = spi_block_erase_52,
1463 }, {
1464 .eraseblocks = { {64 * 1024, 8} },
1465 .block_erase = spi_block_erase_d8,
1466 }, {
1467 .eraseblocks = { {512 * 1024, 1} },
1468 .block_erase = spi_block_erase_60,
1469 }, {
1470 .eraseblocks = { {512 * 1024, 1} },
1471 .block_erase = spi_block_erase_c7,
1472 }
1473 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001474 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001475 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001476 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001477 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001478 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001479 },
1480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 {
1482 .vendor = "Atmel",
1483 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001484 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001485 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001486 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001487 .total_size = 1024,
1488 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001489 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001490 .tested = TEST_UNTESTED,
1491 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001492 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001493 .block_erasers =
1494 {
1495 {
1496 .eraseblocks = { {4 * 1024, 256} },
1497 .block_erase = spi_block_erase_20,
1498 }, {
1499 .eraseblocks = { {32 * 1024, 32} },
1500 .block_erase = spi_block_erase_52,
1501 }, {
1502 .eraseblocks = { {64 * 1024, 16} },
1503 .block_erase = spi_block_erase_d8,
1504 }, {
1505 .eraseblocks = { {1024 * 1024, 1} },
1506 .block_erase = spi_block_erase_60,
1507 }, {
1508 .eraseblocks = { {1024 * 1024, 1} },
1509 .block_erase = spi_block_erase_c7,
1510 }
1511 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001512 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001513 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001514 .write = spi_chip_write_256,
1515 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001516 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 },
1518
1519 {
1520 .vendor = "Atmel",
1521 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001522 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001523 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001524 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001525 .total_size = 1024,
1526 .page_size = 256,
1527 .feature_bits = FEATURE_WRSR_WREN,
1528 .tested = TEST_UNTESTED,
1529 .probe = probe_spi_rdid,
1530 .probe_timing = TIMING_ZERO,
1531 .block_erasers =
1532 {
1533 {
1534 .eraseblocks = { {4 * 1024, 256} },
1535 .block_erase = spi_block_erase_20,
1536 }, {
1537 .eraseblocks = { {32 * 1024, 32} },
1538 .block_erase = spi_block_erase_52,
1539 }, {
1540 .eraseblocks = { {64 * 1024, 16} },
1541 .block_erase = spi_block_erase_d8,
1542 }, {
1543 .eraseblocks = { {1024 * 1024, 1} },
1544 .block_erase = spi_block_erase_60,
1545 }, {
1546 .eraseblocks = { {1024 * 1024, 1} },
1547 .block_erase = spi_block_erase_c7,
1548 }
1549 },
1550 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001551 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001552 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001553 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001554 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001555 },
1556
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001557 {
1558 .vendor = "Atmel",
1559 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001560 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001561 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001562 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001563 .total_size = 2048,
1564 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001565 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner2abab942012-04-27 20:41:23 +00001566 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001568 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001569 .block_erasers =
1570 {
1571 {
1572 .eraseblocks = { {4 * 1024, 512} },
1573 .block_erase = spi_block_erase_20,
1574 }, {
1575 .eraseblocks = { {32 * 1024, 64} },
1576 .block_erase = spi_block_erase_52,
1577 }, {
1578 .eraseblocks = { {64 * 1024, 32} },
1579 .block_erase = spi_block_erase_d8,
1580 }, {
1581 .eraseblocks = { {2 * 1024 * 1024, 1} },
1582 .block_erase = spi_block_erase_60,
1583 }, {
1584 .eraseblocks = { {2 * 1024 * 1024, 1} },
1585 .block_erase = spi_block_erase_c7,
1586 }
1587 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001588 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001589 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001590 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001591 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001592 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001593 },
1594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001595 {
1596 .vendor = "Atmel",
1597 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001600 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 .total_size = 4096,
1602 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001603 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001604 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001606 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001607 .block_erasers =
1608 {
1609 {
1610 .eraseblocks = { {4 * 1024, 1024} },
1611 .block_erase = spi_block_erase_20,
1612 }, {
1613 .eraseblocks = { {32 * 1024, 128} },
1614 .block_erase = spi_block_erase_52,
1615 }, {
1616 .eraseblocks = { {64 * 1024, 64} },
1617 .block_erase = spi_block_erase_d8,
1618 }, {
1619 .eraseblocks = { {4 * 1024 * 1024, 1} },
1620 .block_erase = spi_block_erase_60,
1621 }, {
1622 .eraseblocks = { {4 * 1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_c7,
1624 }
1625 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001626 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001627 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001628 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001631 },
1632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001633 {
1634 .vendor = "Atmel",
1635 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001636 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001637 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001638 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001639 .total_size = 4096,
1640 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001641 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001645 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001646 .block_erasers =
1647 {
1648 {
1649 .eraseblocks = { {4 * 1024, 1024} },
1650 .block_erase = spi_block_erase_20,
1651 }, {
1652 .eraseblocks = { {32 * 1024, 128} },
1653 .block_erase = spi_block_erase_52,
1654 }, {
1655 .eraseblocks = { {64 * 1024, 64} },
1656 .block_erase = spi_block_erase_d8,
1657 }, {
1658 .eraseblocks = { {4 * 1024 * 1024, 1} },
1659 .block_erase = spi_block_erase_60,
1660 }, {
1661 .eraseblocks = { {4 * 1024 * 1024, 1} },
1662 .block_erase = spi_block_erase_c7,
1663 }
1664 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001665 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001666 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001667 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001668 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001669 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001670 },
1671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001672 {
1673 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001674 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001676 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001677 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001678 .total_size = 8192,
1679 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001680 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001681 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001682 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001683 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001684 .block_erasers =
1685 {
1686 {
1687 .eraseblocks = { {4 * 1024, 2048} },
1688 .block_erase = spi_block_erase_20,
1689 }, {
1690 .eraseblocks = { {32 * 1024, 256} },
1691 .block_erase = spi_block_erase_52,
1692 }, {
1693 .eraseblocks = { {64 * 1024, 128} },
1694 .block_erase = spi_block_erase_d8,
1695 }, {
1696 .eraseblocks = { {8 * 1024 * 1024, 1} },
1697 .block_erase = spi_block_erase_60,
1698 }, {
1699 .eraseblocks = { {8 * 1024 * 1024, 1} },
1700 .block_erase = spi_block_erase_c7,
1701 }
1702 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001703 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001704 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001705 .write = spi_chip_write_256,
1706 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001707 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001708 },
1709
1710 {
1711 .vendor = "Atmel",
1712 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001713 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001714 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001715 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001716 .total_size = 2048,
1717 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001718 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001720 .tested = TEST_UNTESTED,
1721 .probe = probe_spi_rdid,
1722 .probe_timing = TIMING_ZERO,
1723 .block_erasers =
1724 {
1725 {
1726 .eraseblocks = { {4 * 1024, 512} },
1727 .block_erase = spi_block_erase_20,
1728 }, {
1729 .eraseblocks = { {32 * 1024, 64} },
1730 .block_erase = spi_block_erase_52,
1731 }, {
1732 .eraseblocks = { {64 * 1024, 32} },
1733 .block_erase = spi_block_erase_d8,
1734 }, {
1735 .eraseblocks = { {2 * 1024 * 1024, 1} },
1736 .block_erase = spi_block_erase_60,
1737 }, {
1738 .eraseblocks = { {2 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_c7,
1740 }
1741 },
1742 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001743 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001744 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001745 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001746 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001747 },
1748
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001749 {
1750 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001751 .name = "AT25F512",
1752 .bustype = BUS_SPI,
1753 .manufacture_id = ATMEL_ID,
1754 .model_id = ATMEL_AT25F512,
1755 .total_size = 64,
1756 .page_size = 256,
1757 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001758 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001759 .probe = probe_spi_at25f,
1760 .probe_timing = TIMING_ZERO,
1761 .block_erasers =
1762 {
1763 {
1764 .eraseblocks = { {32 * 1024, 2} },
1765 .block_erase = spi_block_erase_52,
1766 }, {
1767 .eraseblocks = { {64 * 1024, 1} },
1768 .block_erase = spi_block_erase_62,
1769 }
1770 },
1771 .printlock = spi_prettyprint_status_register_at25f,
1772 .unlock = spi_disable_blockprotect_at25f,
1773 .write = spi_chip_write_256,
1774 .read = spi_chip_read,
1775 .voltage = {2700, 3600},
1776 },
1777
1778 {
1779 .vendor = "Atmel",
1780 .name = "AT25F512A",
1781 .bustype = BUS_SPI,
1782 .manufacture_id = ATMEL_ID,
1783 .model_id = ATMEL_AT25F512A,
1784 .total_size = 64,
1785 .page_size = 128,
1786 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001787 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001788 .probe = probe_spi_at25f,
1789 .probe_timing = TIMING_ZERO,
1790 .block_erasers =
1791 {
1792 {
1793 .eraseblocks = { {32 * 1024, 2} },
1794 .block_erase = spi_block_erase_52,
1795 }, {
1796 .eraseblocks = { {64 * 1024, 1} },
1797 .block_erase = spi_block_erase_62,
1798 }
1799 },
1800 .printlock = spi_prettyprint_status_register_at25f512a,
1801 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1802 .unlock = spi_disable_blockprotect_at25f512a,
1803 .write = spi_chip_write_256,
1804 .read = spi_chip_read,
1805 .voltage = {2700, 3600},
1806 },
1807
1808 {
1809 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001810 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001811 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001813 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001814 .total_size = 64,
1815 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001816 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1817 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001818 .tested = TEST_UNTESTED,
1819 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001820 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001821 .block_erasers =
1822 {
1823 {
1824 .eraseblocks = { {4 * 1024, 16} },
1825 .block_erase = spi_block_erase_20,
1826 }, {
1827 .eraseblocks = { {32 * 1024, 2} },
1828 .block_erase = spi_block_erase_52,
1829 }, {
1830 .eraseblocks = { {32 * 1024, 2} },
1831 .block_erase = spi_block_erase_d8,
1832 }, {
1833 .eraseblocks = { {64 * 1024, 1} },
1834 .block_erase = spi_block_erase_60,
1835 }, {
1836 .eraseblocks = { {64 * 1024, 1} },
1837 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001838 }, {
1839 .eraseblocks = { {64 * 1024, 1} },
1840 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00001841 }
1842 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00001843 .printlock = spi_prettyprint_status_register_at25f512b,
1844 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001845 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001846 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001847 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001848 },
1849
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001850 {
1851 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001852 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1853 * All other properties seem to be the same.*/
1854 .name = "AT25F1024(A)",
1855 .bustype = BUS_SPI,
1856 .manufacture_id = ATMEL_ID,
1857 .model_id = ATMEL_AT25F1024,
1858 .total_size = 128,
1859 .page_size = 256,
1860 .feature_bits = FEATURE_WRSR_WREN,
1861 .tested = TEST_OK_PREW,
1862 .probe = probe_spi_at25f,
1863 .probe_timing = TIMING_ZERO,
1864 .block_erasers =
1865 {
1866 {
1867 .eraseblocks = { {32 * 1024, 4} },
1868 .block_erase = spi_block_erase_52,
1869 }, {
1870 .eraseblocks = { {128 * 1024, 1} },
1871 .block_erase = spi_block_erase_62,
1872 }
1873 },
1874 .printlock = spi_prettyprint_status_register_at25f,
1875 .unlock = spi_disable_blockprotect_at25f,
1876 .write = spi_chip_write_256,
1877 .read = spi_chip_read,
1878 .voltage = {2700, 3600},
1879 },
1880
1881 {
1882 .vendor = "Atmel",
1883 .name = "AT25F2048",
1884 .bustype = BUS_SPI,
1885 .manufacture_id = ATMEL_ID,
1886 .model_id = ATMEL_AT25F2048,
1887 .total_size = 256,
1888 .page_size = 256,
1889 .feature_bits = FEATURE_WRSR_WREN,
1890 .tested = TEST_UNTESTED,
1891 .probe = probe_spi_at25f,
1892 .probe_timing = TIMING_ZERO,
1893 .block_erasers =
1894 {
1895 {
1896 .eraseblocks = { {64 * 1024, 4} },
1897 .block_erase = spi_block_erase_52,
1898 }, {
1899 .eraseblocks = { {256 * 1024, 1} },
1900 .block_erase = spi_block_erase_62,
1901 }
1902 },
1903 .printlock = spi_prettyprint_status_register_at25f,
1904 .unlock = spi_disable_blockprotect_at25f,
1905 .write = spi_chip_write_256,
1906 .read = spi_chip_read,
1907 .voltage = {2700, 3600},
1908 },
1909
1910 {
1911 .vendor = "Atmel",
1912 .name = "AT25F4096",
1913 .bustype = BUS_SPI,
1914 .manufacture_id = ATMEL_ID,
1915 .model_id = ATMEL_AT25F4096,
1916 .total_size = 512,
1917 .page_size = 256,
1918 .feature_bits = FEATURE_WRSR_WREN,
1919 .tested = TEST_UNTESTED,
1920 .probe = probe_spi_at25f,
1921 .probe_timing = TIMING_ZERO,
1922 .block_erasers =
1923 {
1924 {
1925 .eraseblocks = { {64 * 1024, 8} },
1926 .block_erase = spi_block_erase_52,
1927 }, {
1928 .eraseblocks = { {512 * 1024, 1} },
1929 .block_erase = spi_block_erase_62,
1930 }
1931 },
1932 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00001933 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
1934 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001935 .write = spi_chip_write_256,
1936 .read = spi_chip_read,
1937 .voltage = {2700, 3600},
1938 },
1939
1940 {
1941 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001942 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001943 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001944 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001945 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001946 .total_size = 128,
1947 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001948 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00001949 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001950 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001951 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001952 .block_erasers =
1953 {
1954 {
1955 .eraseblocks = { {4 * 1024, 32} },
1956 .block_erase = spi_block_erase_20,
1957 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001958 .eraseblocks = { {4 * 1024, 32} },
1959 .block_erase = spi_block_erase_d7,
1960 }, {
Sean Nelson89187292009-12-23 12:02:55 +00001961 .eraseblocks = { {32 * 1024, 4} },
1962 .block_erase = spi_block_erase_52,
1963 }, {
1964 .eraseblocks = { {32 * 1024, 4} },
1965 .block_erase = spi_block_erase_d8,
1966 }, {
1967 .eraseblocks = { {128 * 1024, 1} },
1968 .block_erase = spi_block_erase_60,
1969 }, {
1970 .eraseblocks = { {128 * 1024, 1} },
1971 .block_erase = spi_block_erase_c7,
1972 }
1973 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001974 .printlock = spi_prettyprint_status_register_at25fs010,
1975 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001976 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001977 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001978 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001979 },
1980
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001981 {
1982 .vendor = "Atmel",
1983 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001984 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001985 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001986 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001987 .total_size = 512,
1988 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001989 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001990 .tested = TEST_UNTESTED,
1991 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001992 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001993 .block_erasers =
1994 {
1995 {
1996 .eraseblocks = { {4 * 1024, 128} },
1997 .block_erase = spi_block_erase_20,
1998 }, {
1999 .eraseblocks = { {64 * 1024, 8} },
2000 .block_erase = spi_block_erase_52,
2001 }, {
2002 .eraseblocks = { {64 * 1024, 8} },
2003 .block_erase = spi_block_erase_d8,
2004 }, {
2005 .eraseblocks = { {512 * 1024, 1} },
2006 .block_erase = spi_block_erase_60,
2007 }, {
2008 .eraseblocks = { {512 * 1024, 1} },
2009 .block_erase = spi_block_erase_c7,
2010 }
2011 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002012 .printlock = spi_prettyprint_status_register_at25fs040,
2013 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002014 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002015 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002016 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002017 },
2018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002019 {
2020 .vendor = "Atmel",
2021 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002022 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002023 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002024 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002025 .total_size = 512,
2026 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002027 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002028 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002029 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002030 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002031 .block_erasers =
2032 {
2033 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002034 .eraseblocks = { {256, 2048} },
2035 .block_erase = spi_block_erase_81,
2036 }, {
2037 .eraseblocks = { {2 * 1024, 256} },
2038 .block_erase = spi_block_erase_50,
2039 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002040 .eraseblocks = { {4 * 1024, 128} },
2041 .block_erase = spi_block_erase_20,
2042 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002043 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002044 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002045 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002046 .write = spi_chip_write_1,
2047 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002048 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002049 },
2050
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002051 {
2052 .vendor = "Atmel",
2053 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002054 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002055 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002056 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002057 .total_size = 1024,
2058 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002059 .feature_bits = FEATURE_WRSR_WREN,
2060 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002061 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002062 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002063 .block_erasers =
2064 {
2065 {
2066 .eraseblocks = { {4 * 1024, 256} },
2067 .block_erase = spi_block_erase_20,
2068 }, {
2069 .eraseblocks = { {32 * 1024, 32} },
2070 .block_erase = spi_block_erase_52,
2071 }, {
2072 .eraseblocks = { {64 * 1024, 16} },
2073 .block_erase = spi_block_erase_d8,
2074 }, {
2075 .eraseblocks = { {1024 * 1024, 1} },
2076 .block_erase = spi_block_erase_60,
2077 }, {
2078 .eraseblocks = { {1024 * 1024, 1} },
2079 .block_erase = spi_block_erase_c7,
2080 }
2081 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002082 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002083 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002084 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002085 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002086 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002087 },
2088
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002089 {
2090 .vendor = "Atmel",
2091 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002092 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002093 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002094 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002095 .total_size = 2048,
2096 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002097 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00002098 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002099 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002100 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002101 .block_erasers =
2102 {
2103 {
2104 .eraseblocks = { {4 * 1024, 512} },
2105 .block_erase = spi_block_erase_20,
2106 }, {
2107 .eraseblocks = { {32 * 1024, 64} },
2108 .block_erase = spi_block_erase_52,
2109 }, {
2110 .eraseblocks = { {64 * 1024, 32} },
2111 .block_erase = spi_block_erase_d8,
2112 }, {
2113 .eraseblocks = { {2 * 1024 * 1024, 1} },
2114 .block_erase = spi_block_erase_60,
2115 }, {
2116 .eraseblocks = { {2 * 1024 * 1024, 1} },
2117 .block_erase = spi_block_erase_c7,
2118 }
2119 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002120 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002121 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002122 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002123 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002124 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002125 },
2126
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002127 {
2128 .vendor = "Atmel",
2129 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002130 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002131 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002132 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002133 .total_size = 2048,
2134 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002135 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002136 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002137 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002138 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002139 .block_erasers =
2140 {
2141 {
2142 .eraseblocks = { {4 * 1024, 512} },
2143 .block_erase = spi_block_erase_20,
2144 }, {
2145 .eraseblocks = { {32 * 1024, 64} },
2146 .block_erase = spi_block_erase_52,
2147 }, {
2148 .eraseblocks = { {64 * 1024, 32} },
2149 .block_erase = spi_block_erase_d8,
2150 }, {
2151 .eraseblocks = { {2 * 1024 * 1024, 1} },
2152 .block_erase = spi_block_erase_60,
2153 }, {
2154 .eraseblocks = { {2 * 1024 * 1024, 1} },
2155 .block_erase = spi_block_erase_c7,
2156 }
2157 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002158 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002159 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002160 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002162 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002163 },
2164
2165 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002166 /*{
2167 .vendor = "Atmel",
2168 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002169 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002170 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002171 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002172 .total_size = 4096,
2173 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002174 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002175 .tested = TEST_UNTESTED,
2176 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002177 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002178 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002179 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002180 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002181 .read = spi_chip_read,
2182 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002183
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002184 {
2185 .vendor = "Atmel",
2186 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002187 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002188 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002189 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002190 .total_size = 512,
2191 .page_size = 256,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002192 .tested = TEST_BAD_WRITE,
Steven Zakulec3603a282012-05-02 20:07:57 +00002193 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002194 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002195 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002196 .block_erasers =
2197 {
2198 {
2199 .eraseblocks = { {4 * 1024, 128} },
2200 .block_erase = spi_block_erase_20,
2201 }, {
2202 .eraseblocks = { {32 * 1024, 16} },
2203 .block_erase = spi_block_erase_52,
2204 }, {
2205 .eraseblocks = { {64 * 1024, 8} },
2206 .block_erase = spi_block_erase_d8,
2207 }, {
2208 .eraseblocks = { {512 * 1024, 1} },
2209 .block_erase = spi_block_erase_60,
2210 }, {
2211 .eraseblocks = { {512 * 1024, 1} },
2212 .block_erase = spi_block_erase_c7,
2213 }
2214 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002215 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002216 .write = NULL /* Incompatible Page write */,
2217 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002218 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002219 },
2220
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002221 {
2222 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002223 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002224 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002225 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002226 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002227 .total_size = 64,
2228 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002229 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002230 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002231 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002232 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002233 .block_erasers =
2234 {
2235 {
2236 .eraseblocks = { {64 * 1024, 1} },
2237 .block_erase = erase_chip_block_jedec,
2238 }
2239 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002240 .write = write_jedec,
2241 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002242 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002243 },
2244
2245 {
2246 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002247 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002248 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002249 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002250 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002251 .total_size = 128,
2252 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002253 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002254 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002255 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002256 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002257 .block_erasers =
2258 {
2259 {
2260 .eraseblocks = { {128 * 1024, 1} },
2261 .block_erase = erase_chip_block_jedec,
2262 }
2263 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002264 .write = write_jedec, /* FIXME */
2265 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002266 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002267 },
2268
2269 {
2270 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002271 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002272 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002273 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002274 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002275 .total_size = 256,
2276 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002277 .feature_bits = FEATURE_LONG_RESET,
2278 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002279 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002280 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002281 .block_erasers =
2282 {
2283 {
2284 .eraseblocks = { {256 * 1024, 1} },
2285 .block_erase = erase_chip_block_jedec,
2286 }
2287 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002288 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002289 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002290 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002291 },
2292
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002293 {
2294 .vendor = "Atmel",
2295 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002296 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002297 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002298 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002299 .total_size = 512,
2300 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002301 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002302 .tested = TEST_UNTESTED,
2303 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002304 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002305 .block_erasers =
2306 {
2307 {
2308 .eraseblocks = { {512 * 1024, 1} },
2309 .block_erase = erase_chip_block_jedec,
2310 }
2311 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002312 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002314 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002315 },
2316
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002317 {
2318 .vendor = "Atmel",
2319 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002320 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002321 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002322 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002323 .total_size = 16896 /* No power of two sizes */,
2324 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002325 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002326 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002327 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002328 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002329 .write = NULL /* Incompatible Page write */,
2330 .read = NULL /* Incompatible read */,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002331 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002332 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002333
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002334 {
2335 .vendor = "Atmel",
2336 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002337 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002338 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002339 .model_id = ATMEL_AT45DB011D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002340 .total_size = 128 /* Size can only be determined from status register */,
2341 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002342 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002343 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002344 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002345 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002346 .write = NULL,
2347 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002348 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002349 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002350
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002351 {
2352 .vendor = "Atmel",
2353 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002354 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002355 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002356 .model_id = ATMEL_AT45DB021D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002357 .total_size = 256 /* Size can only be determined from status register */,
2358 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002359 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002360 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002361 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002362 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002363 .write = NULL,
2364 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002365 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002366 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002367
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002368 {
2369 .vendor = "Atmel",
2370 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002371 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002372 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002373 .model_id = ATMEL_AT45DB041D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002374 .total_size = 512 /* Size can only be determined from status register */,
2375 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002376 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002377 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002378 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002379 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .write = NULL,
2381 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002382 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002383 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002384
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002385 {
2386 .vendor = "Atmel",
2387 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002388 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002389 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002390 .model_id = ATMEL_AT45DB081D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002391 .total_size = 1024 /* Size can only be determined from status register */,
2392 .page_size = 256 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002393 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002394 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002395 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002396 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002397 .write = NULL,
2398 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002399 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002400 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002401
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002402 {
2403 .vendor = "Atmel",
2404 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002405 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002406 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002407 .model_id = ATMEL_AT45DB161D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002408 .total_size = 2048 /* Size can only be determined from status register */,
2409 .page_size = 512 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002410 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002411 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002412 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002413 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002414 .write = NULL,
2415 .read = NULL,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002416 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002417 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002418
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002419 {
2420 .vendor = "Atmel",
2421 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002422 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002423 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002424 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002425 .total_size = 4224 /* No power of two sizes */,
2426 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002427 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002428 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002429 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002430 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002431 .write = NULL,
2432 .read = NULL /* Incompatible read */,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002433 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002434 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002435
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002436 {
2437 .vendor = "Atmel",
2438 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002439 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002440 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002441 .model_id = ATMEL_AT45DB321D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002442 .total_size = 4096 /* Size can only be determined from status register */,
2443 .page_size = 512 /* Size can only be determined from status register */,
Daniel Lenski65922a32012-02-15 23:40:23 +00002444 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Steven Zakulec3603a282012-05-02 20:07:57 +00002445 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Daniel Lenski65922a32012-02-15 23:40:23 +00002446 .feature_bits = FEATURE_OTP,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002447 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002448 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002449 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002450 .write = NULL,
2451 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002452 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002453 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002454
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002455 {
2456 .vendor = "Atmel",
2457 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002458 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002459 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002460 .model_id = ATMEL_AT45DB642D,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002461 .total_size = 8192 /* Size can only be determined from status register */,
2462 .page_size = 1024 /* Size can only be determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002463 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002464 .tested = TEST_BAD_REW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002465 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002466 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002467 .write = NULL,
2468 .read = NULL,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002469 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002470 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002471
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002472 {
2473 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002474 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002475 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002476 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002477 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002478 .total_size = 64,
2479 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002480 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002481 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002482 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002483 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002484 .block_erasers =
2485 {
2486 {
2487 .eraseblocks = { {64 * 1024, 1} },
2488 .block_erase = erase_chip_block_jedec,
2489 }
2490 },
Sean Nelson35727f72010-01-28 23:55:12 +00002491 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002492 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002493 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002494 },
2495
2496 {
2497 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002498 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002499 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002500 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002501 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002502 .total_size = 256,
2503 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002504 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002505 .tested = TEST_UNTESTED,
2506 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002507 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002508 .block_erasers =
2509 {
2510 {
2511 .eraseblocks = {
2512 {16 * 1024, 1},
2513 {8 * 1024, 2},
2514 {96 * 1024, 1},
2515 {128 * 1024, 1},
2516 },
2517 .block_erase = erase_sector_jedec,
2518 }, {
2519 .eraseblocks = { {256 * 1024, 1} },
2520 .block_erase = erase_chip_block_jedec,
2521 }
2522 },
Sean Nelson35727f72010-01-28 23:55:12 +00002523 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002524 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002525 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002526 },
2527
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002528 {
2529 .vendor = "Atmel",
2530 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002531 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002532 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002533 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002534 .total_size = 256,
2535 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002536 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002537 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002538 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002539 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002540 .block_erasers =
2541 {
2542 {
2543 .eraseblocks = {
2544 {128 * 1024, 1},
2545 {96 * 1024, 1},
2546 {8 * 1024, 2},
2547 {16 * 1024, 1},
2548 },
2549 .block_erase = erase_sector_jedec,
2550 }, {
2551 .eraseblocks = { {256 * 1024, 1} },
2552 .block_erase = erase_chip_block_jedec,
2553 }
2554 },
Sean Nelson35727f72010-01-28 23:55:12 +00002555 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002556 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002557 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002558 },
2559
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002560 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002561 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002562 .name = "AT49(H)F010",
2563 .bustype = BUS_PARALLEL,
2564 .manufacture_id = ATMEL_ID,
2565 .model_id = ATMEL_AT49F010,
2566 .total_size = 128,
2567 .page_size = 0, /* unused */
2568 .feature_bits = FEATURE_EITHER_RESET,
2569 .tested = TEST_OK_PREW,
2570 .probe = probe_jedec,
2571 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2572 .block_erasers =
2573 {
2574 {
2575 .eraseblocks = { {128 * 1024, 1} },
2576 .block_erase = erase_chip_block_jedec,
2577 }
2578 },
2579 .printlock = printlock_at49f,
2580 .write = write_jedec_1,
2581 .read = read_memmapped,
2582 .voltage = {4500, 5500},
2583 },
2584
2585 {
2586 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002587 .name = "AT49F020",
2588 .bustype = BUS_PARALLEL,
2589 .manufacture_id = ATMEL_ID,
2590 .model_id = ATMEL_AT49F020,
2591 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002592 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002593 .feature_bits = FEATURE_EITHER_RESET,
2594 .tested = TEST_OK_PRE,
2595 .probe = probe_jedec,
2596 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2597 .block_erasers =
2598 {
2599 {
2600 .eraseblocks = { {256 * 1024, 1} },
2601 .block_erase = erase_chip_block_jedec,
2602 }
2603 /* Chip features an optional permanent write protection
2604 * of the first 8 kB. The erase function is the same as
2605 * above, but 00000H to 01FFFH will not be erased.
2606 * FIXME: add another eraser when partial erasers are
2607 * supported.
2608 */
2609 },
2610 .printlock = printlock_at49f,
2611 .write = write_jedec_1,
2612 .read = read_memmapped,
2613 .voltage = {4500, 5500},
2614 },
2615
2616 {
2617 .vendor = "Atmel",
2618 .name = "AT49F040",
2619 .bustype = BUS_PARALLEL,
2620 .manufacture_id = ATMEL_ID,
2621 .model_id = ATMEL_AT49F040,
2622 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002623 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002624 .feature_bits = FEATURE_EITHER_RESET,
2625 .tested = TEST_UNTESTED,
2626 .probe = probe_jedec,
2627 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2628 .block_erasers =
2629 {
2630 {
2631 .eraseblocks = { {512 * 1024, 1} },
2632 .block_erase = erase_chip_block_jedec,
2633 }
2634 /* Chip features an optional permanent write protection
2635 * of the first 16 kB. The erase function is the same as
2636 * above, but 00000H to 03FFFH will not be erased.
2637 * FIXME: add another eraser when partial erasers are
2638 * supported.
2639 */
2640 },
2641 .printlock = printlock_at49f,
2642 .write = write_jedec_1,
2643 .read = read_memmapped,
2644 .voltage = {4500, 5500},
2645 },
2646
2647 {
2648 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002649 .name = "AT49F080",
2650 .bustype = BUS_PARALLEL,
2651 .manufacture_id = ATMEL_ID,
2652 .model_id = ATMEL_AT49F080,
2653 .total_size = 1024,
2654 .page_size = 0, /* unused */
2655 .feature_bits = FEATURE_EITHER_RESET,
2656 .tested = TEST_UNTESTED,
2657 .probe = probe_jedec,
2658 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2659 .block_erasers =
2660 {
2661 {
2662 .eraseblocks = { {1024 * 1024, 1} },
2663 .block_erase = erase_chip_block_jedec,
2664 }
2665 /* Chip features an optional permanent write protection
2666 * of the first 16 kB. The erase function is the same as
2667 * above, but 00000H to 03FFFH will not be erased.
2668 * FIXME: add another eraser when partial erasers are
2669 * supported.
2670 */
2671 },
2672 .printlock = printlock_at49f,
2673 .write = write_jedec_1,
2674 .read = read_memmapped,
2675 .voltage = {4500, 5500},
2676 },
2677
2678 {
2679 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
2680 .vendor = "Atmel",
2681 .name = "AT49F080T",
2682 .bustype = BUS_PARALLEL,
2683 .manufacture_id = ATMEL_ID,
2684 .model_id = ATMEL_AT49F080T,
2685 .total_size = 1024,
2686 .page_size = 0, /* unused */
2687 .feature_bits = FEATURE_EITHER_RESET,
2688 .tested = TEST_UNTESTED,
2689 .probe = probe_jedec,
2690 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2691 .block_erasers =
2692 {
2693 {
2694 .eraseblocks = { {1024 * 1024, 1} },
2695 .block_erase = erase_chip_block_jedec,
2696 }
2697 /* Chip features an optional permanent write protection
2698 * of the first 16 kB. The erase function is the same as
2699 * above, but FC000H to FFFFFH will not be erased.
2700 * FIXME: add another eraser when partial erasers are
2701 * supported.
2702 */
2703 },
2704 .printlock = printlock_at49f,
2705 .write = write_jedec_1,
2706 .read = read_memmapped,
2707 .voltage = {4500, 5500},
2708 },
2709
2710 {
2711 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00002712 .name = "AT49LH002",
2713 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2714 .manufacture_id = ATMEL_ID,
2715 .model_id = ATMEL_AT49LH002,
2716 .total_size = 256,
2717 .page_size = 0, /* unused */
2718 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2719 .tested = TEST_UNTESTED,
2720 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2721 .probe_timing = TIMING_FIXME,
2722 .block_erasers =
2723 {
2724 {
2725 .eraseblocks = {
2726 {64 * 1024, 3},
2727 {32 * 1024, 1},
2728 {8 * 1024, 2},
2729 {16 * 1024, 1},
2730 },
2731 .block_erase = erase_block_82802ab,
2732 }, {
2733 .eraseblocks = {
2734 {64 * 1024, 4},
2735 },
2736 .block_erase = NULL, /* TODO: Implement. */
2737 },
2738 },
2739 .printlock = NULL, /* TODO */
2740 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2741 .write = write_82802ab,
2742 .read = read_memmapped,
2743 .voltage = {3000, 3600},
2744 },
2745
2746 {
Andrew Morganca081462011-09-13 22:05:44 +00002747 .vendor = "Catalyst",
2748 .name = "CAT28F512",
2749 .bustype = BUS_PARALLEL,
2750 .manufacture_id = CATALYST_ID,
2751 .model_id = CATALYST_CAT28F512,
2752 .total_size = 64,
2753 .page_size = 0, /* unused */
2754 .feature_bits = 0,
2755 .tested = TEST_OK_PR,
2756 .probe = probe_jedec, /* FIXME! */
2757 .probe_timing = TIMING_ZERO,
2758 .block_erasers =
2759 {
2760 {
2761 .eraseblocks = { {64 * 1024, 1} },
2762 .block_erase = NULL, /* TODO */
2763 },
2764 },
2765 .write = NULL, /* TODO */
2766 .read = read_memmapped,
2767 .voltage = {4500, 5500},
2768 },
2769
2770 {
Joshua Roysf1324e02010-09-16 00:51:51 +00002771 .vendor = "Bright",
2772 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002773 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00002774 .manufacture_id = BRIGHT_ID,
2775 .model_id = BRIGHT_BM29F040,
2776 .total_size = 512,
2777 .page_size = 64 * 1024,
2778 .feature_bits = FEATURE_EITHER_RESET,
2779 .tested = TEST_OK_PR,
2780 .probe = probe_jedec,
2781 .probe_timing = TIMING_ZERO,
2782 .block_erasers =
2783 {
2784 {
2785 .eraseblocks = { {64 * 1024, 8} },
2786 .block_erase = erase_sector_jedec,
2787 }, {
2788 .eraseblocks = { {512 * 1024, 1} },
2789 .block_erase = erase_chip_block_jedec,
2790 },
2791 },
2792 .write = write_jedec_1,
2793 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00002794 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00002795 },
2796
2797 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00002798 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002799 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002800 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00002801 .manufacture_id = ESMT_ID,
2802 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002803 .total_size = 256,
2804 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00002805 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002806 .tested = TEST_UNTESTED,
2807 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002808 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00002809 .block_erasers =
2810 {
2811 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00002812 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00002813 {128 * 1024, 1},
2814 {96 * 1024, 1},
2815 {8 * 1024, 2},
2816 {16 * 1024, 1},
2817 },
2818 .block_erase = erase_sector_jedec,
2819 }, {
2820 .eraseblocks = { {256 * 1024, 1} },
2821 .block_erase = erase_chip_block_jedec,
2822 }
2823 },
Sean Nelson35727f72010-01-28 23:55:12 +00002824 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002825 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002826 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002827 },
2828
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002829 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00002830 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00002831 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002832 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00002833 .manufacture_id = ESMT_ID,
2834 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002835 .total_size = 1024,
2836 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002837 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00002838 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00002839 .probe = probe_spi_rdid,
2840 .probe_timing = TIMING_ZERO,
2841 .block_erasers =
2842 {
2843 {
2844 .eraseblocks = { {4 * 1024, 256} },
2845 .block_erase = spi_block_erase_20,
2846 }, {
2847 .eraseblocks = { {64 * 1024, 16} },
2848 .block_erase = spi_block_erase_d8,
2849 }, {
2850 .eraseblocks = { {1024 * 1024, 1} },
2851 .block_erase = spi_block_erase_60,
2852 }, {
2853 .eraseblocks = { {1024 * 1024, 1} },
2854 .block_erase = spi_block_erase_c7,
2855 }
2856 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002857 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002858 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00002859 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00002860 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002861 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00002862 },
2863
2864 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002865 .vendor = "Eon",
2866 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002867 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002868 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002869 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002870 .total_size = 64,
2871 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002872 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002873 .tested = TEST_UNTESTED,
2874 .probe = probe_spi_rdid,
2875 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002876 .block_erasers =
2877 {
2878 {
2879 .eraseblocks = {
2880 {4 * 1024, 2},
2881 {8 * 1024, 1},
2882 {16 * 1024, 1},
2883 {32 * 1024, 1},
2884 },
2885 .block_erase = spi_block_erase_d8,
2886 }, {
2887 .eraseblocks = { {64 * 1024, 1} },
2888 .block_erase = spi_block_erase_c7,
2889 }
2890 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002891 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002892 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002893 .write = spi_chip_write_256,
2894 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002895 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00002896 },
2897
2898 {
2899 .vendor = "Eon",
2900 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002901 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00002902 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002903 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00002904 .total_size = 64,
2905 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002906 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00002907 .tested = TEST_UNTESTED,
2908 .probe = probe_spi_rdid,
2909 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002910 .block_erasers =
2911 {
2912 {
2913 .eraseblocks = {
2914 {32 * 1024, 1},
2915 {16 * 1024, 1},
2916 {8 * 1024, 1},
2917 {4 * 1024, 2},
2918 },
2919 .block_erase = spi_block_erase_d8,
2920 }, {
2921 .eraseblocks = { {64 * 1024, 1} },
2922 .block_erase = spi_block_erase_c7,
2923 }
2924 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002926 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002927 .write = spi_chip_write_256,
2928 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002929 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002930 },
2931
2932 {
2933 .vendor = "Eon",
2934 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002935 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00002936 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002937 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002938 .total_size = 128,
2939 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002940 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002941 .tested = TEST_UNTESTED,
2942 .probe = probe_spi_rdid,
2943 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002944 .block_erasers =
2945 {
2946 {
2947 .eraseblocks = {
2948 {4 * 1024, 2},
2949 {8 * 1024, 1},
2950 {16 * 1024, 1},
2951 {32 * 1024, 3},
2952 },
2953 .block_erase = spi_block_erase_d8,
2954 }, {
2955 .eraseblocks = { {128 * 1024, 1} },
2956 .block_erase = spi_block_erase_c7,
2957 }
2958 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002959 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002960 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00002961 .write = spi_chip_write_256,
2962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002963 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00002964 },
2965
2966 {
2967 .vendor = "Eon",
2968 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002969 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00002970 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002971 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00002972 .total_size = 128,
2973 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002974 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00002975 .tested = TEST_UNTESTED,
2976 .probe = probe_spi_rdid,
2977 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00002978 .block_erasers =
2979 {
2980 {
2981 .eraseblocks = {
2982 {32 * 1024, 3},
2983 {16 * 1024, 1},
2984 {8 * 1024, 1},
2985 {4 * 1024, 2},
2986 },
2987 .block_erase = spi_block_erase_d8,
2988 }, {
2989 .eraseblocks = { {128 * 1024, 1} },
2990 .block_erase = spi_block_erase_c7,
2991 }
2992 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002993 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002994 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002995 .write = spi_chip_write_256,
2996 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002997 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00002998 },
2999
3000 {
3001 .vendor = "Eon",
3002 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003003 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003004 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003005 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003006 .total_size = 256,
3007 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003008 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003009 .tested = TEST_UNTESTED,
3010 .probe = probe_spi_rdid,
3011 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003012 .block_erasers =
3013 {
3014 {
3015 .eraseblocks = {
3016 {4 * 1024, 2},
3017 {8 * 1024, 1},
3018 {16 * 1024, 1},
3019 {32 * 1024, 1},
3020 {64 * 1024, 3}
3021 },
3022 .block_erase = spi_block_erase_d8,
3023 }, {
3024 .eraseblocks = { {256 * 1024, 1} },
3025 .block_erase = spi_block_erase_c7,
3026 }
3027 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003028 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003029 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003030 .write = spi_chip_write_256,
3031 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003032 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003033 },
3034
3035 {
3036 .vendor = "Eon",
3037 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003038 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003039 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003040 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003041 .total_size = 256,
3042 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003043 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003044 .tested = TEST_UNTESTED,
3045 .probe = probe_spi_rdid,
3046 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003047 .block_erasers =
3048 {
3049 {
3050 .eraseblocks = {
3051 {64 * 1024, 3},
3052 {32 * 1024, 1},
3053 {16 * 1024, 1},
3054 {8 * 1024, 1},
3055 {4 * 1024, 2},
3056 },
3057 .block_erase = spi_block_erase_d8,
3058 }, {
3059 .eraseblocks = { {256 * 1024, 1} },
3060 .block_erase = spi_block_erase_c7,
3061 }
3062 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003063 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003064 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003065 .write = spi_chip_write_256,
3066 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003067 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003068 },
3069
3070 {
3071 .vendor = "Eon",
3072 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003073 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003074 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003075 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003076 .total_size = 512,
3077 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003078 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003079 .tested = TEST_UNTESTED,
3080 .probe = probe_spi_rdid,
3081 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003082 .block_erasers =
3083 {
3084 {
3085 .eraseblocks = {
3086 {4 * 1024, 2},
3087 {8 * 1024, 1},
3088 {16 * 1024, 1},
3089 {32 * 1024, 1},
3090 {64 * 1024, 7}
3091 },
3092 .block_erase = spi_block_erase_d8,
3093 }, {
3094 .eraseblocks = { {512 * 1024, 1} },
3095 .block_erase = spi_block_erase_c7,
3096 }
3097 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003098 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003099 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003100 .write = spi_chip_write_256,
3101 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003102 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003103 },
3104
3105 {
3106 .vendor = "Eon",
3107 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003108 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003109 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003110 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003111 .total_size = 512,
3112 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003113 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003114 .tested = TEST_UNTESTED,
3115 .probe = probe_spi_rdid,
3116 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003117 .block_erasers =
3118 {
3119 {
3120 .eraseblocks = {
3121 {64 * 1024, 7},
3122 {32 * 1024, 1},
3123 {16 * 1024, 1},
3124 {8 * 1024, 1},
3125 {4 * 1024, 2},
3126 },
3127 .block_erase = spi_block_erase_d8,
3128 }, {
3129 .eraseblocks = { {512 * 1024, 1} },
3130 .block_erase = spi_block_erase_c7,
3131 }
3132 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003133 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003134 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003135 .write = spi_chip_write_256,
3136 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003137 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003138 },
3139
3140 {
3141 .vendor = "Eon",
3142 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003143 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003144 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003145 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003146 .total_size = 1024,
3147 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003148 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003149 .tested = TEST_UNTESTED,
3150 .probe = probe_spi_rdid,
3151 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003152 .block_erasers =
3153 {
3154 {
3155 .eraseblocks = {
3156 {4 * 1024, 2},
3157 {8 * 1024, 1},
3158 {16 * 1024, 1},
3159 {32 * 1024, 1},
3160 {64 * 1024, 15}
3161 },
3162 .block_erase = spi_block_erase_d8,
3163 }, {
3164 .eraseblocks = { {1024 * 1024, 1} },
3165 .block_erase = spi_block_erase_c7,
3166 }
3167 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003168 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003169 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003170 .write = spi_chip_write_256,
3171 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003172 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003173 },
3174
3175 {
3176 .vendor = "Eon",
3177 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003178 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003179 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003180 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003181 .total_size = 1024,
3182 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003183 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003184 .tested = TEST_UNTESTED,
3185 .probe = probe_spi_rdid,
3186 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003187 .block_erasers =
3188 {
3189 {
3190 .eraseblocks = {
3191 {64 * 1024, 15},
3192 {32 * 1024, 1},
3193 {16 * 1024, 1},
3194 {8 * 1024, 1},
3195 {4 * 1024, 2},
3196 },
3197 .block_erase = spi_block_erase_d8,
3198 }, {
3199 .eraseblocks = { {1024 * 1024, 1} },
3200 .block_erase = spi_block_erase_c7,
3201 }
3202 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003203 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003204 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003205 .write = spi_chip_write_256,
3206 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003207 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003208 },
3209
3210 {
3211 .vendor = "Eon",
3212 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003213 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003214 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003215 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003216 .total_size = 2048,
3217 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003218 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003219 .tested = TEST_UNTESTED,
3220 .probe = probe_spi_rdid,
3221 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003222 .block_erasers =
3223 {
3224 {
3225 .eraseblocks = {
3226 {4 * 1024, 2},
3227 {8 * 1024, 1},
3228 {16 * 1024, 1},
3229 {32 * 1024, 1},
3230 {64 * 1024, 31},
3231 },
3232 .block_erase = spi_block_erase_d8,
3233 }, {
3234 .eraseblocks = { {2 * 1024 * 1024, 1} },
3235 .block_erase = spi_block_erase_c7,
3236 }
3237 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003238 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003239 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003240 .write = spi_chip_write_256,
3241 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003242 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003243 },
3244
3245 {
3246 .vendor = "Eon",
3247 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003248 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003249 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003250 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003251 .total_size = 2048,
3252 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003253 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003254 .tested = TEST_UNTESTED,
3255 .probe = probe_spi_rdid,
3256 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003257 .block_erasers =
3258 {
3259 {
3260 .eraseblocks = {
3261 {64 * 1024, 31},
3262 {32 * 1024, 1},
3263 {16 * 1024, 1},
3264 {8 * 1024, 1},
3265 {4 * 1024, 2},
3266 },
3267 .block_erase = spi_block_erase_d8,
3268 }, {
3269 .eraseblocks = { {2 * 1024 * 1024, 1} },
3270 .block_erase = spi_block_erase_c7,
3271 }
3272 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003273 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003274 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003275 .write = spi_chip_write_256,
3276 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003277 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003278 },
3279
3280 {
3281 .vendor = "Eon",
3282 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003283 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003284 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003285 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003286 .total_size = 4096,
3287 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003288 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003289 .tested = TEST_UNTESTED,
3290 .probe = probe_spi_rdid,
3291 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003292 .block_erasers =
3293 {
3294 {
3295 .eraseblocks = {
3296 {4 * 1024, 2},
3297 {8 * 1024, 1},
3298 {16 * 1024, 1},
3299 {32 * 1024, 1},
3300 {64 * 1024, 63},
3301 },
3302 .block_erase = spi_block_erase_d8,
3303 }, {
3304 .eraseblocks = { {4 * 1024 * 1024, 1} },
3305 .block_erase = spi_block_erase_c7,
3306 }
3307 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003308 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003309 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003310 .write = spi_chip_write_256,
3311 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003312 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003313 },
3314
3315 {
3316 .vendor = "Eon",
3317 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003318 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003319 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003320 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003321 .total_size = 4096,
3322 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003323 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003324 .tested = TEST_UNTESTED,
3325 .probe = probe_spi_rdid,
3326 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003327 .block_erasers =
3328 {
3329 {
3330 .eraseblocks = {
3331 {64 * 1024, 63},
3332 {32 * 1024, 1},
3333 {16 * 1024, 1},
3334 {8 * 1024, 1},
3335 {4 * 1024, 2},
3336 },
3337 .block_erase = spi_block_erase_d8,
3338 }, {
3339 .eraseblocks = { {4 * 1024 * 1024, 1} },
3340 .block_erase = spi_block_erase_c7,
3341 }
3342 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003343 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003344 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003345 .write = spi_chip_write_256,
3346 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003347 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003348 },
3349
3350 {
3351 .vendor = "Eon",
3352 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003353 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003354 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003355 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003356 .total_size = 8192,
3357 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003358 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003359 .tested = TEST_UNTESTED,
3360 .probe = probe_spi_rdid,
3361 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003362 .block_erasers =
3363 {
3364 {
3365 .eraseblocks = {
3366 {4 * 1024, 2},
3367 {8 * 1024, 1},
3368 {16 * 1024, 1},
3369 {32 * 1024, 1},
3370 {64 * 1024, 127},
3371 },
3372 .block_erase = spi_block_erase_d8,
3373 }, {
3374 .eraseblocks = { {8 * 1024 * 1024, 1} },
3375 .block_erase = spi_block_erase_c7,
3376 }
3377 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003378 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003379 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003380 .write = spi_chip_write_256,
3381 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003382 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003383 },
3384
3385 {
3386 .vendor = "Eon",
3387 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003388 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003389 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003390 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00003391 .total_size = 8192,
3392 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003393 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003394 .tested = TEST_UNTESTED,
3395 .probe = probe_spi_rdid,
3396 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003397 .block_erasers =
3398 {
3399 {
3400 .eraseblocks = {
3401 {64 * 1024, 127},
3402 {32 * 1024, 1},
3403 {16 * 1024, 1},
3404 {8 * 1024, 1},
3405 {4 * 1024, 2},
3406 },
3407 .block_erase = spi_block_erase_d8,
3408 }, {
3409 .eraseblocks = { {8 * 1024 * 1024, 1} },
3410 .block_erase = spi_block_erase_c7,
3411 }
3412 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003413 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003414 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003415 .write = spi_chip_write_256,
3416 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003417 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003418 },
3419
3420 {
3421 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003422 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003423 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003424 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003425 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003426 .total_size = 64,
3427 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003428 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00003429 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003430 .probe = probe_spi_rdid,
3431 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003432 .block_erasers =
3433 {
3434 {
3435 .eraseblocks = { {4 * 1024, 16} },
3436 .block_erase = spi_block_erase_20,
3437 }, {
3438 .eraseblocks = { {32 * 1024, 2} },
3439 .block_erase = spi_block_erase_d8,
3440 }, {
3441 .eraseblocks = { {32 * 1024, 2} },
3442 .block_erase = spi_block_erase_52,
3443 }, {
3444 .eraseblocks = { {64 * 1024, 1} },
3445 .block_erase = spi_block_erase_60,
3446 }, {
3447 .eraseblocks = { {64 * 1024, 1} },
3448 .block_erase = spi_block_erase_c7,
3449 }
3450 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003451 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003452 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003453 .write = spi_chip_write_256,
3454 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003455 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003456 },
3457
3458 {
3459 .vendor = "Eon",
3460 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003461 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003462 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003463 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003464 .total_size = 128,
3465 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003466 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003467 .tested = TEST_UNTESTED,
3468 .probe = probe_spi_rdid,
3469 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003470 .block_erasers =
3471 {
3472 {
3473 .eraseblocks = { {4 * 1024, 32} },
3474 .block_erase = spi_block_erase_20,
3475 }, {
3476 .eraseblocks = { {32 * 1024, 4} },
3477 .block_erase = spi_block_erase_d8,
3478 }, {
3479 .eraseblocks = { {32 * 1024, 4} },
3480 .block_erase = spi_block_erase_52,
3481 }, {
3482 .eraseblocks = { {128 * 1024, 1} },
3483 .block_erase = spi_block_erase_60,
3484 }, {
3485 .eraseblocks = { {128 * 1024, 1} },
3486 .block_erase = spi_block_erase_c7,
3487 }
3488 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003489 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003490 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003491 .write = spi_chip_write_256,
3492 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003493 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003494 },
3495
3496 {
3497 .vendor = "Eon",
3498 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003499 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003500 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003501 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003502 .total_size = 256,
3503 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003504 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003505 .tested = TEST_UNTESTED,
3506 .probe = probe_spi_rdid,
3507 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003508 .block_erasers =
3509 {
3510 {
3511 .eraseblocks = { {4 * 1024, 64} },
3512 .block_erase = spi_block_erase_20,
3513 }, {
3514 .eraseblocks = { {64 * 1024, 4} },
3515 .block_erase = spi_block_erase_d8,
3516 }, {
3517 .eraseblocks = { {64 * 1024, 4} },
3518 .block_erase = spi_block_erase_52,
3519 }, {
3520 .eraseblocks = { {256 * 1024, 1} },
3521 .block_erase = spi_block_erase_60,
3522 }, {
3523 .eraseblocks = { {256 * 1024, 1} },
3524 .block_erase = spi_block_erase_c7,
3525 }
3526 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003527 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003528 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003529 .write = spi_chip_write_256,
3530 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003531 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003532 },
3533
3534 {
3535 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003536 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003537 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003538 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003539 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003540 .total_size = 512,
3541 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003542 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00003543 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003544 .probe = probe_spi_rdid,
3545 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003546 .block_erasers =
3547 {
3548 {
Sean Nelson54596372010-01-09 05:30:14 +00003549 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003550 .block_erase = spi_block_erase_20,
3551 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003552 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003553 .block_erase = spi_block_erase_d8,
3554 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003555 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003556 .block_erase = spi_block_erase_60,
3557 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003558 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003559 .block_erase = spi_block_erase_c7,
3560 },
3561 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003562 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003563 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003564 .write = spi_chip_write_256,
3565 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003566 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003567 },
3568
3569 {
3570 .vendor = "Eon",
3571 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003572 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003573 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003574 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003575 .total_size = 1024,
3576 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003577 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00003578 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003579 .probe = probe_spi_rdid,
3580 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003581 .block_erasers =
3582 {
3583 {
3584 .eraseblocks = { {4 * 1024, 256} },
3585 .block_erase = spi_block_erase_20,
3586 }, {
3587 .eraseblocks = { {64 * 1024, 16} },
3588 .block_erase = spi_block_erase_d8,
3589 }, {
3590 .eraseblocks = { {1024 * 1024, 1} },
3591 .block_erase = spi_block_erase_60,
3592 }, {
3593 .eraseblocks = { {1024 * 1024, 1} },
3594 .block_erase = spi_block_erase_c7,
3595 }
3596 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003597 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003598 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003599 .write = spi_chip_write_256,
3600 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003601 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003602 },
3603
3604 {
3605 .vendor = "Eon",
3606 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003607 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003608 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003609 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003610 .total_size = 2048,
3611 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003612 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00003613 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003614 .probe = probe_spi_rdid,
3615 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003616 .block_erasers =
3617 {
3618 {
3619 .eraseblocks = { {4 * 1024, 512} },
3620 .block_erase = spi_block_erase_20,
3621 }, {
3622 .eraseblocks = { {64 * 1024, 32} },
3623 .block_erase = spi_block_erase_d8,
3624 }, {
3625 .eraseblocks = { {2 * 1024 * 1024, 1} },
3626 .block_erase = spi_block_erase_60,
3627 }, {
3628 .eraseblocks = { {2 * 1024 * 1024, 1} },
3629 .block_erase = spi_block_erase_c7,
3630 }
3631 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003632 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003633 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003634 .write = spi_chip_write_256,
3635 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003636 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003637 },
3638
3639 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003640 .vendor = "Eon",
3641 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003642 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003643 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003644 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003645 .total_size = 4096,
3646 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003647 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003648 .tested = TEST_UNTESTED,
3649 .probe = probe_spi_rdid,
3650 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003651 .block_erasers =
3652 {
3653 {
3654 .eraseblocks = { {4 * 1024, 1024} },
3655 .block_erase = spi_block_erase_20,
3656 }, {
3657 .eraseblocks = { {64 * 1024, 64} },
3658 .block_erase = spi_block_erase_d8,
3659 }, {
3660 .eraseblocks = { {4 * 1024 * 1024, 1} },
3661 .block_erase = spi_block_erase_60,
3662 }, {
3663 .eraseblocks = { {4 * 1024 * 1024, 1} },
3664 .block_erase = spi_block_erase_c7,
3665 }
3666 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003667 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003668 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003669 .write = spi_chip_write_256,
3670 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003671 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003672 },
3673
3674 {
Russ Dill3cd5a122010-03-05 08:44:11 +00003675 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00003676 .name = "EN25F64",
3677 .bustype = BUS_SPI,
3678 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00003679 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003680 .total_size = 8192,
3681 .page_size = 256,
3682 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00003683 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00003684 .probe = probe_spi_rdid,
3685 .probe_timing = TIMING_ZERO,
3686 .block_erasers =
3687 {
3688 {
3689 .eraseblocks = { {4 * 1024, 2048} },
3690 .block_erase = spi_block_erase_20,
3691 }, {
3692 .eraseblocks = { {64 * 1024, 128} },
3693 .block_erase = spi_block_erase_d8,
3694 }, {
3695 .eraseblocks = { {8 * 1024 * 1024, 1} },
3696 .block_erase = spi_block_erase_60,
3697 }, {
3698 .eraseblocks = { {8 * 1024 * 1024, 1} },
3699 .block_erase = spi_block_erase_c7,
3700 }
3701 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003702 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00003703 .unlock = spi_disable_blockprotect,
3704 .write = spi_chip_write_256,
3705 .read = spi_chip_read,
3706 .voltage = {2700, 3600},
3707 },
3708
3709 {
3710 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00003711 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003712 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003713 .manufacture_id = EON_ID_NOPREFIX,
3714 .model_id = EON_EN25Q40,
3715 .total_size = 512,
3716 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003717 /* OTP: 256B total; enter 0x3A */
3718 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003719 .tested = TEST_UNTESTED,
3720 .probe = probe_spi_rdid,
3721 .probe_timing = TIMING_ZERO,
3722 .block_erasers =
3723 {
3724 {
3725 .eraseblocks = { {4 * 1024, 128} },
3726 .block_erase = spi_block_erase_20,
3727 }, {
3728 .eraseblocks = { {64 * 1024, 8} },
3729 .block_erase = spi_block_erase_d8,
3730 }, {
3731 .eraseblocks = { {512 * 1024, 1} },
3732 .block_erase = spi_block_erase_60,
3733 }, {
3734 .eraseblocks = { {512 * 1024, 1} },
3735 .block_erase = spi_block_erase_c7,
3736 }
3737 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003738 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003739 .unlock = spi_disable_blockprotect,
3740 .write = spi_chip_write_256,
3741 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003742 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003743 },
3744
3745 {
3746 .vendor = "Eon",
3747 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003748 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003749 .manufacture_id = EON_ID_NOPREFIX,
3750 .model_id = EON_EN25Q80,
3751 .total_size = 1024,
3752 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003753 /* OTP: 256B total; enter 0x3A */
3754 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003755 .tested = TEST_UNTESTED,
3756 .probe = probe_spi_rdid,
3757 .probe_timing = TIMING_ZERO,
3758 .block_erasers =
3759 {
3760 {
3761 .eraseblocks = { {4 * 1024, 256} },
3762 .block_erase = spi_block_erase_20,
3763 }, {
3764 .eraseblocks = { {64 * 1024, 16} },
3765 .block_erase = spi_block_erase_d8,
3766 }, {
3767 .eraseblocks = { {1024 * 1024, 1} },
3768 .block_erase = spi_block_erase_60,
3769 }, {
3770 .eraseblocks = { {1024 * 1024, 1} },
3771 .block_erase = spi_block_erase_c7,
3772 }
3773 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003774 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003775 .unlock = spi_disable_blockprotect,
3776 .write = spi_chip_write_256,
3777 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003778 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003779 },
3780
3781 {
3782 /* Note: EN25D16 is an evil twin which shares the model ID
3783 but has different write protection capabilities */
3784 .vendor = "Eon",
3785 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003786 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003787 .manufacture_id = EON_ID_NOPREFIX,
3788 .model_id = EON_EN25Q16,
3789 .total_size = 2048,
3790 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003791 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3792 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003793 .tested = TEST_UNTESTED,
3794 .probe = probe_spi_rdid,
3795 .probe_timing = TIMING_ZERO,
3796 .block_erasers =
3797 {
3798 {
3799 .eraseblocks = { {4 * 1024, 512} },
3800 .block_erase = spi_block_erase_20,
3801 }, {
3802 .eraseblocks = { {64 * 1024, 32} },
3803 .block_erase = spi_block_erase_d8,
3804 }, {
3805 /* not supported by Q16 version */
3806 .eraseblocks = { {64 * 1024, 32} },
3807 .block_erase = spi_block_erase_52,
3808 }, {
3809 .eraseblocks = { {2 * 1024 * 1024, 1} },
3810 .block_erase = spi_block_erase_60,
3811 }, {
3812 .eraseblocks = { {2 * 1024 * 1024, 1} },
3813 .block_erase = spi_block_erase_c7,
3814 }
3815 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003816 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003817 .unlock = spi_disable_blockprotect,
3818 .write = spi_chip_write_256,
3819 .read = spi_chip_read,
3820 .voltage = {2700, 3600},
3821 },
3822
3823 {
3824 .vendor = "Eon",
3825 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003826 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003827 .manufacture_id = EON_ID_NOPREFIX,
3828 .model_id = EON_EN25Q32,
3829 .total_size = 4096,
3830 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003831 /* OTP: 512B total; enter 0x3A */
3832 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003833 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00003834 .probe = probe_spi_rdid,
3835 .probe_timing = TIMING_ZERO,
3836 .block_erasers =
3837 {
3838 {
3839 .eraseblocks = { {4 * 1024, 1024} },
3840 .block_erase = spi_block_erase_20,
3841 }, {
3842 .eraseblocks = { {64 * 1024, 64} },
3843 .block_erase = spi_block_erase_d8,
3844 }, {
3845 .eraseblocks = { {4 * 1024 * 1024, 1} },
3846 .block_erase = spi_block_erase_60,
3847 }, {
3848 .eraseblocks = { {4 * 1024 * 1024, 1} },
3849 .block_erase = spi_block_erase_c7,
3850 }
3851 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003852 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003853 .unlock = spi_disable_blockprotect,
3854 .write = spi_chip_write_256,
3855 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003856 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003857 },
3858
3859 {
3860 .vendor = "Eon",
3861 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003862 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003863 .manufacture_id = EON_ID_NOPREFIX,
3864 .model_id = EON_EN25Q64,
3865 .total_size = 8192,
3866 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003867 /* OTP: 512B total; enter 0x3A */
3868 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003869 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00003870 .probe = probe_spi_rdid,
3871 .probe_timing = TIMING_ZERO,
3872 .block_erasers =
3873 {
3874 {
3875 .eraseblocks = { {4 * 1024, 2048} },
3876 .block_erase = spi_block_erase_20,
3877 }, {
3878 .eraseblocks = { {64 * 1024, 128} },
3879 .block_erase = spi_block_erase_d8,
3880 }, {
3881 .eraseblocks = { {8 * 1024 * 1024, 1} },
3882 .block_erase = spi_block_erase_60,
3883 }, {
3884 .eraseblocks = { {8 * 1024 * 1024, 1} },
3885 .block_erase = spi_block_erase_c7,
3886 }
3887 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003888 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003889 .unlock = spi_disable_blockprotect,
3890 .write = spi_chip_write_256,
3891 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00003892 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00003893 },
3894
3895 {
3896 .vendor = "Eon",
3897 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003898 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003899 .manufacture_id = EON_ID_NOPREFIX,
3900 .model_id = EON_EN25Q128,
3901 .total_size = 16384,
3902 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003903 /* OTP: 512B total; enter 0x3A */
3904 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00003905 .tested = TEST_UNTESTED,
3906 .probe = probe_spi_rdid,
3907 .probe_timing = TIMING_ZERO,
3908 .block_erasers =
3909 {
3910 {
3911 .eraseblocks = { {4 * 1024, 4096} },
3912 .block_erase = spi_block_erase_20,
3913 }, {
3914 .eraseblocks = { {64 * 1024, 256} },
3915 .block_erase = spi_block_erase_d8,
3916 }, {
3917 .eraseblocks = { {16 * 1024 * 1024, 1} },
3918 .block_erase = spi_block_erase_60,
3919 }, {
3920 .eraseblocks = { {16 * 1024 * 1024, 1} },
3921 .block_erase = spi_block_erase_c7,
3922 }
3923 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003924 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00003925 .unlock = spi_disable_blockprotect,
3926 .write = spi_chip_write_256,
3927 .read = spi_chip_read,
3928 },
3929
3930 {
3931 .vendor = "Eon",
3932 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003933 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00003934 .manufacture_id = EON_ID_NOPREFIX,
3935 .model_id = EON_EN25QH16,
3936 .total_size = 2048,
3937 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00003938 /* supports SFDP */
3939 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003940 /* QPI enable 0x38, disable 0xFF */
3941 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00003942 .tested = TEST_OK_PR,
David Hendricks6d715302011-07-24 22:21:57 +00003943 .probe = probe_spi_rdid,
3944 .probe_timing = TIMING_ZERO,
3945 .block_erasers =
3946 {
3947 {
3948 .eraseblocks = { {4 * 1024, 512} },
3949 .block_erase = spi_block_erase_20,
3950 }, {
3951 .eraseblocks = { {64 * 1024, 32} },
3952 .block_erase = spi_block_erase_d8,
3953 }, {
3954 .eraseblocks = { {1024 * 2048, 1} },
3955 .block_erase = spi_block_erase_60,
3956 }, {
3957 .eraseblocks = { {1024 * 2048, 1} },
3958 .block_erase = spi_block_erase_c7,
3959 }
3960 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003961 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
3962 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00003963 .write = spi_chip_write_256,
3964 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00003965 .voltage = {2700, 3600},
3966 },
3967
3968 {
3969 .vendor = "Eon",
3970 .name = "EN25QH32",
3971 .bustype = BUS_SPI,
3972 .manufacture_id = EON_ID_NOPREFIX,
3973 .model_id = EON_EN25QH32,
3974 .total_size = 4096,
3975 .page_size = 256,
3976 /* supports SFDP */
3977 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003978 /* QPI enable 0x38, disable 0xFF */
3979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00003980 .tested = TEST_UNTESTED,
3981 .probe = probe_spi_rdid,
3982 .probe_timing = TIMING_ZERO,
3983 .block_erasers =
3984 {
3985 {
3986 .eraseblocks = { {4 * 1024, 1024} },
3987 .block_erase = spi_block_erase_20,
3988 }, {
3989 .eraseblocks = { {64 * 1024, 64} },
3990 .block_erase = spi_block_erase_d8,
3991 }, {
3992 .eraseblocks = { {1024 * 4096, 1} },
3993 .block_erase = spi_block_erase_60,
3994 }, {
3995 .eraseblocks = { {1024 * 4096, 1} },
3996 .block_erase = spi_block_erase_c7,
3997 }
3998 },
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00003999 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4000 .unlock = spi_disable_blockprotect_bp3_srwd,
4001 .write = spi_chip_write_256,
4002 .read = spi_chip_read,
4003 .voltage = {2700, 3600},
4004 },
4005
4006 {
4007 .vendor = "Eon",
4008 .name = "EN25QH64",
4009 .bustype = BUS_SPI,
4010 .manufacture_id = EON_ID_NOPREFIX,
4011 .model_id = EON_EN25QH64,
4012 .total_size = 8192,
4013 .page_size = 256,
4014 /* supports SFDP */
4015 /* OTP: 512B total; enter 0x3A */
4016 /* QPI enable 0x38, disable 0xFF */
4017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4018 .tested = TEST_UNTESTED,
4019 .probe = probe_spi_rdid,
4020 .probe_timing = TIMING_ZERO,
4021 .block_erasers = {
4022 {
4023 .eraseblocks = { {4 * 1024, 2048} },
4024 .block_erase = spi_block_erase_20,
4025 }, {
4026 .eraseblocks = { {64 * 1024, 128} },
4027 .block_erase = spi_block_erase_d8,
4028 }, {
4029 .eraseblocks = { { 8192 * 1024, 1} },
4030 .block_erase = spi_block_erase_60,
4031 }, {
4032 .eraseblocks = { { 8192 * 1024, 1} },
4033 .block_erase = spi_block_erase_c7,
4034 }
4035 },
4036 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4037 .unlock = spi_disable_blockprotect_bp3_srwd,
4038 .write = spi_chip_write_256,
4039 .read = spi_chip_read,
4040 .voltage = {2700, 3600},
4041 },
4042
4043 {
4044 .vendor = "Eon",
4045 .name = "EN25QH128",
4046 .bustype = BUS_SPI,
4047 .manufacture_id = EON_ID_NOPREFIX,
4048 .model_id = EON_EN25QH128,
4049 .total_size = 16384,
4050 .page_size = 256,
4051 /* supports SFDP */
4052 /* OTP: 512B total; enter 0x3A */
4053 /* QPI enable 0x38, disable 0xFF */
4054 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4055 .tested = TEST_UNTESTED,
4056 .probe = probe_spi_rdid,
4057 .probe_timing = TIMING_ZERO,
4058 .block_erasers = {
4059 {
4060 .eraseblocks = { {4 * 1024, 4096} },
4061 .block_erase = spi_block_erase_20,
4062 }, {
4063 .eraseblocks = { {64 * 1024, 256} },
4064 .block_erase = spi_block_erase_d8,
4065 }, {
4066 .eraseblocks = { { 16384 * 1024, 1} },
4067 .block_erase = spi_block_erase_60,
4068 }, {
4069 .eraseblocks = { { 16384 * 1024, 1} },
4070 .block_erase = spi_block_erase_c7,
4071 }
4072 },
4073 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
4074 .unlock = spi_disable_blockprotect_bp3_srwd,
4075 .write = spi_chip_write_256,
4076 .read = spi_chip_read,
4077 .voltage = {2700, 3600},
4078 },
4079
4080 {
4081 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004082 .name = "EN25S10",
4083 .bustype = BUS_SPI,
4084 .manufacture_id = EON_ID_NOPREFIX,
4085 .model_id = EON_EN25S10,
4086 .total_size = 128,
4087 .page_size = 256,
4088 /* OTP: 256B total; enter 0x3A */
4089 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4090 .tested = TEST_UNTESTED,
4091 .probe = probe_spi_rdid,
4092 .probe_timing = TIMING_ZERO,
4093 .block_erasers = {
4094 {
4095 .eraseblocks = { {4 * 1024, 32} },
4096 .block_erase = spi_block_erase_20,
4097 }, {
4098 .eraseblocks = { {32 * 1024, 4} },
4099 .block_erase = spi_block_erase_52,
4100 }, {
4101 .eraseblocks = { {128 * 1024, 1} },
4102 .block_erase = spi_block_erase_60,
4103 }, {
4104 .eraseblocks = { {128 * 1024, 1} },
4105 .block_erase = spi_block_erase_c7,
4106 }
4107 },
4108 .printlock = spi_prettyprint_status_register_default_bp2,
4109 .unlock = spi_disable_blockprotect,
4110 .write = spi_chip_write_256,
4111 .read = spi_chip_read,
4112 .voltage = {1650, 1950},
4113 },
4114
4115 {
4116 .vendor = "Eon",
4117 .name = "EN25S20",
4118 .bustype = BUS_SPI,
4119 .manufacture_id = EON_ID_NOPREFIX,
4120 .model_id = EON_EN25S20,
4121 .total_size = 256,
4122 .page_size = 256,
4123 /* OTP: 256B total; enter 0x3A */
4124 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4125 .tested = TEST_UNTESTED,
4126 .probe = probe_spi_rdid,
4127 .probe_timing = TIMING_ZERO,
4128 .block_erasers = {
4129 {
4130 .eraseblocks = { {4 * 1024, 64} },
4131 .block_erase = spi_block_erase_20,
4132 }, {
4133 .eraseblocks = { {64 * 1024, 4} },
4134 .block_erase = spi_block_erase_d8,
4135 }, {
4136 .eraseblocks = { {256 * 1024, 1} },
4137 .block_erase = spi_block_erase_60,
4138 }, {
4139 .eraseblocks = { {256 * 1024, 1} },
4140 .block_erase = spi_block_erase_c7,
4141 }
4142 },
4143 .printlock = spi_prettyprint_status_register_default_bp2,
4144 .unlock = spi_disable_blockprotect,
4145 .write = spi_chip_write_256,
4146 .read = spi_chip_read,
4147 .voltage = {1650, 1950},
4148 },
4149
4150 {
4151 .vendor = "Eon",
4152 .name = "EN25S40",
4153 .bustype = BUS_SPI,
4154 .manufacture_id = EON_ID_NOPREFIX,
4155 .model_id = EON_EN25S40,
4156 .total_size = 512,
4157 .page_size = 256,
4158 /* OTP: 256B total; enter 0x3A */
4159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers = {
4164 {
4165 .eraseblocks = { {4 * 1024, 128} },
4166 .block_erase = spi_block_erase_20,
4167 }, {
4168 .eraseblocks = { {64 * 1024, 8} },
4169 .block_erase = spi_block_erase_d8,
4170 }, {
4171 .eraseblocks = { {512 * 1024, 1} },
4172 .block_erase = spi_block_erase_60,
4173 }, {
4174 .eraseblocks = { {512 * 1024, 1} },
4175 .block_erase = spi_block_erase_c7,
4176 }
4177 },
4178 .printlock = spi_prettyprint_status_register_default_bp2,
4179 .unlock = spi_disable_blockprotect,
4180 .write = spi_chip_write_256,
4181 .read = spi_chip_read,
4182 .voltage = {1650, 1950},
4183 },
4184
4185 {
4186 .vendor = "Eon",
4187 .name = "EN25S80",
4188 .bustype = BUS_SPI,
4189 .manufacture_id = EON_ID_NOPREFIX,
4190 .model_id = EON_EN25S80,
4191 .total_size = 1024,
4192 .page_size = 256,
4193 /* OTP: 256B total; enter 0x3A */
4194 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4195 .tested = TEST_UNTESTED,
4196 .probe = probe_spi_rdid,
4197 .probe_timing = TIMING_ZERO,
4198 .block_erasers = {
4199 {
4200 .eraseblocks = { {4 * 1024, 256} },
4201 .block_erase = spi_block_erase_20,
4202 }, {
4203 .eraseblocks = { {64 * 1024, 16} },
4204 .block_erase = spi_block_erase_d8,
4205 }, {
4206 .eraseblocks = { {1024 * 1024, 1} },
4207 .block_erase = spi_block_erase_60,
4208 }, {
4209 .eraseblocks = { {1024 * 1024, 1} },
4210 .block_erase = spi_block_erase_c7,
4211 }
4212 },
4213 .printlock = spi_prettyprint_status_register_default_bp2,
4214 .unlock = spi_disable_blockprotect,
4215 .write = spi_chip_write_256,
4216 .read = spi_chip_read,
4217 .voltage = {1650, 1950},
4218 },
4219
4220 {
4221 .vendor = "Eon",
4222 .name = "EN25S16",
4223 .bustype = BUS_SPI,
4224 .manufacture_id = EON_ID_NOPREFIX,
4225 .model_id = EON_EN25S16,
4226 .total_size = 2048,
4227 .page_size = 256,
4228 /* OTP: 512B total; enter 0x3A */
4229 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4230 .tested = TEST_UNTESTED,
4231 .probe = probe_spi_rdid,
4232 .probe_timing = TIMING_ZERO,
4233 .block_erasers = {
4234 {
4235 .eraseblocks = { {4 * 1024, 512} },
4236 .block_erase = spi_block_erase_20,
4237 }, {
4238 .eraseblocks = { {64 * 1024, 32} },
4239 .block_erase = spi_block_erase_52,
4240 }, {
4241 .eraseblocks = { {32 * 1024, 64} },
4242 .block_erase = spi_block_erase_d8,
4243 }, {
4244 .eraseblocks = { {2048 * 1024, 1} },
4245 .block_erase = spi_block_erase_60,
4246 }, {
4247 .eraseblocks = { {2048 * 1024, 1} },
4248 .block_erase = spi_block_erase_c7,
4249 }
4250 },
4251 .printlock = spi_prettyprint_status_register_en25s_wp,
4252 .unlock = spi_disable_blockprotect_bp3_srwd,
4253 .write = spi_chip_write_256,
4254 .read = spi_chip_read,
4255 .voltage = {1650, 1950},
4256 },
4257
4258 {
4259 .vendor = "Eon",
4260 .name = "EN25S32",
4261 .bustype = BUS_SPI,
4262 .manufacture_id = EON_ID_NOPREFIX,
4263 .model_id = EON_EN25S32,
4264 .total_size = 4096,
4265 .page_size = 256,
4266 /* OTP: 512B total; enter 0x3A */
4267 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4268 .tested = TEST_UNTESTED,
4269 .probe = probe_spi_rdid,
4270 .probe_timing = TIMING_ZERO,
4271 .block_erasers = {
4272 {
4273 .eraseblocks = { {4 * 1024, 1024} },
4274 .block_erase = spi_block_erase_20,
4275 }, {
4276 .eraseblocks = { {32 * 1024, 128} },
4277 .block_erase = spi_block_erase_52,
4278 }, {
4279 .eraseblocks = { {64 * 1024, 64} },
4280 .block_erase = spi_block_erase_d8,
4281 }, {
4282 .eraseblocks = { {4096 * 1024, 1} },
4283 .block_erase = spi_block_erase_60,
4284 }, {
4285 .eraseblocks = { {4096 * 1024, 1} },
4286 .block_erase = spi_block_erase_c7,
4287 }
4288 },
4289 .printlock = spi_prettyprint_status_register_en25s_wp,
4290 .unlock = spi_disable_blockprotect_bp3_srwd,
4291 .write = spi_chip_write_256,
4292 .read = spi_chip_read,
4293 .voltage = {1650, 1950},
4294 },
4295
4296 {
4297 .vendor = "Eon",
4298 .name = "EN25S64",
4299 .bustype = BUS_SPI,
4300 .manufacture_id = EON_ID_NOPREFIX,
4301 .model_id = EON_EN25S64,
4302 .total_size = 8192,
4303 .page_size = 256,
4304 /* OTP: 512B total; enter 0x3A */
4305 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4306 .tested = TEST_UNTESTED,
4307 .probe = probe_spi_rdid,
4308 .probe_timing = TIMING_ZERO,
4309 .block_erasers = {
4310 {
4311 .eraseblocks = { {4 * 1024, 2048} },
4312 .block_erase = spi_block_erase_20,
4313 }, {
4314 .eraseblocks = { {64 * 1024, 128} },
4315 .block_erase = spi_block_erase_d8,
4316 }, {
4317 .eraseblocks = { {8192 * 1024, 1} },
4318 .block_erase = spi_block_erase_60,
4319 }, {
4320 .eraseblocks = { {8192 * 1024, 1} },
4321 .block_erase = spi_block_erase_c7,
4322 }
4323 },
4324 .printlock = spi_prettyprint_status_register_en25s_wp,
4325 .unlock = spi_disable_blockprotect_bp3_srwd,
4326 .write = spi_chip_write_256,
4327 .read = spi_chip_read,
4328 .voltage = {1650, 1950},
4329 },
4330
4331 {
4332 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00004333 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004334 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00004335 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004336 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00004337 .total_size = 128,
4338 .page_size = 128,
4339 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004340 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00004341 .probe = probe_jedec,
4342 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4343 .block_erasers =
4344 {
4345 {
4346 .eraseblocks = { {16 * 1024, 8} },
4347 .block_erase = erase_sector_jedec,
4348 },
4349 {
4350 .eraseblocks = { {128 * 1024, 1} },
4351 .block_erase = erase_chip_block_jedec,
4352 },
4353 },
4354 .write = write_jedec_1,
4355 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004356 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00004357 },
4358
4359 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004360 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004361 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004362 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004363 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004364 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004365 .total_size = 256,
4366 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004367 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004368 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004369 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004370 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004371 .block_erasers =
4372 {
4373 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004374 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004375 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004376 {8 * 1024, 2},
4377 {32 * 1024, 1},
4378 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004379 },
4380 .block_erase = erase_sector_jedec,
4381 }, {
4382 .eraseblocks = { {256 * 1024, 1} },
4383 .block_erase = erase_chip_block_jedec,
4384 },
4385 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004386 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004387 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004388 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004389 },
4390
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004391 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004392 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004393 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004394 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004395 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004396 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004397 .total_size = 256,
4398 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004399 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00004400 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004401 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004402 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004403 .block_erasers =
4404 {
4405 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004406 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004407 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004408 {32 * 1024, 1},
4409 {8 * 1024, 2},
4410 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004411 },
4412 .block_erase = erase_sector_jedec,
4413 }, {
4414 .eraseblocks = { {256 * 1024, 1} },
4415 .block_erase = erase_chip_block_jedec,
4416 },
4417 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004418 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004419 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004420 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004421 },
4422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004423 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004424 .vendor = "Eon",
4425 .name = "EN29LV640B",
4426 .bustype = BUS_PARALLEL,
4427 .manufacture_id = EON_ID,
4428 .model_id = EON_EN29LV640B,
4429 .total_size = 8192,
4430 .page_size = 8192,
4431 .feature_bits = 0,
4432 .tested = TEST_OK_PREW,
4433 .probe = probe_en29lv640b,
4434 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4435 .block_erasers =
4436 {
4437 {
4438 .eraseblocks = {
4439 {8 * 1024, 8},
4440 {64 * 1024, 127},
4441 },
4442 .block_erase = block_erase_en29lv640b,
4443 }, {
4444 .eraseblocks = { {8 * 1024 * 1024, 1} },
4445 .block_erase = block_erase_chip_en29lv640b,
4446 },
4447 },
4448 .write = write_en29lv640b,
4449 .read = read_memmapped,
4450 .voltage = {2700, 3600},
4451 },
4452
4453 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004454 .vendor = "Fujitsu",
4455 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004456 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004457 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004458 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004459 .total_size = 512,
4460 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004461 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004462 .tested = TEST_UNTESTED,
4463 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004464 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004465 .block_erasers =
4466 {
4467 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004468 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004469 {16 * 1024, 1},
4470 {8 * 1024, 2},
4471 {32 * 1024, 1},
4472 {64 * 1024, 7},
4473 },
Sean Nelson35727f72010-01-28 23:55:12 +00004474 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004475 }, {
4476 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004477 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004478 },
4479 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004480 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004481 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004482 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004483 },
4484
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004485 {
4486 .vendor = "Fujitsu",
4487 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004488 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004489 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004490 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004491 .total_size = 512,
4492 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004493 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004494 .tested = TEST_UNTESTED,
4495 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004496 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004497 .block_erasers =
4498 {
4499 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004500 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004501 {64 * 1024, 7},
4502 {32 * 1024, 1},
4503 {8 * 1024, 2},
4504 {16 * 1024, 1},
4505 },
Sean Nelson35727f72010-01-28 23:55:12 +00004506 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004507 }, {
4508 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00004509 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00004510 },
4511 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004512 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004513 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004514 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004515 },
4516
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004517 {
Sean Nelson35727f72010-01-28 23:55:12 +00004518 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004519 .vendor = "Fujitsu",
4520 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004521 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004522 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004523 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004524 .total_size = 512,
4525 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004526 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004527 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004528 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004529 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004530 .block_erasers =
4531 {
4532 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004533 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004534 {16 * 1024, 1},
4535 {8 * 1024, 2},
4536 {32 * 1024, 1},
4537 {64 * 1024, 7},
4538 },
4539 .block_erase = block_erase_m29f400bt,
4540 }, {
4541 .eraseblocks = { {512 * 1024, 1} },
4542 .block_erase = block_erase_chip_m29f400bt,
4543 },
4544 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00004545 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004546 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004547 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004548 },
4549
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004550 {
4551 .vendor = "Fujitsu",
4552 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004553 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004554 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004555 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004556 .total_size = 512,
4557 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00004558 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004559 .tested = TEST_UNTESTED,
4560 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +00004561 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004562 .block_erasers =
4563 {
4564 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00004565 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004566 {64 * 1024, 7},
4567 {32 * 1024, 1},
4568 {8 * 1024, 2},
4569 {16 * 1024, 1},
4570 },
4571 .block_erase = block_erase_m29f400bt,
4572 }, {
4573 .eraseblocks = { {512 * 1024, 1} },
4574 .block_erase = block_erase_chip_m29f400bt,
4575 },
4576 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +00004577 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004578 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00004579 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00004580 },
4581
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004582 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004583 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004584 .name = "GD25LQ32",
4585 .bustype = BUS_SPI,
4586 .manufacture_id = GIGADEVICE_ID,
4587 .model_id = GIGADEVICE_GD25LQ32,
4588 .total_size = 4096,
4589 .page_size = 256,
4590 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
4591 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4592 .tested = TEST_OK_PREW,
4593 .probe = probe_spi_rdid,
4594 .probe_timing = TIMING_ZERO,
4595 .block_erasers =
4596 {
4597 {
4598 .eraseblocks = { {4 * 1024, 1024} },
4599 .block_erase = spi_block_erase_20,
4600 }, {
4601 .eraseblocks = { {32 * 1024, 128} },
4602 .block_erase = spi_block_erase_52,
4603 }, {
4604 .eraseblocks = { {64 * 1024, 64} },
4605 .block_erase = spi_block_erase_d8,
4606 }, {
4607 .eraseblocks = { {4 * 1024 * 1024, 1} },
4608 .block_erase = spi_block_erase_60,
4609 }, {
4610 .eraseblocks = { {4 * 1024 * 1024, 1} },
4611 .block_erase = spi_block_erase_c7,
4612 }
4613 },
4614 .printlock = spi_prettyprint_status_register_default_bp4,
4615 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4616 .write = spi_chip_write_256,
4617 .read = spi_chip_read,
4618 .voltage = {1700, 1950},
4619 },
4620
4621 {
4622 .vendor = "GigaDevice",
4623 .name = "GD25Q512",
4624 .bustype = BUS_SPI,
4625 .manufacture_id = GIGADEVICE_ID,
4626 .model_id = GIGADEVICE_GD25Q512,
4627 .total_size = 64,
4628 .page_size = 256,
4629 .feature_bits = FEATURE_WRSR_WREN,
4630 .tested = TEST_UNTESTED,
4631 .probe = probe_spi_rdid,
4632 .probe_timing = TIMING_ZERO,
4633 .block_erasers = {
4634 {
4635 .eraseblocks = { {4 * 1024, 16} },
4636 .block_erase = spi_block_erase_20,
4637 }, {
4638 .eraseblocks = { {32 * 1024, 2} },
4639 .block_erase = spi_block_erase_52,
4640 }, {
4641 .eraseblocks = { {64 * 1024, 1} },
4642 .block_erase = spi_block_erase_60,
4643 }, {
4644 .eraseblocks = { {64 * 1024, 1} },
4645 .block_erase = spi_block_erase_c7,
4646 }
4647 },
4648 .printlock = spi_prettyprint_status_register_default_bp4,
4649 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4650 .write = spi_chip_write_256,
4651 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4652 .voltage = {2700, 3600},
4653 },
4654
4655 {
4656 .vendor = "GigaDevice",
4657 .name = "GD25Q10",
4658 .bustype = BUS_SPI,
4659 .manufacture_id = GIGADEVICE_ID,
4660 .model_id = GIGADEVICE_GD25Q10,
4661 .total_size = 128,
4662 .page_size = 256,
4663 .feature_bits = FEATURE_WRSR_WREN,
4664 .tested = TEST_UNTESTED,
4665 .probe = probe_spi_rdid,
4666 .probe_timing = TIMING_ZERO,
4667 .block_erasers = {
4668 {
4669 .eraseblocks = { {4 * 1024, 32} },
4670 .block_erase = spi_block_erase_20,
4671 }, {
4672 .eraseblocks = { {32 * 1024, 4} },
4673 .block_erase = spi_block_erase_52,
4674 }, {
4675 .eraseblocks = { {64 * 1024, 2} },
4676 .block_erase = spi_block_erase_d8,
4677 }, {
4678 .eraseblocks = { {128 * 1024, 1} },
4679 .block_erase = spi_block_erase_60,
4680 }, {
4681 .eraseblocks = { {128 * 1024, 1} },
4682 .block_erase = spi_block_erase_c7,
4683 }
4684 },
4685 .printlock = spi_prettyprint_status_register_default_bp4,
4686 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4687 .write = spi_chip_write_256,
4688 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4689 .voltage = {2700, 3600},
4690 },
4691
4692 {
4693 .vendor = "GigaDevice",
4694 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004695 .bustype = BUS_SPI,
4696 .manufacture_id = GIGADEVICE_ID,
4697 .model_id = GIGADEVICE_GD25Q20,
4698 .total_size = 256,
4699 .page_size = 256,
4700 .feature_bits = FEATURE_WRSR_WREN,
4701 .tested = TEST_UNTESTED,
4702 .probe = probe_spi_rdid,
4703 .probe_timing = TIMING_ZERO,
4704 .block_erasers =
4705 {
4706 {
4707 .eraseblocks = { {4 * 1024, 64} },
4708 .block_erase = spi_block_erase_20,
4709 }, {
4710 .eraseblocks = { {32 * 1024, 8} },
4711 .block_erase = spi_block_erase_52,
4712 }, {
4713 .eraseblocks = { {64 * 1024, 4} },
4714 .block_erase = spi_block_erase_d8,
4715 }, {
4716 .eraseblocks = { {256 * 1024, 1} },
4717 .block_erase = spi_block_erase_60,
4718 }, {
4719 .eraseblocks = { {256 * 1024, 1} },
4720 .block_erase = spi_block_erase_c7,
4721 }
4722 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004723 .printlock = spi_prettyprint_status_register_default_bp4,
4724 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004725 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004726 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00004727 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004728 },
4729
4730 {
4731 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004732 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004733 .bustype = BUS_SPI,
4734 .manufacture_id = GIGADEVICE_ID,
4735 .model_id = GIGADEVICE_GD25Q40,
4736 .total_size = 512,
4737 .page_size = 256,
4738 .feature_bits = FEATURE_WRSR_WREN,
4739 .tested = TEST_UNTESTED,
4740 .probe = probe_spi_rdid,
4741 .probe_timing = TIMING_ZERO,
4742 .block_erasers =
4743 {
4744 {
4745 .eraseblocks = { {4 * 1024, 128} },
4746 .block_erase = spi_block_erase_20,
4747 }, {
4748 .eraseblocks = { {32 * 1024, 16} },
4749 .block_erase = spi_block_erase_52,
4750 }, {
4751 .eraseblocks = { {64 * 1024, 8} },
4752 .block_erase = spi_block_erase_d8,
4753 }, {
4754 .eraseblocks = { {512 * 1024, 1} },
4755 .block_erase = spi_block_erase_60,
4756 }, {
4757 .eraseblocks = { {512 * 1024, 1} },
4758 .block_erase = spi_block_erase_c7,
4759 }
4760 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004761 .printlock = spi_prettyprint_status_register_default_bp4,
4762 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004763 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004764 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00004765 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004766 },
4767
4768 {
4769 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004770 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004771 .bustype = BUS_SPI,
4772 .manufacture_id = GIGADEVICE_ID,
4773 .model_id = GIGADEVICE_GD25Q80,
4774 .total_size = 1024,
4775 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004776 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004777 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4778 .tested = TEST_OK_PREW,
4779 .probe = probe_spi_rdid,
4780 .probe_timing = TIMING_ZERO,
4781 .block_erasers =
4782 {
4783 {
4784 .eraseblocks = { {4 * 1024, 256} },
4785 .block_erase = spi_block_erase_20,
4786 }, {
4787 .eraseblocks = { {32 * 1024, 32} },
4788 .block_erase = spi_block_erase_52,
4789 }, {
4790 .eraseblocks = { {64 * 1024, 16} },
4791 .block_erase = spi_block_erase_d8,
4792 }, {
4793 .eraseblocks = { {1024 * 1024, 1} },
4794 .block_erase = spi_block_erase_60,
4795 }, {
4796 .eraseblocks = { {1024 * 1024, 1} },
4797 .block_erase = spi_block_erase_c7,
4798 }
4799 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004800 .printlock = spi_prettyprint_status_register_default_bp4,
4801 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004802 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004803 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004804 .voltage = {2700, 3600},
4805 },
4806
4807 {
4808 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004809 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004810 .bustype = BUS_SPI,
4811 .manufacture_id = GIGADEVICE_ID,
4812 .model_id = GIGADEVICE_GD25Q16,
4813 .total_size = 2048,
4814 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004815 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004816 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4817 .tested = TEST_UNTESTED,
4818 .probe = probe_spi_rdid,
4819 .probe_timing = TIMING_ZERO,
4820 .block_erasers =
4821 {
4822 {
4823 .eraseblocks = { {4 * 1024, 512} },
4824 .block_erase = spi_block_erase_20,
4825 }, {
4826 .eraseblocks = { {32 * 1024, 64} },
4827 .block_erase = spi_block_erase_52,
4828 }, {
4829 .eraseblocks = { {64 * 1024, 32} },
4830 .block_erase = spi_block_erase_d8,
4831 }, {
4832 .eraseblocks = { {2 * 1024 * 1024, 1} },
4833 .block_erase = spi_block_erase_60,
4834 }, {
4835 .eraseblocks = { {2 * 1024 * 1024, 1} },
4836 .block_erase = spi_block_erase_c7,
4837 }
4838 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004839 .printlock = spi_prettyprint_status_register_default_bp4,
4840 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004841 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004842 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004843 .voltage = {2700, 3600},
4844 },
4845
4846 {
4847 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004848 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004849 .bustype = BUS_SPI,
4850 .manufacture_id = GIGADEVICE_ID,
4851 .model_id = GIGADEVICE_GD25Q32,
4852 .total_size = 4096,
4853 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004854 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004855 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4856 .tested = TEST_UNTESTED,
4857 .probe = probe_spi_rdid,
4858 .probe_timing = TIMING_ZERO,
4859 .block_erasers =
4860 {
4861 {
4862 .eraseblocks = { {4 * 1024, 1024} },
4863 .block_erase = spi_block_erase_20,
4864 }, {
4865 .eraseblocks = { {32 * 1024, 128} },
4866 .block_erase = spi_block_erase_52,
4867 }, {
4868 .eraseblocks = { {64 * 1024, 64} },
4869 .block_erase = spi_block_erase_d8,
4870 }, {
4871 .eraseblocks = { {4 * 1024 * 1024, 1} },
4872 .block_erase = spi_block_erase_60,
4873 }, {
4874 .eraseblocks = { {4 * 1024 * 1024, 1} },
4875 .block_erase = spi_block_erase_c7,
4876 }
4877 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004878 .printlock = spi_prettyprint_status_register_default_bp4,
4879 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004880 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004881 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004882 .voltage = {2700, 3600},
4883 },
4884
4885 {
4886 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004887 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004888 .bustype = BUS_SPI,
4889 .manufacture_id = GIGADEVICE_ID,
4890 .model_id = GIGADEVICE_GD25Q64,
4891 .total_size = 8192,
4892 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004893 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004894 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00004895 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004896 .probe = probe_spi_rdid,
4897 .probe_timing = TIMING_ZERO,
4898 .block_erasers =
4899 {
4900 {
4901 .eraseblocks = { {4 * 1024, 2048} },
4902 .block_erase = spi_block_erase_20,
4903 }, {
4904 .eraseblocks = { {32 * 1024, 256} },
4905 .block_erase = spi_block_erase_52,
4906 }, {
4907 .eraseblocks = { {64 * 1024, 128} },
4908 .block_erase = spi_block_erase_d8,
4909 }, {
4910 .eraseblocks = { {8 * 1024 * 1024, 1} },
4911 .block_erase = spi_block_erase_60,
4912 }, {
4913 .eraseblocks = { {8 * 1024 * 1024, 1} },
4914 .block_erase = spi_block_erase_c7,
4915 }
4916 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004917 .printlock = spi_prettyprint_status_register_default_bp4,
4918 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004919 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004920 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00004921 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004922 },
4923
4924 {
4925 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00004926 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004927 .bustype = BUS_SPI,
4928 .manufacture_id = GIGADEVICE_ID,
4929 .model_id = GIGADEVICE_GD25Q128,
4930 .total_size = 16384,
4931 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004932 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004933 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4934 .tested = TEST_UNTESTED,
4935 .probe = probe_spi_rdid,
4936 .probe_timing = TIMING_ZERO,
4937 .block_erasers =
4938 {
4939 {
4940 .eraseblocks = { {4 * 1024, 4096} },
4941 .block_erase = spi_block_erase_20,
4942 }, {
4943 .eraseblocks = { {32 * 1024, 512} },
4944 .block_erase = spi_block_erase_52,
4945 }, {
4946 .eraseblocks = { {64 * 1024, 256} },
4947 .block_erase = spi_block_erase_d8,
4948 }, {
4949 .eraseblocks = { {16 * 1024 * 1024, 1} },
4950 .block_erase = spi_block_erase_60,
4951 }, {
4952 .eraseblocks = { {16 * 1024 * 1024, 1} },
4953 .block_erase = spi_block_erase_c7,
4954 }
4955 },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00004956 .printlock = spi_prettyprint_status_register_default_bp4,
4957 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
4958 .write = spi_chip_write_256,
4959 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4960 .voltage = {2700, 3600},
4961 },
4962
4963 {
4964 .vendor = "GigaDevice",
4965 .name = "GD25T80",
4966 .bustype = BUS_SPI,
4967 .manufacture_id = GIGADEVICE_ID,
4968 .model_id = GIGADEVICE_GD25T80,
4969 .total_size = 1024,
4970 .page_size = 256,
4971 /* OTP: 256B total; enter 0x3A */
4972 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4973 .tested = TEST_UNTESTED,
4974 .probe = probe_spi_rdid,
4975 .probe_timing = TIMING_ZERO,
4976 .block_erasers = {
4977 {
4978 .eraseblocks = { {4 * 1024, 256} },
4979 .block_erase = spi_block_erase_20,
4980 }, {
4981 .eraseblocks = { {64 * 1024, 16} },
4982 .block_erase = spi_block_erase_52,
4983 }, {
4984 .eraseblocks = { {64 * 1024, 16} },
4985 .block_erase = spi_block_erase_d8,
4986 }, {
4987 .eraseblocks = { {1024 * 1024, 1} },
4988 .block_erase = spi_block_erase_60,
4989 }, {
4990 .eraseblocks = { {1024 * 1024, 1} },
4991 .block_erase = spi_block_erase_c7,
4992 }
4993 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004994 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004995 .unlock = spi_disable_blockprotect,
4996 .write = spi_chip_write_256,
4997 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004998 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00004999 },
5000
5001 {
David Borgc96a8bd2010-06-21 16:12:22 +00005002 .vendor = "Hyundai",
5003 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005004 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005005 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005006 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005007 .total_size = 256,
5008 .page_size = 256 * 1024,
5009 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005010 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005011 .probe = probe_jedec,
5012 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5013 .block_erasers =
5014 {
5015 {
5016 .eraseblocks = {
5017 {64 * 1024, 3},
5018 {32 * 1024, 1},
5019 {8 * 1024, 2},
5020 {16 * 1024, 1},
5021 },
5022 .block_erase = erase_sector_jedec,
5023 }, {
5024 .eraseblocks = { {256 * 1024, 1} },
5025 .block_erase = erase_chip_block_jedec,
5026 },
5027 },
5028 .write = write_jedec_1,
5029 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005030 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005031 },
5032
5033 {
5034 .vendor = "Hyundai",
5035 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005036 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005037 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005038 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005039 .total_size = 256,
5040 .page_size = 256 * 1024,
5041 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5042 .tested = TEST_UNTESTED,
5043 .probe = probe_jedec,
5044 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5045 .block_erasers =
5046 {
5047 {
5048 .eraseblocks = {
5049 {16 * 1024, 1},
5050 {8 * 1024, 2},
5051 {32 * 1024, 1},
5052 {64 * 1024, 3},
5053 },
5054 .block_erase = erase_sector_jedec,
5055 }, {
5056 .eraseblocks = { {256 * 1024, 1} },
5057 .block_erase = erase_chip_block_jedec,
5058 },
5059 },
5060 .write = write_jedec_1,
5061 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005062 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005063 },
5064
5065 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005066 .vendor = "Hyundai",
5067 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005068 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005069 .manufacture_id = HYUNDAI_ID,
5070 .model_id = HYUNDAI_HY29F040A,
5071 .total_size = 512,
5072 .page_size = 64 * 1024,
5073 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5074 .tested = TEST_UNTESTED,
5075 .probe = probe_jedec,
5076 .probe_timing = TIMING_ZERO,
5077 .block_erasers =
5078 {
5079 {
5080 .eraseblocks = { {64 * 1024, 8} },
5081 .block_erase = erase_sector_jedec,
5082 }, {
5083 .eraseblocks = { {512 * 1024, 1} },
5084 .block_erase = erase_chip_block_jedec,
5085 },
5086 },
5087 .write = write_jedec_1,
5088 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005089 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005090 },
5091
5092 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005093 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005094 .name = "25F160S33B8",
5095 .bustype = BUS_SPI,
5096 .manufacture_id = INTEL_ID,
5097 .model_id = INTEL_25F160S33B8,
5098 .total_size = 2048,
5099 .page_size = 256,
5100 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5102 .tested = TEST_UNTESTED,
5103 .probe = probe_spi_rdid,
5104 .probe_timing = TIMING_ZERO,
5105 .block_erasers =
5106 {
5107 {
5108 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5109 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5110 * have no effect on the memory contents, but sets a flag in the SR.
5111 .eraseblocks = {
5112 {8 * 1024, 8},
5113 {64 * 1024, 31} // inaccessible
5114 },
5115 .block_erase = spi_block_erase_40,
5116 }, { */
5117 .eraseblocks = { {64 * 1024, 32} },
5118 .block_erase = spi_block_erase_d8,
5119 }, {
5120 .eraseblocks = { {2 * 1024 * 1024, 1} },
5121 .block_erase = spi_block_erase_c7,
5122 }
5123 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005124 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5125 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005126 .write = spi_chip_write_256,
5127 .read = spi_chip_read, /* also fast read 0x0B */
5128 .voltage = {2700, 3600},
5129 },
5130
5131 {
5132 .vendor = "Intel",
5133 .name = "25F160S33T8",
5134 .bustype = BUS_SPI,
5135 .manufacture_id = INTEL_ID,
5136 .model_id = INTEL_25F160S33T8,
5137 .total_size = 2048,
5138 .page_size = 256,
5139 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5140 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5141 .tested = TEST_UNTESTED,
5142 .probe = probe_spi_rdid,
5143 .probe_timing = TIMING_ZERO,
5144 .block_erasers =
5145 {
5146 {
5147 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5148 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5149 * have no effect on the memory contents, but sets a flag in the SR.
5150 .eraseblocks = {
5151 {64 * 1024, 31}, // inaccessible
5152 {8 * 1024, 8}
5153 },
5154 .block_erase = spi_block_erase_40,
5155 }, { */
5156 .eraseblocks = { {64 * 1024, 32} },
5157 .block_erase = spi_block_erase_d8,
5158 }, {
5159 .eraseblocks = { {2 * 1024 * 1024, 1} },
5160 .block_erase = spi_block_erase_c7,
5161 }
5162 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005163 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5164 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005165 .write = spi_chip_write_256,
5166 .read = spi_chip_read, /* also fast read 0x0B */
5167 .voltage = {2700, 3600},
5168 },
5169
5170 {
5171 .vendor = "Intel",
5172 .name = "25F320S33B8",
5173 .bustype = BUS_SPI,
5174 .manufacture_id = INTEL_ID,
5175 .model_id = INTEL_25F320S33B8,
5176 .total_size = 4096,
5177 .page_size = 256,
5178 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5179 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5180 .tested = TEST_UNTESTED,
5181 .probe = probe_spi_rdid,
5182 .probe_timing = TIMING_ZERO,
5183 .block_erasers =
5184 {
5185 {
5186 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5187 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5188 * have no effect on the memory contents, but sets a flag in the SR.
5189 .eraseblocks = {
5190 {8 * 1024, 8},
5191 {64 * 1024, 63} // inaccessible
5192 },
5193 .block_erase = spi_block_erase_40,
5194 }, { */
5195 .eraseblocks = { {64 * 1024, 64} },
5196 .block_erase = spi_block_erase_d8,
5197 }, {
5198 .eraseblocks = { {4 * 1024 * 1024, 1} },
5199 .block_erase = spi_block_erase_c7,
5200 }
5201 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005202 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5203 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005204 .write = spi_chip_write_256,
5205 .read = spi_chip_read, /* also fast read 0x0B */
5206 .voltage = {2700, 3600},
5207 },
5208
5209 {
5210 .vendor = "Intel",
5211 .name = "25F320S33T8",
5212 .bustype = BUS_SPI,
5213 .manufacture_id = INTEL_ID,
5214 .model_id = INTEL_25F320S33T8,
5215 .total_size = 4096,
5216 .page_size = 256,
5217 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5218 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5219 .tested = TEST_UNTESTED,
5220 .probe = probe_spi_rdid,
5221 .probe_timing = TIMING_ZERO,
5222 .block_erasers =
5223 {
5224 {
5225 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5226 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5227 * have no effect on the memory contents, but sets a flag in the SR.
5228 .eraseblocks = {
5229 {64 * 1024, 63}, // inaccessible
5230 {8 * 1024, 8}
5231 },
5232 .block_erase = spi_block_erase_40,
5233 }, { */
5234 .eraseblocks = { {64 * 1024, 64} },
5235 .block_erase = spi_block_erase_d8,
5236 }, {
5237 .eraseblocks = { {4 * 1024 * 1024, 1} },
5238 .block_erase = spi_block_erase_c7,
5239 }
5240 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005241 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5242 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005243 .write = spi_chip_write_256,
5244 .read = spi_chip_read, /* also fast read 0x0B */
5245 .voltage = {2700, 3600},
5246 },
5247
5248 {
5249 .vendor = "Intel",
5250 .name = "25F640S33B8",
5251 .bustype = BUS_SPI,
5252 .manufacture_id = INTEL_ID,
5253 .model_id = INTEL_25F640S33B8,
5254 .total_size = 8192,
5255 .page_size = 256,
5256 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5257 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5258 .tested = TEST_UNTESTED,
5259 .probe = probe_spi_rdid,
5260 .probe_timing = TIMING_ZERO,
5261 .block_erasers =
5262 {
5263 {
5264 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5265 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5266 * have no effect on the memory contents, but sets a flag in the SR.
5267 .eraseblocks = {
5268 {8 * 1024, 8},
5269 {64 * 1024, 127} // inaccessible
5270 },
5271 .block_erase = spi_block_erase_40,
5272 }, { */
5273 .eraseblocks = { {64 * 1024, 128} },
5274 .block_erase = spi_block_erase_d8,
5275 }, {
5276 .eraseblocks = { {8 * 1024 * 1024, 1} },
5277 .block_erase = spi_block_erase_c7,
5278 }
5279 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005280 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5281 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005282 .write = spi_chip_write_256,
5283 .read = spi_chip_read, /* also fast read 0x0B */
5284 .voltage = {2700, 3600},
5285 },
5286
5287 {
5288 .vendor = "Intel",
5289 .name = "25F640S33T8",
5290 .bustype = BUS_SPI,
5291 .manufacture_id = INTEL_ID,
5292 .model_id = INTEL_25F640S33T8,
5293 .total_size = 8192,
5294 .page_size = 256,
5295 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5296 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5297 .tested = TEST_UNTESTED,
5298 .probe = probe_spi_rdid,
5299 .probe_timing = TIMING_ZERO,
5300 .block_erasers =
5301 {
5302 {
5303 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5304 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5305 * have no effect on the memory contents, but sets a flag in the SR.
5306 .eraseblocks = {
5307 {64 * 1024, 127}, // inaccessible
5308 {8 * 1024, 8}
5309 },
5310 .block_erase = spi_block_erase_40,
5311 }, { */
5312 .eraseblocks = { {64 * 1024, 128} },
5313 .block_erase = spi_block_erase_d8,
5314 }, {
5315 .eraseblocks = { {8 * 1024 * 1024, 1} },
5316 .block_erase = spi_block_erase_c7,
5317 }
5318 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005319 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5320 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005321 .write = spi_chip_write_256,
5322 .read = spi_chip_read, /* also fast read 0x0B */
5323 .voltage = {2700, 3600},
5324 },
5325
5326 {
5327 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005328 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005329 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005330 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005331 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005332 .total_size = 128,
5333 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00005334 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005335 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005336 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005337 .block_erasers =
5338 {
5339 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005340 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005341 {8 * 1024, 1},
5342 {4 * 1024, 2},
5343 {112 * 1024, 1},
5344 },
Sean Nelson28accc22010-03-19 18:47:06 +00005345 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005346 },
5347 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005348 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005349 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005350 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005351 },
5352
5353 {
5354 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005355 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005356 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005357 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005358 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005359 .total_size = 128,
5360 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005361 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005362 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005363 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005364 .block_erasers =
5365 {
5366 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005367 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005368 {112 * 1024, 1},
5369 {4 * 1024, 2},
5370 {8 * 1024, 1},
5371 },
Sean Nelson28accc22010-03-19 18:47:06 +00005372 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005373 },
5374 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005375 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005376 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005377 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005378 },
5379
5380 {
5381 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005382 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005383 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005384 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005385 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005386 .total_size = 256,
5387 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005388 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00005389 .probe = probe_82802ab,
5390 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5391 .block_erasers =
5392 {
5393 {
5394 .eraseblocks = {
5395 {128 * 1024, 1},
5396 {96 * 1024, 1},
5397 {8 * 1024, 2},
5398 {16 * 1024, 1},
5399 },
5400 .block_erase = erase_block_82802ab,
5401 },
5402 },
5403 .write = write_82802ab,
5404 .read = read_memmapped,
5405 },
5406
5407 {
5408 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005409 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005410 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005411 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005412 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005413 .total_size = 512,
5414 .page_size = 256,
5415 .tested = TEST_UNTESTED,
5416 .probe = probe_82802ab,
5417 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005418 .block_erasers =
5419 {
5420 {
5421 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005422 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005423 },
5424 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005425 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00005426 .write = write_82802ab,
5427 .read = read_memmapped,
5428 },
5429
5430 {
5431 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005432 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005433 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005434 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005435 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005436 .total_size = 512,
5437 .page_size = 128 * 1024, /* maximal block size */
5438 .tested = TEST_UNTESTED,
5439 .probe = probe_82802ab,
5440 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5441 .block_erasers =
5442 {
5443 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005444 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005445 {16 * 1024, 1},
5446 {8 * 1024, 2},
5447 {96 * 1024, 1},
5448 {128 * 1024, 3},
5449 },
5450 .block_erase = erase_block_82802ab,
5451 },
5452 },
5453 .write = write_82802ab,
5454 .read = read_memmapped,
5455 },
5456
5457 {
5458 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005459 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005460 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005461 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005462 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005463 .total_size = 512,
5464 .page_size = 128 * 1024, /* maximal block size */
5465 .tested = TEST_UNTESTED,
5466 .probe = probe_82802ab,
5467 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5468 .block_erasers =
5469 {
5470 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005471 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005472 {128 * 1024, 3},
5473 {96 * 1024, 1},
5474 {8 * 1024, 2},
5475 {16 * 1024, 1},
5476 },
5477 .block_erase = erase_block_82802ab,
5478 },
5479 },
5480 .write = write_82802ab,
5481 .read = read_memmapped,
5482 },
5483
5484 {
5485 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005486 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005487 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005488 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005489 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00005490 .total_size = 512,
5491 .page_size = 128 * 1024, /* maximal block size */
5492 .feature_bits = FEATURE_ADDR_SHIFTED,
5493 .tested = TEST_UNTESTED,
5494 .probe = probe_82802ab,
5495 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5496 .block_erasers =
5497 {
5498 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005499 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005500 {16 * 1024, 1},
5501 {8 * 1024, 2},
5502 {96 * 1024, 1},
5503 {128 * 1024, 3},
5504 },
5505 .block_erase = erase_block_82802ab,
5506 },
5507 },
5508 .write = write_82802ab,
5509 .read = read_memmapped,
5510 },
5511
5512 {
5513 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005514 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005515 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00005516 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005517 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00005518 .total_size = 512,
5519 .page_size = 128 * 1024, /* maximal block size */
5520 .feature_bits = FEATURE_ADDR_SHIFTED,
5521 .tested = TEST_UNTESTED,
5522 .probe = probe_82802ab,
5523 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5524 .block_erasers =
5525 {
5526 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005527 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00005528 {128 * 1024, 3},
5529 {96 * 1024, 1},
5530 {8 * 1024, 2},
5531 {16 * 1024, 1},
5532 },
5533 .block_erase = erase_block_82802ab,
5534 },
5535 },
5536 .write = write_82802ab,
5537 .read = read_memmapped,
5538 },
5539
5540 {
5541 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005542 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005543 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005544 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005545 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005546 .total_size = 512,
5547 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005548 .feature_bits = FEATURE_REGISTERMAP,
Stefan Taunerd06d9412011-06-12 19:47:55 +00005549 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005550 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005551 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005552 .block_erasers =
5553 {
5554 {
5555 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00005556 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005557 },
5558 },
Sean Nelson28accc22010-03-19 18:47:06 +00005559 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005560 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005561 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005562 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005563 },
5564
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005565 {
5566 .vendor = "Intel",
5567 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005568 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005569 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005570 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005571 .total_size = 1024,
5572 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00005573 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00005574 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005575 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005576 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00005577 .block_erasers =
5578 {
5579 {
5580 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00005581 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005582 },
5583 },
Sean Nelson28accc22010-03-19 18:47:06 +00005584 .unlock = unlock_82802ab,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005585 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005586 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005587 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005588 },
5589
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005590 {
5591 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005592 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005593 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005594 .manufacture_id = MACRONIX_ID,
5595 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005596 .total_size = 64,
5597 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005598 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005599 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005600 .tested = TEST_UNTESTED,
5601 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005602 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005603 .block_erasers =
5604 {
5605 {
5606 .eraseblocks = { {4 * 1024, 16} },
5607 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005608 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005609 .eraseblocks = { {64 * 1024, 1} },
5610 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005611 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005612 .eraseblocks = { {64 * 1024, 1} },
5613 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005614 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005615 .eraseblocks = { {64 * 1024, 1} },
5616 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005617 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005618 .eraseblocks = { {64 * 1024, 1} },
5619 .block_erase = spi_block_erase_c7,
5620 },
5621 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005622 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005623 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005624 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005625 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
5626 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00005627 },
5628
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005629 {
5630 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005631 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005632 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005633 .manufacture_id = MACRONIX_ID,
5634 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005635 .total_size = 128,
5636 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005637 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00005638 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00005639 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005640 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005641 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005642 .block_erasers =
5643 {
5644 {
5645 .eraseblocks = { {4 * 1024, 32} },
5646 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005647 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005648 .eraseblocks = { {64 * 1024, 2} },
5649 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005650 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005651 .eraseblocks = { {128 * 1024, 1} },
5652 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005653 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00005654 .eraseblocks = { {128 * 1024, 1} },
5655 .block_erase = spi_block_erase_c7,
5656 },
5657 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005658 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005659 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005660 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005661 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005662 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005663 },
5664
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005665 {
5666 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005667 .name = "MX25L2005(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005668 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005669 .manufacture_id = MACRONIX_ID,
5670 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005671 .total_size = 256,
5672 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005673 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005674 .tested = TEST_UNTESTED,
5675 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005676 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005677 .block_erasers =
5678 {
5679 {
5680 .eraseblocks = { {4 * 1024, 64} },
5681 .block_erase = spi_block_erase_20,
5682 }, {
5683 .eraseblocks = { {64 * 1024, 4} },
5684 .block_erase = spi_block_erase_52,
5685 }, {
5686 .eraseblocks = { {64 * 1024, 4} },
5687 .block_erase = spi_block_erase_d8,
5688 }, {
5689 .eraseblocks = { {256 * 1024, 1} },
5690 .block_erase = spi_block_erase_60,
5691 }, {
5692 .eraseblocks = { {256 * 1024, 1} },
5693 .block_erase = spi_block_erase_c7,
5694 },
5695 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005696 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005697 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005698 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005699 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005700 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005701 },
5702
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005703 {
5704 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005705 .name = "MX25L4005(A/C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005706 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005707 .manufacture_id = MACRONIX_ID,
5708 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005709 .total_size = 512,
5710 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005711 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00005712 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005713 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005714 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005715 .block_erasers =
5716 {
5717 {
5718 .eraseblocks = { {4 * 1024, 128} },
5719 .block_erase = spi_block_erase_20,
5720 }, {
5721 .eraseblocks = { {64 * 1024, 8} },
5722 .block_erase = spi_block_erase_52,
5723 }, {
5724 .eraseblocks = { {64 * 1024, 8} },
5725 .block_erase = spi_block_erase_d8,
5726 }, {
5727 .eraseblocks = { {512 * 1024, 1} },
5728 .block_erase = spi_block_erase_60,
5729 }, {
5730 .eraseblocks = { {512 * 1024, 1} },
5731 .block_erase = spi_block_erase_c7,
5732 },
5733 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005734 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005735 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005736 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005737 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005738 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005739 },
5740
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005741 {
5742 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00005743 .name = "MX25L8005/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005744 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005745 .manufacture_id = MACRONIX_ID,
5746 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005747 .total_size = 1024,
5748 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005749 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00005750 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005751 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005752 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005753 .block_erasers =
5754 {
5755 {
5756 .eraseblocks = { {4 * 1024, 256} },
5757 .block_erase = spi_block_erase_20,
5758 }, {
5759 .eraseblocks = { {64 * 1024, 16} },
5760 .block_erase = spi_block_erase_52,
5761 }, {
5762 .eraseblocks = { {64 * 1024, 16} },
5763 .block_erase = spi_block_erase_d8,
5764 }, {
5765 .eraseblocks = { {1024 * 1024, 1} },
5766 .block_erase = spi_block_erase_60,
5767 }, {
5768 .eraseblocks = { {1024 * 1024, 1} },
5769 .block_erase = spi_block_erase_c7,
5770 },
5771 },
Stefan Taunerf656e802013-02-02 15:35:44 +00005772 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005773 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005774 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00005775 .read = spi_chip_read, /* Fast read (0x0B) supported */
5776 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00005777 },
5778
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005779 {
5780 .vendor = "Macronix",
5781 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005782 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005783 .manufacture_id = MACRONIX_ID,
5784 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005785 .total_size = 2048,
5786 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005787 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00005788 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005789 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005790 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005791 .block_erasers =
5792 {
5793 {
Stefan Tauner226037d2013-03-16 01:22:12 +00005794 .eraseblocks = { {64 * 1024, 32} },
5795 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005796 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00005797 .eraseblocks = { {64 * 1024, 32} },
5798 .block_erase = spi_block_erase_d8,
5799 }, {
5800 .eraseblocks = { {2 * 1024 * 1024, 1} },
5801 .block_erase = spi_block_erase_60,
5802 }, {
5803 .eraseblocks = { {2 * 1024 * 1024, 1} },
5804 .block_erase = spi_block_erase_c7,
5805 },
5806 },
5807 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
5808 .unlock = spi_disable_blockprotect,
5809 .write = spi_chip_write_256,
5810 .read = spi_chip_read, /* Fast read (0x0B) supported */
5811 .voltage = {2700, 3600},
5812 },
5813
5814 {
5815 .vendor = "Macronix",
5816 .name = "MX25L1605A/MX25L1606E",
5817 .bustype = BUS_SPI,
5818 .manufacture_id = MACRONIX_ID,
5819 .model_id = MACRONIX_MX25L1605,
5820 .total_size = 2048,
5821 .page_size = 256,
5822 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
5823 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5824 .tested = TEST_OK_PREW,
5825 .probe = probe_spi_rdid,
5826 .probe_timing = TIMING_ZERO,
5827 .block_erasers =
5828 {
5829 {
5830 .eraseblocks = { {4 * 1024, 512} },
5831 .block_erase = spi_block_erase_20,
5832 }, {
5833 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00005834 .block_erase = spi_block_erase_52,
5835 }, {
5836 .eraseblocks = { {64 * 1024, 32} },
5837 .block_erase = spi_block_erase_d8,
5838 }, {
5839 .eraseblocks = { {2 * 1024 * 1024, 1} },
5840 .block_erase = spi_block_erase_60,
5841 }, {
5842 .eraseblocks = { {2 * 1024 * 1024, 1} },
5843 .block_erase = spi_block_erase_c7,
5844 },
5845 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005846 .printlock = spi_prettyprint_status_register_default_bp3, /* MX25L1605A bp2 only */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005847 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005848 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005849 .read = spi_chip_read, /* Fast read (0x0B) supported */
5850 .voltage = {2700, 3600},
5851 },
5852
5853 {
5854 .vendor = "Macronix",
5855 .name = "MX25L1605D/MX25L1608D",
5856 .bustype = BUS_SPI,
5857 .manufacture_id = MACRONIX_ID,
5858 .model_id = MACRONIX_MX25L1605,
5859 .total_size = 2048,
5860 .page_size = 256,
5861 .feature_bits = FEATURE_WRSR_WREN,
5862 .tested = TEST_OK_PREW,
5863 .probe = probe_spi_rdid,
5864 .probe_timing = TIMING_ZERO,
5865 .block_erasers =
5866 {
5867 {
5868 .eraseblocks = { {4 * 1024, 512} },
5869 .block_erase = spi_block_erase_20,
5870 }, {
5871 .eraseblocks = { {64 * 1024, 32} },
5872 .block_erase = spi_block_erase_d8,
5873 }, {
5874 .eraseblocks = { {2 * 1024 * 1024, 1} },
5875 .block_erase = spi_block_erase_60,
5876 }, {
5877 .eraseblocks = { {2 * 1024 * 1024, 1} },
5878 .block_erase = spi_block_erase_c7,
5879 },
5880 },
5881 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: Continously Program (CP) mode */
5882 .unlock = spi_disable_blockprotect,
5883 .write = spi_chip_write_256,
5884 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005885 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00005886 },
5887
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005888 {
5889 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005890 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005891 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005892 .manufacture_id = MACRONIX_ID,
5893 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005894 .total_size = 2048,
5895 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005896 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
5897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005898 .tested = TEST_UNTESTED,
5899 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005900 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00005901 .block_erasers =
5902 {
5903 {
5904 .eraseblocks = { {4 * 1024, 512} },
5905 .block_erase = spi_block_erase_20,
5906 }, {
5907 .eraseblocks = { {64 * 1024, 32} },
5908 .block_erase = spi_block_erase_d8,
5909 }, {
5910 .eraseblocks = { {2 * 1024 * 1024, 1} },
5911 .block_erase = spi_block_erase_60,
5912 }, {
5913 .eraseblocks = { {2 * 1024 * 1024, 1} },
5914 .block_erase = spi_block_erase_c7,
5915 }
5916 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005917 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005918 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005919 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005920 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005921 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005922 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00005923
Stephan Guillouxf5c70902009-04-19 23:04:00 +00005924 {
5925 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00005926 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005927 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005928 .manufacture_id = MACRONIX_ID,
5929 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00005930 .total_size = 2048,
5931 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005932 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
5933 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00005934 .tested = TEST_UNTESTED,
5935 .probe = probe_spi_rdid,
5936 .probe_timing = TIMING_ZERO,
5937 .block_erasers =
5938 {
5939 {
5940 .eraseblocks = { {4 * 1024, 512} },
5941 .block_erase = spi_block_erase_20,
5942 }, {
5943 .eraseblocks = { {64 * 1024, 32} },
5944 .block_erase = spi_block_erase_d8,
5945 }, {
5946 .eraseblocks = { {2 * 1024 * 1024, 1} },
5947 .block_erase = spi_block_erase_60,
5948 }, {
5949 .eraseblocks = { {2 * 1024 * 1024, 1} },
5950 .block_erase = spi_block_erase_c7,
5951 }
5952 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005953 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Stephan Guilloux3611b802010-09-13 19:59:28 +00005954 .unlock = spi_disable_blockprotect,
5955 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005956 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00005957 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00005958 },
5959
5960 {
5961 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00005962 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005963 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005964 .manufacture_id = MACRONIX_ID,
5965 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005966 .total_size = 4096,
5967 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00005968 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00005969 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005970 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00005971 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005972 .block_erasers =
5973 {
5974 {
Stefan Tauner226037d2013-03-16 01:22:12 +00005975 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00005976 .block_erase = spi_block_erase_20,
5977 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00005978 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00005979 .block_erase = spi_block_erase_d8,
5980 }, {
5981 .eraseblocks = { {4 * 1024 * 1024, 1} },
5982 .block_erase = spi_block_erase_60,
5983 }, {
5984 .eraseblocks = { {4 * 1024 * 1024, 1} },
5985 .block_erase = spi_block_erase_c7,
5986 },
5987 },
Stefan Tauner226037d2013-03-16 01:22:12 +00005988 .printlock = spi_prettyprint_status_register_default_bp2, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00005989 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00005990 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00005991 .read = spi_chip_read, /* Fast read (0x0B) supported */
5992 .voltage = {2700, 3600},
5993 },
5994
5995 {
5996 .vendor = "Macronix",
5997 .name = "MX25L3205D/MX25L3208D",
5998 .bustype = BUS_SPI,
5999 .manufacture_id = MACRONIX_ID,
6000 .model_id = MACRONIX_MX25L3205,
6001 .total_size = 4096,
6002 .page_size = 256,
6003 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6004 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6005 .tested = TEST_OK_PREW,
6006 .probe = probe_spi_rdid,
6007 .probe_timing = TIMING_ZERO,
6008 .block_erasers =
6009 {
6010 {
6011 .eraseblocks = { {4 * 1024, 1024} },
6012 .block_erase = spi_block_erase_20,
6013 }, {
6014 .eraseblocks = { {64 * 1024, 64} },
6015 .block_erase = spi_block_erase_d8,
6016 }, {
6017 .eraseblocks = { {4 * 1024 * 1024, 1} },
6018 .block_erase = spi_block_erase_60,
6019 }, {
6020 .eraseblocks = { {4 * 1024 * 1024, 1} },
6021 .block_erase = spi_block_erase_c7,
6022 },
6023 },
6024 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6: CP mode */
6025 .unlock = spi_disable_blockprotect,
6026 .write = spi_chip_write_256,
6027 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6028 .voltage = {2700, 3600},
6029 },
6030
6031 {
6032 .vendor = "Macronix",
6033 .name = "MX25L3206E",
6034 .bustype = BUS_SPI,
6035 .manufacture_id = MACRONIX_ID,
6036 .model_id = MACRONIX_MX25L3205,
6037 .total_size = 4096,
6038 .page_size = 256,
6039 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6040 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6041 .tested = TEST_OK_PREW,
6042 .probe = probe_spi_rdid,
6043 .probe_timing = TIMING_ZERO,
6044 .block_erasers =
6045 {
6046 {
6047 .eraseblocks = { {4 * 1024, 1024} },
6048 .block_erase = spi_block_erase_20,
6049 }, {
6050 .eraseblocks = { {64 * 1024, 64} },
6051 .block_erase = spi_block_erase_d8,
6052 }, {
6053 .eraseblocks = { {64 * 1024, 64} },
6054 .block_erase = spi_block_erase_52,
6055 }, {
6056 .eraseblocks = { {4 * 1024 * 1024, 1} },
6057 .block_erase = spi_block_erase_60,
6058 }, {
6059 .eraseblocks = { {4 * 1024 * 1024, 1} },
6060 .block_erase = spi_block_erase_c7,
6061 },
6062 },
6063 .printlock = spi_prettyprint_status_register_default_bp3,
6064 .unlock = spi_disable_blockprotect,
6065 .write = spi_chip_write_256,
6066 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006067 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006068 },
6069
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006070 {
6071 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006072 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006073 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006074 .manufacture_id = MACRONIX_ID,
6075 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006076 .total_size = 4096,
6077 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006078 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
6079 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006080 .tested = TEST_UNTESTED,
6081 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006082 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006083 .block_erasers =
6084 {
6085 {
6086 .eraseblocks = { {4 * 1024, 1024} },
6087 .block_erase = spi_block_erase_20,
6088 }, {
6089 .eraseblocks = { {64 * 1024, 64} },
6090 .block_erase = spi_block_erase_d8,
6091 }, {
6092 .eraseblocks = { {4 * 1024 * 1024, 1} },
6093 .block_erase = spi_block_erase_60,
6094 }, {
6095 .eraseblocks = { {4 * 1024 * 1024, 1} },
6096 .block_erase = spi_block_erase_c7,
6097 }
6098 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006099 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006100 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006101 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006102 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006103 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006104 },
6105
6106 {
6107 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006108 .name = "MX25L6405(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006109 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006110 .manufacture_id = MACRONIX_ID,
6111 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006112 .total_size = 8192,
6113 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006114 /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
6115 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Paul Menzelac427b22012-02-16 21:07:07 +00006116 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006117 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006118 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006119 .block_erasers =
6120 {
6121 {
6122 .eraseblocks = { {64 * 1024, 128} },
6123 .block_erase = spi_block_erase_20,
6124 }, {
6125 .eraseblocks = { {64 * 1024, 128} },
6126 .block_erase = spi_block_erase_d8,
6127 }, {
6128 .eraseblocks = { {8 * 1024 * 1024, 1} },
6129 .block_erase = spi_block_erase_60,
6130 }, {
6131 .eraseblocks = { {8 * 1024 * 1024, 1} },
6132 .block_erase = spi_block_erase_c7,
6133 }
6134 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006135 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 has different meanings */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006136 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006137 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006138 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006139 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006140 },
6141
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006142 {
6143 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006144 .name = "MX25L6406E/MX25L6436E",
6145 .bustype = BUS_SPI,
6146 .manufacture_id = MACRONIX_ID,
6147 .model_id = MACRONIX_MX25L6405,
6148 .total_size = 8192,
6149 .page_size = 256,
6150 /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
6151 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6152 .tested = TEST_OK_PREW,
6153 .probe = probe_spi_rdid,
6154 .probe_timing = TIMING_ZERO,
6155 .block_erasers =
6156 {
6157 {
6158 .eraseblocks = { {4 * 1024, 2048} },
6159 .block_erase = spi_block_erase_20,
6160 }, {
6161 .eraseblocks = { {64 * 1024, 128} },
6162 .block_erase = spi_block_erase_d8,
6163 }, {
6164 .eraseblocks = { {8 * 1024 * 1024, 1} },
6165 .block_erase = spi_block_erase_60,
6166 }, {
6167 .eraseblocks = { {8 * 1024 * 1024, 1} },
6168 .block_erase = spi_block_erase_c7,
6169 }
6170 },
6171 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 for 36E is quad enable */
6172 .unlock = spi_disable_blockprotect,
6173 .write = spi_chip_write_256,
6174 .read = spi_chip_read,
6175 .voltage = {2700, 3600},
6176 },
6177
6178 {
6179 .vendor = "Macronix",
6180 .name = "MX25L6445E",
6181 .bustype = BUS_SPI,
6182 .manufacture_id = MACRONIX_ID,
6183 .model_id = MACRONIX_MX25L6405,
6184 .total_size = 8192,
6185 .page_size = 256,
6186 /* supports SFDP */
6187 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6188 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6189 .tested = TEST_OK_PREW,
6190 .probe = probe_spi_rdid,
6191 .probe_timing = TIMING_ZERO,
6192 .block_erasers =
6193 {
6194 {
6195 .eraseblocks = { {4 * 1024, 2048} },
6196 .block_erase = spi_block_erase_20,
6197 }, {
6198 .eraseblocks = { {32 * 1024, 256} },
6199 .block_erase = spi_block_erase_52,
6200 }, {
6201 .eraseblocks = { {64 * 1024, 128} },
6202 .block_erase = spi_block_erase_d8,
6203 }, {
6204 .eraseblocks = { {8 * 1024 * 1024, 1} },
6205 .block_erase = spi_block_erase_60,
6206 }, {
6207 .eraseblocks = { {8 * 1024 * 1024, 1} },
6208 .block_erase = spi_block_erase_c7,
6209 }
6210 },
6211 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6212 .unlock = spi_disable_blockprotect,
6213 .write = spi_chip_write_256,
6214 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6215 .voltage = {2700, 3600},
6216 },
6217
6218 {
6219 .vendor = "Macronix",
6220 .name = "MX25L12805(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006221 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006222 .manufacture_id = MACRONIX_ID,
6223 .model_id = MACRONIX_MX25L12805,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006224 .total_size = 16384,
6225 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006226 /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
6227 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00006228 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006229 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006230 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006231 .block_erasers =
6232 {
6233 {
6234 .eraseblocks = { {4 * 1024, 4096} },
6235 .block_erase = spi_block_erase_20,
6236 }, {
6237 .eraseblocks = { {64 * 1024, 256} },
6238 .block_erase = spi_block_erase_d8,
6239 }, {
6240 .eraseblocks = { {16 * 1024 * 1024, 1} },
6241 .block_erase = spi_block_erase_60,
6242 }, {
6243 .eraseblocks = { {16 * 1024 * 1024, 1} },
6244 .block_erase = spi_block_erase_c7,
6245 }
6246 },
Stefan Tauner226037d2013-03-16 01:22:12 +00006247 .printlock = spi_prettyprint_status_register_default_bp3,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006248 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006249 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006250 .read = spi_chip_read, /* MX25L12805D: Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006251 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00006252 },
6253
6254 {
6255 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00006256 .name = "MX25U1635E",
6257 .bustype = BUS_SPI,
6258 .manufacture_id = MACRONIX_ID,
6259 .model_id = MACRONIX_MX25U1635E,
6260 .total_size = 2048,
6261 .page_size = 256,
6262 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6263 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6264 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6265 .tested = TEST_UNTESTED,
6266 .probe = probe_spi_rdid,
6267 .probe_timing = TIMING_ZERO,
6268 .block_erasers =
6269 {
6270 {
6271 .eraseblocks = { {4 * 1024, 512} },
6272 .block_erase = spi_block_erase_20,
6273 }, {
6274 .eraseblocks = { {32 * 1024, 64} },
6275 .block_erase = spi_block_erase_52,
6276 }, {
6277 .eraseblocks = { {64 * 1024, 32} },
6278 .block_erase = spi_block_erase_d8,
6279 }, {
6280 .eraseblocks = { {2 * 1024 * 1024, 1} },
6281 .block_erase = spi_block_erase_60,
6282 }, {
6283 .eraseblocks = { {2 * 1024 * 1024, 1} },
6284 .block_erase = spi_block_erase_c7,
6285 }
6286 },
6287 /* TODO: security register */
6288 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6289 .unlock = spi_disable_blockprotect,
6290 .write = spi_chip_write_256,
6291 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6292 .voltage = {1650, 2000},
6293 },
6294
6295 {
6296 .vendor = "Macronix",
6297 .name = "MX25U3235E/F",
6298 .bustype = BUS_SPI,
6299 .manufacture_id = MACRONIX_ID,
6300 .model_id = MACRONIX_MX25U3235E,
6301 .total_size = 4096,
6302 .page_size = 256,
6303 /* F model supports SFDP */
6304 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6305 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6306 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6307 .tested = TEST_OK_PREW,
6308 .probe = probe_spi_rdid,
6309 .probe_timing = TIMING_ZERO,
6310 .block_erasers =
6311 {
6312 {
6313 .eraseblocks = { {4 * 1024, 1024} },
6314 .block_erase = spi_block_erase_20,
6315 }, {
6316 .eraseblocks = { {32 * 1024, 128} },
6317 .block_erase = spi_block_erase_52,
6318 }, {
6319 .eraseblocks = { {64 * 1024, 64} },
6320 .block_erase = spi_block_erase_d8,
6321 }, {
6322 .eraseblocks = { {4 * 1024 * 1024, 1} },
6323 .block_erase = spi_block_erase_60,
6324 }, {
6325 .eraseblocks = { {4 * 1024 * 1024, 1} },
6326 .block_erase = spi_block_erase_c7,
6327 }
6328 },
6329 /* TODO: security register */
6330 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6331 .unlock = spi_disable_blockprotect,
6332 .write = spi_chip_write_256,
6333 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6334 .voltage = {1650, 2000},
6335 },
6336
6337 {
6338 .vendor = "Macronix",
6339 .name = "MX25U6435E/F",
6340 .bustype = BUS_SPI,
6341 .manufacture_id = MACRONIX_ID,
6342 .model_id = MACRONIX_MX25U6435E,
6343 .total_size = 8192,
6344 .page_size = 256,
6345 /* F model supports SFDP */
6346 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
6347 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
6348 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6349 .tested = TEST_UNTESTED,
6350 .probe = probe_spi_rdid,
6351 .probe_timing = TIMING_ZERO,
6352 .block_erasers =
6353 {
6354 {
6355 .eraseblocks = { {4 * 1024, 2048} },
6356 .block_erase = spi_block_erase_20,
6357 }, {
6358 .eraseblocks = { {32 * 1024, 256} },
6359 .block_erase = spi_block_erase_52,
6360 }, {
6361 .eraseblocks = { {64 * 1024, 128} },
6362 .block_erase = spi_block_erase_d8,
6363 }, {
6364 .eraseblocks = { {8 * 1024 * 1024, 1} },
6365 .block_erase = spi_block_erase_60,
6366 }, {
6367 .eraseblocks = { {8 * 1024 * 1024, 1} },
6368 .block_erase = spi_block_erase_c7,
6369 }
6370 },
6371 /* TODO: security register */
6372 .printlock = spi_prettyprint_status_register_default_bp3, /* bit6 is quad enable */
6373 .unlock = spi_disable_blockprotect,
6374 .write = spi_chip_write_256,
6375 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6376 .voltage = {1650, 2000},
6377 },
6378
6379 {
6380 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00006381 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006382 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006383 .manufacture_id = MACRONIX_ID,
6384 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006385 .total_size = 128,
6386 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006387 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6388 .tested = TEST_UNTESTED,
6389 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006390 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006391 .block_erasers =
6392 {
6393 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006394 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006395 {8 * 1024, 1},
6396 {4 * 1024, 2},
6397 {8 * 1024, 2},
6398 {32 * 1024, 1},
6399 {64 * 1024, 1},
6400 },
Sean Nelson35727f72010-01-28 23:55:12 +00006401 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006402 }, {
6403 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006404 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006405 }
6406 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006407 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006408 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006409 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006410 },
6411
6412 {
6413 .vendor = "Macronix",
6414 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006415 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006416 .manufacture_id = MACRONIX_ID,
6417 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006418 .total_size = 128,
6419 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006420 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00006421 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006422 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006423 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006424 .block_erasers =
6425 {
6426 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006427 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00006428 {64 * 1024, 1},
6429 {32 * 1024, 1},
6430 {8 * 1024, 2},
6431 {4 * 1024, 2},
6432 {8 * 1024, 1},
6433 },
Sean Nelson35727f72010-01-28 23:55:12 +00006434 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006435 }, {
6436 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006437 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006438 }
6439 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006440 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00006441 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006442 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00006443 },
6444
6445 {
6446 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006447 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006448 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006449 .manufacture_id = MACRONIX_ID,
6450 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006451 .total_size = 256,
6452 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006453 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006454 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00006455 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006456 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006457 .block_erasers =
6458 {
6459 {
6460 .eraseblocks = {
6461 {16 * 1024, 1},
6462 {8 * 1024, 2},
6463 {32 * 1024, 1},
6464 {64 * 1024, 3},
6465 },
Sean Nelson35727f72010-01-28 23:55:12 +00006466 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006467 }, {
6468 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006469 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006470 },
6471 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006472 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006473 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006474 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006475 },
6476
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006477 {
6478 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00006479 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006480 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006481 .manufacture_id = MACRONIX_ID,
6482 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006483 .total_size = 256,
6484 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006485 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00006486 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00006487 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006488 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006489 .block_erasers =
6490 {
6491 {
6492 .eraseblocks = {
6493 {64 * 1024, 3},
6494 {32 * 1024, 1},
6495 {8 * 1024, 2},
6496 {16 * 1024, 1},
6497 },
Sean Nelson35727f72010-01-28 23:55:12 +00006498 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006499 }, {
6500 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006501 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006502 },
6503 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006504 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006505 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006506 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006507 },
6508
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006509 {
6510 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00006511 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006512 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00006513 .manufacture_id = MACRONIX_ID,
6514 .model_id = MACRONIX_MX29F040,
6515 .total_size = 512,
6516 .page_size = 64 * 1024,
6517 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6518 .tested = TEST_UNTESTED,
6519 .probe = probe_jedec,
6520 .probe_timing = TIMING_ZERO,
6521 .block_erasers =
6522 {
6523 {
6524 .eraseblocks = { {64 * 1024, 8} },
6525 .block_erase = erase_sector_jedec,
6526 }, {
6527 .eraseblocks = { {512 * 1024, 1} },
6528 .block_erase = erase_chip_block_jedec,
6529 },
6530 },
6531 .write = write_jedec_1,
6532 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006533 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00006534 },
6535
6536 {
6537 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00006538 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006539 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006540 .manufacture_id = MACRONIX_ID,
6541 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006542 .total_size = 512,
6543 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006544 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6545 .tested = TEST_UNTESTED,
6546 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00006547 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006548 .block_erasers =
6549 {
6550 {
6551 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +00006552 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006553 }, {
6554 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006555 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00006556 },
6557 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00006558 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006559 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006560 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00006561 },
6562
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006563 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00006564 .vendor = "Micron/Numonyx/ST",
6565 .name = "M25P05-A",
6566 .bustype = BUS_SPI,
6567 .manufacture_id = ST_ID,
6568 .model_id = ST_M25P05A,
6569 .total_size = 64,
6570 .page_size = 256,
6571 .feature_bits = FEATURE_WRSR_WREN,
6572 .tested = TEST_OK_PREW,
6573 .probe = probe_spi_rdid,
6574 .probe_timing = TIMING_ZERO,
6575 .block_erasers =
6576 {
6577 {
6578 .eraseblocks = { {32 * 1024, 2} },
6579 .block_erase = spi_block_erase_d8,
6580 }, {
6581 .eraseblocks = { {64 * 1024, 1} },
6582 .block_erase = spi_block_erase_c7,
6583 }
6584 },
6585 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6586 .unlock = spi_disable_blockprotect,
6587 .write = spi_chip_write_256,
6588 .read = spi_chip_read,
6589 .voltage = {2700, 3600},
6590 },
6591
6592 /* The ST M25P05 is a bit of a problem. It has the same ID as the
6593 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
6594 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
6595 * only is successful if RDID does not work.
6596 */
6597 {
6598 .vendor = "Micron/Numonyx/ST",
6599 .name = "M25P05",
6600 .bustype = BUS_SPI,
6601 .manufacture_id = 0, /* Not used. */
6602 .model_id = ST_M25P05_RES,
6603 .total_size = 64,
6604 .page_size = 256,
6605 .feature_bits = FEATURE_WRSR_WREN,
6606 .tested = TEST_UNTESTED,
6607 .probe = probe_spi_res1,
6608 .probe_timing = TIMING_ZERO,
6609 .block_erasers =
6610 {
6611 {
6612 .eraseblocks = { {32 * 1024, 2} },
6613 .block_erase = spi_block_erase_d8,
6614 }, {
6615 .eraseblocks = { {64 * 1024, 1} },
6616 .block_erase = spi_block_erase_c7,
6617 }
6618 },
6619 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6620 .unlock = spi_disable_blockprotect,
6621 .write = spi_chip_write_1, /* 128 */
6622 .read = spi_chip_read,
6623 .voltage = {2700, 3600},
6624 },
6625
6626 {
6627 .vendor = "Micron/Numonyx/ST",
6628 .name = "M25P10-A",
6629 .bustype = BUS_SPI,
6630 .manufacture_id = ST_ID,
6631 .model_id = ST_M25P10A,
6632 .total_size = 128,
6633 .page_size = 256,
6634 .feature_bits = FEATURE_WRSR_WREN,
6635 .tested = TEST_OK_PRE,
6636 .probe = probe_spi_rdid,
6637 .probe_timing = TIMING_ZERO,
6638 .block_erasers =
6639 {
6640 {
6641 .eraseblocks = { {32 * 1024, 4} },
6642 .block_erase = spi_block_erase_d8,
6643 }, {
6644 .eraseblocks = { {128 * 1024, 1} },
6645 .block_erase = spi_block_erase_c7,
6646 }
6647 },
6648 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6649 .unlock = spi_disable_blockprotect,
6650 .write = spi_chip_write_256,
6651 .read = spi_chip_read,
6652 .voltage = {2700, 3600},
6653 },
6654
6655 /* The ST M25P10 has the same problem as the M25P05. */
6656 {
6657 .vendor = "Micron/Numonyx/ST",
6658 .name = "M25P10",
6659 .bustype = BUS_SPI,
6660 .manufacture_id = 0, /* Not used. */
6661 .model_id = ST_M25P10_RES,
6662 .total_size = 128,
6663 .page_size = 256,
6664 .feature_bits = FEATURE_WRSR_WREN,
6665 .tested = TEST_UNTESTED,
6666 .probe = probe_spi_res1,
6667 .probe_timing = TIMING_ZERO,
6668 .block_erasers =
6669 {
6670 {
6671 .eraseblocks = { {32 * 1024, 4} },
6672 .block_erase = spi_block_erase_d8,
6673 }, {
6674 .eraseblocks = { {128 * 1024, 1} },
6675 .block_erase = spi_block_erase_c7,
6676 }
6677 },
6678 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6679 .unlock = spi_disable_blockprotect,
6680 .write = spi_chip_write_1, /* 128 */
6681 .read = spi_chip_read,
6682 .voltage = {2700, 3600},
6683 },
6684
6685 {
6686 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6687 .name = "M25P20",
6688 .bustype = BUS_SPI,
6689 .manufacture_id = ST_ID,
6690 .model_id = ST_M25P20,
6691 .total_size = 256,
6692 .page_size = 256,
6693 .feature_bits = FEATURE_WRSR_WREN,
6694 .tested = TEST_UNTESTED,
6695 .probe = probe_spi_rdid,
6696 .probe_timing = TIMING_ZERO,
6697 .block_erasers =
6698 {
6699 {
6700 .eraseblocks = { {64 * 1024, 4} },
6701 .block_erase = spi_block_erase_d8,
6702 }, {
6703 .eraseblocks = { {256 * 1024, 1} },
6704 .block_erase = spi_block_erase_c7,
6705 }
6706 },
6707 .printlock = spi_prettyprint_status_register_default_bp1,
6708 .unlock = spi_disable_blockprotect,
6709 .write = spi_chip_write_256,
6710 .read = spi_chip_read, /* Fast read (0x0B) supported */
6711 .voltage = {2700, 3600},
6712 },
6713
6714 {
6715 .vendor = "Micron/Numonyx/ST",
6716 .name = "M25P20-old",
6717 .bustype = BUS_SPI,
6718 .manufacture_id = 0, /* Not used. */
6719 .model_id = ST_M25P20_RES,
6720 .total_size = 256,
6721 .page_size = 256,
6722 .feature_bits = FEATURE_WRSR_WREN,
6723 .tested = TEST_OK_PREW,
6724 .probe = probe_spi_res1,
6725 .probe_timing = TIMING_ZERO,
6726 .block_erasers =
6727 {
6728 {
6729 .eraseblocks = { {64 * 1024, 4} },
6730 .block_erase = spi_block_erase_d8,
6731 }, {
6732 .eraseblocks = { {256 * 1024, 1} },
6733 .block_erase = spi_block_erase_c7,
6734 }
6735 },
6736 .printlock = spi_prettyprint_status_register_default_bp1,
6737 .unlock = spi_disable_blockprotect,
6738 .write = spi_chip_write_256,
6739 .read = spi_chip_read, /* Fast read (0x0B) supported */
6740 .voltage = {2700, 3600},
6741 },
6742
6743 {
6744 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6745 .name = "M25P40",
6746 .bustype = BUS_SPI,
6747 .manufacture_id = ST_ID,
6748 .model_id = ST_M25P40,
6749 .total_size = 512,
6750 .page_size = 256,
6751 .feature_bits = FEATURE_WRSR_WREN,
6752 .tested = TEST_OK_PREW,
6753 .probe = probe_spi_rdid,
6754 .probe_timing = TIMING_ZERO,
6755 .block_erasers =
6756 {
6757 {
6758 .eraseblocks = { {64 * 1024, 8} },
6759 .block_erase = spi_block_erase_d8,
6760 }, {
6761 .eraseblocks = { {512 * 1024, 1} },
6762 .block_erase = spi_block_erase_c7,
6763 }
6764 },
6765 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6766 .unlock = spi_disable_blockprotect,
6767 .write = spi_chip_write_256,
6768 .read = spi_chip_read,
6769 .voltage = {2700, 3600},
6770 },
6771
6772 {
6773 .vendor = "Micron/Numonyx/ST",
6774 .name = "M25P40-old",
6775 .bustype = BUS_SPI,
6776 .manufacture_id = 0, /* Not used. */
6777 .model_id = ST_M25P40_RES,
6778 .total_size = 512,
6779 .page_size = 256,
6780 .feature_bits = FEATURE_WRSR_WREN,
6781 .tested = TEST_UNTESTED,
6782 .probe = probe_spi_res1,
6783 .probe_timing = TIMING_ZERO,
6784 .block_erasers =
6785 {
6786 {
6787 .eraseblocks = { {64 * 1024, 8} },
6788 .block_erase = spi_block_erase_d8,
6789 }, {
6790 .eraseblocks = { {512 * 1024, 1} },
6791 .block_erase = spi_block_erase_c7,
6792 }
6793 },
6794 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6795 .unlock = spi_disable_blockprotect,
6796 .write = spi_chip_write_256,
6797 .read = spi_chip_read,
6798 },
6799
6800 {
6801 .vendor = "Micron/Numonyx/ST",
6802 .name = "M25P80",
6803 .bustype = BUS_SPI,
6804 .manufacture_id = ST_ID,
6805 .model_id = ST_M25P80,
6806 .total_size = 1024,
6807 .page_size = 256,
6808 .feature_bits = FEATURE_WRSR_WREN,
6809 .tested = TEST_OK_PREW,
6810 .probe = probe_spi_rdid,
6811 .probe_timing = TIMING_ZERO,
6812 .block_erasers =
6813 {
6814 {
6815 .eraseblocks = { {64 * 1024, 16} },
6816 .block_erase = spi_block_erase_d8,
6817 }, {
6818 .eraseblocks = { {1024 * 1024, 1} },
6819 .block_erase = spi_block_erase_c7,
6820 }
6821 },
6822 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6823 .unlock = spi_disable_blockprotect,
6824 .write = spi_chip_write_256,
6825 .read = spi_chip_read,
6826 .voltage = {2700, 3600},
6827 },
6828
6829 {
6830 .vendor = "Micron/Numonyx/ST",
6831 .name = "M25P16",
6832 .bustype = BUS_SPI,
6833 .manufacture_id = ST_ID,
6834 .model_id = ST_M25P16,
6835 .total_size = 2048,
6836 .page_size = 256,
6837 .feature_bits = FEATURE_WRSR_WREN,
6838 .tested = TEST_OK_PR,
6839 .probe = probe_spi_rdid,
6840 .probe_timing = TIMING_ZERO,
6841 .block_erasers =
6842 {
6843 {
6844 .eraseblocks = { {64 * 1024, 32} },
6845 .block_erase = spi_block_erase_d8,
6846 }, {
6847 .eraseblocks = { {2 * 1024 * 1024, 1} },
6848 .block_erase = spi_block_erase_c7,
6849 }
6850 },
6851 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6852 .unlock = spi_disable_blockprotect,
6853 .write = spi_chip_write_256,
6854 .read = spi_chip_read,
6855 .voltage = {2700, 3600},
6856 },
6857
6858 {
6859 .vendor = "Micron/Numonyx/ST",
6860 .name = "M25P32",
6861 .bustype = BUS_SPI,
6862 .manufacture_id = ST_ID,
6863 .model_id = ST_M25P32,
6864 .total_size = 4096,
6865 .page_size = 256,
6866 .feature_bits = FEATURE_WRSR_WREN,
6867 .tested = TEST_OK_PREW,
6868 .probe = probe_spi_rdid,
6869 .probe_timing = TIMING_ZERO,
6870 .block_erasers =
6871 {
6872 {
6873 .eraseblocks = { {64 * 1024, 64} },
6874 .block_erase = spi_block_erase_d8,
6875 }, {
6876 .eraseblocks = { {4 * 1024 * 1024, 1} },
6877 .block_erase = spi_block_erase_c7,
6878 }
6879 },
6880 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6881 .unlock = spi_disable_blockprotect,
6882 .write = spi_chip_write_256,
6883 .read = spi_chip_read,
6884 .voltage = {2700, 3600},
6885 },
6886
6887 {
6888 .vendor = "Micron/Numonyx/ST",
6889 .name = "M25P64",
6890 .bustype = BUS_SPI,
6891 .manufacture_id = ST_ID,
6892 .model_id = ST_M25P64,
6893 .total_size = 8192,
6894 .page_size = 256,
6895 .feature_bits = FEATURE_WRSR_WREN,
6896 .tested = TEST_OK_PREW,
6897 .probe = probe_spi_rdid,
6898 .probe_timing = TIMING_ZERO,
6899 .block_erasers =
6900 {
6901 {
6902 .eraseblocks = { {64 * 1024, 128} },
6903 .block_erase = spi_block_erase_d8,
6904 }, {
6905 .eraseblocks = { {8 * 1024 * 1024, 1} },
6906 .block_erase = spi_block_erase_c7,
6907 }
6908 },
6909 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6910 .unlock = spi_disable_blockprotect,
6911 .write = spi_chip_write_256,
6912 .read = spi_chip_read,
6913 .voltage = {2700, 3600},
6914 },
6915
6916 {
6917 .vendor = "Micron/Numonyx/ST",
6918 .name = "M25P128",
6919 .bustype = BUS_SPI,
6920 .manufacture_id = ST_ID,
6921 .model_id = ST_M25P128,
6922 .total_size = 16384,
6923 .page_size = 256,
6924 .feature_bits = FEATURE_WRSR_WREN,
6925 .tested = TEST_OK_PREW,
6926 .probe = probe_spi_rdid,
6927 .probe_timing = TIMING_ZERO,
6928 .block_erasers =
6929 {
6930 {
6931 .eraseblocks = { {256 * 1024, 64} },
6932 .block_erase = spi_block_erase_d8,
6933 }, {
6934 .eraseblocks = { {16 * 1024 * 1024, 1} },
6935 .block_erase = spi_block_erase_c7,
6936 }
6937 },
6938 .printlock = spi_prettyprint_status_register_default_bp3, /* TODO: check */
6939 .unlock = spi_disable_blockprotect,
6940 .write = spi_chip_write_256,
6941 .read = spi_chip_read,
6942 .voltage = {2700, 3600},
6943 },
6944
6945 {
6946 .vendor = "Micron/Numonyx/ST",
6947 .name = "M25PE10",
6948 .bustype = BUS_SPI,
6949 .manufacture_id = ST_ID,
6950 .model_id = ST_M25PE10,
6951 .total_size = 128,
6952 .page_size = 256,
6953 .feature_bits = FEATURE_WRSR_WREN,
6954 .tested = TEST_UNTESTED,
6955 .probe = probe_spi_rdid,
6956 .probe_timing = TIMING_ZERO,
6957 .block_erasers =
6958 {
6959 {
6960 .eraseblocks = { {4 * 1024, 32} },
6961 .block_erase = spi_block_erase_20,
6962 }, {
6963 .eraseblocks = { {64 * 1024, 2} },
6964 .block_erase = spi_block_erase_d8,
6965 }, {
6966 .eraseblocks = { {128 * 1024, 1} },
6967 .block_erase = spi_block_erase_c7,
6968 }
6969 },
6970 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
6971 .unlock = spi_disable_blockprotect,
6972 .write = spi_chip_write_256,
6973 .read = spi_chip_read,
6974 .voltage = {2700, 3600},
6975 },
6976
6977 {
6978 .vendor = "Micron/Numonyx/ST",
6979 .name = "M25PE20",
6980 .bustype = BUS_SPI,
6981 .manufacture_id = ST_ID,
6982 .model_id = ST_M25PE20,
6983 .total_size = 256,
6984 .page_size = 256,
6985 .feature_bits = FEATURE_WRSR_WREN,
6986 .tested = TEST_UNTESTED,
6987 .probe = probe_spi_rdid,
6988 .probe_timing = TIMING_ZERO,
6989 .block_erasers =
6990 {
6991 {
6992 .eraseblocks = { {4 * 1024, 64} },
6993 .block_erase = spi_block_erase_20,
6994 }, {
6995 .eraseblocks = { {64 * 1024, 4} },
6996 .block_erase = spi_block_erase_d8,
6997 }, {
6998 .eraseblocks = { {256 * 1024, 1} },
6999 .block_erase = spi_block_erase_c7,
7000 }
7001 },
7002 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7003 .unlock = spi_disable_blockprotect,
7004 .write = spi_chip_write_256,
7005 .read = spi_chip_read,
7006 .voltage = {2700, 3600},
7007 },
7008
7009 {
7010 .vendor = "Micron/Numonyx/ST",
7011 .name = "M25PE40",
7012 .bustype = BUS_SPI,
7013 .manufacture_id = ST_ID,
7014 .model_id = ST_M25PE40,
7015 .total_size = 512,
7016 .page_size = 256,
7017 .feature_bits = FEATURE_WRSR_WREN,
7018 .tested = TEST_UNTESTED,
7019 .probe = probe_spi_rdid,
7020 .probe_timing = TIMING_ZERO,
7021 .block_erasers =
7022 {
7023 {
7024 .eraseblocks = { {4 * 1024, 128} },
7025 .block_erase = spi_block_erase_20,
7026 }, {
7027 .eraseblocks = { {64 * 1024, 8} },
7028 .block_erase = spi_block_erase_d8,
7029 }, {
7030 .eraseblocks = { {512 * 1024, 1} },
7031 .block_erase = spi_block_erase_c7,
7032 }
7033 },
7034 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7035 .unlock = spi_disable_blockprotect,
7036 .write = spi_chip_write_256,
7037 .read = spi_chip_read,
7038 .voltage = {2700, 3600},
7039 },
7040
7041 {
7042 .vendor = "Micron/Numonyx/ST",
7043 .name = "M25PE80",
7044 .bustype = BUS_SPI,
7045 .manufacture_id = ST_ID,
7046 .model_id = ST_M25PE80,
7047 .total_size = 1024,
7048 .page_size = 256,
7049 .feature_bits = FEATURE_WRSR_WREN,
7050 .tested = TEST_OK_PREW,
7051 .probe = probe_spi_rdid,
7052 .probe_timing = TIMING_ZERO,
7053 .block_erasers =
7054 {
7055 {
7056 .eraseblocks = { {4 * 1024, 256} },
7057 .block_erase = spi_block_erase_20,
7058 }, {
7059 .eraseblocks = { {64 * 1024, 16} },
7060 .block_erase = spi_block_erase_d8,
7061 }, {
7062 .eraseblocks = { {1024 * 1024, 1} },
7063 .block_erase = spi_block_erase_c7,
7064 }
7065 },
7066 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7067 .unlock = spi_disable_blockprotect,
7068 .write = spi_chip_write_256,
7069 .read = spi_chip_read,
7070 .voltage = {2700, 3600},
7071 },
7072
7073 {
7074 .vendor = "Micron/Numonyx/ST",
7075 .name = "M25PE16",
7076 .bustype = BUS_SPI,
7077 .manufacture_id = ST_ID,
7078 .model_id = ST_M25PE16,
7079 .total_size = 2048,
7080 .page_size = 256,
7081 .feature_bits = FEATURE_WRSR_WREN,
7082 .tested = TEST_UNTESTED,
7083 .probe = probe_spi_rdid,
7084 .probe_timing = TIMING_ZERO,
7085 .block_erasers =
7086 {
7087 {
7088 .eraseblocks = { {4 * 1024, 512} },
7089 .block_erase = spi_block_erase_20,
7090 }, {
7091 .eraseblocks = { {64 * 1024, 32} },
7092 .block_erase = spi_block_erase_d8,
7093 }, {
7094 .eraseblocks = { {2 * 1024 * 1024, 1} },
7095 .block_erase = spi_block_erase_c7,
7096 }
7097 },
7098 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
7099 .unlock = spi_disable_blockprotect,
7100 .write = spi_chip_write_256,
7101 .read = spi_chip_read,
7102 .voltage = {2700, 3600},
7103 },
7104
7105 {
7106 .vendor = "Micron/Numonyx/ST",
7107 .name = "M25PX80",
7108 .bustype = BUS_SPI,
7109 .manufacture_id = ST_ID,
7110 .model_id = ST_M25PX80,
7111 .total_size = 1024,
7112 .page_size = 256,
7113 /* OTP: 64B total; read 0x4B, write 0x42 */
7114 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7115 .tested = TEST_OK_PREW,
7116 .probe = probe_spi_rdid,
7117 .probe_timing = TIMING_ZERO,
7118 .block_erasers = {
7119 {
7120 .eraseblocks = { { 4 * 1024, 256 } },
7121 .block_erase = spi_block_erase_20,
7122 }, {
7123 .eraseblocks = { {64 * 1024, 16} },
7124 .block_erase = spi_block_erase_d8,
7125 }, {
7126 .eraseblocks = { {1024 * 1024, 1} },
7127 .block_erase = spi_block_erase_c7,
7128 }
7129 },
7130 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7131 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7132 .write = spi_chip_write_256,
7133 .read = spi_chip_read,
7134 .voltage = {2700, 3600},
7135 },
7136
7137 {
7138 .vendor = "Micron/Numonyx/ST",
7139 .name = "M25PX16",
7140 .bustype = BUS_SPI,
7141 .manufacture_id = ST_ID,
7142 .model_id = ST_M25PX16,
7143 .total_size = 2048,
7144 .page_size = 256,
7145 /* OTP: 64B total; read 0x4B; write 0x42 */
7146 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7147 .tested = TEST_OK_PREW,
7148 .probe = probe_spi_rdid,
7149 .probe_timing = TIMING_ZERO,
7150 .block_erasers =
7151 {
7152 {
7153 .eraseblocks = { { 4 * 1024, 512 } },
7154 .block_erase = spi_block_erase_20,
7155 }, {
7156 .eraseblocks = { {64 * 1024, 32} },
7157 .block_erase = spi_block_erase_d8,
7158 }, {
7159 .eraseblocks = { {2 * 1024 * 1024, 1} },
7160 .block_erase = spi_block_erase_c7,
7161 }
7162 },
7163 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7164 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7165 .write = spi_chip_write_256,
7166 .read = spi_chip_read,
7167 },
7168
7169 {
7170 .vendor = "Micron/Numonyx/ST",
7171 .name = "M25PX32",
7172 .bustype = BUS_SPI,
7173 .manufacture_id = ST_ID,
7174 .model_id = ST_M25PX32,
7175 .total_size = 4096,
7176 .page_size = 256,
7177 /* OTP: 64B total; read 0x4B; write 0x42 */
7178 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7179 .tested = TEST_OK_PRE,
7180 .probe = probe_spi_rdid,
7181 .probe_timing = TIMING_ZERO,
7182 .block_erasers =
7183 {
7184 {
7185 .eraseblocks = { { 4 * 1024, 1024 } },
7186 .block_erase = spi_block_erase_20,
7187 }, {
7188 .eraseblocks = { {64 * 1024, 64} },
7189 .block_erase = spi_block_erase_d8,
7190 }, {
7191 .eraseblocks = { {4 * 1024 * 1024, 1} },
7192 .block_erase = spi_block_erase_c7,
7193 }
7194 },
7195 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7196 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7197 .write = spi_chip_write_256,
7198 .read = spi_chip_read,
7199 .voltage = {2700, 3600},
7200 },
7201
7202 {
7203 .vendor = "Micron/Numonyx/ST",
7204 .name = "M25PX64",
7205 .bustype = BUS_SPI,
7206 .manufacture_id = ST_ID,
7207 .model_id = ST_M25PX64,
7208 .total_size = 8192,
7209 .page_size = 256,
7210 /* OTP: 64B total; read 0x4B; write 0x42 */
7211 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7212 .tested = TEST_OK_PRE,
7213 .probe = probe_spi_rdid,
7214 .probe_timing = TIMING_ZERO,
7215 .block_erasers =
7216 {
7217 {
7218 .eraseblocks = { { 4 * 1024, 2048 } },
7219 .block_erase = spi_block_erase_20,
7220 }, {
7221 .eraseblocks = { {64 * 1024, 128} },
7222 .block_erase = spi_block_erase_d8,
7223 }, {
7224 .eraseblocks = { {8 * 1024 * 1024, 1} },
7225 .block_erase = spi_block_erase_c7,
7226 }
7227 },
7228 .printlock = spi_prettyprint_status_register_default_bp2, /* bit5: T/B */
7229 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
7230 .write = spi_chip_write_256,
7231 .read = spi_chip_read,
7232 },
7233
7234 {
7235 .vendor = "Micron/Numonyx/ST",
7236 .name = "M45PE10",
7237 .bustype = BUS_SPI,
7238 .manufacture_id = ST_ID,
7239 .model_id = ST_M45PE10,
7240 .total_size = 128,
7241 .page_size = 256,
7242 .tested = TEST_UNTESTED,
7243 .probe = probe_spi_rdid,
7244 .probe_timing = TIMING_ZERO,
7245 .block_erasers = {
7246 {
7247 .eraseblocks = { {256, 512} },
7248 .block_erase = spi_block_erase_db,
7249 }, {
7250 .eraseblocks = { {64 * 1024, 2} },
7251 .block_erase = spi_block_erase_d8,
7252 }
7253 },
7254 .printlock = spi_prettyprint_status_register_default_welwip,
7255 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7256 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7257 .read = spi_chip_read, /* Fast read (0x0B) supported */
7258 .voltage = {2700, 3600},
7259 },
7260
7261 {
7262 .vendor = "Micron/Numonyx/ST",
7263 .name = "M45PE20",
7264 .bustype = BUS_SPI,
7265 .manufacture_id = ST_ID,
7266 .model_id = ST_M45PE20,
7267 .total_size = 256,
7268 .page_size = 256,
7269 .tested = TEST_UNTESTED,
7270 .probe = probe_spi_rdid,
7271 .probe_timing = TIMING_ZERO,
7272 .block_erasers = {
7273 {
7274 .eraseblocks = { {256, 1024} },
7275 .block_erase = spi_block_erase_db,
7276 }, {
7277 .eraseblocks = { {64 * 1024, 4} },
7278 .block_erase = spi_block_erase_d8,
7279 }
7280 },
7281 .printlock = spi_prettyprint_status_register_default_welwip,
7282 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7283 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7284 .read = spi_chip_read, /* Fast read (0x0B) supported */
7285 .voltage = {2700, 3600},
7286 },
7287
7288 {
7289 .vendor = "Micron/Numonyx/ST",
7290 .name = "M45PE40",
7291 .bustype = BUS_SPI,
7292 .manufacture_id = ST_ID,
7293 .model_id = ST_M45PE40,
7294 .total_size = 512,
7295 .page_size = 256,
7296 .tested = TEST_UNTESTED,
7297 .probe = probe_spi_rdid,
7298 .probe_timing = TIMING_ZERO,
7299 .block_erasers = {
7300 {
7301 .eraseblocks = { {256, 2048} },
7302 .block_erase = spi_block_erase_db,
7303 }, {
7304 .eraseblocks = { {64 * 1024, 8} },
7305 .block_erase = spi_block_erase_d8,
7306 }
7307 },
7308 .printlock = spi_prettyprint_status_register_default_welwip,
7309 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7310 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7311 .read = spi_chip_read, /* Fast read (0x0B) supported */
7312 .voltage = {2700, 3600},
7313 },
7314
7315 {
7316 .vendor = "Micron/Numonyx/ST",
7317 .name = "M45PE80",
7318 .bustype = BUS_SPI,
7319 .manufacture_id = ST_ID,
7320 .model_id = ST_M45PE80,
7321 .total_size = 1024,
7322 .page_size = 256,
7323 .tested = TEST_UNTESTED,
7324 .probe = probe_spi_rdid,
7325 .probe_timing = TIMING_ZERO,
7326 .block_erasers = {
7327 {
7328 .eraseblocks = { {256, 4096} },
7329 .block_erase = spi_block_erase_db,
7330 }, {
7331 .eraseblocks = { {64 * 1024, 16} },
7332 .block_erase = spi_block_erase_d8,
7333 }
7334 },
7335 .printlock = spi_prettyprint_status_register_default_welwip,
7336 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7337 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7338 .read = spi_chip_read, /* Fast read (0x0B) supported */
7339 .voltage = {2700, 3600},
7340 },
7341
7342 {
7343 .vendor = "Micron/Numonyx/ST",
7344 .name = "M45PE16",
7345 .bustype = BUS_SPI,
7346 .manufacture_id = ST_ID,
7347 .model_id = ST_M45PE16,
7348 .total_size = 2048,
7349 .page_size = 256,
7350 .tested = TEST_UNTESTED,
7351 .probe = probe_spi_rdid,
7352 .probe_timing = TIMING_ZERO,
7353 .block_erasers = {
7354 {
7355 .eraseblocks = { {256, 8192} },
7356 .block_erase = spi_block_erase_db,
7357 }, {
7358 .eraseblocks = { {64 * 1024, 32} },
7359 .block_erase = spi_block_erase_d8,
7360 }
7361 },
7362 .printlock = spi_prettyprint_status_register_default_welwip,
7363 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
7364 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
7365 .read = spi_chip_read, /* Fast read (0x0B) supported */
7366 .voltage = {2700, 3600},
7367 },
7368
7369 {
7370 .vendor = "Micron/Numonyx/ST",
7371 .name = "N25Q016",
7372 .bustype = BUS_SPI,
7373 .manufacture_id = ST_ID,
7374 .model_id = ST_N25Q016__1E,
7375 .total_size = 2048,
7376 .page_size = 256,
7377 /* supports SFDP */
7378 /* OTP: 64B total; read 0x4B, write 0x42 */
7379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7380 .tested = TEST_UNTESTED,
7381 .probe = probe_spi_rdid,
7382 .probe_timing = TIMING_ZERO,
7383 .block_erasers =
7384 {
7385 {
7386 .eraseblocks = { {4 * 1024, 512} },
7387 .block_erase = spi_block_erase_20,
7388 }, {
7389 .eraseblocks = { {32 * 1024, 64} },
7390 .block_erase = spi_block_erase_52,
7391 }, {
7392 .eraseblocks = { {64 * 1024, 32} },
7393 .block_erase = spi_block_erase_d8,
7394 }, {
7395 .eraseblocks = { {2 * 1024 * 1024, 1} },
7396 .block_erase = spi_block_erase_c7,
7397 }
7398 },
7399 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7400 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7401 .write = spi_chip_write_256, /* Multi I/O supported */
7402 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7403 .voltage = {1700, 2000},
7404 },
7405
7406 {
7407 .vendor = "Micron/Numonyx/ST",
7408 .name = "N25Q032..1E",
7409 .bustype = BUS_SPI,
7410 .manufacture_id = ST_ID,
7411 .model_id = ST_N25Q032__1E,
7412 .total_size = 4096,
7413 .page_size = 256,
7414 /* supports SFDP */
7415 /* OTP: 64B total; read 0x4B, write 0x42 */
7416 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7417 .tested = TEST_UNTESTED,
7418 .probe = probe_spi_rdid,
7419 .probe_timing = TIMING_ZERO,
7420 .block_erasers =
7421 {
7422 {
7423 .eraseblocks = { {4 * 1024, 1024} },
7424 .block_erase = spi_block_erase_20,
7425 }, {
7426 .eraseblocks = { {64 * 1024, 64} },
7427 .block_erase = spi_block_erase_d8,
7428 }, {
7429 .eraseblocks = { {4 * 1024 * 1024, 1} },
7430 .block_erase = spi_block_erase_c7,
7431 }
7432 },
7433 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7434 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7435 .write = spi_chip_write_256, /* Multi I/O supported */
7436 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7437 .voltage = {1700, 2000},
7438 },
7439
7440 {
7441 .vendor = "Micron/Numonyx/ST",
7442 .name = "N25Q032..3E",
7443 .bustype = BUS_SPI,
7444 .manufacture_id = ST_ID,
7445 .model_id = ST_N25Q032__3E,
7446 .total_size = 4096,
7447 .page_size = 256,
7448 /* supports SFDP */
7449 /* OTP: 64B total; read 0x4B, write 0x42 */
7450 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7451 .tested = TEST_OK_PREW,
7452 .probe = probe_spi_rdid,
7453 .probe_timing = TIMING_ZERO,
7454 .block_erasers =
7455 {
7456 {
7457 .eraseblocks = { {4 * 1024, 1024} },
7458 .block_erase = spi_block_erase_20,
7459 }, {
7460 .eraseblocks = { {64 * 1024, 64} },
7461 .block_erase = spi_block_erase_d8,
7462 }, {
7463 .eraseblocks = { {4 * 1024 * 1024, 1} },
7464 .block_erase = spi_block_erase_c7,
7465 }
7466 },
7467 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7468 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7469 .write = spi_chip_write_256, /* Multi I/O supported */
7470 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7471 .voltage = {2700, 3600},
7472 },
7473
7474 {
7475 .vendor = "Micron/Numonyx/ST",
7476 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7477 .bustype = BUS_SPI,
7478 .manufacture_id = ST_ID,
7479 .model_id = ST_N25Q064__1E,
7480 .total_size = 8192,
7481 .page_size = 256,
7482 /* supports SFDP */
7483 /* OTP: 64B total; read 0x4B, write 0x42 */
7484 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7485 .tested = TEST_UNTESTED,
7486 .probe = probe_spi_rdid,
7487 .probe_timing = TIMING_ZERO,
7488 .block_erasers =
7489 {
7490 {
7491 .eraseblocks = { {4 * 1024, 2048 } },
7492 .block_erase = spi_block_erase_20,
7493 }, {
7494 .eraseblocks = { {64 * 1024, 128} },
7495 .block_erase = spi_block_erase_d8,
7496 }, {
7497 .eraseblocks = { {8 * 1024 * 1024, 1} },
7498 .block_erase = spi_block_erase_c7,
7499 }
7500 },
7501 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7502 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7503 .write = spi_chip_write_256, /* Multi I/O supported */
7504 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7505 .voltage = {1700, 2000},
7506 },
7507
7508 {
7509 .vendor = "Micron/Numonyx/ST",
7510 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7511 .bustype = BUS_SPI,
7512 .manufacture_id = ST_ID,
7513 .model_id = ST_N25Q064__3E,
7514 .total_size = 8192,
7515 .page_size = 256,
7516 /* supports SFDP */
7517 /* OTP: 64B total; read 0x4B, write 0x42 */
7518 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7519 .tested = TEST_OK_PREW,
7520 .probe = probe_spi_rdid,
7521 .probe_timing = TIMING_ZERO,
7522 .block_erasers =
7523 {
7524 {
7525 .eraseblocks = { {4 * 1024, 2048 } },
7526 .block_erase = spi_block_erase_20,
7527 }, {
7528 .eraseblocks = { {64 * 1024, 128} },
7529 .block_erase = spi_block_erase_d8,
7530 }, {
7531 .eraseblocks = { {8 * 1024 * 1024, 1} },
7532 .block_erase = spi_block_erase_c7,
7533 }
7534 },
7535 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7536 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7537 .write = spi_chip_write_256, /* Multi I/O supported */
7538 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7539 .voltage = {2700, 3600},
7540 },
7541
7542 {
7543 .vendor = "Micron/Numonyx/ST",
7544 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
7545 .bustype = BUS_SPI,
7546 .manufacture_id = ST_ID,
7547 .model_id = ST_N25Q128__1E,
7548 .total_size = 16384,
7549 .page_size = 256,
7550 /* supports SFDP */
7551 /* OTP: 64B total; read 0x4B, write 0x42 */
7552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7553 .tested = TEST_UNTESTED,
7554 .probe = probe_spi_rdid,
7555 .probe_timing = TIMING_ZERO,
7556 .block_erasers = {
7557 {
7558 .eraseblocks = { {4 * 1024, 4096 } },
7559 .block_erase = spi_block_erase_20,
7560 }, {
7561 .eraseblocks = { {64 * 1024, 256} },
7562 .block_erase = spi_block_erase_d8,
7563 }, {
7564 .eraseblocks = { {16384 * 1024, 1} },
7565 .block_erase = spi_block_erase_c7,
7566 }
7567 },
7568 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7569 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7570 .write = spi_chip_write_256, /* Multi I/O supported */
7571 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7572 .voltage = {1700, 2000},
7573 },
7574
7575 {
7576 .vendor = "Micron/Numonyx/ST",
7577 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
7578 .bustype = BUS_SPI,
7579 .manufacture_id = ST_ID,
7580 .model_id = ST_N25Q128__3E,
7581 .total_size = 16384,
7582 .page_size = 256,
7583 /* supports SFDP */
7584 /* OTP: 64B total; read 0x4B, write 0x42 */
7585 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7586 .tested = TEST_OK_PREW,
7587 .probe = probe_spi_rdid,
7588 .probe_timing = TIMING_ZERO,
7589 .block_erasers = {
7590 {
7591 .eraseblocks = { {4 * 1024, 4096 } },
7592 .block_erase = spi_block_erase_20,
7593 }, {
7594 .eraseblocks = { {64 * 1024, 256} },
7595 .block_erase = spi_block_erase_d8,
7596 }, {
7597 .eraseblocks = { {16384 * 1024, 1} },
7598 .block_erase = spi_block_erase_c7,
7599 }
7600 },
7601 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
7602 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
7603 .write = spi_chip_write_256, /* Multi I/O supported */
7604 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7605 .voltage = {2700, 3600},
7606 },
7607
7608 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00007609 .vendor = "MoselVitelic",
7610 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007611 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007612 .manufacture_id = SYNCMOS_MVC_ID,
7613 .model_id = MVC_V29C51000B,
7614 .total_size = 64,
7615 .page_size = 512,
7616 .feature_bits = FEATURE_EITHER_RESET,
7617 .tested = TEST_UNTESTED,
7618 .probe = probe_jedec,
7619 .probe_timing = TIMING_ZERO,
7620 .block_erasers =
7621 {
7622 {
7623 .eraseblocks = { {512, 128} },
7624 .block_erase = erase_sector_jedec,
7625 }, {
7626 .eraseblocks = { {64 * 1024, 1} },
7627 .block_erase = erase_chip_block_jedec,
7628 },
7629 },
7630 .write = write_jedec_1,
7631 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007632 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007633 },
7634
7635 {
7636 .vendor = "MoselVitelic",
7637 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007638 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007639 .manufacture_id = SYNCMOS_MVC_ID,
7640 .model_id = MVC_V29C51000T,
7641 .total_size = 64,
7642 .page_size = 512,
7643 .feature_bits = FEATURE_EITHER_RESET,
7644 .tested = TEST_UNTESTED,
7645 .probe = probe_jedec,
7646 .probe_timing = TIMING_ZERO,
7647 .block_erasers =
7648 {
7649 {
7650 .eraseblocks = { {512, 128} },
7651 .block_erase = erase_sector_jedec,
7652 }, {
7653 .eraseblocks = { {64 * 1024, 1} },
7654 .block_erase = erase_chip_block_jedec,
7655 },
7656 },
7657 .write = write_jedec_1,
7658 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007659 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007660 },
7661
7662 {
7663 .vendor = "MoselVitelic",
7664 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007665 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007666 .manufacture_id = SYNCMOS_MVC_ID,
7667 .model_id = MVC_V29C51400B,
7668 .total_size = 512,
7669 .page_size = 1024,
7670 .feature_bits = FEATURE_EITHER_RESET,
7671 .tested = TEST_UNTESTED,
7672 .probe = probe_jedec,
7673 .probe_timing = TIMING_ZERO,
7674 .block_erasers =
7675 {
7676 {
7677 .eraseblocks = { {1024, 512} },
7678 .block_erase = erase_sector_jedec,
7679 }, {
7680 .eraseblocks = { {512 * 1024, 1} },
7681 .block_erase = erase_chip_block_jedec,
7682 },
7683 },
7684 .write = write_jedec_1,
7685 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007686 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007687 },
7688
7689 {
7690 .vendor = "MoselVitelic",
7691 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007692 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007693 .manufacture_id = SYNCMOS_MVC_ID,
7694 .model_id = MVC_V29C51400T,
7695 .total_size = 512,
7696 .page_size = 1024,
7697 .feature_bits = FEATURE_EITHER_RESET,
7698 .tested = TEST_UNTESTED,
7699 .probe = probe_jedec,
7700 .probe_timing = TIMING_ZERO,
7701 .block_erasers =
7702 {
7703 {
7704 .eraseblocks = { {1024, 512} },
7705 .block_erase = erase_sector_jedec,
7706 }, {
7707 .eraseblocks = { {512 * 1024, 1} },
7708 .block_erase = erase_chip_block_jedec,
7709 },
7710 },
7711 .write = write_jedec_1,
7712 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007713 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007714 },
7715
7716 {
7717 .vendor = "MoselVitelic",
7718 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007719 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007720 .manufacture_id = SYNCMOS_MVC_ID,
7721 .model_id = MVC_V29LC51000,
7722 .total_size = 64,
7723 .page_size = 512,
7724 .feature_bits = FEATURE_EITHER_RESET,
7725 .tested = TEST_UNTESTED,
7726 .probe = probe_jedec,
7727 .probe_timing = TIMING_ZERO,
7728 .block_erasers =
7729 {
7730 {
7731 .eraseblocks = { {512, 128} },
7732 .block_erase = erase_sector_jedec,
7733 }, {
7734 .eraseblocks = { {64 * 1024, 1} },
7735 .block_erase = erase_chip_block_jedec,
7736 },
7737 },
7738 .write = write_jedec_1,
7739 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007740 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007741 },
7742
7743 {
7744 .vendor = "MoselVitelic",
7745 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007746 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007747 .manufacture_id = SYNCMOS_MVC_ID,
7748 .model_id = MVC_V29LC51001,
7749 .total_size = 128,
7750 .page_size = 512,
7751 .feature_bits = FEATURE_EITHER_RESET,
7752 .tested = TEST_UNTESTED,
7753 .probe = probe_jedec,
7754 .probe_timing = TIMING_ZERO,
7755 .block_erasers =
7756 {
7757 {
7758 .eraseblocks = { {512, 256} },
7759 .block_erase = erase_sector_jedec,
7760 }, {
7761 .eraseblocks = { {128 * 1024, 1} },
7762 .block_erase = erase_chip_block_jedec,
7763 },
7764 },
7765 .write = write_jedec_1,
7766 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007767 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007768 },
7769
7770 {
7771 .vendor = "MoselVitelic",
7772 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007773 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00007774 .manufacture_id = SYNCMOS_MVC_ID,
7775 .model_id = MVC_V29LC51002,
7776 .total_size = 256,
7777 .page_size = 512,
7778 .feature_bits = FEATURE_EITHER_RESET,
7779 .tested = TEST_UNTESTED,
7780 .probe = probe_jedec,
7781 .probe_timing = TIMING_ZERO,
7782 .block_erasers =
7783 {
7784 {
7785 .eraseblocks = { {512, 512} },
7786 .block_erase = erase_sector_jedec,
7787 }, {
7788 .eraseblocks = { {256 * 1024, 1} },
7789 .block_erase = erase_chip_block_jedec,
7790 },
7791 },
7792 .write = write_jedec_1,
7793 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007794 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00007795 },
7796
7797 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00007798 .vendor = "Nantronics",
7799 .name = "N25S10",
7800 .bustype = BUS_SPI,
7801 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7802 .model_id = NANTRONICS_N25S10,
7803 .total_size = 128,
7804 .page_size = 256,
7805 .feature_bits = FEATURE_WRSR_WREN,
7806 .tested = TEST_UNTESTED,
7807 .probe = probe_spi_rdid,
7808 .probe_timing = TIMING_ZERO,
7809 .block_erasers =
7810 {
7811 {
7812 .eraseblocks = { {4 * 1024, 32} },
7813 .block_erase = spi_block_erase_20,
7814 }, {
7815 .eraseblocks = { {4 * 1024, 32} },
7816 .block_erase = spi_block_erase_d7,
7817 }, {
7818 .eraseblocks = { {32 * 1024, 4} },
7819 .block_erase = spi_block_erase_52,
7820 }, {
7821 .eraseblocks = { {64 * 1024, 2} },
7822 .block_erase = spi_block_erase_d8,
7823 }, {
7824 .eraseblocks = { {128 * 1024, 1} },
7825 .block_erase = spi_block_erase_60,
7826 }, {
7827 .eraseblocks = { {128 * 1024, 1} },
7828 .block_erase = spi_block_erase_c7,
7829 }
7830 },
7831 .printlock = spi_prettyprint_status_register_default_bp3,
7832 .unlock = spi_disable_blockprotect_bp3_srwd,
7833 .write = spi_chip_write_256,
7834 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7835 .voltage = {2700, 3600},
7836 },
7837
7838 {
7839 .vendor = "Nantronics",
7840 .name = "N25S20",
7841 .bustype = BUS_SPI,
7842 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7843 .model_id = NANTRONICS_N25S20,
7844 .total_size = 256,
7845 .page_size = 256,
7846 .feature_bits = FEATURE_WRSR_WREN,
7847 .tested = TEST_UNTESTED,
7848 .probe = probe_spi_rdid,
7849 .probe_timing = TIMING_ZERO,
7850 .block_erasers =
7851 {
7852 {
7853 .eraseblocks = { {4 * 1024, 64} },
7854 .block_erase = spi_block_erase_20,
7855 }, {
7856 .eraseblocks = { {4 * 1024, 64} },
7857 .block_erase = spi_block_erase_d7,
7858 }, {
7859 .eraseblocks = { {32 * 1024, 8} },
7860 .block_erase = spi_block_erase_52,
7861 }, {
7862 .eraseblocks = { {64 * 1024, 4} },
7863 .block_erase = spi_block_erase_d8,
7864 }, {
7865 .eraseblocks = { {256 * 1024, 1} },
7866 .block_erase = spi_block_erase_60,
7867 }, {
7868 .eraseblocks = { {256 * 1024, 1} },
7869 .block_erase = spi_block_erase_c7,
7870 }
7871 },
7872 .printlock = spi_prettyprint_status_register_default_bp3,
7873 .unlock = spi_disable_blockprotect_bp3_srwd,
7874 .write = spi_chip_write_256,
7875 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7876 .voltage = {2700, 3600},
7877 },
7878
7879 {
7880 .vendor = "Nantronics",
7881 .name = "N25S40",
7882 .bustype = BUS_SPI,
7883 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7884 .model_id = NANTRONICS_N25S40,
7885 .total_size = 512,
7886 .page_size = 256,
7887 .feature_bits = FEATURE_WRSR_WREN,
7888 .tested = TEST_UNTESTED,
7889 .probe = probe_spi_rdid,
7890 .probe_timing = TIMING_ZERO,
7891 .block_erasers =
7892 {
7893 {
7894 .eraseblocks = { {4 * 1024, 128} },
7895 .block_erase = spi_block_erase_20,
7896 }, {
7897 .eraseblocks = { {4 * 1024, 128} },
7898 .block_erase = spi_block_erase_d7,
7899 }, {
7900 .eraseblocks = { {32 * 1024, 16} },
7901 .block_erase = spi_block_erase_52,
7902 }, {
7903 .eraseblocks = { {64 * 1024, 8} },
7904 .block_erase = spi_block_erase_d8,
7905 }, {
7906 .eraseblocks = { {512 * 1024, 1} },
7907 .block_erase = spi_block_erase_60,
7908 }, {
7909 .eraseblocks = { {512 * 1024, 1} },
7910 .block_erase = spi_block_erase_c7,
7911 }
7912 },
7913 .printlock = spi_prettyprint_status_register_default_bp3,
7914 .unlock = spi_disable_blockprotect_bp3_srwd,
7915 .write = spi_chip_write_256,
7916 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7917 .voltage = {2700, 3600},
7918 },
7919
7920 {
7921 .vendor = "Nantronics",
7922 .name = "N25S80",
7923 .bustype = BUS_SPI,
7924 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7925 .model_id = NANTRONICS_N25S80,
7926 .total_size = 1024,
7927 .page_size = 256,
7928 .feature_bits = FEATURE_WRSR_WREN,
7929 .tested = TEST_UNTESTED,
7930 .probe = probe_spi_rdid,
7931 .probe_timing = TIMING_ZERO,
7932 .block_erasers =
7933 {
7934 {
7935 .eraseblocks = { {4 * 1024, 256} },
7936 .block_erase = spi_block_erase_20,
7937 }, {
7938 .eraseblocks = { {32 * 1024, 32} },
7939 .block_erase = spi_block_erase_52,
7940 }, {
7941 .eraseblocks = { {64 * 1024, 16} },
7942 .block_erase = spi_block_erase_d8,
7943 }, {
7944 .eraseblocks = { {1024 * 1024, 1} },
7945 .block_erase = spi_block_erase_60,
7946 }, {
7947 .eraseblocks = { {1024 * 1024, 1} },
7948 .block_erase = spi_block_erase_c7,
7949 }
7950 },
7951 .printlock = spi_prettyprint_status_register_default_bp3,
7952 .unlock = spi_disable_blockprotect_bp3_srwd,
7953 .write = spi_chip_write_256,
7954 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7955 .voltage = {2700, 3600},
7956 },
7957
7958 {
7959 .vendor = "Nantronics",
7960 .name = "N25S16",
7961 .bustype = BUS_SPI,
7962 .manufacture_id = NANTRONICS_ID_NOPREFIX,
7963 .model_id = NANTRONICS_N25S16,
7964 .total_size = 2048,
7965 .page_size = 256,
7966 .feature_bits = FEATURE_WRSR_WREN,
7967 .tested = TEST_UNTESTED,
7968 .probe = probe_spi_rdid,
7969 .probe_timing = TIMING_ZERO,
7970 .block_erasers =
7971 {
7972 {
7973 .eraseblocks = { {4 * 1024, 512} },
7974 .block_erase = spi_block_erase_20,
7975 }, {
7976 .eraseblocks = { {64 * 1024, 32} },
7977 .block_erase = spi_block_erase_d8,
7978 }, {
7979 .eraseblocks = { {2048 * 1024, 1} },
7980 .block_erase = spi_block_erase_60,
7981 }, {
7982 .eraseblocks = { {2048 * 1024, 1} },
7983 .block_erase = spi_block_erase_c7,
7984 }
7985 },
7986 .printlock = spi_prettyprint_status_register_default_bp3,
7987 .unlock = spi_disable_blockprotect_bp3_srwd,
7988 .write = spi_chip_write_256,
7989 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
7990 .voltage = {2700, 3600},
7991 },
7992
7993 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007994 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00007995 .name = "Pm25LD256C",
7996 .bustype = BUS_SPI,
7997 .manufacture_id = PMC_ID,
7998 .model_id = PMC_PM25LD256C,
7999 .total_size = 32,
8000 .page_size = 256,
8001 .feature_bits = FEATURE_WRSR_WREN,
8002 .tested = TEST_UNTESTED,
8003 .probe = probe_spi_rdid,
8004 .probe_timing = TIMING_ZERO,
8005 .block_erasers =
8006 {
8007 {
8008 .eraseblocks = { {4 * 1024, 8} },
8009 .block_erase = spi_block_erase_20,
8010 }, {
8011 .eraseblocks = { {4 * 1024, 8} },
8012 .block_erase = spi_block_erase_d7,
8013 }, {
8014 .eraseblocks = { {32 * 1024, 1} },
8015 .block_erase = spi_block_erase_d8,
8016 }, {
8017 .eraseblocks = { {32 * 1024, 1} },
8018 .block_erase = spi_block_erase_60,
8019 }, {
8020 .eraseblocks = { {32 * 1024, 1} },
8021 .block_erase = spi_block_erase_c7,
8022 }
8023 },
8024 .printlock = spi_prettyprint_status_register_default_bp2,
8025 .unlock = spi_disable_blockprotect,
8026 .write = spi_chip_write_256,
8027 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8028 .voltage = {2700, 3600},
8029 },
8030 {
8031 .vendor = "PMC",
8032 .name = "Pm25LD512(C)",
8033 .bustype = BUS_SPI,
8034 .manufacture_id = PMC_ID,
8035 .model_id = PMC_PM25LD512,
8036 .total_size = 64,
8037 .page_size = 256,
8038 .feature_bits = FEATURE_WRSR_WREN,
8039 .tested = TEST_OK_PREW,
8040 .probe = probe_spi_rdid,
8041 .probe_timing = TIMING_ZERO,
8042 .block_erasers =
8043 {
8044 {
8045 .eraseblocks = { {4 * 1024, 16} },
8046 .block_erase = spi_block_erase_20,
8047 }, {
8048 .eraseblocks = { {4 * 1024, 16} },
8049 .block_erase = spi_block_erase_d7,
8050 }, {
8051 .eraseblocks = { {32 * 1024, 2} },
8052 .block_erase = spi_block_erase_d8,
8053 }, {
8054 .eraseblocks = { {64 * 1024, 1} },
8055 .block_erase = spi_block_erase_60,
8056 }, {
8057 .eraseblocks = { {64 * 1024, 1} },
8058 .block_erase = spi_block_erase_c7,
8059 }
8060 },
8061 .printlock = spi_prettyprint_status_register_default_bp2,
8062 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8063 .write = spi_chip_write_256,
8064 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8065 .voltage = {2300, 3600},
8066 },
8067
8068 {
8069 .vendor = "PMC",
8070 .name = "Pm25LD010(C)",
8071 .bustype = BUS_SPI,
8072 .manufacture_id = PMC_ID,
8073 .model_id = PMC_PM25LD010,
8074 .total_size = 128,
8075 .page_size = 256,
8076 .feature_bits = FEATURE_WRSR_WREN,
8077 .tested = TEST_UNTESTED,
8078 .probe = probe_spi_rdid,
8079 .probe_timing = TIMING_ZERO,
8080 .block_erasers =
8081 {
8082 {
8083 .eraseblocks = { {4 * 1024, 32} },
8084 .block_erase = spi_block_erase_20,
8085 }, {
8086 .eraseblocks = { {4 * 1024, 32} },
8087 .block_erase = spi_block_erase_d7,
8088 }, {
8089 .eraseblocks = { {32 * 1024, 4} },
8090 .block_erase = spi_block_erase_d8,
8091 }, {
8092 .eraseblocks = { {128 * 1024, 1} },
8093 .block_erase = spi_block_erase_60,
8094 }, {
8095 .eraseblocks = { {128 * 1024, 1} },
8096 .block_erase = spi_block_erase_c7,
8097 }
8098 },
8099 .printlock = spi_prettyprint_status_register_default_bp2,
8100 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8101 .write = spi_chip_write_256,
8102 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8103 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
8104 },
8105
8106 {
8107 .vendor = "PMC",
8108 .name = "Pm25LD020(C)",
8109 .bustype = BUS_SPI,
8110 .manufacture_id = PMC_ID,
8111 .model_id = PMC_PM25LD020,
8112 .total_size = 256,
8113 .page_size = 256,
8114 .feature_bits = FEATURE_WRSR_WREN,
8115 .tested = TEST_UNTESTED,
8116 .probe = probe_spi_rdid,
8117 .probe_timing = TIMING_ZERO,
8118 .block_erasers =
8119 {
8120 {
8121 .eraseblocks = { {4 * 1024, 64} },
8122 .block_erase = spi_block_erase_20,
8123 }, {
8124 .eraseblocks = { {4 * 1024, 64} },
8125 .block_erase = spi_block_erase_d7,
8126 }, {
8127 .eraseblocks = { {64 * 1024, 4} },
8128 .block_erase = spi_block_erase_d8,
8129 }, {
8130 .eraseblocks = { {256 * 1024, 1} },
8131 .block_erase = spi_block_erase_60,
8132 }, {
8133 .eraseblocks = { {256 * 1024, 1} },
8134 .block_erase = spi_block_erase_c7,
8135 }
8136 },
8137 .printlock = spi_prettyprint_status_register_default_bp2,
8138 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
8139 .write = spi_chip_write_256,
8140 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8141 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
8142 },
8143
8144 {
8145 .vendor = "PMC",
8146 .name = "Pm25LD040(C)",
8147 .bustype = BUS_SPI,
8148 .manufacture_id = PMC_ID,
8149 .model_id = PMC_PM25LV040,
8150 .total_size = 512,
8151 .page_size = 256,
8152 .feature_bits = FEATURE_WRSR_WREN,
8153 .tested = TEST_UNTESTED,
8154 .probe = probe_spi_rdid,
8155 .probe_timing = TIMING_ZERO,
8156 .block_erasers =
8157 {
8158 {
8159 .eraseblocks = { {4 * 1024, 128} },
8160 .block_erase = spi_block_erase_20,
8161 }, {
8162 .eraseblocks = { {4 * 1024, 128} },
8163 .block_erase = spi_block_erase_d7,
8164 }, {
8165 .eraseblocks = { {64 * 1024, 8} },
8166 .block_erase = spi_block_erase_d8,
8167 }, {
8168 .eraseblocks = { {512 * 1024, 1} },
8169 .block_erase = spi_block_erase_60,
8170 }, {
8171 .eraseblocks = { {512 * 1024, 1} },
8172 .block_erase = spi_block_erase_c7,
8173 }
8174 },
8175 .printlock = spi_prettyprint_status_register_default_bp2,
8176 .unlock = spi_disable_blockprotect,
8177 .write = spi_chip_write_256,
8178 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8179 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
8180 },
8181
8182{
8183 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008184 .name = "Pm25LV512(A)",
8185 .bustype = BUS_SPI,
8186 .manufacture_id = PMC_ID,
8187 .model_id = PMC_PM25LV512,
8188 .total_size = 64,
8189 .page_size = 256,
8190 .feature_bits = FEATURE_WRSR_WREN,
8191 .tested = TEST_UNTESTED,
8192 .probe = probe_spi_res3,
8193 .probe_timing = TIMING_ZERO,
8194 .block_erasers =
8195 {
8196 {
8197 .eraseblocks = { {4 * 1024, 16} },
8198 .block_erase = spi_block_erase_d7,
8199 }, {
8200 .eraseblocks = { {32 * 1024, 2} },
8201 .block_erase = spi_block_erase_d8,
8202 }, {
8203 .eraseblocks = { {64 * 1024, 1} },
8204 .block_erase = spi_block_erase_c7,
8205 }
8206 },
8207 .printlock = spi_prettyprint_status_register_default_bp1,
8208 .unlock = spi_disable_blockprotect,
8209 .write = spi_chip_write_256,
8210 .read = spi_chip_read, /* Fast read (0x0B) supported */
8211 .voltage = {2700, 3600},
8212 },
8213
8214 {
8215 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008216 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008217 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008218 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008219 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008220 .total_size = 128,
8221 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008222 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008223 .tested = TEST_UNTESTED,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008224 .probe = probe_spi_res3,
8225 .probe_timing = TIMING_ZERO,
8226 .block_erasers =
8227 {
8228 {
8229 .eraseblocks = { {4 * 1024, 32} },
8230 .block_erase = spi_block_erase_d7,
8231 }, {
8232 .eraseblocks = { {32 * 1024, 4} },
8233 .block_erase = spi_block_erase_d8,
8234 }, {
8235 .eraseblocks = { {128 * 1024, 1} },
8236 .block_erase = spi_block_erase_c7,
8237 }
8238 },
8239 .printlock = spi_prettyprint_status_register_default_bp1,
8240 .unlock = spi_disable_blockprotect,
8241 .write = spi_chip_write_256,
8242 .read = spi_chip_read, /* Fast read (0x0B) supported */
8243 .voltage = {2700, 3600},
8244 },
8245
8246 {
8247 .vendor = "PMC",
8248 .name = "Pm25LV010A",
8249 .bustype = BUS_SPI,
8250 .manufacture_id = PMC_ID,
8251 .model_id = PMC_PM25LV010,
8252 .total_size = 128,
8253 .page_size = 256,
8254 .feature_bits = FEATURE_WRSR_WREN,
8255 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008256 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008257 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008258 .block_erasers =
8259 {
8260 {
8261 .eraseblocks = { {4 * 1024, 32} },
8262 .block_erase = spi_block_erase_d7,
8263 }, {
8264 .eraseblocks = { {32 * 1024, 4} },
8265 .block_erase = spi_block_erase_d8,
8266 }, {
8267 .eraseblocks = { {128 * 1024, 1} },
8268 .block_erase = spi_block_erase_c7,
8269 }
8270 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008271 .printlock = spi_prettyprint_status_register_default_bp1,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008272 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008273 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008274 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008275 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008276 },
8277
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008278 {
8279 .vendor = "PMC",
8280 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008281 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008282 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008283 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008284 .total_size = 256,
8285 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008286 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008287 .tested = TEST_UNTESTED,
8288 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008289 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008290 .block_erasers =
8291 {
8292 {
8293 .eraseblocks = { {4 * 1024, 64} },
8294 .block_erase = spi_block_erase_d7,
8295 }, {
8296 .eraseblocks = { {64 * 1024, 4} },
8297 .block_erase = spi_block_erase_d8,
8298 }, {
8299 .eraseblocks = { {256 * 1024, 1} },
8300 .block_erase = spi_block_erase_c7,
8301 }
8302 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008303 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008304 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008305 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008306 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008307 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008308 },
8309
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008310 {
8311 .vendor = "PMC",
8312 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008313 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008314 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008315 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008316 .total_size = 512,
8317 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008318 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00008319 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008320 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008321 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008322 .block_erasers =
8323 {
8324 {
8325 .eraseblocks = { {4 * 1024, 128} },
8326 .block_erase = spi_block_erase_d7,
8327 }, {
8328 .eraseblocks = { {64 * 1024, 8} },
8329 .block_erase = spi_block_erase_d8,
8330 }, {
8331 .eraseblocks = { {512 * 1024, 1} },
8332 .block_erase = spi_block_erase_c7,
8333 }
8334 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008335 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008336 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008337 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008338 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008339 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008340 },
8341
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008342 {
8343 .vendor = "PMC",
8344 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008345 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008346 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008347 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008348 .total_size = 1024,
8349 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008350 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008351 .tested = TEST_UNTESTED,
8352 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008353 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008354 .block_erasers =
8355 {
8356 {
8357 .eraseblocks = { {4 * 1024, 256} },
8358 .block_erase = spi_block_erase_d7,
8359 }, {
8360 .eraseblocks = { {4 * 1024, 256} },
8361 .block_erase = spi_block_erase_20,
8362 }, {
8363 .eraseblocks = { {64 * 1024, 16} },
8364 .block_erase = spi_block_erase_d8,
8365 }, {
8366 .eraseblocks = { {1024 * 1024, 1} },
8367 .block_erase = spi_block_erase_60,
8368 }, {
8369 .eraseblocks = { {1024 * 1024, 1} },
8370 .block_erase = spi_block_erase_c7,
8371 }
8372 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008373 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008374 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008375 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008376 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008377 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008378 },
8379
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008380 {
8381 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008382 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008383 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008384 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008385 .model_id = PMC_PM25LV016B,
8386 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008387 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008388 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008389 .tested = TEST_UNTESTED,
8390 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008391 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008392 .block_erasers =
8393 {
8394 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008395 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00008396 .block_erase = spi_block_erase_d7,
8397 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008398 .eraseblocks = { {4 * 1024, 512} },
8399 .block_erase = spi_block_erase_20,
8400 }, {
8401 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00008402 .block_erase = spi_block_erase_d8,
8403 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008404 .eraseblocks = { {2 * 1024 * 1024, 1} },
8405 .block_erase = spi_block_erase_60,
8406 }, {
8407 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008408 .block_erase = spi_block_erase_c7,
8409 }
8410 },
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008411 .printlock = spi_prettyprint_status_register_default_bp2,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008412 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008413 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00008414 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008415 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008416 },
8417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008418 {
8419 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008420 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008421 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008422 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008423 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008424 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008425 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008426 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008427 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00008428 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00008429 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008430 .block_erasers =
8431 {
8432 {
8433 .eraseblocks = {
8434 {128 * 1024, 1},
8435 {96 * 1024, 1},
8436 {8 * 1024, 2},
8437 {16 * 1024, 1},
8438 },
Sean Nelson35727f72010-01-28 23:55:12 +00008439 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008440 }, {
8441 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008442 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008443 },
8444 },
Sean Nelson35727f72010-01-28 23:55:12 +00008445 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008446 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008447 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008448 },
8449
8450 {
8451 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00008452 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008453 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008454 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008455 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008456 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00008457 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008458 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008459 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00008460 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008461 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00008462 .block_erasers =
8463 {
8464 {
8465 .eraseblocks = {
8466 {16 * 1024, 1},
8467 {8 * 1024, 2},
8468 {96 * 1024, 1},
8469 {128 * 1024, 1},
8470 },
Sean Nelson35727f72010-01-28 23:55:12 +00008471 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008472 }, {
8473 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00008474 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00008475 },
8476 },
Sean Nelson35727f72010-01-28 23:55:12 +00008477 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008478 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008479 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00008480 },
8481
8482 {
8483 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008484 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008485 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008486 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008487 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008488 .total_size = 128,
8489 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00008490 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008491 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008492 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008493 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00008494 .block_erasers =
8495 {
8496 {
8497 .eraseblocks = { {4 * 1024, 32} },
8498 .block_erase = erase_sector_jedec,
8499 }, {
8500 .eraseblocks = { {64 * 1024, 2} },
8501 .block_erase = erase_block_jedec,
8502 }, {
8503 .eraseblocks = { {128 * 1024, 1} },
8504 .block_erase = erase_chip_block_jedec,
8505 }
8506 },
Sean Nelson35727f72010-01-28 23:55:12 +00008507 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008508 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008509 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00008510 },
8511
8512 {
8513 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008514 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008515 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008516 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008517 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008518 .total_size = 256,
8519 .page_size = 4096,
8520 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8521 .tested = TEST_UNTESTED,
8522 .probe = probe_jedec,
8523 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8524 .block_erasers =
8525 {
8526 {
8527 .eraseblocks = { {4 * 1024, 64} },
8528 .block_erase = erase_sector_jedec,
8529 }, {
8530 .eraseblocks = { {64 * 1024, 4} },
8531 .block_erase = erase_block_jedec,
8532 }, {
8533 .eraseblocks = { {256 * 1024, 1} },
8534 .block_erase = erase_chip_block_jedec,
8535 }
8536 },
8537 .write = write_jedec_1,
8538 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008539 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008540 },
8541
8542 {
8543 .vendor = "PMC",
8544 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008545 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008546 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008547 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008548 .total_size = 512,
8549 .page_size = 4096,
8550 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00008551 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008552 .probe = probe_jedec,
8553 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8554 .block_erasers =
8555 {
8556 {
8557 .eraseblocks = { {4 * 1024, 128} },
8558 .block_erase = erase_sector_jedec,
8559 }, {
8560 .eraseblocks = { {64 * 1024, 8} },
8561 .block_erase = erase_block_jedec,
8562 }, {
8563 .eraseblocks = { {512 * 1024, 1} },
8564 .block_erase = erase_chip_block_jedec,
8565 }
8566 },
8567 .write = write_jedec_1,
8568 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008569 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008570 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +00008571
8572 {
8573 .vendor = "PMC",
8574 .name = "Pm39LV512",
8575 .bustype = BUS_PARALLEL,
8576 .manufacture_id = PMC_ID_NOPREFIX,
8577 .model_id = PMC_PM39LV512,
8578 .total_size = 64,
8579 .page_size = 4096,
8580 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8581 .tested = TEST_OK_PREW,
8582 .probe = probe_jedec,
8583 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8584 .block_erasers =
8585 {
8586 {
8587 .eraseblocks = { {4 * 1024, 16} },
8588 .block_erase = erase_sector_jedec,
8589 }, {
8590 .eraseblocks = { {64 * 1024, 1} },
8591 .block_erase = erase_block_jedec,
8592 }, {
8593 .eraseblocks = { {64 * 1024, 1} },
8594 .block_erase = erase_chip_block_jedec,
8595 }
8596 },
8597 .write = write_jedec_1,
8598 .read = read_memmapped,
8599 .voltage = {2700, 3600},
8600 },
8601
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00008602 {
8603 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008604 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008605 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008606 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008607 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008608 .total_size = 256,
8609 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008610 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunerd06d9412011-06-12 19:47:55 +00008611 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008612 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008613 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008614 .block_erasers =
8615 {
8616 {
8617 .eraseblocks = { {4 * 1024, 64} },
8618 .block_erase = erase_sector_jedec,
8619 }, {
8620 .eraseblocks = { {16 * 1024, 16} },
8621 .block_erase = erase_block_jedec,
8622 }, {
8623 .eraseblocks = { {256 * 1024, 1} },
8624 .block_erase = erase_chip_block_jedec,
8625 }
8626 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008627 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008628 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008629 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008630 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008631 },
8632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008633 {
8634 .vendor = "PMC",
8635 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008636 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008637 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008638 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008639 .total_size = 512,
8640 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00008641 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +00008642 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00008643 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00008644 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00008645 .block_erasers =
8646 {
8647 {
8648 .eraseblocks = { {4 * 1024, 128} },
8649 .block_erase = erase_sector_jedec,
8650 }, {
8651 .eraseblocks = { {64 * 1024, 8} },
8652 .block_erase = erase_block_jedec,
8653 }, {
8654 .eraseblocks = { {512 * 1024, 1} },
8655 .block_erase = erase_chip_block_jedec,
8656 }
8657 },
Sean Nelson6e0b9122010-02-19 00:52:10 +00008658 .unlock = unlock_49fl00x,
Sean Nelson36172342010-02-27 18:01:15 +00008659 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008660 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008661 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008662 },
8663
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008664 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00008665 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008666 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008667 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008668 .manufacture_id = SANYO_ID,
8669 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008670 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +00008671 .page_size = 256,
8672 .tested = TEST_UNTESTED,
8673 .probe = probe_spi_rdid,
8674 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008675 .block_erasers =
8676 {
8677 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008678 .eraseblocks = { {256, 1024} },
8679 .block_erase = spi_block_erase_db,
8680 }, {
8681 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +00008682 .block_erase = spi_block_erase_d8,
8683 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008684 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00008685 .block_erase = spi_block_erase_c7,
8686 }
8687 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008688 .printlock = spi_prettyprint_status_register_default_welwip,
8689 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +00008690 .write = spi_chip_write_256,
8691 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00008692 .voltage = {2700, 3600},
8693 },
8694
8695 {
8696 .vendor = "Sanyo",
8697 .name = "LE25FW403A",
8698 .bustype = BUS_SPI,
8699 .manufacture_id = SANYO_ID,
8700 .model_id = SANYO_LE25FW403A,
8701 .total_size = 512,
8702 .page_size = 256,
8703 .tested = TEST_UNTESTED,
8704 .probe = probe_spi_rdid,
8705 .probe_timing = TIMING_ZERO,
8706 .block_erasers = {
8707 {
8708 .eraseblocks = { {256, 2 * 1024} },
8709 .block_erase = spi_block_erase_db,
8710 }, {
8711 .eraseblocks = { {64 * 1024, 8} },
8712 .block_erase = spi_block_erase_d8,
8713 }, {
8714 .eraseblocks = { {512 * 1024, 1} },
8715 .block_erase = spi_block_erase_c7,
8716 }
8717 },
8718 .printlock = spi_prettyprint_status_register_default_welwip,
8719 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8720 .write = spi_chip_write_256,
8721 .read = spi_chip_read,
8722 .voltage = {2700, 3600},
8723 },
8724
8725 {
8726 .vendor = "Sanyo",
8727 .name = "LE25FW418A",
8728 .bustype = BUS_SPI,
8729 .manufacture_id = SANYO_ID,
8730 .model_id = SANYO_LE25FW418A,
8731 .total_size = 512,
8732 .page_size = 256,
8733 .feature_bits = FEATURE_WRSR_WREN,
8734 .tested = TEST_UNTESTED,
8735 .probe = probe_spi_res2,
8736 .probe_timing = TIMING_ZERO,
8737 .block_erasers = {
8738 {
8739 .eraseblocks = { {4 * 1024, 128} },
8740 .block_erase = spi_block_erase_d7,
8741 }, {
8742 .eraseblocks = { {64 * 1024, 8} },
8743 .block_erase = spi_block_erase_d8,
8744 }, {
8745 .eraseblocks = { {512 * 1024, 1} },
8746 .block_erase = spi_block_erase_c7,
8747 }
8748 },
8749 .printlock = spi_prettyprint_status_register_default_bp2,
8750 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8751 .write = spi_chip_write_256,
8752 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
8753 .voltage = {2700, 3600},
8754 },
8755
8756 {
8757 .vendor = "Sanyo",
8758 .name = "LE25FW806",
8759 .bustype = BUS_SPI,
8760 .manufacture_id = SANYO_ID,
8761 .model_id = SANYO_LE25FW806,
8762 .total_size = 1024,
8763 .page_size = 256,
8764 .feature_bits = FEATURE_WRSR_WREN,
8765 .tested = TEST_UNTESTED,
8766 .probe = probe_spi_res2,
8767 .probe_timing = TIMING_ZERO,
8768 .block_erasers = {
8769 {
8770 .eraseblocks = { {4 * 1024, 256} },
8771 .block_erase = spi_block_erase_20,
8772 }, {
8773 .eraseblocks = { {4 * 1024, 256} },
8774 .block_erase = spi_block_erase_d7,
8775 }, {
8776 .eraseblocks = { {64 * 1024, 16} },
8777 .block_erase = spi_block_erase_d8,
8778 }, {
8779 .eraseblocks = { {1024 * 1024, 1} },
8780 .block_erase = spi_block_erase_c7,
8781 }
8782 },
8783 .printlock = spi_prettyprint_status_register_default_bp2,
8784 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8785 .write = spi_chip_write_256,
8786 .read = spi_chip_read,
8787 .voltage = {2700, 3600},
8788 },
8789
8790 {
8791 .vendor = "Sanyo",
8792 .name = "LE25FW808",
8793 .bustype = BUS_SPI,
8794 .manufacture_id = SANYO_ID,
8795 .model_id = SANYO_LE25FW808,
8796 .total_size = 1024,
8797 .page_size = 256,
8798 .feature_bits = FEATURE_WRSR_WREN,
8799 .tested = TEST_UNTESTED,
8800 .probe = probe_spi_res2,
8801 .probe_timing = TIMING_ZERO,
8802 .block_erasers = {
8803 {
8804 .eraseblocks = { {8 * 1024, 128} },
8805 .block_erase = spi_block_erase_d7,
8806 }, {
8807 .eraseblocks = { {64 * 1024, 16} },
8808 .block_erase = spi_block_erase_d8,
8809 }, {
8810 .eraseblocks = { {1024 * 1024, 1} },
8811 .block_erase = spi_block_erase_c7,
8812 }
8813 },
8814 .printlock = spi_prettyprint_status_register_default_bp2,
8815 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
8816 .write = spi_chip_write_256,
8817 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
8818 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +00008819 },
8820
8821 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008822 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +00008823 .name = "LH28F008BJT-BTLZ1",
8824 .bustype = BUS_PARALLEL,
8825 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +00008826 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +00008827 .total_size = 1024,
8828 .page_size = 64 * 1024,
8829 .tested = TEST_OK_PREW,
8830 .probe = probe_82802ab,
8831 .probe_timing = TIMING_ZERO,
8832 .block_erasers =
8833 {
8834 {
8835 .eraseblocks = {
8836 {8 * 1024, 8},
8837 {64 * 1024, 15}
8838 },
8839 .block_erase = erase_block_82802ab,
8840 }, {
8841 .eraseblocks = { {1024 * 1024, 1} },
8842 .block_erase = erase_sector_49lfxxxc,
8843 }
8844 },
8845 .unlock = unlock_lh28f008bjt,
8846 .write = write_82802ab,
8847 .read = read_memmapped,
8848 .voltage = {2700, 3600},
8849 },
8850
8851 {
8852 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008853 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008854 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008855 .manufacture_id = SHARP_ID,
8856 .model_id = SHARP_LHF00L04,
8857 .total_size = 1024,
8858 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00008859 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008860 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00008861 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008862 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008863 .block_erasers =
8864 {
8865 {
8866 .eraseblocks = {
8867 {64 * 1024, 15},
8868 {8 * 1024, 8}
8869 },
Sean Nelson28accc22010-03-19 18:47:06 +00008870 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008871 }, {
8872 .eraseblocks = {
8873 {1024 * 1024, 1}
8874 },
Sean Nelson51c83fb2010-01-20 20:55:53 +00008875 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +00008876 },
8877 },
Sean Nelson28accc22010-03-19 18:47:06 +00008878 .unlock = unlock_82802ab,
8879 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00008880 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008881 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008882 },
8883
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008884 {
8885 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +00008886 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008887 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00008888 .manufacture_id = SPANSION_ID,
8889 .model_id = SPANSION_S25FL004A,
8890 .total_size = 512,
8891 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008892 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00008893 .tested = TEST_UNTESTED,
8894 .probe = probe_spi_rdid,
8895 .probe_timing = TIMING_ZERO,
8896 .block_erasers =
8897 {
8898 {
8899 .eraseblocks = { {64 * 1024, 8} },
8900 .block_erase = spi_block_erase_d8,
8901 }, {
8902 .eraseblocks = { {512 * 1024, 1} },
8903 .block_erase = spi_block_erase_c7,
8904 }
8905 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008906 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00008907 .unlock = spi_disable_blockprotect,
8908 .write = spi_chip_write_256,
8909 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008910 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00008911 },
8912
8913 {
8914 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +00008915 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008916 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +00008917 .manufacture_id = SPANSION_ID,
8918 .model_id = SPANSION_S25FL008A,
8919 .total_size = 1024,
8920 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008921 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00008922 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +00008923 .probe = probe_spi_rdid,
8924 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +00008925 .block_erasers =
8926 {
8927 {
8928 .eraseblocks = { {64 * 1024, 16} },
8929 .block_erase = spi_block_erase_d8,
8930 }, {
8931 .eraseblocks = { {1024 * 1024, 1} },
8932 .block_erase = spi_block_erase_c7,
8933 }
8934 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008935 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008936 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +00008937 .write = spi_chip_write_256,
8938 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008939 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +00008940 },
8941
8942 {
8943 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008944 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008945 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008946 .manufacture_id = SPANSION_ID,
8947 .model_id = SPANSION_S25FL016A,
8948 .total_size = 2048,
8949 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008950 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00008951 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008952 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008953 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00008954 .block_erasers =
8955 {
8956 {
8957 .eraseblocks = { {64 * 1024, 32} },
8958 .block_erase = spi_block_erase_d8,
8959 }, {
8960 .eraseblocks = { {2 * 1024 * 1024, 1} },
8961 .block_erase = spi_block_erase_c7,
8962 }
8963 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008964 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008965 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008966 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008967 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008968 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008969 },
8970
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008971 {
Rudy Hostf4e57772010-11-29 00:37:49 +00008972 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00008973 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008974 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00008975 .manufacture_id = SPANSION_ID,
8976 .model_id = SPANSION_S25FL032A,
8977 .total_size = 4096,
8978 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00008979 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00008980 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +00008981 .probe = probe_spi_rdid,
8982 .probe_timing = TIMING_ZERO,
8983 .block_erasers =
8984 {
8985 {
8986 .eraseblocks = { {64 * 1024, 64} },
8987 .block_erase = spi_block_erase_d8,
8988 }, {
8989 .eraseblocks = { {4 * 1024 * 1024, 1} },
8990 .block_erase = spi_block_erase_c7,
8991 }
8992 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00008993 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00008994 .unlock = spi_disable_blockprotect,
8995 .write = spi_chip_write_256,
8996 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00008997 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00008998 },
8999
9000 {
9001 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009002 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009003 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +00009004 .manufacture_id = SPANSION_ID,
9005 .model_id = SPANSION_S25FL064A,
9006 .total_size = 8192,
9007 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009008 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +00009009 .tested = TEST_OK_PREW,
9010 .probe = probe_spi_rdid,
9011 .probe_timing = TIMING_ZERO,
9012 .block_erasers =
9013 {
9014 {
9015 .eraseblocks = { {64 * 1024, 128} },
9016 .block_erase = spi_block_erase_d8,
9017 }, {
9018 .eraseblocks = { {8 * 1024 * 1024, 1} },
9019 .block_erase = spi_block_erase_c7,
9020 }
9021 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009022 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +00009023 .unlock = spi_disable_blockprotect,
9024 .write = spi_chip_write_256,
9025 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009026 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +00009027 },
9028
9029 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +00009030 .vendor = "Spansion",
9031 .name = "S25FL204K",
9032 .bustype = BUS_SPI,
9033 .manufacture_id = SPANSION_ID,
9034 .model_id = SPANSION_S25FL204,
9035 .total_size = 512,
9036 .page_size = 256,
9037 .feature_bits = FEATURE_WRSR_WREN,
9038 .tested = TEST_UNTESTED,
9039 .probe = probe_spi_rdid,
9040 .probe_timing = TIMING_ZERO,
9041 .block_erasers = {
9042 {
9043 .eraseblocks = { {4 * 1024, 128} },
9044 .block_erase = spi_block_erase_20,
9045 }, {
9046 .eraseblocks = { {64 * 1024, 8} },
9047 .block_erase = spi_block_erase_d8,
9048 }, {
9049 .eraseblocks = { { 512 * 1024, 1} },
9050 .block_erase = spi_block_erase_60,
9051 }, {
9052 .eraseblocks = { { 512 * 1024, 1} },
9053 .block_erase = spi_block_erase_c7,
9054 }
9055 },
9056 .printlock = spi_prettyprint_status_register_default_bp3,
9057 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9058 .write = spi_chip_write_256,
9059 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9060 .voltage = {2700, 3600},
9061 },
9062
9063 {
9064 .vendor = "Spansion",
9065 .name = "S25FL208K",
9066 .bustype = BUS_SPI,
9067 .manufacture_id = SPANSION_ID,
9068 .model_id = SPANSION_S25FL208,
9069 .total_size = 1024,
9070 .page_size = 256,
9071 .feature_bits = FEATURE_WRSR_WREN,
9072 .tested = TEST_UNTESTED,
9073 .probe = probe_spi_rdid,
9074 .probe_timing = TIMING_ZERO,
9075 .block_erasers = {
9076 {
9077 .eraseblocks = { {4 * 1024, 256} },
9078 .block_erase = spi_block_erase_20,
9079 }, {
9080 .eraseblocks = { {64 * 1024, 16} },
9081 .block_erase = spi_block_erase_d8,
9082 }, {
9083 .eraseblocks = { { 1024 * 1024, 1} },
9084 .block_erase = spi_block_erase_60,
9085 }, {
9086 .eraseblocks = { { 1024 * 1024, 1} },
9087 .block_erase = spi_block_erase_c7,
9088 }
9089 },
9090 .printlock = spi_prettyprint_status_register_default_bp3,
9091 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9092 .write = spi_chip_write_256,
9093 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9094 .voltage = {2700, 3600},
9095 },
9096
9097 {
9098 .vendor = "Spansion",
9099 .name = "S25FL116K/S25FL216K",
9100 .bustype = BUS_SPI,
9101 .manufacture_id = SPANSION_ID,
9102 .model_id = SPANSION_S25FL216,
9103 .total_size = 2048,
9104 .page_size = 256,
9105 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
9106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9107 .tested = TEST_UNTESTED,
9108 .probe = probe_spi_rdid,
9109 .probe_timing = TIMING_ZERO,
9110 .block_erasers = {
9111 {
9112 .eraseblocks = { {4 * 1024, 512} },
9113 .block_erase = spi_block_erase_20,
9114 }, {
9115 .eraseblocks = { {64 * 1024, 32} },
9116 .block_erase = spi_block_erase_d8,
9117 }, {
9118 .eraseblocks = { { 2048 * 1024, 1} },
9119 .block_erase = spi_block_erase_60,
9120 }, {
9121 .eraseblocks = { { 2048 * 1024, 1} },
9122 .block_erase = spi_block_erase_c7,
9123 }
9124 },
9125 .printlock = spi_prettyprint_status_register_default_bp3,
9126 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
9127 .write = spi_chip_write_256,
9128 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
9129 .voltage = {2700, 3600},
9130 },
9131
9132 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00009133 .vendor = "Spansion",
9134 .name = "S25FL128S......0", /* uniform 256kB sectors */
9135 .bustype = BUS_SPI,
9136 .manufacture_id = SPANSION_ID,
9137 .model_id = SPANSION_S25FL128,
9138 .total_size = 16384,
9139 .page_size = 256,
9140 /* supports 4B addressing */
9141 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
9142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9143 .tested = TEST_UNTESTED,
9144 .probe = probe_spi_rdid,
9145 .probe_timing = TIMING_ZERO,
9146 .block_erasers = {
9147 {
9148 .eraseblocks = { {4 * 1024, 4096} },
9149 .block_erase = spi_block_erase_20,
9150 }, {
9151 .eraseblocks = { {256 * 1024, 64} },
9152 .block_erase = spi_block_erase_d8,
9153 }, {
9154 .eraseblocks = { { 16384 * 1024, 1} },
9155 .block_erase = spi_block_erase_60,
9156 }, {
9157 .eraseblocks = { { 16384 * 1024, 1} },
9158 .block_erase = spi_block_erase_c7,
9159 }
9160 },
9161 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
9162 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
9163 .write = spi_chip_write_256, /* Multi I/O supported */
9164 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9165 .voltage = {2700, 3600},
9166 },
9167
9168 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009169 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +00009170 .name = "SST25LF040A",
9171 .bustype = BUS_SPI,
9172 .manufacture_id = SST_ID,
9173 .model_id = SST_SST25VF040_REMS,
9174 .total_size = 512,
9175 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009176 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +00009177 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +00009178 .probe = probe_spi_res2,
9179 .probe_timing = TIMING_ZERO,
9180 .block_erasers =
9181 {
9182 {
9183 .eraseblocks = { {4 * 1024, 128} },
9184 .block_erase = spi_block_erase_20,
9185 }, {
9186 .eraseblocks = { {32 * 1024, 16} },
9187 .block_erase = spi_block_erase_52,
9188 }, {
9189 .eraseblocks = { {512 * 1024, 1} },
9190 .block_erase = spi_block_erase_60,
9191 },
9192 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009193 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009194 .unlock = spi_disable_blockprotect,
9195 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9196 .read = spi_chip_read,
9197 .voltage = {3000, 3600},
9198 },
9199
9200 {
9201 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +00009202 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +00009203 .bustype = BUS_SPI,
9204 .manufacture_id = SST_ID,
9205 .model_id = SST_SST25VF080_REMS,
9206 .total_size = 1024,
9207 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009208 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +00009209 .tested = TEST_UNTESTED,
9210 .probe = probe_spi_res2,
9211 .probe_timing = TIMING_ZERO,
9212 .block_erasers =
9213 {
9214 {
9215 .eraseblocks = { {4 * 1024, 256} },
9216 .block_erase = spi_block_erase_20,
9217 }, {
9218 .eraseblocks = { {32 * 1024, 32} },
9219 .block_erase = spi_block_erase_52,
9220 }, {
9221 .eraseblocks = { {1024 * 1024, 1} },
9222 .block_erase = spi_block_erase_60,
9223 },
9224 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009225 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +00009226 .unlock = spi_disable_blockprotect,
9227 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
9228 .read = spi_chip_read,
9229 .voltage = {3000, 3600},
9230 },
9231
9232 {
9233 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009234 .name = "SST25VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009235 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +00009236 .manufacture_id = SST_ID,
9237 .model_id = SST_SST25VF010_REMS,
9238 .total_size = 128,
9239 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009240 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +00009241 .tested = TEST_OK_PREW,
9242 .probe = probe_spi_rems,
9243 .probe_timing = TIMING_ZERO,
9244 .block_erasers =
9245 {
9246 {
9247 .eraseblocks = { {4 * 1024, 32} },
9248 .block_erase = spi_block_erase_20,
9249 }, {
9250 .eraseblocks = { {32 * 1024, 4} },
9251 .block_erase = spi_block_erase_52,
9252 }, {
9253 .eraseblocks = { {128 * 1024, 1} },
9254 .block_erase = spi_block_erase_60,
9255 },
9256 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009257 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +00009258 .unlock = spi_disable_blockprotect,
9259 .write = spi_chip_write_1,
9260 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009261 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +00009262 },
9263
9264 {
9265 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009266 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009267 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009268 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009269 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009270 .total_size = 2048,
9271 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +00009272 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +00009273 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009274 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009275 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009276 .block_erasers =
9277 {
9278 {
9279 .eraseblocks = { {4 * 1024, 512} },
9280 .block_erase = spi_block_erase_20,
9281 }, {
9282 .eraseblocks = { {32 * 1024, 64} },
9283 .block_erase = spi_block_erase_52,
9284 }, {
9285 .eraseblocks = { {64 * 1024, 32} },
9286 .block_erase = spi_block_erase_d8,
9287 }, {
9288 .eraseblocks = { {2 * 1024 * 1024, 1} },
9289 .block_erase = spi_block_erase_60,
9290 }, {
9291 .eraseblocks = { {2 * 1024 * 1024, 1} },
9292 .block_erase = spi_block_erase_c7,
9293 },
9294 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009295 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009296 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009297 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009298 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009299 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009300 },
9301
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009302 {
9303 .vendor = "SST",
9304 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009305 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009306 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009307 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009308 .total_size = 4096,
9309 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009310 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +00009311 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009312 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009313 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009314 .block_erasers =
9315 {
9316 {
9317 .eraseblocks = { {4 * 1024, 1024} },
9318 .block_erase = spi_block_erase_20,
9319 }, {
9320 .eraseblocks = { {32 * 1024, 128} },
9321 .block_erase = spi_block_erase_52,
9322 }, {
9323 .eraseblocks = { {64 * 1024, 64} },
9324 .block_erase = spi_block_erase_d8,
9325 }, {
9326 .eraseblocks = { {4 * 1024 * 1024, 1} },
9327 .block_erase = spi_block_erase_60,
9328 }, {
9329 .eraseblocks = { {4 * 1024 * 1024, 1} },
9330 .block_erase = spi_block_erase_c7,
9331 },
9332 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009333 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009334 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009335 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009336 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009337 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009338 },
9339
9340 {
9341 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009342 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009343 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009344 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009345 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009346 .total_size = 8192,
9347 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009348 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +00009349 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009350 .probe = probe_spi_rdid,
9351 .probe_timing = TIMING_ZERO,
9352 .block_erasers =
9353 {
9354 {
9355 .eraseblocks = { {4 * 1024, 2048} },
9356 .block_erase = spi_block_erase_20,
9357 }, {
9358 .eraseblocks = { {32 * 1024, 256} },
9359 .block_erase = spi_block_erase_52,
9360 }, {
9361 .eraseblocks = { {64 * 1024, 128} },
9362 .block_erase = spi_block_erase_d8,
9363 }, {
9364 .eraseblocks = { {8 * 1024 * 1024, 1} },
9365 .block_erase = spi_block_erase_60,
9366 }, {
9367 .eraseblocks = { {8 * 1024 * 1024, 1} },
9368 .block_erase = spi_block_erase_c7,
9369 },
9370 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009371 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009372 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +00009373 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009374 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009375 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +00009376 },
9377
9378 {
9379 .vendor = "SST",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009380 .name = "SST25VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009381 .bustype = BUS_SPI,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009382 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009383 .model_id = SST_SST25VF040_REMS,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009384 .total_size = 512,
9385 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009386 .feature_bits = FEATURE_WRSR_EWSR,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009387 .tested = TEST_OK_PR,
9388 .probe = probe_spi_rems,
9389 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009390 .block_erasers =
9391 {
9392 {
9393 .eraseblocks = { {4 * 1024, 128} },
9394 .block_erase = spi_block_erase_20,
9395 }, {
9396 .eraseblocks = { {32 * 1024, 16} },
9397 .block_erase = spi_block_erase_52,
9398 }, {
9399 .eraseblocks = { {512 * 1024, 1} },
9400 .block_erase = spi_block_erase_60,
9401 },
9402 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009403 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009404 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009405 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009406 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009407 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009408 },
9409
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009410 {
9411 .vendor = "SST",
9412 .name = "SST25VF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009413 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009414 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009415 .model_id = SST_SST25VF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009416 .total_size = 512,
9417 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009418 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009419 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009420 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009421 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009422 .block_erasers =
9423 {
9424 {
9425 .eraseblocks = { {4 * 1024, 128} },
9426 .block_erase = spi_block_erase_20,
9427 }, {
9428 .eraseblocks = { {32 * 1024, 16} },
9429 .block_erase = spi_block_erase_52,
9430 }, {
9431 .eraseblocks = { {64 * 1024, 8} },
9432 .block_erase = spi_block_erase_d8,
9433 }, {
9434 .eraseblocks = { {512 * 1024, 1} },
9435 .block_erase = spi_block_erase_60,
9436 }, {
9437 .eraseblocks = { {512 * 1024, 1} },
9438 .block_erase = spi_block_erase_c7,
9439 },
9440 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009441 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009442 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009443 .write = spi_aai_write,
Zheng Bao0677dff2009-02-25 08:07:33 +00009444 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009445 .voltage = {2700, 3600},
Zheng Bao0677dff2009-02-25 08:07:33 +00009446 },
9447
9448 {
9449 .vendor = "SST",
Peter Stugefd9217d2009-01-26 03:37:40 +00009450 .name = "SST25VF040B.REMS",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009451 .bustype = BUS_SPI,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00009452 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009453 .model_id = SST_SST25VF040B_REMS,
Peter Stugefd9217d2009-01-26 03:37:40 +00009454 .total_size = 512,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009455 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009456 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009457 .tested = TEST_OK_PREW,
Peter Stugefd9217d2009-01-26 03:37:40 +00009458 .probe = probe_spi_rems,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009459 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009460 .block_erasers =
9461 {
9462 {
9463 .eraseblocks = { {4 * 1024, 128} },
9464 .block_erase = spi_block_erase_20,
9465 }, {
9466 .eraseblocks = { {32 * 1024, 16} },
9467 .block_erase = spi_block_erase_52,
9468 }, {
9469 .eraseblocks = { {64 * 1024, 8} },
9470 .block_erase = spi_block_erase_d8,
9471 }, {
9472 .eraseblocks = { {512 * 1024, 1} },
9473 .block_erase = spi_block_erase_60,
9474 }, {
9475 .eraseblocks = { {512 * 1024, 1} },
9476 .block_erase = spi_block_erase_c7,
9477 },
9478 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009479 .printlock = spi_prettyprint_status_register_sst25vf040b,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009480 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009481 .write = spi_aai_write,
Peter Stugefd9217d2009-01-26 03:37:40 +00009482 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009483 .voltage = {2700, 3600},
Peter Stugefd9217d2009-01-26 03:37:40 +00009484 },
9485
9486 {
9487 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009488 .name = "SST25VF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009489 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009490 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009491 .model_id = SST_SST25VF080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009492 .total_size = 1024,
9493 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009494 .feature_bits = FEATURE_WRSR_EWSR,
John Schmergec965c2d2011-05-18 11:28:47 +00009495 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009496 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009497 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +00009498 .block_erasers =
9499 {
9500 {
9501 .eraseblocks = { {4 * 1024, 256} },
9502 .block_erase = spi_block_erase_20,
9503 }, {
9504 .eraseblocks = { {32 * 1024, 32} },
9505 .block_erase = spi_block_erase_52,
9506 }, {
9507 .eraseblocks = { {64 * 1024, 16} },
9508 .block_erase = spi_block_erase_d8,
9509 }, {
9510 .eraseblocks = { {1024 * 1024, 1} },
9511 .block_erase = spi_block_erase_60,
9512 }, {
9513 .eraseblocks = { {1024 * 1024, 1} },
9514 .block_erase = spi_block_erase_c7,
9515 },
9516 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00009517 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009518 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +00009519 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009520 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009521 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009522 },
9523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009524 {
9525 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +00009526 .name = "SST25WF512",
9527 .bustype = BUS_SPI,
9528 .manufacture_id = SST_ID,
9529 .model_id = SST_SST25WF512,
9530 .total_size = 64,
9531 .page_size = 256,
9532 .feature_bits = FEATURE_WRSR_EITHER,
9533 .tested = TEST_UNTESTED,
9534 .probe = probe_spi_rdid,
9535 .probe_timing = TIMING_ZERO,
9536 .block_erasers =
9537 {
9538 {
9539 .eraseblocks = { {4 * 1024, 16} },
9540 .block_erase = spi_block_erase_20,
9541 }, {
9542 .eraseblocks = { {32 * 1024, 2} },
9543 .block_erase = spi_block_erase_52,
9544 }, {
9545 .eraseblocks = { {1024 * 64, 1} },
9546 .block_erase = spi_block_erase_60,
9547 }, {
9548 .eraseblocks = { {1024 * 64, 1} },
9549 .block_erase = spi_block_erase_c7,
9550 },
9551 },
9552 .unlock = spi_disable_blockprotect,
9553 .write = spi_aai_write,
9554 .read = spi_chip_read, /* Fast read (0x0B) supported */
9555 .voltage = {1650, 1950},
9556 },
9557
9558 {
9559 .vendor = "SST",
9560 .name = "SST25WF010",
9561 .bustype = BUS_SPI,
9562 .manufacture_id = SST_ID,
9563 .model_id = SST_SST25WF010,
9564 .total_size = 128,
9565 .page_size = 256,
9566 .feature_bits = FEATURE_WRSR_EITHER,
9567 .tested = TEST_UNTESTED,
9568 .probe = probe_spi_rdid,
9569 .probe_timing = TIMING_ZERO,
9570 .block_erasers =
9571 {
9572 {
9573 .eraseblocks = { {4 * 1024, 32} },
9574 .block_erase = spi_block_erase_20,
9575 }, {
9576 .eraseblocks = { {32 * 1024, 4} },
9577 .block_erase = spi_block_erase_52,
9578 }, {
9579 .eraseblocks = { {1024 * 128, 1} },
9580 .block_erase = spi_block_erase_60,
9581 }, {
9582 .eraseblocks = { {1024 * 128, 1} },
9583 .block_erase = spi_block_erase_c7,
9584 },
9585 },
9586 .unlock = spi_disable_blockprotect,
9587 .write = spi_aai_write,
9588 .read = spi_chip_read, /* Fast read (0x0B) supported */
9589 .voltage = {1650, 1950},
9590 },
9591
9592 {
9593 .vendor = "SST",
9594 .name = "SST25WF020",
9595 .bustype = BUS_SPI,
9596 .manufacture_id = SST_ID,
9597 .model_id = SST_SST25WF020,
9598 .total_size = 256,
9599 .page_size = 256,
9600 .feature_bits = FEATURE_WRSR_EITHER,
9601 .tested = TEST_UNTESTED,
9602 .probe = probe_spi_rdid,
9603 .probe_timing = TIMING_ZERO,
9604 .block_erasers =
9605 {
9606 {
9607 .eraseblocks = { {4 * 1024, 64} },
9608 .block_erase = spi_block_erase_20,
9609 }, {
9610 .eraseblocks = { {32 * 1024, 8} },
9611 .block_erase = spi_block_erase_52,
9612 }, {
9613 .eraseblocks = { {64 * 1024, 4} },
9614 .block_erase = spi_block_erase_d8,
9615 }, {
9616 .eraseblocks = { {1024 * 256, 1} },
9617 .block_erase = spi_block_erase_60,
9618 }, {
9619 .eraseblocks = { {1024 * 256, 1} },
9620 .block_erase = spi_block_erase_c7,
9621 },
9622 },
9623 .unlock = spi_disable_blockprotect,
9624 .write = spi_aai_write,
9625 .read = spi_chip_read, /* Fast read (0x0B) supported */
9626 .voltage = {1650, 1950},
9627 },
9628
9629 {
9630 .vendor = "SST",
9631 .name = "SST25WF040",
9632 .bustype = BUS_SPI,
9633 .manufacture_id = SST_ID,
9634 .model_id = SST_SST25WF040,
9635 .total_size = 512,
9636 .page_size = 256,
9637 .feature_bits = FEATURE_WRSR_EITHER,
9638 .tested = TEST_UNTESTED,
9639 .probe = probe_spi_rdid,
9640 .probe_timing = TIMING_ZERO,
9641 .block_erasers =
9642 {
9643 {
9644 .eraseblocks = { {4 * 1024, 128} },
9645 .block_erase = spi_block_erase_20,
9646 }, {
9647 .eraseblocks = { {32 * 1024, 16} },
9648 .block_erase = spi_block_erase_52,
9649 }, {
9650 .eraseblocks = { {64 * 1024, 8} },
9651 .block_erase = spi_block_erase_d8,
9652 }, {
9653 .eraseblocks = { {1024 * 512, 1} },
9654 .block_erase = spi_block_erase_60,
9655 }, {
9656 .eraseblocks = { {1024 * 512, 1} },
9657 .block_erase = spi_block_erase_c7,
9658 },
9659 },
9660 .unlock = spi_disable_blockprotect,
9661 .write = spi_aai_write,
9662 .read = spi_chip_read, /* Fast read (0x0B) supported */
9663 .voltage = {1650, 1950},
9664 },
9665
9666 {
9667 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009668 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009669 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009670 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009671 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009672 .total_size = 512,
9673 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00009674 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009675 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00009676 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +00009677 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009678 .block_erasers =
9679 {
9680 {
9681 .eraseblocks = { {128, 4096} },
9682 .block_erase = erase_sector_28sf040,
9683 }, {
9684 .eraseblocks = { {512 * 1024, 1} },
9685 .block_erase = erase_chip_28sf040,
9686 }
9687 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00009688 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009689 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009690 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009691 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009692 },
9693
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009694 {
9695 .vendor = "SST",
9696 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009697 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009698 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009699 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009700 .total_size = 128,
9701 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009702 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009703 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009704 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009705 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009706 .block_erasers =
9707 {
9708 {
9709 .eraseblocks = { {128 * 1024, 1} },
9710 .block_erase = erase_chip_block_jedec,
9711 }
9712 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009713 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009714 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009715 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009716 },
9717
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009718 {
9719 .vendor = "SST",
9720 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009721 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009722 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009723 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009724 .total_size = 128,
9725 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009726 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009727 .tested = TEST_UNTESTED,
9728 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009729 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009730 .block_erasers =
9731 {
9732 {
9733 .eraseblocks = { {128 * 1024, 1} },
9734 .block_erase = erase_chip_block_jedec,
9735 }
9736 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009737 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009738 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009739 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009740 },
9741
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009742 {
9743 .vendor = "SST",
9744 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009745 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009746 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009747 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009748 .total_size = 256,
9749 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009750 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009751 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009752 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009753 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009754 .block_erasers =
9755 {
9756 {
9757 .eraseblocks = { {256 * 1024, 1} },
9758 .block_erase = erase_chip_block_jedec,
9759 }
9760 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009761 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009762 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009763 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009764 },
9765
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009766 {
9767 .vendor = "SST",
9768 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009769 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009770 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009771 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009772 .total_size = 256,
9773 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00009774 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00009775 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009776 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009777 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +00009778 .block_erasers =
9779 {
9780 {
9781 .eraseblocks = { {256 * 1024, 1} },
9782 .block_erase = erase_chip_block_jedec,
9783 }
9784 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009785 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009786 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009787 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009788 },
9789
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009790 {
9791 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +00009792 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009793 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009794 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009795 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009796 .total_size = 64,
9797 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009798 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +00009799 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009800 .probe = probe_jedec,
9801 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +00009802 .block_erasers =
9803 {
9804 {
9805 .eraseblocks = { {4 * 1024, 16} },
9806 .block_erase = erase_sector_jedec,
9807 }, {
9808 .eraseblocks = { {64 * 1024, 1} },
9809 .block_erase = erase_chip_block_jedec,
9810 }
9811 },
Sean Nelson35727f72010-01-28 23:55:12 +00009812 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +00009813 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009814 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +00009815 },
9816
9817 {
9818 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009819 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009820 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009821 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009822 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009823 .total_size = 128,
9824 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009825 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +00009826 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009827 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +00009828 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009829 .block_erasers =
9830 {
9831 {
9832 .eraseblocks = { {4 * 1024, 32} },
9833 .block_erase = erase_sector_jedec,
9834 }, {
9835 .eraseblocks = { {128 * 1024, 1} },
9836 .block_erase = erase_chip_block_jedec,
9837 }
9838 },
Sean Nelson35727f72010-01-28 23:55:12 +00009839 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009840 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009841 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009842 },
9843
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009844 {
9845 .vendor = "SST",
9846 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009847 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009848 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009849 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009850 .total_size = 256,
9851 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009852 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +00009853 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009854 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009855 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009856 .block_erasers =
9857 {
9858 {
9859 .eraseblocks = { {4 * 1024, 64} },
9860 .block_erase = erase_sector_jedec,
9861 }, {
9862 .eraseblocks = { {256 * 1024, 1} },
9863 .block_erase = erase_chip_block_jedec,
9864 }
9865 },
Sean Nelson35727f72010-01-28 23:55:12 +00009866 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009867 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009868 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009869 },
9870
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009871 {
9872 .vendor = "SST",
9873 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009874 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009875 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009876 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009877 .total_size = 512,
9878 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009879 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009880 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009881 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009882 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009883 .block_erasers =
9884 {
9885 {
9886 .eraseblocks = { {4 * 1024, 128} },
9887 .block_erase = erase_sector_jedec,
9888 }, {
9889 .eraseblocks = { {512 * 1024, 1} },
9890 .block_erase = erase_chip_block_jedec,
9891 }
9892 },
Sean Nelson35727f72010-01-28 23:55:12 +00009893 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009894 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009895 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009896 },
9897
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009898 {
9899 .vendor = "SST",
9900 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009901 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009902 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009903 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009904 .total_size = 64,
9905 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009906 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00009907 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009908 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009909 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009910 .block_erasers =
9911 {
9912 {
9913 .eraseblocks = { {4 * 1024, 16} },
9914 .block_erase = erase_sector_jedec,
9915 }, {
9916 .eraseblocks = { {64 * 1024, 1} },
9917 .block_erase = erase_chip_block_jedec,
9918 }
9919 },
Sean Nelson35727f72010-01-28 23:55:12 +00009920 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009921 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009922 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009923 },
9924
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009925 {
9926 .vendor = "SST",
9927 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009928 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009929 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009930 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009931 .total_size = 128,
9932 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009933 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00009934 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009935 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009936 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009937 .block_erasers =
9938 {
9939 {
9940 .eraseblocks = { {4 * 1024, 32} },
9941 .block_erase = erase_sector_jedec,
9942 }, {
9943 .eraseblocks = { {128 * 1024, 1} },
9944 .block_erase = erase_chip_block_jedec,
9945 }
9946 },
Sean Nelson35727f72010-01-28 23:55:12 +00009947 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009948 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009949 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009950 },
9951
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009952 {
9953 .vendor = "SST",
9954 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009955 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009956 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009957 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009958 .total_size = 256,
9959 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009960 .feature_bits = FEATURE_EITHER_RESET,
9961 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009962 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009963 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009964 .block_erasers =
9965 {
9966 {
9967 .eraseblocks = { {4 * 1024, 64} },
9968 .block_erase = erase_sector_jedec,
9969 }, {
9970 .eraseblocks = { {256 * 1024, 1} },
9971 .block_erase = erase_chip_block_jedec,
9972 }
9973 },
Sean Nelson35727f72010-01-28 23:55:12 +00009974 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009975 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009976 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009977 },
9978
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009979 {
9980 .vendor = "SST",
9981 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009982 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009983 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009984 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009985 .total_size = 512,
9986 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009987 .feature_bits = FEATURE_EITHER_RESET,
9988 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009989 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00009990 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +00009991 .block_erasers =
9992 {
9993 {
9994 .eraseblocks = { {4 * 1024, 128} },
9995 .block_erase = erase_sector_jedec,
9996 }, {
9997 .eraseblocks = { {512 * 1024, 1} },
9998 .block_erase = erase_chip_block_jedec,
9999 }
10000 },
Sean Nelson35727f72010-01-28 23:55:12 +000010001 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010002 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010003 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000010004 },
FENG yu ningff692fb2008-12-08 18:15:10 +000010005
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010006 {
10007 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000010008 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010009 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000010010 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010011 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000010012 .total_size = 1024,
10013 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010014 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000010015 .tested = TEST_UNTESTED,
10016 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010017 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010018 .block_erasers =
10019 {
10020 {
10021 .eraseblocks = { {4 * 1024, 256} },
10022 .block_erase = erase_sector_jedec,
10023 }, {
10024 .eraseblocks = { {64 * 1024, 16} },
10025 .block_erase = erase_block_jedec,
10026 }, {
10027 .eraseblocks = { {1024 * 1024, 1} },
10028 .block_erase = erase_chip_block_jedec,
10029 }
10030 },
Sean Nelson35727f72010-01-28 23:55:12 +000010031 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010032 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010033 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000010034 },
10035
10036 {
10037 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010038 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010039 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010040 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010041 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010042 .total_size = 256,
10043 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010044 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010045 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010046 .probe = probe_jedec,
10047 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010048 .block_erasers =
10049 {
10050 {
10051 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010052 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010053 }, {
10054 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010055 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010056 }, {
10057 .eraseblocks = { {256 * 1024, 1} },
10058 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10059 }
10060 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010061 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010062 .unlock = unlock_sst_fwhub,
10063 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010064 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010065 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010066 },
10067
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010068 {
10069 .vendor = "SST",
10070 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010071 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010072 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010073 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010074 .total_size = 384,
10075 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010076 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000010077 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010078 .probe = probe_jedec,
10079 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010080 .block_erasers =
10081 {
10082 {
10083 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010084 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010085 }, {
10086 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010087 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010088 }, {
10089 .eraseblocks = { {384 * 1024, 1} },
10090 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10091 }
10092 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010093 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010094 .unlock = unlock_sst_fwhub,
10095 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010096 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010097 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010098 },
10099
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010100 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010101 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
10102 * and is only honored for 64k block erase, but not 4k sector erase.
10103 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010104 .vendor = "SST",
10105 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010106 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010107 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010108 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010109 .total_size = 512,
10110 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010111 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000010112 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010113 .probe = probe_jedec,
10114 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010115 .block_erasers =
10116 {
10117 {
10118 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010119 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010120 }, {
10121 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010122 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010123 }, {
10124 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000010125 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000010126 },
10127 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010128 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010129 .unlock = unlock_sst_fwhub,
10130 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010131 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010132 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010133 },
10134
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010135 {
10136 .vendor = "SST",
10137 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010138 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010139 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010140 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010141 .total_size = 512,
10142 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010143 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010144 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010145 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010146 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010147 .block_erasers =
10148 {
10149 {
10150 .eraseblocks = { {4 * 1024, 128} },
10151 .block_erase = erase_sector_49lfxxxc,
10152 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010153 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010154 {64 * 1024, 7},
10155 {32 * 1024, 1},
10156 {8 * 1024, 2},
10157 {16 * 1024, 1},
10158 },
Sean Nelson69e58112010-03-23 17:10:28 +000010159 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010160 }
10161 },
Sean Nelson69e58112010-03-23 17:10:28 +000010162 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010163 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010164 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010165 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010166 },
10167
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010168 {
10169 .vendor = "SST",
10170 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010171 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010172 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010173 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010174 .total_size = 1024,
10175 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010176 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010177 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010178 .probe = probe_jedec,
10179 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010180 .block_erasers =
10181 {
10182 {
10183 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010184 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010185 }, {
10186 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010187 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010188 }, {
10189 .eraseblocks = { {1024 * 1024, 1} },
10190 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
10191 }
10192 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010193 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000010194 .unlock = unlock_sst_fwhub,
10195 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010196 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010197 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010198 },
10199
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010200 {
10201 .vendor = "SST",
10202 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010203 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010204 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010205 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010206 .total_size = 1024,
10207 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010208 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010209 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010210 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010211 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010212 .block_erasers =
10213 {
10214 {
10215 .eraseblocks = { {4 * 1024, 256} },
10216 .block_erase = erase_sector_49lfxxxc,
10217 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010218 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010219 {64 * 1024, 15},
10220 {32 * 1024, 1},
10221 {8 * 1024, 2},
10222 {16 * 1024, 1},
10223 },
Sean Nelson69e58112010-03-23 17:10:28 +000010224 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010225 }
10226 },
Sean Nelson69e58112010-03-23 17:10:28 +000010227 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010228 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010229 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010230 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010231 },
10232
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010233 {
10234 .vendor = "SST",
10235 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010236 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010237 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010238 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010239 .total_size = 2048,
10240 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010241 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner2abab942012-04-27 20:41:23 +000010242 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010243 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010244 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010245 .block_erasers =
10246 {
10247 {
10248 .eraseblocks = { {4 * 1024, 512} },
10249 .block_erase = erase_sector_49lfxxxc,
10250 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010251 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010252 {64 * 1024, 31},
10253 {32 * 1024, 1},
10254 {8 * 1024, 2},
10255 {16 * 1024, 1},
10256 },
Sean Nelson69e58112010-03-23 17:10:28 +000010257 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010258 }
10259 },
Sean Nelson69e58112010-03-23 17:10:28 +000010260 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010261 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010262 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010263 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010264 },
10265
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010266 {
10267 .vendor = "SST",
10268 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010269 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010270 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010271 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010272 .total_size = 256,
10273 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010274 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000010275 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010276 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010277 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010278 .block_erasers =
10279 {
10280 {
10281 .eraseblocks = { {4 * 1024, 64} },
10282 .block_erase = erase_sector_jedec,
10283 }, {
10284 .eraseblocks = { {16 * 1024, 16} },
10285 .block_erase = erase_block_jedec,
10286 }, {
10287 .eraseblocks = { {256 * 1024, 1} },
10288 .block_erase = NULL,
10289 }
10290 },
Sean Nelson35727f72010-01-28 23:55:12 +000010291 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010292 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010293 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000010294 },
10295
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010296 {
10297 .vendor = "SST",
10298 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010299 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010300 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010301 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010302 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000010303 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010304 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010305 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010306 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010307 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010308 .block_erasers =
10309 {
10310 {
10311 .eraseblocks = { {4 * 1024, 64} },
10312 .block_erase = erase_sector_jedec,
10313 }, {
10314 .eraseblocks = { {16 * 1024, 16} },
10315 .block_erase = erase_block_jedec,
10316 }, {
10317 .eraseblocks = { {256 * 1024, 1} },
10318 .block_erase = NULL,
10319 }
10320 },
Sean Nelson35727f72010-01-28 23:55:12 +000010321 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010322 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010323 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010324 },
10325
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010326 {
10327 .vendor = "SST",
10328 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010329 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010330 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010331 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010332 .total_size = 512,
10333 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010334 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010335 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010336 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000010337 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010338 .block_erasers =
10339 {
10340 {
10341 .eraseblocks = { {4 * 1024, 128} },
10342 .block_erase = erase_sector_jedec,
10343 }, {
10344 .eraseblocks = { {64 * 1024, 8} },
10345 .block_erase = erase_block_jedec,
10346 }, {
10347 .eraseblocks = { {512 * 1024, 1} },
10348 .block_erase = NULL,
10349 }
10350 },
Sean Nelson35727f72010-01-28 23:55:12 +000010351 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010352 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010353 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010354 },
10355
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010356 {
10357 .vendor = "SST",
10358 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010359 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010360 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010361 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010362 .total_size = 512,
10363 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010364 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010365 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010366 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010367 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010368 .block_erasers =
10369 {
10370 {
10371 .eraseblocks = { {4 * 1024, 128} },
10372 .block_erase = erase_sector_jedec,
10373 }, {
10374 .eraseblocks = { {64 * 1024, 8} },
10375 .block_erase = erase_block_jedec,
10376 }, {
10377 .eraseblocks = { {512 * 1024, 1} },
10378 .block_erase = NULL,
10379 }
10380 },
Joshua Roysa84b0bd2010-08-16 22:12:39 +000010381 .unlock = unlock_82802ab,
Sean Nelson35727f72010-01-28 23:55:12 +000010382 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010383 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010384 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010385 },
10386
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010387 {
10388 .vendor = "SST",
10389 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010390 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010391 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010392 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010393 .total_size = 1024,
10394 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000010395 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000010396 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010397 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010398 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010399 .block_erasers =
10400 {
10401 {
10402 .eraseblocks = { {4 * 1024, 256} },
10403 .block_erase = erase_sector_jedec,
10404 }, {
10405 .eraseblocks = { {64 * 1024, 16} },
10406 .block_erase = erase_block_jedec,
10407 }, {
10408 .eraseblocks = { {1024 * 1024, 1} },
10409 .block_erase = NULL,
10410 }
10411 },
Sean Nelson35727f72010-01-28 23:55:12 +000010412 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010413 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010414 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010415 },
10416
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010417 {
10418 .vendor = "SST",
10419 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010420 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010421 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010422 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010423 .total_size = 2048,
10424 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010425 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010426 .tested = TEST_OK_PRE,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010427 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010428 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000010429 .block_erasers =
10430 {
10431 {
10432 .eraseblocks = { {4 * 1024, 512} },
10433 .block_erase = erase_sector_49lfxxxc,
10434 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010435 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000010436 {64 * 1024, 31},
10437 {32 * 1024, 1},
10438 {8 * 1024, 2},
10439 {16 * 1024, 1},
10440 },
Sean Nelson69e58112010-03-23 17:10:28 +000010441 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000010442 }
10443 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000010444 .unlock = unlock_49lfxxxc,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010445 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010446 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010447 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010448 },
10449
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010450 {
10451 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010452 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010453 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010454 .manufacture_id = ST_ID,
10455 .model_id = ST_M29F002B,
10456 .total_size = 256,
10457 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010458 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010459 .tested = TEST_UNTESTED,
10460 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010461 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010462 .block_erasers =
10463 {
10464 {
10465 .eraseblocks = {
10466 {16 * 1024, 1},
10467 {8 * 1024, 2},
10468 {32 * 1024, 1},
10469 {64 * 1024, 3},
10470 },
10471 .block_erase = erase_sector_jedec,
10472 }, {
10473 .eraseblocks = { {256 * 1024, 1} },
10474 .block_erase = erase_chip_block_jedec,
10475 }
10476 },
Sean Nelson35727f72010-01-28 23:55:12 +000010477 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010478 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010479 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010480 },
10481
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010482 {
10483 .vendor = "ST",
10484 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010485 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010486 .manufacture_id = ST_ID,
10487 .model_id = ST_M29F002T,
10488 .total_size = 256,
10489 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010490 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010491 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010492 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010493 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010494 .block_erasers =
10495 {
10496 {
10497 .eraseblocks = {
10498 {64 * 1024, 3},
10499 {32 * 1024, 1},
10500 {8 * 1024, 2},
10501 {16 * 1024, 1},
10502 },
10503 .block_erase = erase_sector_jedec,
10504 }, {
10505 .eraseblocks = { {256 * 1024, 1} },
10506 .block_erase = erase_chip_block_jedec,
10507 }
10508 },
Sean Nelson35727f72010-01-28 23:55:12 +000010509 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010510 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010511 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000010512 },
10513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010514 {
10515 .vendor = "ST",
10516 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010517 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010518 .manufacture_id = ST_ID,
10519 .model_id = ST_M29F040B,
10520 .total_size = 512,
10521 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010522 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
10523 .tested = TEST_UNTESTED,
10524 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010525 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000010526 .block_erasers =
10527 {
10528 {
10529 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson35727f72010-01-28 23:55:12 +000010530 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010531 }, {
10532 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010533 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000010534 }
10535 },
Sean Nelson35727f72010-01-28 23:55:12 +000010536 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010537 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010538 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010539 },
10540
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010541 {
Sean Nelson35727f72010-01-28 23:55:12 +000010542 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010543 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010544 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010545 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010546 .manufacture_id = ST_ID,
10547 .model_id = ST_M29F400BB,
10548 .total_size = 512,
10549 .page_size = 64 * 1024,
10550 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010551 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010552 .probe = probe_m29f400bt,
10553 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
10554 .block_erasers =
10555 {
10556 {
10557 .eraseblocks = {
10558 {16 * 1024, 1},
10559 {8 * 1024, 2},
10560 {32 * 1024, 1},
10561 {64 * 1024, 7},
10562 },
10563 .block_erase = block_erase_m29f400bt,
10564 }, {
10565 .eraseblocks = { {512 * 1024, 1} },
10566 .block_erase = block_erase_chip_m29f400bt,
10567 }
10568 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000010569 .write = write_m29f400bt,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010570 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010571 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010572 },
10573 {
10574 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
10575 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010576 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010577 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010578 .manufacture_id = ST_ID,
10579 .model_id = ST_M29F400BT,
10580 .total_size = 512,
10581 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010582 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010583 .tested = TEST_UNTESTED,
10584 .probe = probe_m29f400bt,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010585 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010586 .block_erasers =
10587 {
10588 {
10589 .eraseblocks = {
10590 {64 * 1024, 7},
10591 {32 * 1024, 1},
10592 {8 * 1024, 2},
10593 {16 * 1024, 1},
10594 },
10595 .block_erase = block_erase_m29f400bt,
10596 }, {
10597 .eraseblocks = { {512 * 1024, 1} },
10598 .block_erase = block_erase_chip_m29f400bt,
10599 }
10600 },
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000010601 .write = write_m29f400bt,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010602 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010603 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010604 },
10605
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010606 {
10607 .vendor = "ST",
10608 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010609 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010610 .manufacture_id = ST_ID,
10611 .model_id = ST_M29W010B,
10612 .total_size = 128,
10613 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010614 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010615 .tested = TEST_UNTESTED,
10616 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010617 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010618 .block_erasers =
10619 {
10620 {
10621 .eraseblocks = { {16 * 1024, 8}, },
10622 .block_erase = erase_sector_jedec,
10623 }, {
10624 .eraseblocks = { {128 * 1024, 1} },
10625 .block_erase = erase_chip_block_jedec,
10626 }
10627 },
Sean Nelson35727f72010-01-28 23:55:12 +000010628 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010629 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010631 },
10632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010633 {
10634 .vendor = "ST",
10635 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010636 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010637 .manufacture_id = ST_ID,
10638 .model_id = ST_M29W040B,
10639 .total_size = 512,
10640 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010641 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010642 .tested = TEST_UNTESTED,
10643 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010644 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010645 .block_erasers =
10646 {
10647 {
10648 .eraseblocks = { {64 * 1024, 8}, },
10649 .block_erase = erase_sector_jedec,
10650 }, {
10651 .eraseblocks = { {512 * 1024, 1} },
10652 .block_erase = erase_chip_block_jedec,
10653 }
10654 },
Sean Nelson35727f72010-01-28 23:55:12 +000010655 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010656 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010657 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010658 },
10659
Stefan Taunereb582572012-09-21 12:52:50 +000010660 {
10661 .vendor = "ST",
10662 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010663 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000010664 .manufacture_id = ST_ID,
10665 .model_id = ST_M29W512B,
10666 .total_size = 64,
10667 .page_size = 64 * 1024,
10668 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000010669 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000010670 .probe = probe_jedec,
10671 .probe_timing = TIMING_ZERO,
10672 .block_erasers =
10673 {
10674 {
10675 .eraseblocks = { {64 * 1024, 1} },
10676 .block_erase = erase_chip_block_jedec,
10677 }
10678 },
10679 .write = write_jedec_1,
10680 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010681 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000010682 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000010683
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010684 {
10685 .vendor = "ST",
10686 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010687 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010688 .manufacture_id = ST_ID,
10689 .model_id = ST_M50FLW040A,
10690 .total_size = 512,
10691 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010692 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010693 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010694 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010695 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010696 .block_erasers =
10697 {
10698 {
Sean Nelson329bde72010-01-19 16:39:19 +000010699 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010700 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010701 {64 * 1024, 5}, /* block */
10702 {4 * 1024, 16}, /* sector */
10703 {4 * 1024, 16}, /* sector */
10704 },
10705 .block_erase = NULL,
10706 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010707 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010708 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010709 }
10710 },
Sean Nelson28accc22010-03-19 18:47:06 +000010711 .unlock = unlock_stm50flw0x0x,
10712 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010713 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010714 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010715 },
10716
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010717 {
10718 .vendor = "ST",
10719 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010720 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010721 .manufacture_id = ST_ID,
10722 .model_id = ST_M50FLW040B,
10723 .total_size = 512,
10724 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010725 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010726 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010727 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010728 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010729 .block_erasers =
10730 {
10731 {
Sean Nelson329bde72010-01-19 16:39:19 +000010732 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010733 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010734 {4 * 1024, 16}, /* sector */
10735 {64 * 1024, 5}, /* block */
10736 {4 * 1024, 16}, /* sector */
10737 },
10738 .block_erase = NULL,
10739 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010740 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010741 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010742 }
10743 },
Sean Nelson28accc22010-03-19 18:47:06 +000010744 .unlock = unlock_stm50flw0x0x,
10745 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010746 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010747 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010748 },
10749
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010750 {
10751 .vendor = "ST",
10752 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010753 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010754 .manufacture_id = ST_ID,
10755 .model_id = ST_M50FLW080A,
10756 .total_size = 1024,
10757 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010758 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010759 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000010760 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010761 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010762 .block_erasers =
10763 {
10764 {
Sean Nelson329bde72010-01-19 16:39:19 +000010765 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010766 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010767 {64 * 1024, 13}, /* block */
10768 {4 * 1024, 16}, /* sector */
10769 {4 * 1024, 16}, /* sector */
10770 },
10771 .block_erase = NULL,
10772 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010773 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010774 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010775 }
10776 },
Sean Nelson28accc22010-03-19 18:47:06 +000010777 .unlock = unlock_stm50flw0x0x,
10778 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010779 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010780 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010781 },
10782
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010783 {
10784 .vendor = "ST",
10785 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010786 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010787 .manufacture_id = ST_ID,
10788 .model_id = ST_M50FLW080B,
10789 .total_size = 1024,
10790 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010791 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010792 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010793 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000010794 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000010795 .block_erasers =
10796 {
10797 {
Sean Nelson329bde72010-01-19 16:39:19 +000010798 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000010799 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000010800 {4 * 1024, 16}, /* sector */
10801 {64 * 1024, 13}, /* block */
10802 {4 * 1024, 16}, /* sector */
10803 },
10804 .block_erase = NULL,
10805 }, {
Sean Nelson56358aa2010-01-19 16:08:51 +000010806 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010807 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010808 }
10809 },
Sean Nelson28accc22010-03-19 18:47:06 +000010810 .unlock = unlock_stm50flw0x0x,
10811 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010812 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010813 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010814 },
10815
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010816 {
10817 .vendor = "ST",
10818 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010819 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010820 .manufacture_id = ST_ID,
10821 .model_id = ST_M50FW002,
10822 .total_size = 256,
10823 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010824 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010825 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010826 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010827 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010828 .block_erasers =
10829 {
10830 {
10831 .eraseblocks = {
10832 {64 * 1024, 3},
10833 {32 * 1024, 1},
10834 {8 * 1024, 2},
10835 {16 * 1024, 1},
10836 },
Sean Nelson28accc22010-03-19 18:47:06 +000010837 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010838 }
10839 },
Sean Nelson28accc22010-03-19 18:47:06 +000010840 .unlock = unlock_stm50flw0x0x,
10841 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010842 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010843 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010844 },
10845
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010846 {
10847 .vendor = "ST",
10848 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010849 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010850 .manufacture_id = ST_ID,
10851 .model_id = ST_M50FW016,
10852 .total_size = 2048,
10853 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010854 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010855 .tested = TEST_UNTESTED,
10856 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010857 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010858 .block_erasers =
10859 {
10860 {
10861 .eraseblocks = { {64 * 1024, 32}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010862 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010863 }
10864 },
Sean Nelson28accc22010-03-19 18:47:06 +000010865 .unlock = unlock_stm50flw0x0x,
10866 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010867 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010868 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010869 },
10870
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010871 {
10872 .vendor = "ST",
10873 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010874 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010875 .manufacture_id = ST_ID,
10876 .model_id = ST_M50FW040,
10877 .total_size = 512,
10878 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010879 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000010880 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010881 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010882 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010883 .block_erasers =
10884 {
10885 {
10886 .eraseblocks = { {64 * 1024, 8}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010887 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010888 }
10889 },
Sean Nelson28accc22010-03-19 18:47:06 +000010890 .unlock = unlock_stm50flw0x0x,
10891 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010892 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010893 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010894 },
10895
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010896 {
10897 .vendor = "ST",
10898 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010899 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010900 .manufacture_id = ST_ID,
10901 .model_id = ST_M50FW080,
10902 .total_size = 1024,
10903 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010904 .feature_bits = FEATURE_REGISTERMAP,
Antony Rheneus0fbba982011-05-26 14:28:51 +000010905 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010906 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000010907 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000010908 .block_erasers =
10909 {
10910 {
10911 .eraseblocks = { {64 * 1024, 16}, },
Sean Nelson28accc22010-03-19 18:47:06 +000010912 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010913 }
10914 },
Sean Nelson28accc22010-03-19 18:47:06 +000010915 .unlock = unlock_stm50flw0x0x,
10916 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010917 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010918 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010919 },
10920
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010921 {
10922 .vendor = "ST",
10923 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010924 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010925 .manufacture_id = ST_ID,
10926 .model_id = ST_M50LPW116,
10927 .total_size = 2048,
10928 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010929 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010930 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010931 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000010932 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010933 .block_erasers =
10934 {
10935 {
10936 .eraseblocks = {
10937 {4 * 1024, 16},
10938 {64 * 1024, 30},
10939 {32 * 1024, 1},
10940 {8 * 1024, 2},
10941 {16 * 1024, 1},
10942 },
Sean Nelson28accc22010-03-19 18:47:06 +000010943 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000010944 }
10945 },
Sean Nelson28accc22010-03-19 18:47:06 +000010946 .unlock = unlock_stm50flw0x0x,
10947 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010948 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010949 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000010950 },
10951
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010952 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010953 .vendor = "SyncMOS/MoselVitelic",
10954 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010955 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010956 .manufacture_id = SYNCMOS_MVC_ID,
10957 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010958 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010959 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000010960 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010961 .tested = TEST_UNTESTED,
10962 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000010963 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000010964 .block_erasers =
10965 {
10966 {
10967 .eraseblocks = { {512, 256} },
10968 .block_erase = erase_sector_jedec,
10969 }, {
10970 .eraseblocks = { {128 * 1024, 1} },
10971 .block_erase = erase_chip_block_jedec,
10972 },
10973 },
Sean Nelson35727f72010-01-28 23:55:12 +000010974 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010975 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010976 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000010977 },
10978
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010979 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000010980 .vendor = "SyncMOS/MoselVitelic",
10981 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010982 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010983 .manufacture_id = SYNCMOS_MVC_ID,
10984 .model_id = SM_MVC_29C51001T,
10985 .total_size = 128,
10986 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000010987 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000010988 .tested = TEST_UNTESTED,
10989 .probe = probe_jedec,
10990 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
10991 .block_erasers =
10992 {
10993 {
10994 .eraseblocks = { {512, 256} },
10995 .block_erase = erase_sector_jedec,
10996 }, {
10997 .eraseblocks = { {128 * 1024, 1} },
10998 .block_erase = erase_chip_block_jedec,
10999 },
11000 },
11001 .write = write_jedec_1,
11002 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011003 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011004 },
11005
11006 {
11007 .vendor = "SyncMOS/MoselVitelic",
11008 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011009 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011010 .manufacture_id = SYNCMOS_MVC_ID,
11011 .model_id = SM_MVC_29C51002B,
11012 .total_size = 256,
11013 .page_size = 512,
11014 .feature_bits = FEATURE_EITHER_RESET,
11015 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011016 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011017 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011018 .block_erasers =
11019 {
11020 {
11021 .eraseblocks = { {512, 512} },
11022 .block_erase = erase_sector_jedec,
11023 }, {
11024 .eraseblocks = { {256 * 1024, 1} },
11025 .block_erase = erase_chip_block_jedec,
11026 },
11027 },
Sean Nelson35727f72010-01-28 23:55:12 +000011028 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011029 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000011030 },
11031
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011032 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011033 .vendor = "SyncMOS/MoselVitelic",
11034 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011035 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011036 .manufacture_id = SYNCMOS_MVC_ID,
11037 .model_id = SM_MVC_29C51002T,
11038 .total_size = 256,
11039 .page_size = 512,
11040 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011041 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011042 .probe = probe_jedec,
11043 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11044 .block_erasers =
11045 {
11046 {
11047 .eraseblocks = { {512, 512} },
11048 .block_erase = erase_sector_jedec,
11049 }, {
11050 .eraseblocks = { {256 * 1024, 1} },
11051 .block_erase = erase_chip_block_jedec,
11052 },
11053 },
11054 .write = write_jedec_1,
11055 .read = read_memmapped,
11056 },
11057
11058 {
11059 .vendor = "SyncMOS/MoselVitelic",
11060 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011061 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011062 .manufacture_id = SYNCMOS_MVC_ID,
11063 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011064 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011065 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011066 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011067 .tested = TEST_UNTESTED,
11068 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011069 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000011070 .block_erasers =
11071 {
11072 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011073 .eraseblocks = { {1024, 512} },
11074 .block_erase = erase_sector_jedec,
11075 }, {
11076 .eraseblocks = { {512 * 1024, 1} },
11077 .block_erase = erase_chip_block_jedec,
11078 },
11079 },
11080 .write = write_jedec_1,
11081 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011082 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011083 },
11084
11085 {
11086 .vendor = "SyncMOS/MoselVitelic",
11087 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011088 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011089 .manufacture_id = SYNCMOS_MVC_ID,
11090 .model_id = SM_MVC_29C51004T,
11091 .total_size = 512,
11092 .page_size = 1024,
11093 .feature_bits = FEATURE_EITHER_RESET,
11094 .tested = TEST_UNTESTED,
11095 .probe = probe_jedec,
11096 .probe_timing = TIMING_ZERO,
11097 .block_erasers =
11098 {
11099 {
11100 .eraseblocks = { {1024, 512} },
11101 .block_erase = erase_sector_jedec,
11102 }, {
11103 .eraseblocks = { {512 * 1024, 1} },
11104 .block_erase = erase_chip_block_jedec,
11105 },
11106 },
11107 .write = write_jedec_1,
11108 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011109 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011110 },
11111
11112 {
11113 .vendor = "SyncMOS/MoselVitelic",
11114 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011115 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011116 .manufacture_id = SYNCMOS_MVC_ID,
11117 .model_id = SM_MVC_29C31004B,
11118 .total_size = 512,
11119 .page_size = 1024,
11120 .feature_bits = FEATURE_EITHER_RESET,
11121 .tested = TEST_UNTESTED,
11122 .probe = probe_jedec,
11123 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11124 .block_erasers =
11125 {
11126 {
11127 .eraseblocks = { {1024, 512} },
11128 .block_erase = erase_sector_jedec,
11129 }, {
11130 .eraseblocks = { {512 * 1024, 1} },
11131 .block_erase = erase_chip_block_jedec,
11132 },
11133 },
11134 .write = write_jedec_1,
11135 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011136 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011137 },
11138
11139 {
11140 .vendor = "SyncMOS/MoselVitelic",
11141 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011142 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011143 .manufacture_id = SYNCMOS_MVC_ID,
11144 .model_id = SM_MVC_29C31004T,
11145 .total_size = 512,
11146 .page_size = 1024,
11147 .feature_bits = FEATURE_EITHER_RESET,
11148 .tested = TEST_UNTESTED,
11149 .probe = probe_jedec,
11150 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
11151 .block_erasers =
11152 {
11153 {
11154 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000011155 .block_erase = erase_sector_jedec,
11156 }, {
11157 .eraseblocks = { {512 * 1024, 1} },
11158 .block_erase = erase_chip_block_jedec,
11159 },
11160 },
Sean Nelson35727f72010-01-28 23:55:12 +000011161 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011162 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011163 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011164 },
11165
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011166 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011167 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011168 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011169 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011170 .manufacture_id = TI_OLD_ID,
11171 .model_id = TI_TMS29F002RB,
11172 .total_size = 256,
11173 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011174 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011175 .tested = TEST_UNTESTED,
11176 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011177 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011178 .block_erasers =
11179 {
11180 {
11181 .eraseblocks = {
11182 {16 * 1024, 1},
11183 {8 * 1024, 2},
11184 {32 * 1024, 1},
11185 {64 * 1024, 3},
11186 },
11187 .block_erase = erase_sector_jedec,
11188 }, {
11189 .eraseblocks = { {256 * 1024, 1} },
11190 .block_erase = erase_chip_block_jedec,
11191 },
11192 },
Sean Nelson35727f72010-01-28 23:55:12 +000011193 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011194 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011195 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011196 },
11197
11198 {
Uwe Hermanna106d152009-05-27 23:17:40 +000011199 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011200 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011201 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011202 .manufacture_id = TI_OLD_ID,
11203 .model_id = TI_TMS29F002RT,
11204 .total_size = 256,
11205 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000011206 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011207 .tested = TEST_UNTESTED,
11208 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011209 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000011210 .block_erasers =
11211 {
11212 {
11213 .eraseblocks = {
11214 {64 * 1024, 3},
11215 {32 * 1024, 1},
11216 {8 * 1024, 2},
11217 {16 * 1024, 1},
11218 },
11219 .block_erase = erase_sector_jedec,
11220 }, {
11221 .eraseblocks = { {256 * 1024, 1} },
11222 .block_erase = erase_chip_block_jedec,
11223 },
11224 },
Sean Nelson35727f72010-01-28 23:55:12 +000011225 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011226 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011227 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000011228 },
11229
11230 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011231 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011232 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011233 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011234 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011235 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011236 .total_size = 1024,
11237 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011238 /* supports SFDP */
11239 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011240 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011241 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011242 .probe = probe_spi_rdid,
11243 .probe_timing = TIMING_ZERO,
11244 .block_erasers =
11245 {
11246 {
11247 .eraseblocks = { {4 * 1024, 256} },
11248 .block_erase = spi_block_erase_20,
11249 }, {
11250 .eraseblocks = { {32 * 1024, 32} },
11251 .block_erase = spi_block_erase_52,
11252 }, {
11253 .eraseblocks = { {64 * 1024, 16} },
11254 .block_erase = spi_block_erase_d8,
11255 }, {
11256 .eraseblocks = { {1024 * 1024, 1} },
11257 .block_erase = spi_block_erase_60,
11258 }, {
11259 .eraseblocks = { {1024 * 1024, 1} },
11260 .block_erase = spi_block_erase_c7,
11261 }
11262 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011264 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011265 .write = spi_chip_write_256,
11266 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011267 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011268 },
11269
11270 {
11271 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011272 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011273 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011274 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011275 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011276 .total_size = 2048,
11277 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011278 /* supports SFDP */
11279 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011280 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000011281 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011282 .probe = probe_spi_rdid,
11283 .probe_timing = TIMING_ZERO,
11284 .block_erasers =
11285 {
11286 {
11287 .eraseblocks = { {4 * 1024, 512} },
11288 .block_erase = spi_block_erase_20,
11289 }, {
11290 .eraseblocks = { {32 * 1024, 64} },
11291 .block_erase = spi_block_erase_52,
11292 }, {
11293 .eraseblocks = { {64 * 1024, 32} },
11294 .block_erase = spi_block_erase_d8,
11295 }, {
11296 .eraseblocks = { {2 * 1024 * 1024, 1} },
11297 .block_erase = spi_block_erase_60,
11298 }, {
11299 .eraseblocks = { {2 * 1024 * 1024, 1} },
11300 .block_erase = spi_block_erase_c7,
11301 }
11302 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011303 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011304 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011305 .write = spi_chip_write_256,
11306 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011307 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011308 },
11309
11310 {
11311 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011312 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011313 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011314 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011315 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011316 .total_size = 4096,
11317 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011318 /* supports SFDP */
11319 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011320 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011321 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011322 .probe = probe_spi_rdid,
11323 .probe_timing = TIMING_ZERO,
11324 .block_erasers =
11325 {
11326 {
11327 .eraseblocks = { {4 * 1024, 1024} },
11328 .block_erase = spi_block_erase_20,
11329 }, {
11330 .eraseblocks = { {32 * 1024, 128} },
11331 .block_erase = spi_block_erase_52,
11332 }, {
11333 .eraseblocks = { {64 * 1024, 64} },
11334 .block_erase = spi_block_erase_d8,
11335 }, {
11336 .eraseblocks = { {4 * 1024 * 1024, 1} },
11337 .block_erase = spi_block_erase_60,
11338 }, {
11339 .eraseblocks = { {4 * 1024 * 1024, 1} },
11340 .block_erase = spi_block_erase_c7,
11341 }
11342 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011343 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011344 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000011345 .write = spi_chip_write_256,
11346 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011347 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000011348 },
11349
11350 {
11351 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011352 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011353 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000011354 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011355 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000011356 .total_size = 8192,
11357 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011358 /* supports SFDP */
11359 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000011361 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000011362 .probe = probe_spi_rdid,
11363 .probe_timing = TIMING_ZERO,
11364 .block_erasers =
11365 {
11366 {
11367 .eraseblocks = { {4 * 1024, 2048} },
11368 .block_erase = spi_block_erase_20,
11369 }, {
11370 .eraseblocks = { {32 * 1024, 256} },
11371 .block_erase = spi_block_erase_52,
11372 }, {
11373 .eraseblocks = { {64 * 1024, 128} },
11374 .block_erase = spi_block_erase_d8,
11375 }, {
11376 .eraseblocks = { {8 * 1024 * 1024, 1} },
11377 .block_erase = spi_block_erase_60,
11378 }, {
11379 .eraseblocks = { {8 * 1024 * 1024, 1} },
11380 .block_erase = spi_block_erase_c7,
11381 }
11382 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011383 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011384 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000011385 .write = spi_chip_write_256,
11386 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011387 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000011388 },
11389
11390 {
11391 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011392 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011393 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011394 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011395 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011396 .total_size = 16384,
11397 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011398 /* supports SFDP */
11399 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000011400 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011401 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011402 .probe = probe_spi_rdid,
11403 .probe_timing = TIMING_ZERO,
11404 .block_erasers =
11405 {
11406 {
11407 .eraseblocks = { {4 * 1024, 4096} },
11408 .block_erase = spi_block_erase_20,
11409 }, {
11410 .eraseblocks = { {32 * 1024, 512} },
11411 .block_erase = spi_block_erase_52,
11412 }, {
11413 .eraseblocks = { {64 * 1024, 256} },
11414 .block_erase = spi_block_erase_d8,
11415 }, {
11416 .eraseblocks = { {16 * 1024 * 1024, 1} },
11417 .block_erase = spi_block_erase_60,
11418 }, {
11419 .eraseblocks = { {16 * 1024 * 1024, 1} },
11420 .block_erase = spi_block_erase_c7,
11421 }
11422 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011423 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011424 .unlock = spi_disable_blockprotect,
11425 .write = spi_chip_write_256,
11426 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011427 .voltage = {2700, 3600},
11428 },
11429
11430 {
11431 .vendor = "Winbond",
11432 .name = "W25Q20.W",
11433 .bustype = BUS_SPI,
11434 .manufacture_id = WINBOND_NEX_ID,
11435 .model_id = WINBOND_NEX_W25Q20_W,
11436 .total_size = 256,
11437 .page_size = 256,
11438 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11439 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11440 .tested = TEST_UNTESTED,
11441 .probe = probe_spi_rdid,
11442 .probe_timing = TIMING_ZERO,
11443 .block_erasers =
11444 {
11445 {
11446 .eraseblocks = { {4 * 1024, 64} },
11447 .block_erase = spi_block_erase_20,
11448 }, {
11449 .eraseblocks = { {32 * 1024, 8} },
11450 .block_erase = spi_block_erase_52,
11451 }, {
11452 .eraseblocks = { {64 * 1024, 4} },
11453 .block_erase = spi_block_erase_d8,
11454 }, {
11455 .eraseblocks = { {256 * 1024, 1} },
11456 .block_erase = spi_block_erase_60,
11457 }, {
11458 .eraseblocks = { {256 * 1024, 1} },
11459 .block_erase = spi_block_erase_c7,
11460 }
11461 },
11462 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11463 .unlock = spi_disable_blockprotect,
11464 .write = spi_chip_write_256,
11465 .read = spi_chip_read,
11466 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11467 },
11468
11469 {
11470 .vendor = "Winbond",
11471 .name = "W25Q40.W",
11472 .bustype = BUS_SPI,
11473 .manufacture_id = WINBOND_NEX_ID,
11474 .model_id = WINBOND_NEX_W25Q40_W,
11475 .total_size = 512,
11476 .page_size = 256,
11477 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11479 .tested = TEST_UNTESTED,
11480 .probe = probe_spi_rdid,
11481 .probe_timing = TIMING_ZERO,
11482 .block_erasers =
11483 {
11484 {
11485 .eraseblocks = { {4 * 1024, 128} },
11486 .block_erase = spi_block_erase_20,
11487 }, {
11488 .eraseblocks = { {32 * 1024, 16} },
11489 .block_erase = spi_block_erase_52,
11490 }, {
11491 .eraseblocks = { {64 * 1024, 8} },
11492 .block_erase = spi_block_erase_d8,
11493 }, {
11494 .eraseblocks = { {512 * 1024, 1} },
11495 .block_erase = spi_block_erase_60,
11496 }, {
11497 .eraseblocks = { {512 * 1024, 1} },
11498 .block_erase = spi_block_erase_c7,
11499 }
11500 },
11501 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11502 .unlock = spi_disable_blockprotect,
11503 .write = spi_chip_write_256,
11504 .read = spi_chip_read,
11505 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11506 },
11507
11508 {
11509 .vendor = "Winbond",
11510 .name = "W25Q80.W",
11511 .bustype = BUS_SPI,
11512 .manufacture_id = WINBOND_NEX_ID,
11513 .model_id = WINBOND_NEX_W25Q80_W,
11514 .total_size = 1024,
11515 .page_size = 256,
11516 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11518 .tested = TEST_UNTESTED,
11519 .probe = probe_spi_rdid,
11520 .probe_timing = TIMING_ZERO,
11521 .block_erasers =
11522 {
11523 {
11524 .eraseblocks = { {4 * 1024, 256} },
11525 .block_erase = spi_block_erase_20,
11526 }, {
11527 .eraseblocks = { {32 * 1024, 32} },
11528 .block_erase = spi_block_erase_52,
11529 }, {
11530 .eraseblocks = { {64 * 1024, 16} },
11531 .block_erase = spi_block_erase_d8,
11532 }, {
11533 .eraseblocks = { {1 * 1024 * 1024, 1} },
11534 .block_erase = spi_block_erase_60,
11535 }, {
11536 .eraseblocks = { {1 * 1024 * 1024, 1} },
11537 .block_erase = spi_block_erase_c7,
11538 }
11539 },
11540 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11541 .unlock = spi_disable_blockprotect,
11542 .write = spi_chip_write_256,
11543 .read = spi_chip_read,
11544 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11545 },
11546
11547 {
11548 .vendor = "Winbond",
11549 .name = "W25Q16.W",
11550 .bustype = BUS_SPI,
11551 .manufacture_id = WINBOND_NEX_ID,
11552 .model_id = WINBOND_NEX_W25Q16_W,
11553 .total_size = 2048,
11554 .page_size = 256,
11555 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11556 /* QPI enable 0x38, disable 0xFF */
11557 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11558 .tested = TEST_UNTESTED,
11559 .probe = probe_spi_rdid,
11560 .probe_timing = TIMING_ZERO,
11561 .block_erasers =
11562 {
11563 {
11564 .eraseblocks = { {4 * 1024, 512} },
11565 .block_erase = spi_block_erase_20,
11566 }, {
11567 .eraseblocks = { {32 * 1024, 64} },
11568 .block_erase = spi_block_erase_52,
11569 }, {
11570 .eraseblocks = { {64 * 1024, 32} },
11571 .block_erase = spi_block_erase_d8,
11572 }, {
11573 .eraseblocks = { {2 * 1024 * 1024, 1} },
11574 .block_erase = spi_block_erase_60,
11575 }, {
11576 .eraseblocks = { {2 * 1024 * 1024, 1} },
11577 .block_erase = spi_block_erase_c7,
11578 }
11579 },
11580 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11581 .unlock = spi_disable_blockprotect,
11582 .write = spi_chip_write_256,
11583 .read = spi_chip_read,
11584 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11585 },
11586
11587 {
11588 .vendor = "Winbond",
11589 .name = "W25Q32.W",
11590 .bustype = BUS_SPI,
11591 .manufacture_id = WINBOND_NEX_ID,
11592 .model_id = WINBOND_NEX_W25Q32_W,
11593 .total_size = 4096,
11594 .page_size = 256,
11595 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11596 /* QPI enable 0x38, disable 0xFF */
11597 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
11598 .tested = TEST_OK_PREW,
11599 .probe = probe_spi_rdid,
11600 .probe_timing = TIMING_ZERO,
11601 .block_erasers =
11602 {
11603 {
11604 .eraseblocks = { {4 * 1024, 1024} },
11605 .block_erase = spi_block_erase_20,
11606 }, {
11607 .eraseblocks = { {32 * 1024, 128} },
11608 .block_erase = spi_block_erase_52,
11609 }, {
11610 .eraseblocks = { {64 * 1024, 64} },
11611 .block_erase = spi_block_erase_d8,
11612 }, {
11613 .eraseblocks = { {4 * 1024 * 1024, 1} },
11614 .block_erase = spi_block_erase_60,
11615 }, {
11616 .eraseblocks = { {4 * 1024 * 1024, 1} },
11617 .block_erase = spi_block_erase_c7,
11618 }
11619 },
11620 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11621 .unlock = spi_disable_blockprotect,
11622 .write = spi_chip_write_256,
11623 .read = spi_chip_read,
11624 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
11625 },
11626
11627 {
11628 .vendor = "Winbond",
11629 .name = "W25Q64.W",
11630 .bustype = BUS_SPI,
11631 .manufacture_id = WINBOND_NEX_ID,
11632 .model_id = WINBOND_NEX_W25Q64_W,
11633 .total_size = 8192,
11634 .page_size = 256,
11635 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
11636 /* QPI enable 0x38, disable 0xFF */
11637 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011638 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000011639 .probe = probe_spi_rdid,
11640 .probe_timing = TIMING_ZERO,
11641 .block_erasers =
11642 {
11643 {
11644 .eraseblocks = { {4 * 1024, 2048} },
11645 .block_erase = spi_block_erase_20,
11646 }, {
11647 .eraseblocks = { {32 * 1024, 256} },
11648 .block_erase = spi_block_erase_52,
11649 }, {
11650 .eraseblocks = { {64 * 1024, 128} },
11651 .block_erase = spi_block_erase_d8,
11652 }, {
11653 .eraseblocks = { {8 * 1024 * 1024, 1} },
11654 .block_erase = spi_block_erase_60,
11655 }, {
11656 .eraseblocks = { {8 * 1024 * 1024, 1} },
11657 .block_erase = spi_block_erase_c7,
11658 }
11659 },
11660 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11661 .unlock = spi_disable_blockprotect,
11662 .write = spi_chip_write_256,
11663 .read = spi_chip_read,
11664 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000011665 },
11666
11667 {
11668 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011669 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011670 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011671 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011672 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011673 .total_size = 128,
11674 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011675 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011676 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011677 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011678 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011679 .block_erasers =
11680 {
11681 {
11682 .eraseblocks = { {4 * 1024, 32} },
11683 .block_erase = spi_block_erase_20,
11684 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011685 .eraseblocks = { {64 * 1024, 2} },
11686 .block_erase = spi_block_erase_d8,
11687 }, {
11688 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011689 .block_erase = spi_block_erase_c7,
11690 }
11691 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011692 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011693 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011694 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011695 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011696 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011697 },
11698
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011699 {
11700 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011701 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011702 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011703 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011704 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011705 .total_size = 256,
11706 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011707 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011708 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011709 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011710 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011711 .block_erasers =
11712 {
11713 {
11714 .eraseblocks = { {4 * 1024, 64} },
11715 .block_erase = spi_block_erase_20,
11716 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011717 .eraseblocks = { {64 * 1024, 4} },
11718 .block_erase = spi_block_erase_d8,
11719 }, {
11720 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011721 .block_erase = spi_block_erase_c7,
11722 }
11723 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011724 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011725 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011726 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011727 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011728 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011729 },
11730
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011731 {
11732 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011733 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011734 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011735 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011736 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011737 .total_size = 512,
11738 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011739 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000011740 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011741 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011742 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011743 .block_erasers =
11744 {
11745 {
11746 .eraseblocks = { {4 * 1024, 128} },
11747 .block_erase = spi_block_erase_20,
11748 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011749 .eraseblocks = { {64 * 1024, 8} },
11750 .block_erase = spi_block_erase_d8,
11751 }, {
11752 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011753 .block_erase = spi_block_erase_c7,
11754 }
11755 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011756 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011757 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011758 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011759 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011760 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011761 },
11762
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011763 {
11764 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011765 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011766 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011767 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011768 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011769 .total_size = 1024,
11770 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011771 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000011772 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011773 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011774 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011775 .block_erasers =
11776 {
11777 {
11778 .eraseblocks = { {4 * 1024, 256} },
11779 .block_erase = spi_block_erase_20,
11780 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011781 .eraseblocks = { {64 * 1024, 16} },
11782 .block_erase = spi_block_erase_d8,
11783 }, {
11784 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011785 .block_erase = spi_block_erase_c7,
11786 }
11787 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011788 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011789 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000011790 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011791 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011792 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011793 },
11794
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011795 {
11796 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011797 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011798 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000011799 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011800 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000011801 .total_size = 2048,
11802 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011803 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000011804 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000011805 .probe = probe_spi_rdid,
11806 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011807 .block_erasers =
11808 {
11809 {
11810 .eraseblocks = { {4 * 1024, 512} },
11811 .block_erase = spi_block_erase_20,
11812 }, {
11813 .eraseblocks = { {32 * 1024, 64} },
11814 .block_erase = spi_block_erase_52,
11815 }, {
11816 .eraseblocks = { {64 * 1024, 32} },
11817 .block_erase = spi_block_erase_d8,
11818 }, {
11819 .eraseblocks = { {2 * 1024 * 1024, 1} },
11820 .block_erase = spi_block_erase_60,
11821 }, {
11822 .eraseblocks = { {2 * 1024 * 1024, 1} },
11823 .block_erase = spi_block_erase_c7,
11824 }
11825 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011826 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011827 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000011828 .write = spi_chip_write_256,
11829 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011830 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000011831 },
11832
11833 {
11834 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011835 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011836 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000011837 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011838 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000011839 .total_size = 4096,
11840 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011841 .feature_bits = FEATURE_WRSR_WREN,
Zheng Bao1db2b752009-11-26 11:05:01 +000011842 .tested = TEST_OK_PROBE,
11843 .probe = probe_spi_rdid,
11844 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011845 .block_erasers =
11846 {
11847 {
11848 .eraseblocks = { {4 * 1024, 1024} },
11849 .block_erase = spi_block_erase_20,
11850 }, {
11851 .eraseblocks = { {32 * 1024, 128} },
11852 .block_erase = spi_block_erase_52,
11853 }, {
11854 .eraseblocks = { {64 * 1024, 64} },
11855 .block_erase = spi_block_erase_d8,
11856 }, {
11857 .eraseblocks = { {4 * 1024 * 1024, 1} },
11858 .block_erase = spi_block_erase_60,
11859 }, {
11860 .eraseblocks = { {4 * 1024 * 1024, 1} },
11861 .block_erase = spi_block_erase_c7,
11862 }
11863 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011864 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011865 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000011866 .write = spi_chip_write_256,
11867 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011868 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000011869 },
11870
11871 {
11872 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011873 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011874 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000011875 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011876 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000011877 .total_size = 8192,
11878 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000011879 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000011880 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000011881 .probe = probe_spi_rdid,
11882 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011883 .block_erasers =
11884 {
11885 {
11886 .eraseblocks = { {4 * 1024, 2048} },
11887 .block_erase = spi_block_erase_20,
11888 }, {
11889 .eraseblocks = { {32 * 1024, 256} },
11890 .block_erase = spi_block_erase_52,
11891 }, {
11892 .eraseblocks = { {64 * 1024, 128} },
11893 .block_erase = spi_block_erase_d8,
11894 }, {
11895 .eraseblocks = { {8 * 1024 * 1024, 1} },
11896 .block_erase = spi_block_erase_60,
11897 }, {
11898 .eraseblocks = { {8 * 1024 * 1024, 1} },
11899 .block_erase = spi_block_erase_c7,
11900 }
11901 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011902 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011903 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000011904 .write = spi_chip_write_256,
11905 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011906 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000011907 },
11908
11909 {
11910 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000011911 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011912 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000011913 .manufacture_id = WINBOND_ID,
11914 .model_id = WINBOND_W29C010,
11915 .total_size = 128,
11916 .page_size = 128,
11917 .feature_bits = FEATURE_LONG_RESET,
11918 .tested = TEST_OK_PRE,
11919 .probe = probe_w29ee011,
11920 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
11921 .block_erasers =
11922 {
11923 {
11924 .eraseblocks = { {128 * 1024, 1} },
11925 .block_erase = erase_chip_block_jedec,
11926 }
11927 },
11928 .write = write_jedec,
11929 .read = read_memmapped,
11930 },
11931
11932 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
11933 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000011934 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011935 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011936 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011937 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011938 .total_size = 128,
11939 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011940 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000011941 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011942 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011943 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011944 .block_erasers =
11945 {
11946 {
11947 .eraseblocks = { {128 * 1024, 1} },
11948 .block_erase = erase_chip_block_jedec,
11949 }
11950 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011951 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011952 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000011953 },
11954
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011955 {
11956 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000011957 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011958 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011959 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011960 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011961 .total_size = 256,
11962 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011963 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011964 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011965 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011966 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011967 .block_erasers =
11968 {
11969 {
11970 .eraseblocks = { {256 * 1024, 1} },
11971 .block_erase = erase_chip_block_jedec,
11972 }
11973 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011974 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011975 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011976 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011977 },
11978
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011979 {
11980 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000011981 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011982 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011983 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000011984 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011985 .total_size = 512,
11986 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000011987 .feature_bits = FEATURE_LONG_RESET,
11988 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011989 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011990 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000011991 .block_erasers =
11992 {
11993 {
11994 .eraseblocks = { {512 * 1024, 1} },
11995 .block_erase = erase_chip_block_jedec,
11996 }
11997 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011998 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011999 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012000 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012001 },
12002
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012003 {
12004 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000012005 .name = "W39F010",
12006 .bustype = BUS_PARALLEL,
12007 .manufacture_id = WINBOND_ID,
12008 .model_id = WINBOND_W39F010,
12009 .total_size = 128,
12010 .page_size = 4 * 1024,
12011 .feature_bits = FEATURE_EITHER_RESET,
12012 .tested = TEST_OK_PREW,
12013 .probe = probe_jedec,
12014 .probe_timing = 10,
12015 .block_erasers =
12016 {
12017 {
12018 .eraseblocks = { {4 * 1024, 32} },
12019 .block_erase = erase_block_jedec,
12020 }, {
12021 .eraseblocks = { {128 * 1024, 1} },
12022 .block_erase = erase_chip_block_jedec,
12023 }
12024 },
12025 .printlock = printlock_w39f010,
12026 .write = write_jedec_1,
12027 .read = read_memmapped,
12028 .voltage = {4500, 5500},
12029 },
12030
12031 {
12032 .vendor = "Winbond",
12033 .name = "W39L010",
12034 .bustype = BUS_PARALLEL,
12035 .manufacture_id = WINBOND_ID,
12036 .model_id = WINBOND_W39L010,
12037 .total_size = 128,
12038 .page_size = 4 * 1024,
12039 .feature_bits = FEATURE_EITHER_RESET,
12040 .tested = TEST_UNTESTED,
12041 .probe = probe_jedec,
12042 .probe_timing = 10,
12043 .block_erasers =
12044 {
12045 {
12046 .eraseblocks = { {4 * 1024, 32} },
12047 .block_erase = erase_block_jedec,
12048 }, {
12049 .eraseblocks = { {128 * 1024, 1} },
12050 .block_erase = erase_chip_block_jedec,
12051 }
12052 },
12053 .printlock = printlock_w39l010,
12054 .write = write_jedec_1,
12055 .read = read_memmapped,
12056 .voltage = {3000, 3600},
12057 },
12058
12059 {
12060 .vendor = "Winbond",
12061 .name = "W39L020",
12062 .bustype = BUS_PARALLEL,
12063 .manufacture_id = WINBOND_ID,
12064 .model_id = WINBOND_W39L020,
12065 .total_size = 256,
12066 .page_size = 4 * 1024,
12067 .feature_bits = FEATURE_EITHER_RESET,
12068 .tested = TEST_UNTESTED,
12069 .probe = probe_jedec,
12070 .probe_timing = 10,
12071 .block_erasers =
12072 {
12073 {
12074 .eraseblocks = { {4 * 1024, 64} },
12075 .block_erase = erase_block_jedec,
12076 }, {
12077 .eraseblocks = { {64 * 1024, 4} },
12078 .block_erase = erase_sector_jedec,
12079 }, {
12080 .eraseblocks = { {256 * 1024, 1} },
12081 .block_erase = erase_chip_block_jedec,
12082 }
12083 },
12084 .printlock = printlock_w39l020,
12085 .write = write_jedec_1,
12086 .read = read_memmapped,
12087 .voltage = {3000, 3600},
12088 },
12089
12090 {
12091 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000012092 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012093 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000012094 .manufacture_id = WINBOND_ID,
12095 .model_id = WINBOND_W39L040,
12096 .total_size = 512,
12097 .page_size = 64 * 1024,
12098 .feature_bits = FEATURE_EITHER_RESET,
12099 .tested = TEST_OK_PR,
12100 .probe = probe_jedec,
12101 .probe_timing = 10,
12102 .block_erasers =
12103 {
12104 {
12105 .eraseblocks = { {4 * 1024, 128} },
12106 .block_erase = erase_block_jedec,
12107 }, {
12108 .eraseblocks = { {64 * 1024, 8} },
12109 .block_erase = erase_sector_jedec,
12110 }, {
12111 .eraseblocks = { {512 * 1024, 1} },
12112 .block_erase = erase_chip_block_jedec,
12113 }
12114 },
12115 .printlock = printlock_w39l040,
12116 .write = write_jedec_1,
12117 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012118 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000012119 },
12120
12121 {
12122 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012123 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012124 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012125 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012126 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012127 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012128 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012129 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012130 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012131 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000012132 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012133 .block_erasers =
12134 {
12135 {
12136 .eraseblocks = { {64 * 1024, 8} },
12137 .block_erase = erase_sector_jedec,
12138 }, {
12139 .eraseblocks = { {512 * 1024, 1} },
12140 .block_erase = erase_chip_block_jedec,
12141 }
12142 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012143 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000012144 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012145 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012146 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012147 },
12148
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012149 {
12150 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012151 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012152 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012153 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012154 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012155 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012156 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012157 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012158 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012159 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000012160 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012161 .block_erasers =
12162 {
12163 {
12164 .eraseblocks = { {64 * 1024, 8} },
12165 .block_erase = erase_sector_jedec,
12166 }, {
12167 .eraseblocks = { {512 * 1024, 1} },
12168 .block_erase = erase_chip_block_jedec,
12169 }
12170 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012171 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000012172 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012173 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012174 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012175 },
12176
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012177 {
12178 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012179 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012180 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012181 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012182 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012183 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012184 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012185 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012186 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000012187 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012188 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012189 .block_erasers =
12190 {
12191 {
12192 .eraseblocks = { {64 * 1024, 8} },
12193 .block_erase = erase_sector_jedec,
12194 }, {
12195 .eraseblocks = { {512 * 1024, 1} },
12196 .block_erase = erase_chip_block_jedec,
12197 }
12198 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000012199 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000012200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012201 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012202 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012203 },
12204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012205 {
12206 .vendor = "Winbond",
12207 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012208 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012209 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012210 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012211 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012212 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000012213 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012214 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012215 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000012216 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012217 .block_erasers =
12218 {
12219 {
12220 .eraseblocks = { {4 * 1024, 128} },
12221 .block_erase = erase_block_jedec,
12222 }, {
12223 .eraseblocks = { {64 * 1024, 8} },
12224 .block_erase = erase_sector_jedec,
12225 }, {
12226 .eraseblocks = { {512 * 1024, 1} },
12227 .block_erase = erase_chip_block_jedec,
12228 }
12229 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012230 .printlock = printlock_w39v040fa,
Michael Karcherc9b63412010-05-30 16:55:18 +000012231 .unlock = unlock_sst_fwhub,
Sean Nelson35727f72010-01-28 23:55:12 +000012232 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012233 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012234 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012235 },
12236
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012237 {
12238 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012239 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012240 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012241 .manufacture_id = WINBOND_ID,
12242 .model_id = WINBOND_W39V040B,
12243 .total_size = 512,
12244 .page_size = 64 * 1024,
12245 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000012246 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012247 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012248 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012249 .block_erasers =
12250 {
12251 {
12252 .eraseblocks = { {64 * 1024, 8} },
12253 .block_erase = erase_sector_jedec,
12254 }, {
12255 .eraseblocks = { {512 * 1024, 1} },
12256 .block_erase = erase_chip_block_jedec,
12257 }
12258 },
12259 .printlock = printlock_w39v040fb,
Idwer Volleringecc67072010-12-26 23:55:12 +000012260 .unlock = unlock_w39v040fb,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012261 .write = write_jedec_1,
12262 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012263 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012264 },
12265
12266 {
12267 .vendor = "Winbond",
12268 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012269 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012270 .manufacture_id = WINBOND_ID,
12271 .model_id = WINBOND_W39V040C,
12272 .total_size = 512,
12273 .page_size = 64 * 1024,
12274 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000012275 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012276 .probe = probe_jedec,
12277 .probe_timing = 10,
12278 .block_erasers =
12279 {
12280 {
12281 .eraseblocks = { {64 * 1024, 8} },
12282 .block_erase = erase_sector_jedec,
12283 }, {
12284 .eraseblocks = { {512 * 1024, 1} },
12285 .block_erase = erase_chip_block_jedec,
12286 }
12287 },
12288 .printlock = printlock_w39v040fc,
12289 .write = write_jedec_1,
12290 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012291 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012292 },
12293
12294 {
12295 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012296 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012297 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012298 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012299 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012300 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012301 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012302 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000012303 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012304 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000012305 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012306 .block_erasers =
12307 {
12308 {
12309 .eraseblocks = { {64 * 1024, 16} },
12310 .block_erase = erase_sector_jedec,
12311 }, {
12312 .eraseblocks = { {1024 * 1024, 1} },
12313 .block_erase = erase_chip_block_jedec,
12314 }
12315 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012316 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000012317 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012318 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012319 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012320 },
12321
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012322 {
12323 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000012324 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012325 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012326 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012327 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012328 .total_size = 256,
12329 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012330 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012331 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012332 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012333 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012334 .block_erasers =
12335 {
12336 {
12337 .eraseblocks = {
12338 {128 * 1024, 1},
12339 {96 * 1024, 1},
12340 {8 * 1024, 2},
12341 {16 * 1024, 1},
12342 },
12343 .block_erase = erase_sector_jedec,
12344 }, {
12345 .eraseblocks = { {256 * 1024, 1} },
12346 .block_erase = erase_chip_block_jedec,
12347 }
12348 },
Sean Nelson35727f72010-01-28 23:55:12 +000012349 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012350 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012351 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012352 },
12353
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012354 {
12355 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012356 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012357 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012358 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012359 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012360 .total_size = 256,
12361 .page_size = 128,
12362 .feature_bits = FEATURE_EITHER_RESET,
12363 .tested = TEST_OK_PROBE,
12364 .probe = probe_jedec,
12365 .probe_timing = 10,
12366 .block_erasers =
12367 {
12368 {
12369 .eraseblocks = { {256 * 1024, 1} },
12370 .block_erase = erase_chip_block_jedec,
12371 }
12372 },
12373 .write = write_jedec_1,
12374 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012375 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000012376 },
12377
12378 {
12379 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012380 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012381 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012382 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012383 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012384 .total_size = 256,
12385 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012386 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012387 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012388 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000012389 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012390 .block_erasers =
12391 {
12392 {
12393 .eraseblocks = {
12394 {64 * 1024, 3},
12395 {32 * 1024, 1},
12396 {8 * 1024, 2},
12397 {16 * 1024, 1},
12398 },
12399 .block_erase = erase_sector_jedec,
12400 }, {
12401 .eraseblocks = { {256 * 1024, 1} },
12402 .block_erase = erase_chip_block_jedec,
12403 }
12404 },
Sean Nelson35727f72010-01-28 23:55:12 +000012405 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012406 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012407 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012408 },
12409
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012410 {
12411 .vendor = "Winbond",
12412 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012413 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012414 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012415 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012416 .total_size = 256,
12417 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000012418 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000012419 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012420 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012421 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012422 .block_erasers =
12423 {
12424 {
12425 .eraseblocks = {
12426 {64 * 1024, 3},
12427 {32 * 1024, 1},
12428 {8 * 1024, 2},
12429 {16 * 1024, 1},
12430 },
12431 .block_erase = erase_sector_jedec,
12432 }, {
12433 .eraseblocks = { {256 * 1024, 1} },
12434 .block_erase = erase_chip_block_jedec,
12435 }
12436 },
Sean Nelson35727f72010-01-28 23:55:12 +000012437 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012438 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012439 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012440 },
12441
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012442 {
12443 .vendor = "Winbond",
12444 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012445 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012446 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012447 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012448 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000012449 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012450 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000012451 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012452 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012453 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012454 .block_erasers =
12455 {
12456 {
12457 .eraseblocks = { {64 * 1024, 16}, },
12458 .block_erase = erase_sector_jedec,
12459 }, {
12460 .eraseblocks = { {1024 * 1024, 1} },
12461 .block_erase = erase_chip_block_jedec,
12462 }
12463 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012464 .printlock = printlock_w39v080fa,
12465 .unlock = unlock_w39v080fa,
Sean Nelson35727f72010-01-28 23:55:12 +000012466 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012467 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012468 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012469 },
12470
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012471 {
12472 .vendor = "Winbond",
12473 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012474 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012475 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000012476 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012477 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000012478 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012479 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012480 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000012481 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012482 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000012483 .block_erasers =
12484 {
12485 {
12486 .eraseblocks = { {64 * 1024, 8}, },
12487 .block_erase = erase_sector_jedec,
12488 }, {
12489 .eraseblocks = { {512 * 1024, 1} },
12490 .block_erase = erase_chip_block_jedec,
12491 }
12492 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000012493 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000012494 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012495 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012496 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000012497 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012498
12499 {
12500 .vendor = "Unknown",
12501 .name = "SFDP-capable chip",
12502 .bustype = BUS_SPI,
12503 .manufacture_id = GENERIC_MANUF_ID,
12504 .model_id = SFDP_DEVICE_ID,
12505 /* We present our own "report this" text hence we do not
12506 * want the default "This flash part has status UNTESTED..."
12507 * text to be printed. */
12508 .tested = TEST_OK_PREW,
12509 .probe = probe_spi_sfdp,
12510 .unlock = spi_disable_blockprotect, /* is this safe? */
12511 .read = spi_chip_read,
12512 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000012513 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000012514 /* Everything below will be set by the probing function. */
12515 .write = NULL,
12516 .total_size = 0,
12517 .page_size = 0,
12518 .feature_bits = 0,
12519 .block_erasers = {},
12520 },
FENG yu ningff692fb2008-12-08 18:15:10 +000012521
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012522 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000012523 .vendor = "Programmer",
12524 .name = "Opaque flash chip",
12525 .bustype = BUS_PROG,
12526 .manufacture_id = PROGMANUF_ID,
12527 .model_id = PROGDEV_ID,
12528 .total_size = 0,
12529 .page_size = 256,
12530 /* probe is assumed to work, rest will be filled in by probe */
12531 .tested = TEST_OK_PROBE,
12532 .probe = probe_opaque,
12533 /* eraseblock sizes will be set by the probing function */
12534 .block_erasers =
12535 {
12536 {
12537 .block_erase = erase_opaque,
12538 }
12539 },
12540 .write = write_opaque,
12541 .read = read_opaque,
12542 },
12543
12544 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012545 .vendor = "AMIC",
12546 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012547 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000012548 .manufacture_id = AMIC_ID,
12549 .model_id = GENERIC_DEVICE_ID,
12550 .total_size = 0,
12551 .page_size = 256,
12552 .tested = TEST_BAD_PREW,
12553 .probe = probe_spi_rdid4,
12554 .probe_timing = TIMING_ZERO,
12555 .write = NULL,
12556 .read = NULL,
12557 },
12558
12559 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012560 .vendor = "Atmel",
12561 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012562 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012563 .manufacture_id = ATMEL_ID,
12564 .model_id = GENERIC_DEVICE_ID,
12565 .total_size = 0,
12566 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012567 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012568 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012569 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012570 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012571 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012572 },
12573
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012574 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000012575 .vendor = "Eon",
12576 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012577 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012578 .manufacture_id = EON_ID_NOPREFIX,
12579 .model_id = GENERIC_DEVICE_ID,
12580 .total_size = 0,
12581 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012582 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012583 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012584 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012585 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012586 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012587 },
12588
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012589 {
12590 .vendor = "Macronix",
12591 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012592 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012593 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012594 .model_id = GENERIC_DEVICE_ID,
12595 .total_size = 0,
12596 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012597 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012598 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012599 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012600 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012601 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012602 },
12603
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012604 {
12605 .vendor = "PMC",
12606 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012607 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012608 .manufacture_id = PMC_ID,
12609 .model_id = GENERIC_DEVICE_ID,
12610 .total_size = 0,
12611 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012612 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012613 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012614 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012615 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012616 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012617 },
12618
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012619 {
12620 .vendor = "SST",
12621 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012622 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012623 .manufacture_id = SST_ID,
12624 .model_id = GENERIC_DEVICE_ID,
12625 .total_size = 0,
12626 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012627 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012628 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012629 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012630 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012631 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012632 },
12633
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012634 {
12635 .vendor = "ST",
12636 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012637 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012638 .manufacture_id = ST_ID,
12639 .model_id = GENERIC_DEVICE_ID,
12640 .total_size = 0,
12641 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000012642 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012643 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012644 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012645 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012646 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000012647 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000012648
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012649 {
Sean Nelson118e1d62009-11-24 02:08:11 +000012650 .vendor = "Sanyo",
12651 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012652 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000012653 .manufacture_id = SANYO_ID,
12654 .model_id = GENERIC_DEVICE_ID,
12655 .total_size = 0,
12656 .page_size = 256,
12657 .tested = TEST_BAD_PREW,
12658 .probe = probe_spi_rdid,
12659 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000012660 .write = NULL,
12661 .read = NULL,
12662 },
12663
12664 {
Stefan Taunereb582572012-09-21 12:52:50 +000012665 .vendor = "Winbond",
12666 .name = "unknown Winbond (ex Nexcom) SPI chip",
12667 .bustype = BUS_SPI,
12668 .manufacture_id = WINBOND_NEX_ID,
12669 .model_id = GENERIC_DEVICE_ID,
12670 .total_size = 0,
12671 .page_size = 256,
12672 .tested = TEST_BAD_PREW,
12673 .probe = probe_spi_rdid,
12674 .probe_timing = TIMING_ZERO,
12675 .write = NULL,
12676 .read = NULL,
12677 },
12678
12679 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012680 .vendor = "Generic",
12681 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012682 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012683 .manufacture_id = GENERIC_MANUF_ID,
12684 .model_id = GENERIC_DEVICE_ID,
12685 .total_size = 0,
12686 .page_size = 256,
12687 .tested = TEST_BAD_PREW,
12688 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012689 .write = NULL,
12690 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000012691
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012692 {
12693 .vendor = "Generic",
12694 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012695 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012696 .manufacture_id = GENERIC_MANUF_ID,
12697 .model_id = GENERIC_DEVICE_ID,
12698 .total_size = 0,
12699 .page_size = 256,
12700 .tested = TEST_BAD_PREW,
12701 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000012702 .write = NULL,
12703 },
12704
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012705 { NULL }
Stephan Guilloux72cf5652009-04-21 01:46:07 +000012706};