blob: 39fd6716f1115647bdb7db23c505f88640d8579b [file] [log] [blame]
Ollie Lho184a4042005-11-26 21:55:36 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ollie Lho184a4042005-11-26 21:55:36 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
Stefan Reinauer4c390c82008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Sean Nelsonc57a9202010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Uwe Hermannd1107642007-08-29 17:52:32 +00009 *
Stefan Reinauerce532972007-05-23 17:20:56 +000010 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
Ollie Lho184a4042005-11-26 21:55:36 +000014 *
Stefan Reinauerce532972007-05-23 17:20:56 +000015 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
Ollie Lho184a4042005-11-26 21:55:36 +000019 *
Stefan Reinauerce532972007-05-23 17:20:56 +000020 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
Uwe Hermannd1107642007-08-29 17:52:32 +000022 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Ollie Lho184a4042005-11-26 21:55:36 +000023 */
24
25#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000026#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000027#include "chipdrivers.h"
Ollie Lho184a4042005-11-26 21:55:36 +000028
Uwe Hermannfc425e82008-03-16 02:06:25 +000029/**
Uwe Hermanna9720402009-05-21 15:55:46 +000030 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000031 *
Stefan Tauner0554ca52013-07-25 22:54:25 +000032 * Please keep the list sorted by vendor name and chip family, so that the output of 'flashrom -L' is roughly
33 * alphabetically sorted. Within families keep them in order of density.
Uwe Hermannfc425e82008-03-16 02:06:25 +000034 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000035const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000036
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000037 /*
38 * .vendor = Vendor name
39 * .name = Chip name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000048 * .block_erasers[] = Array of erase layouts and erase functions
49 * {
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
52 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000053 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000055 * .write = Chip write function
56 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000057 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000058 */
59
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000060 {
61 .vendor = "AMD",
Uwe Hermanna8b37272009-06-19 15:54:39 +000062 .name = "Am29F010A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 .bustype = BUS_PARALLEL,
Uwe Hermanna8b37272009-06-19 15:54:39 +000064 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000065 .model_id = AMD_AM29F010B, /* Same as Am29F010A */
Uwe Hermanna8b37272009-06-19 15:54:39 +000066 .total_size = 128,
67 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000068 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000069 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +000070 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000071 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000072 .block_erasers =
73 {
74 {
75 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000076 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000077 }, {
78 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000079 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000080 },
81 },
Sean Nelson35727f72010-01-28 23:55:12 +000082 .write = write_jedec_1,
Uwe Hermanna8b37272009-06-19 15:54:39 +000083 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000084 .voltage = {4500, 5500},
Uwe Hermanna8b37272009-06-19 15:54:39 +000085 },
86
87 {
88 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000089 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000090 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000091 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000092 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000093 .total_size = 256,
94 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000095 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000096 .tested = TEST_UNTESTED,
97 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000098 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000099 .block_erasers =
100 {
101 {
102 .eraseblocks = {
103 {16 * 1024, 1},
104 {8 * 1024, 2},
105 {32 * 1024, 1},
106 {64 * 1024, 3},
107 },
108 .block_erase = erase_sector_jedec,
109 }, {
110 .eraseblocks = { {256 * 1024, 1} },
111 .block_erase = erase_chip_block_jedec,
112 },
113 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000114 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000115 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000116 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000117 },
118
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000119 {
120 .vendor = "AMD",
121 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000122 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000124 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000125 .total_size = 256,
126 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000127 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000129 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000130 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000131 .block_erasers =
132 {
133 {
134 .eraseblocks = {
135 {64 * 1024, 3},
136 {32 * 1024, 1},
137 {8 * 1024, 2},
138 {16 * 1024, 1},
139 },
140 .block_erase = erase_sector_jedec,
141 }, {
142 .eraseblocks = { {256 * 1024, 1} },
143 .block_erase = erase_chip_block_jedec,
144 },
145 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000146 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000147 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000148 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000149 },
150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000151 {
152 .vendor = "AMD",
153 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000154 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000155 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000156 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000157 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000158 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000159 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000160 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000161 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000162 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000163 .block_erasers =
164 {
165 {
166 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000167 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000168 }, {
169 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000170 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000171 },
172 },
Sean Nelson35727f72010-01-28 23:55:12 +0000173 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000174 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000175 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000176 },
177
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000178 {
179 .vendor = "AMD",
180 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000181 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000182 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000183 .model_id = AMD_AM29F040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000184 .total_size = 512,
185 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187 .tested = TEST_UNTESTED,
188 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000189 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000190 .block_erasers =
191 {
192 {
193 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000195 }, {
196 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000197 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000198 },
199 },
Sean Nelson35727f72010-01-28 23:55:12 +0000200 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000201 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000202 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000203 },
204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000205 {
206 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000207 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000208 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000209 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000210 .model_id = AMD_AM29F080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000211 .total_size = 1024,
212 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000213 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000216 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000217 .block_erasers =
218 {
219 {
220 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000221 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000222 }, {
223 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000224 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000225 },
226 },
Sean Nelson35727f72010-01-28 23:55:12 +0000227 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000228 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000229 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000230 },
231
232 {
233 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000234 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000235 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000236 .manufacture_id = AMD_ID,
237 .model_id = AMD_AM29LV001BB,
238 .total_size = 128,
239 .page_size = 64 * 1024, /* unused */
240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_OK_PREW,
242 .probe = probe_jedec,
243 .probe_timing = TIMING_ZERO,
244 .block_erasers =
245 {
246 {
247 .eraseblocks = {
248 {8 * 1024, 1},
249 {4 * 1024, 2},
250 {16 * 1024, 7},
251 },
252 .block_erase = erase_sector_jedec,
253 }, {
254 .eraseblocks = { {128 * 1024, 1} },
255 .block_erase = erase_chip_block_jedec,
256 },
257 },
258 .write = write_jedec_1,
259 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000260 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000261 },
262
263 {
264 .vendor = "AMD",
265 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000266 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000267 .manufacture_id = AMD_ID,
268 .model_id = AMD_AM29LV001BT,
269 .total_size = 128,
270 .page_size = 64 * 1024, /* unused */
271 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272 .tested = TEST_UNTESTED,
273 .probe = probe_jedec,
274 .probe_timing = TIMING_ZERO,
275 .block_erasers =
276 {
277 {
278 .eraseblocks = {
279 {16 * 1024, 7},
280 {4 * 1024, 2},
281 {8 * 1024, 1},
282 },
283 .block_erase = erase_sector_jedec,
284 }, {
285 .eraseblocks = { {128 * 1024, 1} },
286 .block_erase = erase_chip_block_jedec,
287 },
288 },
289 .write = write_jedec_1,
290 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000291 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000292 },
293
294 {
295 .vendor = "AMD",
296 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000297 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000298 .manufacture_id = AMD_ID,
299 .model_id = AMD_AM29LV002BB,
300 .total_size = 256,
301 .page_size = 64 * 1024, /* unused */
302 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303 .tested = TEST_UNTESTED,
304 .probe = probe_jedec,
305 .probe_timing = TIMING_ZERO,
306 .block_erasers =
307 {
308 {
309 .eraseblocks = {
310 {16 * 1024, 1},
311 {8 * 1024, 2},
312 {32 * 1024, 1},
313 {64 * 1024, 3},
314 },
315 .block_erase = erase_sector_jedec,
316 }, {
317 .eraseblocks = { {256 * 1024, 1} },
318 .block_erase = erase_chip_block_jedec,
319 },
320 },
321 .write = write_jedec_1,
322 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000323 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000324 },
325
326 {
327 .vendor = "AMD",
328 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000329 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000330 .manufacture_id = AMD_ID,
331 .model_id = AMD_AM29LV002BT,
332 .total_size = 256,
333 .page_size = 64 * 1024, /* unused */
334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335 .tested = TEST_UNTESTED,
336 .probe = probe_jedec,
337 .probe_timing = TIMING_ZERO,
338 .block_erasers =
339 {
340 {
341 .eraseblocks = {
342 {64 * 1024, 3},
343 {32 * 1024, 1},
344 {8 * 1024, 2},
345 {16 * 1024, 1},
346 },
347 .block_erase = erase_sector_jedec,
348 }, {
349 .eraseblocks = { {256 * 1024, 1} },
350 .block_erase = erase_chip_block_jedec,
351 },
352 },
353 .write = write_jedec_1,
354 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000355 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000356 },
357
358 {
359 .vendor = "AMD",
360 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000361 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000362 .manufacture_id = AMD_ID,
363 .model_id = AMD_AM29LV004BB,
364 .total_size = 512,
365 .page_size = 64 * 1024, /* unused */
366 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367 .tested = TEST_UNTESTED,
368 .probe = probe_jedec,
369 .probe_timing = TIMING_ZERO,
370 .block_erasers =
371 {
372 {
373 .eraseblocks = {
374 {16 * 1024, 1},
375 {8 * 1024, 2},
376 {32 * 1024, 1},
377 {64 * 1024, 7},
378 },
379 .block_erase = erase_sector_jedec,
380 }, {
381 .eraseblocks = { {512 * 1024, 1} },
382 .block_erase = erase_chip_block_jedec,
383 },
384 },
385 .write = write_jedec_1,
386 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000387 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000388 },
389
390 {
391 .vendor = "AMD",
392 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000393 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000394 .manufacture_id = AMD_ID,
395 .model_id = AMD_AM29LV004BT,
396 .total_size = 512,
397 .page_size = 64 * 1024, /* unused */
398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399 .tested = TEST_UNTESTED,
400 .probe = probe_jedec,
401 .probe_timing = TIMING_ZERO,
402 .block_erasers =
403 {
404 {
405 .eraseblocks = {
406 {64 * 1024, 7},
407 {32 * 1024, 1},
408 {8 * 1024, 2},
409 {16 * 1024, 1},
410 },
411 .block_erase = erase_sector_jedec,
412 }, {
413 .eraseblocks = { {512 * 1024, 1} },
414 .block_erase = erase_chip_block_jedec,
415 },
416 },
417 .write = write_jedec_1,
418 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000419 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000420 },
421
422 {
423 .vendor = "AMD",
424 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000425 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000426 .manufacture_id = AMD_ID,
427 .model_id = AMD_AM29LV008BB,
428 .total_size = 1024,
429 .page_size = 64 * 1024, /* unused */
430 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000431 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000432 .probe = probe_jedec,
433 .probe_timing = TIMING_ZERO,
434 .block_erasers =
435 {
436 {
437 .eraseblocks = {
438 {16 * 1024, 1},
439 {8 * 1024, 2},
440 {32 * 1024, 1},
441 {64 * 1024, 15},
442 },
443 .block_erase = erase_sector_jedec,
444 }, {
445 .eraseblocks = { {1024 * 1024, 1} },
446 .block_erase = erase_chip_block_jedec,
447 },
448 },
449 .write = write_jedec_1,
450 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000451 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000452 },
453
454 {
455 .vendor = "AMD",
456 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000457 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000458 .manufacture_id = AMD_ID,
459 .model_id = AMD_AM29LV008BT,
460 .total_size = 1024,
461 .page_size = 64 * 1024, /* unused */
462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463 .tested = TEST_UNTESTED,
464 .probe = probe_jedec,
465 .probe_timing = TIMING_ZERO,
466 .block_erasers =
467 {
468 {
469 .eraseblocks = {
470 {64 * 1024, 15},
471 {32 * 1024, 1},
472 {8 * 1024, 2},
473 {16 * 1024, 1},
474 },
475 .block_erase = erase_sector_jedec,
476 }, {
477 .eraseblocks = { {1024 * 1024, 1} },
478 .block_erase = erase_chip_block_jedec,
479 },
480 },
481 .write = write_jedec_1,
482 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000483 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000484 },
485
486 {
487 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000488 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000489 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000490 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000491 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000492 .total_size = 512,
493 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000495 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000496 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000497 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000498 .block_erasers =
499 {
500 {
501 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000502 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000503 }, {
504 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000505 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000506 },
507 },
Sean Nelson35727f72010-01-28 23:55:12 +0000508 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000509 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000510 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000511 },
512
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000513 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000514 .vendor = "AMD",
515 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000516 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000517 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000518 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000519 .total_size = 1024,
520 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000522 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000523 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000524 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000525 .block_erasers =
526 {
527 {
528 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000529 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000530 }, {
531 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000532 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000533 },
534 },
Sean Nelson35727f72010-01-28 23:55:12 +0000535 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000536 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000537 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000538 },
539
540 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000541 .vendor = "AMIC",
542 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000543 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000544 .manufacture_id = AMIC_ID,
545 .model_id = AMIC_A25L05PT,
546 .total_size = 64,
547 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000548 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000549 .tested = TEST_UNTESTED,
550 .probe = probe_spi_rdid4,
551 .probe_timing = TIMING_ZERO,
552 .block_erasers =
553 {
554 {
555 .eraseblocks = {
556 {32 * 1024, 1},
557 {16 * 1024, 1},
558 {8 * 1024, 1},
559 {4 * 1024, 2},
560 },
561 .block_erase = spi_block_erase_d8,
562 }, {
563 .eraseblocks = { {64 * 1024, 1} },
564 .block_erase = spi_block_erase_c7,
565 }
566 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000567 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000568 .unlock = spi_disable_blockprotect,
569 .write = spi_chip_write_256,
570 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000571 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000572 },
573
574 {
575 .vendor = "AMIC",
576 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000577 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000578 .manufacture_id = AMIC_ID,
579 .model_id = AMIC_A25L05PU,
580 .total_size = 64,
581 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000582 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000583 .tested = TEST_UNTESTED,
584 .probe = probe_spi_rdid4,
585 .probe_timing = TIMING_ZERO,
586 .block_erasers =
587 {
588 {
589 .eraseblocks = {
590 {4 * 1024, 2},
591 {8 * 1024, 1},
592 {16 * 1024, 1},
593 {32 * 1024, 1},
594 },
595 .block_erase = spi_block_erase_d8,
596 }, {
597 .eraseblocks = { {64 * 1024, 1} },
598 .block_erase = spi_block_erase_c7,
599 }
600 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000601 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000602 .unlock = spi_disable_blockprotect,
603 .write = spi_chip_write_256,
604 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000605 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000606 },
607
608 {
609 .vendor = "AMIC",
610 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000611 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000612 .manufacture_id = AMIC_ID,
613 .model_id = AMIC_A25L10PT,
614 .total_size = 128,
615 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000616 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000617 .tested = TEST_UNTESTED,
618 .probe = probe_spi_rdid4,
619 .probe_timing = TIMING_ZERO,
620 .block_erasers =
621 {
622 {
623 .eraseblocks = {
624 {64 * 1024, 1},
625 {32 * 1024, 1},
626 {16 * 1024, 1},
627 {8 * 1024, 1},
628 {4 * 1024, 2},
629 },
630 .block_erase = spi_block_erase_d8,
631 }, {
632 .eraseblocks = { {128 * 1024, 1} },
633 .block_erase = spi_block_erase_c7,
634 }
635 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000636 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000637 .unlock = spi_disable_blockprotect,
638 .write = spi_chip_write_256,
639 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000640 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000641 },
642
643 {
644 .vendor = "AMIC",
645 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000646 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000647 .manufacture_id = AMIC_ID,
648 .model_id = AMIC_A25L10PU,
649 .total_size = 128,
650 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000651 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000652 .tested = TEST_UNTESTED,
653 .probe = probe_spi_rdid4,
654 .probe_timing = TIMING_ZERO,
655 .block_erasers =
656 {
657 {
658 .eraseblocks = {
659 {4 * 1024, 2},
660 {8 * 1024, 1},
661 {16 * 1024, 1},
662 {32 * 1024, 1},
663 {64 * 1024, 1},
664 },
665 .block_erase = spi_block_erase_d8,
666 }, {
667 .eraseblocks = { {128 * 1024, 1} },
668 .block_erase = spi_block_erase_c7,
669 }
670 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000671 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000672 .unlock = spi_disable_blockprotect,
673 .write = spi_chip_write_256,
674 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000675 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000676 },
677
678 {
679 .vendor = "AMIC",
680 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000681 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000682 .manufacture_id = AMIC_ID,
683 .model_id = AMIC_A25L20PT,
684 .total_size = 256,
685 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000686 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000687 .tested = TEST_UNTESTED,
688 .probe = probe_spi_rdid4,
689 .probe_timing = TIMING_ZERO,
690 .block_erasers =
691 {
692 {
693 .eraseblocks = {
694 {64 * 1024, 3},
695 {32 * 1024, 1},
696 {16 * 1024, 1},
697 {8 * 1024, 1},
698 {4 * 1024, 2},
699 },
700 .block_erase = spi_block_erase_d8,
701 }, {
702 .eraseblocks = { {256 * 1024, 1} },
703 .block_erase = spi_block_erase_c7,
704 }
705 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000706 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000710 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000711 },
712
713 {
714 .vendor = "AMIC",
715 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000716 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000717 .manufacture_id = AMIC_ID,
718 .model_id = AMIC_A25L20PU,
719 .total_size = 256,
720 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000721 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000722 .tested = TEST_UNTESTED,
723 .probe = probe_spi_rdid4,
724 .probe_timing = TIMING_ZERO,
725 .block_erasers =
726 {
727 {
728 .eraseblocks = {
729 {4 * 1024, 2},
730 {8 * 1024, 1},
731 {16 * 1024, 1},
732 {32 * 1024, 1},
733 {64 * 1024, 3},
734 },
735 .block_erase = spi_block_erase_d8,
736 }, {
737 .eraseblocks = { {256 * 1024, 1} },
738 .block_erase = spi_block_erase_c7,
739 }
740 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000741 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000742 .unlock = spi_disable_blockprotect,
743 .write = spi_chip_write_256,
744 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000745 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000746 },
747
748 /* The A25L40P{T,U} chips are distinguished by their
749 * erase block layouts, but without any distinction in RDID.
750 * This inexplicable quirk was verified by Rudolf Marek
751 * and discussed on the flashrom mailing list on 2010-07-12.
752 */
753 {
754 .vendor = "AMIC",
755 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000756 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000757 .manufacture_id = AMIC_ID,
758 .model_id = AMIC_A25L40PT,
759 .total_size = 512,
760 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000761 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000762 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000763 .probe = probe_spi_rdid4,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = {
769 {64 * 1024, 7},
770 {32 * 1024, 1},
771 {16 * 1024, 1},
772 {8 * 1024, 1},
773 {4 * 1024, 2},
774 },
775 .block_erase = spi_block_erase_d8,
776 }, {
777 .eraseblocks = { {512 * 1024, 1} },
778 .block_erase = spi_block_erase_c7,
779 }
780 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000781 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000782 .unlock = spi_disable_blockprotect,
783 .write = spi_chip_write_256,
784 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000785 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000786 },
787
788 {
789 .vendor = "AMIC",
790 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000792 .manufacture_id = AMIC_ID,
793 .model_id = AMIC_A25L40PU,
794 .total_size = 512,
795 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000796 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000797 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000798 .probe = probe_spi_rdid4,
799 .probe_timing = TIMING_ZERO,
800 .block_erasers =
801 {
802 {
803 .eraseblocks = {
804 {4 * 1024, 2},
805 {8 * 1024, 1},
806 {16 * 1024, 1},
807 {32 * 1024, 1},
808 {64 * 1024, 7},
809 },
810 .block_erase = spi_block_erase_d8,
811 }, {
812 .eraseblocks = { {512 * 1024, 1} },
813 .block_erase = spi_block_erase_c7,
814 }
815 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000816 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000817 .unlock = spi_disable_blockprotect,
818 .write = spi_chip_write_256,
819 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000820 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000821 },
822
823 {
824 .vendor = "AMIC",
825 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000826 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000827 .manufacture_id = AMIC_ID,
828 .model_id = AMIC_A25L80P,
829 .total_size = 1024,
830 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000831 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000832 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000833 .probe = probe_spi_rdid4,
834 .probe_timing = TIMING_ZERO,
835 .block_erasers =
836 {
837 {
838 .eraseblocks = {
839 {4 * 1024, 2},
840 {8 * 1024, 1},
841 {16 * 1024, 1},
842 {32 * 1024, 1},
843 {64 * 1024, 15},
844 },
845 .block_erase = spi_block_erase_d8,
846 }, {
847 .eraseblocks = { {1024 * 1024, 1} },
848 .block_erase = spi_block_erase_c7,
849 }
850 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000851 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000852 .unlock = spi_disable_blockprotect,
853 .write = spi_chip_write_256,
854 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000855 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000856 },
857
858 {
859 .vendor = "AMIC",
860 .name = "A25L16PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000861 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000862 .manufacture_id = AMIC_ID,
863 .model_id = AMIC_A25L16PT,
864 .total_size = 2048,
865 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000866 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000867 .tested = TEST_UNTESTED,
868 .probe = probe_spi_rdid4,
869 .probe_timing = TIMING_ZERO,
870 .block_erasers =
871 {
872 {
873 .eraseblocks = {
874 {64 * 1024, 31},
875 {32 * 1024, 1},
876 {16 * 1024, 1},
877 {8 * 1024, 1},
878 {4 * 1024, 2},
879 },
880 .block_erase = spi_block_erase_d8,
881 }, {
882 .eraseblocks = { {2048 * 1024, 1} },
883 .block_erase = spi_block_erase_60,
884 }, {
885 .eraseblocks = { {2048 * 1024, 1} },
886 .block_erase = spi_block_erase_c7,
887 }
888 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000889 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000890 .unlock = spi_disable_blockprotect,
891 .write = spi_chip_write_256,
892 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000893 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000894 },
895
896 {
897 .vendor = "AMIC",
898 .name = "A25L16PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000899 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000900 .manufacture_id = AMIC_ID,
901 .model_id = AMIC_A25L16PU,
902 .total_size = 2048,
903 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000904 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000905 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000906 .probe = probe_spi_rdid4,
907 .probe_timing = TIMING_ZERO,
908 .block_erasers =
909 {
910 {
911 .eraseblocks = {
912 {4 * 1024, 2},
913 {8 * 1024, 1},
914 {16 * 1024, 1},
915 {32 * 1024, 1},
916 {64 * 1024, 31},
917 },
918 .block_erase = spi_block_erase_d8,
919 }, {
920 .eraseblocks = { {2048 * 1024, 1} },
921 .block_erase = spi_block_erase_60,
922 }, {
923 .eraseblocks = { {2048 * 1024, 1} },
924 .block_erase = spi_block_erase_c7,
925 }
926 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000927 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000928 .unlock = spi_disable_blockprotect,
929 .write = spi_chip_write_256,
930 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000931 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000932 },
933
934 {
935 .vendor = "AMIC",
Dan Lenski11617122010-07-29 15:00:40 +0000936 .name = "A25L512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000937 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000938 .manufacture_id = AMIC_ID_NOPREFIX,
939 .model_id = AMIC_A25L512,
940 .total_size = 64,
941 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000942 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000943 .tested = TEST_UNTESTED,
944 .probe = probe_spi_rdid,
945 .probe_timing = TIMING_ZERO,
946 .block_erasers =
947 {
948 {
949 .eraseblocks = { { 4 * 1024, 16 } },
950 .block_erase = spi_block_erase_20,
951 }, {
952 .eraseblocks = { { 64 * 1024, 1 } },
953 .block_erase = spi_block_erase_d8,
954 }, {
955 .eraseblocks = { { 64 * 1024, 1 } },
956 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000957 }
Dan Lenski11617122010-07-29 15:00:40 +0000958 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000959 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +0000960 .unlock = spi_disable_blockprotect,
961 .write = spi_chip_write_256,
962 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000963 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000964 },
965
966 {
967 .vendor = "AMIC",
968 .name = "A25L010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000969 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +0000970 .manufacture_id = AMIC_ID_NOPREFIX,
971 .model_id = AMIC_A25L010,
972 .total_size = 128,
973 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +0000974 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +0000975 .tested = TEST_UNTESTED,
976 .probe = probe_spi_rdid,
977 .probe_timing = TIMING_ZERO,
978 .block_erasers =
979 {
980 {
981 .eraseblocks = { { 4 * 1024, 32 } },
982 .block_erase = spi_block_erase_20,
983 }, {
984 .eraseblocks = { { 64 * 1024, 2 } },
985 .block_erase = spi_block_erase_d8,
986 }, {
987 .eraseblocks = { { 128 * 1024, 1 } },
988 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +0000989 }
Dan Lenski11617122010-07-29 15:00:40 +0000990 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000991 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +0000992 .unlock = spi_disable_blockprotect,
993 .write = spi_chip_write_256,
994 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000995 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +0000996 },
997
998 {
999 .vendor = "AMIC",
1000 .name = "A25L020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001001 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001002 .manufacture_id = AMIC_ID_NOPREFIX,
1003 .model_id = AMIC_A25L020,
1004 .total_size = 256,
1005 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001006 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001007 .tested = TEST_UNTESTED,
1008 .probe = probe_spi_rdid,
1009 .probe_timing = TIMING_ZERO,
1010 .block_erasers =
1011 {
1012 {
1013 .eraseblocks = { { 4 * 1024, 64 } },
1014 .block_erase = spi_block_erase_20,
1015 }, {
1016 .eraseblocks = { { 64 * 1024, 4 } },
1017 .block_erase = spi_block_erase_d8,
1018 }, {
1019 .eraseblocks = { { 256 * 1024, 1 } },
1020 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001021 }
Dan Lenski11617122010-07-29 15:00:40 +00001022 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001023 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001027 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001028 },
1029
1030 {
1031 .vendor = "AMIC",
1032 .name = "A25L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001033 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001034 .manufacture_id = AMIC_ID_NOPREFIX,
1035 .model_id = AMIC_A25L040,
1036 .total_size = 512,
1037 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001038 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = { { 4 * 1024, 128 } },
1046 .block_erase = spi_block_erase_20,
1047 }, {
1048 .eraseblocks = { { 64 * 1024, 8 } },
1049 .block_erase = spi_block_erase_d8,
1050 }, {
1051 .eraseblocks = { { 512 * 1024, 1 } },
1052 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001053 }
Dan Lenski11617122010-07-29 15:00:40 +00001054 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001055 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001056 .unlock = spi_disable_blockprotect,
1057 .write = spi_chip_write_256,
1058 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001059 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001060 },
1061
1062 {
1063 .vendor = "AMIC",
1064 .name = "A25L080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001065 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001066 .manufacture_id = AMIC_ID_NOPREFIX,
1067 .model_id = AMIC_A25L080,
1068 .total_size = 1024,
1069 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001070 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001071 .tested = TEST_UNTESTED,
1072 .probe = probe_spi_rdid,
1073 .probe_timing = TIMING_ZERO,
1074 .block_erasers =
1075 {
1076 {
1077 .eraseblocks = { { 4 * 1024, 256 } },
1078 .block_erase = spi_block_erase_20,
1079 }, {
1080 .eraseblocks = { { 64 * 1024, 16 } },
1081 .block_erase = spi_block_erase_d8,
1082 }, {
1083 .eraseblocks = { { 1024 * 1024, 1 } },
1084 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001085 }
Dan Lenski11617122010-07-29 15:00:40 +00001086 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001087 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001088 .unlock = spi_disable_blockprotect,
1089 .write = spi_chip_write_256,
1090 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001091 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001092 },
1093
1094 {
1095 .vendor = "AMIC",
1096 .name = "A25L016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001097 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001098 .manufacture_id = AMIC_ID_NOPREFIX,
1099 .model_id = AMIC_A25L016,
1100 .total_size = 2048,
1101 .page_size = 256,
David Hendricks6c51cfd2010-09-03 03:32:22 +00001102 .feature_bits = FEATURE_WRSR_WREN,
Dan Lenski11617122010-07-29 15:00:40 +00001103 .tested = TEST_UNTESTED,
1104 .probe = probe_spi_rdid,
1105 .probe_timing = TIMING_ZERO,
1106 .block_erasers =
1107 {
1108 {
1109 .eraseblocks = { { 4 * 1024, 512 } },
1110 .block_erase = spi_block_erase_20,
1111 }, {
1112 .eraseblocks = { { 64 * 1024, 32 } },
1113 .block_erase = spi_block_erase_d8,
1114 }, {
1115 .eraseblocks = { { 2048 * 1024, 1 } },
1116 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001117 }
Dan Lenski11617122010-07-29 15:00:40 +00001118 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001119 .printlock = spi_prettyprint_status_register_bp2_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001120 .unlock = spi_disable_blockprotect,
1121 .write = spi_chip_write_256,
1122 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001123 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001124 },
1125
1126 {
1127 .vendor = "AMIC",
1128 .name = "A25L032",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001129 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001130 .manufacture_id = AMIC_ID_NOPREFIX,
1131 .model_id = AMIC_A25L032,
1132 .total_size = 4096,
1133 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001134 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001136 .tested = TEST_OK_PREW,
Dan Lenski11617122010-07-29 15:00:40 +00001137 .probe = probe_spi_rdid,
1138 .probe_timing = TIMING_ZERO,
1139 .block_erasers =
1140 {
1141 {
1142 .eraseblocks = { { 4 * 1024, 1024 } },
1143 .block_erase = spi_block_erase_20,
1144 }, {
1145 .eraseblocks = { { 64 * 1024, 64 } },
1146 .block_erase = spi_block_erase_52,
1147 }, {
1148 .eraseblocks = { { 64 * 1024, 64 } },
1149 .block_erase = spi_block_erase_d8,
1150 }, {
1151 .eraseblocks = { { 4096 * 1024, 1 } },
1152 .block_erase = spi_block_erase_60,
1153 }, {
1154 .eraseblocks = { { 4096 * 1024, 1 } },
1155 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001156 }
Dan Lenski11617122010-07-29 15:00:40 +00001157 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001158 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1159 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001160 .write = spi_chip_write_256,
1161 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001162 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001163 },
1164
1165 {
1166 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001167 .name = "A25LQ16",
1168 .bustype = BUS_SPI,
1169 .manufacture_id = AMIC_ID_NOPREFIX,
1170 .model_id = AMIC_A25LQ16,
1171 .total_size = 2048,
1172 .page_size = 256,
1173 /* supports SFDP */
1174 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1176 .tested = TEST_UNTESTED,
1177 .probe = probe_spi_rdid,
1178 .probe_timing = TIMING_ZERO,
1179 .block_erasers = {
1180 {
1181 .eraseblocks = { { 4 * 1024, 512 } },
1182 .block_erase = spi_block_erase_20,
1183 }, {
1184 .eraseblocks = { { 64 * 1024, 32 } },
1185 .block_erase = spi_block_erase_52,
1186 }, {
1187 .eraseblocks = { { 64 * 1024, 32 } },
1188 .block_erase = spi_block_erase_d8,
1189 }, {
1190 .eraseblocks = { { 2048 * 1024, 1 } },
1191 .block_erase = spi_block_erase_60,
1192 }, {
1193 .eraseblocks = { { 2048 * 1024, 1 } },
1194 .block_erase = spi_block_erase_c7,
1195 }
1196 },
1197 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1198 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1199 .write = spi_chip_write_256,
1200 .read = spi_chip_read,
1201 .voltage = {2700, 3600},
1202 },
1203
1204 {
1205 .vendor = "AMIC",
1206 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001207 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001208 .manufacture_id = AMIC_ID_NOPREFIX,
1209 .model_id = AMIC_A25LQ032,
1210 .total_size = 4096,
1211 .page_size = 256,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001212 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001213 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Dan Lenski11617122010-07-29 15:00:40 +00001215 .tested = TEST_UNTESTED,
1216 .probe = probe_spi_rdid,
1217 .probe_timing = TIMING_ZERO,
1218 .block_erasers =
1219 {
1220 {
1221 .eraseblocks = { { 4 * 1024, 1024 } },
1222 .block_erase = spi_block_erase_20,
1223 }, {
1224 .eraseblocks = { { 64 * 1024, 64 } },
1225 .block_erase = spi_block_erase_52,
1226 }, {
1227 .eraseblocks = { { 64 * 1024, 64 } },
1228 .block_erase = spi_block_erase_d8,
1229 }, {
1230 .eraseblocks = { { 4096 * 1024, 1 } },
1231 .block_erase = spi_block_erase_60,
1232 }, {
1233 .eraseblocks = { { 4096 * 1024, 1 } },
1234 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001235 }
Dan Lenski11617122010-07-29 15:00:40 +00001236 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001237 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1238 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1239 .write = spi_chip_write_256,
1240 .read = spi_chip_read,
1241 .voltage = {2700, 3600},
1242 },
1243
1244 {
1245 .vendor = "AMIC",
1246 .name = "A25LQ64",
1247 .bustype = BUS_SPI,
1248 .manufacture_id = AMIC_ID_NOPREFIX,
1249 .model_id = AMIC_A25LQ032,
1250 .total_size = 8192,
1251 .page_size = 256,
1252 /* supports SFDP */
1253 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1254 /* QPI enable 0x35, disable 0xF5 */
1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1256 .tested = TEST_UNTESTED,
1257 .probe = probe_spi_rdid,
1258 .probe_timing = TIMING_ZERO,
1259 .block_erasers =
1260 {
1261 {
1262 .eraseblocks = { { 4 * 1024, 2048 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 32 * 1024, 256 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 128 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 8192 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 8192 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
1276 }
1277 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001278 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001279 .unlock = spi_disable_blockprotect,
Dan Lenski11617122010-07-29 15:00:40 +00001280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001282 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001283 },
1284
1285 {
1286 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001287 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001288 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A29002B,
1291 .total_size = 256,
1292 .page_size = 64 * 1024,
1293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1294 .tested = TEST_UNTESTED,
1295 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001296 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001297 .block_erasers =
1298 {
1299 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001300 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001301 {16 * 1024, 1},
1302 {8 * 1024, 2},
1303 {32 * 1024, 1},
1304 {64 * 1024, 3},
1305 },
1306 .block_erase = erase_sector_jedec,
1307 }, {
1308 .eraseblocks = { {256 * 1024, 1} },
1309 .block_erase = erase_chip_block_jedec,
1310 },
1311 },
1312 .write = write_jedec_1,
1313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001314 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001315 },
1316
1317 {
1318 .vendor = "AMIC",
1319 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001320 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001321 .manufacture_id = AMIC_ID_NOPREFIX,
1322 .model_id = AMIC_A29002T,
1323 .total_size = 256,
1324 .page_size = 64 * 1024,
1325 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001326 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001327 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001328 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001329 .block_erasers =
1330 {
1331 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001332 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001333 {64 * 1024, 3},
1334 {32 * 1024, 1},
1335 {8 * 1024, 2},
1336 {16 * 1024, 1},
1337 },
1338 .block_erase = erase_sector_jedec,
1339 }, {
1340 .eraseblocks = { {256 * 1024, 1} },
1341 .block_erase = erase_chip_block_jedec,
1342 },
1343 },
1344 .write = write_jedec_1,
1345 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001346 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001347 },
1348
1349 {
1350 .vendor = "AMIC",
1351 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001352 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001353 .manufacture_id = AMIC_ID_NOPREFIX,
1354 .model_id = AMIC_A29040B,
1355 .total_size = 512,
1356 .page_size = 64 * 1024,
1357 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001358 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001359 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001360 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001361 .block_erasers =
1362 {
1363 {
1364 .eraseblocks = { {64 * 1024, 8} },
1365 .block_erase = erase_sector_jedec,
1366 }, {
1367 .eraseblocks = { {512 * 1024, 1} },
1368 .block_erase = erase_chip_block_jedec,
1369 },
1370 },
1371 .write = write_jedec_1,
1372 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001373 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001374 },
1375
1376 {
1377 .vendor = "AMIC",
1378 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001379 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001380 .manufacture_id = AMIC_ID_NOPREFIX,
1381 .model_id = AMIC_A49LF040A,
1382 .total_size = 512,
1383 .page_size = 64 * 1024,
1384 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001385 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001386 .probe = probe_jedec,
1387 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1388 .block_erasers =
1389 {
1390 {
1391 .eraseblocks = { {64 * 1024, 8} },
1392 .block_erase = erase_block_jedec,
1393 }, {
1394 .eraseblocks = { {512 * 1024, 1} },
1395 .block_erase = erase_chip_block_jedec,
1396 }
1397 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001398 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001399 .write = write_jedec_1,
1400 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001401 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 },
1403
1404 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001405 .vendor = "Atmel",
1406 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001407 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001408 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001409 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001410 .total_size = 256,
1411 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001412 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001414 .tested = TEST_UNTESTED,
1415 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001416 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001417 .block_erasers =
1418 {
1419 {
1420 .eraseblocks = { {4 * 1024, 64} },
1421 .block_erase = spi_block_erase_20,
1422 }, {
1423 .eraseblocks = { {32 * 1024, 8} },
1424 .block_erase = spi_block_erase_52,
1425 }, {
1426 .eraseblocks = { {64 * 1024, 4} },
1427 .block_erase = spi_block_erase_d8,
1428 }, {
1429 .eraseblocks = { {256 * 1024, 1} },
1430 .block_erase = spi_block_erase_60,
1431 }, {
1432 .eraseblocks = { {256 * 1024, 1} },
1433 .block_erase = spi_block_erase_c7,
1434 }
1435 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001436 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001437 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001438 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001439 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001440 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001441 },
1442
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001443 {
1444 .vendor = "Atmel",
1445 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001446 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001447 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001448 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001449 .total_size = 512,
1450 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001451 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001452 .tested = TEST_UNTESTED,
1453 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001454 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001455 .block_erasers =
1456 {
1457 {
1458 .eraseblocks = { {4 * 1024, 128} },
1459 .block_erase = spi_block_erase_20,
1460 }, {
1461 .eraseblocks = { {32 * 1024, 16} },
1462 .block_erase = spi_block_erase_52,
1463 }, {
1464 .eraseblocks = { {64 * 1024, 8} },
1465 .block_erase = spi_block_erase_d8,
1466 }, {
1467 .eraseblocks = { {512 * 1024, 1} },
1468 .block_erase = spi_block_erase_60,
1469 }, {
1470 .eraseblocks = { {512 * 1024, 1} },
1471 .block_erase = spi_block_erase_c7,
1472 }
1473 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001474 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001475 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001476 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001477 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001478 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001479 },
1480
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001481 {
1482 .vendor = "Atmel",
1483 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001484 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001485 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001486 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001487 .total_size = 1024,
1488 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001489 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001490 .tested = TEST_UNTESTED,
1491 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001492 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001493 .block_erasers =
1494 {
1495 {
1496 .eraseblocks = { {4 * 1024, 256} },
1497 .block_erase = spi_block_erase_20,
1498 }, {
1499 .eraseblocks = { {32 * 1024, 32} },
1500 .block_erase = spi_block_erase_52,
1501 }, {
1502 .eraseblocks = { {64 * 1024, 16} },
1503 .block_erase = spi_block_erase_d8,
1504 }, {
1505 .eraseblocks = { {1024 * 1024, 1} },
1506 .block_erase = spi_block_erase_60,
1507 }, {
1508 .eraseblocks = { {1024 * 1024, 1} },
1509 .block_erase = spi_block_erase_c7,
1510 }
1511 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001512 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001513 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001514 .write = spi_chip_write_256,
1515 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001516 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 },
1518
1519 {
1520 .vendor = "Atmel",
1521 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001522 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001523 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001524 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001525 .total_size = 1024,
1526 .page_size = 256,
1527 .feature_bits = FEATURE_WRSR_WREN,
1528 .tested = TEST_UNTESTED,
1529 .probe = probe_spi_rdid,
1530 .probe_timing = TIMING_ZERO,
1531 .block_erasers =
1532 {
1533 {
1534 .eraseblocks = { {4 * 1024, 256} },
1535 .block_erase = spi_block_erase_20,
1536 }, {
1537 .eraseblocks = { {32 * 1024, 32} },
1538 .block_erase = spi_block_erase_52,
1539 }, {
1540 .eraseblocks = { {64 * 1024, 16} },
1541 .block_erase = spi_block_erase_d8,
1542 }, {
1543 .eraseblocks = { {1024 * 1024, 1} },
1544 .block_erase = spi_block_erase_60,
1545 }, {
1546 .eraseblocks = { {1024 * 1024, 1} },
1547 .block_erase = spi_block_erase_c7,
1548 }
1549 },
1550 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001551 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001552 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001553 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001554 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001555 },
1556
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001557 {
1558 .vendor = "Atmel",
1559 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001560 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001561 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001562 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001563 .total_size = 2048,
1564 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001565 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner2abab942012-04-27 20:41:23 +00001566 .tested = TEST_OK_PROBE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001568 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001569 .block_erasers =
1570 {
1571 {
1572 .eraseblocks = { {4 * 1024, 512} },
1573 .block_erase = spi_block_erase_20,
1574 }, {
1575 .eraseblocks = { {32 * 1024, 64} },
1576 .block_erase = spi_block_erase_52,
1577 }, {
1578 .eraseblocks = { {64 * 1024, 32} },
1579 .block_erase = spi_block_erase_d8,
1580 }, {
1581 .eraseblocks = { {2 * 1024 * 1024, 1} },
1582 .block_erase = spi_block_erase_60,
1583 }, {
1584 .eraseblocks = { {2 * 1024 * 1024, 1} },
1585 .block_erase = spi_block_erase_c7,
1586 }
1587 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001588 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001589 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001590 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001591 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001592 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001593 },
1594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001595 {
1596 .vendor = "Atmel",
1597 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001600 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 .total_size = 4096,
1602 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001603 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001604 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001606 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001607 .block_erasers =
1608 {
1609 {
1610 .eraseblocks = { {4 * 1024, 1024} },
1611 .block_erase = spi_block_erase_20,
1612 }, {
1613 .eraseblocks = { {32 * 1024, 128} },
1614 .block_erase = spi_block_erase_52,
1615 }, {
1616 .eraseblocks = { {64 * 1024, 64} },
1617 .block_erase = spi_block_erase_d8,
1618 }, {
1619 .eraseblocks = { {4 * 1024 * 1024, 1} },
1620 .block_erase = spi_block_erase_60,
1621 }, {
1622 .eraseblocks = { {4 * 1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_c7,
1624 }
1625 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001626 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001627 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001628 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001629 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001630 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001631 },
1632
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001633 {
1634 .vendor = "Atmel",
1635 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001636 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001637 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001638 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001639 .total_size = 4096,
1640 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001641 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001644 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001645 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001646 .block_erasers =
1647 {
1648 {
1649 .eraseblocks = { {4 * 1024, 1024} },
1650 .block_erase = spi_block_erase_20,
1651 }, {
1652 .eraseblocks = { {32 * 1024, 128} },
1653 .block_erase = spi_block_erase_52,
1654 }, {
1655 .eraseblocks = { {64 * 1024, 64} },
1656 .block_erase = spi_block_erase_d8,
1657 }, {
1658 .eraseblocks = { {4 * 1024 * 1024, 1} },
1659 .block_erase = spi_block_erase_60,
1660 }, {
1661 .eraseblocks = { {4 * 1024 * 1024, 1} },
1662 .block_erase = spi_block_erase_c7,
1663 }
1664 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001665 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001666 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001667 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001668 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001669 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001670 },
1671
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001672 {
1673 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001674 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001675 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001676 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001677 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001678 .total_size = 8192,
1679 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001680 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001681 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001682 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001683 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001684 .block_erasers =
1685 {
1686 {
1687 .eraseblocks = { {4 * 1024, 2048} },
1688 .block_erase = spi_block_erase_20,
1689 }, {
1690 .eraseblocks = { {32 * 1024, 256} },
1691 .block_erase = spi_block_erase_52,
1692 }, {
1693 .eraseblocks = { {64 * 1024, 128} },
1694 .block_erase = spi_block_erase_d8,
1695 }, {
1696 .eraseblocks = { {8 * 1024 * 1024, 1} },
1697 .block_erase = spi_block_erase_60,
1698 }, {
1699 .eraseblocks = { {8 * 1024 * 1024, 1} },
1700 .block_erase = spi_block_erase_c7,
1701 }
1702 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001703 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001704 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001705 .write = spi_chip_write_256,
1706 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001707 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001708 },
1709
1710 {
1711 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001712 .name = "AT25DL081",
1713 .bustype = BUS_SPI,
1714 .manufacture_id = ATMEL_ID,
1715 .model_id = ATMEL_AT25DF081,
1716 .total_size = 1024,
1717 .page_size = 256,
1718 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1720 .tested = TEST_UNTESTED,
1721 .probe = probe_spi_rdid,
1722 .probe_timing = TIMING_ZERO,
1723 .block_erasers =
1724 {
1725 {
1726 .eraseblocks = { {4 * 1024, 256} },
1727 .block_erase = spi_block_erase_20,
1728 }, {
1729 .eraseblocks = { {32 * 1024, 32} },
1730 .block_erase = spi_block_erase_52,
1731 }, {
1732 .eraseblocks = { {64 * 1024, 16} },
1733 .block_erase = spi_block_erase_d8,
1734 }, {
1735 .eraseblocks = { {1 * 1024 * 1024, 1} },
1736 .block_erase = spi_block_erase_60,
1737 }, {
1738 .eraseblocks = { {1 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_c7,
1740 }
1741 },
1742 .printlock = spi_prettyprint_status_register_at25df_sec,
1743 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1744 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1745 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1746 .voltage = {1650, 1950},
1747 },
1748
1749 {
1750 .vendor = "Atmel",
1751 .name = "AT25DL161",
1752 .bustype = BUS_SPI,
1753 .manufacture_id = ATMEL_ID,
1754 .model_id = ATMEL_AT25DL161,
1755 .total_size = 2048,
1756 .page_size = 256,
1757 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1758 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1759 .tested = TEST_UNTESTED,
1760 .probe = probe_spi_rdid,
1761 .probe_timing = TIMING_ZERO,
1762 .block_erasers =
1763 {
1764 {
1765 .eraseblocks = { {4 * 1024, 512} },
1766 .block_erase = spi_block_erase_20,
1767 }, {
1768 .eraseblocks = { {32 * 1024, 64} },
1769 .block_erase = spi_block_erase_52,
1770 }, {
1771 .eraseblocks = { {64 * 1024, 32} },
1772 .block_erase = spi_block_erase_d8,
1773 }, {
1774 .eraseblocks = { {2 * 1024 * 1024, 1} },
1775 .block_erase = spi_block_erase_60,
1776 }, {
1777 .eraseblocks = { {2 * 1024 * 1024, 1} },
1778 .block_erase = spi_block_erase_c7,
1779 }
1780 },
1781 .printlock = spi_prettyprint_status_register_at25df_sec,
1782 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1783 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1784 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1785 .voltage = {1650, 1950},
1786 },
1787
1788 {
1789 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001790 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001791 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001792 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001793 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001794 .total_size = 2048,
1795 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001796 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1797 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001798 .tested = TEST_UNTESTED,
1799 .probe = probe_spi_rdid,
1800 .probe_timing = TIMING_ZERO,
1801 .block_erasers =
1802 {
1803 {
1804 .eraseblocks = { {4 * 1024, 512} },
1805 .block_erase = spi_block_erase_20,
1806 }, {
1807 .eraseblocks = { {32 * 1024, 64} },
1808 .block_erase = spi_block_erase_52,
1809 }, {
1810 .eraseblocks = { {64 * 1024, 32} },
1811 .block_erase = spi_block_erase_d8,
1812 }, {
1813 .eraseblocks = { {2 * 1024 * 1024, 1} },
1814 .block_erase = spi_block_erase_60,
1815 }, {
1816 .eraseblocks = { {2 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_c7,
1818 }
1819 },
1820 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001821 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001822 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001823 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001824 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001825 },
1826
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001827 {
1828 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001829 .name = "AT25F512",
1830 .bustype = BUS_SPI,
1831 .manufacture_id = ATMEL_ID,
1832 .model_id = ATMEL_AT25F512,
1833 .total_size = 64,
1834 .page_size = 256,
1835 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001836 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001837 .probe = probe_spi_at25f,
1838 .probe_timing = TIMING_ZERO,
1839 .block_erasers =
1840 {
1841 {
1842 .eraseblocks = { {32 * 1024, 2} },
1843 .block_erase = spi_block_erase_52,
1844 }, {
1845 .eraseblocks = { {64 * 1024, 1} },
1846 .block_erase = spi_block_erase_62,
1847 }
1848 },
1849 .printlock = spi_prettyprint_status_register_at25f,
1850 .unlock = spi_disable_blockprotect_at25f,
1851 .write = spi_chip_write_256,
1852 .read = spi_chip_read,
1853 .voltage = {2700, 3600},
1854 },
1855
1856 {
1857 .vendor = "Atmel",
1858 .name = "AT25F512A",
1859 .bustype = BUS_SPI,
1860 .manufacture_id = ATMEL_ID,
1861 .model_id = ATMEL_AT25F512A,
1862 .total_size = 64,
1863 .page_size = 128,
1864 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001865 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001866 .probe = probe_spi_at25f,
1867 .probe_timing = TIMING_ZERO,
1868 .block_erasers =
1869 {
1870 {
1871 .eraseblocks = { {32 * 1024, 2} },
1872 .block_erase = spi_block_erase_52,
1873 }, {
1874 .eraseblocks = { {64 * 1024, 1} },
1875 .block_erase = spi_block_erase_62,
1876 }
1877 },
1878 .printlock = spi_prettyprint_status_register_at25f512a,
1879 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
1880 .unlock = spi_disable_blockprotect_at25f512a,
1881 .write = spi_chip_write_256,
1882 .read = spi_chip_read,
1883 .voltage = {2700, 3600},
1884 },
1885
1886 {
1887 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001888 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001889 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001890 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001891 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001892 .total_size = 64,
1893 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001894 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1895 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001896 .tested = TEST_UNTESTED,
1897 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001898 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001899 .block_erasers =
1900 {
1901 {
1902 .eraseblocks = { {4 * 1024, 16} },
1903 .block_erase = spi_block_erase_20,
1904 }, {
1905 .eraseblocks = { {32 * 1024, 2} },
1906 .block_erase = spi_block_erase_52,
1907 }, {
1908 .eraseblocks = { {32 * 1024, 2} },
1909 .block_erase = spi_block_erase_d8,
1910 }, {
1911 .eraseblocks = { {64 * 1024, 1} },
1912 .block_erase = spi_block_erase_60,
1913 }, {
1914 .eraseblocks = { {64 * 1024, 1} },
1915 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00001916 }, {
1917 .eraseblocks = { {64 * 1024, 1} },
1918 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00001919 }
1920 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00001921 .printlock = spi_prettyprint_status_register_at25f512b,
1922 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001923 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001924 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001925 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001926 },
1927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001928 {
1929 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00001930 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1931 * All other properties seem to be the same.*/
1932 .name = "AT25F1024(A)",
1933 .bustype = BUS_SPI,
1934 .manufacture_id = ATMEL_ID,
1935 .model_id = ATMEL_AT25F1024,
1936 .total_size = 128,
1937 .page_size = 256,
1938 .feature_bits = FEATURE_WRSR_WREN,
1939 .tested = TEST_OK_PREW,
1940 .probe = probe_spi_at25f,
1941 .probe_timing = TIMING_ZERO,
1942 .block_erasers =
1943 {
1944 {
1945 .eraseblocks = { {32 * 1024, 4} },
1946 .block_erase = spi_block_erase_52,
1947 }, {
1948 .eraseblocks = { {128 * 1024, 1} },
1949 .block_erase = spi_block_erase_62,
1950 }
1951 },
1952 .printlock = spi_prettyprint_status_register_at25f,
1953 .unlock = spi_disable_blockprotect_at25f,
1954 .write = spi_chip_write_256,
1955 .read = spi_chip_read,
1956 .voltage = {2700, 3600},
1957 },
1958
1959 {
1960 .vendor = "Atmel",
1961 .name = "AT25F2048",
1962 .bustype = BUS_SPI,
1963 .manufacture_id = ATMEL_ID,
1964 .model_id = ATMEL_AT25F2048,
1965 .total_size = 256,
1966 .page_size = 256,
1967 .feature_bits = FEATURE_WRSR_WREN,
1968 .tested = TEST_UNTESTED,
1969 .probe = probe_spi_at25f,
1970 .probe_timing = TIMING_ZERO,
1971 .block_erasers =
1972 {
1973 {
1974 .eraseblocks = { {64 * 1024, 4} },
1975 .block_erase = spi_block_erase_52,
1976 }, {
1977 .eraseblocks = { {256 * 1024, 1} },
1978 .block_erase = spi_block_erase_62,
1979 }
1980 },
1981 .printlock = spi_prettyprint_status_register_at25f,
1982 .unlock = spi_disable_blockprotect_at25f,
1983 .write = spi_chip_write_256,
1984 .read = spi_chip_read,
1985 .voltage = {2700, 3600},
1986 },
1987
1988 {
1989 .vendor = "Atmel",
1990 .name = "AT25F4096",
1991 .bustype = BUS_SPI,
1992 .manufacture_id = ATMEL_ID,
1993 .model_id = ATMEL_AT25F4096,
1994 .total_size = 512,
1995 .page_size = 256,
1996 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner6697f712014-08-06 15:09:15 +00001997 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00001998 .probe = probe_spi_at25f,
1999 .probe_timing = TIMING_ZERO,
2000 .block_erasers =
2001 {
2002 {
2003 .eraseblocks = { {64 * 1024, 8} },
2004 .block_erase = spi_block_erase_52,
2005 }, {
2006 .eraseblocks = { {512 * 1024, 1} },
2007 .block_erase = spi_block_erase_62,
2008 }
2009 },
2010 .printlock = spi_prettyprint_status_register_at25f4096,
Stefan Tauner278ba6e2013-06-28 21:28:27 +00002011 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2012 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002013 .write = spi_chip_write_256,
2014 .read = spi_chip_read,
2015 .voltage = {2700, 3600},
2016 },
2017
2018 {
2019 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002020 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002021 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002022 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002023 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002024 .total_size = 128,
2025 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002026 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002027 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002028 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002029 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002030 .block_erasers =
2031 {
2032 {
2033 .eraseblocks = { {4 * 1024, 32} },
2034 .block_erase = spi_block_erase_20,
2035 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002036 .eraseblocks = { {4 * 1024, 32} },
2037 .block_erase = spi_block_erase_d7,
2038 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002039 .eraseblocks = { {32 * 1024, 4} },
2040 .block_erase = spi_block_erase_52,
2041 }, {
2042 .eraseblocks = { {32 * 1024, 4} },
2043 .block_erase = spi_block_erase_d8,
2044 }, {
2045 .eraseblocks = { {128 * 1024, 1} },
2046 .block_erase = spi_block_erase_60,
2047 }, {
2048 .eraseblocks = { {128 * 1024, 1} },
2049 .block_erase = spi_block_erase_c7,
2050 }
2051 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002052 .printlock = spi_prettyprint_status_register_at25fs010,
2053 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002054 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002055 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002056 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002057 },
2058
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002059 {
2060 .vendor = "Atmel",
2061 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002062 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002063 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002064 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002065 .total_size = 512,
2066 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002067 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002068 .tested = TEST_UNTESTED,
2069 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002070 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002071 .block_erasers =
2072 {
2073 {
2074 .eraseblocks = { {4 * 1024, 128} },
2075 .block_erase = spi_block_erase_20,
2076 }, {
2077 .eraseblocks = { {64 * 1024, 8} },
2078 .block_erase = spi_block_erase_52,
2079 }, {
2080 .eraseblocks = { {64 * 1024, 8} },
2081 .block_erase = spi_block_erase_d8,
2082 }, {
2083 .eraseblocks = { {512 * 1024, 1} },
2084 .block_erase = spi_block_erase_60,
2085 }, {
2086 .eraseblocks = { {512 * 1024, 1} },
2087 .block_erase = spi_block_erase_c7,
2088 }
2089 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002090 .printlock = spi_prettyprint_status_register_at25fs040,
2091 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002092 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002093 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002094 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002095 },
2096
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002097 {
2098 .vendor = "Atmel",
2099 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002100 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002101 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002102 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002103 .total_size = 512,
2104 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002105 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002106 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002107 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002108 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002109 .block_erasers =
2110 {
2111 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002112 .eraseblocks = { {256, 2048} },
2113 .block_erase = spi_block_erase_81,
2114 }, {
2115 .eraseblocks = { {2 * 1024, 256} },
2116 .block_erase = spi_block_erase_50,
2117 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002118 .eraseblocks = { {4 * 1024, 128} },
2119 .block_erase = spi_block_erase_20,
2120 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002121 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002122 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002123 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002124 .write = spi_chip_write_1,
2125 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002126 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002127 },
2128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002129 {
2130 .vendor = "Atmel",
2131 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002132 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002133 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002134 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002135 .total_size = 1024,
2136 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002137 .feature_bits = FEATURE_WRSR_WREN,
2138 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002139 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002140 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002141 .block_erasers =
2142 {
2143 {
2144 .eraseblocks = { {4 * 1024, 256} },
2145 .block_erase = spi_block_erase_20,
2146 }, {
2147 .eraseblocks = { {32 * 1024, 32} },
2148 .block_erase = spi_block_erase_52,
2149 }, {
2150 .eraseblocks = { {64 * 1024, 16} },
2151 .block_erase = spi_block_erase_d8,
2152 }, {
2153 .eraseblocks = { {1024 * 1024, 1} },
2154 .block_erase = spi_block_erase_60,
2155 }, {
2156 .eraseblocks = { {1024 * 1024, 1} },
2157 .block_erase = spi_block_erase_c7,
2158 }
2159 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002160 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002161 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002162 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002163 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002164 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002165 },
2166
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002167 {
2168 .vendor = "Atmel",
2169 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002170 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002171 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002172 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002173 .total_size = 2048,
2174 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002175 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00002176 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002177 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002178 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002179 .block_erasers =
2180 {
2181 {
2182 .eraseblocks = { {4 * 1024, 512} },
2183 .block_erase = spi_block_erase_20,
2184 }, {
2185 .eraseblocks = { {32 * 1024, 64} },
2186 .block_erase = spi_block_erase_52,
2187 }, {
2188 .eraseblocks = { {64 * 1024, 32} },
2189 .block_erase = spi_block_erase_d8,
2190 }, {
2191 .eraseblocks = { {2 * 1024 * 1024, 1} },
2192 .block_erase = spi_block_erase_60,
2193 }, {
2194 .eraseblocks = { {2 * 1024 * 1024, 1} },
2195 .block_erase = spi_block_erase_c7,
2196 }
2197 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002198 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002199 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002200 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002201 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002202 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002203 },
2204
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002205 {
2206 .vendor = "Atmel",
2207 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002208 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002209 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002210 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002211 .total_size = 2048,
2212 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002213 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002214 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002215 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002216 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002217 .block_erasers =
2218 {
2219 {
2220 .eraseblocks = { {4 * 1024, 512} },
2221 .block_erase = spi_block_erase_20,
2222 }, {
2223 .eraseblocks = { {32 * 1024, 64} },
2224 .block_erase = spi_block_erase_52,
2225 }, {
2226 .eraseblocks = { {64 * 1024, 32} },
2227 .block_erase = spi_block_erase_d8,
2228 }, {
2229 .eraseblocks = { {2 * 1024 * 1024, 1} },
2230 .block_erase = spi_block_erase_60,
2231 }, {
2232 .eraseblocks = { {2 * 1024 * 1024, 1} },
2233 .block_erase = spi_block_erase_c7,
2234 }
2235 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002236 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002237 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002238 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002239 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002240 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002241 },
2242
2243 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002244 /*{
2245 .vendor = "Atmel",
2246 .name = "AT26DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002247 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002248 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002249 .model_id = ATMEL_AT26DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002250 .total_size = 4096,
2251 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002252 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002253 .tested = TEST_UNTESTED,
2254 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002255 .probe_timing = TIMING_ZERO,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002256 .printlock = spi_prettyprint_status_register_at26df081a,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00002257 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002258 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002259 .read = spi_chip_read,
2260 },*/
FENG yu ningff692fb2008-12-08 18:15:10 +00002261
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002262 {
2263 .vendor = "Atmel",
2264 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002265 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002266 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002267 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002268 .total_size = 512,
2269 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00002270 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD },
Steven Zakulec3603a282012-05-02 20:07:57 +00002271 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002272 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002273 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002274 .block_erasers =
2275 {
2276 {
2277 .eraseblocks = { {4 * 1024, 128} },
2278 .block_erase = spi_block_erase_20,
2279 }, {
2280 .eraseblocks = { {32 * 1024, 16} },
2281 .block_erase = spi_block_erase_52,
2282 }, {
2283 .eraseblocks = { {64 * 1024, 8} },
2284 .block_erase = spi_block_erase_d8,
2285 }, {
2286 .eraseblocks = { {512 * 1024, 1} },
2287 .block_erase = spi_block_erase_60,
2288 }, {
2289 .eraseblocks = { {512 * 1024, 1} },
2290 .block_erase = spi_block_erase_c7,
2291 }
2292 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002294 .write = NULL /* Incompatible Page write */,
2295 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002296 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002297 },
2298
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002299 {
2300 .vendor = "Atmel",
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002301 .name = "AT29C512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002302 .bustype = BUS_PARALLEL,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002303 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002304 .model_id = ATMEL_AT29C512,
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002305 .total_size = 64,
2306 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002307 .feature_bits = FEATURE_LONG_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +00002308 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00002309 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002310 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002311 .block_erasers =
2312 {
2313 {
2314 .eraseblocks = { {64 * 1024, 1} },
2315 .block_erase = erase_chip_block_jedec,
2316 }
2317 },
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002318 .write = write_jedec,
2319 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002320 .voltage = {4500, 5500},
Maciej Pijankabc2bbd22009-06-02 16:45:59 +00002321 },
2322
2323 {
2324 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002325 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002326 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002327 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002328 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002329 .total_size = 128,
2330 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002331 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002332 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002333 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002334 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002335 .block_erasers =
2336 {
2337 {
2338 .eraseblocks = { {128 * 1024, 1} },
2339 .block_erase = erase_chip_block_jedec,
2340 }
2341 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002342 .write = write_jedec, /* FIXME */
2343 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002344 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002345 },
2346
2347 {
2348 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002349 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002350 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002351 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002352 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002353 .total_size = 256,
2354 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002355 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002356 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002357 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002358 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002359 .block_erasers =
2360 {
2361 {
2362 .eraseblocks = { {256 * 1024, 1} },
2363 .block_erase = erase_chip_block_jedec,
2364 }
2365 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002366 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002367 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002368 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002369 },
2370
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002371 {
2372 .vendor = "Atmel",
2373 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002374 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002375 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002376 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002377 .total_size = 512,
2378 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002379 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002380 .tested = TEST_UNTESTED,
2381 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002382 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002383 .block_erasers =
2384 {
2385 {
2386 .eraseblocks = { {512 * 1024, 1} },
2387 .block_erase = erase_chip_block_jedec,
2388 }
2389 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002390 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002391 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002392 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002393 },
2394
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002395 {
2396 .vendor = "Atmel",
2397 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002398 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002399 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002400 .model_id = ATMEL_AT45CS1282,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002401 .total_size = 16896 /* No power of two sizes */,
2402 .page_size = 1056 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002403 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002404 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2405 .feature_bits = FEATURE_OTP,
2406 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002407 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002408 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002409 .block_erasers =
2410 {
2411 {
2412 .eraseblocks = {
2413 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2414 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2415 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2416 },
2417 .block_erase = spi_erase_at45cs_sector,
2418 }
2419 },
2420 .printlock = spi_prettyprint_status_register_plain,
2421 .gran = write_gran_1056bytes,
2422 .write = spi_write_at45db,
2423 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002424 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002425 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002426
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002427 {
2428 .vendor = "Atmel",
2429 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002430 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002431 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002432 .model_id = ATMEL_AT45DB011D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002433 .total_size = 128 /* or 132, determined from status register */,
2434 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002435 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002436 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2437 .feature_bits = FEATURE_OTP,
2438 .tested = TEST_UNTESTED,
2439 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002440 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002441 .block_erasers =
2442 {
2443 {
2444 .eraseblocks = { {256, 512} },
2445 .block_erase = spi_erase_at45db_page,
2446 }, {
2447 .eraseblocks = { {8 * 256, 512/8} },
2448 .block_erase = spi_erase_at45db_block,
2449 }, {
2450 .eraseblocks = {
2451 {8 * 256, 1},
2452 {120 * 256, 1},
2453 {128 * 256, 3},
2454 },
2455 .block_erase = spi_erase_at45db_sector
2456 }, {
2457 .eraseblocks = { {128 * 1024, 1} },
2458 .block_erase = spi_erase_at45db_chip,
2459 }
2460 },
2461 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2462 .printlock = spi_prettyprint_status_register_at45db,
2463 /* granularity will be set by the probing function. */
2464 .write = spi_write_at45db,
2465 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002466 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002467 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002468
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002469 {
2470 .vendor = "Atmel",
2471 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002472 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002473 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002474 .model_id = ATMEL_AT45DB021D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002475 .total_size = 256 /* or 264, determined from status register */,
2476 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002477 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002478 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2479 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002480 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002481 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002482 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002483 .block_erasers =
2484 {
2485 {
2486 .eraseblocks = { {256, 1024} },
2487 .block_erase = spi_erase_at45db_page,
2488 }, {
2489 .eraseblocks = { {8 * 256, 1024/8} },
2490 .block_erase = spi_erase_at45db_block,
2491 }, {
2492 .eraseblocks = {
2493 {8 * 256, 1},
2494 {120 * 256, 1},
2495 {128 * 256, 7},
2496 },
2497 .block_erase = spi_erase_at45db_sector
2498 }, {
2499 .eraseblocks = { {256 * 1024, 1} },
2500 .block_erase = spi_erase_at45db_chip,
2501 }
2502 },
2503 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2504 .printlock = spi_prettyprint_status_register_at45db,
2505 /* granularity will be set by the probing function. */
2506 .write = spi_write_at45db,
2507 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002508 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002509 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002510
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002511 {
2512 .vendor = "Atmel",
2513 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002514 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002515 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002516 .model_id = ATMEL_AT45DB041D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002517 .total_size = 512 /* or 528, determined from status register */,
2518 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002519 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002520 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2521 .feature_bits = FEATURE_OTP,
2522 .tested = TEST_OK_PREW,
2523 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002524 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002525 .block_erasers =
2526 {
2527 {
2528 .eraseblocks = { {256, 2048} },
2529 .block_erase = spi_erase_at45db_page,
2530 }, {
2531 .eraseblocks = { {8 * 256, 2048/8} },
2532 .block_erase = spi_erase_at45db_block,
2533 }, {
2534 .eraseblocks = {
2535 {8 * 256, 1},
2536 {248 * 256, 1},
2537 {256 * 256, 7},
2538 },
2539 .block_erase = spi_erase_at45db_sector
2540 }, {
2541 .eraseblocks = { {512 * 1024, 1} },
2542 .block_erase = spi_erase_at45db_chip,
2543 }
2544 },
2545 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2546 .printlock = spi_prettyprint_status_register_at45db,
2547 /* granularity will be set by the probing function. */
2548 .write = spi_write_at45db,
2549 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2550 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002551 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002552
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002553 {
2554 .vendor = "Atmel",
2555 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002556 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002557 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002558 .model_id = ATMEL_AT45DB081D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002559 .total_size = 1024 /* or 1056, determined from status register */,
2560 .page_size = 256 /* or 264, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002561 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002562 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2563 .feature_bits = FEATURE_OTP,
2564 .tested = TEST_UNTESTED,
2565 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002566 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002567 .block_erasers =
2568 {
2569 {
2570 .eraseblocks = { {256, 4096} },
2571 .block_erase = spi_erase_at45db_page,
2572 }, {
2573 .eraseblocks = { {8 * 256, 4096/8} },
2574 .block_erase = spi_erase_at45db_block,
2575 }, {
2576 .eraseblocks = {
2577 {8 * 256, 1},
2578 {248 * 256, 1},
2579 {256 * 256, 15},
2580 },
2581 .block_erase = spi_erase_at45db_sector
2582 }, {
2583 .eraseblocks = { {1024 * 1024, 1} },
2584 .block_erase = spi_erase_at45db_chip,
2585 }
2586 },
2587 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2588 .printlock = spi_prettyprint_status_register_at45db,
2589 /* granularity will be set by the probing function. */
2590 .write = spi_write_at45db,
2591 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002592 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002593 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002594
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002595 {
2596 .vendor = "Atmel",
2597 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002598 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002599 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002600 .model_id = ATMEL_AT45DB161D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002601 .total_size = 2048 /* or 2112, determined from status register */,
2602 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002603 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002604 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2605 .feature_bits = FEATURE_OTP,
2606 .tested = TEST_OK_PREW,
2607 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002608 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002609 .block_erasers =
2610 {
2611 {
2612 .eraseblocks = { {512, 4096} },
2613 .block_erase = spi_erase_at45db_page,
2614 }, {
2615 .eraseblocks = { {8 * 512, 4096/8} },
2616 .block_erase = spi_erase_at45db_block,
2617 }, {
2618 .eraseblocks = {
2619 {8 * 512, 1},
2620 {248 * 512, 1},
2621 {256 * 512, 15},
2622 },
2623 .block_erase = spi_erase_at45db_sector
2624 }, {
2625 .eraseblocks = { {2048 * 1024, 1} },
2626 .block_erase = spi_erase_at45db_chip,
2627 }
2628 },
2629 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2630 .printlock = spi_prettyprint_status_register_at45db,
2631 /* granularity will be set by the probing function. */
2632 .write = spi_write_at45db,
2633 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002634 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002635 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002636
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002637 {
2638 .vendor = "Atmel",
2639 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002640 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002641 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002642 .model_id = ATMEL_AT45DB321C,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002643 .total_size = 4224 /* No power of two sizes */,
2644 .page_size = 528 /* No power of two sizes */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002645 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002646 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2647 .feature_bits = FEATURE_OTP,
2648 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002649 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002650 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002651 .block_erasers =
2652 {
2653 {
2654 .eraseblocks = { {528, 8192} },
2655 .block_erase = spi_erase_at45db_page,
2656 }, {
2657 .eraseblocks = { {8 * 528, 8192/8} },
2658 .block_erase = spi_erase_at45db_block,
2659 }, /* Although the datasheets describes sectors (which can be write protected)
2660 * there seems to be no erase functions for them.
2661 {
2662 .eraseblocks = {
2663 {8 * 528, 1},
2664 {120 * 528, 1},
2665 {128 * 528, 63},
2666 },
2667 .block_erase = spi_erase_at45db_sector
2668 }, */ {
2669 .eraseblocks = { {4224 * 1024, 1} },
2670 .block_erase = spi_erase_at45db_chip,
2671 }
2672 },
2673 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2674 .gran = write_gran_528bytes,
2675 .write = spi_write_at45db,
2676 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002677 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002678 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002679
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002680 {
2681 .vendor = "Atmel",
2682 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002683 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002684 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002685 .model_id = ATMEL_AT45DB321D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002686 .total_size = 4096 /* or 4224, determined from status register */,
2687 .page_size = 512 /* or 528, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002688 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002689 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002690 .feature_bits = FEATURE_OTP,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002691 .tested = TEST_UNTESTED,
2692 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002693 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002694 .block_erasers =
2695 {
2696 {
2697 .eraseblocks = { {512, 8192} },
2698 .block_erase = spi_erase_at45db_page,
2699 }, {
2700 .eraseblocks = { {8 * 512, 8192/8} },
2701 .block_erase = spi_erase_at45db_block,
2702 }, {
2703 .eraseblocks = {
2704 {8 * 512, 1},
2705 {120 * 512, 1},
2706 {128 * 512, 63},
2707 },
2708 .block_erase = spi_erase_at45db_sector
2709 }, {
2710 .eraseblocks = { {4096 * 1024, 1} },
2711 .block_erase = spi_erase_at45db_chip,
2712 }
2713 },
2714 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2715 .printlock = spi_prettyprint_status_register_at45db,
2716 /* granularity will be set by the probing function. */
2717 .write = spi_write_at45db,
2718 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2719 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2720 },
2721
2722 {
2723 .vendor = "Atmel",
2724 .name = "AT45DB321E",
2725 .bustype = BUS_SPI,
2726 .manufacture_id = ATMEL_ID,
2727 .model_id = ATMEL_AT45DB321C,
2728 .total_size = 4096 /* or 4224, determined from status register */,
2729 .page_size = 512 /* or 528, determined from status register */,
2730 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2731 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2732 .feature_bits = FEATURE_OTP,
2733 .tested = TEST_UNTESTED,
2734 .probe = probe_spi_at45db,
2735 .probe_timing = TIMING_ZERO,
2736 .block_erasers =
2737 {
2738 {
2739 .eraseblocks = { {512, 8192} },
2740 .block_erase = spi_erase_at45db_page,
2741 }, {
2742 .eraseblocks = { {8 * 512, 8192/8} },
2743 .block_erase = spi_erase_at45db_block,
2744 }, {
2745 .eraseblocks = {
2746 {8 * 512, 1},
2747 {120 * 512, 1},
2748 {128 * 512, 63},
2749 },
2750 .block_erase = spi_erase_at45db_sector
2751 }, {
2752 .eraseblocks = { {4096 * 1024, 1} },
2753 .block_erase = spi_erase_at45db_chip,
2754 }
2755 },
2756 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2757 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
2758 /* granularity will be set by the probing function. */
2759 .write = spi_write_at45db,
2760 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2761 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002762 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002763
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002764 {
2765 .vendor = "Atmel",
2766 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002767 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002768 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002769 .model_id = ATMEL_AT45DB642D,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002770 .total_size = 8192 /* or 8448, determined from status register */,
2771 .page_size = 1024 /* or 1056, determined from status register */,
Steven Zakulec3603a282012-05-02 20:07:57 +00002772 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002773 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2774 .feature_bits = FEATURE_OTP,
2775 .tested = TEST_UNTESTED,
2776 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002777 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002778 .block_erasers =
2779 {
2780 {
2781 .eraseblocks = { {1024, 8192} },
2782 .block_erase = spi_erase_at45db_page,
2783 }, {
2784 .eraseblocks = { {8 * 1024, 8192/8} },
2785 .block_erase = spi_erase_at45db_block,
2786 }, {
2787 .eraseblocks = {
2788 {8 * 1024, 1},
2789 {248 * 1024, 1},
2790 {256 * 1024, 31},
2791 },
2792 .block_erase = spi_erase_at45db_sector
2793 }, {
2794 .eraseblocks = { {8192 * 1024, 1} },
2795 .block_erase = spi_erase_at45db_chip,
2796 }
2797 },
2798 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2799 .printlock = spi_prettyprint_status_register_at45db,
2800 /* granularity will be set by the probing function. */
2801 .write = spi_write_at45db,
2802 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002803 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002804 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002805
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002806 {
2807 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002808 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002809 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002810 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002811 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002812 .total_size = 64,
2813 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00002814 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00002815 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002816 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002817 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002818 .block_erasers =
2819 {
2820 {
2821 .eraseblocks = { {64 * 1024, 1} },
2822 .block_erase = erase_chip_block_jedec,
2823 }
2824 },
Sean Nelson35727f72010-01-28 23:55:12 +00002825 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002827 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00002828 },
2829
2830 {
2831 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002832 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002833 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002834 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002835 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002836 .total_size = 256,
2837 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002838 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002839 .tested = TEST_UNTESTED,
2840 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002842 .block_erasers =
2843 {
2844 {
2845 .eraseblocks = {
2846 {16 * 1024, 1},
2847 {8 * 1024, 2},
2848 {96 * 1024, 1},
2849 {128 * 1024, 1},
2850 },
2851 .block_erase = erase_sector_jedec,
2852 }, {
2853 .eraseblocks = { {256 * 1024, 1} },
2854 .block_erase = erase_chip_block_jedec,
2855 }
2856 },
Sean Nelson35727f72010-01-28 23:55:12 +00002857 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002858 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002859 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002860 },
2861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002862 {
2863 .vendor = "Atmel",
2864 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002865 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002866 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002867 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002868 .total_size = 256,
2869 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002870 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002871 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002872 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00002873 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00002874 .block_erasers =
2875 {
2876 {
2877 .eraseblocks = {
2878 {128 * 1024, 1},
2879 {96 * 1024, 1},
2880 {8 * 1024, 2},
2881 {16 * 1024, 1},
2882 },
2883 .block_erase = erase_sector_jedec,
2884 }, {
2885 .eraseblocks = { {256 * 1024, 1} },
2886 .block_erase = erase_chip_block_jedec,
2887 }
2888 },
Sean Nelson35727f72010-01-28 23:55:12 +00002889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002890 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002891 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002892 },
2893
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00002894 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00002895 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002896 .name = "AT49(H)F010",
2897 .bustype = BUS_PARALLEL,
2898 .manufacture_id = ATMEL_ID,
2899 .model_id = ATMEL_AT49F010,
2900 .total_size = 128,
2901 .page_size = 0, /* unused */
2902 .feature_bits = FEATURE_EITHER_RESET,
2903 .tested = TEST_OK_PREW,
2904 .probe = probe_jedec,
2905 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2906 .block_erasers =
2907 {
2908 {
2909 .eraseblocks = { {128 * 1024, 1} },
2910 .block_erase = erase_chip_block_jedec,
2911 }
2912 },
2913 .printlock = printlock_at49f,
2914 .write = write_jedec_1,
2915 .read = read_memmapped,
2916 .voltage = {4500, 5500},
2917 },
2918
2919 {
2920 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00002921 .name = "AT49F020",
2922 .bustype = BUS_PARALLEL,
2923 .manufacture_id = ATMEL_ID,
2924 .model_id = ATMEL_AT49F020,
2925 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002926 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002927 .feature_bits = FEATURE_EITHER_RESET,
2928 .tested = TEST_OK_PRE,
2929 .probe = probe_jedec,
2930 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2931 .block_erasers =
2932 {
2933 {
2934 .eraseblocks = { {256 * 1024, 1} },
2935 .block_erase = erase_chip_block_jedec,
2936 }
2937 /* Chip features an optional permanent write protection
2938 * of the first 8 kB. The erase function is the same as
2939 * above, but 00000H to 01FFFH will not be erased.
2940 * FIXME: add another eraser when partial erasers are
2941 * supported.
2942 */
2943 },
2944 .printlock = printlock_at49f,
2945 .write = write_jedec_1,
2946 .read = read_memmapped,
2947 .voltage = {4500, 5500},
2948 },
2949
2950 {
2951 .vendor = "Atmel",
2952 .name = "AT49F040",
2953 .bustype = BUS_PARALLEL,
2954 .manufacture_id = ATMEL_ID,
2955 .model_id = ATMEL_AT49F040,
2956 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002957 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00002958 .feature_bits = FEATURE_EITHER_RESET,
2959 .tested = TEST_UNTESTED,
2960 .probe = probe_jedec,
2961 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2962 .block_erasers =
2963 {
2964 {
2965 .eraseblocks = { {512 * 1024, 1} },
2966 .block_erase = erase_chip_block_jedec,
2967 }
2968 /* Chip features an optional permanent write protection
2969 * of the first 16 kB. The erase function is the same as
2970 * above, but 00000H to 03FFFH will not be erased.
2971 * FIXME: add another eraser when partial erasers are
2972 * supported.
2973 */
2974 },
2975 .printlock = printlock_at49f,
2976 .write = write_jedec_1,
2977 .read = read_memmapped,
2978 .voltage = {4500, 5500},
2979 },
2980
2981 {
2982 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00002983 .name = "AT49F080",
2984 .bustype = BUS_PARALLEL,
2985 .manufacture_id = ATMEL_ID,
2986 .model_id = ATMEL_AT49F080,
2987 .total_size = 1024,
2988 .page_size = 0, /* unused */
2989 .feature_bits = FEATURE_EITHER_RESET,
2990 .tested = TEST_UNTESTED,
2991 .probe = probe_jedec,
2992 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2993 .block_erasers =
2994 {
2995 {
2996 .eraseblocks = { {1024 * 1024, 1} },
2997 .block_erase = erase_chip_block_jedec,
2998 }
2999 /* Chip features an optional permanent write protection
3000 * of the first 16 kB. The erase function is the same as
3001 * above, but 00000H to 03FFFH will not be erased.
3002 * FIXME: add another eraser when partial erasers are
3003 * supported.
3004 */
3005 },
3006 .printlock = printlock_at49f,
3007 .write = write_jedec_1,
3008 .read = read_memmapped,
3009 .voltage = {4500, 5500},
3010 },
3011
3012 {
3013 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3014 .vendor = "Atmel",
3015 .name = "AT49F080T",
3016 .bustype = BUS_PARALLEL,
3017 .manufacture_id = ATMEL_ID,
3018 .model_id = ATMEL_AT49F080T,
3019 .total_size = 1024,
3020 .page_size = 0, /* unused */
3021 .feature_bits = FEATURE_EITHER_RESET,
3022 .tested = TEST_UNTESTED,
3023 .probe = probe_jedec,
3024 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3025 .block_erasers =
3026 {
3027 {
3028 .eraseblocks = { {1024 * 1024, 1} },
3029 .block_erase = erase_chip_block_jedec,
3030 }
3031 /* Chip features an optional permanent write protection
3032 * of the first 16 kB. The erase function is the same as
3033 * above, but FC000H to FFFFFH will not be erased.
3034 * FIXME: add another eraser when partial erasers are
3035 * supported.
3036 */
3037 },
3038 .printlock = printlock_at49f,
3039 .write = write_jedec_1,
3040 .read = read_memmapped,
3041 .voltage = {4500, 5500},
3042 },
3043
3044 {
3045 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003046 .name = "AT49LH002",
3047 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3048 .manufacture_id = ATMEL_ID,
3049 .model_id = ATMEL_AT49LH002,
3050 .total_size = 256,
3051 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003052 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003053 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003054 .probe = probe_82802ab,
3055 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003056 .block_erasers =
3057 {
3058 {
3059 .eraseblocks = {
3060 {64 * 1024, 3},
3061 {32 * 1024, 1},
3062 {8 * 1024, 2},
3063 {16 * 1024, 1},
3064 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003065 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003066 }, {
3067 .eraseblocks = {
3068 {64 * 1024, 4},
3069 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003070 .block_erase = erase_block_82802ab,
3071 },
3072 },
3073 .printlock = printlock_regspace2_block_eraser_0,
3074 .unlock = unlock_regspace2_block_eraser_0,
3075 .write = write_82802ab,
3076 .read = read_memmapped,
3077 .voltage = {3000, 3600},
3078 },
3079
3080 {
3081 .vendor = "Atmel",
3082 .name = "AT49LH00B4",
3083 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3084 .manufacture_id = ATMEL_ID,
3085 .model_id = ATMEL_AT49LH00B4,
3086 .total_size = 512,
3087 .page_size = 0, /* unused */
3088 .feature_bits = FEATURE_REGISTERMAP,
3089 .tested = TEST_UNTESTED,
3090 .probe = probe_82802ab,
3091 .probe_timing = TIMING_ZERO,
3092 .block_erasers =
3093 {
3094 {
3095 .eraseblocks = {
3096 {8 * 1024, 2},
3097 {16 * 1024, 1},
3098 {32 * 1024, 1},
3099 {64 * 1024, 7},
3100 },
3101 .block_erase = NULL, /* TODO: Implement. */
3102 }, {
3103 .eraseblocks = {
3104 {64 * 1024, 8},
3105 },
3106 .block_erase = erase_block_82802ab,
3107 },
3108 },
3109 .printlock = printlock_regspace2_block_eraser_0,
3110 .unlock = unlock_regspace2_block_eraser_0,
3111 .write = write_82802ab,
3112 .read = read_memmapped,
3113 .voltage = {3000, 3600},
3114 },
3115
3116 {
3117 .vendor = "Atmel",
3118 .name = "AT49LH004",
3119 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3120 .manufacture_id = ATMEL_ID,
3121 .model_id = ATMEL_AT49LH004,
3122 .total_size = 512,
3123 .page_size = 0, /* unused */
3124 .feature_bits = FEATURE_REGISTERMAP,
3125 .tested = TEST_UNTESTED,
3126 .probe = probe_82802ab,
3127 .probe_timing = TIMING_ZERO,
3128 .block_erasers =
3129 {
3130 {
3131 .eraseblocks = {
3132 {64 * 1024, 7},
3133 {32 * 1024, 1},
3134 {8 * 1024, 2},
3135 {16 * 1024, 1},
3136 },
3137 .block_erase = erase_block_82802ab,
3138 }, {
3139 .eraseblocks = {
3140 {64 * 1024, 8},
3141 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003142 .block_erase = NULL, /* TODO: Implement. */
3143 },
3144 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003145 .printlock = printlock_regspace2_block_eraser_0,
3146 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003147 .write = write_82802ab,
3148 .read = read_memmapped,
3149 .voltage = {3000, 3600},
3150 },
3151
3152 {
Andrew Morganca081462011-09-13 22:05:44 +00003153 .vendor = "Catalyst",
3154 .name = "CAT28F512",
3155 .bustype = BUS_PARALLEL,
3156 .manufacture_id = CATALYST_ID,
3157 .model_id = CATALYST_CAT28F512,
3158 .total_size = 64,
3159 .page_size = 0, /* unused */
3160 .feature_bits = 0,
Stefan Tauner6697f712014-08-06 15:09:15 +00003161 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
Andrew Morganca081462011-09-13 22:05:44 +00003162 .probe = probe_jedec, /* FIXME! */
3163 .probe_timing = TIMING_ZERO,
3164 .block_erasers =
3165 {
3166 {
3167 .eraseblocks = { {64 * 1024, 1} },
3168 .block_erase = NULL, /* TODO */
3169 },
3170 },
3171 .write = NULL, /* TODO */
3172 .read = read_memmapped,
3173 .voltage = {4500, 5500},
3174 },
3175
3176 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003177 .vendor = "Bright",
3178 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003179 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003180 .manufacture_id = BRIGHT_ID,
3181 .model_id = BRIGHT_BM29F040,
3182 .total_size = 512,
3183 .page_size = 64 * 1024,
3184 .feature_bits = FEATURE_EITHER_RESET,
3185 .tested = TEST_OK_PR,
3186 .probe = probe_jedec,
3187 .probe_timing = TIMING_ZERO,
3188 .block_erasers =
3189 {
3190 {
3191 .eraseblocks = { {64 * 1024, 8} },
3192 .block_erase = erase_sector_jedec,
3193 }, {
3194 .eraseblocks = { {512 * 1024, 1} },
3195 .block_erase = erase_chip_block_jedec,
3196 },
3197 },
3198 .write = write_jedec_1,
3199 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003200 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003201 },
3202
3203 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003204 .vendor = "ESMT",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003205 .name = "F49B002UA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003206 .bustype = BUS_PARALLEL,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003207 .manufacture_id = ESMT_ID,
3208 .model_id = ESMT_F49B002UA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003209 .total_size = 256,
3210 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00003211 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003212 .tested = TEST_UNTESTED,
3213 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00003215 .block_erasers =
3216 {
3217 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00003218 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00003219 {128 * 1024, 1},
3220 {96 * 1024, 1},
3221 {8 * 1024, 2},
3222 {16 * 1024, 1},
3223 },
3224 .block_erase = erase_sector_jedec,
3225 }, {
3226 .eraseblocks = { {256 * 1024, 1} },
3227 .block_erase = erase_chip_block_jedec,
3228 }
3229 },
Sean Nelson35727f72010-01-28 23:55:12 +00003230 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003231 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003232 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003233 },
3234
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003235 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003236 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003237 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003238 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003239 .manufacture_id = ESMT_ID,
3240 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003241 .total_size = 1024,
3242 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003243 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003244 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003245 .probe = probe_spi_rdid,
3246 .probe_timing = TIMING_ZERO,
3247 .block_erasers =
3248 {
3249 {
3250 .eraseblocks = { {4 * 1024, 256} },
3251 .block_erase = spi_block_erase_20,
3252 }, {
3253 .eraseblocks = { {64 * 1024, 16} },
3254 .block_erase = spi_block_erase_d8,
3255 }, {
3256 .eraseblocks = { {1024 * 1024, 1} },
3257 .block_erase = spi_block_erase_60,
3258 }, {
3259 .eraseblocks = { {1024 * 1024, 1} },
3260 .block_erase = spi_block_erase_c7,
3261 }
3262 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003264 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003265 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003266 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003267 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003268 },
3269
3270 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003271 .vendor = "ESMT",
3272 .name = "F25L32PA",
3273 .bustype = BUS_SPI,
3274 .manufacture_id = ESMT_ID,
3275 .model_id = ESMT_F25L32PA,
3276 .total_size = 4096,
3277 .page_size = 256,
3278 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3279 .tested = TEST_UNTESTED,
3280 .probe = probe_spi_rdid,
3281 .probe_timing = TIMING_ZERO,
3282 .block_erasers =
3283 {
3284 {
3285 .eraseblocks = { {4 * 1024, 1024} },
3286 .block_erase = spi_block_erase_20,
3287 }, {
3288 .eraseblocks = { {64 * 1024, 64} },
3289 .block_erase = spi_block_erase_d8,
3290 }, {
3291 .eraseblocks = { {4 * 1024 * 1024, 1} },
3292 .block_erase = spi_block_erase_60,
3293 }, {
3294 .eraseblocks = { {4 * 1024 * 1024, 1} },
3295 .block_erase = spi_block_erase_c7,
3296 }
3297 },
3298 .printlock = spi_prettyprint_status_register_bp2_bpl,
3299 .unlock = spi_disable_blockprotect,
3300 .write = spi_chip_write_256,
3301 .read = spi_chip_read,
3302 .voltage = {2700, 3600},
3303 },
3304
3305 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003306 .vendor = "Eon",
3307 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003308 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003309 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003310 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003311 .total_size = 64,
3312 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003313 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003314 .tested = TEST_UNTESTED,
3315 .probe = probe_spi_rdid,
3316 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003317 .block_erasers =
3318 {
3319 {
3320 .eraseblocks = {
3321 {4 * 1024, 2},
3322 {8 * 1024, 1},
3323 {16 * 1024, 1},
3324 {32 * 1024, 1},
3325 },
3326 .block_erase = spi_block_erase_d8,
3327 }, {
3328 .eraseblocks = { {64 * 1024, 1} },
3329 .block_erase = spi_block_erase_c7,
3330 }
3331 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003332 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003333 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003334 .write = spi_chip_write_256,
3335 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003336 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003337 },
3338
3339 {
3340 .vendor = "Eon",
3341 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003342 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003343 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003344 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003345 .total_size = 64,
3346 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003347 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003348 .tested = TEST_UNTESTED,
3349 .probe = probe_spi_rdid,
3350 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003351 .block_erasers =
3352 {
3353 {
3354 .eraseblocks = {
3355 {32 * 1024, 1},
3356 {16 * 1024, 1},
3357 {8 * 1024, 1},
3358 {4 * 1024, 2},
3359 },
3360 .block_erase = spi_block_erase_d8,
3361 }, {
3362 .eraseblocks = { {64 * 1024, 1} },
3363 .block_erase = spi_block_erase_c7,
3364 }
3365 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003366 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003367 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003368 .write = spi_chip_write_256,
3369 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003370 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003371 },
3372
3373 {
3374 .vendor = "Eon",
3375 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003376 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003377 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003378 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003379 .total_size = 128,
3380 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003381 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003382 .tested = TEST_UNTESTED,
3383 .probe = probe_spi_rdid,
3384 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003385 .block_erasers =
3386 {
3387 {
3388 .eraseblocks = {
3389 {4 * 1024, 2},
3390 {8 * 1024, 1},
3391 {16 * 1024, 1},
3392 {32 * 1024, 3},
3393 },
3394 .block_erase = spi_block_erase_d8,
3395 }, {
3396 .eraseblocks = { {128 * 1024, 1} },
3397 .block_erase = spi_block_erase_c7,
3398 }
3399 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003400 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003401 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003402 .write = spi_chip_write_256,
3403 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003404 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003405 },
3406
3407 {
3408 .vendor = "Eon",
3409 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003410 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003411 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003412 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003413 .total_size = 128,
3414 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003415 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003416 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003417 .probe = probe_spi_rdid,
3418 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003419 .block_erasers =
3420 {
3421 {
3422 .eraseblocks = {
3423 {32 * 1024, 3},
3424 {16 * 1024, 1},
3425 {8 * 1024, 1},
3426 {4 * 1024, 2},
3427 },
3428 .block_erase = spi_block_erase_d8,
3429 }, {
3430 .eraseblocks = { {128 * 1024, 1} },
3431 .block_erase = spi_block_erase_c7,
3432 }
3433 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003434 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003435 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003436 .write = spi_chip_write_256,
3437 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003438 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003439 },
3440
3441 {
3442 .vendor = "Eon",
3443 .name = "EN25B20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003444 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003445 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003446 .model_id = EON_EN25B20,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003447 .total_size = 256,
3448 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003449 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003450 .tested = TEST_UNTESTED,
3451 .probe = probe_spi_rdid,
3452 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003453 .block_erasers =
3454 {
3455 {
3456 .eraseblocks = {
3457 {4 * 1024, 2},
3458 {8 * 1024, 1},
3459 {16 * 1024, 1},
3460 {32 * 1024, 1},
3461 {64 * 1024, 3}
3462 },
3463 .block_erase = spi_block_erase_d8,
3464 }, {
3465 .eraseblocks = { {256 * 1024, 1} },
3466 .block_erase = spi_block_erase_c7,
3467 }
3468 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003469 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003470 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003471 .write = spi_chip_write_256,
3472 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003473 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003474 },
3475
3476 {
3477 .vendor = "Eon",
3478 .name = "EN25B20T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003479 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003480 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003481 .model_id = EON_EN25B20,
Sean Nelson54596372010-01-09 05:30:14 +00003482 .total_size = 256,
3483 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003484 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003485 .tested = TEST_UNTESTED,
3486 .probe = probe_spi_rdid,
3487 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003488 .block_erasers =
3489 {
3490 {
3491 .eraseblocks = {
3492 {64 * 1024, 3},
3493 {32 * 1024, 1},
3494 {16 * 1024, 1},
3495 {8 * 1024, 1},
3496 {4 * 1024, 2},
3497 },
3498 .block_erase = spi_block_erase_d8,
3499 }, {
3500 .eraseblocks = { {256 * 1024, 1} },
3501 .block_erase = spi_block_erase_c7,
3502 }
3503 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003504 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003505 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003506 .write = spi_chip_write_256,
3507 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003508 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003509 },
3510
3511 {
3512 .vendor = "Eon",
3513 .name = "EN25B40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003514 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003515 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003516 .model_id = EON_EN25B40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003517 .total_size = 512,
3518 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003519 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003520 .tested = TEST_UNTESTED,
3521 .probe = probe_spi_rdid,
3522 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003523 .block_erasers =
3524 {
3525 {
3526 .eraseblocks = {
3527 {4 * 1024, 2},
3528 {8 * 1024, 1},
3529 {16 * 1024, 1},
3530 {32 * 1024, 1},
3531 {64 * 1024, 7}
3532 },
3533 .block_erase = spi_block_erase_d8,
3534 }, {
3535 .eraseblocks = { {512 * 1024, 1} },
3536 .block_erase = spi_block_erase_c7,
3537 }
3538 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003539 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003540 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003541 .write = spi_chip_write_256,
3542 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003543 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003544 },
3545
3546 {
3547 .vendor = "Eon",
3548 .name = "EN25B40T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003549 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003550 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003551 .model_id = EON_EN25B40,
Sean Nelson54596372010-01-09 05:30:14 +00003552 .total_size = 512,
3553 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003554 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003555 .tested = TEST_UNTESTED,
3556 .probe = probe_spi_rdid,
3557 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003558 .block_erasers =
3559 {
3560 {
3561 .eraseblocks = {
3562 {64 * 1024, 7},
3563 {32 * 1024, 1},
3564 {16 * 1024, 1},
3565 {8 * 1024, 1},
3566 {4 * 1024, 2},
3567 },
3568 .block_erase = spi_block_erase_d8,
3569 }, {
3570 .eraseblocks = { {512 * 1024, 1} },
3571 .block_erase = spi_block_erase_c7,
3572 }
3573 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003574 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003575 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003576 .write = spi_chip_write_256,
3577 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003578 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003579 },
3580
3581 {
3582 .vendor = "Eon",
3583 .name = "EN25B80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003584 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003585 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003586 .model_id = EON_EN25B80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003587 .total_size = 1024,
3588 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003589 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003590 .tested = TEST_UNTESTED,
3591 .probe = probe_spi_rdid,
3592 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003593 .block_erasers =
3594 {
3595 {
3596 .eraseblocks = {
3597 {4 * 1024, 2},
3598 {8 * 1024, 1},
3599 {16 * 1024, 1},
3600 {32 * 1024, 1},
3601 {64 * 1024, 15}
3602 },
3603 .block_erase = spi_block_erase_d8,
3604 }, {
3605 .eraseblocks = { {1024 * 1024, 1} },
3606 .block_erase = spi_block_erase_c7,
3607 }
3608 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003609 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003610 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003611 .write = spi_chip_write_256,
3612 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003613 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003614 },
3615
3616 {
3617 .vendor = "Eon",
3618 .name = "EN25B80T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003619 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003620 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003621 .model_id = EON_EN25B80,
Sean Nelson54596372010-01-09 05:30:14 +00003622 .total_size = 1024,
3623 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003624 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003625 .tested = TEST_UNTESTED,
3626 .probe = probe_spi_rdid,
3627 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003628 .block_erasers =
3629 {
3630 {
3631 .eraseblocks = {
3632 {64 * 1024, 15},
3633 {32 * 1024, 1},
3634 {16 * 1024, 1},
3635 {8 * 1024, 1},
3636 {4 * 1024, 2},
3637 },
3638 .block_erase = spi_block_erase_d8,
3639 }, {
3640 .eraseblocks = { {1024 * 1024, 1} },
3641 .block_erase = spi_block_erase_c7,
3642 }
3643 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003644 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003645 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003646 .write = spi_chip_write_256,
3647 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003648 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003649 },
3650
3651 {
3652 .vendor = "Eon",
3653 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003654 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003655 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003656 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003657 .total_size = 2048,
3658 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003659 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003660 .tested = TEST_UNTESTED,
3661 .probe = probe_spi_rdid,
3662 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003663 .block_erasers =
3664 {
3665 {
3666 .eraseblocks = {
3667 {4 * 1024, 2},
3668 {8 * 1024, 1},
3669 {16 * 1024, 1},
3670 {32 * 1024, 1},
3671 {64 * 1024, 31},
3672 },
3673 .block_erase = spi_block_erase_d8,
3674 }, {
3675 .eraseblocks = { {2 * 1024 * 1024, 1} },
3676 .block_erase = spi_block_erase_c7,
3677 }
3678 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003679 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003680 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003681 .write = spi_chip_write_256,
3682 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003683 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003684 },
3685
3686 {
3687 .vendor = "Eon",
3688 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003689 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003690 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003691 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003692 .total_size = 2048,
3693 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003694 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003695 .tested = TEST_UNTESTED,
3696 .probe = probe_spi_rdid,
3697 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003698 .block_erasers =
3699 {
3700 {
3701 .eraseblocks = {
3702 {64 * 1024, 31},
3703 {32 * 1024, 1},
3704 {16 * 1024, 1},
3705 {8 * 1024, 1},
3706 {4 * 1024, 2},
3707 },
3708 .block_erase = spi_block_erase_d8,
3709 }, {
3710 .eraseblocks = { {2 * 1024 * 1024, 1} },
3711 .block_erase = spi_block_erase_c7,
3712 }
3713 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003714 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003715 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003716 .write = spi_chip_write_256,
3717 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003718 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003719 },
3720
3721 {
3722 .vendor = "Eon",
3723 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003724 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003725 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003726 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003727 .total_size = 4096,
3728 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003729 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003730 .tested = TEST_UNTESTED,
3731 .probe = probe_spi_rdid,
3732 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003733 .block_erasers =
3734 {
3735 {
3736 .eraseblocks = {
3737 {4 * 1024, 2},
3738 {8 * 1024, 1},
3739 {16 * 1024, 1},
3740 {32 * 1024, 1},
3741 {64 * 1024, 63},
3742 },
3743 .block_erase = spi_block_erase_d8,
3744 }, {
3745 .eraseblocks = { {4 * 1024 * 1024, 1} },
3746 .block_erase = spi_block_erase_c7,
3747 }
3748 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003749 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003750 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003751 .write = spi_chip_write_256,
3752 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003753 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003754 },
3755
3756 {
3757 .vendor = "Eon",
3758 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003759 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003760 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003761 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00003762 .total_size = 4096,
3763 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003764 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003765 .tested = TEST_UNTESTED,
3766 .probe = probe_spi_rdid,
3767 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003768 .block_erasers =
3769 {
3770 {
3771 .eraseblocks = {
3772 {64 * 1024, 63},
3773 {32 * 1024, 1},
3774 {16 * 1024, 1},
3775 {8 * 1024, 1},
3776 {4 * 1024, 2},
3777 },
3778 .block_erase = spi_block_erase_d8,
3779 }, {
3780 .eraseblocks = { {4 * 1024 * 1024, 1} },
3781 .block_erase = spi_block_erase_c7,
3782 }
3783 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003784 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003785 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003786 .write = spi_chip_write_256,
3787 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003788 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003789 },
3790
3791 {
3792 .vendor = "Eon",
3793 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003794 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003795 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003796 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003797 .total_size = 8192,
3798 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003799 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003800 .tested = TEST_UNTESTED,
3801 .probe = probe_spi_rdid,
3802 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003803 .block_erasers =
3804 {
3805 {
3806 .eraseblocks = {
3807 {4 * 1024, 2},
3808 {8 * 1024, 1},
3809 {16 * 1024, 1},
3810 {32 * 1024, 1},
3811 {64 * 1024, 127},
3812 },
3813 .block_erase = spi_block_erase_d8,
3814 }, {
3815 .eraseblocks = { {8 * 1024 * 1024, 1} },
3816 .block_erase = spi_block_erase_c7,
3817 }
3818 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003819 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003820 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003821 .write = spi_chip_write_256,
3822 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003823 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003824 },
3825
3826 {
3827 .vendor = "Eon",
3828 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003829 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003830 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003831 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00003832 .total_size = 8192,
3833 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003834 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003835 .tested = TEST_UNTESTED,
3836 .probe = probe_spi_rdid,
3837 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003838 .block_erasers =
3839 {
3840 {
3841 .eraseblocks = {
3842 {64 * 1024, 127},
3843 {32 * 1024, 1},
3844 {16 * 1024, 1},
3845 {8 * 1024, 1},
3846 {4 * 1024, 2},
3847 },
3848 .block_erase = spi_block_erase_d8,
3849 }, {
3850 .eraseblocks = { {8 * 1024 * 1024, 1} },
3851 .block_erase = spi_block_erase_c7,
3852 }
3853 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003854 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003855 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003856 .write = spi_chip_write_256,
3857 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003858 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003859 },
3860
3861 {
3862 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003863 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003864 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003865 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003866 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003867 .total_size = 64,
3868 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003869 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00003870 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003871 .probe = probe_spi_rdid,
3872 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003873 .block_erasers =
3874 {
3875 {
3876 .eraseblocks = { {4 * 1024, 16} },
3877 .block_erase = spi_block_erase_20,
3878 }, {
3879 .eraseblocks = { {32 * 1024, 2} },
3880 .block_erase = spi_block_erase_d8,
3881 }, {
3882 .eraseblocks = { {32 * 1024, 2} },
3883 .block_erase = spi_block_erase_52,
3884 }, {
3885 .eraseblocks = { {64 * 1024, 1} },
3886 .block_erase = spi_block_erase_60,
3887 }, {
3888 .eraseblocks = { {64 * 1024, 1} },
3889 .block_erase = spi_block_erase_c7,
3890 }
3891 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003892 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003893 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003894 .write = spi_chip_write_256,
3895 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003896 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003897 },
3898
3899 {
3900 .vendor = "Eon",
3901 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003902 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003903 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003904 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003905 .total_size = 128,
3906 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003907 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003908 .tested = TEST_UNTESTED,
3909 .probe = probe_spi_rdid,
3910 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003911 .block_erasers =
3912 {
3913 {
3914 .eraseblocks = { {4 * 1024, 32} },
3915 .block_erase = spi_block_erase_20,
3916 }, {
3917 .eraseblocks = { {32 * 1024, 4} },
3918 .block_erase = spi_block_erase_d8,
3919 }, {
3920 .eraseblocks = { {32 * 1024, 4} },
3921 .block_erase = spi_block_erase_52,
3922 }, {
3923 .eraseblocks = { {128 * 1024, 1} },
3924 .block_erase = spi_block_erase_60,
3925 }, {
3926 .eraseblocks = { {128 * 1024, 1} },
3927 .block_erase = spi_block_erase_c7,
3928 }
3929 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003930 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003931 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003932 .write = spi_chip_write_256,
3933 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003934 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003935 },
3936
3937 {
3938 .vendor = "Eon",
3939 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003940 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003941 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003942 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003943 .total_size = 256,
3944 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003945 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003946 .tested = TEST_UNTESTED,
3947 .probe = probe_spi_rdid,
3948 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003949 .block_erasers =
3950 {
3951 {
3952 .eraseblocks = { {4 * 1024, 64} },
3953 .block_erase = spi_block_erase_20,
3954 }, {
3955 .eraseblocks = { {64 * 1024, 4} },
3956 .block_erase = spi_block_erase_d8,
3957 }, {
3958 .eraseblocks = { {64 * 1024, 4} },
3959 .block_erase = spi_block_erase_52,
3960 }, {
3961 .eraseblocks = { {256 * 1024, 1} },
3962 .block_erase = spi_block_erase_60,
3963 }, {
3964 .eraseblocks = { {256 * 1024, 1} },
3965 .block_erase = spi_block_erase_c7,
3966 }
3967 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003968 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003969 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003970 .write = spi_chip_write_256,
3971 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003972 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003973 },
3974
3975 {
3976 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003977 .name = "EN25F40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003978 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003979 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003980 .model_id = EON_EN25F40,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003981 .total_size = 512,
3982 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00003983 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerfaaa2b22009-06-22 10:06:28 +00003984 .tested = TEST_OK_PROBE,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003985 .probe = probe_spi_rdid,
3986 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00003987 .block_erasers =
3988 {
3989 {
Sean Nelson54596372010-01-09 05:30:14 +00003990 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003991 .block_erase = spi_block_erase_20,
3992 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003993 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003994 .block_erase = spi_block_erase_d8,
3995 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003996 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00003997 .block_erase = spi_block_erase_60,
3998 }, {
Sean Nelson54596372010-01-09 05:30:14 +00003999 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00004000 .block_erase = spi_block_erase_c7,
4001 },
4002 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004003 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004004 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004005 .write = spi_chip_write_256,
4006 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004007 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004008 },
4009
4010 {
4011 .vendor = "Eon",
4012 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004013 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004014 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004015 .model_id = EON_EN25F80,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004016 .total_size = 1024,
4017 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004018 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00004019 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004020 .probe = probe_spi_rdid,
4021 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004022 .block_erasers =
4023 {
4024 {
4025 .eraseblocks = { {4 * 1024, 256} },
4026 .block_erase = spi_block_erase_20,
4027 }, {
4028 .eraseblocks = { {64 * 1024, 16} },
4029 .block_erase = spi_block_erase_d8,
4030 }, {
4031 .eraseblocks = { {1024 * 1024, 1} },
4032 .block_erase = spi_block_erase_60,
4033 }, {
4034 .eraseblocks = { {1024 * 1024, 1} },
4035 .block_erase = spi_block_erase_c7,
4036 }
4037 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004038 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004039 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004040 .write = spi_chip_write_256,
4041 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004042 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004043 },
4044
4045 {
4046 .vendor = "Eon",
4047 .name = "EN25F16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004048 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004049 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004050 .model_id = EON_EN25F16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004051 .total_size = 2048,
4052 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004053 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzel018d4822011-10-21 12:33:07 +00004054 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004055 .probe = probe_spi_rdid,
4056 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004057 .block_erasers =
4058 {
4059 {
4060 .eraseblocks = { {4 * 1024, 512} },
4061 .block_erase = spi_block_erase_20,
4062 }, {
4063 .eraseblocks = { {64 * 1024, 32} },
4064 .block_erase = spi_block_erase_d8,
4065 }, {
4066 .eraseblocks = { {2 * 1024 * 1024, 1} },
4067 .block_erase = spi_block_erase_60,
4068 }, {
4069 .eraseblocks = { {2 * 1024 * 1024, 1} },
4070 .block_erase = spi_block_erase_c7,
4071 }
4072 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004073 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004074 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004075 .write = spi_chip_write_256,
4076 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004077 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004078 },
4079
4080 {
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004081 .vendor = "Eon",
4082 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004083 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004084 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004085 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004086 .total_size = 4096,
4087 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004088 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004089 .tested = TEST_UNTESTED,
4090 .probe = probe_spi_rdid,
4091 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004092 .block_erasers =
4093 {
4094 {
4095 .eraseblocks = { {4 * 1024, 1024} },
4096 .block_erase = spi_block_erase_20,
4097 }, {
4098 .eraseblocks = { {64 * 1024, 64} },
4099 .block_erase = spi_block_erase_d8,
4100 }, {
4101 .eraseblocks = { {4 * 1024 * 1024, 1} },
4102 .block_erase = spi_block_erase_60,
4103 }, {
4104 .eraseblocks = { {4 * 1024 * 1024, 1} },
4105 .block_erase = spi_block_erase_c7,
4106 }
4107 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004108 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004109 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004110 .write = spi_chip_write_256,
4111 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004112 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004113 },
4114
4115 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004116 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004117 .name = "EN25F64",
4118 .bustype = BUS_SPI,
4119 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004120 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004121 .total_size = 8192,
4122 .page_size = 256,
4123 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004124 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004125 .probe = probe_spi_rdid,
4126 .probe_timing = TIMING_ZERO,
4127 .block_erasers =
4128 {
4129 {
4130 .eraseblocks = { {4 * 1024, 2048} },
4131 .block_erase = spi_block_erase_20,
4132 }, {
4133 .eraseblocks = { {64 * 1024, 128} },
4134 .block_erase = spi_block_erase_d8,
4135 }, {
4136 .eraseblocks = { {8 * 1024 * 1024, 1} },
4137 .block_erase = spi_block_erase_60,
4138 }, {
4139 .eraseblocks = { {8 * 1024 * 1024, 1} },
4140 .block_erase = spi_block_erase_c7,
4141 }
4142 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004143 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004144 .unlock = spi_disable_blockprotect,
4145 .write = spi_chip_write_256,
4146 .read = spi_chip_read,
4147 .voltage = {2700, 3600},
4148 },
4149
4150 {
4151 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00004152 .name = "EN25Q40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004153 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004154 .manufacture_id = EON_ID_NOPREFIX,
4155 .model_id = EON_EN25Q40,
4156 .total_size = 512,
4157 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004158 /* OTP: 256B total; enter 0x3A */
4159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004160 .tested = TEST_UNTESTED,
4161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers =
4164 {
4165 {
4166 .eraseblocks = { {4 * 1024, 128} },
4167 .block_erase = spi_block_erase_20,
4168 }, {
4169 .eraseblocks = { {64 * 1024, 8} },
4170 .block_erase = spi_block_erase_d8,
4171 }, {
4172 .eraseblocks = { {512 * 1024, 1} },
4173 .block_erase = spi_block_erase_60,
4174 }, {
4175 .eraseblocks = { {512 * 1024, 1} },
4176 .block_erase = spi_block_erase_c7,
4177 }
4178 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004179 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004180 .unlock = spi_disable_blockprotect,
4181 .write = spi_chip_write_256,
4182 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004183 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004184 },
4185
4186 {
4187 .vendor = "Eon",
4188 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004189 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004190 .manufacture_id = EON_ID_NOPREFIX,
4191 .model_id = EON_EN25Q80,
4192 .total_size = 1024,
4193 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004194 /* OTP: 256B total; enter 0x3A */
4195 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004196 .tested = TEST_UNTESTED,
4197 .probe = probe_spi_rdid,
4198 .probe_timing = TIMING_ZERO,
4199 .block_erasers =
4200 {
4201 {
4202 .eraseblocks = { {4 * 1024, 256} },
4203 .block_erase = spi_block_erase_20,
4204 }, {
4205 .eraseblocks = { {64 * 1024, 16} },
4206 .block_erase = spi_block_erase_d8,
4207 }, {
4208 .eraseblocks = { {1024 * 1024, 1} },
4209 .block_erase = spi_block_erase_60,
4210 }, {
4211 .eraseblocks = { {1024 * 1024, 1} },
4212 .block_erase = spi_block_erase_c7,
4213 }
4214 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004215 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004216 .unlock = spi_disable_blockprotect,
4217 .write = spi_chip_write_256,
4218 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004219 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004220 },
4221
4222 {
4223 /* Note: EN25D16 is an evil twin which shares the model ID
4224 but has different write protection capabilities */
4225 .vendor = "Eon",
4226 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004227 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004228 .manufacture_id = EON_ID_NOPREFIX,
4229 .model_id = EON_EN25Q16,
4230 .total_size = 2048,
4231 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004232 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4233 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004234 .tested = TEST_UNTESTED,
4235 .probe = probe_spi_rdid,
4236 .probe_timing = TIMING_ZERO,
4237 .block_erasers =
4238 {
4239 {
4240 .eraseblocks = { {4 * 1024, 512} },
4241 .block_erase = spi_block_erase_20,
4242 }, {
4243 .eraseblocks = { {64 * 1024, 32} },
4244 .block_erase = spi_block_erase_d8,
4245 }, {
4246 /* not supported by Q16 version */
4247 .eraseblocks = { {64 * 1024, 32} },
4248 .block_erase = spi_block_erase_52,
4249 }, {
4250 .eraseblocks = { {2 * 1024 * 1024, 1} },
4251 .block_erase = spi_block_erase_60,
4252 }, {
4253 .eraseblocks = { {2 * 1024 * 1024, 1} },
4254 .block_erase = spi_block_erase_c7,
4255 }
4256 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004257 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004258 .unlock = spi_disable_blockprotect,
4259 .write = spi_chip_write_256,
4260 .read = spi_chip_read,
4261 .voltage = {2700, 3600},
4262 },
4263
4264 {
4265 .vendor = "Eon",
4266 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004267 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004268 .manufacture_id = EON_ID_NOPREFIX,
4269 .model_id = EON_EN25Q32,
4270 .total_size = 4096,
4271 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004272 /* OTP: 512B total; enter 0x3A */
4273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004274 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004275 .probe = probe_spi_rdid,
4276 .probe_timing = TIMING_ZERO,
4277 .block_erasers =
4278 {
4279 {
4280 .eraseblocks = { {4 * 1024, 1024} },
4281 .block_erase = spi_block_erase_20,
4282 }, {
4283 .eraseblocks = { {64 * 1024, 64} },
4284 .block_erase = spi_block_erase_d8,
4285 }, {
4286 .eraseblocks = { {4 * 1024 * 1024, 1} },
4287 .block_erase = spi_block_erase_60,
4288 }, {
4289 .eraseblocks = { {4 * 1024 * 1024, 1} },
4290 .block_erase = spi_block_erase_c7,
4291 }
4292 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004294 .unlock = spi_disable_blockprotect,
4295 .write = spi_chip_write_256,
4296 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004297 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004298 },
4299
4300 {
4301 .vendor = "Eon",
4302 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004303 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004304 .manufacture_id = EON_ID_NOPREFIX,
4305 .model_id = EON_EN25Q64,
4306 .total_size = 8192,
4307 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004308 /* OTP: 512B total; enter 0x3A */
4309 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004310 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004311 .probe = probe_spi_rdid,
4312 .probe_timing = TIMING_ZERO,
4313 .block_erasers =
4314 {
4315 {
4316 .eraseblocks = { {4 * 1024, 2048} },
4317 .block_erase = spi_block_erase_20,
4318 }, {
4319 .eraseblocks = { {64 * 1024, 128} },
4320 .block_erase = spi_block_erase_d8,
4321 }, {
4322 .eraseblocks = { {8 * 1024 * 1024, 1} },
4323 .block_erase = spi_block_erase_60,
4324 }, {
4325 .eraseblocks = { {8 * 1024 * 1024, 1} },
4326 .block_erase = spi_block_erase_c7,
4327 }
4328 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004329 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004330 .unlock = spi_disable_blockprotect,
4331 .write = spi_chip_write_256,
4332 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004333 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004334 },
4335
4336 {
4337 .vendor = "Eon",
4338 .name = "EN25Q128",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004339 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004340 .manufacture_id = EON_ID_NOPREFIX,
4341 .model_id = EON_EN25Q128,
4342 .total_size = 16384,
4343 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004344 /* OTP: 512B total; enter 0x3A */
4345 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004346 .tested = TEST_UNTESTED,
4347 .probe = probe_spi_rdid,
4348 .probe_timing = TIMING_ZERO,
4349 .block_erasers =
4350 {
4351 {
4352 .eraseblocks = { {4 * 1024, 4096} },
4353 .block_erase = spi_block_erase_20,
4354 }, {
4355 .eraseblocks = { {64 * 1024, 256} },
4356 .block_erase = spi_block_erase_d8,
4357 }, {
4358 .eraseblocks = { {16 * 1024 * 1024, 1} },
4359 .block_erase = spi_block_erase_60,
4360 }, {
4361 .eraseblocks = { {16 * 1024 * 1024, 1} },
4362 .block_erase = spi_block_erase_c7,
4363 }
4364 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004365 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004366 .unlock = spi_disable_blockprotect,
4367 .write = spi_chip_write_256,
4368 .read = spi_chip_read,
4369 },
4370
4371 {
4372 .vendor = "Eon",
4373 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004374 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004375 .manufacture_id = EON_ID_NOPREFIX,
4376 .model_id = EON_EN25QH16,
4377 .total_size = 2048,
4378 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004379 /* supports SFDP */
4380 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004381 /* QPI enable 0x38, disable 0xFF */
4382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00004383 .tested = TEST_OK_PR,
David Hendricks6d715302011-07-24 22:21:57 +00004384 .probe = probe_spi_rdid,
4385 .probe_timing = TIMING_ZERO,
4386 .block_erasers =
4387 {
4388 {
4389 .eraseblocks = { {4 * 1024, 512} },
4390 .block_erase = spi_block_erase_20,
4391 }, {
4392 .eraseblocks = { {64 * 1024, 32} },
4393 .block_erase = spi_block_erase_d8,
4394 }, {
4395 .eraseblocks = { {1024 * 2048, 1} },
4396 .block_erase = spi_block_erase_60,
4397 }, {
4398 .eraseblocks = { {1024 * 2048, 1} },
4399 .block_erase = spi_block_erase_c7,
4400 }
4401 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004402 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004403 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00004404 .write = spi_chip_write_256,
4405 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004406 .voltage = {2700, 3600},
4407 },
4408
4409 {
4410 .vendor = "Eon",
4411 .name = "EN25QH32",
4412 .bustype = BUS_SPI,
4413 .manufacture_id = EON_ID_NOPREFIX,
4414 .model_id = EON_EN25QH32,
4415 .total_size = 4096,
4416 .page_size = 256,
4417 /* supports SFDP */
4418 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004419 /* QPI enable 0x38, disable 0xFF */
4420 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner2cef9162012-05-14 01:51:46 +00004421 .tested = TEST_UNTESTED,
4422 .probe = probe_spi_rdid,
4423 .probe_timing = TIMING_ZERO,
4424 .block_erasers =
4425 {
4426 {
4427 .eraseblocks = { {4 * 1024, 1024} },
4428 .block_erase = spi_block_erase_20,
4429 }, {
4430 .eraseblocks = { {64 * 1024, 64} },
4431 .block_erase = spi_block_erase_d8,
4432 }, {
4433 .eraseblocks = { {1024 * 4096, 1} },
4434 .block_erase = spi_block_erase_60,
4435 }, {
4436 .eraseblocks = { {1024 * 4096, 1} },
4437 .block_erase = spi_block_erase_c7,
4438 }
4439 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004440 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004441 .unlock = spi_disable_blockprotect_bp3_srwd,
4442 .write = spi_chip_write_256,
4443 .read = spi_chip_read,
4444 .voltage = {2700, 3600},
4445 },
4446
4447 {
4448 .vendor = "Eon",
4449 .name = "EN25QH64",
4450 .bustype = BUS_SPI,
4451 .manufacture_id = EON_ID_NOPREFIX,
4452 .model_id = EON_EN25QH64,
4453 .total_size = 8192,
4454 .page_size = 256,
4455 /* supports SFDP */
4456 /* OTP: 512B total; enter 0x3A */
4457 /* QPI enable 0x38, disable 0xFF */
4458 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004459 .tested = TEST_OK_PR,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004460 .probe = probe_spi_rdid,
4461 .probe_timing = TIMING_ZERO,
4462 .block_erasers = {
4463 {
4464 .eraseblocks = { {4 * 1024, 2048} },
4465 .block_erase = spi_block_erase_20,
4466 }, {
4467 .eraseblocks = { {64 * 1024, 128} },
4468 .block_erase = spi_block_erase_d8,
4469 }, {
4470 .eraseblocks = { { 8192 * 1024, 1} },
4471 .block_erase = spi_block_erase_60,
4472 }, {
4473 .eraseblocks = { { 8192 * 1024, 1} },
4474 .block_erase = spi_block_erase_c7,
4475 }
4476 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004477 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004478 .unlock = spi_disable_blockprotect_bp3_srwd,
4479 .write = spi_chip_write_256,
4480 .read = spi_chip_read,
4481 .voltage = {2700, 3600},
4482 },
4483
4484 {
4485 .vendor = "Eon",
4486 .name = "EN25QH128",
4487 .bustype = BUS_SPI,
4488 .manufacture_id = EON_ID_NOPREFIX,
4489 .model_id = EON_EN25QH128,
4490 .total_size = 16384,
4491 .page_size = 256,
4492 /* supports SFDP */
4493 /* OTP: 512B total; enter 0x3A */
4494 /* QPI enable 0x38, disable 0xFF */
4495 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4496 .tested = TEST_UNTESTED,
4497 .probe = probe_spi_rdid,
4498 .probe_timing = TIMING_ZERO,
4499 .block_erasers = {
4500 {
4501 .eraseblocks = { {4 * 1024, 4096} },
4502 .block_erase = spi_block_erase_20,
4503 }, {
4504 .eraseblocks = { {64 * 1024, 256} },
4505 .block_erase = spi_block_erase_d8,
4506 }, {
4507 .eraseblocks = { { 16384 * 1024, 1} },
4508 .block_erase = spi_block_erase_60,
4509 }, {
4510 .eraseblocks = { { 16384 * 1024, 1} },
4511 .block_erase = spi_block_erase_c7,
4512 }
4513 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004514 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00004515 .unlock = spi_disable_blockprotect_bp3_srwd,
4516 .write = spi_chip_write_256,
4517 .read = spi_chip_read,
4518 .voltage = {2700, 3600},
4519 },
4520
4521 {
4522 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004523 .name = "EN25S10",
4524 .bustype = BUS_SPI,
4525 .manufacture_id = EON_ID_NOPREFIX,
4526 .model_id = EON_EN25S10,
4527 .total_size = 128,
4528 .page_size = 256,
4529 /* OTP: 256B total; enter 0x3A */
4530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4531 .tested = TEST_UNTESTED,
4532 .probe = probe_spi_rdid,
4533 .probe_timing = TIMING_ZERO,
4534 .block_erasers = {
4535 {
4536 .eraseblocks = { {4 * 1024, 32} },
4537 .block_erase = spi_block_erase_20,
4538 }, {
4539 .eraseblocks = { {32 * 1024, 4} },
4540 .block_erase = spi_block_erase_52,
4541 }, {
4542 .eraseblocks = { {128 * 1024, 1} },
4543 .block_erase = spi_block_erase_60,
4544 }, {
4545 .eraseblocks = { {128 * 1024, 1} },
4546 .block_erase = spi_block_erase_c7,
4547 }
4548 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004549 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004550 .unlock = spi_disable_blockprotect,
4551 .write = spi_chip_write_256,
4552 .read = spi_chip_read,
4553 .voltage = {1650, 1950},
4554 },
4555
4556 {
4557 .vendor = "Eon",
4558 .name = "EN25S20",
4559 .bustype = BUS_SPI,
4560 .manufacture_id = EON_ID_NOPREFIX,
4561 .model_id = EON_EN25S20,
4562 .total_size = 256,
4563 .page_size = 256,
4564 /* OTP: 256B total; enter 0x3A */
4565 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4566 .tested = TEST_UNTESTED,
4567 .probe = probe_spi_rdid,
4568 .probe_timing = TIMING_ZERO,
4569 .block_erasers = {
4570 {
4571 .eraseblocks = { {4 * 1024, 64} },
4572 .block_erase = spi_block_erase_20,
4573 }, {
4574 .eraseblocks = { {64 * 1024, 4} },
4575 .block_erase = spi_block_erase_d8,
4576 }, {
4577 .eraseblocks = { {256 * 1024, 1} },
4578 .block_erase = spi_block_erase_60,
4579 }, {
4580 .eraseblocks = { {256 * 1024, 1} },
4581 .block_erase = spi_block_erase_c7,
4582 }
4583 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004584 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004585 .unlock = spi_disable_blockprotect,
4586 .write = spi_chip_write_256,
4587 .read = spi_chip_read,
4588 .voltage = {1650, 1950},
4589 },
4590
4591 {
4592 .vendor = "Eon",
4593 .name = "EN25S40",
4594 .bustype = BUS_SPI,
4595 .manufacture_id = EON_ID_NOPREFIX,
4596 .model_id = EON_EN25S40,
4597 .total_size = 512,
4598 .page_size = 256,
4599 /* OTP: 256B total; enter 0x3A */
4600 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4601 .tested = TEST_UNTESTED,
4602 .probe = probe_spi_rdid,
4603 .probe_timing = TIMING_ZERO,
4604 .block_erasers = {
4605 {
4606 .eraseblocks = { {4 * 1024, 128} },
4607 .block_erase = spi_block_erase_20,
4608 }, {
4609 .eraseblocks = { {64 * 1024, 8} },
4610 .block_erase = spi_block_erase_d8,
4611 }, {
4612 .eraseblocks = { {512 * 1024, 1} },
4613 .block_erase = spi_block_erase_60,
4614 }, {
4615 .eraseblocks = { {512 * 1024, 1} },
4616 .block_erase = spi_block_erase_c7,
4617 }
4618 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004619 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004620 .unlock = spi_disable_blockprotect,
4621 .write = spi_chip_write_256,
4622 .read = spi_chip_read,
4623 .voltage = {1650, 1950},
4624 },
4625
4626 {
4627 .vendor = "Eon",
4628 .name = "EN25S80",
4629 .bustype = BUS_SPI,
4630 .manufacture_id = EON_ID_NOPREFIX,
4631 .model_id = EON_EN25S80,
4632 .total_size = 1024,
4633 .page_size = 256,
4634 /* OTP: 256B total; enter 0x3A */
4635 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4636 .tested = TEST_UNTESTED,
4637 .probe = probe_spi_rdid,
4638 .probe_timing = TIMING_ZERO,
4639 .block_erasers = {
4640 {
4641 .eraseblocks = { {4 * 1024, 256} },
4642 .block_erase = spi_block_erase_20,
4643 }, {
4644 .eraseblocks = { {64 * 1024, 16} },
4645 .block_erase = spi_block_erase_d8,
4646 }, {
4647 .eraseblocks = { {1024 * 1024, 1} },
4648 .block_erase = spi_block_erase_60,
4649 }, {
4650 .eraseblocks = { {1024 * 1024, 1} },
4651 .block_erase = spi_block_erase_c7,
4652 }
4653 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00004654 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00004655 .unlock = spi_disable_blockprotect,
4656 .write = spi_chip_write_256,
4657 .read = spi_chip_read,
4658 .voltage = {1650, 1950},
4659 },
4660
4661 {
4662 .vendor = "Eon",
4663 .name = "EN25S16",
4664 .bustype = BUS_SPI,
4665 .manufacture_id = EON_ID_NOPREFIX,
4666 .model_id = EON_EN25S16,
4667 .total_size = 2048,
4668 .page_size = 256,
4669 /* OTP: 512B total; enter 0x3A */
4670 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4671 .tested = TEST_UNTESTED,
4672 .probe = probe_spi_rdid,
4673 .probe_timing = TIMING_ZERO,
4674 .block_erasers = {
4675 {
4676 .eraseblocks = { {4 * 1024, 512} },
4677 .block_erase = spi_block_erase_20,
4678 }, {
4679 .eraseblocks = { {64 * 1024, 32} },
4680 .block_erase = spi_block_erase_52,
4681 }, {
4682 .eraseblocks = { {32 * 1024, 64} },
4683 .block_erase = spi_block_erase_d8,
4684 }, {
4685 .eraseblocks = { {2048 * 1024, 1} },
4686 .block_erase = spi_block_erase_60,
4687 }, {
4688 .eraseblocks = { {2048 * 1024, 1} },
4689 .block_erase = spi_block_erase_c7,
4690 }
4691 },
4692 .printlock = spi_prettyprint_status_register_en25s_wp,
4693 .unlock = spi_disable_blockprotect_bp3_srwd,
4694 .write = spi_chip_write_256,
4695 .read = spi_chip_read,
4696 .voltage = {1650, 1950},
4697 },
4698
4699 {
4700 .vendor = "Eon",
4701 .name = "EN25S32",
4702 .bustype = BUS_SPI,
4703 .manufacture_id = EON_ID_NOPREFIX,
4704 .model_id = EON_EN25S32,
4705 .total_size = 4096,
4706 .page_size = 256,
4707 /* OTP: 512B total; enter 0x3A */
4708 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4709 .tested = TEST_UNTESTED,
4710 .probe = probe_spi_rdid,
4711 .probe_timing = TIMING_ZERO,
4712 .block_erasers = {
4713 {
4714 .eraseblocks = { {4 * 1024, 1024} },
4715 .block_erase = spi_block_erase_20,
4716 }, {
4717 .eraseblocks = { {32 * 1024, 128} },
4718 .block_erase = spi_block_erase_52,
4719 }, {
4720 .eraseblocks = { {64 * 1024, 64} },
4721 .block_erase = spi_block_erase_d8,
4722 }, {
4723 .eraseblocks = { {4096 * 1024, 1} },
4724 .block_erase = spi_block_erase_60,
4725 }, {
4726 .eraseblocks = { {4096 * 1024, 1} },
4727 .block_erase = spi_block_erase_c7,
4728 }
4729 },
4730 .printlock = spi_prettyprint_status_register_en25s_wp,
4731 .unlock = spi_disable_blockprotect_bp3_srwd,
4732 .write = spi_chip_write_256,
4733 .read = spi_chip_read,
4734 .voltage = {1650, 1950},
4735 },
4736
4737 {
4738 .vendor = "Eon",
4739 .name = "EN25S64",
4740 .bustype = BUS_SPI,
4741 .manufacture_id = EON_ID_NOPREFIX,
4742 .model_id = EON_EN25S64,
4743 .total_size = 8192,
4744 .page_size = 256,
4745 /* OTP: 512B total; enter 0x3A */
4746 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
4747 .tested = TEST_UNTESTED,
4748 .probe = probe_spi_rdid,
4749 .probe_timing = TIMING_ZERO,
4750 .block_erasers = {
4751 {
4752 .eraseblocks = { {4 * 1024, 2048} },
4753 .block_erase = spi_block_erase_20,
4754 }, {
4755 .eraseblocks = { {64 * 1024, 128} },
4756 .block_erase = spi_block_erase_d8,
4757 }, {
4758 .eraseblocks = { {8192 * 1024, 1} },
4759 .block_erase = spi_block_erase_60,
4760 }, {
4761 .eraseblocks = { {8192 * 1024, 1} },
4762 .block_erase = spi_block_erase_c7,
4763 }
4764 },
4765 .printlock = spi_prettyprint_status_register_en25s_wp,
4766 .unlock = spi_disable_blockprotect_bp3_srwd,
4767 .write = spi_chip_write_256,
4768 .read = spi_chip_read,
4769 .voltage = {1650, 1950},
4770 },
4771
4772 {
4773 .vendor = "Eon",
Russ Dill3cd5a122010-03-05 08:44:11 +00004774 .name = "EN29F010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004775 .bustype = BUS_PARALLEL,
Russ Dill3cd5a122010-03-05 08:44:11 +00004776 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004777 .model_id = EON_EN29F010,
Russ Dill3cd5a122010-03-05 08:44:11 +00004778 .total_size = 128,
4779 .page_size = 128,
4780 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004781 .tested = TEST_OK_PRE,
Russ Dill3cd5a122010-03-05 08:44:11 +00004782 .probe = probe_jedec,
4783 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4784 .block_erasers =
4785 {
4786 {
4787 .eraseblocks = { {16 * 1024, 8} },
4788 .block_erase = erase_sector_jedec,
4789 },
4790 {
4791 .eraseblocks = { {128 * 1024, 1} },
4792 .block_erase = erase_chip_block_jedec,
4793 },
4794 },
4795 .write = write_jedec_1,
4796 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004797 .voltage = {4500, 5500},
Russ Dill3cd5a122010-03-05 08:44:11 +00004798 },
4799
4800 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004801 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004802 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004803 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004804 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004805 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004806 .total_size = 256,
4807 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004808 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00004809 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004810 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004811 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004812 .block_erasers =
4813 {
4814 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004815 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004816 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004817 {8 * 1024, 2},
4818 {32 * 1024, 1},
4819 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004820 },
4821 .block_erase = erase_sector_jedec,
4822 }, {
4823 .eraseblocks = { {256 * 1024, 1} },
4824 .block_erase = erase_chip_block_jedec,
4825 },
4826 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004827 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004828 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004829 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004830 },
4831
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004832 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00004833 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004834 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004835 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004836 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004837 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004838 .total_size = 256,
4839 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00004840 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00004841 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004842 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00004843 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00004844 .block_erasers =
4845 {
4846 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004847 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00004848 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00004849 {32 * 1024, 1},
4850 {8 * 1024, 2},
4851 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00004852 },
4853 .block_erase = erase_sector_jedec,
4854 }, {
4855 .eraseblocks = { {256 * 1024, 1} },
4856 .block_erase = erase_chip_block_jedec,
4857 },
4858 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00004859 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00004860 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004861 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00004862 },
4863
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00004864 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004865 .vendor = "Eon",
4866 .name = "EN29LV640B",
4867 .bustype = BUS_PARALLEL,
4868 .manufacture_id = EON_ID,
4869 .model_id = EON_EN29LV640B,
4870 .total_size = 8192,
4871 .page_size = 8192,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00004872 .feature_bits = FEATURE_ADDR_SHIFTED,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004873 .tested = TEST_OK_PREW,
4874 .probe = probe_en29lv640b,
4875 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4876 .block_erasers =
4877 {
4878 {
4879 .eraseblocks = {
4880 {8 * 1024, 8},
4881 {64 * 1024, 127},
4882 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00004883 .block_erase = erase_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004884 }, {
4885 .eraseblocks = { {8 * 1024 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00004886 .block_erase = erase_chip_block_jedec,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00004887 },
4888 },
4889 .write = write_en29lv640b,
4890 .read = read_memmapped,
4891 .voltage = {2700, 3600},
4892 },
4893
4894 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00004895 .vendor = "Eon",
4896 .name = "EN29GL064(A)B",
4897 .bustype = BUS_PARALLEL,
4898 .manufacture_id = EON_ID,
4899 .model_id = EON_EN29GL064B,
4900 .total_size = 8192,
4901 .page_size = 128 * 1024, /* actual page size is 16 */
4902 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4903 .tested = TEST_UNTESTED,
4904 .probe = probe_jedec_29gl,
4905 .probe_timing = TIMING_ZERO,
4906 .block_erasers =
4907 {
4908 {
4909 .eraseblocks = {
4910 {8 * 1024, 8},
4911 {64 * 1024, 127},
4912 },
4913 .block_erase = erase_sector_jedec,
4914 }, {
4915 .eraseblocks = { {8 * 1024 * 1024, 1} },
4916 .block_erase = erase_chip_block_jedec,
4917 },
4918 },
4919 .write = write_jedec_1,
4920 .read = read_memmapped,
4921 .voltage = {2700, 3600},
4922 },
4923
4924 {
4925 .vendor = "Eon",
4926 .name = "EN29GL064(A)T",
4927 .bustype = BUS_PARALLEL,
4928 .manufacture_id = EON_ID,
4929 .model_id = EON_EN29GL064T,
4930 .total_size = 8192,
4931 .page_size = 128 * 1024, /* actual page size is 16 */
4932 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4933 .tested = TEST_UNTESTED,
4934 .probe = probe_jedec_29gl,
4935 .probe_timing = TIMING_ZERO,
4936 .block_erasers =
4937 {
4938 {
4939 .eraseblocks = {
4940 {64 * 1024, 127},
4941 {8 * 1024, 8},
4942 },
4943 .block_erase = erase_sector_jedec,
4944 }, {
4945 .eraseblocks = { {8 * 1024 * 1024, 1} },
4946 .block_erase = erase_chip_block_jedec,
4947 },
4948 },
4949 .write = write_jedec_1,
4950 .read = read_memmapped,
4951 .voltage = {2700, 3600},
4952 },
4953
4954 {
4955 .vendor = "Eon",
4956 .name = "EN29GL064H/L",
4957 .bustype = BUS_PARALLEL,
4958 .manufacture_id = EON_ID,
4959 .model_id = EON_EN29GL064HL,
4960 .total_size = 8192,
4961 .page_size = 128 * 1024, /* actual page size is 16 */
4962 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4963 .tested = TEST_UNTESTED,
4964 .probe = probe_jedec_29gl,
4965 .probe_timing = TIMING_ZERO,
4966 .block_erasers =
4967 {
4968 {
4969 .eraseblocks = { {64 * 1024, 128} },
4970 .block_erase = erase_sector_jedec,
4971 }, {
4972 .eraseblocks = { {8 * 1024 * 1024, 1} },
4973 .block_erase = erase_chip_block_jedec,
4974 },
4975 },
4976 .write = write_jedec_1,
4977 .read = read_memmapped,
4978 .voltage = {2700, 3600},
4979 },
4980
4981 {
4982 .vendor = "Eon",
4983 .name = "EN29GL128",
4984 .bustype = BUS_PARALLEL,
4985 .manufacture_id = EON_ID,
4986 .model_id = EON_EN29GL128HL,
4987 .total_size = 16384,
4988 .page_size = 128 * 1024, /* actual page size is 16 */
4989 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4990 .tested = TEST_UNTESTED,
4991 .probe = probe_jedec_29gl,
4992 .probe_timing = TIMING_ZERO,
4993 .block_erasers =
4994 {
4995 {
4996 .eraseblocks = { {128 * 1024, 128} },
4997 .block_erase = erase_sector_jedec,
4998 }, {
4999 .eraseblocks = { {16 * 1024 * 1024, 1} },
5000 .block_erase = erase_chip_block_jedec,
5001 },
5002 },
5003 .write = write_jedec_1,
5004 .read = read_memmapped,
5005 .voltage = {2700, 3600},
5006 },
5007
5008 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005009 .vendor = "Fujitsu",
5010 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005011 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005012 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005013 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005014 .total_size = 512,
5015 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005016 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005017 .tested = TEST_UNTESTED,
5018 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005019 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005020 .block_erasers =
5021 {
5022 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005023 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005024 {16 * 1024, 1},
5025 {8 * 1024, 2},
5026 {32 * 1024, 1},
5027 {64 * 1024, 7},
5028 },
Sean Nelson35727f72010-01-28 23:55:12 +00005029 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005030 }, {
5031 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005032 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005033 },
5034 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005035 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005036 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005037 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005038 },
5039
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005040 {
5041 .vendor = "Fujitsu",
5042 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005043 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005044 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005045 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005046 .total_size = 512,
5047 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00005048 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005049 .tested = TEST_UNTESTED,
5050 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005051 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005052 .block_erasers =
5053 {
5054 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005055 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005056 {64 * 1024, 7},
5057 {32 * 1024, 1},
5058 {8 * 1024, 2},
5059 {16 * 1024, 1},
5060 },
Sean Nelson35727f72010-01-28 23:55:12 +00005061 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005062 }, {
5063 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00005064 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005065 },
5066 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005067 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005068 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005069 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005070 },
5071
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005072 {
Sean Nelson35727f72010-01-28 23:55:12 +00005073 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005074 .vendor = "Fujitsu",
5075 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005076 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005077 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005078 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005079 .total_size = 512,
5080 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005081 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00005082 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005083 .probe = probe_jedec,
5084 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005085 .block_erasers =
5086 {
5087 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005088 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005089 {16 * 1024, 1},
5090 {8 * 1024, 2},
5091 {32 * 1024, 1},
5092 {64 * 1024, 7},
5093 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005094 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005095 }, {
5096 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005097 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005098 },
5099 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005100 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005101 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005102 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005103 },
5104
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005105 {
5106 .vendor = "Fujitsu",
5107 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005108 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005109 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005110 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005111 .total_size = 512,
5112 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005113 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005114 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005115 .probe = probe_jedec,
5116 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00005117 .block_erasers =
5118 {
5119 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005120 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005121 {64 * 1024, 7},
5122 {32 * 1024, 1},
5123 {8 * 1024, 2},
5124 {16 * 1024, 1},
5125 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005126 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005127 }, {
5128 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005129 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00005130 },
5131 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005132 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005133 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005134 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00005135 },
5136
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005137 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005138 .vendor = "Fujitsu",
5139 .name = "MBM29LV160BE",
5140 .bustype = BUS_PARALLEL,
5141 .manufacture_id = FUJITSU_ID,
5142 .model_id = FUJITSU_MBM29LV160BE,
5143 .total_size = 2 * 1024,
5144 .page_size = 0,
5145 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5146 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005147 .probe = probe_jedec,
5148 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005149 .block_erasers =
5150 {
5151 {
5152 .eraseblocks = {
5153 {16 * 1024, 1},
5154 {8 * 1024, 2},
5155 {32 * 1024, 1},
5156 {64 * 1024, 31},
5157 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005158 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005159 }, {
5160 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005161 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005162 },
5163 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005164 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005165 .read = read_memmapped,
5166 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5167 },
5168
5169 {
5170 .vendor = "Fujitsu",
5171 .name = "MBM29LV160TE",
5172 .bustype = BUS_PARALLEL,
5173 .manufacture_id = FUJITSU_ID,
5174 .model_id = FUJITSU_MBM29LV160TE,
5175 .total_size = 2 * 1024,
5176 .page_size = 0,
5177 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5178 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005179 .probe = probe_jedec,
5180 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005181 .block_erasers =
5182 {
5183 {
5184 .eraseblocks = {
5185 {64 * 1024, 31},
5186 {32 * 1024, 1},
5187 {8 * 1024, 2},
5188 {16 * 1024, 1},
5189 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005190 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005191 }, {
5192 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005193 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005194 },
5195 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00005196 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00005197 .read = read_memmapped,
5198 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5199 },
5200
5201 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005202 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005203 .name = "GD25LQ32",
5204 .bustype = BUS_SPI,
5205 .manufacture_id = GIGADEVICE_ID,
5206 .model_id = GIGADEVICE_GD25LQ32,
5207 .total_size = 4096,
5208 .page_size = 256,
5209 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5211 .tested = TEST_OK_PREW,
5212 .probe = probe_spi_rdid,
5213 .probe_timing = TIMING_ZERO,
5214 .block_erasers =
5215 {
5216 {
5217 .eraseblocks = { {4 * 1024, 1024} },
5218 .block_erase = spi_block_erase_20,
5219 }, {
5220 .eraseblocks = { {32 * 1024, 128} },
5221 .block_erase = spi_block_erase_52,
5222 }, {
5223 .eraseblocks = { {64 * 1024, 64} },
5224 .block_erase = spi_block_erase_d8,
5225 }, {
5226 .eraseblocks = { {4 * 1024 * 1024, 1} },
5227 .block_erase = spi_block_erase_60,
5228 }, {
5229 .eraseblocks = { {4 * 1024 * 1024, 1} },
5230 .block_erase = spi_block_erase_c7,
5231 }
5232 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005233 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005234 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5235 .write = spi_chip_write_256,
5236 .read = spi_chip_read,
5237 .voltage = {1700, 1950},
5238 },
5239
5240 {
5241 .vendor = "GigaDevice",
5242 .name = "GD25Q512",
5243 .bustype = BUS_SPI,
5244 .manufacture_id = GIGADEVICE_ID,
5245 .model_id = GIGADEVICE_GD25Q512,
5246 .total_size = 64,
5247 .page_size = 256,
5248 .feature_bits = FEATURE_WRSR_WREN,
5249 .tested = TEST_UNTESTED,
5250 .probe = probe_spi_rdid,
5251 .probe_timing = TIMING_ZERO,
5252 .block_erasers = {
5253 {
5254 .eraseblocks = { {4 * 1024, 16} },
5255 .block_erase = spi_block_erase_20,
5256 }, {
5257 .eraseblocks = { {32 * 1024, 2} },
5258 .block_erase = spi_block_erase_52,
5259 }, {
5260 .eraseblocks = { {64 * 1024, 1} },
5261 .block_erase = spi_block_erase_60,
5262 }, {
5263 .eraseblocks = { {64 * 1024, 1} },
5264 .block_erase = spi_block_erase_c7,
5265 }
5266 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005267 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005268 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5269 .write = spi_chip_write_256,
5270 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5271 .voltage = {2700, 3600},
5272 },
5273
5274 {
5275 .vendor = "GigaDevice",
5276 .name = "GD25Q10",
5277 .bustype = BUS_SPI,
5278 .manufacture_id = GIGADEVICE_ID,
5279 .model_id = GIGADEVICE_GD25Q10,
5280 .total_size = 128,
5281 .page_size = 256,
5282 .feature_bits = FEATURE_WRSR_WREN,
5283 .tested = TEST_UNTESTED,
5284 .probe = probe_spi_rdid,
5285 .probe_timing = TIMING_ZERO,
5286 .block_erasers = {
5287 {
5288 .eraseblocks = { {4 * 1024, 32} },
5289 .block_erase = spi_block_erase_20,
5290 }, {
5291 .eraseblocks = { {32 * 1024, 4} },
5292 .block_erase = spi_block_erase_52,
5293 }, {
5294 .eraseblocks = { {64 * 1024, 2} },
5295 .block_erase = spi_block_erase_d8,
5296 }, {
5297 .eraseblocks = { {128 * 1024, 1} },
5298 .block_erase = spi_block_erase_60,
5299 }, {
5300 .eraseblocks = { {128 * 1024, 1} },
5301 .block_erase = spi_block_erase_c7,
5302 }
5303 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005304 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005305 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5306 .write = spi_chip_write_256,
5307 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5308 .voltage = {2700, 3600},
5309 },
5310
5311 {
5312 .vendor = "GigaDevice",
5313 .name = "GD25Q20(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005314 .bustype = BUS_SPI,
5315 .manufacture_id = GIGADEVICE_ID,
5316 .model_id = GIGADEVICE_GD25Q20,
5317 .total_size = 256,
5318 .page_size = 256,
5319 .feature_bits = FEATURE_WRSR_WREN,
5320 .tested = TEST_UNTESTED,
5321 .probe = probe_spi_rdid,
5322 .probe_timing = TIMING_ZERO,
5323 .block_erasers =
5324 {
5325 {
5326 .eraseblocks = { {4 * 1024, 64} },
5327 .block_erase = spi_block_erase_20,
5328 }, {
5329 .eraseblocks = { {32 * 1024, 8} },
5330 .block_erase = spi_block_erase_52,
5331 }, {
5332 .eraseblocks = { {64 * 1024, 4} },
5333 .block_erase = spi_block_erase_d8,
5334 }, {
5335 .eraseblocks = { {256 * 1024, 1} },
5336 .block_erase = spi_block_erase_60,
5337 }, {
5338 .eraseblocks = { {256 * 1024, 1} },
5339 .block_erase = spi_block_erase_c7,
5340 }
5341 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005342 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005343 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005344 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005345 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005346 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005347 },
5348
5349 {
5350 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005351 .name = "GD25Q40(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005352 .bustype = BUS_SPI,
5353 .manufacture_id = GIGADEVICE_ID,
5354 .model_id = GIGADEVICE_GD25Q40,
5355 .total_size = 512,
5356 .page_size = 256,
5357 .feature_bits = FEATURE_WRSR_WREN,
5358 .tested = TEST_UNTESTED,
5359 .probe = probe_spi_rdid,
5360 .probe_timing = TIMING_ZERO,
5361 .block_erasers =
5362 {
5363 {
5364 .eraseblocks = { {4 * 1024, 128} },
5365 .block_erase = spi_block_erase_20,
5366 }, {
5367 .eraseblocks = { {32 * 1024, 16} },
5368 .block_erase = spi_block_erase_52,
5369 }, {
5370 .eraseblocks = { {64 * 1024, 8} },
5371 .block_erase = spi_block_erase_d8,
5372 }, {
5373 .eraseblocks = { {512 * 1024, 1} },
5374 .block_erase = spi_block_erase_60,
5375 }, {
5376 .eraseblocks = { {512 * 1024, 1} },
5377 .block_erase = spi_block_erase_c7,
5378 }
5379 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005380 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005381 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005382 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005383 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Taunereb582572012-09-21 12:52:50 +00005384 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005385 },
5386
5387 {
5388 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005389 .name = "GD25Q80(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005390 .bustype = BUS_SPI,
5391 .manufacture_id = GIGADEVICE_ID,
5392 .model_id = GIGADEVICE_GD25Q80,
5393 .total_size = 1024,
5394 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005395 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005396 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5397 .tested = TEST_OK_PREW,
5398 .probe = probe_spi_rdid,
5399 .probe_timing = TIMING_ZERO,
5400 .block_erasers =
5401 {
5402 {
5403 .eraseblocks = { {4 * 1024, 256} },
5404 .block_erase = spi_block_erase_20,
5405 }, {
5406 .eraseblocks = { {32 * 1024, 32} },
5407 .block_erase = spi_block_erase_52,
5408 }, {
5409 .eraseblocks = { {64 * 1024, 16} },
5410 .block_erase = spi_block_erase_d8,
5411 }, {
5412 .eraseblocks = { {1024 * 1024, 1} },
5413 .block_erase = spi_block_erase_60,
5414 }, {
5415 .eraseblocks = { {1024 * 1024, 1} },
5416 .block_erase = spi_block_erase_c7,
5417 }
5418 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005419 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005420 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005421 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005422 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005423 .voltage = {2700, 3600},
5424 },
5425
5426 {
5427 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005428 .name = "GD25Q16(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005429 .bustype = BUS_SPI,
5430 .manufacture_id = GIGADEVICE_ID,
5431 .model_id = GIGADEVICE_GD25Q16,
5432 .total_size = 2048,
5433 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005434 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00005436 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005437 .probe = probe_spi_rdid,
5438 .probe_timing = TIMING_ZERO,
5439 .block_erasers =
5440 {
5441 {
5442 .eraseblocks = { {4 * 1024, 512} },
5443 .block_erase = spi_block_erase_20,
5444 }, {
5445 .eraseblocks = { {32 * 1024, 64} },
5446 .block_erase = spi_block_erase_52,
5447 }, {
5448 .eraseblocks = { {64 * 1024, 32} },
5449 .block_erase = spi_block_erase_d8,
5450 }, {
5451 .eraseblocks = { {2 * 1024 * 1024, 1} },
5452 .block_erase = spi_block_erase_60,
5453 }, {
5454 .eraseblocks = { {2 * 1024 * 1024, 1} },
5455 .block_erase = spi_block_erase_c7,
5456 }
5457 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005458 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005459 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005460 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005461 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005462 .voltage = {2700, 3600},
5463 },
5464
5465 {
5466 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005467 .name = "GD25Q32(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005468 .bustype = BUS_SPI,
5469 .manufacture_id = GIGADEVICE_ID,
5470 .model_id = GIGADEVICE_GD25Q32,
5471 .total_size = 4096,
5472 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005473 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005474 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00005475 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005476 .probe = probe_spi_rdid,
5477 .probe_timing = TIMING_ZERO,
5478 .block_erasers =
5479 {
5480 {
5481 .eraseblocks = { {4 * 1024, 1024} },
5482 .block_erase = spi_block_erase_20,
5483 }, {
5484 .eraseblocks = { {32 * 1024, 128} },
5485 .block_erase = spi_block_erase_52,
5486 }, {
5487 .eraseblocks = { {64 * 1024, 64} },
5488 .block_erase = spi_block_erase_d8,
5489 }, {
5490 .eraseblocks = { {4 * 1024 * 1024, 1} },
5491 .block_erase = spi_block_erase_60,
5492 }, {
5493 .eraseblocks = { {4 * 1024 * 1024, 1} },
5494 .block_erase = spi_block_erase_c7,
5495 }
5496 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005497 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005498 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005499 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005500 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005501 .voltage = {2700, 3600},
5502 },
5503
5504 {
5505 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005506 .name = "GD25Q64(B)",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005507 .bustype = BUS_SPI,
5508 .manufacture_id = GIGADEVICE_ID,
5509 .model_id = GIGADEVICE_GD25Q64,
5510 .total_size = 8192,
5511 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005512 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005513 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunereb582572012-09-21 12:52:50 +00005514 .tested = TEST_OK_PREW,
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005515 .probe = probe_spi_rdid,
5516 .probe_timing = TIMING_ZERO,
5517 .block_erasers =
5518 {
5519 {
5520 .eraseblocks = { {4 * 1024, 2048} },
5521 .block_erase = spi_block_erase_20,
5522 }, {
5523 .eraseblocks = { {32 * 1024, 256} },
5524 .block_erase = spi_block_erase_52,
5525 }, {
5526 .eraseblocks = { {64 * 1024, 128} },
5527 .block_erase = spi_block_erase_d8,
5528 }, {
5529 .eraseblocks = { {8 * 1024 * 1024, 1} },
5530 .block_erase = spi_block_erase_60,
5531 }, {
5532 .eraseblocks = { {8 * 1024 * 1024, 1} },
5533 .block_erase = spi_block_erase_c7,
5534 }
5535 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005536 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005537 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005538 .write = spi_chip_write_256,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005539 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner352e50b2013-02-22 15:58:45 +00005540 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005541 },
5542
5543 {
5544 .vendor = "GigaDevice",
Stefan Tauner352e50b2013-02-22 15:58:45 +00005545 .name = "GD25Q128B",
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005546 .bustype = BUS_SPI,
5547 .manufacture_id = GIGADEVICE_ID,
5548 .model_id = GIGADEVICE_GD25Q128,
5549 .total_size = 16384,
5550 .page_size = 256,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005551 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5553 .tested = TEST_UNTESTED,
5554 .probe = probe_spi_rdid,
5555 .probe_timing = TIMING_ZERO,
5556 .block_erasers =
5557 {
5558 {
5559 .eraseblocks = { {4 * 1024, 4096} },
5560 .block_erase = spi_block_erase_20,
5561 }, {
5562 .eraseblocks = { {32 * 1024, 512} },
5563 .block_erase = spi_block_erase_52,
5564 }, {
5565 .eraseblocks = { {64 * 1024, 256} },
5566 .block_erase = spi_block_erase_d8,
5567 }, {
5568 .eraseblocks = { {16 * 1024 * 1024, 1} },
5569 .block_erase = spi_block_erase_60,
5570 }, {
5571 .eraseblocks = { {16 * 1024 * 1024, 1} },
5572 .block_erase = spi_block_erase_c7,
5573 }
5574 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005575 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00005576 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5577 .write = spi_chip_write_256,
5578 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5579 .voltage = {2700, 3600},
5580 },
5581
5582 {
5583 .vendor = "GigaDevice",
5584 .name = "GD25T80",
5585 .bustype = BUS_SPI,
5586 .manufacture_id = GIGADEVICE_ID,
5587 .model_id = GIGADEVICE_GD25T80,
5588 .total_size = 1024,
5589 .page_size = 256,
5590 /* OTP: 256B total; enter 0x3A */
5591 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5592 .tested = TEST_UNTESTED,
5593 .probe = probe_spi_rdid,
5594 .probe_timing = TIMING_ZERO,
5595 .block_erasers = {
5596 {
5597 .eraseblocks = { {4 * 1024, 256} },
5598 .block_erase = spi_block_erase_20,
5599 }, {
5600 .eraseblocks = { {64 * 1024, 16} },
5601 .block_erase = spi_block_erase_52,
5602 }, {
5603 .eraseblocks = { {64 * 1024, 16} },
5604 .block_erase = spi_block_erase_d8,
5605 }, {
5606 .eraseblocks = { {1024 * 1024, 1} },
5607 .block_erase = spi_block_erase_60,
5608 }, {
5609 .eraseblocks = { {1024 * 1024, 1} },
5610 .block_erase = spi_block_erase_c7,
5611 }
5612 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005613 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005614 .unlock = spi_disable_blockprotect,
5615 .write = spi_chip_write_256,
5616 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005617 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00005618 },
5619
5620 {
David Borgc96a8bd2010-06-21 16:12:22 +00005621 .vendor = "Hyundai",
5622 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005623 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005624 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005625 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00005626 .total_size = 256,
5627 .page_size = 256 * 1024,
5628 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00005629 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00005630 .probe = probe_jedec,
5631 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5632 .block_erasers =
5633 {
5634 {
5635 .eraseblocks = {
5636 {64 * 1024, 3},
5637 {32 * 1024, 1},
5638 {8 * 1024, 2},
5639 {16 * 1024, 1},
5640 },
5641 .block_erase = erase_sector_jedec,
5642 }, {
5643 .eraseblocks = { {256 * 1024, 1} },
5644 .block_erase = erase_chip_block_jedec,
5645 },
5646 },
5647 .write = write_jedec_1,
5648 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005649 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005650 },
5651
5652 {
5653 .vendor = "Hyundai",
5654 .name = "HY29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005655 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00005656 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005657 .model_id = HYUNDAI_HY29F002B,
David Borgc96a8bd2010-06-21 16:12:22 +00005658 .total_size = 256,
5659 .page_size = 256 * 1024,
5660 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
5661 .tested = TEST_UNTESTED,
5662 .probe = probe_jedec,
5663 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5664 .block_erasers =
5665 {
5666 {
5667 .eraseblocks = {
5668 {16 * 1024, 1},
5669 {8 * 1024, 2},
5670 {32 * 1024, 1},
5671 {64 * 1024, 3},
5672 },
5673 .block_erase = erase_sector_jedec,
5674 }, {
5675 .eraseblocks = { {256 * 1024, 1} },
5676 .block_erase = erase_chip_block_jedec,
5677 },
5678 },
5679 .write = write_jedec_1,
5680 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005681 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00005682 },
5683
5684 {
Joshua Roysf1324e02010-09-16 00:51:51 +00005685 .vendor = "Hyundai",
5686 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005687 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00005688 .manufacture_id = HYUNDAI_ID,
5689 .model_id = HYUNDAI_HY29F040A,
5690 .total_size = 512,
5691 .page_size = 64 * 1024,
5692 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5693 .tested = TEST_UNTESTED,
5694 .probe = probe_jedec,
5695 .probe_timing = TIMING_ZERO,
5696 .block_erasers =
5697 {
5698 {
5699 .eraseblocks = { {64 * 1024, 8} },
5700 .block_erase = erase_sector_jedec,
5701 }, {
5702 .eraseblocks = { {512 * 1024, 1} },
5703 .block_erase = erase_chip_block_jedec,
5704 },
5705 },
5706 .write = write_jedec_1,
5707 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00005708 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00005709 },
5710
5711 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005712 .vendor = "Intel",
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005713 .name = "25F160S33B8",
5714 .bustype = BUS_SPI,
5715 .manufacture_id = INTEL_ID,
5716 .model_id = INTEL_25F160S33B8,
5717 .total_size = 2048,
5718 .page_size = 256,
5719 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5720 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5721 .tested = TEST_UNTESTED,
5722 .probe = probe_spi_rdid,
5723 .probe_timing = TIMING_ZERO,
5724 .block_erasers =
5725 {
5726 {
5727 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5728 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5729 * have no effect on the memory contents, but sets a flag in the SR.
5730 .eraseblocks = {
5731 {8 * 1024, 8},
5732 {64 * 1024, 31} // inaccessible
5733 },
5734 .block_erase = spi_block_erase_40,
5735 }, { */
5736 .eraseblocks = { {64 * 1024, 32} },
5737 .block_erase = spi_block_erase_d8,
5738 }, {
5739 .eraseblocks = { {2 * 1024 * 1024, 1} },
5740 .block_erase = spi_block_erase_c7,
5741 }
5742 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005743 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5744 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005745 .write = spi_chip_write_256,
5746 .read = spi_chip_read, /* also fast read 0x0B */
5747 .voltage = {2700, 3600},
5748 },
5749
5750 {
5751 .vendor = "Intel",
5752 .name = "25F160S33T8",
5753 .bustype = BUS_SPI,
5754 .manufacture_id = INTEL_ID,
5755 .model_id = INTEL_25F160S33T8,
5756 .total_size = 2048,
5757 .page_size = 256,
5758 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5760 .tested = TEST_UNTESTED,
5761 .probe = probe_spi_rdid,
5762 .probe_timing = TIMING_ZERO,
5763 .block_erasers =
5764 {
5765 {
5766 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5767 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5768 * have no effect on the memory contents, but sets a flag in the SR.
5769 .eraseblocks = {
5770 {64 * 1024, 31}, // inaccessible
5771 {8 * 1024, 8}
5772 },
5773 .block_erase = spi_block_erase_40,
5774 }, { */
5775 .eraseblocks = { {64 * 1024, 32} },
5776 .block_erase = spi_block_erase_d8,
5777 }, {
5778 .eraseblocks = { {2 * 1024 * 1024, 1} },
5779 .block_erase = spi_block_erase_c7,
5780 }
5781 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005782 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5783 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005784 .write = spi_chip_write_256,
5785 .read = spi_chip_read, /* also fast read 0x0B */
5786 .voltage = {2700, 3600},
5787 },
5788
5789 {
5790 .vendor = "Intel",
5791 .name = "25F320S33B8",
5792 .bustype = BUS_SPI,
5793 .manufacture_id = INTEL_ID,
5794 .model_id = INTEL_25F320S33B8,
5795 .total_size = 4096,
5796 .page_size = 256,
5797 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5798 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5799 .tested = TEST_UNTESTED,
5800 .probe = probe_spi_rdid,
5801 .probe_timing = TIMING_ZERO,
5802 .block_erasers =
5803 {
5804 {
5805 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5806 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5807 * have no effect on the memory contents, but sets a flag in the SR.
5808 .eraseblocks = {
5809 {8 * 1024, 8},
5810 {64 * 1024, 63} // inaccessible
5811 },
5812 .block_erase = spi_block_erase_40,
5813 }, { */
5814 .eraseblocks = { {64 * 1024, 64} },
5815 .block_erase = spi_block_erase_d8,
5816 }, {
5817 .eraseblocks = { {4 * 1024 * 1024, 1} },
5818 .block_erase = spi_block_erase_c7,
5819 }
5820 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005821 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5822 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005823 .write = spi_chip_write_256,
5824 .read = spi_chip_read, /* also fast read 0x0B */
5825 .voltage = {2700, 3600},
5826 },
5827
5828 {
5829 .vendor = "Intel",
5830 .name = "25F320S33T8",
5831 .bustype = BUS_SPI,
5832 .manufacture_id = INTEL_ID,
5833 .model_id = INTEL_25F320S33T8,
5834 .total_size = 4096,
5835 .page_size = 256,
5836 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5838 .tested = TEST_UNTESTED,
5839 .probe = probe_spi_rdid,
5840 .probe_timing = TIMING_ZERO,
5841 .block_erasers =
5842 {
5843 {
5844 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5845 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5846 * have no effect on the memory contents, but sets a flag in the SR.
5847 .eraseblocks = {
5848 {64 * 1024, 63}, // inaccessible
5849 {8 * 1024, 8}
5850 },
5851 .block_erase = spi_block_erase_40,
5852 }, { */
5853 .eraseblocks = { {64 * 1024, 64} },
5854 .block_erase = spi_block_erase_d8,
5855 }, {
5856 .eraseblocks = { {4 * 1024 * 1024, 1} },
5857 .block_erase = spi_block_erase_c7,
5858 }
5859 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005860 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5861 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005862 .write = spi_chip_write_256,
5863 .read = spi_chip_read, /* also fast read 0x0B */
5864 .voltage = {2700, 3600},
5865 },
5866
5867 {
5868 .vendor = "Intel",
5869 .name = "25F640S33B8",
5870 .bustype = BUS_SPI,
5871 .manufacture_id = INTEL_ID,
5872 .model_id = INTEL_25F640S33B8,
5873 .total_size = 8192,
5874 .page_size = 256,
5875 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5877 .tested = TEST_UNTESTED,
5878 .probe = probe_spi_rdid,
5879 .probe_timing = TIMING_ZERO,
5880 .block_erasers =
5881 {
5882 {
5883 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5884 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5885 * have no effect on the memory contents, but sets a flag in the SR.
5886 .eraseblocks = {
5887 {8 * 1024, 8},
5888 {64 * 1024, 127} // inaccessible
5889 },
5890 .block_erase = spi_block_erase_40,
5891 }, { */
5892 .eraseblocks = { {64 * 1024, 128} },
5893 .block_erase = spi_block_erase_d8,
5894 }, {
5895 .eraseblocks = { {8 * 1024 * 1024, 1} },
5896 .block_erase = spi_block_erase_c7,
5897 }
5898 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005899 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5900 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005901 .write = spi_chip_write_256,
5902 .read = spi_chip_read, /* also fast read 0x0B */
5903 .voltage = {2700, 3600},
5904 },
5905
5906 {
5907 .vendor = "Intel",
5908 .name = "25F640S33T8",
5909 .bustype = BUS_SPI,
5910 .manufacture_id = INTEL_ID,
5911 .model_id = INTEL_25F640S33T8,
5912 .total_size = 8192,
5913 .page_size = 256,
5914 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
5915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5916 .tested = TEST_UNTESTED,
5917 .probe = probe_spi_rdid,
5918 .probe_timing = TIMING_ZERO,
5919 .block_erasers =
5920 {
5921 {
5922 /* This chip supports erasing of the 8 so-called "parameter blocks" with
5923 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
5924 * have no effect on the memory contents, but sets a flag in the SR.
5925 .eraseblocks = {
5926 {64 * 1024, 127}, // inaccessible
5927 {8 * 1024, 8}
5928 },
5929 .block_erase = spi_block_erase_40,
5930 }, { */
5931 .eraseblocks = { {64 * 1024, 128} },
5932 .block_erase = spi_block_erase_d8,
5933 }, {
5934 .eraseblocks = { {8 * 1024 * 1024, 1} },
5935 .block_erase = spi_block_erase_c7,
5936 }
5937 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +00005938 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
5939 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
Stefan Tauner54aaa4a2012-12-29 15:04:12 +00005940 .write = spi_chip_write_256,
5941 .read = spi_chip_read, /* also fast read 0x0B */
5942 .voltage = {2700, 3600},
5943 },
5944
5945 {
5946 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005947 .name = "28F001BN/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005948 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005949 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005950 .model_id = INTEL_28F001B,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005951 .total_size = 128,
5952 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
Sean Nelsondee4a832010-03-22 04:39:31 +00005953 .tested = TEST_UNTESTED,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005954 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005955 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005956 .block_erasers =
5957 {
5958 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00005959 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005960 {8 * 1024, 1},
5961 {4 * 1024, 2},
5962 {112 * 1024, 1},
5963 },
Sean Nelson28accc22010-03-19 18:47:06 +00005964 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005965 },
5966 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005967 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005968 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005969 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005970 },
5971
5972 {
5973 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005974 .name = "28F001BN/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005975 .bustype = BUS_PARALLEL,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005976 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00005977 .model_id = INTEL_28F001T,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005978 .total_size = 128,
5979 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005980 .tested = TEST_OK_PR,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005981 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005982 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson54596372010-01-09 05:30:14 +00005983 .block_erasers =
5984 {
5985 {
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00005986 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00005987 {112 * 1024, 1},
5988 {4 * 1024, 2},
5989 {8 * 1024, 1},
5990 },
Sean Nelson28accc22010-03-19 18:47:06 +00005991 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00005992 },
5993 },
Sean Nelsondee4a832010-03-22 04:39:31 +00005994 .write = write_82802ab,
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005995 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005996 .voltage = {4500, 5500},
Urja Rannikkoebd7b832009-05-29 12:55:31 +00005997 },
5998
5999 {
6000 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006001 .name = "28F002BC/BL/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006002 .bustype = BUS_PARALLEL,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006003 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006004 .model_id = INTEL_28F002T,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006005 .total_size = 256,
6006 .page_size = 256 * 1024,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00006007 .tested = TEST_OK_PRE,
Joshua Roysd97c0e02010-07-22 15:20:43 +00006008 .probe = probe_82802ab,
6009 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6010 .block_erasers =
6011 {
6012 {
6013 .eraseblocks = {
6014 {128 * 1024, 1},
6015 {96 * 1024, 1},
6016 {8 * 1024, 2},
6017 {16 * 1024, 1},
6018 },
6019 .block_erase = erase_block_82802ab,
6020 },
6021 },
6022 .write = write_82802ab,
6023 .read = read_memmapped,
6024 },
6025
6026 {
6027 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006028 .name = "28F008S3/S5/SC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006029 .bustype = BUS_PARALLEL,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006030 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006031 .model_id = INTEL_28F004S3,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006032 .total_size = 512,
6033 .page_size = 256,
6034 .tested = TEST_UNTESTED,
6035 .probe = probe_82802ab,
6036 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006037 .block_erasers =
6038 {
6039 {
6040 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006041 .block_erase = erase_block_82802ab,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006042 },
6043 },
Sean Nelsondee4a832010-03-22 04:39:31 +00006044 .unlock = unlock_28f004s5,
Sean Nelsonf5ae4d42010-02-13 18:41:53 +00006045 .write = write_82802ab,
6046 .read = read_memmapped,
6047 },
6048
6049 {
6050 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006051 .name = "28F004B5/BE/BV/BX-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006052 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006053 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006054 .model_id = INTEL_28F004B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006055 .total_size = 512,
6056 .page_size = 128 * 1024, /* maximal block size */
6057 .tested = TEST_UNTESTED,
6058 .probe = probe_82802ab,
6059 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6060 .block_erasers =
6061 {
6062 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006063 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006064 {16 * 1024, 1},
6065 {8 * 1024, 2},
6066 {96 * 1024, 1},
6067 {128 * 1024, 3},
6068 },
6069 .block_erase = erase_block_82802ab,
6070 },
6071 },
6072 .write = write_82802ab,
6073 .read = read_memmapped,
6074 },
6075
6076 {
6077 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006078 .name = "28F004B5/BE/BV/BX-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006079 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006080 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006081 .model_id = INTEL_28F004T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006082 .total_size = 512,
6083 .page_size = 128 * 1024, /* maximal block size */
6084 .tested = TEST_UNTESTED,
6085 .probe = probe_82802ab,
6086 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6087 .block_erasers =
6088 {
6089 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006090 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006091 {128 * 1024, 3},
6092 {96 * 1024, 1},
6093 {8 * 1024, 2},
6094 {16 * 1024, 1},
6095 },
6096 .block_erase = erase_block_82802ab,
6097 },
6098 },
6099 .write = write_82802ab,
6100 .read = read_memmapped,
6101 },
6102
6103 {
6104 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006105 .name = "28F400BV/BX/CE/CV-B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006106 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006107 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006108 .model_id = INTEL_28F400B,
Michael Karcherad0010a2010-04-03 10:27:08 +00006109 .total_size = 512,
6110 .page_size = 128 * 1024, /* maximal block size */
6111 .feature_bits = FEATURE_ADDR_SHIFTED,
6112 .tested = TEST_UNTESTED,
6113 .probe = probe_82802ab,
6114 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6115 .block_erasers =
6116 {
6117 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006118 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006119 {16 * 1024, 1},
6120 {8 * 1024, 2},
6121 {96 * 1024, 1},
6122 {128 * 1024, 3},
6123 },
6124 .block_erase = erase_block_82802ab,
6125 },
6126 },
6127 .write = write_82802ab,
6128 .read = read_memmapped,
6129 },
6130
6131 {
6132 .vendor = "Intel",
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006133 .name = "28F400BV/BX/CE/CV-T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006134 .bustype = BUS_PARALLEL,
Michael Karcherad0010a2010-04-03 10:27:08 +00006135 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006136 .model_id = INTEL_28F400T,
Michael Karcherad0010a2010-04-03 10:27:08 +00006137 .total_size = 512,
6138 .page_size = 128 * 1024, /* maximal block size */
6139 .feature_bits = FEATURE_ADDR_SHIFTED,
6140 .tested = TEST_UNTESTED,
6141 .probe = probe_82802ab,
6142 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6143 .block_erasers =
6144 {
6145 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006146 .eraseblocks = {
Michael Karcherad0010a2010-04-03 10:27:08 +00006147 {128 * 1024, 3},
6148 {96 * 1024, 1},
6149 {8 * 1024, 2},
6150 {16 * 1024, 1},
6151 },
6152 .block_erase = erase_block_82802ab,
6153 },
6154 },
6155 .write = write_82802ab,
6156 .read = read_memmapped,
6157 },
6158
6159 {
6160 .vendor = "Intel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006161 .name = "82802AB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006162 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006163 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006164 .model_id = INTEL_82802AB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006165 .total_size = 512,
6166 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006167 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006168 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006169 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006170 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006171 .block_erasers =
6172 {
6173 {
6174 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +00006175 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006176 },
6177 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006178 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006179 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006180 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006181 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006182 },
6183
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006184 {
6185 .vendor = "Intel",
6186 .name = "82802AC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006187 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006188 .manufacture_id = INTEL_ID,
Mattias Mattssoncbee4a72010-10-05 20:28:36 +00006189 .model_id = INTEL_82802AC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006190 .total_size = 1024,
6191 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +00006192 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +00006193 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006194 .probe = probe_82802ab,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006195 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
Sean Nelson54596372010-01-09 05:30:14 +00006196 .block_erasers =
6197 {
6198 {
6199 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +00006200 .block_erase = erase_block_82802ab,
Sean Nelson54596372010-01-09 05:30:14 +00006201 },
6202 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00006203 .unlock = unlock_regspace2_uniform_64k,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006204 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006205 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006206 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006207 },
6208
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006209 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00006210 .vendor = "ISSI",
6211 .name = "IS29GL064B",
6212 .bustype = BUS_PARALLEL,
6213 .manufacture_id = ISSI_ID,
6214 .model_id = ISSI_PMC_IS29GL064B,
6215 .total_size = 8192,
6216 .page_size = 128 * 1024, /* actual page size is 16 */
6217 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6218 .tested = TEST_UNTESTED,
6219 .probe = probe_jedec_29gl,
6220 .probe_timing = TIMING_ZERO,
6221 .block_erasers =
6222 {
6223 {
6224 .eraseblocks = {
6225 {8 * 1024, 8},
6226 {64 * 1024, 127},
6227 },
6228 .block_erase = erase_sector_jedec,
6229 }, {
6230 .eraseblocks = { {8 * 1024 * 1024, 1} },
6231 .block_erase = erase_chip_block_jedec,
6232 },
6233 },
6234 .write = write_jedec_1,
6235 .read = read_memmapped,
6236 .voltage = {2700, 3600},
6237 },
6238
6239 {
6240 .vendor = "ISSI",
6241 .name = "IS29GL064T",
6242 .bustype = BUS_PARALLEL,
6243 .manufacture_id = ISSI_ID,
6244 .model_id = ISSI_PMC_IS29GL064T,
6245 .total_size = 8192,
6246 .page_size = 128 * 1024, /* actual page size is 16 */
6247 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6248 .tested = TEST_UNTESTED,
6249 .probe = probe_jedec_29gl,
6250 .probe_timing = TIMING_ZERO,
6251 .block_erasers =
6252 {
6253 {
6254 .eraseblocks = {
6255 {64 * 1024, 127},
6256 {8 * 1024, 8},
6257 },
6258 .block_erase = erase_sector_jedec,
6259 }, {
6260 .eraseblocks = { {8 * 1024 * 1024, 1} },
6261 .block_erase = erase_chip_block_jedec,
6262 },
6263 },
6264 .write = write_jedec_1,
6265 .read = read_memmapped,
6266 .voltage = {2700, 3600},
6267 },
6268
6269 {
6270 .vendor = "ISSI",
6271 .name = "IS29GL064H/L",
6272 .bustype = BUS_PARALLEL,
6273 .manufacture_id = ISSI_ID,
6274 .model_id = ISSI_PMC_IS29GL064HL,
6275 .total_size = 8192,
6276 .page_size = 128 * 1024, /* actual page size is 16 */
6277 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6278 .tested = TEST_UNTESTED,
6279 .probe = probe_jedec_29gl,
6280 .probe_timing = TIMING_ZERO,
6281 .block_erasers =
6282 {
6283 {
6284 .eraseblocks = { {64 * 1024, 128} },
6285 .block_erase = erase_sector_jedec,
6286 }, {
6287 .eraseblocks = { {8 * 1024 * 1024, 1} },
6288 .block_erase = erase_chip_block_jedec,
6289 },
6290 },
6291 .write = write_jedec_1,
6292 .read = read_memmapped,
6293 .voltage = {2700, 3600},
6294 },
6295
6296 {
6297 .vendor = "ISSI",
6298 .name = "IS29GL128H/L",
6299 .bustype = BUS_PARALLEL,
6300 .manufacture_id = ISSI_ID,
6301 .model_id = ISSI_PMC_IS29GL128HL,
6302 .total_size = 16384,
6303 .page_size = 128 * 1024, /* actual page size is 16 */
6304 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
6305 .tested = TEST_UNTESTED,
6306 .probe = probe_jedec_29gl,
6307 .probe_timing = TIMING_ZERO,
6308 .block_erasers =
6309 {
6310 {
6311 .eraseblocks = { {128 * 1024, 128} },
6312 .block_erase = erase_sector_jedec,
6313 }, {
6314 .eraseblocks = { {16 * 1024 * 1024, 1} },
6315 .block_erase = erase_chip_block_jedec,
6316 },
6317 },
6318 .write = write_jedec_1,
6319 .read = read_memmapped,
6320 .voltage = {2700, 3600},
6321 },
6322
6323 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006324 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00006325 .name = "MX23L1654",
6326 .bustype = BUS_SPI,
6327 .manufacture_id = MACRONIX_ID,
6328 .model_id = MACRONIX_MX23L1654,
6329 .total_size = 2048,
6330 .page_size = 256,
6331 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6332 .probe = probe_spi_rdid,
6333 .probe_timing = TIMING_ZERO,
6334 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
6335 .read = spi_chip_read, /* Fast read (0x0B) supported */
6336 .voltage = {3000, 3600},
6337 },
6338
6339 {
6340 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006341 .name = "MX23L3254",
6342 .bustype = BUS_SPI,
6343 .manufacture_id = MACRONIX_ID,
6344 .model_id = MACRONIX_MX23L3254,
6345 .total_size = 4096,
6346 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00006347 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00006348 .probe = probe_spi_rdid,
6349 .probe_timing = TIMING_ZERO,
6350 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
6351 .read = spi_chip_read, /* Fast read (0x0B) supported */
6352 .voltage = {3000, 3600},
6353 },
6354
6355 {
6356 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00006357 .name = "MX23L6454",
6358 .bustype = BUS_SPI,
6359 .manufacture_id = MACRONIX_ID,
6360 .model_id = MACRONIX_MX23L6454,
6361 .total_size = 8192,
6362 .page_size = 256,
6363 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6364 .probe = probe_spi_rdid,
6365 .probe_timing = TIMING_ZERO,
6366 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
6367 .read = spi_chip_read, /* Fast read (0x0B) supported */
6368 .voltage = {3000, 3600},
6369 },
6370
6371 {
6372 .vendor = "Macronix",
6373 .name = "MX23L12854",
6374 .bustype = BUS_SPI,
6375 .manufacture_id = MACRONIX_ID,
6376 .model_id = MACRONIX_MX23L12854,
6377 .total_size = 16384,
6378 .page_size = 256,
6379 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
6380 .probe = probe_spi_rdid,
6381 .probe_timing = TIMING_ZERO,
6382 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
6383 .read = spi_chip_read, /* Fast read (0x0B) supported */
6384 .voltage = {3000, 3600},
6385 },
6386
6387 {
6388 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006389 .name = "MX25L512(E)/MX25V512(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006390 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006391 .manufacture_id = MACRONIX_ID,
6392 .model_id = MACRONIX_MX25L512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006393 .total_size = 64,
6394 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006395 /* MX25L512E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006396 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006397 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006398 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006399 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006400 .block_erasers =
6401 {
6402 {
6403 .eraseblocks = { {4 * 1024, 16} },
6404 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006405 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006406 .eraseblocks = { {64 * 1024, 1} },
6407 .block_erase = spi_block_erase_52,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006408 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006409 .eraseblocks = { {64 * 1024, 1} },
6410 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006411 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006412 .eraseblocks = { {64 * 1024, 1} },
6413 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006414 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006415 .eraseblocks = { {64 * 1024, 1} },
6416 .block_erase = spi_block_erase_c7,
6417 },
6418 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006419 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006420 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006421 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006422 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
6423 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
FENG yu ningff692fb2008-12-08 18:15:10 +00006424 },
6425
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006426 {
6427 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006428 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006429 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006430 .manufacture_id = MACRONIX_ID,
6431 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006432 .total_size = 128,
6433 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006434 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00006435 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00006436 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006437 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006438 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006439 .block_erasers =
6440 {
6441 {
6442 .eraseblocks = { {4 * 1024, 32} },
6443 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006444 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006445 .eraseblocks = { {64 * 1024, 2} },
6446 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006447 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006448 .eraseblocks = { {128 * 1024, 1} },
6449 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006450 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00006451 .eraseblocks = { {128 * 1024, 1} },
6452 .block_erase = spi_block_erase_c7,
6453 },
6454 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006455 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006456 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006457 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006458 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006459 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006460 },
6461
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006462 {
6463 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006464 .name = "MX25L2005(C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006465 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006466 .manufacture_id = MACRONIX_ID,
6467 .model_id = MACRONIX_MX25L2005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006468 .total_size = 256,
6469 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006470 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006471 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006472 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006473 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006474 .block_erasers =
6475 {
6476 {
6477 .eraseblocks = { {4 * 1024, 64} },
6478 .block_erase = spi_block_erase_20,
6479 }, {
6480 .eraseblocks = { {64 * 1024, 4} },
6481 .block_erase = spi_block_erase_52,
6482 }, {
6483 .eraseblocks = { {64 * 1024, 4} },
6484 .block_erase = spi_block_erase_d8,
6485 }, {
6486 .eraseblocks = { {256 * 1024, 1} },
6487 .block_erase = spi_block_erase_60,
6488 }, {
6489 .eraseblocks = { {256 * 1024, 1} },
6490 .block_erase = spi_block_erase_c7,
6491 },
6492 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006493 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006494 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006495 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006496 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006497 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006498 },
6499
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006500 {
6501 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006502 .name = "MX25L4005(A/C)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006503 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006504 .manufacture_id = MACRONIX_ID,
6505 .model_id = MACRONIX_MX25L4005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006506 .total_size = 512,
6507 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006508 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +00006509 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006510 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006511 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006512 .block_erasers =
6513 {
6514 {
6515 .eraseblocks = { {4 * 1024, 128} },
6516 .block_erase = spi_block_erase_20,
6517 }, {
6518 .eraseblocks = { {64 * 1024, 8} },
6519 .block_erase = spi_block_erase_52,
6520 }, {
6521 .eraseblocks = { {64 * 1024, 8} },
6522 .block_erase = spi_block_erase_d8,
6523 }, {
6524 .eraseblocks = { {512 * 1024, 1} },
6525 .block_erase = spi_block_erase_60,
6526 }, {
6527 .eraseblocks = { {512 * 1024, 1} },
6528 .block_erase = spi_block_erase_c7,
6529 },
6530 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006531 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006532 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006533 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006534 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006535 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006536 },
6537
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006538 {
6539 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00006540 .name = "MX25L8005/MX25V8005",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006541 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006542 .manufacture_id = MACRONIX_ID,
6543 .model_id = MACRONIX_MX25L8005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006544 .total_size = 1024,
6545 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006546 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +00006547 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006548 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006549 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006550 .block_erasers =
6551 {
6552 {
6553 .eraseblocks = { {4 * 1024, 256} },
6554 .block_erase = spi_block_erase_20,
6555 }, {
6556 .eraseblocks = { {64 * 1024, 16} },
6557 .block_erase = spi_block_erase_52,
6558 }, {
6559 .eraseblocks = { {64 * 1024, 16} },
6560 .block_erase = spi_block_erase_d8,
6561 }, {
6562 .eraseblocks = { {1024 * 1024, 1} },
6563 .block_erase = spi_block_erase_60,
6564 }, {
6565 .eraseblocks = { {1024 * 1024, 1} },
6566 .block_erase = spi_block_erase_c7,
6567 },
6568 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006569 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006570 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006571 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00006572 .read = spi_chip_read, /* Fast read (0x0B) supported */
6573 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
FENG yu ningff692fb2008-12-08 18:15:10 +00006574 },
6575
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006576 {
6577 .vendor = "Macronix",
6578 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006579 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006580 .manufacture_id = MACRONIX_ID,
6581 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006582 .total_size = 2048,
6583 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006584 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00006585 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006586 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006587 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006588 .block_erasers =
6589 {
6590 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006591 .eraseblocks = { {64 * 1024, 32} },
6592 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006593 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006594 .eraseblocks = { {64 * 1024, 32} },
6595 .block_erase = spi_block_erase_d8,
6596 }, {
6597 .eraseblocks = { {2 * 1024 * 1024, 1} },
6598 .block_erase = spi_block_erase_60,
6599 }, {
6600 .eraseblocks = { {2 * 1024 * 1024, 1} },
6601 .block_erase = spi_block_erase_c7,
6602 },
6603 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006604 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00006605 .unlock = spi_disable_blockprotect,
6606 .write = spi_chip_write_256,
6607 .read = spi_chip_read, /* Fast read (0x0B) supported */
6608 .voltage = {2700, 3600},
6609 },
6610
6611 {
6612 .vendor = "Macronix",
6613 .name = "MX25L1605A/MX25L1606E",
6614 .bustype = BUS_SPI,
6615 .manufacture_id = MACRONIX_ID,
6616 .model_id = MACRONIX_MX25L1605,
6617 .total_size = 2048,
6618 .page_size = 256,
6619 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E only) */
6620 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6621 .tested = TEST_OK_PREW,
6622 .probe = probe_spi_rdid,
6623 .probe_timing = TIMING_ZERO,
6624 .block_erasers =
6625 {
6626 {
6627 .eraseblocks = { {4 * 1024, 512} },
6628 .block_erase = spi_block_erase_20,
6629 }, {
6630 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00006631 .block_erase = spi_block_erase_52,
6632 }, {
6633 .eraseblocks = { {64 * 1024, 32} },
6634 .block_erase = spi_block_erase_d8,
6635 }, {
6636 .eraseblocks = { {2 * 1024 * 1024, 1} },
6637 .block_erase = spi_block_erase_60,
6638 }, {
6639 .eraseblocks = { {2 * 1024 * 1024, 1} },
6640 .block_erase = spi_block_erase_c7,
6641 },
6642 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006643 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006644 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006645 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006646 .read = spi_chip_read, /* Fast read (0x0B) supported */
6647 .voltage = {2700, 3600},
6648 },
6649
6650 {
6651 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006652 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00006653 .bustype = BUS_SPI,
6654 .manufacture_id = MACRONIX_ID,
6655 .model_id = MACRONIX_MX25L1605,
6656 .total_size = 2048,
6657 .page_size = 256,
6658 .feature_bits = FEATURE_WRSR_WREN,
6659 .tested = TEST_OK_PREW,
6660 .probe = probe_spi_rdid,
6661 .probe_timing = TIMING_ZERO,
6662 .block_erasers =
6663 {
6664 {
6665 .eraseblocks = { {4 * 1024, 512} },
6666 .block_erase = spi_block_erase_20,
6667 }, {
6668 .eraseblocks = { {64 * 1024, 32} },
6669 .block_erase = spi_block_erase_d8,
6670 }, {
6671 .eraseblocks = { {2 * 1024 * 1024, 1} },
6672 .block_erase = spi_block_erase_60,
6673 }, {
6674 .eraseblocks = { {2 * 1024 * 1024, 1} },
6675 .block_erase = spi_block_erase_c7,
6676 },
6677 },
Stefan Tauner6697f712014-08-06 15:09:15 +00006678 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode */
Stefan Tauner226037d2013-03-16 01:22:12 +00006679 .unlock = spi_disable_blockprotect,
6680 .write = spi_chip_write_256,
6681 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006682 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006683 },
6684
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006685 {
6686 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006687 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006688 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006689 .manufacture_id = MACRONIX_ID,
6690 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006691 .total_size = 2048,
6692 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006693 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6694 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006695 .tested = TEST_UNTESTED,
6696 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006697 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006698 .block_erasers =
6699 {
6700 {
6701 .eraseblocks = { {4 * 1024, 512} },
6702 .block_erase = spi_block_erase_20,
6703 }, {
6704 .eraseblocks = { {64 * 1024, 32} },
6705 .block_erase = spi_block_erase_d8,
6706 }, {
6707 .eraseblocks = { {2 * 1024 * 1024, 1} },
6708 .block_erase = spi_block_erase_60,
6709 }, {
6710 .eraseblocks = { {2 * 1024 * 1024, 1} },
6711 .block_erase = spi_block_erase_c7,
6712 }
6713 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006714 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006715 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006716 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006717 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006718 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006719 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00006720
Stephan Guillouxf5c70902009-04-19 23:04:00 +00006721 {
6722 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00006723 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006724 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006725 .manufacture_id = MACRONIX_ID,
6726 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006727 .total_size = 2048,
6728 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006729 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6730 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00006731 .tested = TEST_UNTESTED,
6732 .probe = probe_spi_rdid,
6733 .probe_timing = TIMING_ZERO,
6734 .block_erasers =
6735 {
6736 {
6737 .eraseblocks = { {4 * 1024, 512} },
6738 .block_erase = spi_block_erase_20,
6739 }, {
6740 .eraseblocks = { {64 * 1024, 32} },
6741 .block_erase = spi_block_erase_d8,
6742 }, {
6743 .eraseblocks = { {2 * 1024 * 1024, 1} },
6744 .block_erase = spi_block_erase_60,
6745 }, {
6746 .eraseblocks = { {2 * 1024 * 1024, 1} },
6747 .block_erase = spi_block_erase_c7,
6748 }
6749 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006750 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stephan Guilloux3611b802010-09-13 19:59:28 +00006751 .unlock = spi_disable_blockprotect,
6752 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006753 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00006754 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00006755 },
6756
6757 {
6758 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006759 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006760 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006761 .manufacture_id = MACRONIX_ID,
6762 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006763 .total_size = 4096,
6764 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00006765 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00006766 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006767 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006768 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006769 .block_erasers =
6770 {
6771 {
Stefan Tauner226037d2013-03-16 01:22:12 +00006772 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006773 .block_erase = spi_block_erase_20,
6774 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00006775 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00006776 .block_erase = spi_block_erase_d8,
6777 }, {
6778 .eraseblocks = { {4 * 1024 * 1024, 1} },
6779 .block_erase = spi_block_erase_60,
6780 }, {
6781 .eraseblocks = { {4 * 1024 * 1024, 1} },
6782 .block_erase = spi_block_erase_c7,
6783 },
6784 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006785 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006786 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006787 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006788 .read = spi_chip_read, /* Fast read (0x0B) supported */
6789 .voltage = {2700, 3600},
6790 },
6791
6792 {
6793 .vendor = "Macronix",
6794 .name = "MX25L3205D/MX25L3208D",
6795 .bustype = BUS_SPI,
6796 .manufacture_id = MACRONIX_ID,
6797 .model_id = MACRONIX_MX25L3205,
6798 .total_size = 4096,
6799 .page_size = 256,
6800 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6802 .tested = TEST_OK_PREW,
6803 .probe = probe_spi_rdid,
6804 .probe_timing = TIMING_ZERO,
6805 .block_erasers =
6806 {
6807 {
6808 .eraseblocks = { {4 * 1024, 1024} },
6809 .block_erase = spi_block_erase_20,
6810 }, {
6811 .eraseblocks = { {64 * 1024, 64} },
6812 .block_erase = spi_block_erase_d8,
6813 }, {
6814 .eraseblocks = { {4 * 1024 * 1024, 1} },
6815 .block_erase = spi_block_erase_60,
6816 }, {
6817 .eraseblocks = { {4 * 1024 * 1024, 1} },
6818 .block_erase = spi_block_erase_c7,
6819 },
6820 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006821 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: CP mode */
Stefan Tauner226037d2013-03-16 01:22:12 +00006822 .unlock = spi_disable_blockprotect,
6823 .write = spi_chip_write_256,
6824 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6825 .voltage = {2700, 3600},
6826 },
6827
6828 {
6829 .vendor = "Macronix",
6830 .name = "MX25L3206E",
6831 .bustype = BUS_SPI,
6832 .manufacture_id = MACRONIX_ID,
6833 .model_id = MACRONIX_MX25L3205,
6834 .total_size = 4096,
6835 .page_size = 256,
6836 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6838 .tested = TEST_OK_PREW,
6839 .probe = probe_spi_rdid,
6840 .probe_timing = TIMING_ZERO,
6841 .block_erasers =
6842 {
6843 {
6844 .eraseblocks = { {4 * 1024, 1024} },
6845 .block_erase = spi_block_erase_20,
6846 }, {
6847 .eraseblocks = { {64 * 1024, 64} },
6848 .block_erase = spi_block_erase_d8,
6849 }, {
6850 .eraseblocks = { {64 * 1024, 64} },
6851 .block_erase = spi_block_erase_52,
6852 }, {
6853 .eraseblocks = { {4 * 1024 * 1024, 1} },
6854 .block_erase = spi_block_erase_60,
6855 }, {
6856 .eraseblocks = { {4 * 1024 * 1024, 1} },
6857 .block_erase = spi_block_erase_c7,
6858 },
6859 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006860 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00006861 .unlock = spi_disable_blockprotect,
6862 .write = spi_chip_write_256,
6863 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006864 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006865 },
6866
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006867 {
6868 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006869 .name = "MX25L3273E",
6870 .bustype = BUS_SPI,
6871 .manufacture_id = MACRONIX_ID,
6872 .model_id = MACRONIX_MX25L3205,
6873 .total_size = 4096,
6874 .page_size = 256,
6875 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
6876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6877 .tested = TEST_UNTESTED,
6878 .probe = probe_spi_rdid,
6879 .probe_timing = TIMING_ZERO,
6880 .block_erasers =
6881 {
6882 {
6883 .eraseblocks = { {4 * 1024, 1024} },
6884 .block_erase = spi_block_erase_20,
6885 }, {
6886 .eraseblocks = { {32 * 1024, 128} },
6887 .block_erase = spi_block_erase_52,
6888 }, {
6889 .eraseblocks = { {64 * 1024, 64} },
6890 .block_erase = spi_block_erase_d8,
6891 }, {
6892 .eraseblocks = { {4 * 1024 * 1024, 1} },
6893 .block_erase = spi_block_erase_60,
6894 }, {
6895 .eraseblocks = { {4 * 1024 * 1024, 1} },
6896 .block_erase = spi_block_erase_c7,
6897 },
6898 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006899 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00006900 .unlock = spi_disable_blockprotect,
6901 .write = spi_chip_write_256,
6902 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
6903 .voltage = {2700, 3600},
6904 },
6905
6906 {
6907 .vendor = "Macronix",
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006908 .name = "MX25L3235D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006909 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006910 .manufacture_id = MACRONIX_ID,
6911 .model_id = MACRONIX_MX25L3235D,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006912 .total_size = 4096,
6913 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006914 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
6915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006916 .tested = TEST_UNTESTED,
6917 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006918 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006919 .block_erasers =
6920 {
6921 {
6922 .eraseblocks = { {4 * 1024, 1024} },
6923 .block_erase = spi_block_erase_20,
6924 }, {
6925 .eraseblocks = { {64 * 1024, 64} },
6926 .block_erase = spi_block_erase_d8,
6927 }, {
6928 .eraseblocks = { {4 * 1024 * 1024, 1} },
6929 .block_erase = spi_block_erase_60,
6930 }, {
6931 .eraseblocks = { {4 * 1024 * 1024, 1} },
6932 .block_erase = spi_block_erase_c7,
6933 }
6934 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006935 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006936 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006937 .write = spi_chip_write_256,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006938 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006939 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00006940 },
6941
6942 {
6943 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006944 .name = "MX25L6405(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006945 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006946 .manufacture_id = MACRONIX_ID,
6947 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006948 .total_size = 8192,
6949 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00006950 /* MX25L6405D has 64B of OTP; enter 0xB1, exit 0xC1 */
6951 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Paul Menzelac427b22012-02-16 21:07:07 +00006952 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006953 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00006954 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00006955 .block_erasers =
6956 {
6957 {
6958 .eraseblocks = { {64 * 1024, 128} },
6959 .block_erase = spi_block_erase_20,
6960 }, {
6961 .eraseblocks = { {64 * 1024, 128} },
6962 .block_erase = spi_block_erase_d8,
6963 }, {
6964 .eraseblocks = { {8 * 1024 * 1024, 1} },
6965 .block_erase = spi_block_erase_60,
6966 }, {
6967 .eraseblocks = { {8 * 1024 * 1024, 1} },
6968 .block_erase = spi_block_erase_c7,
6969 }
6970 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006971 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 has different meanings */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00006972 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00006973 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006974 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006975 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00006976 },
6977
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006978 {
6979 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00006980 .name = "MX25L6406E/MX25L6436E",
6981 .bustype = BUS_SPI,
6982 .manufacture_id = MACRONIX_ID,
6983 .model_id = MACRONIX_MX25L6405,
6984 .total_size = 8192,
6985 .page_size = 256,
6986 /* OTP: 06E 64B/36E 512B total; enter 0xB1, exit 0xC1 */
6987 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6988 .tested = TEST_OK_PREW,
6989 .probe = probe_spi_rdid,
6990 .probe_timing = TIMING_ZERO,
6991 .block_erasers =
6992 {
6993 {
6994 .eraseblocks = { {4 * 1024, 2048} },
6995 .block_erase = spi_block_erase_20,
6996 }, {
6997 .eraseblocks = { {64 * 1024, 128} },
6998 .block_erase = spi_block_erase_d8,
6999 }, {
7000 .eraseblocks = { {8 * 1024 * 1024, 1} },
7001 .block_erase = spi_block_erase_60,
7002 }, {
7003 .eraseblocks = { {8 * 1024 * 1024, 1} },
7004 .block_erase = spi_block_erase_c7,
7005 }
7006 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007007 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 for 36E is quad enable */
Stefan Tauner226037d2013-03-16 01:22:12 +00007008 .unlock = spi_disable_blockprotect,
7009 .write = spi_chip_write_256,
7010 .read = spi_chip_read,
7011 .voltage = {2700, 3600},
7012 },
7013
7014 {
7015 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007016 .name = "MX25L6445E/MX25L6473E",
Stefan Tauner226037d2013-03-16 01:22:12 +00007017 .bustype = BUS_SPI,
7018 .manufacture_id = MACRONIX_ID,
7019 .model_id = MACRONIX_MX25L6405,
7020 .total_size = 8192,
7021 .page_size = 256,
7022 /* supports SFDP */
7023 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7024 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7025 .tested = TEST_OK_PREW,
7026 .probe = probe_spi_rdid,
7027 .probe_timing = TIMING_ZERO,
7028 .block_erasers =
7029 {
7030 {
7031 .eraseblocks = { {4 * 1024, 2048} },
7032 .block_erase = spi_block_erase_20,
7033 }, {
7034 .eraseblocks = { {32 * 1024, 256} },
7035 .block_erase = spi_block_erase_52,
7036 }, {
7037 .eraseblocks = { {64 * 1024, 128} },
7038 .block_erase = spi_block_erase_d8,
7039 }, {
7040 .eraseblocks = { {8 * 1024 * 1024, 1} },
7041 .block_erase = spi_block_erase_60,
7042 }, {
7043 .eraseblocks = { {8 * 1024 * 1024, 1} },
7044 .block_erase = spi_block_erase_c7,
7045 }
7046 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007047 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner226037d2013-03-16 01:22:12 +00007048 .unlock = spi_disable_blockprotect,
7049 .write = spi_chip_write_256,
7050 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7051 .voltage = {2700, 3600},
7052 },
7053
7054 {
7055 .vendor = "Macronix",
7056 .name = "MX25L12805(D)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007057 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007058 .manufacture_id = MACRONIX_ID,
7059 .model_id = MACRONIX_MX25L12805,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007060 .total_size = 16384,
7061 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007062 /* MX25L12805D has 64B of OTP; enter 0xB1, exit 0xC1 */
7063 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00007064 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007065 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00007066 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007067 .block_erasers =
7068 {
7069 {
7070 .eraseblocks = { {4 * 1024, 4096} },
7071 .block_erase = spi_block_erase_20,
7072 }, {
7073 .eraseblocks = { {64 * 1024, 256} },
7074 .block_erase = spi_block_erase_d8,
7075 }, {
7076 .eraseblocks = { {16 * 1024 * 1024, 1} },
7077 .block_erase = spi_block_erase_60,
7078 }, {
7079 .eraseblocks = { {16 * 1024 * 1024, 1} },
7080 .block_erase = spi_block_erase_c7,
7081 }
7082 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007083 .printlock = spi_prettyprint_status_register_bp3_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00007084 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00007085 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00007086 .read = spi_chip_read, /* MX25L12805D: Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007087 .voltage = {2700, 3600},
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00007088 },
7089
7090 {
7091 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00007092 .name = "MX25U1635E",
7093 .bustype = BUS_SPI,
7094 .manufacture_id = MACRONIX_ID,
7095 .model_id = MACRONIX_MX25U1635E,
7096 .total_size = 2048,
7097 .page_size = 256,
7098 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7099 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7100 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7101 .tested = TEST_UNTESTED,
7102 .probe = probe_spi_rdid,
7103 .probe_timing = TIMING_ZERO,
7104 .block_erasers =
7105 {
7106 {
7107 .eraseblocks = { {4 * 1024, 512} },
7108 .block_erase = spi_block_erase_20,
7109 }, {
7110 .eraseblocks = { {32 * 1024, 64} },
7111 .block_erase = spi_block_erase_52,
7112 }, {
7113 .eraseblocks = { {64 * 1024, 32} },
7114 .block_erase = spi_block_erase_d8,
7115 }, {
7116 .eraseblocks = { {2 * 1024 * 1024, 1} },
7117 .block_erase = spi_block_erase_60,
7118 }, {
7119 .eraseblocks = { {2 * 1024 * 1024, 1} },
7120 .block_erase = spi_block_erase_c7,
7121 }
7122 },
7123 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007124 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00007125 .unlock = spi_disable_blockprotect,
7126 .write = spi_chip_write_256,
7127 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7128 .voltage = {1650, 2000},
7129 },
7130
7131 {
7132 .vendor = "Macronix",
7133 .name = "MX25U3235E/F",
7134 .bustype = BUS_SPI,
7135 .manufacture_id = MACRONIX_ID,
7136 .model_id = MACRONIX_MX25U3235E,
7137 .total_size = 4096,
7138 .page_size = 256,
7139 /* F model supports SFDP */
7140 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7141 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7143 .tested = TEST_OK_PREW,
7144 .probe = probe_spi_rdid,
7145 .probe_timing = TIMING_ZERO,
7146 .block_erasers =
7147 {
7148 {
7149 .eraseblocks = { {4 * 1024, 1024} },
7150 .block_erase = spi_block_erase_20,
7151 }, {
7152 .eraseblocks = { {32 * 1024, 128} },
7153 .block_erase = spi_block_erase_52,
7154 }, {
7155 .eraseblocks = { {64 * 1024, 64} },
7156 .block_erase = spi_block_erase_d8,
7157 }, {
7158 .eraseblocks = { {4 * 1024 * 1024, 1} },
7159 .block_erase = spi_block_erase_60,
7160 }, {
7161 .eraseblocks = { {4 * 1024 * 1024, 1} },
7162 .block_erase = spi_block_erase_c7,
7163 }
7164 },
7165 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007166 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00007167 .unlock = spi_disable_blockprotect,
7168 .write = spi_chip_write_256,
7169 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7170 .voltage = {1650, 2000},
7171 },
7172
7173 {
7174 .vendor = "Macronix",
7175 .name = "MX25U6435E/F",
7176 .bustype = BUS_SPI,
7177 .manufacture_id = MACRONIX_ID,
7178 .model_id = MACRONIX_MX25U6435E,
7179 .total_size = 8192,
7180 .page_size = 256,
7181 /* F model supports SFDP */
7182 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7183 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
7184 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7185 .tested = TEST_UNTESTED,
7186 .probe = probe_spi_rdid,
7187 .probe_timing = TIMING_ZERO,
7188 .block_erasers =
7189 {
7190 {
7191 .eraseblocks = { {4 * 1024, 2048} },
7192 .block_erase = spi_block_erase_20,
7193 }, {
7194 .eraseblocks = { {32 * 1024, 256} },
7195 .block_erase = spi_block_erase_52,
7196 }, {
7197 .eraseblocks = { {64 * 1024, 128} },
7198 .block_erase = spi_block_erase_d8,
7199 }, {
7200 .eraseblocks = { {8 * 1024 * 1024, 1} },
7201 .block_erase = spi_block_erase_60,
7202 }, {
7203 .eraseblocks = { {8 * 1024 * 1024, 1} },
7204 .block_erase = spi_block_erase_c7,
7205 }
7206 },
7207 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00007208 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Vincent Palatinf800f552013-03-15 02:03:16 +00007209 .unlock = spi_disable_blockprotect,
7210 .write = spi_chip_write_256,
7211 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7212 .voltage = {1650, 2000},
7213 },
7214
7215 {
7216 .vendor = "Macronix",
Martin Roth440057a2014-07-13 00:05:07 +00007217 .name = "MX25U12835F",
7218 .bustype = BUS_SPI,
7219 .manufacture_id = MACRONIX_ID,
7220 .model_id = MACRONIX_MX25U12835E,
7221 .total_size = 16384,
7222 .page_size = 256,
7223 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
7224 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7225 .tested = TEST_UNTESTED,
7226 .probe = probe_spi_rdid,
7227 .probe_timing = TIMING_ZERO,
7228 .block_erasers =
7229 {
7230 {
7231 .eraseblocks = { {4 * 1024, 4096} },
7232 .block_erase = spi_block_erase_20,
7233 }, {
7234 .eraseblocks = { {32 * 1024, 512} },
7235 .block_erase = spi_block_erase_52,
7236 }, {
7237 .eraseblocks = { {64 * 1024, 256} },
7238 .block_erase = spi_block_erase_d8,
7239 }, {
7240 .eraseblocks = { {16 * 1024 * 1024, 1} },
7241 .block_erase = spi_block_erase_60,
7242 }, {
7243 .eraseblocks = { {16 * 1024 * 1024, 1} },
7244 .block_erase = spi_block_erase_c7,
7245 }
7246 },
7247 /* TODO: security register */
7248 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
7249 .unlock = spi_disable_blockprotect_bp3_srwd,
7250 .write = spi_chip_write_256, /* Multi I/O supported */
7251 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7252 .voltage = {1650, 2000},
7253 },
7254
7255 {
7256 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00007257 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007258 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007259 .manufacture_id = MACRONIX_ID,
7260 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007261 .total_size = 128,
7262 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007263 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7264 .tested = TEST_UNTESTED,
7265 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007266 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007267 .block_erasers =
7268 {
7269 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007270 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007271 {8 * 1024, 1},
7272 {4 * 1024, 2},
7273 {8 * 1024, 2},
7274 {32 * 1024, 1},
7275 {64 * 1024, 1},
7276 },
Sean Nelson35727f72010-01-28 23:55:12 +00007277 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007278 }, {
7279 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007280 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007281 }
7282 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007283 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007284 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007285 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007286 },
7287
7288 {
7289 .vendor = "Macronix",
7290 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007291 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007292 .manufacture_id = MACRONIX_ID,
7293 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007294 .total_size = 128,
7295 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007296 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00007297 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007298 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007299 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007300 .block_erasers =
7301 {
7302 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00007303 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00007304 {64 * 1024, 1},
7305 {32 * 1024, 1},
7306 {8 * 1024, 2},
7307 {4 * 1024, 2},
7308 {8 * 1024, 1},
7309 },
Sean Nelson35727f72010-01-28 23:55:12 +00007310 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007311 }, {
7312 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007313 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007314 }
7315 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007316 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00007317 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007318 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00007319 },
7320
7321 {
7322 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007323 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007324 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007325 .manufacture_id = MACRONIX_ID,
7326 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007327 .total_size = 256,
7328 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007329 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007330 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00007331 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007332 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007333 .block_erasers =
7334 {
7335 {
7336 .eraseblocks = {
7337 {16 * 1024, 1},
7338 {8 * 1024, 2},
7339 {32 * 1024, 1},
7340 {64 * 1024, 3},
7341 },
Sean Nelson35727f72010-01-28 23:55:12 +00007342 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007343 }, {
7344 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007345 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007346 },
7347 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007348 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007349 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007350 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007351 },
7352
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007353 {
7354 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00007355 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007356 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007357 .manufacture_id = MACRONIX_ID,
7358 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007359 .total_size = 256,
7360 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007361 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00007362 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00007363 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007364 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007365 .block_erasers =
7366 {
7367 {
7368 .eraseblocks = {
7369 {64 * 1024, 3},
7370 {32 * 1024, 1},
7371 {8 * 1024, 2},
7372 {16 * 1024, 1},
7373 },
Sean Nelson35727f72010-01-28 23:55:12 +00007374 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007375 }, {
7376 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007377 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00007378 },
7379 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007380 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007381 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007382 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00007383 },
7384
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007385 {
7386 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00007387 .name = "MX29F022(N)B",
7388 .bustype = BUS_PARALLEL,
7389 .manufacture_id = MACRONIX_ID,
7390 .model_id = MACRONIX_MX29F022B,
7391 .total_size = 256,
7392 .page_size = 0, /* unused */
7393 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7394 .tested = TEST_UNTESTED,
7395 .probe = probe_jedec,
7396 .probe_timing = TIMING_ZERO,
7397 .block_erasers =
7398 {
7399 {
7400 .eraseblocks = {
7401 {16 * 1024, 1},
7402 {8 * 1024, 2},
7403 {32 * 1024, 1},
7404 {64 * 1024, 3},
7405 },
7406 .block_erase = erase_sector_jedec,
7407 }, {
7408 .eraseblocks = { {256 * 1024, 1} },
7409 .block_erase = erase_chip_block_jedec,
7410 }
7411 },
7412 .write = write_jedec_1,
7413 .read = read_memmapped,
7414 .voltage = {4500, 5500},
7415 },
7416
7417 {
7418 .vendor = "Macronix",
7419 .name = "MX29F022(N)T",
7420 .bustype = BUS_PARALLEL,
7421 .manufacture_id = MACRONIX_ID,
7422 .model_id = MACRONIX_MX29F022T,
7423 .total_size = 256,
7424 .page_size = 0, /* unused */
7425 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7426 .tested = TEST_OK_PREW,
7427 .probe = probe_jedec,
7428 .probe_timing = TIMING_ZERO,
7429 .block_erasers =
7430 {
7431 {
7432 .eraseblocks = {
7433 {64 * 1024, 3},
7434 {32 * 1024, 1},
7435 {8 * 1024, 2},
7436 {16 * 1024, 1},
7437 },
7438 .block_erase = erase_sector_jedec,
7439 }, {
7440 .eraseblocks = { {256 * 1024, 1} },
7441 .block_erase = erase_chip_block_jedec,
7442 }
7443 },
7444 .write = write_jedec_1,
7445 .read = read_memmapped,
7446 .voltage = {4500, 5500},
7447 },
7448
7449 {
7450 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00007451 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007452 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007453 .manufacture_id = MACRONIX_ID,
7454 .model_id = MACRONIX_MX29F040,
7455 .total_size = 512,
7456 .page_size = 64 * 1024,
7457 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7458 .tested = TEST_UNTESTED,
7459 .probe = probe_jedec,
7460 .probe_timing = TIMING_ZERO,
7461 .block_erasers =
7462 {
7463 {
7464 .eraseblocks = { {64 * 1024, 8} },
7465 .block_erase = erase_sector_jedec,
7466 }, {
7467 .eraseblocks = { {512 * 1024, 1} },
7468 .block_erase = erase_chip_block_jedec,
7469 },
7470 },
7471 .write = write_jedec_1,
7472 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007473 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00007474 },
7475
7476 {
7477 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007478 .name = "MX29GL320EB",
7479 .bustype = BUS_PARALLEL,
7480 .manufacture_id = MACRONIX_ID,
7481 .model_id = MACRONIX_MX29GL320EB,
7482 .total_size = 4096,
7483 .page_size = 128 * 1024, /* actual page size is 16 */
7484 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7485 .tested = TEST_UNTESTED,
7486 .probe = probe_jedec_29gl,
7487 .probe_timing = TIMING_ZERO,
7488 .block_erasers =
7489 {
7490 {
7491 .eraseblocks = {
7492 {8 * 1024, 8},
7493 {64 * 1024, 63},
7494 },
7495 .block_erase = erase_sector_jedec,
7496 }, {
7497 .eraseblocks = { {4 * 1024 * 1024, 1} },
7498 .block_erase = erase_chip_block_jedec,
7499 },
7500 },
7501 .write = write_jedec_1,
7502 .read = read_memmapped,
7503 .voltage = {2700, 3600},
7504 },
7505
7506 {
7507 .vendor = "Macronix",
7508 .name = "MX29GL320ET",
7509 .bustype = BUS_PARALLEL,
7510 .manufacture_id = MACRONIX_ID,
7511 .model_id = MACRONIX_MX29GL320ET,
7512 .total_size = 4096,
7513 .page_size = 128 * 1024, /* actual page size is 16 */
7514 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7515 .tested = TEST_UNTESTED,
7516 .probe = probe_jedec_29gl,
7517 .probe_timing = TIMING_ZERO,
7518 .block_erasers =
7519 {
7520 {
7521 .eraseblocks = {
7522 {64 * 1024, 63},
7523 {8 * 1024, 8},
7524 },
7525 .block_erase = erase_sector_jedec,
7526 }, {
7527 .eraseblocks = { {4 * 1024 * 1024, 1} },
7528 .block_erase = erase_chip_block_jedec,
7529 },
7530 },
7531 .write = write_jedec_1,
7532 .read = read_memmapped,
7533 .voltage = {2700, 3600},
7534 },
7535
7536 {
7537 .vendor = "Macronix",
7538 .name = "MX29GL320EH/L",
7539 .bustype = BUS_PARALLEL,
7540 .manufacture_id = MACRONIX_ID,
7541 .model_id = MACRONIX_MX29GL320EHL,
7542 .total_size = 4096,
7543 .page_size = 128 * 1024, /* actual page size is 16 */
7544 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7545 .tested = TEST_UNTESTED,
7546 .probe = probe_jedec_29gl,
7547 .probe_timing = TIMING_ZERO,
7548 .block_erasers =
7549 {
7550 {
7551 .eraseblocks = { {64 * 1024, 64} },
7552 .block_erase = erase_sector_jedec,
7553 }, {
7554 .eraseblocks = { {4 * 1024 * 1024, 1} },
7555 .block_erase = erase_chip_block_jedec,
7556 },
7557 },
7558 .write = write_jedec_1,
7559 .read = read_memmapped,
7560 .voltage = {2700, 3600},
7561 },
7562
7563 {
7564 .vendor = "Macronix",
7565 .name = "MX29GL640EB",
7566 .bustype = BUS_PARALLEL,
7567 .manufacture_id = MACRONIX_ID,
7568 .model_id = MACRONIX_MX29GL640EB,
7569 .total_size = 8192,
7570 .page_size = 128 * 1024, /* actual page size is 16 */
7571 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7572 .tested = TEST_UNTESTED,
7573 .probe = probe_jedec_29gl,
7574 .probe_timing = TIMING_ZERO,
7575 .block_erasers =
7576 {
7577 {
7578 .eraseblocks = {
7579 {8 * 1024, 8},
7580 {64 * 1024, 127},
7581 },
7582 .block_erase = erase_sector_jedec,
7583 }, {
7584 .eraseblocks = { {8 * 1024 * 1024, 1} },
7585 .block_erase = erase_chip_block_jedec,
7586 },
7587 },
7588 .write = write_jedec_1,
7589 .read = read_memmapped,
7590 .voltage = {2700, 3600},
7591 },
7592
7593 {
7594 .vendor = "Macronix",
7595 .name = "MX29GL640ET",
7596 .bustype = BUS_PARALLEL,
7597 .manufacture_id = MACRONIX_ID,
7598 .model_id = MACRONIX_MX29GL640ET,
7599 .total_size = 8192,
7600 .page_size = 128 * 1024, /* actual page size is 16 */
7601 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7602 .tested = TEST_UNTESTED,
7603 .probe = probe_jedec_29gl,
7604 .probe_timing = TIMING_ZERO,
7605 .block_erasers =
7606 {
7607 {
7608 .eraseblocks = {
7609 {64 * 1024, 127},
7610 {8 * 1024, 8},
7611 },
7612 .block_erase = erase_sector_jedec,
7613 }, {
7614 .eraseblocks = { {8 * 1024 * 1024, 1} },
7615 .block_erase = erase_chip_block_jedec,
7616 },
7617 },
7618 .write = write_jedec_1,
7619 .read = read_memmapped,
7620 .voltage = {2700, 3600},
7621 },
7622
7623 {
7624 .vendor = "Macronix",
7625 .name = "MX29GL640EH/L",
7626 .bustype = BUS_PARALLEL,
7627 .manufacture_id = MACRONIX_ID,
7628 .model_id = MACRONIX_MX29GL640EHL,
7629 .total_size = 8192,
7630 .page_size = 128 * 1024, /* actual page size is 16 */
7631 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7632 .tested = TEST_UNTESTED,
7633 .probe = probe_jedec_29gl,
7634 .probe_timing = TIMING_ZERO,
7635 .block_erasers =
7636 {
7637 {
7638 .eraseblocks = { {64 * 1024, 128} },
7639 .block_erase = erase_sector_jedec,
7640 }, {
7641 .eraseblocks = { {8 * 1024 * 1024, 1} },
7642 .block_erase = erase_chip_block_jedec,
7643 },
7644 },
7645 .write = write_jedec_1,
7646 .read = read_memmapped,
7647 .voltage = {2700, 3600},
7648 },
7649
7650 {
7651 .vendor = "Macronix",
7652 .name = "MX29GL128F",
7653 .bustype = BUS_PARALLEL,
7654 .manufacture_id = MACRONIX_ID,
7655 .model_id = MACRONIX_MX29GL128F,
7656 .total_size = 16384,
7657 .page_size = 128 * 1024, /* actual page size is 16 */
7658 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7659 .tested = TEST_UNTESTED,
7660 .probe = probe_jedec_29gl,
7661 .probe_timing = TIMING_ZERO,
7662 .block_erasers =
7663 {
7664 {
7665 .eraseblocks = { {128 * 1024, 128} },
7666 .block_erase = erase_sector_jedec,
7667 }, {
7668 .eraseblocks = { {16 * 1024 * 1024, 1} },
7669 .block_erase = erase_chip_block_jedec,
7670 },
7671 },
7672 .write = write_jedec_1,
7673 .read = read_memmapped,
7674 .voltage = {2700, 3600},
7675 },
7676
7677 {
7678 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +00007679 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007680 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007681 .manufacture_id = MACRONIX_ID,
7682 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007683 .total_size = 512,
7684 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00007685 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7686 .tested = TEST_UNTESTED,
7687 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00007688 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00007689 .block_erasers =
7690 {
7691 {
Stefan Tauner6697f712014-08-06 15:09:15 +00007692 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +00007693 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007694 }, {
7695 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00007696 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00007697 },
7698 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00007699 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00007700 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00007701 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +00007702 },
7703
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00007704 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007705 .vendor = "Micron/Numonyx/ST",
7706 .name = "M25P05-A",
7707 .bustype = BUS_SPI,
7708 .manufacture_id = ST_ID,
7709 .model_id = ST_M25P05A,
7710 .total_size = 64,
7711 .page_size = 256,
7712 .feature_bits = FEATURE_WRSR_WREN,
7713 .tested = TEST_OK_PREW,
7714 .probe = probe_spi_rdid,
7715 .probe_timing = TIMING_ZERO,
7716 .block_erasers =
7717 {
7718 {
7719 .eraseblocks = { {32 * 1024, 2} },
7720 .block_erase = spi_block_erase_d8,
7721 }, {
7722 .eraseblocks = { {64 * 1024, 1} },
7723 .block_erase = spi_block_erase_c7,
7724 }
7725 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007726 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007727 .unlock = spi_disable_blockprotect,
7728 .write = spi_chip_write_256,
7729 .read = spi_chip_read,
7730 .voltage = {2700, 3600},
7731 },
7732
7733 /* The ST M25P05 is a bit of a problem. It has the same ID as the
7734 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
7735 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
7736 * only is successful if RDID does not work.
7737 */
7738 {
7739 .vendor = "Micron/Numonyx/ST",
7740 .name = "M25P05",
7741 .bustype = BUS_SPI,
7742 .manufacture_id = 0, /* Not used. */
7743 .model_id = ST_M25P05_RES,
7744 .total_size = 64,
7745 .page_size = 256,
7746 .feature_bits = FEATURE_WRSR_WREN,
7747 .tested = TEST_UNTESTED,
7748 .probe = probe_spi_res1,
7749 .probe_timing = TIMING_ZERO,
7750 .block_erasers =
7751 {
7752 {
7753 .eraseblocks = { {32 * 1024, 2} },
7754 .block_erase = spi_block_erase_d8,
7755 }, {
7756 .eraseblocks = { {64 * 1024, 1} },
7757 .block_erase = spi_block_erase_c7,
7758 }
7759 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007760 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007761 .unlock = spi_disable_blockprotect,
7762 .write = spi_chip_write_1, /* 128 */
7763 .read = spi_chip_read,
7764 .voltage = {2700, 3600},
7765 },
7766
7767 {
7768 .vendor = "Micron/Numonyx/ST",
7769 .name = "M25P10-A",
7770 .bustype = BUS_SPI,
7771 .manufacture_id = ST_ID,
7772 .model_id = ST_M25P10A,
7773 .total_size = 128,
7774 .page_size = 256,
7775 .feature_bits = FEATURE_WRSR_WREN,
7776 .tested = TEST_OK_PRE,
7777 .probe = probe_spi_rdid,
7778 .probe_timing = TIMING_ZERO,
7779 .block_erasers =
7780 {
7781 {
7782 .eraseblocks = { {32 * 1024, 4} },
7783 .block_erase = spi_block_erase_d8,
7784 }, {
7785 .eraseblocks = { {128 * 1024, 1} },
7786 .block_erase = spi_block_erase_c7,
7787 }
7788 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007789 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007790 .unlock = spi_disable_blockprotect,
7791 .write = spi_chip_write_256,
7792 .read = spi_chip_read,
7793 .voltage = {2700, 3600},
7794 },
7795
7796 /* The ST M25P10 has the same problem as the M25P05. */
7797 {
7798 .vendor = "Micron/Numonyx/ST",
7799 .name = "M25P10",
7800 .bustype = BUS_SPI,
7801 .manufacture_id = 0, /* Not used. */
7802 .model_id = ST_M25P10_RES,
7803 .total_size = 128,
7804 .page_size = 256,
7805 .feature_bits = FEATURE_WRSR_WREN,
7806 .tested = TEST_UNTESTED,
7807 .probe = probe_spi_res1,
7808 .probe_timing = TIMING_ZERO,
7809 .block_erasers =
7810 {
7811 {
7812 .eraseblocks = { {32 * 1024, 4} },
7813 .block_erase = spi_block_erase_d8,
7814 }, {
7815 .eraseblocks = { {128 * 1024, 1} },
7816 .block_erase = spi_block_erase_c7,
7817 }
7818 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007819 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007820 .unlock = spi_disable_blockprotect,
7821 .write = spi_chip_write_1, /* 128 */
7822 .read = spi_chip_read,
7823 .voltage = {2700, 3600},
7824 },
7825
7826 {
7827 .vendor = "Micron/Numonyx/ST", /* Numonyx */
7828 .name = "M25P20",
7829 .bustype = BUS_SPI,
7830 .manufacture_id = ST_ID,
7831 .model_id = ST_M25P20,
7832 .total_size = 256,
7833 .page_size = 256,
7834 .feature_bits = FEATURE_WRSR_WREN,
7835 .tested = TEST_UNTESTED,
7836 .probe = probe_spi_rdid,
7837 .probe_timing = TIMING_ZERO,
7838 .block_erasers =
7839 {
7840 {
7841 .eraseblocks = { {64 * 1024, 4} },
7842 .block_erase = spi_block_erase_d8,
7843 }, {
7844 .eraseblocks = { {256 * 1024, 1} },
7845 .block_erase = spi_block_erase_c7,
7846 }
7847 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007848 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007849 .unlock = spi_disable_blockprotect,
7850 .write = spi_chip_write_256,
7851 .read = spi_chip_read, /* Fast read (0x0B) supported */
7852 .voltage = {2700, 3600},
7853 },
7854
7855 {
7856 .vendor = "Micron/Numonyx/ST",
7857 .name = "M25P20-old",
7858 .bustype = BUS_SPI,
7859 .manufacture_id = 0, /* Not used. */
7860 .model_id = ST_M25P20_RES,
7861 .total_size = 256,
7862 .page_size = 256,
7863 .feature_bits = FEATURE_WRSR_WREN,
7864 .tested = TEST_OK_PREW,
7865 .probe = probe_spi_res1,
7866 .probe_timing = TIMING_ZERO,
7867 .block_erasers =
7868 {
7869 {
7870 .eraseblocks = { {64 * 1024, 4} },
7871 .block_erase = spi_block_erase_d8,
7872 }, {
7873 .eraseblocks = { {256 * 1024, 1} },
7874 .block_erase = spi_block_erase_c7,
7875 }
7876 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007877 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007878 .unlock = spi_disable_blockprotect,
7879 .write = spi_chip_write_256,
7880 .read = spi_chip_read, /* Fast read (0x0B) supported */
7881 .voltage = {2700, 3600},
7882 },
7883
7884 {
7885 .vendor = "Micron/Numonyx/ST", /* Numonyx */
7886 .name = "M25P40",
7887 .bustype = BUS_SPI,
7888 .manufacture_id = ST_ID,
7889 .model_id = ST_M25P40,
7890 .total_size = 512,
7891 .page_size = 256,
7892 .feature_bits = FEATURE_WRSR_WREN,
7893 .tested = TEST_OK_PREW,
7894 .probe = probe_spi_rdid,
7895 .probe_timing = TIMING_ZERO,
7896 .block_erasers =
7897 {
7898 {
7899 .eraseblocks = { {64 * 1024, 8} },
7900 .block_erase = spi_block_erase_d8,
7901 }, {
7902 .eraseblocks = { {512 * 1024, 1} },
7903 .block_erase = spi_block_erase_c7,
7904 }
7905 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007906 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007907 .unlock = spi_disable_blockprotect,
7908 .write = spi_chip_write_256,
7909 .read = spi_chip_read,
7910 .voltage = {2700, 3600},
7911 },
7912
7913 {
7914 .vendor = "Micron/Numonyx/ST",
7915 .name = "M25P40-old",
7916 .bustype = BUS_SPI,
7917 .manufacture_id = 0, /* Not used. */
7918 .model_id = ST_M25P40_RES,
7919 .total_size = 512,
7920 .page_size = 256,
7921 .feature_bits = FEATURE_WRSR_WREN,
7922 .tested = TEST_UNTESTED,
7923 .probe = probe_spi_res1,
7924 .probe_timing = TIMING_ZERO,
7925 .block_erasers =
7926 {
7927 {
7928 .eraseblocks = { {64 * 1024, 8} },
7929 .block_erase = spi_block_erase_d8,
7930 }, {
7931 .eraseblocks = { {512 * 1024, 1} },
7932 .block_erase = spi_block_erase_c7,
7933 }
7934 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007935 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007936 .unlock = spi_disable_blockprotect,
7937 .write = spi_chip_write_256,
7938 .read = spi_chip_read,
7939 },
7940
7941 {
7942 .vendor = "Micron/Numonyx/ST",
7943 .name = "M25P80",
7944 .bustype = BUS_SPI,
7945 .manufacture_id = ST_ID,
7946 .model_id = ST_M25P80,
7947 .total_size = 1024,
7948 .page_size = 256,
7949 .feature_bits = FEATURE_WRSR_WREN,
7950 .tested = TEST_OK_PREW,
7951 .probe = probe_spi_rdid,
7952 .probe_timing = TIMING_ZERO,
7953 .block_erasers =
7954 {
7955 {
7956 .eraseblocks = { {64 * 1024, 16} },
7957 .block_erase = spi_block_erase_d8,
7958 }, {
7959 .eraseblocks = { {1024 * 1024, 1} },
7960 .block_erase = spi_block_erase_c7,
7961 }
7962 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007963 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007964 .unlock = spi_disable_blockprotect,
7965 .write = spi_chip_write_256,
7966 .read = spi_chip_read,
7967 .voltage = {2700, 3600},
7968 },
7969
7970 {
7971 .vendor = "Micron/Numonyx/ST",
7972 .name = "M25P16",
7973 .bustype = BUS_SPI,
7974 .manufacture_id = ST_ID,
7975 .model_id = ST_M25P16,
7976 .total_size = 2048,
7977 .page_size = 256,
7978 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00007979 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007980 .probe = probe_spi_rdid,
7981 .probe_timing = TIMING_ZERO,
7982 .block_erasers =
7983 {
7984 {
7985 .eraseblocks = { {64 * 1024, 32} },
7986 .block_erase = spi_block_erase_d8,
7987 }, {
7988 .eraseblocks = { {2 * 1024 * 1024, 1} },
7989 .block_erase = spi_block_erase_c7,
7990 }
7991 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00007992 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00007993 .unlock = spi_disable_blockprotect,
7994 .write = spi_chip_write_256,
7995 .read = spi_chip_read,
7996 .voltage = {2700, 3600},
7997 },
7998
7999 {
8000 .vendor = "Micron/Numonyx/ST",
8001 .name = "M25P32",
8002 .bustype = BUS_SPI,
8003 .manufacture_id = ST_ID,
8004 .model_id = ST_M25P32,
8005 .total_size = 4096,
8006 .page_size = 256,
8007 .feature_bits = FEATURE_WRSR_WREN,
8008 .tested = TEST_OK_PREW,
8009 .probe = probe_spi_rdid,
8010 .probe_timing = TIMING_ZERO,
8011 .block_erasers =
8012 {
8013 {
8014 .eraseblocks = { {64 * 1024, 64} },
8015 .block_erase = spi_block_erase_d8,
8016 }, {
8017 .eraseblocks = { {4 * 1024 * 1024, 1} },
8018 .block_erase = spi_block_erase_c7,
8019 }
8020 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008021 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008022 .unlock = spi_disable_blockprotect,
8023 .write = spi_chip_write_256,
8024 .read = spi_chip_read,
8025 .voltage = {2700, 3600},
8026 },
8027
8028 {
8029 .vendor = "Micron/Numonyx/ST",
8030 .name = "M25P64",
8031 .bustype = BUS_SPI,
8032 .manufacture_id = ST_ID,
8033 .model_id = ST_M25P64,
8034 .total_size = 8192,
8035 .page_size = 256,
8036 .feature_bits = FEATURE_WRSR_WREN,
8037 .tested = TEST_OK_PREW,
8038 .probe = probe_spi_rdid,
8039 .probe_timing = TIMING_ZERO,
8040 .block_erasers =
8041 {
8042 {
8043 .eraseblocks = { {64 * 1024, 128} },
8044 .block_erase = spi_block_erase_d8,
8045 }, {
8046 .eraseblocks = { {8 * 1024 * 1024, 1} },
8047 .block_erase = spi_block_erase_c7,
8048 }
8049 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008050 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008051 .unlock = spi_disable_blockprotect,
8052 .write = spi_chip_write_256,
8053 .read = spi_chip_read,
8054 .voltage = {2700, 3600},
8055 },
8056
8057 {
8058 .vendor = "Micron/Numonyx/ST",
8059 .name = "M25P128",
8060 .bustype = BUS_SPI,
8061 .manufacture_id = ST_ID,
8062 .model_id = ST_M25P128,
8063 .total_size = 16384,
8064 .page_size = 256,
8065 .feature_bits = FEATURE_WRSR_WREN,
8066 .tested = TEST_OK_PREW,
8067 .probe = probe_spi_rdid,
8068 .probe_timing = TIMING_ZERO,
8069 .block_erasers =
8070 {
8071 {
8072 .eraseblocks = { {256 * 1024, 64} },
8073 .block_erase = spi_block_erase_d8,
8074 }, {
8075 .eraseblocks = { {16 * 1024 * 1024, 1} },
8076 .block_erase = spi_block_erase_c7,
8077 }
8078 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008079 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008080 .unlock = spi_disable_blockprotect,
8081 .write = spi_chip_write_256,
8082 .read = spi_chip_read,
8083 .voltage = {2700, 3600},
8084 },
8085
8086 {
8087 .vendor = "Micron/Numonyx/ST",
8088 .name = "M25PE10",
8089 .bustype = BUS_SPI,
8090 .manufacture_id = ST_ID,
8091 .model_id = ST_M25PE10,
8092 .total_size = 128,
8093 .page_size = 256,
8094 .feature_bits = FEATURE_WRSR_WREN,
8095 .tested = TEST_UNTESTED,
8096 .probe = probe_spi_rdid,
8097 .probe_timing = TIMING_ZERO,
8098 .block_erasers =
8099 {
8100 {
8101 .eraseblocks = { {4 * 1024, 32} },
8102 .block_erase = spi_block_erase_20,
8103 }, {
8104 .eraseblocks = { {64 * 1024, 2} },
8105 .block_erase = spi_block_erase_d8,
8106 }, {
8107 .eraseblocks = { {128 * 1024, 1} },
8108 .block_erase = spi_block_erase_c7,
8109 }
8110 },
8111 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8112 .unlock = spi_disable_blockprotect,
8113 .write = spi_chip_write_256,
8114 .read = spi_chip_read,
8115 .voltage = {2700, 3600},
8116 },
8117
8118 {
8119 .vendor = "Micron/Numonyx/ST",
8120 .name = "M25PE20",
8121 .bustype = BUS_SPI,
8122 .manufacture_id = ST_ID,
8123 .model_id = ST_M25PE20,
8124 .total_size = 256,
8125 .page_size = 256,
8126 .feature_bits = FEATURE_WRSR_WREN,
8127 .tested = TEST_UNTESTED,
8128 .probe = probe_spi_rdid,
8129 .probe_timing = TIMING_ZERO,
8130 .block_erasers =
8131 {
8132 {
8133 .eraseblocks = { {4 * 1024, 64} },
8134 .block_erase = spi_block_erase_20,
8135 }, {
8136 .eraseblocks = { {64 * 1024, 4} },
8137 .block_erase = spi_block_erase_d8,
8138 }, {
8139 .eraseblocks = { {256 * 1024, 1} },
8140 .block_erase = spi_block_erase_c7,
8141 }
8142 },
8143 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8144 .unlock = spi_disable_blockprotect,
8145 .write = spi_chip_write_256,
8146 .read = spi_chip_read,
8147 .voltage = {2700, 3600},
8148 },
8149
8150 {
8151 .vendor = "Micron/Numonyx/ST",
8152 .name = "M25PE40",
8153 .bustype = BUS_SPI,
8154 .manufacture_id = ST_ID,
8155 .model_id = ST_M25PE40,
8156 .total_size = 512,
8157 .page_size = 256,
8158 .feature_bits = FEATURE_WRSR_WREN,
8159 .tested = TEST_UNTESTED,
8160 .probe = probe_spi_rdid,
8161 .probe_timing = TIMING_ZERO,
8162 .block_erasers =
8163 {
8164 {
8165 .eraseblocks = { {4 * 1024, 128} },
8166 .block_erase = spi_block_erase_20,
8167 }, {
8168 .eraseblocks = { {64 * 1024, 8} },
8169 .block_erase = spi_block_erase_d8,
8170 }, {
8171 .eraseblocks = { {512 * 1024, 1} },
8172 .block_erase = spi_block_erase_c7,
8173 }
8174 },
8175 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8176 .unlock = spi_disable_blockprotect,
8177 .write = spi_chip_write_256,
8178 .read = spi_chip_read,
8179 .voltage = {2700, 3600},
8180 },
8181
8182 {
8183 .vendor = "Micron/Numonyx/ST",
8184 .name = "M25PE80",
8185 .bustype = BUS_SPI,
8186 .manufacture_id = ST_ID,
8187 .model_id = ST_M25PE80,
8188 .total_size = 1024,
8189 .page_size = 256,
8190 .feature_bits = FEATURE_WRSR_WREN,
8191 .tested = TEST_OK_PREW,
8192 .probe = probe_spi_rdid,
8193 .probe_timing = TIMING_ZERO,
8194 .block_erasers =
8195 {
8196 {
8197 .eraseblocks = { {4 * 1024, 256} },
8198 .block_erase = spi_block_erase_20,
8199 }, {
8200 .eraseblocks = { {64 * 1024, 16} },
8201 .block_erase = spi_block_erase_d8,
8202 }, {
8203 .eraseblocks = { {1024 * 1024, 1} },
8204 .block_erase = spi_block_erase_c7,
8205 }
8206 },
8207 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8208 .unlock = spi_disable_blockprotect,
8209 .write = spi_chip_write_256,
8210 .read = spi_chip_read,
8211 .voltage = {2700, 3600},
8212 },
8213
8214 {
8215 .vendor = "Micron/Numonyx/ST",
8216 .name = "M25PE16",
8217 .bustype = BUS_SPI,
8218 .manufacture_id = ST_ID,
8219 .model_id = ST_M25PE16,
8220 .total_size = 2048,
8221 .page_size = 256,
8222 .feature_bits = FEATURE_WRSR_WREN,
8223 .tested = TEST_UNTESTED,
8224 .probe = probe_spi_rdid,
8225 .probe_timing = TIMING_ZERO,
8226 .block_erasers =
8227 {
8228 {
8229 .eraseblocks = { {4 * 1024, 512} },
8230 .block_erase = spi_block_erase_20,
8231 }, {
8232 .eraseblocks = { {64 * 1024, 32} },
8233 .block_erase = spi_block_erase_d8,
8234 }, {
8235 .eraseblocks = { {2 * 1024 * 1024, 1} },
8236 .block_erase = spi_block_erase_c7,
8237 }
8238 },
8239 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
8240 .unlock = spi_disable_blockprotect,
8241 .write = spi_chip_write_256,
8242 .read = spi_chip_read,
8243 .voltage = {2700, 3600},
8244 },
8245
8246 {
8247 .vendor = "Micron/Numonyx/ST",
8248 .name = "M25PX80",
8249 .bustype = BUS_SPI,
8250 .manufacture_id = ST_ID,
8251 .model_id = ST_M25PX80,
8252 .total_size = 1024,
8253 .page_size = 256,
8254 /* OTP: 64B total; read 0x4B, write 0x42 */
8255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8256 .tested = TEST_OK_PREW,
8257 .probe = probe_spi_rdid,
8258 .probe_timing = TIMING_ZERO,
8259 .block_erasers = {
8260 {
8261 .eraseblocks = { { 4 * 1024, 256 } },
8262 .block_erase = spi_block_erase_20,
8263 }, {
8264 .eraseblocks = { {64 * 1024, 16} },
8265 .block_erase = spi_block_erase_d8,
8266 }, {
8267 .eraseblocks = { {1024 * 1024, 1} },
8268 .block_erase = spi_block_erase_c7,
8269 }
8270 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008271 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008272 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8273 .write = spi_chip_write_256,
8274 .read = spi_chip_read,
8275 .voltage = {2700, 3600},
8276 },
8277
8278 {
8279 .vendor = "Micron/Numonyx/ST",
8280 .name = "M25PX16",
8281 .bustype = BUS_SPI,
8282 .manufacture_id = ST_ID,
8283 .model_id = ST_M25PX16,
8284 .total_size = 2048,
8285 .page_size = 256,
8286 /* OTP: 64B total; read 0x4B; write 0x42 */
8287 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8288 .tested = TEST_OK_PREW,
8289 .probe = probe_spi_rdid,
8290 .probe_timing = TIMING_ZERO,
8291 .block_erasers =
8292 {
8293 {
8294 .eraseblocks = { { 4 * 1024, 512 } },
8295 .block_erase = spi_block_erase_20,
8296 }, {
8297 .eraseblocks = { {64 * 1024, 32} },
8298 .block_erase = spi_block_erase_d8,
8299 }, {
8300 .eraseblocks = { {2 * 1024 * 1024, 1} },
8301 .block_erase = spi_block_erase_c7,
8302 }
8303 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008304 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008305 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8306 .write = spi_chip_write_256,
8307 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008308 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008309 },
8310
8311 {
8312 .vendor = "Micron/Numonyx/ST",
8313 .name = "M25PX32",
8314 .bustype = BUS_SPI,
8315 .manufacture_id = ST_ID,
8316 .model_id = ST_M25PX32,
8317 .total_size = 4096,
8318 .page_size = 256,
8319 /* OTP: 64B total; read 0x4B; write 0x42 */
8320 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8321 .tested = TEST_OK_PRE,
8322 .probe = probe_spi_rdid,
8323 .probe_timing = TIMING_ZERO,
8324 .block_erasers =
8325 {
8326 {
8327 .eraseblocks = { { 4 * 1024, 1024 } },
8328 .block_erase = spi_block_erase_20,
8329 }, {
8330 .eraseblocks = { {64 * 1024, 64} },
8331 .block_erase = spi_block_erase_d8,
8332 }, {
8333 .eraseblocks = { {4 * 1024 * 1024, 1} },
8334 .block_erase = spi_block_erase_c7,
8335 }
8336 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008337 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008338 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8339 .write = spi_chip_write_256,
8340 .read = spi_chip_read,
8341 .voltage = {2700, 3600},
8342 },
8343
8344 {
8345 .vendor = "Micron/Numonyx/ST",
8346 .name = "M25PX64",
8347 .bustype = BUS_SPI,
8348 .manufacture_id = ST_ID,
8349 .model_id = ST_M25PX64,
8350 .total_size = 8192,
8351 .page_size = 256,
8352 /* OTP: 64B total; read 0x4B; write 0x42 */
8353 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008354 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008355 .probe = probe_spi_rdid,
8356 .probe_timing = TIMING_ZERO,
8357 .block_erasers =
8358 {
8359 {
8360 .eraseblocks = { { 4 * 1024, 2048 } },
8361 .block_erase = spi_block_erase_20,
8362 }, {
8363 .eraseblocks = { {64 * 1024, 128} },
8364 .block_erase = spi_block_erase_d8,
8365 }, {
8366 .eraseblocks = { {8 * 1024 * 1024, 1} },
8367 .block_erase = spi_block_erase_c7,
8368 }
8369 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008370 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008371 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
8372 .write = spi_chip_write_256,
8373 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008374 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008375 },
8376
8377 {
8378 .vendor = "Micron/Numonyx/ST",
8379 .name = "M45PE10",
8380 .bustype = BUS_SPI,
8381 .manufacture_id = ST_ID,
8382 .model_id = ST_M45PE10,
8383 .total_size = 128,
8384 .page_size = 256,
8385 .tested = TEST_UNTESTED,
8386 .probe = probe_spi_rdid,
8387 .probe_timing = TIMING_ZERO,
8388 .block_erasers = {
8389 {
8390 .eraseblocks = { {256, 512} },
8391 .block_erase = spi_block_erase_db,
8392 }, {
8393 .eraseblocks = { {64 * 1024, 2} },
8394 .block_erase = spi_block_erase_d8,
8395 }
8396 },
8397 .printlock = spi_prettyprint_status_register_default_welwip,
8398 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8399 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8400 .read = spi_chip_read, /* Fast read (0x0B) supported */
8401 .voltage = {2700, 3600},
8402 },
8403
8404 {
8405 .vendor = "Micron/Numonyx/ST",
8406 .name = "M45PE20",
8407 .bustype = BUS_SPI,
8408 .manufacture_id = ST_ID,
8409 .model_id = ST_M45PE20,
8410 .total_size = 256,
8411 .page_size = 256,
8412 .tested = TEST_UNTESTED,
8413 .probe = probe_spi_rdid,
8414 .probe_timing = TIMING_ZERO,
8415 .block_erasers = {
8416 {
8417 .eraseblocks = { {256, 1024} },
8418 .block_erase = spi_block_erase_db,
8419 }, {
8420 .eraseblocks = { {64 * 1024, 4} },
8421 .block_erase = spi_block_erase_d8,
8422 }
8423 },
8424 .printlock = spi_prettyprint_status_register_default_welwip,
8425 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8426 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8427 .read = spi_chip_read, /* Fast read (0x0B) supported */
8428 .voltage = {2700, 3600},
8429 },
8430
8431 {
8432 .vendor = "Micron/Numonyx/ST",
8433 .name = "M45PE40",
8434 .bustype = BUS_SPI,
8435 .manufacture_id = ST_ID,
8436 .model_id = ST_M45PE40,
8437 .total_size = 512,
8438 .page_size = 256,
8439 .tested = TEST_UNTESTED,
8440 .probe = probe_spi_rdid,
8441 .probe_timing = TIMING_ZERO,
8442 .block_erasers = {
8443 {
8444 .eraseblocks = { {256, 2048} },
8445 .block_erase = spi_block_erase_db,
8446 }, {
8447 .eraseblocks = { {64 * 1024, 8} },
8448 .block_erase = spi_block_erase_d8,
8449 }
8450 },
8451 .printlock = spi_prettyprint_status_register_default_welwip,
8452 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8453 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8454 .read = spi_chip_read, /* Fast read (0x0B) supported */
8455 .voltage = {2700, 3600},
8456 },
8457
8458 {
8459 .vendor = "Micron/Numonyx/ST",
8460 .name = "M45PE80",
8461 .bustype = BUS_SPI,
8462 .manufacture_id = ST_ID,
8463 .model_id = ST_M45PE80,
8464 .total_size = 1024,
8465 .page_size = 256,
8466 .tested = TEST_UNTESTED,
8467 .probe = probe_spi_rdid,
8468 .probe_timing = TIMING_ZERO,
8469 .block_erasers = {
8470 {
8471 .eraseblocks = { {256, 4096} },
8472 .block_erase = spi_block_erase_db,
8473 }, {
8474 .eraseblocks = { {64 * 1024, 16} },
8475 .block_erase = spi_block_erase_d8,
8476 }
8477 },
8478 .printlock = spi_prettyprint_status_register_default_welwip,
8479 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8480 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8481 .read = spi_chip_read, /* Fast read (0x0B) supported */
8482 .voltage = {2700, 3600},
8483 },
8484
8485 {
8486 .vendor = "Micron/Numonyx/ST",
8487 .name = "M45PE16",
8488 .bustype = BUS_SPI,
8489 .manufacture_id = ST_ID,
8490 .model_id = ST_M45PE16,
8491 .total_size = 2048,
8492 .page_size = 256,
8493 .tested = TEST_UNTESTED,
8494 .probe = probe_spi_rdid,
8495 .probe_timing = TIMING_ZERO,
8496 .block_erasers = {
8497 {
8498 .eraseblocks = { {256, 8192} },
8499 .block_erase = spi_block_erase_db,
8500 }, {
8501 .eraseblocks = { {64 * 1024, 32} },
8502 .block_erase = spi_block_erase_d8,
8503 }
8504 },
8505 .printlock = spi_prettyprint_status_register_default_welwip,
8506 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
8507 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
8508 .read = spi_chip_read, /* Fast read (0x0B) supported */
8509 .voltage = {2700, 3600},
8510 },
8511
8512 {
8513 .vendor = "Micron/Numonyx/ST",
8514 .name = "N25Q016",
8515 .bustype = BUS_SPI,
8516 .manufacture_id = ST_ID,
8517 .model_id = ST_N25Q016__1E,
8518 .total_size = 2048,
8519 .page_size = 256,
8520 /* supports SFDP */
8521 /* OTP: 64B total; read 0x4B, write 0x42 */
8522 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8523 .tested = TEST_UNTESTED,
8524 .probe = probe_spi_rdid,
8525 .probe_timing = TIMING_ZERO,
8526 .block_erasers =
8527 {
8528 {
8529 .eraseblocks = { {4 * 1024, 512} },
8530 .block_erase = spi_block_erase_20,
8531 }, {
8532 .eraseblocks = { {32 * 1024, 64} },
8533 .block_erase = spi_block_erase_52,
8534 }, {
8535 .eraseblocks = { {64 * 1024, 32} },
8536 .block_erase = spi_block_erase_d8,
8537 }, {
8538 .eraseblocks = { {2 * 1024 * 1024, 1} },
8539 .block_erase = spi_block_erase_c7,
8540 }
8541 },
8542 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8543 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8544 .write = spi_chip_write_256, /* Multi I/O supported */
8545 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8546 .voltage = {1700, 2000},
8547 },
8548
8549 {
8550 .vendor = "Micron/Numonyx/ST",
8551 .name = "N25Q032..1E",
8552 .bustype = BUS_SPI,
8553 .manufacture_id = ST_ID,
8554 .model_id = ST_N25Q032__1E,
8555 .total_size = 4096,
8556 .page_size = 256,
8557 /* supports SFDP */
8558 /* OTP: 64B total; read 0x4B, write 0x42 */
8559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8560 .tested = TEST_UNTESTED,
8561 .probe = probe_spi_rdid,
8562 .probe_timing = TIMING_ZERO,
8563 .block_erasers =
8564 {
8565 {
8566 .eraseblocks = { {4 * 1024, 1024} },
8567 .block_erase = spi_block_erase_20,
8568 }, {
8569 .eraseblocks = { {64 * 1024, 64} },
8570 .block_erase = spi_block_erase_d8,
8571 }, {
8572 .eraseblocks = { {4 * 1024 * 1024, 1} },
8573 .block_erase = spi_block_erase_c7,
8574 }
8575 },
8576 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8577 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8578 .write = spi_chip_write_256, /* Multi I/O supported */
8579 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8580 .voltage = {1700, 2000},
8581 },
8582
8583 {
8584 .vendor = "Micron/Numonyx/ST",
8585 .name = "N25Q032..3E",
8586 .bustype = BUS_SPI,
8587 .manufacture_id = ST_ID,
8588 .model_id = ST_N25Q032__3E,
8589 .total_size = 4096,
8590 .page_size = 256,
8591 /* supports SFDP */
8592 /* OTP: 64B total; read 0x4B, write 0x42 */
8593 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8594 .tested = TEST_OK_PREW,
8595 .probe = probe_spi_rdid,
8596 .probe_timing = TIMING_ZERO,
8597 .block_erasers =
8598 {
8599 {
8600 .eraseblocks = { {4 * 1024, 1024} },
8601 .block_erase = spi_block_erase_20,
8602 }, {
8603 .eraseblocks = { {64 * 1024, 64} },
8604 .block_erase = spi_block_erase_d8,
8605 }, {
8606 .eraseblocks = { {4 * 1024 * 1024, 1} },
8607 .block_erase = spi_block_erase_c7,
8608 }
8609 },
8610 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8611 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8612 .write = spi_chip_write_256, /* Multi I/O supported */
8613 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8614 .voltage = {2700, 3600},
8615 },
8616
8617 {
8618 .vendor = "Micron/Numonyx/ST",
8619 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
8620 .bustype = BUS_SPI,
8621 .manufacture_id = ST_ID,
8622 .model_id = ST_N25Q064__1E,
8623 .total_size = 8192,
8624 .page_size = 256,
8625 /* supports SFDP */
8626 /* OTP: 64B total; read 0x4B, write 0x42 */
8627 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008628 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00008629 .probe = probe_spi_rdid,
8630 .probe_timing = TIMING_ZERO,
8631 .block_erasers =
8632 {
8633 {
8634 .eraseblocks = { {4 * 1024, 2048 } },
8635 .block_erase = spi_block_erase_20,
8636 }, {
8637 .eraseblocks = { {64 * 1024, 128} },
8638 .block_erase = spi_block_erase_d8,
8639 }, {
8640 .eraseblocks = { {8 * 1024 * 1024, 1} },
8641 .block_erase = spi_block_erase_c7,
8642 }
8643 },
8644 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8645 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8646 .write = spi_chip_write_256, /* Multi I/O supported */
8647 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8648 .voltage = {1700, 2000},
8649 },
8650
8651 {
8652 .vendor = "Micron/Numonyx/ST",
8653 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
8654 .bustype = BUS_SPI,
8655 .manufacture_id = ST_ID,
8656 .model_id = ST_N25Q064__3E,
8657 .total_size = 8192,
8658 .page_size = 256,
8659 /* supports SFDP */
8660 /* OTP: 64B total; read 0x4B, write 0x42 */
8661 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8662 .tested = TEST_OK_PREW,
8663 .probe = probe_spi_rdid,
8664 .probe_timing = TIMING_ZERO,
8665 .block_erasers =
8666 {
8667 {
8668 .eraseblocks = { {4 * 1024, 2048 } },
8669 .block_erase = spi_block_erase_20,
8670 }, {
8671 .eraseblocks = { {64 * 1024, 128} },
8672 .block_erase = spi_block_erase_d8,
8673 }, {
8674 .eraseblocks = { {8 * 1024 * 1024, 1} },
8675 .block_erase = spi_block_erase_c7,
8676 }
8677 },
8678 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8679 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8680 .write = spi_chip_write_256, /* Multi I/O supported */
8681 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8682 .voltage = {2700, 3600},
8683 },
8684
8685 {
8686 .vendor = "Micron/Numonyx/ST",
8687 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
8688 .bustype = BUS_SPI,
8689 .manufacture_id = ST_ID,
8690 .model_id = ST_N25Q128__1E,
8691 .total_size = 16384,
8692 .page_size = 256,
8693 /* supports SFDP */
8694 /* OTP: 64B total; read 0x4B, write 0x42 */
8695 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8696 .tested = TEST_UNTESTED,
8697 .probe = probe_spi_rdid,
8698 .probe_timing = TIMING_ZERO,
8699 .block_erasers = {
8700 {
8701 .eraseblocks = { {4 * 1024, 4096 } },
8702 .block_erase = spi_block_erase_20,
8703 }, {
8704 .eraseblocks = { {64 * 1024, 256} },
8705 .block_erase = spi_block_erase_d8,
8706 }, {
8707 .eraseblocks = { {16384 * 1024, 1} },
8708 .block_erase = spi_block_erase_c7,
8709 }
8710 },
8711 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8712 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8713 .write = spi_chip_write_256, /* Multi I/O supported */
8714 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8715 .voltage = {1700, 2000},
8716 },
8717
8718 {
8719 .vendor = "Micron/Numonyx/ST",
8720 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
8721 .bustype = BUS_SPI,
8722 .manufacture_id = ST_ID,
8723 .model_id = ST_N25Q128__3E,
8724 .total_size = 16384,
8725 .page_size = 256,
8726 /* supports SFDP */
8727 /* OTP: 64B total; read 0x4B, write 0x42 */
8728 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8729 .tested = TEST_OK_PREW,
8730 .probe = probe_spi_rdid,
8731 .probe_timing = TIMING_ZERO,
8732 .block_erasers = {
8733 {
8734 .eraseblocks = { {4 * 1024, 4096 } },
8735 .block_erase = spi_block_erase_20,
8736 }, {
8737 .eraseblocks = { {64 * 1024, 256} },
8738 .block_erase = spi_block_erase_d8,
8739 }, {
8740 .eraseblocks = { {16384 * 1024, 1} },
8741 .block_erase = spi_block_erase_c7,
8742 }
8743 },
8744 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
8745 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
8746 .write = spi_chip_write_256, /* Multi I/O supported */
8747 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8748 .voltage = {2700, 3600},
8749 },
8750
8751 {
Mattias Mattsson4c066502010-07-29 20:01:13 +00008752 .vendor = "MoselVitelic",
8753 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008754 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008755 .manufacture_id = SYNCMOS_MVC_ID,
8756 .model_id = MVC_V29C51000B,
8757 .total_size = 64,
8758 .page_size = 512,
8759 .feature_bits = FEATURE_EITHER_RESET,
8760 .tested = TEST_UNTESTED,
8761 .probe = probe_jedec,
8762 .probe_timing = TIMING_ZERO,
8763 .block_erasers =
8764 {
8765 {
8766 .eraseblocks = { {512, 128} },
8767 .block_erase = erase_sector_jedec,
8768 }, {
8769 .eraseblocks = { {64 * 1024, 1} },
8770 .block_erase = erase_chip_block_jedec,
8771 },
8772 },
8773 .write = write_jedec_1,
8774 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008775 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008776 },
8777
8778 {
8779 .vendor = "MoselVitelic",
8780 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008781 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008782 .manufacture_id = SYNCMOS_MVC_ID,
8783 .model_id = MVC_V29C51000T,
8784 .total_size = 64,
8785 .page_size = 512,
8786 .feature_bits = FEATURE_EITHER_RESET,
8787 .tested = TEST_UNTESTED,
8788 .probe = probe_jedec,
8789 .probe_timing = TIMING_ZERO,
8790 .block_erasers =
8791 {
8792 {
8793 .eraseblocks = { {512, 128} },
8794 .block_erase = erase_sector_jedec,
8795 }, {
8796 .eraseblocks = { {64 * 1024, 1} },
8797 .block_erase = erase_chip_block_jedec,
8798 },
8799 },
8800 .write = write_jedec_1,
8801 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008802 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008803 },
8804
8805 {
8806 .vendor = "MoselVitelic",
8807 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008808 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008809 .manufacture_id = SYNCMOS_MVC_ID,
8810 .model_id = MVC_V29C51400B,
8811 .total_size = 512,
8812 .page_size = 1024,
8813 .feature_bits = FEATURE_EITHER_RESET,
8814 .tested = TEST_UNTESTED,
8815 .probe = probe_jedec,
8816 .probe_timing = TIMING_ZERO,
8817 .block_erasers =
8818 {
8819 {
8820 .eraseblocks = { {1024, 512} },
8821 .block_erase = erase_sector_jedec,
8822 }, {
8823 .eraseblocks = { {512 * 1024, 1} },
8824 .block_erase = erase_chip_block_jedec,
8825 },
8826 },
8827 .write = write_jedec_1,
8828 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008829 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008830 },
8831
8832 {
8833 .vendor = "MoselVitelic",
8834 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008835 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008836 .manufacture_id = SYNCMOS_MVC_ID,
8837 .model_id = MVC_V29C51400T,
8838 .total_size = 512,
8839 .page_size = 1024,
8840 .feature_bits = FEATURE_EITHER_RESET,
8841 .tested = TEST_UNTESTED,
8842 .probe = probe_jedec,
8843 .probe_timing = TIMING_ZERO,
8844 .block_erasers =
8845 {
8846 {
8847 .eraseblocks = { {1024, 512} },
8848 .block_erase = erase_sector_jedec,
8849 }, {
8850 .eraseblocks = { {512 * 1024, 1} },
8851 .block_erase = erase_chip_block_jedec,
8852 },
8853 },
8854 .write = write_jedec_1,
8855 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008856 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008857 },
8858
8859 {
8860 .vendor = "MoselVitelic",
8861 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008862 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008863 .manufacture_id = SYNCMOS_MVC_ID,
8864 .model_id = MVC_V29LC51000,
8865 .total_size = 64,
8866 .page_size = 512,
8867 .feature_bits = FEATURE_EITHER_RESET,
8868 .tested = TEST_UNTESTED,
8869 .probe = probe_jedec,
8870 .probe_timing = TIMING_ZERO,
8871 .block_erasers =
8872 {
8873 {
8874 .eraseblocks = { {512, 128} },
8875 .block_erase = erase_sector_jedec,
8876 }, {
8877 .eraseblocks = { {64 * 1024, 1} },
8878 .block_erase = erase_chip_block_jedec,
8879 },
8880 },
8881 .write = write_jedec_1,
8882 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008883 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008884 },
8885
8886 {
8887 .vendor = "MoselVitelic",
8888 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008889 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008890 .manufacture_id = SYNCMOS_MVC_ID,
8891 .model_id = MVC_V29LC51001,
8892 .total_size = 128,
8893 .page_size = 512,
8894 .feature_bits = FEATURE_EITHER_RESET,
8895 .tested = TEST_UNTESTED,
8896 .probe = probe_jedec,
8897 .probe_timing = TIMING_ZERO,
8898 .block_erasers =
8899 {
8900 {
8901 .eraseblocks = { {512, 256} },
8902 .block_erase = erase_sector_jedec,
8903 }, {
8904 .eraseblocks = { {128 * 1024, 1} },
8905 .block_erase = erase_chip_block_jedec,
8906 },
8907 },
8908 .write = write_jedec_1,
8909 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008910 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008911 },
8912
8913 {
8914 .vendor = "MoselVitelic",
8915 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008916 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +00008917 .manufacture_id = SYNCMOS_MVC_ID,
8918 .model_id = MVC_V29LC51002,
8919 .total_size = 256,
8920 .page_size = 512,
8921 .feature_bits = FEATURE_EITHER_RESET,
8922 .tested = TEST_UNTESTED,
8923 .probe = probe_jedec,
8924 .probe_timing = TIMING_ZERO,
8925 .block_erasers =
8926 {
8927 {
8928 .eraseblocks = { {512, 512} },
8929 .block_erase = erase_sector_jedec,
8930 }, {
8931 .eraseblocks = { {256 * 1024, 1} },
8932 .block_erase = erase_chip_block_jedec,
8933 },
8934 },
8935 .write = write_jedec_1,
8936 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008937 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +00008938 },
8939
8940 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008941 .vendor = "Nantronics",
8942 .name = "N25S10",
8943 .bustype = BUS_SPI,
8944 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8945 .model_id = NANTRONICS_N25S10,
8946 .total_size = 128,
8947 .page_size = 256,
8948 .feature_bits = FEATURE_WRSR_WREN,
8949 .tested = TEST_UNTESTED,
8950 .probe = probe_spi_rdid,
8951 .probe_timing = TIMING_ZERO,
8952 .block_erasers =
8953 {
8954 {
8955 .eraseblocks = { {4 * 1024, 32} },
8956 .block_erase = spi_block_erase_20,
8957 }, {
8958 .eraseblocks = { {4 * 1024, 32} },
8959 .block_erase = spi_block_erase_d7,
8960 }, {
8961 .eraseblocks = { {32 * 1024, 4} },
8962 .block_erase = spi_block_erase_52,
8963 }, {
8964 .eraseblocks = { {64 * 1024, 2} },
8965 .block_erase = spi_block_erase_d8,
8966 }, {
8967 .eraseblocks = { {128 * 1024, 1} },
8968 .block_erase = spi_block_erase_60,
8969 }, {
8970 .eraseblocks = { {128 * 1024, 1} },
8971 .block_erase = spi_block_erase_c7,
8972 }
8973 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008974 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00008975 .unlock = spi_disable_blockprotect_bp3_srwd,
8976 .write = spi_chip_write_256,
8977 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
8978 .voltage = {2700, 3600},
8979 },
8980
8981 {
8982 .vendor = "Nantronics",
8983 .name = "N25S20",
8984 .bustype = BUS_SPI,
8985 .manufacture_id = NANTRONICS_ID_NOPREFIX,
8986 .model_id = NANTRONICS_N25S20,
8987 .total_size = 256,
8988 .page_size = 256,
8989 .feature_bits = FEATURE_WRSR_WREN,
8990 .tested = TEST_UNTESTED,
8991 .probe = probe_spi_rdid,
8992 .probe_timing = TIMING_ZERO,
8993 .block_erasers =
8994 {
8995 {
8996 .eraseblocks = { {4 * 1024, 64} },
8997 .block_erase = spi_block_erase_20,
8998 }, {
8999 .eraseblocks = { {4 * 1024, 64} },
9000 .block_erase = spi_block_erase_d7,
9001 }, {
9002 .eraseblocks = { {32 * 1024, 8} },
9003 .block_erase = spi_block_erase_52,
9004 }, {
9005 .eraseblocks = { {64 * 1024, 4} },
9006 .block_erase = spi_block_erase_d8,
9007 }, {
9008 .eraseblocks = { {256 * 1024, 1} },
9009 .block_erase = spi_block_erase_60,
9010 }, {
9011 .eraseblocks = { {256 * 1024, 1} },
9012 .block_erase = spi_block_erase_c7,
9013 }
9014 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009015 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009016 .unlock = spi_disable_blockprotect_bp3_srwd,
9017 .write = spi_chip_write_256,
9018 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9019 .voltage = {2700, 3600},
9020 },
9021
9022 {
9023 .vendor = "Nantronics",
9024 .name = "N25S40",
9025 .bustype = BUS_SPI,
9026 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9027 .model_id = NANTRONICS_N25S40,
9028 .total_size = 512,
9029 .page_size = 256,
9030 .feature_bits = FEATURE_WRSR_WREN,
9031 .tested = TEST_UNTESTED,
9032 .probe = probe_spi_rdid,
9033 .probe_timing = TIMING_ZERO,
9034 .block_erasers =
9035 {
9036 {
9037 .eraseblocks = { {4 * 1024, 128} },
9038 .block_erase = spi_block_erase_20,
9039 }, {
9040 .eraseblocks = { {4 * 1024, 128} },
9041 .block_erase = spi_block_erase_d7,
9042 }, {
9043 .eraseblocks = { {32 * 1024, 16} },
9044 .block_erase = spi_block_erase_52,
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 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009056 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009057 .unlock = spi_disable_blockprotect_bp3_srwd,
9058 .write = spi_chip_write_256,
9059 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9060 .voltage = {2700, 3600},
9061 },
9062
9063 {
9064 .vendor = "Nantronics",
9065 .name = "N25S80",
9066 .bustype = BUS_SPI,
9067 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9068 .model_id = NANTRONICS_N25S80,
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 {
9078 .eraseblocks = { {4 * 1024, 256} },
9079 .block_erase = spi_block_erase_20,
9080 }, {
9081 .eraseblocks = { {32 * 1024, 32} },
9082 .block_erase = spi_block_erase_52,
9083 }, {
9084 .eraseblocks = { {64 * 1024, 16} },
9085 .block_erase = spi_block_erase_d8,
9086 }, {
9087 .eraseblocks = { {1024 * 1024, 1} },
9088 .block_erase = spi_block_erase_60,
9089 }, {
9090 .eraseblocks = { {1024 * 1024, 1} },
9091 .block_erase = spi_block_erase_c7,
9092 }
9093 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009094 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009095 .unlock = spi_disable_blockprotect_bp3_srwd,
9096 .write = spi_chip_write_256,
9097 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9098 .voltage = {2700, 3600},
9099 },
9100
9101 {
9102 .vendor = "Nantronics",
9103 .name = "N25S16",
9104 .bustype = BUS_SPI,
9105 .manufacture_id = NANTRONICS_ID_NOPREFIX,
9106 .model_id = NANTRONICS_N25S16,
9107 .total_size = 2048,
9108 .page_size = 256,
9109 .feature_bits = FEATURE_WRSR_WREN,
9110 .tested = TEST_UNTESTED,
9111 .probe = probe_spi_rdid,
9112 .probe_timing = TIMING_ZERO,
9113 .block_erasers =
9114 {
9115 {
9116 .eraseblocks = { {4 * 1024, 512} },
9117 .block_erase = spi_block_erase_20,
9118 }, {
9119 .eraseblocks = { {64 * 1024, 32} },
9120 .block_erase = spi_block_erase_d8,
9121 }, {
9122 .eraseblocks = { {2048 * 1024, 1} },
9123 .block_erase = spi_block_erase_60,
9124 }, {
9125 .eraseblocks = { {2048 * 1024, 1} },
9126 .block_erase = spi_block_erase_c7,
9127 }
9128 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009129 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +00009130 .unlock = spi_disable_blockprotect_bp3_srwd,
9131 .write = spi_chip_write_256,
9132 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
9133 .voltage = {2700, 3600},
9134 },
9135
9136 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009137 .vendor = "PMC",
Stefan Taunerf4451612013-04-19 01:59:15 +00009138 .name = "Pm25LD256C",
9139 .bustype = BUS_SPI,
9140 .manufacture_id = PMC_ID,
9141 .model_id = PMC_PM25LD256C,
9142 .total_size = 32,
9143 .page_size = 256,
9144 .feature_bits = FEATURE_WRSR_WREN,
9145 .tested = TEST_UNTESTED,
9146 .probe = probe_spi_rdid,
9147 .probe_timing = TIMING_ZERO,
9148 .block_erasers =
9149 {
9150 {
9151 .eraseblocks = { {4 * 1024, 8} },
9152 .block_erase = spi_block_erase_20,
9153 }, {
9154 .eraseblocks = { {4 * 1024, 8} },
9155 .block_erase = spi_block_erase_d7,
9156 }, {
9157 .eraseblocks = { {32 * 1024, 1} },
9158 .block_erase = spi_block_erase_d8,
9159 }, {
9160 .eraseblocks = { {32 * 1024, 1} },
9161 .block_erase = spi_block_erase_60,
9162 }, {
9163 .eraseblocks = { {32 * 1024, 1} },
9164 .block_erase = spi_block_erase_c7,
9165 }
9166 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009167 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009168 .unlock = spi_disable_blockprotect,
9169 .write = spi_chip_write_256,
9170 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9171 .voltage = {2700, 3600},
9172 },
9173 {
9174 .vendor = "PMC",
9175 .name = "Pm25LD512(C)",
9176 .bustype = BUS_SPI,
9177 .manufacture_id = PMC_ID,
9178 .model_id = PMC_PM25LD512,
9179 .total_size = 64,
9180 .page_size = 256,
9181 .feature_bits = FEATURE_WRSR_WREN,
9182 .tested = TEST_OK_PREW,
9183 .probe = probe_spi_rdid,
9184 .probe_timing = TIMING_ZERO,
9185 .block_erasers =
9186 {
9187 {
9188 .eraseblocks = { {4 * 1024, 16} },
9189 .block_erase = spi_block_erase_20,
9190 }, {
9191 .eraseblocks = { {4 * 1024, 16} },
9192 .block_erase = spi_block_erase_d7,
9193 }, {
9194 .eraseblocks = { {32 * 1024, 2} },
9195 .block_erase = spi_block_erase_d8,
9196 }, {
9197 .eraseblocks = { {64 * 1024, 1} },
9198 .block_erase = spi_block_erase_60,
9199 }, {
9200 .eraseblocks = { {64 * 1024, 1} },
9201 .block_erase = spi_block_erase_c7,
9202 }
9203 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009204 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009205 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9206 .write = spi_chip_write_256,
9207 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9208 .voltage = {2300, 3600},
9209 },
9210
9211 {
9212 .vendor = "PMC",
9213 .name = "Pm25LD010(C)",
9214 .bustype = BUS_SPI,
9215 .manufacture_id = PMC_ID,
9216 .model_id = PMC_PM25LD010,
9217 .total_size = 128,
9218 .page_size = 256,
9219 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009220 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +00009221 .probe = probe_spi_rdid,
9222 .probe_timing = TIMING_ZERO,
9223 .block_erasers =
9224 {
9225 {
9226 .eraseblocks = { {4 * 1024, 32} },
9227 .block_erase = spi_block_erase_20,
9228 }, {
9229 .eraseblocks = { {4 * 1024, 32} },
9230 .block_erase = spi_block_erase_d7,
9231 }, {
9232 .eraseblocks = { {32 * 1024, 4} },
9233 .block_erase = spi_block_erase_d8,
9234 }, {
9235 .eraseblocks = { {128 * 1024, 1} },
9236 .block_erase = spi_block_erase_60,
9237 }, {
9238 .eraseblocks = { {128 * 1024, 1} },
9239 .block_erase = spi_block_erase_c7,
9240 }
9241 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009242 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009243 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9244 .write = spi_chip_write_256,
9245 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9246 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
9247 },
9248
9249 {
9250 .vendor = "PMC",
9251 .name = "Pm25LD020(C)",
9252 .bustype = BUS_SPI,
9253 .manufacture_id = PMC_ID,
9254 .model_id = PMC_PM25LD020,
9255 .total_size = 256,
9256 .page_size = 256,
9257 .feature_bits = FEATURE_WRSR_WREN,
9258 .tested = TEST_UNTESTED,
9259 .probe = probe_spi_rdid,
9260 .probe_timing = TIMING_ZERO,
9261 .block_erasers =
9262 {
9263 {
9264 .eraseblocks = { {4 * 1024, 64} },
9265 .block_erase = spi_block_erase_20,
9266 }, {
9267 .eraseblocks = { {4 * 1024, 64} },
9268 .block_erase = spi_block_erase_d7,
9269 }, {
9270 .eraseblocks = { {64 * 1024, 4} },
9271 .block_erase = spi_block_erase_d8,
9272 }, {
9273 .eraseblocks = { {256 * 1024, 1} },
9274 .block_erase = spi_block_erase_60,
9275 }, {
9276 .eraseblocks = { {256 * 1024, 1} },
9277 .block_erase = spi_block_erase_c7,
9278 }
9279 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009280 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009281 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
9282 .write = spi_chip_write_256,
9283 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9284 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
9285 },
9286
9287 {
9288 .vendor = "PMC",
9289 .name = "Pm25LD040(C)",
9290 .bustype = BUS_SPI,
9291 .manufacture_id = PMC_ID,
9292 .model_id = PMC_PM25LV040,
9293 .total_size = 512,
9294 .page_size = 256,
9295 .feature_bits = FEATURE_WRSR_WREN,
9296 .tested = TEST_UNTESTED,
9297 .probe = probe_spi_rdid,
9298 .probe_timing = TIMING_ZERO,
9299 .block_erasers =
9300 {
9301 {
9302 .eraseblocks = { {4 * 1024, 128} },
9303 .block_erase = spi_block_erase_20,
9304 }, {
9305 .eraseblocks = { {4 * 1024, 128} },
9306 .block_erase = spi_block_erase_d7,
9307 }, {
9308 .eraseblocks = { {64 * 1024, 8} },
9309 .block_erase = spi_block_erase_d8,
9310 }, {
9311 .eraseblocks = { {512 * 1024, 1} },
9312 .block_erase = spi_block_erase_60,
9313 }, {
9314 .eraseblocks = { {512 * 1024, 1} },
9315 .block_erase = spi_block_erase_c7,
9316 }
9317 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009318 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +00009319 .unlock = spi_disable_blockprotect,
9320 .write = spi_chip_write_256,
9321 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
9322 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
9323 },
9324
9325{
9326 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009327 .name = "Pm25LV512(A)",
9328 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00009329 .manufacture_id = PMC_ID_NOPREFIX,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009330 .model_id = PMC_PM25LV512,
9331 .total_size = 64,
9332 .page_size = 256,
9333 .feature_bits = FEATURE_WRSR_WREN,
9334 .tested = TEST_UNTESTED,
Stefan Taunerbecda742014-05-30 19:34:00 +00009335 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009336 .probe_timing = TIMING_ZERO,
9337 .block_erasers =
9338 {
9339 {
9340 .eraseblocks = { {4 * 1024, 16} },
9341 .block_erase = spi_block_erase_d7,
9342 }, {
9343 .eraseblocks = { {32 * 1024, 2} },
9344 .block_erase = spi_block_erase_d8,
9345 }, {
9346 .eraseblocks = { {64 * 1024, 1} },
9347 .block_erase = spi_block_erase_c7,
9348 }
9349 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009350 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009351 .unlock = spi_disable_blockprotect,
9352 .write = spi_chip_write_256,
9353 .read = spi_chip_read, /* Fast read (0x0B) supported */
9354 .voltage = {2700, 3600},
9355 },
9356
9357 {
9358 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009359 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009360 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +00009361 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009362 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009363 .total_size = 128,
9364 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009365 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +00009366 .tested = TEST_OK_PREW,
9367 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009368 .probe_timing = TIMING_ZERO,
9369 .block_erasers =
9370 {
9371 {
9372 .eraseblocks = { {4 * 1024, 32} },
9373 .block_erase = spi_block_erase_d7,
9374 }, {
9375 .eraseblocks = { {32 * 1024, 4} },
9376 .block_erase = spi_block_erase_d8,
9377 }, {
9378 .eraseblocks = { {128 * 1024, 1} },
9379 .block_erase = spi_block_erase_c7,
9380 }
9381 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009382 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009383 .unlock = spi_disable_blockprotect,
9384 .write = spi_chip_write_256,
9385 .read = spi_chip_read, /* Fast read (0x0B) supported */
9386 .voltage = {2700, 3600},
9387 },
9388
9389 {
9390 .vendor = "PMC",
9391 .name = "Pm25LV010A",
9392 .bustype = BUS_SPI,
9393 .manufacture_id = PMC_ID,
9394 .model_id = PMC_PM25LV010,
9395 .total_size = 128,
9396 .page_size = 256,
9397 .feature_bits = FEATURE_WRSR_WREN,
9398 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009399 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009400 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009401 .block_erasers =
9402 {
9403 {
9404 .eraseblocks = { {4 * 1024, 32} },
9405 .block_erase = spi_block_erase_d7,
9406 }, {
9407 .eraseblocks = { {32 * 1024, 4} },
9408 .block_erase = spi_block_erase_d8,
9409 }, {
9410 .eraseblocks = { {128 * 1024, 1} },
9411 .block_erase = spi_block_erase_c7,
9412 }
9413 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009414 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009415 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009416 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009417 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00009418 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009419 },
9420
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009421 {
9422 .vendor = "PMC",
9423 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009424 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009425 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009426 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009427 .total_size = 256,
9428 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009429 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009430 .tested = TEST_UNTESTED,
9431 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009432 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009433 .block_erasers =
9434 {
9435 {
9436 .eraseblocks = { {4 * 1024, 64} },
9437 .block_erase = spi_block_erase_d7,
9438 }, {
9439 .eraseblocks = { {64 * 1024, 4} },
9440 .block_erase = spi_block_erase_d8,
9441 }, {
9442 .eraseblocks = { {256 * 1024, 1} },
9443 .block_erase = spi_block_erase_c7,
9444 }
9445 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009446 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009447 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009448 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009449 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009450 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009451 },
9452
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009453 {
9454 .vendor = "PMC",
9455 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009456 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009457 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009458 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009459 .total_size = 512,
9460 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009461 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +00009462 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009463 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009464 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009465 .block_erasers =
9466 {
9467 {
9468 .eraseblocks = { {4 * 1024, 128} },
9469 .block_erase = spi_block_erase_d7,
9470 }, {
9471 .eraseblocks = { {64 * 1024, 8} },
9472 .block_erase = spi_block_erase_d8,
9473 }, {
9474 .eraseblocks = { {512 * 1024, 1} },
9475 .block_erase = spi_block_erase_c7,
9476 }
9477 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009478 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009479 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009480 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009481 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009482 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009483 },
9484
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009485 {
9486 .vendor = "PMC",
9487 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009488 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009489 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009490 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009491 .total_size = 1024,
9492 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009493 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009494 .tested = TEST_UNTESTED,
9495 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009496 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009497 .block_erasers =
9498 {
9499 {
9500 .eraseblocks = { {4 * 1024, 256} },
9501 .block_erase = spi_block_erase_d7,
9502 }, {
9503 .eraseblocks = { {4 * 1024, 256} },
9504 .block_erase = spi_block_erase_20,
9505 }, {
9506 .eraseblocks = { {64 * 1024, 16} },
9507 .block_erase = spi_block_erase_d8,
9508 }, {
9509 .eraseblocks = { {1024 * 1024, 1} },
9510 .block_erase = spi_block_erase_60,
9511 }, {
9512 .eraseblocks = { {1024 * 1024, 1} },
9513 .block_erase = spi_block_erase_c7,
9514 }
9515 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009516 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009517 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009518 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009519 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009520 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009521 },
9522
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009523 {
9524 .vendor = "PMC",
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009525 .name = "Pm25LV016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009526 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009527 .manufacture_id = PMC_ID,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009528 .model_id = PMC_PM25LV016B,
9529 .total_size = 2048,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009530 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00009531 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009532 .tested = TEST_UNTESTED,
9533 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009534 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009535 .block_erasers =
9536 {
9537 {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009538 .eraseblocks = { {4 * 1024, 512} },
Sean Nelson5643c072010-01-19 03:23:07 +00009539 .block_erase = spi_block_erase_d7,
9540 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009541 .eraseblocks = { {4 * 1024, 512} },
9542 .block_erase = spi_block_erase_20,
9543 }, {
9544 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson5643c072010-01-19 03:23:07 +00009545 .block_erase = spi_block_erase_d8,
9546 }, {
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009547 .eraseblocks = { {2 * 1024 * 1024, 1} },
9548 .block_erase = spi_block_erase_60,
9549 }, {
9550 .eraseblocks = { {2 * 1024 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00009551 .block_erase = spi_block_erase_c7,
9552 }
9553 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009554 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009555 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009556 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +00009557 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00009558 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009559 },
9560
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009561 {
9562 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009563 .name = "Pm29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009564 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009565 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009566 .model_id = PMC_PM29F002T,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009567 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009568 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009569 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009570 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009571 .probe = probe_jedec,
Stefan Tauneraf2db612011-12-02 21:48:17 +00009572 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009573 .block_erasers =
9574 {
9575 {
9576 .eraseblocks = {
9577 {128 * 1024, 1},
9578 {96 * 1024, 1},
9579 {8 * 1024, 2},
9580 {16 * 1024, 1},
9581 },
Sean Nelson35727f72010-01-28 23:55:12 +00009582 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009583 }, {
9584 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009585 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009586 },
9587 },
Sean Nelson35727f72010-01-28 23:55:12 +00009588 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009589 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009590 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009591 },
9592
9593 {
9594 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +00009595 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009596 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009597 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009598 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009599 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +00009600 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009601 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009602 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009603 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +00009604 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +00009605 .block_erasers =
9606 {
9607 {
9608 .eraseblocks = {
9609 {16 * 1024, 1},
9610 {8 * 1024, 2},
9611 {96 * 1024, 1},
9612 {128 * 1024, 1},
9613 },
Sean Nelson35727f72010-01-28 23:55:12 +00009614 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009615 }, {
9616 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009617 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +00009618 },
9619 },
Sean Nelson35727f72010-01-28 23:55:12 +00009620 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009621 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009622 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +00009623 },
9624
9625 {
9626 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009627 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009628 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009629 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009630 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009631 .total_size = 128,
9632 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +00009633 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009634 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009635 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009636 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +00009637 .block_erasers =
9638 {
9639 {
9640 .eraseblocks = { {4 * 1024, 32} },
9641 .block_erase = erase_sector_jedec,
9642 }, {
9643 .eraseblocks = { {64 * 1024, 2} },
9644 .block_erase = erase_block_jedec,
9645 }, {
9646 .eraseblocks = { {128 * 1024, 1} },
9647 .block_erase = erase_chip_block_jedec,
9648 }
9649 },
Sean Nelson35727f72010-01-28 23:55:12 +00009650 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009651 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009652 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +00009653 },
9654
9655 {
9656 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009657 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009658 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009659 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009660 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009661 .total_size = 256,
9662 .page_size = 4096,
9663 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
9664 .tested = TEST_UNTESTED,
9665 .probe = probe_jedec,
9666 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9667 .block_erasers =
9668 {
9669 {
9670 .eraseblocks = { {4 * 1024, 64} },
9671 .block_erase = erase_sector_jedec,
9672 }, {
9673 .eraseblocks = { {64 * 1024, 4} },
9674 .block_erase = erase_block_jedec,
9675 }, {
9676 .eraseblocks = { {256 * 1024, 1} },
9677 .block_erase = erase_chip_block_jedec,
9678 }
9679 },
9680 .write = write_jedec_1,
9681 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009682 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009683 },
9684
9685 {
9686 .vendor = "PMC",
9687 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009688 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009689 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009690 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009691 .total_size = 512,
9692 .page_size = 4096,
9693 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009694 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009695 .probe = probe_jedec,
9696 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9697 .block_erasers =
9698 {
9699 {
9700 .eraseblocks = { {4 * 1024, 128} },
9701 .block_erase = erase_sector_jedec,
9702 }, {
9703 .eraseblocks = { {64 * 1024, 8} },
9704 .block_erase = erase_block_jedec,
9705 }, {
9706 .eraseblocks = { {512 * 1024, 1} },
9707 .block_erase = erase_chip_block_jedec,
9708 }
9709 },
9710 .write = write_jedec_1,
9711 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009712 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009713 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +00009714
9715 {
9716 .vendor = "PMC",
9717 .name = "Pm39LV512",
9718 .bustype = BUS_PARALLEL,
9719 .manufacture_id = PMC_ID_NOPREFIX,
9720 .model_id = PMC_PM39LV512,
9721 .total_size = 64,
9722 .page_size = 4096,
9723 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
9724 .tested = TEST_OK_PREW,
9725 .probe = probe_jedec,
9726 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9727 .block_erasers =
9728 {
9729 {
9730 .eraseblocks = { {4 * 1024, 16} },
9731 .block_erase = erase_sector_jedec,
9732 }, {
9733 .eraseblocks = { {64 * 1024, 1} },
9734 .block_erase = erase_block_jedec,
9735 }, {
9736 .eraseblocks = { {64 * 1024, 1} },
9737 .block_erase = erase_chip_block_jedec,
9738 }
9739 },
9740 .write = write_jedec_1,
9741 .read = read_memmapped,
9742 .voltage = {2700, 3600},
9743 },
9744
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +00009745 {
9746 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009747 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009748 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009749 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009750 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009751 .total_size = 256,
9752 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009753 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009754 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00009755 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009756 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00009757 .block_erasers =
9758 {
9759 {
9760 .eraseblocks = { {4 * 1024, 64} },
9761 .block_erase = erase_sector_jedec,
9762 }, {
9763 .eraseblocks = { {16 * 1024, 16} },
9764 .block_erase = erase_block_jedec,
9765 }, {
9766 .eraseblocks = { {256 * 1024, 1} },
9767 .block_erase = erase_chip_block_jedec,
9768 }
9769 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009770 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +00009771 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009772 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009773 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009774 },
9775
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009776 {
9777 .vendor = "PMC",
9778 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009779 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009780 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009781 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009782 .total_size = 512,
9783 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009784 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009785 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +00009786 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00009787 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +00009788 .block_erasers =
9789 {
9790 {
9791 .eraseblocks = { {4 * 1024, 128} },
9792 .block_erase = erase_sector_jedec,
9793 }, {
9794 .eraseblocks = { {64 * 1024, 8} },
9795 .block_erase = erase_block_jedec,
9796 }, {
9797 .eraseblocks = { {512 * 1024, 1} },
9798 .block_erase = erase_chip_block_jedec,
9799 }
9800 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00009801 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +00009802 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009803 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009804 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009805 },
9806
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009807 {
Sean Nelsond70b09c2009-11-24 02:11:08 +00009808 .vendor = "Sanyo",
Stefan Taunera60d4082014-06-04 16:17:03 +00009809 .name = "LE25FW106",
9810 .bustype = BUS_SPI,
9811 .manufacture_id = SANYO_ID,
9812 .model_id = SANYO_LE25FW106,
9813 .total_size = 128,
9814 .page_size = 256,
9815 .feature_bits = FEATURE_WRSR_WREN,
9816 .tested = TEST_OK_PREW,
9817 .probe = probe_spi_res2,
9818 .probe_timing = TIMING_ZERO,
9819 .block_erasers = {
9820 {
9821 .eraseblocks = { {2 * 1024, 64} },
9822 .block_erase = spi_block_erase_d7,
9823 }, {
9824 .eraseblocks = { {32 * 1024, 4} },
9825 .block_erase = spi_block_erase_d8,
9826 }, {
9827 .eraseblocks = { {128 * 1024, 1} },
9828 .block_erase = spi_block_erase_c7,
9829 }
9830 },
9831 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
9832 .unlock = spi_disable_blockprotect_bp1_srwd,
9833 .write = spi_chip_write_256,
9834 .read = spi_chip_read,
9835 .voltage = {2700, 3600},
9836 },
9837
9838 {
9839 .vendor = "Sanyo",
Stefan Tauner33491b82014-05-18 21:36:04 +00009840 .name = "LE25FW406A",
9841 .bustype = BUS_SPI,
9842 .manufacture_id = SANYO_ID,
9843 .model_id = SANYO_LE25FW406A,
9844 .total_size = 512,
9845 .page_size = 256,
9846 .feature_bits = FEATURE_WRSR_WREN,
9847 .tested = TEST_OK_PREW,
9848 .probe = probe_spi_res2,
9849 .probe_timing = TIMING_ZERO,
9850 .block_erasers = {
9851 {
9852 .eraseblocks = { {4 * 1024, 128} },
9853 .block_erase = spi_block_erase_d7,
9854 }, {
9855 .eraseblocks = { {64 * 1024, 8} },
9856 .block_erase = spi_block_erase_d8,
9857 }, {
9858 .eraseblocks = { {512 * 1024, 1} },
9859 .block_erase = spi_block_erase_c7,
9860 }
9861 },
9862 .printlock = spi_prettyprint_status_register_plain,
9863 .unlock = spi_disable_blockprotect,
9864 .write = spi_chip_write_256,
9865 .read = spi_chip_read,
9866 .voltage = {2700, 3600},
9867 },
9868
9869 {
9870 .vendor = "Sanyo",
Jurij Mundaa1e53742014-05-14 13:19:50 +00009871 .name = "LE25FU406B",
9872 .bustype = BUS_SPI,
9873 .manufacture_id = SANYO_ID,
9874 .model_id = SANYO_LE25FU406B,
9875 .total_size = 512,
9876 .page_size = 256,
9877 .feature_bits = FEATURE_WRSR_WREN,
9878 .tested = TEST_OK_PREW,
9879 .probe = probe_spi_res2,
9880 .probe_timing = TIMING_ZERO,
9881 .block_erasers = {
9882 {
9883 .eraseblocks = { {4 * 1024, 128} },
9884 .block_erase = spi_block_erase_d7,
9885 }, {
9886 .eraseblocks = { {64 * 1024, 8} },
9887 .block_erase = spi_block_erase_d8,
9888 }, {
9889 .eraseblocks = { {512 * 1024, 1} },
9890 .block_erase = spi_block_erase_c7,
9891 }
9892 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009893 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jurij Mundaa1e53742014-05-14 13:19:50 +00009894 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9895 .write = spi_chip_write_256,
9896 .read = spi_chip_read,
9897 .voltage = {2300, 3600},
9898 },
9899
9900 {
9901 .vendor = "Sanyo",
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009902 .name = "LE25FW203A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009903 .bustype = BUS_SPI,
Sean Nelsond70b09c2009-11-24 02:11:08 +00009904 .manufacture_id = SANYO_ID,
9905 .model_id = SANYO_LE25FW203A,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009906 .total_size = 256,
Sean Nelsond70b09c2009-11-24 02:11:08 +00009907 .page_size = 256,
9908 .tested = TEST_UNTESTED,
9909 .probe = probe_spi_rdid,
9910 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +00009911 .block_erasers =
9912 {
9913 {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009914 .eraseblocks = { {256, 1024} },
9915 .block_erase = spi_block_erase_db,
9916 }, {
9917 .eraseblocks = { {64 * 1024, 4} },
Sean Nelson5643c072010-01-19 03:23:07 +00009918 .block_erase = spi_block_erase_d8,
9919 }, {
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009920 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +00009921 .block_erase = spi_block_erase_c7,
9922 }
9923 },
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009924 .printlock = spi_prettyprint_status_register_default_welwip,
9925 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Sean Nelsond70b09c2009-11-24 02:11:08 +00009926 .write = spi_chip_write_256,
9927 .read = spi_chip_read,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009928 .voltage = {2700, 3600},
9929 },
9930
9931 {
9932 .vendor = "Sanyo",
9933 .name = "LE25FW403A",
9934 .bustype = BUS_SPI,
9935 .manufacture_id = SANYO_ID,
9936 .model_id = SANYO_LE25FW403A,
9937 .total_size = 512,
9938 .page_size = 256,
9939 .tested = TEST_UNTESTED,
9940 .probe = probe_spi_rdid,
9941 .probe_timing = TIMING_ZERO,
9942 .block_erasers = {
9943 {
9944 .eraseblocks = { {256, 2 * 1024} },
9945 .block_erase = spi_block_erase_db,
9946 }, {
9947 .eraseblocks = { {64 * 1024, 8} },
9948 .block_erase = spi_block_erase_d8,
9949 }, {
9950 .eraseblocks = { {512 * 1024, 1} },
9951 .block_erase = spi_block_erase_c7,
9952 }
9953 },
9954 .printlock = spi_prettyprint_status_register_default_welwip,
9955 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
9956 .write = spi_chip_write_256,
9957 .read = spi_chip_read,
9958 .voltage = {2700, 3600},
9959 },
9960
9961 {
9962 .vendor = "Sanyo",
9963 .name = "LE25FW418A",
9964 .bustype = BUS_SPI,
9965 .manufacture_id = SANYO_ID,
9966 .model_id = SANYO_LE25FW418A,
9967 .total_size = 512,
9968 .page_size = 256,
9969 .feature_bits = FEATURE_WRSR_WREN,
9970 .tested = TEST_UNTESTED,
9971 .probe = probe_spi_res2,
9972 .probe_timing = TIMING_ZERO,
9973 .block_erasers = {
9974 {
9975 .eraseblocks = { {4 * 1024, 128} },
9976 .block_erase = spi_block_erase_d7,
9977 }, {
9978 .eraseblocks = { {64 * 1024, 8} },
9979 .block_erase = spi_block_erase_d8,
9980 }, {
9981 .eraseblocks = { {512 * 1024, 1} },
9982 .block_erase = spi_block_erase_c7,
9983 }
9984 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009985 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +00009986 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
9987 .write = spi_chip_write_256,
9988 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
9989 .voltage = {2700, 3600},
9990 },
9991
9992 {
9993 .vendor = "Sanyo",
9994 .name = "LE25FW806",
9995 .bustype = BUS_SPI,
9996 .manufacture_id = SANYO_ID,
9997 .model_id = SANYO_LE25FW806,
9998 .total_size = 1024,
9999 .page_size = 256,
10000 .feature_bits = FEATURE_WRSR_WREN,
10001 .tested = TEST_UNTESTED,
10002 .probe = probe_spi_res2,
10003 .probe_timing = TIMING_ZERO,
10004 .block_erasers = {
10005 {
10006 .eraseblocks = { {4 * 1024, 256} },
10007 .block_erase = spi_block_erase_20,
10008 }, {
10009 .eraseblocks = { {4 * 1024, 256} },
10010 .block_erase = spi_block_erase_d7,
10011 }, {
10012 .eraseblocks = { {64 * 1024, 16} },
10013 .block_erase = spi_block_erase_d8,
10014 }, {
10015 .eraseblocks = { {1024 * 1024, 1} },
10016 .block_erase = spi_block_erase_c7,
10017 }
10018 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010019 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010020 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10021 .write = spi_chip_write_256,
10022 .read = spi_chip_read,
10023 .voltage = {2700, 3600},
10024 },
10025
10026 {
10027 .vendor = "Sanyo",
10028 .name = "LE25FW808",
10029 .bustype = BUS_SPI,
10030 .manufacture_id = SANYO_ID,
10031 .model_id = SANYO_LE25FW808,
10032 .total_size = 1024,
10033 .page_size = 256,
10034 .feature_bits = FEATURE_WRSR_WREN,
10035 .tested = TEST_UNTESTED,
10036 .probe = probe_spi_res2,
10037 .probe_timing = TIMING_ZERO,
10038 .block_erasers = {
10039 {
10040 .eraseblocks = { {8 * 1024, 128} },
10041 .block_erase = spi_block_erase_d7,
10042 }, {
10043 .eraseblocks = { {64 * 1024, 16} },
10044 .block_erase = spi_block_erase_d8,
10045 }, {
10046 .eraseblocks = { {1024 * 1024, 1} },
10047 .block_erase = spi_block_erase_c7,
10048 }
10049 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010050 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaev384de8e2013-06-28 21:28:49 +000010051 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
10052 .write = spi_chip_write_256,
10053 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
10054 .voltage = {2700, 3600},
Sean Nelsond70b09c2009-11-24 02:11:08 +000010055 },
10056
10057 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010058 .vendor = "Sharp",
Mattias Mattssonfca3b012011-08-25 22:44:11 +000010059 .name = "LH28F008BJT-BTLZ1",
10060 .bustype = BUS_PARALLEL,
10061 .manufacture_id = SHARP_ID,
Stefan Tauner352e50b2013-02-22 15:58:45 +000010062 .model_id = SHARP_LH28F008BJ__PB,
Mattias Mattssonfca3b012011-08-25 22:44:11 +000010063 .total_size = 1024,
10064 .page_size = 64 * 1024,
10065 .tested = TEST_OK_PREW,
10066 .probe = probe_82802ab,
10067 .probe_timing = TIMING_ZERO,
10068 .block_erasers =
10069 {
10070 {
10071 .eraseblocks = {
10072 {8 * 1024, 8},
10073 {64 * 1024, 15}
10074 },
10075 .block_erase = erase_block_82802ab,
10076 }, {
10077 .eraseblocks = { {1024 * 1024, 1} },
10078 .block_erase = erase_sector_49lfxxxc,
10079 }
10080 },
10081 .unlock = unlock_lh28f008bjt,
10082 .write = write_82802ab,
10083 .read = read_memmapped,
10084 .voltage = {2700, 3600},
10085 },
10086
10087 {
10088 .vendor = "Sharp",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010089 .name = "LHF00L04",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010090 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010091 .manufacture_id = SHARP_ID,
10092 .model_id = SHARP_LHF00L04,
10093 .total_size = 1024,
10094 .page_size = 64 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010095 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010096 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000010097 .probe = probe_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010098 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010099 .block_erasers =
10100 {
10101 {
10102 .eraseblocks = {
10103 {64 * 1024, 15},
10104 {8 * 1024, 8}
10105 },
Sean Nelson28accc22010-03-19 18:47:06 +000010106 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010107 }, {
10108 .eraseblocks = {
10109 {1024 * 1024, 1}
10110 },
Sean Nelson51c83fb2010-01-20 20:55:53 +000010111 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
Carl-Daniel Hailfingeraca1dce2010-01-07 21:23:45 +000010112 },
10113 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000010114 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000010115 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010116 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010117 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010118 },
10119
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010120 {
10121 .vendor = "Spansion",
Rudy Hostf4e57772010-11-29 00:37:49 +000010122 .name = "S25FL004A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010123 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010124 .manufacture_id = SPANSION_ID,
10125 .model_id = SPANSION_S25FL004A,
10126 .total_size = 512,
10127 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010128 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000010129 .tested = TEST_UNTESTED,
10130 .probe = probe_spi_rdid,
10131 .probe_timing = TIMING_ZERO,
10132 .block_erasers =
10133 {
10134 {
10135 .eraseblocks = { {64 * 1024, 8} },
10136 .block_erase = spi_block_erase_d8,
10137 }, {
10138 .eraseblocks = { {512 * 1024, 1} },
10139 .block_erase = spi_block_erase_c7,
10140 }
10141 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010142 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010143 .unlock = spi_disable_blockprotect,
10144 .write = spi_chip_write_256,
10145 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010146 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010147 },
10148
10149 {
10150 .vendor = "Spansion",
Michael Karcher23ff4602010-01-12 23:29:30 +000010151 .name = "S25FL008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010152 .bustype = BUS_SPI,
Michael Karcher23ff4602010-01-12 23:29:30 +000010153 .manufacture_id = SPANSION_ID,
10154 .model_id = SPANSION_S25FL008A,
10155 .total_size = 1024,
10156 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010157 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010158 .tested = TEST_OK_PRE,
Michael Karcher23ff4602010-01-12 23:29:30 +000010159 .probe = probe_spi_rdid,
10160 .probe_timing = TIMING_ZERO,
Michael Karcher23ff4602010-01-12 23:29:30 +000010161 .block_erasers =
10162 {
10163 {
10164 .eraseblocks = { {64 * 1024, 16} },
10165 .block_erase = spi_block_erase_d8,
10166 }, {
10167 .eraseblocks = { {1024 * 1024, 1} },
10168 .block_erase = spi_block_erase_c7,
10169 }
10170 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010171 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010172 .unlock = spi_disable_blockprotect,
Michael Karcher23ff4602010-01-12 23:29:30 +000010173 .write = spi_chip_write_256,
10174 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010175 .voltage = {2700, 3600},
Michael Karcher23ff4602010-01-12 23:29:30 +000010176 },
10177
10178 {
10179 .vendor = "Spansion",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010180 .name = "S25FL016A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010181 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010182 .manufacture_id = SPANSION_ID,
10183 .model_id = SPANSION_S25FL016A,
10184 .total_size = 2048,
10185 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010186 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000010187 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010188 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000010189 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000010190 .block_erasers =
10191 {
10192 {
10193 .eraseblocks = { {64 * 1024, 32} },
10194 .block_erase = spi_block_erase_d8,
10195 }, {
10196 .eraseblocks = { {2 * 1024 * 1024, 1} },
10197 .block_erase = spi_block_erase_c7,
10198 }
10199 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010200 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000010201 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000010202 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010203 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010204 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000010205 },
10206
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010207 {
Rudy Hostf4e57772010-11-29 00:37:49 +000010208 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010209 .name = "S25FL032A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010210 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010211 .manufacture_id = SPANSION_ID,
10212 .model_id = SPANSION_S25FL032A,
10213 .total_size = 4096,
10214 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010215 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010216 .tested = TEST_OK_PREW,
Rudy Hostf4e57772010-11-29 00:37:49 +000010217 .probe = probe_spi_rdid,
10218 .probe_timing = TIMING_ZERO,
10219 .block_erasers =
10220 {
10221 {
10222 .eraseblocks = { {64 * 1024, 64} },
10223 .block_erase = spi_block_erase_d8,
10224 }, {
10225 .eraseblocks = { {4 * 1024 * 1024, 1} },
10226 .block_erase = spi_block_erase_c7,
10227 }
10228 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010229 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010230 .unlock = spi_disable_blockprotect,
10231 .write = spi_chip_write_256,
10232 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010233 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010234 },
10235
10236 {
10237 .vendor = "Spansion",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010238 .name = "S25FL064A/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010239 .bustype = BUS_SPI,
Rudy Hostf4e57772010-11-29 00:37:49 +000010240 .manufacture_id = SPANSION_ID,
10241 .model_id = SPANSION_S25FL064A,
10242 .total_size = 8192,
10243 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010244 .feature_bits = FEATURE_WRSR_WREN,
Rudy Hostf4e57772010-11-29 00:37:49 +000010245 .tested = TEST_OK_PREW,
10246 .probe = probe_spi_rdid,
10247 .probe_timing = TIMING_ZERO,
10248 .block_erasers =
10249 {
10250 {
10251 .eraseblocks = { {64 * 1024, 128} },
10252 .block_erase = spi_block_erase_d8,
10253 }, {
10254 .eraseblocks = { {8 * 1024 * 1024, 1} },
10255 .block_erase = spi_block_erase_c7,
10256 }
10257 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010258 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Rudy Hostf4e57772010-11-29 00:37:49 +000010259 .unlock = spi_disable_blockprotect,
10260 .write = spi_chip_write_256,
10261 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010262 .voltage = {2700, 3600},
Rudy Hostf4e57772010-11-29 00:37:49 +000010263 },
10264
10265 {
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010266 .vendor = "Spansion",
10267 .name = "S25FL204K",
10268 .bustype = BUS_SPI,
10269 .manufacture_id = SPANSION_ID,
10270 .model_id = SPANSION_S25FL204,
10271 .total_size = 512,
10272 .page_size = 256,
10273 .feature_bits = FEATURE_WRSR_WREN,
10274 .tested = TEST_UNTESTED,
10275 .probe = probe_spi_rdid,
10276 .probe_timing = TIMING_ZERO,
10277 .block_erasers = {
10278 {
10279 .eraseblocks = { {4 * 1024, 128} },
10280 .block_erase = spi_block_erase_20,
10281 }, {
10282 .eraseblocks = { {64 * 1024, 8} },
10283 .block_erase = spi_block_erase_d8,
10284 }, {
10285 .eraseblocks = { { 512 * 1024, 1} },
10286 .block_erase = spi_block_erase_60,
10287 }, {
10288 .eraseblocks = { { 512 * 1024, 1} },
10289 .block_erase = spi_block_erase_c7,
10290 }
10291 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010292 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010293 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010294 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010295 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010296 .voltage = {2700, 3600},
10297 },
10298
10299 {
10300 .vendor = "Spansion",
10301 .name = "S25FL208K",
10302 .bustype = BUS_SPI,
10303 .manufacture_id = SPANSION_ID,
10304 .model_id = SPANSION_S25FL208,
10305 .total_size = 1024,
10306 .page_size = 256,
10307 .feature_bits = FEATURE_WRSR_WREN,
10308 .tested = TEST_UNTESTED,
10309 .probe = probe_spi_rdid,
10310 .probe_timing = TIMING_ZERO,
10311 .block_erasers = {
10312 {
10313 .eraseblocks = { {4 * 1024, 256} },
10314 .block_erase = spi_block_erase_20,
10315 }, {
10316 .eraseblocks = { {64 * 1024, 16} },
10317 .block_erase = spi_block_erase_d8,
10318 }, {
10319 .eraseblocks = { { 1024 * 1024, 1} },
10320 .block_erase = spi_block_erase_60,
10321 }, {
10322 .eraseblocks = { { 1024 * 1024, 1} },
10323 .block_erase = spi_block_erase_c7,
10324 }
10325 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010326 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010327 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010328 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010329 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010330 .voltage = {2700, 3600},
10331 },
10332
10333 {
10334 .vendor = "Spansion",
Stefan Tauner6697f712014-08-06 15:09:15 +000010335 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010336 .bustype = BUS_SPI,
10337 .manufacture_id = SPANSION_ID,
10338 .model_id = SPANSION_S25FL216,
10339 .total_size = 2048,
10340 .page_size = 256,
10341 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
10342 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10343 .tested = TEST_UNTESTED,
10344 .probe = probe_spi_rdid,
10345 .probe_timing = TIMING_ZERO,
10346 .block_erasers = {
10347 {
10348 .eraseblocks = { {4 * 1024, 512} },
10349 .block_erase = spi_block_erase_20,
10350 }, {
10351 .eraseblocks = { {64 * 1024, 32} },
10352 .block_erase = spi_block_erase_d8,
10353 }, {
10354 .eraseblocks = { { 2048 * 1024, 1} },
10355 .block_erase = spi_block_erase_60,
10356 }, {
10357 .eraseblocks = { { 2048 * 1024, 1} },
10358 .block_erase = spi_block_erase_c7,
10359 }
10360 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010361 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner6697f712014-08-06 15:09:15 +000010362 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010363 .write = spi_chip_write_256,
Stefan Tauner6697f712014-08-06 15:09:15 +000010364 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Nikolay Nikolaev0ec2f7e2013-06-28 21:29:36 +000010365 .voltage = {2700, 3600},
10366 },
10367
10368 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010369 .vendor = "Spansion",
Nikolay Martynov598968a2014-05-04 21:44:13 +000010370 .name = "S25FL132K",
10371 .bustype = BUS_SPI,
10372 .manufacture_id = SPANSION_ID,
10373 .model_id = SPANSION_S25FL132K,
10374 .total_size = 4096,
10375 .page_size = 256,
10376 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
10377 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10378 .tested = TEST_UNTESTED,
10379 .probe = probe_spi_rdid,
10380 .probe_timing = TIMING_ZERO,
10381 .block_erasers = {
10382 {
10383 .eraseblocks = { {4 * 1024, 1024} },
10384 .block_erase = spi_block_erase_20,
10385 }, {
10386 .eraseblocks = { {64 * 1024, 64} },
10387 .block_erase = spi_block_erase_d8,
10388 }, {
10389 .eraseblocks = { { 4096 * 1024, 1} },
10390 .block_erase = spi_block_erase_60,
10391 }, {
10392 .eraseblocks = { { 4096 * 1024, 1} },
10393 .block_erase = spi_block_erase_c7,
10394 }
10395 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010396 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000010397 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10398 .write = spi_chip_write_256,
10399 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10400 .voltage = {2700, 3600},
10401 },
10402
10403 {
10404 .vendor = "Spansion",
10405 .name = "S25FL164K",
10406 .bustype = BUS_SPI,
10407 .manufacture_id = SPANSION_ID,
10408 .model_id = SPANSION_S25FL164K,
10409 .total_size = 8192,
10410 .page_size = 256,
10411 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
10412 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10413 .tested = TEST_OK_PREW,
10414 .probe = probe_spi_rdid,
10415 .probe_timing = TIMING_ZERO,
10416 .block_erasers = {
10417 {
10418 .eraseblocks = { {4 * 1024, 2048} },
10419 .block_erase = spi_block_erase_20,
10420 }, {
10421 .eraseblocks = { {64 * 1024, 128} },
10422 .block_erase = spi_block_erase_d8,
10423 }, {
10424 .eraseblocks = { { 8192 * 1024, 1} },
10425 .block_erase = spi_block_erase_60,
10426 }, {
10427 .eraseblocks = { { 8192 * 1024, 1} },
10428 .block_erase = spi_block_erase_c7,
10429 }
10430 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010431 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
Nikolay Martynov598968a2014-05-04 21:44:13 +000010432 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
10433 .write = spi_chip_write_256,
10434 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10435 .voltage = {2700, 3600},
10436 },
10437
10438 {
10439 .vendor = "Spansion",
Stefan Tauner88b19252014-08-06 14:36:27 +000010440 .name = "S25FL128P......0", /* uniform 64 kB sectors */
10441 .bustype = BUS_SPI,
10442 .manufacture_id = SPANSION_ID,
10443 .model_id = SPANSION_S25FL128,
10444 .total_size = 16384,
10445 .page_size = 256,
10446 .feature_bits = FEATURE_WRSR_WREN,
10447 .tested = TEST_UNTESTED,
10448 .probe = probe_spi_rdid,
10449 .probe_timing = TIMING_ZERO,
10450 .block_erasers = {
10451 {
10452 .eraseblocks = { {64 * 1024, 256} },
10453 .block_erase = spi_block_erase_20,
10454 }, {
10455 .eraseblocks = { {64 * 1024, 256} },
10456 .block_erase = spi_block_erase_d8,
10457 }, {
10458 .eraseblocks = { { 16384 * 1024, 1} },
10459 .block_erase = spi_block_erase_60,
10460 }, {
10461 .eraseblocks = { { 16384 * 1024, 1} },
10462 .block_erase = spi_block_erase_c7,
10463 }
10464 },
10465 .printlock = spi_prettyprint_status_register_bp3_srwd,
10466 .unlock = spi_disable_blockprotect_bp3_srwd,
10467 .write = spi_chip_write_256,
10468 .read = spi_chip_read, /* Fast read (0x0B) supported */
10469 .voltage = {2700, 3600},
10470 },
10471
10472 {
10473 .vendor = "Spansion",
10474 .name = "S25FL128P......1", /* uniform 256kB sectors */
10475 .bustype = BUS_SPI,
10476 .manufacture_id = SPANSION_ID,
10477 .model_id = SPANSION_S25FL128,
10478 .total_size = 16384,
10479 .page_size = 256,
10480 .feature_bits = FEATURE_WRSR_WREN,
10481 .tested = TEST_UNTESTED,
10482 .probe = probe_spi_rdid,
10483 .probe_timing = TIMING_ZERO,
10484 .block_erasers = {
10485 {
10486 .eraseblocks = { {256 * 1024, 64} },
10487 .block_erase = spi_block_erase_d8,
10488 }, {
10489 .eraseblocks = { { 16384 * 1024, 1} },
10490 .block_erase = spi_block_erase_c7,
10491 }
10492 },
10493 .printlock = spi_prettyprint_status_register_bp2_srwd,
10494 .unlock = spi_disable_blockprotect_bp2_srwd,
10495 .write = spi_chip_write_256,
10496 .read = spi_chip_read, /* Fast read (0x0B) supported */
10497 .voltage = {2700, 3600},
10498 },
10499
10500 {
10501 .vendor = "Spansion",
10502 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010503 .bustype = BUS_SPI,
10504 .manufacture_id = SPANSION_ID,
10505 .model_id = SPANSION_S25FL128,
10506 .total_size = 16384,
10507 .page_size = 256,
10508 /* supports 4B addressing */
10509 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
10510 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10511 .tested = TEST_UNTESTED,
10512 .probe = probe_spi_rdid,
10513 .probe_timing = TIMING_ZERO,
10514 .block_erasers = {
10515 {
Stefan Tauner88b19252014-08-06 14:36:27 +000010516 /* This chip supports erasing of the 32 so-called "parameter sectors" with
10517 * opcode 0x20. Trying to access an address outside these 4kB blocks does
10518 * have no effect on the memory contents, but sets a flag in the SR.
10519 .eraseblocks = {
10520 {4 * 1024, 32},
10521 {64 * 1024, 254} // inaccessible
10522 },
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010523 .block_erase = spi_block_erase_20,
Stefan Tauner88b19252014-08-06 14:36:27 +000010524 }, { */
10525 .eraseblocks = { { 64 * 1024, 256} },
10526 .block_erase = spi_block_erase_d8,
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010527 }, {
Stefan Tauner88b19252014-08-06 14:36:27 +000010528 .eraseblocks = { { 16384 * 1024, 1} },
10529 .block_erase = spi_block_erase_60,
10530 }, {
10531 .eraseblocks = { { 16384 * 1024, 1} },
10532 .block_erase = spi_block_erase_c7,
10533 }
10534 },
10535 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
10536 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
10537 .write = spi_chip_write_256, /* Multi I/O supported */
10538 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10539 .voltage = {2700, 3600},
10540 },
10541
10542 {
10543 .vendor = "Spansion",
10544 .name = "S25FL128S......1", /* uniform 256 kB sectors */
10545 .bustype = BUS_SPI,
10546 .manufacture_id = SPANSION_ID,
10547 .model_id = SPANSION_S25FL128,
10548 .total_size = 16384,
10549 .page_size = 512,
10550 /* supports 4B addressing */
10551 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
10552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10553 .tested = TEST_UNTESTED,
10554 .probe = probe_spi_rdid,
10555 .probe_timing = TIMING_ZERO,
10556 .block_erasers = {
10557 {
Nikolay Nikolaevc80c4a32013-06-28 21:29:44 +000010558 .eraseblocks = { {256 * 1024, 64} },
10559 .block_erase = spi_block_erase_d8,
10560 }, {
10561 .eraseblocks = { { 16384 * 1024, 1} },
10562 .block_erase = spi_block_erase_60,
10563 }, {
10564 .eraseblocks = { { 16384 * 1024, 1} },
10565 .block_erase = spi_block_erase_c7,
10566 }
10567 },
10568 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
10569 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
10570 .write = spi_chip_write_256, /* Multi I/O supported */
10571 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10572 .voltage = {2700, 3600},
10573 },
10574
10575 {
Stefan Tauner88b19252014-08-06 14:36:27 +000010576 .vendor = "Spansion",
10577 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
10578 .bustype = BUS_SPI,
10579 .manufacture_id = SPANSION_ID,
10580 .model_id = SPANSION_S25FL128,
10581 .total_size = 16384,
10582 .page_size = 256,
10583 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
10584 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10585 .tested = TEST_OK_PREW,
10586 .probe = probe_spi_rdid,
10587 .probe_timing = TIMING_ZERO,
10588 .block_erasers = {
10589 {
10590 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
10591 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
10592 * effect on the memory contents, but sets a flag in the SR.
10593 .eraseblocks = {
10594 {4 * 1024, 32},
10595 {64 * 1024, 254} // inaccessible
10596 },
10597 .block_erase = spi_block_erase_20,
10598 }, { */
10599 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
10600 .eraseblocks = {
10601 {8 * 1024, 16},
10602 {64 * 1024, 254} // inaccessible
10603 },
10604 .block_erase = spi_block_erase_40,
10605 }, { */
10606 .eraseblocks = { { 64 * 1024, 256} },
10607 .block_erase = spi_block_erase_d8,
10608 }, {
10609 .eraseblocks = { { 16384 * 1024, 1} },
10610 .block_erase = spi_block_erase_60,
10611 }, {
10612 .eraseblocks = { { 16384 * 1024, 1} },
10613 .block_erase = spi_block_erase_c7,
10614 }
10615 },
10616 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
10617 .unlock = spi_disable_blockprotect_bp2_srwd,
10618 .write = spi_chip_write_256, /* Multi I/O supported */
10619 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10620 .voltage = {2700, 3600},
10621 },
10622
10623 {
10624 .vendor = "Spansion",
10625 .name = "S25FL129P......1", /* uniform 256 kB sectors */
10626 .bustype = BUS_SPI,
10627 .manufacture_id = SPANSION_ID,
10628 .model_id = SPANSION_S25FL128,
10629 .total_size = 16384,
10630 .page_size = 512,
10631 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
10632 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10633 .tested = TEST_UNTESTED,
10634 .probe = probe_spi_rdid,
10635 .probe_timing = TIMING_ZERO,
10636 .block_erasers = {
10637 {
10638 .eraseblocks = { {256 * 1024, 64} },
10639 .block_erase = spi_block_erase_d8,
10640 }, {
10641 .eraseblocks = { { 16384 * 1024, 1} },
10642 .block_erase = spi_block_erase_60,
10643 }, {
10644 .eraseblocks = { { 16384 * 1024, 1} },
10645 .block_erase = spi_block_erase_c7,
10646 }
10647 },
10648 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
10649 .unlock = spi_disable_blockprotect_bp2_srwd,
10650 .write = spi_chip_write_256, /* Multi I/O supported */
10651 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10652 .voltage = {2700, 3600},
10653 },
10654
10655 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010656 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000010657 .name = "SST25LF020A",
10658 .bustype = BUS_SPI,
10659 .manufacture_id = SST_ID,
10660 .model_id = SST_SST25VF020_REMS,
10661 .total_size = 256,
10662 .page_size = 256,
10663 .feature_bits = FEATURE_WRSR_EWSR,
10664 .tested = TEST_OK_PREW,
10665 .probe = probe_spi_rems,
10666 .probe_timing = TIMING_ZERO,
10667 .block_erasers =
10668 {
10669 {
10670 .eraseblocks = { {4 * 1024, 64} },
10671 .block_erase = spi_block_erase_20,
10672 }, {
10673 .eraseblocks = { {32 * 1024, 8} },
10674 .block_erase = spi_block_erase_52,
10675 }, {
10676 .eraseblocks = { {256 * 1024, 1} },
10677 .block_erase = spi_block_erase_60,
10678 },
10679 },
10680 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10681 .unlock = spi_disable_blockprotect,
10682 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10683 .read = spi_chip_read, /* Fast read (0x0B) supported */
10684 .voltage = {2700, 3600},
10685 },
10686
10687 {
10688 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000010689 .name = "SST25LF040A",
10690 .bustype = BUS_SPI,
10691 .manufacture_id = SST_ID,
10692 .model_id = SST_SST25VF040_REMS,
10693 .total_size = 512,
10694 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010695 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000010696 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000010697 .probe = probe_spi_res2,
10698 .probe_timing = TIMING_ZERO,
10699 .block_erasers =
10700 {
10701 {
10702 .eraseblocks = { {4 * 1024, 128} },
10703 .block_erase = spi_block_erase_20,
10704 }, {
10705 .eraseblocks = { {32 * 1024, 16} },
10706 .block_erase = spi_block_erase_52,
10707 }, {
10708 .eraseblocks = { {512 * 1024, 1} },
10709 .block_erase = spi_block_erase_60,
10710 },
10711 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010712 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000010713 .unlock = spi_disable_blockprotect,
10714 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10715 .read = spi_chip_read,
10716 .voltage = {3000, 3600},
10717 },
10718
10719 {
10720 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000010721 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000010722 .bustype = BUS_SPI,
10723 .manufacture_id = SST_ID,
10724 .model_id = SST_SST25VF080_REMS,
10725 .total_size = 1024,
10726 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000010727 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000010728 .tested = TEST_UNTESTED,
10729 .probe = probe_spi_res2,
10730 .probe_timing = TIMING_ZERO,
10731 .block_erasers =
10732 {
10733 {
10734 .eraseblocks = { {4 * 1024, 256} },
10735 .block_erase = spi_block_erase_20,
10736 }, {
10737 .eraseblocks = { {32 * 1024, 32} },
10738 .block_erase = spi_block_erase_52,
10739 }, {
10740 .eraseblocks = { {1024 * 1024, 1} },
10741 .block_erase = spi_block_erase_60,
10742 },
10743 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010744 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000010745 .unlock = spi_disable_blockprotect,
10746 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10747 .read = spi_chip_read,
10748 .voltage = {3000, 3600},
10749 },
10750
10751 {
10752 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000010753 .name = "SST25VF512(A)",
Cory Henderson370f5822013-10-19 23:09:16 +000010754 .bustype = BUS_SPI,
10755 .manufacture_id = SST_ID,
Stefan Tauner6697f712014-08-06 15:09:15 +000010756 .model_id = SST_SST25VF512_REMS,
Cory Henderson370f5822013-10-19 23:09:16 +000010757 .total_size = 64,
10758 .page_size = 256,
10759 .feature_bits = FEATURE_WRSR_EWSR,
10760 .tested = TEST_OK_PREW,
10761 .probe = probe_spi_rems,
10762 .probe_timing = TIMING_ZERO,
10763 .block_erasers =
10764 {
10765 {
10766 .eraseblocks = { {4 * 1024, 16} },
10767 .block_erase = spi_block_erase_20,
10768 }, {
10769 .eraseblocks = { {32 * 1024, 2} },
10770 .block_erase = spi_block_erase_52,
10771 }, {
10772 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner6697f712014-08-06 15:09:15 +000010773 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010774 }, {
10775 .eraseblocks = { {64 * 1024, 1} },
10776 .block_erase = spi_block_erase_60,
10777 }, {
10778 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000010779 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010780 },
10781 },
10782 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10783 .unlock = spi_disable_blockprotect,
10784 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000010785 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010786 .voltage = {2700, 3600},
10787 },
10788
10789 {
10790 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000010791 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010792 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000010793 .manufacture_id = SST_ID,
10794 .model_id = SST_SST25VF010_REMS,
10795 .total_size = 128,
10796 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000010797 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000010798 .tested = TEST_OK_PREW,
10799 .probe = probe_spi_rems,
10800 .probe_timing = TIMING_ZERO,
10801 .block_erasers =
10802 {
10803 {
10804 .eraseblocks = { {4 * 1024, 32} },
10805 .block_erase = spi_block_erase_20,
10806 }, {
10807 .eraseblocks = { {32 * 1024, 4} },
10808 .block_erase = spi_block_erase_52,
10809 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000010810 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000010811 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010812 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000010813 .eraseblocks = { {128 * 1024, 1} },
10814 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000010815 }, {
10816 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000010817 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010818 },
10819 },
10820 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10821 .unlock = spi_disable_blockprotect,
10822 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000010823 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000010824 .voltage = {2700, 3600},
10825 },
10826
10827 {
10828 .vendor = "SST",
10829 .name = "SST25VF020",
10830 .bustype = BUS_SPI,
10831 .manufacture_id = SST_ID,
10832 .model_id = SST_SST25VF020_REMS,
10833 .total_size = 256,
10834 .page_size = 256,
10835 .feature_bits = FEATURE_WRSR_EWSR,
10836 .tested = TEST_UNTESTED,
10837 .probe = probe_spi_rems,
10838 .probe_timing = TIMING_ZERO,
10839 .block_erasers =
10840 {
10841 {
10842 .eraseblocks = { {4 * 1024, 64} },
10843 .block_erase = spi_block_erase_20,
10844 }, {
10845 .eraseblocks = { {32 * 1024, 8} },
10846 .block_erase = spi_block_erase_52,
10847 }, {
10848 .eraseblocks = { {256 * 1024, 1} },
10849 .block_erase = spi_block_erase_60,
10850 },
10851 },
10852 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
10853 .unlock = spi_disable_blockprotect,
10854 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10855 .read = spi_chip_read, /* only */
10856 .voltage = {2700, 3600},
10857 },
10858
10859 {
10860 .vendor = "SST",
10861 .name = "SST25VF020B",
10862 .bustype = BUS_SPI,
10863 .manufacture_id = SST_ID,
10864 .model_id = SST_SST25VF020B,
10865 .total_size = 256,
10866 .page_size = 256,
10867 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010868 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000010869 .probe = probe_spi_rdid,
10870 .probe_timing = TIMING_ZERO,
10871 .block_erasers =
10872 {
10873 {
10874 .eraseblocks = { {4 * 1024, 64} },
10875 .block_erase = spi_block_erase_20,
10876 }, {
10877 .eraseblocks = { {32 * 1024, 8} },
10878 .block_erase = spi_block_erase_52,
10879 }, {
10880 .eraseblocks = { {64 * 1024, 4} },
10881 .block_erase = spi_block_erase_d8,
10882 }, {
10883 .eraseblocks = { {256 * 1024, 1} },
10884 .block_erase = spi_block_erase_60,
10885 }, {
10886 .eraseblocks = { {256 * 1024, 1} },
10887 .block_erase = spi_block_erase_c7,
10888 },
10889 },
10890 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
10891 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
10892 .write = spi_aai_write, /* AAI supported (0xAD) */
10893 .read = spi_chip_read, /* Fast read (0x0B) supported */
10894 .voltage = {2700, 3600},
10895 },
10896
10897 {
10898 .vendor = "SST",
10899 .name = "SST25VF040",
10900 .bustype = BUS_SPI,
10901 .manufacture_id = SST_ID,
10902 .model_id = SST_SST25VF040_REMS,
10903 .total_size = 512,
10904 .page_size = 256,
10905 .feature_bits = FEATURE_WRSR_EWSR,
10906 .tested = TEST_OK_PR,
10907 .probe = probe_spi_rems,
10908 .probe_timing = TIMING_ZERO,
10909 .block_erasers =
10910 {
10911 {
10912 .eraseblocks = { {4 * 1024, 128} },
10913 .block_erase = spi_block_erase_20,
10914 }, {
10915 .eraseblocks = { {32 * 1024, 16} },
10916 .block_erase = spi_block_erase_52,
10917 }, {
10918 .eraseblocks = { {512 * 1024, 1} },
10919 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000010920 },
10921 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000010922 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000010923 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000010924 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
10925 .read = spi_chip_read,
10926 .voltage = {2700, 3600},
10927 },
10928
10929 {
10930 .vendor = "SST",
10931 .name = "SST25VF040B",
10932 .bustype = BUS_SPI,
10933 .manufacture_id = SST_ID,
10934 .model_id = SST_SST25VF040B,
10935 .total_size = 512,
10936 .page_size = 256,
10937 .feature_bits = FEATURE_WRSR_EWSR,
10938 .tested = TEST_OK_PREW,
10939 .probe = probe_spi_rdid,
10940 .probe_timing = TIMING_ZERO,
10941 .block_erasers =
10942 {
10943 {
10944 .eraseblocks = { {4 * 1024, 128} },
10945 .block_erase = spi_block_erase_20,
10946 }, {
10947 .eraseblocks = { {32 * 1024, 16} },
10948 .block_erase = spi_block_erase_52,
10949 }, {
10950 .eraseblocks = { {64 * 1024, 8} },
10951 .block_erase = spi_block_erase_d8,
10952 }, {
10953 .eraseblocks = { {512 * 1024, 1} },
10954 .block_erase = spi_block_erase_60,
10955 }, {
10956 .eraseblocks = { {512 * 1024, 1} },
10957 .block_erase = spi_block_erase_c7,
10958 },
10959 },
10960 .printlock = spi_prettyprint_status_register_sst25vf040b,
10961 .unlock = spi_disable_blockprotect,
10962 .write = spi_aai_write, /* AAI supported (0xAD) */
10963 .read = spi_chip_read, /* Fast read (0x0B) supported */
10964 .voltage = {2700, 3600},
10965 },
10966
10967 {
10968 .vendor = "SST",
10969 .name = "SST25VF040B.REMS",
10970 .bustype = BUS_SPI,
10971 .manufacture_id = SST_ID,
10972 .model_id = SST_SST25VF040B_REMS,
10973 .total_size = 512,
10974 .page_size = 256,
10975 .feature_bits = FEATURE_WRSR_EWSR,
10976 .tested = TEST_OK_PREW,
10977 .probe = probe_spi_rems,
10978 .probe_timing = TIMING_ZERO,
10979 .block_erasers =
10980 {
10981 {
10982 .eraseblocks = { {4 * 1024, 128} },
10983 .block_erase = spi_block_erase_20,
10984 }, {
10985 .eraseblocks = { {32 * 1024, 16} },
10986 .block_erase = spi_block_erase_52,
10987 }, {
10988 .eraseblocks = { {64 * 1024, 8} },
10989 .block_erase = spi_block_erase_d8,
10990 }, {
10991 .eraseblocks = { {512 * 1024, 1} },
10992 .block_erase = spi_block_erase_60,
10993 }, {
10994 .eraseblocks = { {512 * 1024, 1} },
10995 .block_erase = spi_block_erase_c7,
10996 },
10997 },
10998 .printlock = spi_prettyprint_status_register_sst25vf040b,
10999 .unlock = spi_disable_blockprotect,
11000 .write = spi_aai_write,
11001 .read = spi_chip_read,
11002 .voltage = {2700, 3600},
11003 },
11004
11005 {
11006 .vendor = "SST",
11007 .name = "SST25VF080B",
11008 .bustype = BUS_SPI,
11009 .manufacture_id = SST_ID,
11010 .model_id = SST_SST25VF080B,
11011 .total_size = 1024,
11012 .page_size = 256,
11013 .feature_bits = FEATURE_WRSR_EWSR,
11014 .tested = TEST_OK_PREW,
11015 .probe = probe_spi_rdid,
11016 .probe_timing = TIMING_ZERO,
11017 .block_erasers =
11018 {
11019 {
11020 .eraseblocks = { {4 * 1024, 256} },
11021 .block_erase = spi_block_erase_20,
11022 }, {
11023 .eraseblocks = { {32 * 1024, 32} },
11024 .block_erase = spi_block_erase_52,
11025 }, {
11026 .eraseblocks = { {64 * 1024, 16} },
11027 .block_erase = spi_block_erase_d8,
11028 }, {
11029 .eraseblocks = { {1024 * 1024, 1} },
11030 .block_erase = spi_block_erase_60,
11031 }, {
11032 .eraseblocks = { {1024 * 1024, 1} },
11033 .block_erase = spi_block_erase_c7,
11034 },
11035 },
11036 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
11037 .unlock = spi_disable_blockprotect,
11038 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000011039 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000011040 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000011041 },
11042
11043 {
11044 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011045 .name = "SST25VF016B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011046 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011047 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011048 .model_id = SST_SST25VF016B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011049 .total_size = 2048,
11050 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000011051 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000011052 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011053 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011054 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011055 .block_erasers =
11056 {
11057 {
11058 .eraseblocks = { {4 * 1024, 512} },
11059 .block_erase = spi_block_erase_20,
11060 }, {
11061 .eraseblocks = { {32 * 1024, 64} },
11062 .block_erase = spi_block_erase_52,
11063 }, {
11064 .eraseblocks = { {64 * 1024, 32} },
11065 .block_erase = spi_block_erase_d8,
11066 }, {
11067 .eraseblocks = { {2 * 1024 * 1024, 1} },
11068 .block_erase = spi_block_erase_60,
11069 }, {
11070 .eraseblocks = { {2 * 1024 * 1024, 1} },
11071 .block_erase = spi_block_erase_c7,
11072 },
11073 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011074 .printlock = spi_prettyprint_status_register_sst25vf016,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011075 .unlock = spi_disable_blockprotect,
Joshua Roys87955bf2011-08-01 18:39:28 +000011076 .write = spi_aai_write,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011077 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011078 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011079 },
11080
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011081 {
11082 .vendor = "SST",
11083 .name = "SST25VF032B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011084 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011085 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011086 .model_id = SST_SST25VF032B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011087 .total_size = 4096,
11088 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011089 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000011090 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011091 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000011092 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011093 .block_erasers =
11094 {
11095 {
11096 .eraseblocks = { {4 * 1024, 1024} },
11097 .block_erase = spi_block_erase_20,
11098 }, {
11099 .eraseblocks = { {32 * 1024, 128} },
11100 .block_erase = spi_block_erase_52,
11101 }, {
11102 .eraseblocks = { {64 * 1024, 64} },
11103 .block_erase = spi_block_erase_d8,
11104 }, {
11105 .eraseblocks = { {4 * 1024 * 1024, 1} },
11106 .block_erase = spi_block_erase_60,
11107 }, {
11108 .eraseblocks = { {4 * 1024 * 1024, 1} },
11109 .block_erase = spi_block_erase_c7,
11110 },
11111 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011112 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000011113 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000011114 .write = spi_aai_write,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011115 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011116 .voltage = {2700, 3600},
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000011117 },
11118
11119 {
11120 .vendor = "SST",
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011121 .name = "SST25VF064C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011122 .bustype = BUS_SPI,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011123 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011124 .model_id = SST_SST25VF064C,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011125 .total_size = 8192,
11126 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000011127 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Tauner8179be52011-06-04 13:13:34 +000011128 .tested = TEST_OK_PREW,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011129 .probe = probe_spi_rdid,
11130 .probe_timing = TIMING_ZERO,
11131 .block_erasers =
11132 {
11133 {
11134 .eraseblocks = { {4 * 1024, 2048} },
11135 .block_erase = spi_block_erase_20,
11136 }, {
11137 .eraseblocks = { {32 * 1024, 256} },
11138 .block_erase = spi_block_erase_52,
11139 }, {
11140 .eraseblocks = { {64 * 1024, 128} },
11141 .block_erase = spi_block_erase_d8,
11142 }, {
11143 .eraseblocks = { {8 * 1024 * 1024, 1} },
11144 .block_erase = spi_block_erase_60,
11145 }, {
11146 .eraseblocks = { {8 * 1024 * 1024, 1} },
11147 .block_erase = spi_block_erase_c7,
11148 },
11149 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000011150 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011151 .unlock = spi_disable_blockprotect,
Helge Wagner1db7a442010-10-05 22:29:08 +000011152 .write = spi_chip_write_256,
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011153 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011154 .voltage = {2700, 3600},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000011155 },
11156
11157 {
11158 .vendor = "SST",
Stefan Tauner9e349e42012-10-01 22:45:08 +000011159 .name = "SST25WF512",
11160 .bustype = BUS_SPI,
11161 .manufacture_id = SST_ID,
11162 .model_id = SST_SST25WF512,
11163 .total_size = 64,
11164 .page_size = 256,
11165 .feature_bits = FEATURE_WRSR_EITHER,
11166 .tested = TEST_UNTESTED,
11167 .probe = probe_spi_rdid,
11168 .probe_timing = TIMING_ZERO,
11169 .block_erasers =
11170 {
11171 {
11172 .eraseblocks = { {4 * 1024, 16} },
11173 .block_erase = spi_block_erase_20,
11174 }, {
11175 .eraseblocks = { {32 * 1024, 2} },
11176 .block_erase = spi_block_erase_52,
11177 }, {
11178 .eraseblocks = { {1024 * 64, 1} },
11179 .block_erase = spi_block_erase_60,
11180 }, {
11181 .eraseblocks = { {1024 * 64, 1} },
11182 .block_erase = spi_block_erase_c7,
11183 },
11184 },
Jason Harper43ddef02014-05-04 00:55:24 +000011185 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11186 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011187 .write = spi_aai_write,
11188 .read = spi_chip_read, /* Fast read (0x0B) supported */
11189 .voltage = {1650, 1950},
11190 },
11191
11192 {
11193 .vendor = "SST",
11194 .name = "SST25WF010",
11195 .bustype = BUS_SPI,
11196 .manufacture_id = SST_ID,
11197 .model_id = SST_SST25WF010,
11198 .total_size = 128,
11199 .page_size = 256,
11200 .feature_bits = FEATURE_WRSR_EITHER,
11201 .tested = TEST_UNTESTED,
11202 .probe = probe_spi_rdid,
11203 .probe_timing = TIMING_ZERO,
11204 .block_erasers =
11205 {
11206 {
11207 .eraseblocks = { {4 * 1024, 32} },
11208 .block_erase = spi_block_erase_20,
11209 }, {
11210 .eraseblocks = { {32 * 1024, 4} },
11211 .block_erase = spi_block_erase_52,
11212 }, {
11213 .eraseblocks = { {1024 * 128, 1} },
11214 .block_erase = spi_block_erase_60,
11215 }, {
11216 .eraseblocks = { {1024 * 128, 1} },
11217 .block_erase = spi_block_erase_c7,
11218 },
11219 },
Jason Harper43ddef02014-05-04 00:55:24 +000011220 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11221 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011222 .write = spi_aai_write,
11223 .read = spi_chip_read, /* Fast read (0x0B) supported */
11224 .voltage = {1650, 1950},
11225 },
11226
11227 {
11228 .vendor = "SST",
11229 .name = "SST25WF020",
11230 .bustype = BUS_SPI,
11231 .manufacture_id = SST_ID,
11232 .model_id = SST_SST25WF020,
11233 .total_size = 256,
11234 .page_size = 256,
11235 .feature_bits = FEATURE_WRSR_EITHER,
11236 .tested = TEST_UNTESTED,
11237 .probe = probe_spi_rdid,
11238 .probe_timing = TIMING_ZERO,
11239 .block_erasers =
11240 {
11241 {
11242 .eraseblocks = { {4 * 1024, 64} },
11243 .block_erase = spi_block_erase_20,
11244 }, {
11245 .eraseblocks = { {32 * 1024, 8} },
11246 .block_erase = spi_block_erase_52,
11247 }, {
11248 .eraseblocks = { {64 * 1024, 4} },
11249 .block_erase = spi_block_erase_d8,
11250 }, {
11251 .eraseblocks = { {1024 * 256, 1} },
11252 .block_erase = spi_block_erase_60,
11253 }, {
11254 .eraseblocks = { {1024 * 256, 1} },
11255 .block_erase = spi_block_erase_c7,
11256 },
11257 },
Jason Harper43ddef02014-05-04 00:55:24 +000011258 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11259 .unlock = spi_disable_blockprotect_bp2_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011260 .write = spi_aai_write,
11261 .read = spi_chip_read, /* Fast read (0x0B) supported */
11262 .voltage = {1650, 1950},
11263 },
11264
11265 {
11266 .vendor = "SST",
11267 .name = "SST25WF040",
11268 .bustype = BUS_SPI,
11269 .manufacture_id = SST_ID,
11270 .model_id = SST_SST25WF040,
11271 .total_size = 512,
11272 .page_size = 256,
11273 .feature_bits = FEATURE_WRSR_EITHER,
11274 .tested = TEST_UNTESTED,
11275 .probe = probe_spi_rdid,
11276 .probe_timing = TIMING_ZERO,
11277 .block_erasers =
11278 {
11279 {
11280 .eraseblocks = { {4 * 1024, 128} },
11281 .block_erase = spi_block_erase_20,
11282 }, {
11283 .eraseblocks = { {32 * 1024, 16} },
11284 .block_erase = spi_block_erase_52,
11285 }, {
11286 .eraseblocks = { {64 * 1024, 8} },
11287 .block_erase = spi_block_erase_d8,
11288 }, {
11289 .eraseblocks = { {1024 * 512, 1} },
11290 .block_erase = spi_block_erase_60,
11291 }, {
11292 .eraseblocks = { {1024 * 512, 1} },
11293 .block_erase = spi_block_erase_c7,
11294 },
11295 },
Jason Harper43ddef02014-05-04 00:55:24 +000011296 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
11297 .unlock = spi_disable_blockprotect_bp2_srwd,
11298 .write = spi_aai_write,
11299 .read = spi_chip_read, /* Fast read (0x0B) supported */
11300 .voltage = {1650, 1950},
11301 },
11302
11303 {
11304 .vendor = "SST",
11305 .name = "SST25WF080",
11306 .bustype = BUS_SPI,
11307 .manufacture_id = SST_ID,
11308 .model_id = SST_SST25WF080,
11309 .total_size = 1024,
11310 .page_size = 256,
11311 .feature_bits = FEATURE_WRSR_EITHER,
11312 .tested = TEST_OK_PREW,
11313 .probe = probe_spi_rdid,
11314 .probe_timing = TIMING_ZERO,
11315 .block_erasers =
11316 {
11317 {
11318 .eraseblocks = { {4 * 1024, 256} },
11319 .block_erase = spi_block_erase_20,
11320 }, {
11321 .eraseblocks = { {32 * 1024, 32} },
11322 .block_erase = spi_block_erase_52,
11323 }, {
11324 .eraseblocks = { {64 * 1024, 16} },
11325 .block_erase = spi_block_erase_d8,
11326 }, {
11327 .eraseblocks = { {1024 * 1024, 1} },
11328 .block_erase = spi_block_erase_60,
11329 }, {
11330 .eraseblocks = { {1024 * 1024, 1} },
11331 .block_erase = spi_block_erase_c7,
11332 },
11333 },
11334 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
11335 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner9e349e42012-10-01 22:45:08 +000011336 .write = spi_aai_write,
11337 .read = spi_chip_read, /* Fast read (0x0B) supported */
11338 .voltage = {1650, 1950},
11339 },
11340
11341 {
11342 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011343 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011344 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011345 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011346 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011347 .total_size = 512,
11348 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000011349 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011350 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011351 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011352 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011353 .block_erasers =
11354 {
11355 {
11356 .eraseblocks = { {128, 4096} },
11357 .block_erase = erase_sector_28sf040,
11358 }, {
11359 .eraseblocks = { {512 * 1024, 1} },
11360 .block_erase = erase_chip_28sf040,
11361 }
11362 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011363 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011364 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011365 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011366 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011367 },
11368
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011369 {
11370 .vendor = "SST",
11371 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011372 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011373 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011374 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011375 .total_size = 128,
11376 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011377 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011378 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011379 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011380 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011381 .block_erasers =
11382 {
11383 {
11384 .eraseblocks = { {128 * 1024, 1} },
11385 .block_erase = erase_chip_block_jedec,
11386 }
11387 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011388 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011389 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011390 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011391 },
11392
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011393 {
11394 .vendor = "SST",
11395 .name = "SST29LE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011396 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011397 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011398 .model_id = SST_SST29LE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011399 .total_size = 128,
11400 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011401 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011402 .tested = TEST_UNTESTED,
11403 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011404 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011405 .block_erasers =
11406 {
11407 {
11408 .eraseblocks = { {128 * 1024, 1} },
11409 .block_erase = erase_chip_block_jedec,
11410 }
11411 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011412 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011413 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011414 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011415 },
11416
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011417 {
11418 .vendor = "SST",
11419 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011420 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011421 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011422 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011423 .total_size = 256,
11424 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011425 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011426 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011427 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000011428 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011429 .block_erasers =
11430 {
11431 {
11432 .eraseblocks = { {256 * 1024, 1} },
11433 .block_erase = erase_chip_block_jedec,
11434 }
11435 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011436 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011437 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011438 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011439 },
11440
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011441 {
11442 .vendor = "SST",
11443 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011444 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011445 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011446 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011447 .total_size = 256,
11448 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000011449 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011450 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011451 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000011452 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011453 .block_erasers =
11454 {
11455 {
11456 .eraseblocks = { {256 * 1024, 1} },
11457 .block_erase = erase_chip_block_jedec,
11458 }
11459 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011460 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011461 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011462 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011463 },
11464
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011465 {
11466 .vendor = "SST",
Uwe Hermann48da3f92010-01-23 15:15:19 +000011467 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011468 .bustype = BUS_PARALLEL,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011469 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011470 .model_id = SST_SST39SF512,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011471 .total_size = 64,
11472 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011473 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering7913fb42011-03-07 15:32:58 +000011474 .tested = TEST_OK_PREW,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011475 .probe = probe_jedec,
11476 .probe_timing = 1, /* 150 ns */
Uwe Hermann48da3f92010-01-23 15:15:19 +000011477 .block_erasers =
11478 {
11479 {
11480 .eraseblocks = { {4 * 1024, 16} },
11481 .block_erase = erase_sector_jedec,
11482 }, {
11483 .eraseblocks = { {64 * 1024, 1} },
11484 .block_erase = erase_chip_block_jedec,
11485 }
11486 },
Sean Nelson35727f72010-01-28 23:55:12 +000011487 .write = write_jedec_1,
Uwe Hermann48da3f92010-01-23 15:15:19 +000011488 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011489 .voltage = {4500, 5500},
Uwe Hermann48da3f92010-01-23 15:15:19 +000011490 },
11491
11492 {
11493 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011494 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011495 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011496 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011497 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011498 .total_size = 128,
11499 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011500 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000011501 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011502 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000011503 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011504 .block_erasers =
11505 {
11506 {
11507 .eraseblocks = { {4 * 1024, 32} },
11508 .block_erase = erase_sector_jedec,
11509 }, {
11510 .eraseblocks = { {128 * 1024, 1} },
11511 .block_erase = erase_chip_block_jedec,
11512 }
11513 },
Sean Nelson35727f72010-01-28 23:55:12 +000011514 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011515 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011516 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011517 },
11518
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011519 {
11520 .vendor = "SST",
11521 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011522 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011523 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011524 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011525 .total_size = 256,
11526 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011527 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000011528 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011529 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011530 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011531 .block_erasers =
11532 {
11533 {
11534 .eraseblocks = { {4 * 1024, 64} },
11535 .block_erase = erase_sector_jedec,
11536 }, {
11537 .eraseblocks = { {256 * 1024, 1} },
11538 .block_erase = erase_chip_block_jedec,
11539 }
11540 },
Sean Nelson35727f72010-01-28 23:55:12 +000011541 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011542 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011543 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011544 },
11545
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011546 {
11547 .vendor = "SST",
11548 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011549 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011550 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011551 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011552 .total_size = 512,
11553 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011554 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000011555 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011556 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011557 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011558 .block_erasers =
11559 {
11560 {
11561 .eraseblocks = { {4 * 1024, 128} },
11562 .block_erase = erase_sector_jedec,
11563 }, {
11564 .eraseblocks = { {512 * 1024, 1} },
11565 .block_erase = erase_chip_block_jedec,
11566 }
11567 },
Sean Nelson35727f72010-01-28 23:55:12 +000011568 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011569 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011570 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000011571 },
11572
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011573 {
11574 .vendor = "SST",
11575 .name = "SST39VF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011576 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011577 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011578 .model_id = SST_SST39VF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011579 .total_size = 64,
11580 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011581 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000011582 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011583 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011584 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011585 .block_erasers =
11586 {
11587 {
11588 .eraseblocks = { {4 * 1024, 16} },
11589 .block_erase = erase_sector_jedec,
11590 }, {
11591 .eraseblocks = { {64 * 1024, 1} },
11592 .block_erase = erase_chip_block_jedec,
11593 }
11594 },
Sean Nelson35727f72010-01-28 23:55:12 +000011595 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011596 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011597 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011598 },
11599
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011600 {
11601 .vendor = "SST",
11602 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011603 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011604 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011605 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011606 .total_size = 128,
11607 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011608 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000011609 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011610 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011611 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011612 .block_erasers =
11613 {
11614 {
11615 .eraseblocks = { {4 * 1024, 32} },
11616 .block_erase = erase_sector_jedec,
11617 }, {
11618 .eraseblocks = { {128 * 1024, 1} },
11619 .block_erase = erase_chip_block_jedec,
11620 }
11621 },
Sean Nelson35727f72010-01-28 23:55:12 +000011622 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011623 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011624 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011625 },
11626
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011627 {
11628 .vendor = "SST",
11629 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011630 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011631 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011632 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011633 .total_size = 256,
11634 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011635 .feature_bits = FEATURE_EITHER_RESET,
11636 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011637 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011638 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011639 .block_erasers =
11640 {
11641 {
11642 .eraseblocks = { {4 * 1024, 64} },
11643 .block_erase = erase_sector_jedec,
11644 }, {
11645 .eraseblocks = { {256 * 1024, 1} },
11646 .block_erase = erase_chip_block_jedec,
11647 }
11648 },
Sean Nelson35727f72010-01-28 23:55:12 +000011649 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011650 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011651 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011652 },
11653
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011654 {
11655 .vendor = "SST",
11656 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011657 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011658 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011659 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011660 .total_size = 512,
11661 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011662 .feature_bits = FEATURE_EITHER_RESET,
11663 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011664 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011665 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011666 .block_erasers =
11667 {
11668 {
11669 .eraseblocks = { {4 * 1024, 128} },
11670 .block_erase = erase_sector_jedec,
11671 }, {
11672 .eraseblocks = { {512 * 1024, 1} },
11673 .block_erase = erase_chip_block_jedec,
11674 }
11675 },
Sean Nelson35727f72010-01-28 23:55:12 +000011676 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011677 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011678 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000011679 },
FENG yu ningff692fb2008-12-08 18:15:10 +000011680
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011681 {
11682 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000011683 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011684 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000011685 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011686 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000011687 .total_size = 1024,
11688 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000011689 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000011690 .tested = TEST_UNTESTED,
11691 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011692 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011693 .block_erasers =
11694 {
11695 {
11696 .eraseblocks = { {4 * 1024, 256} },
11697 .block_erase = erase_sector_jedec,
11698 }, {
11699 .eraseblocks = { {64 * 1024, 16} },
11700 .block_erase = erase_block_jedec,
11701 }, {
11702 .eraseblocks = { {1024 * 1024, 1} },
11703 .block_erase = erase_chip_block_jedec,
11704 }
11705 },
Sean Nelson35727f72010-01-28 23:55:12 +000011706 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011707 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011708 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000011709 },
11710
11711 {
11712 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011713 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011714 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011715 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011716 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011717 .total_size = 256,
11718 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011719 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000011720 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011721 .probe = probe_jedec,
11722 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011723 .block_erasers =
11724 {
11725 {
11726 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011727 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011728 }, {
11729 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011730 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011731 }, {
11732 .eraseblocks = { {256 * 1024, 1} },
11733 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11734 }
11735 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011736 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011737 .unlock = unlock_sst_fwhub,
11738 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011739 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011740 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011741 },
11742
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011743 {
11744 .vendor = "SST",
11745 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011746 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011747 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011748 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011749 .total_size = 384,
11750 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011751 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000011752 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011753 .probe = probe_jedec,
11754 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011755 .block_erasers =
11756 {
11757 {
11758 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011759 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011760 }, {
11761 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011762 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011763 }, {
11764 .eraseblocks = { {384 * 1024, 1} },
11765 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11766 }
11767 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011768 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011769 .unlock = unlock_sst_fwhub,
11770 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011771 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011772 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011773 },
11774
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011775 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011776 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
11777 * and is only honored for 64k block erase, but not 4k sector erase.
11778 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011779 .vendor = "SST",
11780 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011781 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011782 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011783 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011784 .total_size = 512,
11785 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011786 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000011787 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011788 .probe = probe_jedec,
11789 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011790 .block_erasers =
11791 {
11792 {
11793 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011794 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011795 }, {
11796 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011797 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011798 }, {
11799 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000011800 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000011801 },
11802 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011803 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011804 .unlock = unlock_sst_fwhub,
11805 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011806 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011807 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011808 },
11809
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011810 {
11811 .vendor = "SST",
11812 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011813 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011814 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011815 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011816 .total_size = 512,
11817 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011818 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011819 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011820 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011821 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011822 .block_erasers =
11823 {
11824 {
11825 .eraseblocks = { {4 * 1024, 128} },
11826 .block_erase = erase_sector_49lfxxxc,
11827 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011828 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011829 {64 * 1024, 7},
11830 {32 * 1024, 1},
11831 {8 * 1024, 2},
11832 {16 * 1024, 1},
11833 },
Sean Nelson69e58112010-03-23 17:10:28 +000011834 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011835 }
11836 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011837 .printlock = printlock_regspace2_block_eraser_1,
11838 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011839 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011840 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011841 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011842 },
11843
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011844 {
11845 .vendor = "SST",
11846 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011847 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011848 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011849 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011850 .total_size = 1024,
11851 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011852 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000011853 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011854 .probe = probe_jedec,
11855 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011856 .block_erasers =
11857 {
11858 {
11859 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011860 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011861 }, {
11862 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011863 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011864 }, {
11865 .eraseblocks = { {1024 * 1024, 1} },
11866 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
11867 }
11868 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011869 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000011870 .unlock = unlock_sst_fwhub,
11871 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011872 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011873 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011874 },
11875
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011876 {
11877 .vendor = "SST",
11878 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011879 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011880 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011881 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011882 .total_size = 1024,
11883 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011884 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011885 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011886 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011887 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011888 .block_erasers =
11889 {
11890 {
11891 .eraseblocks = { {4 * 1024, 256} },
11892 .block_erase = erase_sector_49lfxxxc,
11893 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011894 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011895 {64 * 1024, 15},
11896 {32 * 1024, 1},
11897 {8 * 1024, 2},
11898 {16 * 1024, 1},
11899 },
Sean Nelson69e58112010-03-23 17:10:28 +000011900 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011901 }
11902 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011903 .printlock = printlock_regspace2_block_eraser_1,
11904 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011905 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011906 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011907 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011908 },
11909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011910 {
11911 .vendor = "SST",
11912 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011913 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011914 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011915 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011916 .total_size = 2048,
11917 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011918 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011919 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000011920 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000011921 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011922 .block_erasers =
11923 {
11924 {
11925 .eraseblocks = { {4 * 1024, 512} },
11926 .block_erase = erase_sector_49lfxxxc,
11927 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000011928 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000011929 {64 * 1024, 31},
11930 {32 * 1024, 1},
11931 {8 * 1024, 2},
11932 {16 * 1024, 1},
11933 },
Sean Nelson69e58112010-03-23 17:10:28 +000011934 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000011935 }
11936 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000011937 .printlock = printlock_regspace2_block_eraser_1,
11938 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000011939 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011940 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011941 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000011942 },
11943
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011944 {
11945 .vendor = "SST",
11946 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011947 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011948 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011949 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011950 .total_size = 256,
11951 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011952 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000011953 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011954 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011955 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011956 .block_erasers =
11957 {
11958 {
11959 .eraseblocks = { {4 * 1024, 64} },
11960 .block_erase = erase_sector_jedec,
11961 }, {
11962 .eraseblocks = { {16 * 1024, 16} },
11963 .block_erase = erase_block_jedec,
11964 }, {
11965 .eraseblocks = { {256 * 1024, 1} },
11966 .block_erase = NULL,
11967 }
11968 },
Sean Nelson35727f72010-01-28 23:55:12 +000011969 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000011970 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011971 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000011972 },
11973
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011974 {
11975 .vendor = "SST",
11976 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011977 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011978 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000011979 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011980 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000011981 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000011982 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000011983 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000011984 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000011985 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000011986 .block_erasers =
11987 {
11988 {
11989 .eraseblocks = { {4 * 1024, 64} },
11990 .block_erase = erase_sector_jedec,
11991 }, {
11992 .eraseblocks = { {16 * 1024, 16} },
11993 .block_erase = erase_block_jedec,
11994 }, {
11995 .eraseblocks = { {256 * 1024, 1} },
11996 .block_erase = NULL,
11997 }
11998 },
Sean Nelson35727f72010-01-28 23:55:12 +000011999 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012000 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012001 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012002 },
12003
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012004 {
12005 .vendor = "SST",
12006 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012007 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012008 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012009 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012010 .total_size = 512,
12011 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012012 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012013 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012014 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000012015 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012016 .block_erasers =
12017 {
12018 {
12019 .eraseblocks = { {4 * 1024, 128} },
12020 .block_erase = erase_sector_jedec,
12021 }, {
12022 .eraseblocks = { {64 * 1024, 8} },
12023 .block_erase = erase_block_jedec,
12024 }, {
12025 .eraseblocks = { {512 * 1024, 1} },
12026 .block_erase = NULL,
12027 }
12028 },
Sean Nelson35727f72010-01-28 23:55:12 +000012029 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012030 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012031 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012032 },
12033
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012034 {
12035 .vendor = "SST",
12036 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012037 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012038 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012039 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012040 .total_size = 512,
12041 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000012042 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012043 .tested = TEST_OK_PR,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012044 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012045 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012046 .block_erasers =
12047 {
12048 {
12049 .eraseblocks = { {4 * 1024, 128} },
12050 .block_erase = erase_sector_jedec,
12051 }, {
12052 .eraseblocks = { {64 * 1024, 8} },
12053 .block_erase = erase_block_jedec,
12054 }, {
12055 .eraseblocks = { {512 * 1024, 1} },
12056 .block_erase = NULL,
12057 }
12058 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012059 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000012060 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012061 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012062 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012063 },
12064
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012065 {
12066 .vendor = "SST",
12067 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012068 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012069 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012070 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012071 .total_size = 1024,
12072 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012073 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000012074 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012075 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012076 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012077 .block_erasers =
12078 {
12079 {
12080 .eraseblocks = { {4 * 1024, 256} },
12081 .block_erase = erase_sector_jedec,
12082 }, {
12083 .eraseblocks = { {64 * 1024, 16} },
12084 .block_erase = erase_block_jedec,
12085 }, {
12086 .eraseblocks = { {1024 * 1024, 1} },
12087 .block_erase = NULL,
12088 }
12089 },
Sean Nelson35727f72010-01-28 23:55:12 +000012090 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012091 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012092 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012093 },
12094
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012095 {
12096 .vendor = "SST",
12097 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012098 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012099 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012100 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012101 .total_size = 2048,
12102 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012103 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012104 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012105 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012106 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000012107 .block_erasers =
12108 {
12109 {
12110 .eraseblocks = { {4 * 1024, 512} },
12111 .block_erase = erase_sector_49lfxxxc,
12112 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000012113 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000012114 {64 * 1024, 31},
12115 {32 * 1024, 1},
12116 {8 * 1024, 2},
12117 {16 * 1024, 1},
12118 },
Sean Nelson69e58112010-03-23 17:10:28 +000012119 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000012120 }
12121 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012122 .printlock = printlock_regspace2_block_eraser_1,
12123 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012124 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012125 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012126 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012127 },
12128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012129 {
12130 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012131 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012132 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012133 .manufacture_id = ST_ID,
12134 .model_id = ST_M29F002B,
12135 .total_size = 256,
12136 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012137 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012138 .tested = TEST_UNTESTED,
12139 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012140 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012141 .block_erasers =
12142 {
12143 {
12144 .eraseblocks = {
12145 {16 * 1024, 1},
12146 {8 * 1024, 2},
12147 {32 * 1024, 1},
12148 {64 * 1024, 3},
12149 },
12150 .block_erase = erase_sector_jedec,
12151 }, {
12152 .eraseblocks = { {256 * 1024, 1} },
12153 .block_erase = erase_chip_block_jedec,
12154 }
12155 },
Sean Nelson35727f72010-01-28 23:55:12 +000012156 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012157 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012158 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000012159 },
12160
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012161 {
12162 .vendor = "ST",
12163 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012164 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012165 .manufacture_id = ST_ID,
12166 .model_id = ST_M29F002T,
12167 .total_size = 256,
12168 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012169 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000012170 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012171 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012172 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012173 .block_erasers =
12174 {
12175 {
12176 .eraseblocks = {
12177 {64 * 1024, 3},
12178 {32 * 1024, 1},
12179 {8 * 1024, 2},
12180 {16 * 1024, 1},
12181 },
12182 .block_erase = erase_sector_jedec,
12183 }, {
12184 .eraseblocks = { {256 * 1024, 1} },
12185 .block_erase = erase_chip_block_jedec,
12186 }
12187 },
Sean Nelson35727f72010-01-28 23:55:12 +000012188 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012189 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000012190 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000012191 },
12192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012193 {
12194 .vendor = "ST",
12195 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012196 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012197 .manufacture_id = ST_ID,
12198 .model_id = ST_M29F040B,
12199 .total_size = 512,
12200 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012201 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12202 .tested = TEST_UNTESTED,
12203 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000012204 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000012205 .block_erasers =
12206 {
12207 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012208 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000012209 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012210 }, {
12211 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000012212 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012213 }
12214 },
Sean Nelson35727f72010-01-28 23:55:12 +000012215 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012216 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012217 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012218 },
12219
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012220 {
Sean Nelson35727f72010-01-28 23:55:12 +000012221 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012222 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012223 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012224 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012225 .manufacture_id = ST_ID,
12226 .model_id = ST_M29F400BB,
12227 .total_size = 512,
12228 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012229 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000012230 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012231 .probe = probe_jedec,
12232 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012233 .block_erasers =
12234 {
12235 {
12236 .eraseblocks = {
12237 {16 * 1024, 1},
12238 {8 * 1024, 2},
12239 {32 * 1024, 1},
12240 {64 * 1024, 7},
12241 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012242 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012243 }, {
12244 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012245 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012246 }
12247 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012248 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012249 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012250 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000012251 },
12252 {
12253 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
12254 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012255 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012256 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012257 .manufacture_id = ST_ID,
12258 .model_id = ST_M29F400BT,
12259 .total_size = 512,
12260 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012261 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012262 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012263 .probe = probe_jedec,
12264 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000012265 .block_erasers =
12266 {
12267 {
12268 .eraseblocks = {
12269 {64 * 1024, 7},
12270 {32 * 1024, 1},
12271 {8 * 1024, 2},
12272 {16 * 1024, 1},
12273 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012274 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012275 }, {
12276 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012277 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000012278 }
12279 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000012280 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012281 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012282 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012283 },
12284
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012285 {
12286 .vendor = "ST",
12287 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012288 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012289 .manufacture_id = ST_ID,
12290 .model_id = ST_M29W010B,
12291 .total_size = 128,
12292 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012294 .tested = TEST_UNTESTED,
12295 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012296 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012297 .block_erasers =
12298 {
12299 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012300 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012301 .block_erase = erase_sector_jedec,
12302 }, {
12303 .eraseblocks = { {128 * 1024, 1} },
12304 .block_erase = erase_chip_block_jedec,
12305 }
12306 },
Sean Nelson35727f72010-01-28 23:55:12 +000012307 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012308 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012309 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012310 },
12311
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012312 {
12313 .vendor = "ST",
12314 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012315 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012316 .manufacture_id = ST_ID,
12317 .model_id = ST_M29W040B,
12318 .total_size = 512,
12319 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012320 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012321 .tested = TEST_UNTESTED,
12322 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012323 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012324 .block_erasers =
12325 {
12326 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012327 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012328 .block_erase = erase_sector_jedec,
12329 }, {
12330 .eraseblocks = { {512 * 1024, 1} },
12331 .block_erase = erase_chip_block_jedec,
12332 }
12333 },
Sean Nelson35727f72010-01-28 23:55:12 +000012334 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012335 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012336 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012337 },
12338
Stefan Taunereb582572012-09-21 12:52:50 +000012339 {
12340 .vendor = "ST",
12341 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012342 .bustype = BUS_PARALLEL,
Stefan Taunereb582572012-09-21 12:52:50 +000012343 .manufacture_id = ST_ID,
12344 .model_id = ST_M29W512B,
12345 .total_size = 64,
12346 .page_size = 64 * 1024,
12347 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000012348 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000012349 .probe = probe_jedec,
12350 .probe_timing = TIMING_ZERO,
12351 .block_erasers =
12352 {
12353 {
12354 .eraseblocks = { {64 * 1024, 1} },
12355 .block_erase = erase_chip_block_jedec,
12356 }
12357 },
12358 .write = write_jedec_1,
12359 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012360 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000012361 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000012362
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012363 {
12364 .vendor = "ST",
12365 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012366 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012367 .manufacture_id = ST_ID,
12368 .model_id = ST_M50FLW040A,
12369 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000012370 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012371 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012372 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012373 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012374 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012375 .block_erasers =
12376 {
12377 {
Sean Nelson329bde72010-01-19 16:39:19 +000012378 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012379 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012380 {64 * 1024, 5}, /* block */
12381 {4 * 1024, 16}, /* sector */
12382 {4 * 1024, 16}, /* sector */
12383 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012384 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012385 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012386 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000012387 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012388 }
12389 },
Sean Nelson28accc22010-03-19 18:47:06 +000012390 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012391 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012392 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012393 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012394 },
12395
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012396 {
12397 .vendor = "ST",
12398 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012399 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012400 .manufacture_id = ST_ID,
12401 .model_id = ST_M50FLW040B,
12402 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000012403 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012404 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012405 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012406 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012407 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012408 .block_erasers =
12409 {
12410 {
Sean Nelson329bde72010-01-19 16:39:19 +000012411 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012412 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012413 {4 * 1024, 16}, /* sector */
12414 {64 * 1024, 5}, /* block */
12415 {4 * 1024, 16}, /* sector */
12416 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012417 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012418 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012419 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000012420 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012421 }
12422 },
Sean Nelson28accc22010-03-19 18:47:06 +000012423 .write = write_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012424 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012425 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012426 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012427 },
12428
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012429 {
12430 .vendor = "ST",
12431 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012432 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012433 .manufacture_id = ST_ID,
12434 .model_id = ST_M50FLW080A,
12435 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000012436 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012437 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012438 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000012439 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012440 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012441 .block_erasers =
12442 {
12443 {
Sean Nelson329bde72010-01-19 16:39:19 +000012444 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012445 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012446 {64 * 1024, 13}, /* block */
12447 {4 * 1024, 16}, /* sector */
12448 {4 * 1024, 16}, /* sector */
12449 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012450 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012451 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012452 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000012453 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012454 }
12455 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012456 .printlock = printlock_regspace2_block_eraser_0,
12457 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012458 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012459 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012460 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012461 },
12462
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012463 {
12464 .vendor = "ST",
12465 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012466 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012467 .manufacture_id = ST_ID,
12468 .model_id = ST_M50FLW080B,
12469 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000012470 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012471 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012472 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012473 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000012474 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000012475 .block_erasers =
12476 {
12477 {
Sean Nelson329bde72010-01-19 16:39:19 +000012478 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000012479 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000012480 {4 * 1024, 16}, /* sector */
12481 {64 * 1024, 13}, /* block */
12482 {4 * 1024, 16}, /* sector */
12483 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000012484 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000012485 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000012486 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000012487 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012488 }
12489 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012490 .printlock = printlock_regspace2_block_eraser_0,
12491 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012492 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012493 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012494 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012495 },
12496
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012497 {
12498 .vendor = "ST",
12499 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012500 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012501 .manufacture_id = ST_ID,
12502 .model_id = ST_M50FW002,
12503 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000012504 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012505 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012506 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000012507 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012508 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000012509 .block_erasers =
12510 {
12511 {
12512 .eraseblocks = {
12513 {64 * 1024, 3},
12514 {32 * 1024, 1},
12515 {8 * 1024, 2},
12516 {16 * 1024, 1},
12517 },
Sean Nelson28accc22010-03-19 18:47:06 +000012518 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012519 }, {
12520 .eraseblocks = { {256 * 1024, 1}, },
12521 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000012522 }
12523 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012524 .printlock = printlock_regspace2_block_eraser_0,
12525 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012526 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012527 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012528 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012529 },
12530
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012531 {
12532 .vendor = "ST",
12533 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012534 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012535 .manufacture_id = ST_ID,
12536 .model_id = ST_M50FW016,
12537 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000012538 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012539 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012540 .tested = TEST_UNTESTED,
12541 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012542 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000012543 .block_erasers =
12544 {
12545 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012546 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000012547 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012548 }
12549 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012550 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000012551 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012552 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012553 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012554 },
12555
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012556 {
12557 .vendor = "ST",
12558 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012559 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012560 .manufacture_id = ST_ID,
12561 .model_id = ST_M50FW040,
12562 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000012563 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012564 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000012565 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012566 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012567 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000012568 .block_erasers =
12569 {
12570 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012571 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000012572 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012573 }
12574 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012575 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000012576 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012577 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012578 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012579 },
12580
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012581 {
12582 .vendor = "ST",
12583 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012584 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012585 .manufacture_id = ST_ID,
12586 .model_id = ST_M50FW080,
12587 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000012588 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012589 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012590 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012591 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000012592 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000012593 .block_erasers =
12594 {
12595 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012596 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000012597 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012598 }
12599 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012600 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000012601 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012602 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012603 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012604 },
12605
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012606 {
12607 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000012608 .name = "M50LPW080",
12609 .bustype = BUS_LPC, /* A/A Mux */
12610 .manufacture_id = ST_ID,
12611 .model_id = ST_M50LPW080,
12612 .total_size = 1024,
12613 .page_size = 0,
12614 .feature_bits = FEATURE_REGISTERMAP,
12615 .tested = TEST_UNTESTED,
12616 .probe = probe_82802ab,
12617 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12618 .block_erasers =
12619 {
12620 {
Stefan Tauner6697f712014-08-06 15:09:15 +000012621 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000012622 .block_erase = erase_block_82802ab,
12623 }
12624 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012625 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000012626 .write = write_82802ab,
12627 .read = read_memmapped,
12628 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
12629 },
12630
12631 {
12632 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012633 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012634 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012635 .manufacture_id = ST_ID,
12636 .model_id = ST_M50LPW116,
12637 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000012638 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000012639 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012640 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012641 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000012642 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012643 .block_erasers =
12644 {
12645 {
12646 .eraseblocks = {
12647 {4 * 1024, 16},
12648 {64 * 1024, 30},
12649 {32 * 1024, 1},
12650 {8 * 1024, 2},
12651 {16 * 1024, 1},
12652 },
Sean Nelson28accc22010-03-19 18:47:06 +000012653 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000012654 }
12655 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000012656 .printlock = printlock_regspace2_block_eraser_0,
12657 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000012658 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012659 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012660 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000012661 },
12662
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012663 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012664 .vendor = "SyncMOS/MoselVitelic",
12665 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012666 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012667 .manufacture_id = SYNCMOS_MVC_ID,
12668 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012669 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012670 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000012671 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012672 .tested = TEST_UNTESTED,
12673 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012674 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012675 .block_erasers =
12676 {
12677 {
12678 .eraseblocks = { {512, 256} },
12679 .block_erase = erase_sector_jedec,
12680 }, {
12681 .eraseblocks = { {128 * 1024, 1} },
12682 .block_erase = erase_chip_block_jedec,
12683 },
12684 },
Sean Nelson35727f72010-01-28 23:55:12 +000012685 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012686 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012687 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000012688 },
12689
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012690 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012691 .vendor = "SyncMOS/MoselVitelic",
12692 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012693 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012694 .manufacture_id = SYNCMOS_MVC_ID,
12695 .model_id = SM_MVC_29C51001T,
12696 .total_size = 128,
12697 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000012698 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012699 .tested = TEST_UNTESTED,
12700 .probe = probe_jedec,
12701 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12702 .block_erasers =
12703 {
12704 {
12705 .eraseblocks = { {512, 256} },
12706 .block_erase = erase_sector_jedec,
12707 }, {
12708 .eraseblocks = { {128 * 1024, 1} },
12709 .block_erase = erase_chip_block_jedec,
12710 },
12711 },
12712 .write = write_jedec_1,
12713 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012714 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012715 },
12716
12717 {
12718 .vendor = "SyncMOS/MoselVitelic",
12719 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012720 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012721 .manufacture_id = SYNCMOS_MVC_ID,
12722 .model_id = SM_MVC_29C51002B,
12723 .total_size = 256,
12724 .page_size = 512,
12725 .feature_bits = FEATURE_EITHER_RESET,
12726 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012727 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012728 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012729 .block_erasers =
12730 {
12731 {
12732 .eraseblocks = { {512, 512} },
12733 .block_erase = erase_sector_jedec,
12734 }, {
12735 .eraseblocks = { {256 * 1024, 1} },
12736 .block_erase = erase_chip_block_jedec,
12737 },
12738 },
Sean Nelson35727f72010-01-28 23:55:12 +000012739 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012740 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000012741 },
12742
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012743 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012744 .vendor = "SyncMOS/MoselVitelic",
12745 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012746 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012747 .manufacture_id = SYNCMOS_MVC_ID,
12748 .model_id = SM_MVC_29C51002T,
12749 .total_size = 256,
12750 .page_size = 512,
12751 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012752 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012753 .probe = probe_jedec,
12754 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12755 .block_erasers =
12756 {
12757 {
12758 .eraseblocks = { {512, 512} },
12759 .block_erase = erase_sector_jedec,
12760 }, {
12761 .eraseblocks = { {256 * 1024, 1} },
12762 .block_erase = erase_chip_block_jedec,
12763 },
12764 },
12765 .write = write_jedec_1,
12766 .read = read_memmapped,
12767 },
12768
12769 {
12770 .vendor = "SyncMOS/MoselVitelic",
12771 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012772 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012773 .manufacture_id = SYNCMOS_MVC_ID,
12774 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012775 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012776 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012777 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012778 .tested = TEST_UNTESTED,
12779 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012780 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000012781 .block_erasers =
12782 {
12783 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012784 .eraseblocks = { {1024, 512} },
12785 .block_erase = erase_sector_jedec,
12786 }, {
12787 .eraseblocks = { {512 * 1024, 1} },
12788 .block_erase = erase_chip_block_jedec,
12789 },
12790 },
12791 .write = write_jedec_1,
12792 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012793 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012794 },
12795
12796 {
12797 .vendor = "SyncMOS/MoselVitelic",
12798 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012799 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012800 .manufacture_id = SYNCMOS_MVC_ID,
12801 .model_id = SM_MVC_29C51004T,
12802 .total_size = 512,
12803 .page_size = 1024,
12804 .feature_bits = FEATURE_EITHER_RESET,
12805 .tested = TEST_UNTESTED,
12806 .probe = probe_jedec,
12807 .probe_timing = TIMING_ZERO,
12808 .block_erasers =
12809 {
12810 {
12811 .eraseblocks = { {1024, 512} },
12812 .block_erase = erase_sector_jedec,
12813 }, {
12814 .eraseblocks = { {512 * 1024, 1} },
12815 .block_erase = erase_chip_block_jedec,
12816 },
12817 },
12818 .write = write_jedec_1,
12819 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012820 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012821 },
12822
12823 {
12824 .vendor = "SyncMOS/MoselVitelic",
12825 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012826 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012827 .manufacture_id = SYNCMOS_MVC_ID,
12828 .model_id = SM_MVC_29C31004B,
12829 .total_size = 512,
12830 .page_size = 1024,
12831 .feature_bits = FEATURE_EITHER_RESET,
12832 .tested = TEST_UNTESTED,
12833 .probe = probe_jedec,
12834 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12835 .block_erasers =
12836 {
12837 {
12838 .eraseblocks = { {1024, 512} },
12839 .block_erase = erase_sector_jedec,
12840 }, {
12841 .eraseblocks = { {512 * 1024, 1} },
12842 .block_erase = erase_chip_block_jedec,
12843 },
12844 },
12845 .write = write_jedec_1,
12846 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012847 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012848 },
12849
12850 {
12851 .vendor = "SyncMOS/MoselVitelic",
12852 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012853 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012854 .manufacture_id = SYNCMOS_MVC_ID,
12855 .model_id = SM_MVC_29C31004T,
12856 .total_size = 512,
12857 .page_size = 1024,
12858 .feature_bits = FEATURE_EITHER_RESET,
12859 .tested = TEST_UNTESTED,
12860 .probe = probe_jedec,
12861 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12862 .block_erasers =
12863 {
12864 {
12865 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000012866 .block_erase = erase_sector_jedec,
12867 }, {
12868 .eraseblocks = { {512 * 1024, 1} },
12869 .block_erase = erase_chip_block_jedec,
12870 },
12871 },
Sean Nelson35727f72010-01-28 23:55:12 +000012872 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000012873 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012874 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012875 },
12876
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012877 {
Uwe Hermanna106d152009-05-27 23:17:40 +000012878 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012879 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012880 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012881 .manufacture_id = TI_OLD_ID,
12882 .model_id = TI_TMS29F002RB,
12883 .total_size = 256,
12884 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000012885 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012886 .tested = TEST_UNTESTED,
12887 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012888 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012889 .block_erasers =
12890 {
12891 {
12892 .eraseblocks = {
12893 {16 * 1024, 1},
12894 {8 * 1024, 2},
12895 {32 * 1024, 1},
12896 {64 * 1024, 3},
12897 },
12898 .block_erase = erase_sector_jedec,
12899 }, {
12900 .eraseblocks = { {256 * 1024, 1} },
12901 .block_erase = erase_chip_block_jedec,
12902 },
12903 },
Sean Nelson35727f72010-01-28 23:55:12 +000012904 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012905 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012906 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012907 },
12908
12909 {
Uwe Hermanna106d152009-05-27 23:17:40 +000012910 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012911 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012912 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012913 .manufacture_id = TI_OLD_ID,
12914 .model_id = TI_TMS29F002RT,
12915 .total_size = 256,
12916 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000012917 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012918 .tested = TEST_UNTESTED,
12919 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012920 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000012921 .block_erasers =
12922 {
12923 {
12924 .eraseblocks = {
12925 {64 * 1024, 3},
12926 {32 * 1024, 1},
12927 {8 * 1024, 2},
12928 {16 * 1024, 1},
12929 },
12930 .block_erase = erase_sector_jedec,
12931 }, {
12932 .eraseblocks = { {256 * 1024, 1} },
12933 .block_erase = erase_chip_block_jedec,
12934 },
12935 },
Sean Nelson35727f72010-01-28 23:55:12 +000012936 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012937 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012938 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000012939 },
12940
12941 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012942 .vendor = "Winbond",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000012943 .name = "W25Q40.V",
12944 .bustype = BUS_SPI,
12945 .manufacture_id = WINBOND_NEX_ID,
12946 .model_id = WINBOND_NEX_W25Q40_V,
12947 .total_size = 512,
12948 .page_size = 256,
12949 /* supports SFDP */
12950 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
12951 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12952 .tested = TEST_OK_PR,
12953 .probe = probe_spi_rdid,
12954 .probe_timing = TIMING_ZERO,
12955 .block_erasers =
12956 {
12957 {
12958 .eraseblocks = { {4 * 1024, 128} },
12959 .block_erase = spi_block_erase_20,
12960 }, {
12961 .eraseblocks = { {32 * 1024, 16} },
12962 .block_erase = spi_block_erase_52,
12963 }, {
12964 .eraseblocks = { {64 * 1024, 8} },
12965 .block_erase = spi_block_erase_d8,
12966 }, {
12967 .eraseblocks = { {512 * 1024, 1} },
12968 .block_erase = spi_block_erase_60,
12969 }, {
12970 .eraseblocks = { {512 * 1024, 1} },
12971 .block_erase = spi_block_erase_c7,
12972 }
12973 },
12974 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
12975 .unlock = spi_disable_blockprotect,
12976 .write = spi_chip_write_256, /* Multi I/O supported */
12977 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12978 .voltage = {2700, 3600},
12979 },
12980
12981 {
12982 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012983 .name = "W25Q80.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012984 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012985 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012986 .model_id = WINBOND_NEX_W25Q80_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012987 .total_size = 1024,
12988 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000012989 /* supports SFDP */
12990 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000012991 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000012992 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000012993 .probe = probe_spi_rdid,
12994 .probe_timing = TIMING_ZERO,
12995 .block_erasers =
12996 {
12997 {
12998 .eraseblocks = { {4 * 1024, 256} },
12999 .block_erase = spi_block_erase_20,
13000 }, {
13001 .eraseblocks = { {32 * 1024, 32} },
13002 .block_erase = spi_block_erase_52,
13003 }, {
13004 .eraseblocks = { {64 * 1024, 16} },
13005 .block_erase = spi_block_erase_d8,
13006 }, {
13007 .eraseblocks = { {1024 * 1024, 1} },
13008 .block_erase = spi_block_erase_60,
13009 }, {
13010 .eraseblocks = { {1024 * 1024, 1} },
13011 .block_erase = spi_block_erase_c7,
13012 }
13013 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013014 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013015 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013016 .write = spi_chip_write_256,
13017 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013018 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013019 },
13020
13021 {
13022 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013023 .name = "W25Q16.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013024 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013025 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013026 .model_id = WINBOND_NEX_W25Q16_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013027 .total_size = 2048,
13028 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013029 /* supports SFDP */
13030 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013031 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner716e0982011-07-25 20:38:52 +000013032 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013033 .probe = probe_spi_rdid,
13034 .probe_timing = TIMING_ZERO,
13035 .block_erasers =
13036 {
13037 {
13038 .eraseblocks = { {4 * 1024, 512} },
13039 .block_erase = spi_block_erase_20,
13040 }, {
13041 .eraseblocks = { {32 * 1024, 64} },
13042 .block_erase = spi_block_erase_52,
13043 }, {
13044 .eraseblocks = { {64 * 1024, 32} },
13045 .block_erase = spi_block_erase_d8,
13046 }, {
13047 .eraseblocks = { {2 * 1024 * 1024, 1} },
13048 .block_erase = spi_block_erase_60,
13049 }, {
13050 .eraseblocks = { {2 * 1024 * 1024, 1} },
13051 .block_erase = spi_block_erase_c7,
13052 }
13053 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013054 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013055 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013056 .write = spi_chip_write_256,
13057 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013058 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013059 },
13060
13061 {
13062 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013063 .name = "W25Q32.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013064 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013065 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013066 .model_id = WINBOND_NEX_W25Q32_V,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013067 .total_size = 4096,
13068 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013069 /* supports SFDP */
13070 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000013072 .tested = TEST_OK_PREW,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013073 .probe = probe_spi_rdid,
13074 .probe_timing = TIMING_ZERO,
13075 .block_erasers =
13076 {
13077 {
13078 .eraseblocks = { {4 * 1024, 1024} },
13079 .block_erase = spi_block_erase_20,
13080 }, {
13081 .eraseblocks = { {32 * 1024, 128} },
13082 .block_erase = spi_block_erase_52,
13083 }, {
13084 .eraseblocks = { {64 * 1024, 64} },
13085 .block_erase = spi_block_erase_d8,
13086 }, {
13087 .eraseblocks = { {4 * 1024 * 1024, 1} },
13088 .block_erase = spi_block_erase_60,
13089 }, {
13090 .eraseblocks = { {4 * 1024 * 1024, 1} },
13091 .block_erase = spi_block_erase_c7,
13092 }
13093 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013094 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013095 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000013096 .write = spi_chip_write_256,
13097 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013098 .voltage = {2700, 3600},
Rudolf Marekce1c7982010-04-20 19:34:31 +000013099 },
13100
13101 {
13102 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013103 .name = "W25Q64.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013104 .bustype = BUS_SPI,
David Hendricksc4acec92010-06-24 11:39:57 +000013105 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013106 .model_id = WINBOND_NEX_W25Q64_V,
David Hendricksc4acec92010-06-24 11:39:57 +000013107 .total_size = 8192,
13108 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013109 /* supports SFDP */
13110 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013111 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks22e05322010-12-13 23:54:59 +000013112 .tested = TEST_OK_PREW,
David Hendricksc4acec92010-06-24 11:39:57 +000013113 .probe = probe_spi_rdid,
13114 .probe_timing = TIMING_ZERO,
13115 .block_erasers =
13116 {
13117 {
13118 .eraseblocks = { {4 * 1024, 2048} },
13119 .block_erase = spi_block_erase_20,
13120 }, {
13121 .eraseblocks = { {32 * 1024, 256} },
13122 .block_erase = spi_block_erase_52,
13123 }, {
13124 .eraseblocks = { {64 * 1024, 128} },
13125 .block_erase = spi_block_erase_d8,
13126 }, {
13127 .eraseblocks = { {8 * 1024 * 1024, 1} },
13128 .block_erase = spi_block_erase_60,
13129 }, {
13130 .eraseblocks = { {8 * 1024 * 1024, 1} },
13131 .block_erase = spi_block_erase_c7,
13132 }
13133 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013134 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013135 .unlock = spi_disable_blockprotect,
David Hendricksc4acec92010-06-24 11:39:57 +000013136 .write = spi_chip_write_256,
13137 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013138 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000013139 },
13140
13141 {
13142 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013143 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013144 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013145 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013146 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013147 .total_size = 16384,
13148 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013149 /* supports SFDP */
13150 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Daniel Lenski65922a32012-02-15 23:40:23 +000013151 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013152 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013153 .probe = probe_spi_rdid,
13154 .probe_timing = TIMING_ZERO,
13155 .block_erasers =
13156 {
13157 {
13158 .eraseblocks = { {4 * 1024, 4096} },
13159 .block_erase = spi_block_erase_20,
13160 }, {
13161 .eraseblocks = { {32 * 1024, 512} },
13162 .block_erase = spi_block_erase_52,
13163 }, {
13164 .eraseblocks = { {64 * 1024, 256} },
13165 .block_erase = spi_block_erase_d8,
13166 }, {
13167 .eraseblocks = { {16 * 1024 * 1024, 1} },
13168 .block_erase = spi_block_erase_60,
13169 }, {
13170 .eraseblocks = { {16 * 1024 * 1024, 1} },
13171 .block_erase = spi_block_erase_c7,
13172 }
13173 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013174 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000013175 .unlock = spi_disable_blockprotect,
13176 .write = spi_chip_write_256,
13177 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013178 .voltage = {2700, 3600},
13179 },
13180
13181 {
13182 .vendor = "Winbond",
13183 .name = "W25Q20.W",
13184 .bustype = BUS_SPI,
13185 .manufacture_id = WINBOND_NEX_ID,
13186 .model_id = WINBOND_NEX_W25Q20_W,
13187 .total_size = 256,
13188 .page_size = 256,
13189 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13190 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13191 .tested = TEST_UNTESTED,
13192 .probe = probe_spi_rdid,
13193 .probe_timing = TIMING_ZERO,
13194 .block_erasers =
13195 {
13196 {
13197 .eraseblocks = { {4 * 1024, 64} },
13198 .block_erase = spi_block_erase_20,
13199 }, {
13200 .eraseblocks = { {32 * 1024, 8} },
13201 .block_erase = spi_block_erase_52,
13202 }, {
13203 .eraseblocks = { {64 * 1024, 4} },
13204 .block_erase = spi_block_erase_d8,
13205 }, {
13206 .eraseblocks = { {256 * 1024, 1} },
13207 .block_erase = spi_block_erase_60,
13208 }, {
13209 .eraseblocks = { {256 * 1024, 1} },
13210 .block_erase = spi_block_erase_c7,
13211 }
13212 },
13213 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13214 .unlock = spi_disable_blockprotect,
13215 .write = spi_chip_write_256,
13216 .read = spi_chip_read,
13217 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13218 },
13219
13220 {
13221 .vendor = "Winbond",
13222 .name = "W25Q40.W",
13223 .bustype = BUS_SPI,
13224 .manufacture_id = WINBOND_NEX_ID,
13225 .model_id = WINBOND_NEX_W25Q40_W,
13226 .total_size = 512,
13227 .page_size = 256,
13228 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13229 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13230 .tested = TEST_UNTESTED,
13231 .probe = probe_spi_rdid,
13232 .probe_timing = TIMING_ZERO,
13233 .block_erasers =
13234 {
13235 {
13236 .eraseblocks = { {4 * 1024, 128} },
13237 .block_erase = spi_block_erase_20,
13238 }, {
13239 .eraseblocks = { {32 * 1024, 16} },
13240 .block_erase = spi_block_erase_52,
13241 }, {
13242 .eraseblocks = { {64 * 1024, 8} },
13243 .block_erase = spi_block_erase_d8,
13244 }, {
13245 .eraseblocks = { {512 * 1024, 1} },
13246 .block_erase = spi_block_erase_60,
13247 }, {
13248 .eraseblocks = { {512 * 1024, 1} },
13249 .block_erase = spi_block_erase_c7,
13250 }
13251 },
13252 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13253 .unlock = spi_disable_blockprotect,
13254 .write = spi_chip_write_256,
13255 .read = spi_chip_read,
13256 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13257 },
13258
13259 {
13260 .vendor = "Winbond",
13261 .name = "W25Q80.W",
13262 .bustype = BUS_SPI,
13263 .manufacture_id = WINBOND_NEX_ID,
13264 .model_id = WINBOND_NEX_W25Q80_W,
13265 .total_size = 1024,
13266 .page_size = 256,
13267 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13268 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13269 .tested = TEST_UNTESTED,
13270 .probe = probe_spi_rdid,
13271 .probe_timing = TIMING_ZERO,
13272 .block_erasers =
13273 {
13274 {
13275 .eraseblocks = { {4 * 1024, 256} },
13276 .block_erase = spi_block_erase_20,
13277 }, {
13278 .eraseblocks = { {32 * 1024, 32} },
13279 .block_erase = spi_block_erase_52,
13280 }, {
13281 .eraseblocks = { {64 * 1024, 16} },
13282 .block_erase = spi_block_erase_d8,
13283 }, {
13284 .eraseblocks = { {1 * 1024 * 1024, 1} },
13285 .block_erase = spi_block_erase_60,
13286 }, {
13287 .eraseblocks = { {1 * 1024 * 1024, 1} },
13288 .block_erase = spi_block_erase_c7,
13289 }
13290 },
13291 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13292 .unlock = spi_disable_blockprotect,
13293 .write = spi_chip_write_256,
13294 .read = spi_chip_read,
13295 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13296 },
13297
13298 {
13299 .vendor = "Winbond",
13300 .name = "W25Q16.W",
13301 .bustype = BUS_SPI,
13302 .manufacture_id = WINBOND_NEX_ID,
13303 .model_id = WINBOND_NEX_W25Q16_W,
13304 .total_size = 2048,
13305 .page_size = 256,
13306 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13307 /* QPI enable 0x38, disable 0xFF */
13308 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
13309 .tested = TEST_UNTESTED,
13310 .probe = probe_spi_rdid,
13311 .probe_timing = TIMING_ZERO,
13312 .block_erasers =
13313 {
13314 {
13315 .eraseblocks = { {4 * 1024, 512} },
13316 .block_erase = spi_block_erase_20,
13317 }, {
13318 .eraseblocks = { {32 * 1024, 64} },
13319 .block_erase = spi_block_erase_52,
13320 }, {
13321 .eraseblocks = { {64 * 1024, 32} },
13322 .block_erase = spi_block_erase_d8,
13323 }, {
13324 .eraseblocks = { {2 * 1024 * 1024, 1} },
13325 .block_erase = spi_block_erase_60,
13326 }, {
13327 .eraseblocks = { {2 * 1024 * 1024, 1} },
13328 .block_erase = spi_block_erase_c7,
13329 }
13330 },
13331 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13332 .unlock = spi_disable_blockprotect,
13333 .write = spi_chip_write_256,
13334 .read = spi_chip_read,
13335 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13336 },
13337
13338 {
13339 .vendor = "Winbond",
13340 .name = "W25Q32.W",
13341 .bustype = BUS_SPI,
13342 .manufacture_id = WINBOND_NEX_ID,
13343 .model_id = WINBOND_NEX_W25Q32_W,
13344 .total_size = 4096,
13345 .page_size = 256,
13346 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13347 /* QPI enable 0x38, disable 0xFF */
13348 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
13349 .tested = TEST_OK_PREW,
13350 .probe = probe_spi_rdid,
13351 .probe_timing = TIMING_ZERO,
13352 .block_erasers =
13353 {
13354 {
13355 .eraseblocks = { {4 * 1024, 1024} },
13356 .block_erase = spi_block_erase_20,
13357 }, {
13358 .eraseblocks = { {32 * 1024, 128} },
13359 .block_erase = spi_block_erase_52,
13360 }, {
13361 .eraseblocks = { {64 * 1024, 64} },
13362 .block_erase = spi_block_erase_d8,
13363 }, {
13364 .eraseblocks = { {4 * 1024 * 1024, 1} },
13365 .block_erase = spi_block_erase_60,
13366 }, {
13367 .eraseblocks = { {4 * 1024 * 1024, 1} },
13368 .block_erase = spi_block_erase_c7,
13369 }
13370 },
13371 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13372 .unlock = spi_disable_blockprotect,
13373 .write = spi_chip_write_256,
13374 .read = spi_chip_read,
13375 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
13376 },
13377
13378 {
13379 .vendor = "Winbond",
13380 .name = "W25Q64.W",
13381 .bustype = BUS_SPI,
13382 .manufacture_id = WINBOND_NEX_ID,
13383 .model_id = WINBOND_NEX_W25Q64_W,
13384 .total_size = 8192,
13385 .page_size = 256,
13386 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
13387 /* QPI enable 0x38, disable 0xFF */
13388 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013389 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000013390 .probe = probe_spi_rdid,
13391 .probe_timing = TIMING_ZERO,
13392 .block_erasers =
13393 {
13394 {
13395 .eraseblocks = { {4 * 1024, 2048} },
13396 .block_erase = spi_block_erase_20,
13397 }, {
13398 .eraseblocks = { {32 * 1024, 256} },
13399 .block_erase = spi_block_erase_52,
13400 }, {
13401 .eraseblocks = { {64 * 1024, 128} },
13402 .block_erase = spi_block_erase_d8,
13403 }, {
13404 .eraseblocks = { {8 * 1024 * 1024, 1} },
13405 .block_erase = spi_block_erase_60,
13406 }, {
13407 .eraseblocks = { {8 * 1024 * 1024, 1} },
13408 .block_erase = spi_block_erase_c7,
13409 }
13410 },
13411 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13412 .unlock = spi_disable_blockprotect,
13413 .write = spi_chip_write_256,
13414 .read = spi_chip_read,
13415 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Antony Rheneus0fbba982011-05-26 14:28:51 +000013416 },
13417
13418 {
13419 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013420 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013421 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013422 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013423 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013424 .total_size = 128,
13425 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013426 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013427 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013428 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013429 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013430 .block_erasers =
13431 {
13432 {
13433 .eraseblocks = { {4 * 1024, 32} },
13434 .block_erase = spi_block_erase_20,
13435 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013436 .eraseblocks = { {64 * 1024, 2} },
13437 .block_erase = spi_block_erase_d8,
13438 }, {
13439 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013440 .block_erase = spi_block_erase_c7,
13441 }
13442 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013443 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013444 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013445 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013446 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013447 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013448 },
13449
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013450 {
13451 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013452 .name = "W25X20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013453 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013454 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013455 .model_id = WINBOND_NEX_W25X20,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013456 .total_size = 256,
13457 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013458 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013459 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013460 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013461 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013462 .block_erasers =
13463 {
13464 {
13465 .eraseblocks = { {4 * 1024, 64} },
13466 .block_erase = spi_block_erase_20,
13467 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013468 .eraseblocks = { {64 * 1024, 4} },
13469 .block_erase = spi_block_erase_d8,
13470 }, {
13471 .eraseblocks = { {256 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013472 .block_erase = spi_block_erase_c7,
13473 }
13474 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013475 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013476 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013477 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013478 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013479 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013480 },
13481
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013482 {
13483 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013484 .name = "W25X40",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013485 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013486 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013487 .model_id = WINBOND_NEX_W25X40,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013488 .total_size = 512,
13489 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013490 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks567b7b82011-05-18 01:31:03 +000013491 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013492 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013493 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013494 .block_erasers =
13495 {
13496 {
13497 .eraseblocks = { {4 * 1024, 128} },
13498 .block_erase = spi_block_erase_20,
13499 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013500 .eraseblocks = { {64 * 1024, 8} },
13501 .block_erase = spi_block_erase_d8,
13502 }, {
13503 .eraseblocks = { {512 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013504 .block_erase = spi_block_erase_c7,
13505 }
13506 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013507 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013508 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013509 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013510 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013511 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013512 },
13513
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013514 {
13515 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013516 .name = "W25X80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013517 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013518 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013519 .model_id = WINBOND_NEX_W25X80,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013520 .total_size = 1024,
13521 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013522 .feature_bits = FEATURE_WRSR_WREN,
Yul Rottmann6d6ab742011-03-05 16:31:57 +000013523 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013524 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013525 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013526 .block_erasers =
13527 {
13528 {
13529 .eraseblocks = { {4 * 1024, 256} },
13530 .block_erase = spi_block_erase_20,
13531 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013532 .eraseblocks = { {64 * 1024, 16} },
13533 .block_erase = spi_block_erase_d8,
13534 }, {
13535 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013536 .block_erase = spi_block_erase_c7,
13537 }
13538 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013539 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013540 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013541 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013542 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013543 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013544 },
13545
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013546 {
13547 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013548 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013549 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000013550 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013551 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000013552 .total_size = 2048,
13553 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013554 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000013555 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000013556 .probe = probe_spi_rdid,
13557 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013558 .block_erasers =
13559 {
13560 {
13561 .eraseblocks = { {4 * 1024, 512} },
13562 .block_erase = spi_block_erase_20,
13563 }, {
13564 .eraseblocks = { {32 * 1024, 64} },
13565 .block_erase = spi_block_erase_52,
13566 }, {
13567 .eraseblocks = { {64 * 1024, 32} },
13568 .block_erase = spi_block_erase_d8,
13569 }, {
13570 .eraseblocks = { {2 * 1024 * 1024, 1} },
13571 .block_erase = spi_block_erase_60,
13572 }, {
13573 .eraseblocks = { {2 * 1024 * 1024, 1} },
13574 .block_erase = spi_block_erase_c7,
13575 }
13576 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013577 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013578 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000013579 .write = spi_chip_write_256,
13580 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013581 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000013582 },
13583
13584 {
13585 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013586 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013587 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000013588 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013589 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000013590 .total_size = 4096,
13591 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013592 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013593 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000013594 .probe = probe_spi_rdid,
13595 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013596 .block_erasers =
13597 {
13598 {
13599 .eraseblocks = { {4 * 1024, 1024} },
13600 .block_erase = spi_block_erase_20,
13601 }, {
13602 .eraseblocks = { {32 * 1024, 128} },
13603 .block_erase = spi_block_erase_52,
13604 }, {
13605 .eraseblocks = { {64 * 1024, 64} },
13606 .block_erase = spi_block_erase_d8,
13607 }, {
13608 .eraseblocks = { {4 * 1024 * 1024, 1} },
13609 .block_erase = spi_block_erase_60,
13610 }, {
13611 .eraseblocks = { {4 * 1024 * 1024, 1} },
13612 .block_erase = spi_block_erase_c7,
13613 }
13614 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013615 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013616 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000013617 .write = spi_chip_write_256,
13618 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013619 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000013620 },
13621
13622 {
13623 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013624 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013625 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000013626 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013627 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000013628 .total_size = 8192,
13629 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000013630 .feature_bits = FEATURE_WRSR_WREN,
Antony Rheneus0fbba982011-05-26 14:28:51 +000013631 .tested = TEST_OK_PROBE,
Zheng Bao1db2b752009-11-26 11:05:01 +000013632 .probe = probe_spi_rdid,
13633 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013634 .block_erasers =
13635 {
13636 {
13637 .eraseblocks = { {4 * 1024, 2048} },
13638 .block_erase = spi_block_erase_20,
13639 }, {
13640 .eraseblocks = { {32 * 1024, 256} },
13641 .block_erase = spi_block_erase_52,
13642 }, {
13643 .eraseblocks = { {64 * 1024, 128} },
13644 .block_erase = spi_block_erase_d8,
13645 }, {
13646 .eraseblocks = { {8 * 1024 * 1024, 1} },
13647 .block_erase = spi_block_erase_60,
13648 }, {
13649 .eraseblocks = { {8 * 1024 * 1024, 1} },
13650 .block_erase = spi_block_erase_c7,
13651 }
13652 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013653 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013654 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000013655 .write = spi_chip_write_256,
13656 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013657 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000013658 },
13659
13660 {
13661 .vendor = "Winbond",
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000013662 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013663 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000013664 .manufacture_id = WINBOND_ID,
13665 .model_id = WINBOND_W29C010,
13666 .total_size = 128,
13667 .page_size = 128,
13668 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013669 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000013670 .probe = probe_w29ee011,
13671 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
13672 .block_erasers =
13673 {
13674 {
13675 .eraseblocks = { {128 * 1024, 1} },
13676 .block_erase = erase_chip_block_jedec,
13677 }
13678 },
13679 .write = write_jedec,
13680 .read = read_memmapped,
13681 },
13682
13683 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
13684 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013685 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013686 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013687 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013688 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013689 .total_size = 128,
13690 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013691 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000013692 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013693 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013694 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013695 .block_erasers =
13696 {
13697 {
13698 .eraseblocks = { {128 * 1024, 1} },
13699 .block_erase = erase_chip_block_jedec,
13700 }
13701 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013702 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013703 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000013704 },
13705
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013706 {
13707 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013708 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013709 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013710 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013711 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013712 .total_size = 256,
13713 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000013714 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013715 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013716 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000013717 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013718 .block_erasers =
13719 {
13720 {
13721 .eraseblocks = { {256 * 1024, 1} },
13722 .block_erase = erase_chip_block_jedec,
13723 }
13724 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013725 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013726 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013727 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013728 },
13729
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013730 {
13731 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000013732 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013733 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013734 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000013735 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013736 .total_size = 512,
13737 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000013738 .feature_bits = FEATURE_LONG_RESET,
13739 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013740 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000013741 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000013742 .block_erasers =
13743 {
13744 {
13745 .eraseblocks = { {512 * 1024, 1} },
13746 .block_erase = erase_chip_block_jedec,
13747 }
13748 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013749 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013750 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013751 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000013752 },
13753
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013754 {
13755 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000013756 .name = "W29GL032CB",
13757 .bustype = BUS_PARALLEL,
13758 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13759 .model_id = WINBOND_W29GL032CB,
13760 .total_size = 4096,
13761 .page_size = 128 * 1024, /* actual page size is 16 */
13762 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13763 .tested = TEST_UNTESTED,
13764 .probe = probe_jedec_29gl,
13765 .probe_timing = TIMING_ZERO,
13766 .block_erasers =
13767 {
13768 {
13769 .eraseblocks = {
13770 {8 * 1024, 8},
13771 {64 * 1024, 63},
13772 },
13773 .block_erase = erase_sector_jedec,
13774 }, {
13775 .eraseblocks = { {4 * 1024 * 1024, 1} },
13776 .block_erase = erase_chip_block_jedec,
13777 },
13778 },
13779 .write = write_jedec_1,
13780 .read = read_memmapped,
13781 .voltage = {2700, 3600},
13782 },
13783
13784 {
13785 .vendor = "Winbond",
13786 .name = "W29GL032CT",
13787 .bustype = BUS_PARALLEL,
13788 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13789 .model_id = WINBOND_W29GL032CT,
13790 .total_size = 4096,
13791 .page_size = 128 * 1024, /* actual page size is 16 */
13792 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13793 .tested = TEST_UNTESTED,
13794 .probe = probe_jedec_29gl,
13795 .probe_timing = TIMING_ZERO,
13796 .block_erasers =
13797 {
13798 {
13799 .eraseblocks = {
13800 {64 * 1024, 63},
13801 {8 * 1024, 8},
13802 },
13803 .block_erase = erase_sector_jedec,
13804 }, {
13805 .eraseblocks = { {4 * 1024 * 1024, 1} },
13806 .block_erase = erase_chip_block_jedec,
13807 },
13808 },
13809 .write = write_jedec_1,
13810 .read = read_memmapped,
13811 .voltage = {2700, 3600},
13812 },
13813
13814 {
13815 .vendor = "Winbond",
13816 .name = "W29GL032CH/L",
13817 .bustype = BUS_PARALLEL,
13818 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13819 .model_id = WINBOND_W29GL032CHL,
13820 .total_size = 4096,
13821 .page_size = 128 * 1024, /* actual page size is 16 */
13822 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13823 .tested = TEST_UNTESTED,
13824 .probe = probe_jedec_29gl,
13825 .probe_timing = TIMING_ZERO,
13826 .block_erasers =
13827 {
13828 {
13829 .eraseblocks = { {64 * 1024, 64} },
13830 .block_erase = erase_sector_jedec,
13831 }, {
13832 .eraseblocks = { {4 * 1024 * 1024, 1} },
13833 .block_erase = erase_chip_block_jedec,
13834 },
13835 },
13836 .write = write_jedec_1,
13837 .read = read_memmapped,
13838 .voltage = {2700, 3600},
13839 },
13840
13841 {
13842 .vendor = "Winbond",
13843 .name = "W29GL064CB",
13844 .bustype = BUS_PARALLEL,
13845 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13846 .model_id = WINBOND_W29GL064CB,
13847 .total_size = 8192,
13848 .page_size = 128 * 1024, /* actual page size is 16 */
13849 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13850 .tested = TEST_UNTESTED,
13851 .probe = probe_jedec_29gl,
13852 .probe_timing = TIMING_ZERO,
13853 .block_erasers =
13854 {
13855 {
13856 .eraseblocks = {
13857 {8 * 1024, 8},
13858 {64 * 1024, 127},
13859 },
13860 .block_erase = erase_sector_jedec,
13861 }, {
13862 .eraseblocks = { {8 * 1024 * 1024, 1} },
13863 .block_erase = erase_chip_block_jedec,
13864 },
13865 },
13866 .write = write_jedec_1,
13867 .read = read_memmapped,
13868 .voltage = {2700, 3600},
13869 },
13870
13871 {
13872 .vendor = "Winbond",
13873 .name = "W29GL064CT",
13874 .bustype = BUS_PARALLEL,
13875 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13876 .model_id = WINBOND_W29GL064CT,
13877 .total_size = 8192,
13878 .page_size = 128 * 1024, /* actual page size is 16 */
13879 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13880 .tested = TEST_UNTESTED,
13881 .probe = probe_jedec_29gl,
13882 .probe_timing = TIMING_ZERO,
13883 .block_erasers =
13884 {
13885 {
13886 .eraseblocks = {
13887 {64 * 1024, 127},
13888 {8 * 1024, 8},
13889 },
13890 .block_erase = erase_sector_jedec,
13891 }, {
13892 .eraseblocks = { {8 * 1024 * 1024, 1} },
13893 .block_erase = erase_chip_block_jedec,
13894 },
13895 },
13896 .write = write_jedec_1,
13897 .read = read_memmapped,
13898 .voltage = {2700, 3600},
13899 },
13900
13901 {
13902 .vendor = "Winbond",
13903 .name = "W29GL064CH/L",
13904 .bustype = BUS_PARALLEL,
13905 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13906 .model_id = WINBOND_W29GL064CHL,
13907 .total_size = 8192,
13908 .page_size = 128 * 1024, /* actual page size is 16 */
13909 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13910 .tested = TEST_UNTESTED,
13911 .probe = probe_jedec_29gl,
13912 .probe_timing = TIMING_ZERO,
13913 .block_erasers =
13914 {
13915 {
13916 .eraseblocks = { {64 * 1024, 128} },
13917 .block_erase = erase_sector_jedec,
13918 }, {
13919 .eraseblocks = { {8 * 1024 * 1024, 1} },
13920 .block_erase = erase_chip_block_jedec,
13921 },
13922 },
13923 .write = write_jedec_1,
13924 .read = read_memmapped,
13925 .voltage = {2700, 3600},
13926 },
13927
13928 {
13929 .vendor = "Winbond",
13930 .name = "W29GL128C",
13931 .bustype = BUS_PARALLEL,
13932 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
13933 .model_id = WINBOND_W29GL128CHL,
13934 .total_size = 16384,
13935 .page_size = 128 * 1024, /* actual page size is 16 */
13936 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
13937 .tested = TEST_UNTESTED,
13938 .probe = probe_jedec_29gl,
13939 .probe_timing = TIMING_ZERO,
13940 .block_erasers =
13941 {
13942 {
13943 .eraseblocks = { {128 * 1024, 128} },
13944 .block_erase = erase_sector_jedec,
13945 }, {
13946 .eraseblocks = { {16 * 1024 * 1024, 1} },
13947 .block_erase = erase_chip_block_jedec,
13948 },
13949 },
13950 .write = write_jedec_1,
13951 .read = read_memmapped,
13952 .voltage = {2700, 3600},
13953 },
13954
13955 {
13956 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000013957 .name = "W39F010",
13958 .bustype = BUS_PARALLEL,
13959 .manufacture_id = WINBOND_ID,
13960 .model_id = WINBOND_W39F010,
13961 .total_size = 128,
13962 .page_size = 4 * 1024,
13963 .feature_bits = FEATURE_EITHER_RESET,
13964 .tested = TEST_OK_PREW,
13965 .probe = probe_jedec,
13966 .probe_timing = 10,
13967 .block_erasers =
13968 {
13969 {
13970 .eraseblocks = { {4 * 1024, 32} },
13971 .block_erase = erase_block_jedec,
13972 }, {
13973 .eraseblocks = { {128 * 1024, 1} },
13974 .block_erase = erase_chip_block_jedec,
13975 }
13976 },
13977 .printlock = printlock_w39f010,
13978 .write = write_jedec_1,
13979 .read = read_memmapped,
13980 .voltage = {4500, 5500},
13981 },
13982
13983 {
13984 .vendor = "Winbond",
13985 .name = "W39L010",
13986 .bustype = BUS_PARALLEL,
13987 .manufacture_id = WINBOND_ID,
13988 .model_id = WINBOND_W39L010,
13989 .total_size = 128,
13990 .page_size = 4 * 1024,
13991 .feature_bits = FEATURE_EITHER_RESET,
13992 .tested = TEST_UNTESTED,
13993 .probe = probe_jedec,
13994 .probe_timing = 10,
13995 .block_erasers =
13996 {
13997 {
13998 .eraseblocks = { {4 * 1024, 32} },
13999 .block_erase = erase_block_jedec,
14000 }, {
14001 .eraseblocks = { {128 * 1024, 1} },
14002 .block_erase = erase_chip_block_jedec,
14003 }
14004 },
14005 .printlock = printlock_w39l010,
14006 .write = write_jedec_1,
14007 .read = read_memmapped,
14008 .voltage = {3000, 3600},
14009 },
14010
14011 {
14012 .vendor = "Winbond",
14013 .name = "W39L020",
14014 .bustype = BUS_PARALLEL,
14015 .manufacture_id = WINBOND_ID,
14016 .model_id = WINBOND_W39L020,
14017 .total_size = 256,
14018 .page_size = 4 * 1024,
14019 .feature_bits = FEATURE_EITHER_RESET,
14020 .tested = TEST_UNTESTED,
14021 .probe = probe_jedec,
14022 .probe_timing = 10,
14023 .block_erasers =
14024 {
14025 {
14026 .eraseblocks = { {4 * 1024, 64} },
14027 .block_erase = erase_block_jedec,
14028 }, {
14029 .eraseblocks = { {64 * 1024, 4} },
14030 .block_erase = erase_sector_jedec,
14031 }, {
14032 .eraseblocks = { {256 * 1024, 1} },
14033 .block_erase = erase_chip_block_jedec,
14034 }
14035 },
14036 .printlock = printlock_w39l020,
14037 .write = write_jedec_1,
14038 .read = read_memmapped,
14039 .voltage = {3000, 3600},
14040 },
14041
14042 {
14043 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000014044 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014045 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000014046 .manufacture_id = WINBOND_ID,
14047 .model_id = WINBOND_W39L040,
14048 .total_size = 512,
14049 .page_size = 64 * 1024,
14050 .feature_bits = FEATURE_EITHER_RESET,
14051 .tested = TEST_OK_PR,
14052 .probe = probe_jedec,
14053 .probe_timing = 10,
14054 .block_erasers =
14055 {
14056 {
14057 .eraseblocks = { {4 * 1024, 128} },
14058 .block_erase = erase_block_jedec,
14059 }, {
14060 .eraseblocks = { {64 * 1024, 8} },
14061 .block_erase = erase_sector_jedec,
14062 }, {
14063 .eraseblocks = { {512 * 1024, 1} },
14064 .block_erase = erase_chip_block_jedec,
14065 }
14066 },
14067 .printlock = printlock_w39l040,
14068 .write = write_jedec_1,
14069 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014070 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000014071 },
14072
14073 {
14074 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014075 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014076 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014077 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014078 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014079 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014080 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014081 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000014082 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014083 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000014084 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014085 .block_erasers =
14086 {
14087 {
14088 .eraseblocks = { {64 * 1024, 8} },
14089 .block_erase = erase_sector_jedec,
14090 }, {
14091 .eraseblocks = { {512 * 1024, 1} },
14092 .block_erase = erase_chip_block_jedec,
14093 }
14094 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014095 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000014096 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014097 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014098 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014099 },
14100
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014101 {
14102 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014103 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014104 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014105 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014106 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014107 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014108 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014109 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014110 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014111 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000014112 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014113 .block_erasers =
14114 {
14115 {
14116 .eraseblocks = { {64 * 1024, 8} },
14117 .block_erase = erase_sector_jedec,
14118 }, {
14119 .eraseblocks = { {512 * 1024, 1} },
14120 .block_erase = erase_chip_block_jedec,
14121 }
14122 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014123 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000014124 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014125 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014126 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014127 },
14128
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014129 {
14130 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014131 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014132 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014133 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014134 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014135 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014136 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014137 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014138 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000014139 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014140 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014141 .block_erasers =
14142 {
14143 {
14144 .eraseblocks = { {64 * 1024, 8} },
14145 .block_erase = erase_sector_jedec,
14146 }, {
14147 .eraseblocks = { {512 * 1024, 1} },
14148 .block_erase = erase_chip_block_jedec,
14149 }
14150 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000014151 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000014152 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014153 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014154 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014155 },
14156
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014157 {
14158 .vendor = "Winbond",
14159 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014160 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014161 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014162 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014163 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014164 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000014165 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014166 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014167 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000014168 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014169 .block_erasers =
14170 {
14171 {
14172 .eraseblocks = { {4 * 1024, 128} },
14173 .block_erase = erase_block_jedec,
14174 }, {
14175 .eraseblocks = { {64 * 1024, 8} },
14176 .block_erase = erase_sector_jedec,
14177 }, {
14178 .eraseblocks = { {512 * 1024, 1} },
14179 .block_erase = erase_chip_block_jedec,
14180 }
14181 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014182 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014183 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014184 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014185 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014186 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014187 },
14188
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014189 {
14190 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014191 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014192 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014193 .manufacture_id = WINBOND_ID,
14194 .model_id = WINBOND_W39V040B,
14195 .total_size = 512,
14196 .page_size = 64 * 1024,
14197 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014198 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014199 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014200 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014201 .block_erasers =
14202 {
14203 {
14204 .eraseblocks = { {64 * 1024, 8} },
14205 .block_erase = erase_sector_jedec,
14206 }, {
14207 .eraseblocks = { {512 * 1024, 1} },
14208 .block_erase = erase_chip_block_jedec,
14209 }
14210 },
14211 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014212 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014213 .write = write_jedec_1,
14214 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014215 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014216 },
14217
14218 {
14219 .vendor = "Winbond",
14220 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014221 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014222 .manufacture_id = WINBOND_ID,
14223 .model_id = WINBOND_W39V040C,
14224 .total_size = 512,
14225 .page_size = 64 * 1024,
14226 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000014227 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014228 .probe = probe_jedec,
14229 .probe_timing = 10,
14230 .block_erasers =
14231 {
14232 {
14233 .eraseblocks = { {64 * 1024, 8} },
14234 .block_erase = erase_sector_jedec,
14235 }, {
14236 .eraseblocks = { {512 * 1024, 1} },
14237 .block_erase = erase_chip_block_jedec,
14238 }
14239 },
14240 .printlock = printlock_w39v040fc,
14241 .write = write_jedec_1,
14242 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014243 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014244 },
14245
14246 {
14247 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014248 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014249 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014250 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014251 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014252 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000014253 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014254 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000014255 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014256 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000014257 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014258 .block_erasers =
14259 {
14260 {
14261 .eraseblocks = { {64 * 1024, 16} },
14262 .block_erase = erase_sector_jedec,
14263 }, {
14264 .eraseblocks = { {1024 * 1024, 1} },
14265 .block_erase = erase_chip_block_jedec,
14266 }
14267 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014268 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000014269 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014270 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014271 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014272 },
14273
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014274 {
14275 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000014276 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014277 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014278 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014279 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014280 .total_size = 256,
14281 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014282 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000014283 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014284 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014285 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014286 .block_erasers =
14287 {
14288 {
14289 .eraseblocks = {
14290 {128 * 1024, 1},
14291 {96 * 1024, 1},
14292 {8 * 1024, 2},
14293 {16 * 1024, 1},
14294 },
14295 .block_erase = erase_sector_jedec,
14296 }, {
14297 .eraseblocks = { {256 * 1024, 1} },
14298 .block_erase = erase_chip_block_jedec,
14299 }
14300 },
Sean Nelson35727f72010-01-28 23:55:12 +000014301 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014302 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014303 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014304 },
14305
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014306 {
14307 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014308 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014309 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014310 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014311 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014312 .total_size = 256,
14313 .page_size = 128,
14314 .feature_bits = FEATURE_EITHER_RESET,
14315 .tested = TEST_OK_PROBE,
14316 .probe = probe_jedec,
14317 .probe_timing = 10,
14318 .block_erasers =
14319 {
14320 {
14321 .eraseblocks = { {256 * 1024, 1} },
14322 .block_erase = erase_chip_block_jedec,
14323 }
14324 },
14325 .write = write_jedec_1,
14326 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014327 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000014328 },
14329
14330 {
14331 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014332 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014333 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014334 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014335 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014336 .total_size = 256,
14337 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014338 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014339 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014340 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014341 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014342 .block_erasers =
14343 {
14344 {
14345 .eraseblocks = {
14346 {64 * 1024, 3},
14347 {32 * 1024, 1},
14348 {8 * 1024, 2},
14349 {16 * 1024, 1},
14350 },
14351 .block_erase = erase_sector_jedec,
14352 }, {
14353 .eraseblocks = { {256 * 1024, 1} },
14354 .block_erase = erase_chip_block_jedec,
14355 }
14356 },
Sean Nelson35727f72010-01-28 23:55:12 +000014357 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014358 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014359 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014360 },
14361
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014362 {
14363 .vendor = "Winbond",
14364 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014365 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014366 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014367 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014368 .total_size = 256,
14369 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014370 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014371 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014372 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014373 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014374 .block_erasers =
14375 {
14376 {
14377 .eraseblocks = {
14378 {64 * 1024, 3},
14379 {32 * 1024, 1},
14380 {8 * 1024, 2},
14381 {16 * 1024, 1},
14382 },
14383 .block_erase = erase_sector_jedec,
14384 }, {
14385 .eraseblocks = { {256 * 1024, 1} },
14386 .block_erase = erase_chip_block_jedec,
14387 }
14388 },
Sean Nelson35727f72010-01-28 23:55:12 +000014389 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014390 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014391 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014392 },
14393
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014394 {
14395 .vendor = "Winbond",
14396 .name = "W39V080FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014397 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014398 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014399 .model_id = WINBOND_W39V080FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014400 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000014401 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014402 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014403 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014404 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014405 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014406 .block_erasers =
14407 {
14408 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014409 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014410 .block_erase = erase_sector_jedec,
14411 }, {
14412 .eraseblocks = { {1024 * 1024, 1} },
14413 .block_erase = erase_chip_block_jedec,
14414 }
14415 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014416 .printlock = printlock_w39v080fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014417 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014418 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014419 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014420 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000014421 },
14422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014423 {
14424 .vendor = "Winbond",
14425 .name = "W39V080FA (dual mode)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014426 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014427 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000014428 .model_id = WINBOND_W39V080FA_DM,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014429 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000014430 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014431 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014432 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000014433 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014434 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014435 .block_erasers =
14436 {
14437 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014438 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000014439 .block_erase = erase_sector_jedec,
14440 }, {
14441 .eraseblocks = { {512 * 1024, 1} },
14442 .block_erase = erase_chip_block_jedec,
14443 }
14444 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000014445 .printlock = printlock_w39v080fa_dual,
Sean Nelson35727f72010-01-28 23:55:12 +000014446 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014447 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014448 .voltage = {3000, 3600}, /* Also has 12V fast program */
FENG yu ningff692fb2008-12-08 18:15:10 +000014449 },
Stefan Taunerac1b4c82012-02-17 14:51:04 +000014450
14451 {
14452 .vendor = "Unknown",
14453 .name = "SFDP-capable chip",
14454 .bustype = BUS_SPI,
14455 .manufacture_id = GENERIC_MANUF_ID,
14456 .model_id = SFDP_DEVICE_ID,
14457 /* We present our own "report this" text hence we do not
14458 * want the default "This flash part has status UNTESTED..."
14459 * text to be printed. */
14460 .tested = TEST_OK_PREW,
14461 .probe = probe_spi_sfdp,
14462 .unlock = spi_disable_blockprotect, /* is this safe? */
14463 .read = spi_chip_read,
14464 /* FIXME: some vendor extensions define this */
Carl-Daniel Hailfinger1c6d2ff2012-08-27 00:44:42 +000014465 .voltage = {0},
Stefan Taunerac1b4c82012-02-17 14:51:04 +000014466 /* Everything below will be set by the probing function. */
14467 .write = NULL,
14468 .total_size = 0,
14469 .page_size = 0,
14470 .feature_bits = 0,
14471 .block_erasers = {},
14472 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014473
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014474 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000014475 .vendor = "Programmer",
14476 .name = "Opaque flash chip",
14477 .bustype = BUS_PROG,
14478 .manufacture_id = PROGMANUF_ID,
14479 .model_id = PROGDEV_ID,
14480 .total_size = 0,
14481 .page_size = 256,
14482 /* probe is assumed to work, rest will be filled in by probe */
14483 .tested = TEST_OK_PROBE,
14484 .probe = probe_opaque,
14485 /* eraseblock sizes will be set by the probing function */
14486 .block_erasers =
14487 {
14488 {
14489 .block_erase = erase_opaque,
14490 }
14491 },
14492 .write = write_opaque,
14493 .read = read_opaque,
14494 },
14495
14496 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000014497 .vendor = "AMIC",
14498 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014499 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000014500 .manufacture_id = AMIC_ID,
14501 .model_id = GENERIC_DEVICE_ID,
14502 .total_size = 0,
14503 .page_size = 256,
14504 .tested = TEST_BAD_PREW,
14505 .probe = probe_spi_rdid4,
14506 .probe_timing = TIMING_ZERO,
14507 .write = NULL,
14508 .read = NULL,
14509 },
14510
14511 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014512 .vendor = "Atmel",
14513 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014514 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014515 .manufacture_id = ATMEL_ID,
14516 .model_id = GENERIC_DEVICE_ID,
14517 .total_size = 0,
14518 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014519 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014520 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014521 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014522 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014523 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014524 },
14525
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014526 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000014527 .vendor = "Eon",
14528 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014529 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014530 .manufacture_id = EON_ID_NOPREFIX,
14531 .model_id = GENERIC_DEVICE_ID,
14532 .total_size = 0,
14533 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014534 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014535 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014536 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014537 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014538 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014539 },
14540
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014541 {
14542 .vendor = "Macronix",
14543 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014544 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014545 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014546 .model_id = GENERIC_DEVICE_ID,
14547 .total_size = 0,
14548 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014549 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014550 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014551 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014552 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014553 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014554 },
14555
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014556 {
14557 .vendor = "PMC",
14558 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014559 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014560 .manufacture_id = PMC_ID,
14561 .model_id = GENERIC_DEVICE_ID,
14562 .total_size = 0,
14563 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014564 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014565 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014566 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014567 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014568 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014569 },
14570
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014571 {
14572 .vendor = "SST",
14573 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014574 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014575 .manufacture_id = SST_ID,
14576 .model_id = GENERIC_DEVICE_ID,
14577 .total_size = 0,
14578 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014579 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014580 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014581 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014582 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014583 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014584 },
14585
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014586 {
14587 .vendor = "ST",
14588 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014589 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014590 .manufacture_id = ST_ID,
14591 .model_id = GENERIC_DEVICE_ID,
14592 .total_size = 0,
14593 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000014594 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014595 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014596 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014597 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014598 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000014599 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000014600
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014601 {
Sean Nelson118e1d62009-11-24 02:08:11 +000014602 .vendor = "Sanyo",
14603 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014604 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000014605 .manufacture_id = SANYO_ID,
14606 .model_id = GENERIC_DEVICE_ID,
14607 .total_size = 0,
14608 .page_size = 256,
14609 .tested = TEST_BAD_PREW,
14610 .probe = probe_spi_rdid,
14611 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000014612 .write = NULL,
14613 .read = NULL,
14614 },
14615
14616 {
Stefan Taunereb582572012-09-21 12:52:50 +000014617 .vendor = "Winbond",
14618 .name = "unknown Winbond (ex Nexcom) SPI chip",
14619 .bustype = BUS_SPI,
14620 .manufacture_id = WINBOND_NEX_ID,
14621 .model_id = GENERIC_DEVICE_ID,
14622 .total_size = 0,
14623 .page_size = 256,
14624 .tested = TEST_BAD_PREW,
14625 .probe = probe_spi_rdid,
14626 .probe_timing = TIMING_ZERO,
14627 .write = NULL,
14628 .read = NULL,
14629 },
14630
14631 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014632 .vendor = "Generic",
14633 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014634 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014635 .manufacture_id = GENERIC_MANUF_ID,
14636 .model_id = GENERIC_DEVICE_ID,
14637 .total_size = 0,
14638 .page_size = 256,
14639 .tested = TEST_BAD_PREW,
14640 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014641 .write = NULL,
14642 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000014643
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014644 {
14645 .vendor = "Generic",
14646 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014647 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014648 .manufacture_id = GENERIC_MANUF_ID,
14649 .model_id = GENERIC_DEVICE_ID,
14650 .total_size = 0,
14651 .page_size = 256,
14652 .tested = TEST_BAD_PREW,
14653 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000014654 .write = NULL,
14655 },
14656
Stefan Tauner96658be2014-05-26 22:05:31 +000014657 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000014658};
Stefan Tauner96658be2014-05-26 22:05:31 +000014659
14660const unsigned int flashchips_size = ARRAY_SIZE(flashchips);